Index: generic/src/proc/task.c
===================================================================
--- generic/src/proc/task.c	(revision ff14c520ac9ef1cfa24af4cbbfd3235d2bda51c5)
+++ generic/src/proc/task.c	(revision 23d22eb27cfdf57d63002f3401a0a522db3288b0)
@@ -116,4 +116,5 @@
 	thread_t *t;
 	task_t *task;
+	uspace_arg_t *uarg;
 
 	as = as_create(0);
@@ -125,7 +126,10 @@
 	} 
 	
+	uarg = (uspace_arg_t *) malloc(sizeof(uspace_arg_t), 0);
+	uarg->uspace_entry = (__address) ((elf_header_t *) program_addr)->e_entry;
+	uarg->uspace_stack = USTACK_ADDRESS;
+	
 	task = task_create(as, name);
-	t = thread_create(uinit, (void *)((elf_header_t *)program_addr)->e_entry, 
-			  task, 0, "uinit");
+	t = thread_create(uinit, uarg, task, 0, "uinit");
 	
 	/*
Index: generic/src/proc/thread.c
===================================================================
--- generic/src/proc/thread.c	(revision ff14c520ac9ef1cfa24af4cbbfd3235d2bda51c5)
+++ generic/src/proc/thread.c	(revision 23d22eb27cfdf57d63002f3401a0a522db3288b0)
@@ -54,4 +54,5 @@
 #include <mm/slab.h>
 #include <debug.h>
+#include <main/uinit.h>
 
 char *thread_states[] = {"Invalid", "Running", "Sleeping", "Ready", "Entering", "Exiting"}; /**< Thread states */
@@ -281,5 +282,6 @@
 	interrupts_restore(ipl);
 	
-	t->name = name;
+	memcpy(t->name, name, THREAD_NAME_BUFLEN);
+	
 	t->thread_code = func;
 	t->thread_arg = arg;
@@ -424,2 +426,39 @@
 	interrupts_restore(ipl);
 }
+
+/** Process syscall to create new thread.
+ *
+ */
+__native sys_thread_create(__address function, void *arg, void *stack, char *name)
+{
+        thread_t *t;
+        char namebuf[THREAD_NAME_BUFLEN];
+	uspace_arg_t *uarg;
+	__u32 tid;
+
+        copy_from_uspace(namebuf, name, THREAD_NAME_BUFLEN);
+	uarg = (uspace_arg_t *) malloc(sizeof(uarg), 0);
+	
+	uarg->uspace_entry = function;
+	uarg->uspace_stack = (__address) stack;
+
+        if ((t = thread_create(uinit, uarg, TASK, 0, namebuf))) {
+		tid = t->tid;
+                thread_ready(t);
+		return (__native) tid; 
+        } else {
+                free(namebuf);
+        }
+
+        return (__native) -1;
+}
+
+/** Process syscall to terminate thread.
+ *
+ */
+__native sys_thread_exit(int status)
+{
+        thread_exit();
+        /* Unreachable */
+        return 0;
+}
