Index: kernel/generic/src/proc/thread.c
===================================================================
--- kernel/generic/src/proc/thread.c	(revision 341140c181e949962d7871bd75d6e9f74ba669d1)
+++ kernel/generic/src/proc/thread.c	(revision 4680ef5eeda9925a3978a4a02f31a915dbdabe5f)
@@ -386,13 +386,4 @@
 		task_destroy(t->task);
 	
-	/*
-	 * If the thread had a userspace context, free up its kernel_uarg
-	 * structure.
-	 */
-	if (t->flags & THREAD_FLAG_USPACE) {
-		ASSERT(t->thread_arg);
-		free(t->thread_arg);
-	}
-
 	slab_free(thread_slab, t);
 }
@@ -683,5 +674,10 @@
 		return (unative_t) rc;
 
-	kernel_uarg = (uspace_arg_t *) malloc(sizeof(uspace_arg_t), 0);	
+	/*
+	 * In case of failure, kernel_uarg will be deallocated in this function.
+	 * In case of success, kernel_uarg will be freed in uinit().
+	 */
+	kernel_uarg = (uspace_arg_t *) malloc(sizeof(uspace_arg_t), 0);
+	
 	rc = copy_from_uspace(kernel_uarg, uspace_uarg, sizeof(uspace_arg_t));
 	if (rc != 0) {
Index: uspace/libc/generic/thread.c
===================================================================
--- uspace/libc/generic/thread.c	(revision 341140c181e949962d7871bd75d6e9f74ba669d1)
+++ uspace/libc/generic/thread.c	(revision 4680ef5eeda9925a3978a4a02f31a915dbdabe5f)
@@ -108,6 +108,6 @@
 	uarg->uspace_thread_function(uarg->uspace_thread_arg);
 	/* XXX: we cannot free the userspace stack while running on it */
-	free(uarg->uspace_stack);
-	free(uarg);
+//	free(uarg->uspace_stack);
+//	free(uarg);
 
 	/* If there is a manager, destroy it */
