Index: kernel/generic/src/main/kinit.c
===================================================================
--- kernel/generic/src/main/kinit.c	(revision daadfa699247351099d4c91048e2f9e9a29c346a)
+++ kernel/generic/src/main/kinit.c	(revision 4f84ee4268fbebe449f1346536fa63cef10bd266)
@@ -102,9 +102,4 @@
 	thread_t *thread;
 
-	/*
-	 * Detach kinit as nobody will call thread_join_timeout() on it.
-	 */
-	thread_detach(THREAD);
-
 	interrupts_disable();
 
@@ -125,7 +120,7 @@
 
 		thread_wire(thread, &cpus[0]);
-		thread_ready(thread);
+		thread_ready(thread_ref(thread));
 		thread_join(thread);
-		thread_detach(thread);
+		thread_put(thread);
 
 		/*
Index: kernel/generic/src/main/uinit.c
===================================================================
--- kernel/generic/src/main/uinit.c	(revision daadfa699247351099d4c91048e2f9e9a29c346a)
+++ kernel/generic/src/main/uinit.c	(revision 4f84ee4268fbebe449f1346536fa63cef10bd266)
@@ -56,14 +56,4 @@
 void uinit(void *arg)
 {
-	/*
-	 * So far, we don't have a use for joining userspace threads so we
-	 * immediately detach each uinit thread. If joining of userspace threads
-	 * is required, some userspace API based on the kernel mechanism will
-	 * have to be implemented. Moreover, garbage collecting of threads that
-	 * didn't detach themselves and nobody else joined them will have to be
-	 * deployed for the event of forceful task termination.
-	 */
-	thread_detach(THREAD);
-
 #ifdef CONFIG_UDEBUG
 	udebug_stoppable_end();
