Index: generic/include/proc/task.h
===================================================================
--- generic/include/proc/task.h	(revision 1077d91d22982a3615d0a0701524b82e38fc7ef0)
+++ generic/include/proc/task.h	(revision ec5535850fe982ee1d30f7961069c7c4379551e7)
@@ -60,3 +60,5 @@
 extern task_t *task_run_program(void *program_addr, char *name);
 
+extern __native sys_get_task_id(task_id_t *uspace_task_id);
+
 #endif
Index: generic/include/syscall/syscall.h
===================================================================
--- generic/include/syscall/syscall.h	(revision 1077d91d22982a3615d0a0701524b82e38fc7ef0)
+++ generic/include/syscall/syscall.h	(revision ec5535850fe982ee1d30f7961069c7c4379551e7)
@@ -39,4 +39,5 @@
 	SYS_MMAP,
 	SYS_MREMAP,
+	SYS_GET_TASK_ID,
 	SYS_IPC_CALL_SYNC_FAST,
 	SYS_IPC_CALL_SYNC,
Index: generic/src/proc/task.c
===================================================================
--- generic/src/proc/task.c	(revision 1077d91d22982a3615d0a0701524b82e38fc7ef0)
+++ generic/src/proc/task.c	(revision ec5535850fe982ee1d30f7961069c7c4379551e7)
@@ -156,4 +156,21 @@
 }
 
+/** Syscall for reading task ID from userspace.
+ *
+ * @param uaddr Userspace address of 8-byte buffer where to store current task ID.
+ *
+ * @return Always returns 0.
+ */
+__native sys_get_task_id(task_id_t *uspace_task_id)
+{
+	/*
+	 * No need to acquire lock on TASK because taskid
+	 * remains constant for the lifespan of the task.
+	 */
+	copy_to_uspace(uspace_task_id, &TASK->taskid, sizeof(TASK->taskid));
+
+	return 0;
+}
+
 /** Print task list */
 void task_print_list(void)
Index: generic/src/syscall/syscall.c
===================================================================
--- generic/src/syscall/syscall.c	(revision 1077d91d22982a3615d0a0701524b82e38fc7ef0)
+++ generic/src/syscall/syscall.c	(revision ec5535850fe982ee1d30f7961069c7c4379551e7)
@@ -83,4 +83,5 @@
 	sys_mmap,
 	sys_mremap,
+	sys_get_task_id,
 	sys_ipc_call_sync_fast,
 	sys_ipc_call_sync,
