Index: kernel/generic/include/proc/thread.h
===================================================================
--- kernel/generic/include/proc/thread.h	(revision a064d4fc00192ecc7d42d04ecfb3474585fef055)
+++ kernel/generic/include/proc/thread.h	(revision 0f4f1b286ec18fe5bc220bbc629fc26b6813d889)
@@ -185,4 +185,5 @@
 extern void thread_wire(thread_t *, cpu_t *);
 extern void thread_attach(thread_t *, task_t *);
+extern void thread_start(thread_t *);
 extern void thread_ready(thread_t *);
 extern void thread_exit(void) __attribute__((noreturn));
@@ -242,4 +243,5 @@
 extern errno_t thread_join(thread_t *);
 extern errno_t thread_join_timeout(thread_t *, uint32_t, unsigned int);
+extern void thread_detach(thread_t *);
 
 extern void thread_yield(void);
Index: kernel/generic/src/console/cmd.c
===================================================================
--- kernel/generic/src/console/cmd.c	(revision a064d4fc00192ecc7d42d04ecfb3474585fef055)
+++ kernel/generic/src/console/cmd.c	(revision 0f4f1b286ec18fe5bc220bbc629fc26b6813d889)
@@ -1004,5 +1004,5 @@
 			printf("cpu%u: ", i);
 			thread_wire(thread, &cpus[i]);
-			thread_ready(thread_ref(thread));
+			thread_start(thread);
 			thread_join(thread);
 		} else
Index: kernel/generic/src/ipc/kbox.c
===================================================================
--- kernel/generic/src/ipc/kbox.c	(revision a064d4fc00192ecc7d42d04ecfb3474585fef055)
+++ kernel/generic/src/ipc/kbox.c	(revision 0f4f1b286ec18fe5bc220bbc629fc26b6813d889)
@@ -246,6 +246,6 @@
 		}
 
-		task->kb.thread = thread_ref(kb_thread);
-		thread_ready(kb_thread);
+		task->kb.thread = kb_thread;
+		thread_start(kb_thread);
 	}
 
Index: kernel/generic/src/main/kinit.c
===================================================================
--- kernel/generic/src/main/kinit.c	(revision a064d4fc00192ecc7d42d04ecfb3474585fef055)
+++ kernel/generic/src/main/kinit.c	(revision 0f4f1b286ec18fe5bc220bbc629fc26b6813d889)
@@ -122,5 +122,5 @@
 
 		thread_wire(thread, &cpus[0]);
-		thread_ready(thread_ref(thread));
+		thread_start(thread);
 		thread_join(thread);
 
@@ -135,5 +135,6 @@
 			if (thread != NULL) {
 				thread_wire(thread, &cpus[i]);
-				thread_ready(thread);
+				thread_start(thread);
+				thread_detach(thread);
 			} else
 				log(LF_OTHER, LVL_ERROR,
@@ -151,8 +152,10 @@
 	thread = thread_create(kload, NULL, TASK, THREAD_FLAG_NONE,
 	    "kload");
-	if (thread != NULL)
-		thread_ready(thread);
-	else
+	if (thread != NULL) {
+		thread_start(thread);
+		thread_detach(thread);
+	} else {
 		log(LF_OTHER, LVL_ERROR, "Unable to create kload thread");
+	}
 
 #ifdef CONFIG_KCONSOLE
@@ -163,9 +166,11 @@
 		thread = thread_create(kconsole_thread, NULL, TASK,
 		    THREAD_FLAG_NONE, "kconsole");
-		if (thread != NULL)
-			thread_ready(thread);
-		else
+		if (thread != NULL) {
+			thread_start(thread);
+			thread_detach(thread);
+		} else {
 			log(LF_OTHER, LVL_ERROR,
 			    "Unable to create kconsole thread");
+		}
 	}
 #endif /* CONFIG_KCONSOLE */
Index: kernel/generic/src/main/main.c
===================================================================
--- kernel/generic/src/main/main.c	(revision a064d4fc00192ecc7d42d04ecfb3474585fef055)
+++ kernel/generic/src/main/main.c	(revision 0f4f1b286ec18fe5bc220bbc629fc26b6813d889)
@@ -282,5 +282,6 @@
 	if (!kinit_thread)
 		panic("Cannot create kinit thread.");
-	thread_ready(kinit_thread);
+	thread_start(kinit_thread);
+	thread_detach(kinit_thread);
 
 	/*
Index: kernel/generic/src/proc/program.c
===================================================================
--- kernel/generic/src/proc/program.c	(revision a064d4fc00192ecc7d42d04ecfb3474585fef055)
+++ kernel/generic/src/proc/program.c	(revision 0f4f1b286ec18fe5bc220bbc629fc26b6813d889)
@@ -212,5 +212,6 @@
 void program_ready(program_t *prg)
 {
-	thread_ready(prg->main_thread);
+	thread_start(prg->main_thread);
+	thread_detach(prg->main_thread);
 	prg->main_thread = NULL;
 }
Index: kernel/generic/src/proc/thread.c
===================================================================
--- kernel/generic/src/proc/thread.c	(revision a064d4fc00192ecc7d42d04ecfb3474585fef055)
+++ kernel/generic/src/proc/thread.c	(revision 0f4f1b286ec18fe5bc220bbc629fc26b6813d889)
@@ -234,4 +234,14 @@
 }
 
+/** Start a thread that wasn't started yet since it was created.
+ *
+ * @param thread A reference to the newly created thread.
+ */
+void thread_start(thread_t *thread)
+{
+	assert(thread->state == Entering);
+	thread_ready(thread_ref(thread));
+}
+
 /** Make thread ready
  *
@@ -696,4 +706,6 @@
 errno_t thread_join_timeout(thread_t *thread, uint32_t usec, unsigned int flags)
 {
+	assert(thread != NULL);
+
 	if (thread == THREAD)
 		return EINVAL;
@@ -712,4 +724,9 @@
 
 	return rc;
+}
+
+void thread_detach(thread_t *thread)
+{
+	thread_put(thread);
 }
 
