Index: src/libcfa/concurrency/invoke.h
===================================================================
--- src/libcfa/concurrency/invoke.h	(revision d0a045c72e9bfbc1df194dd08347aa79e1d7d574)
+++ src/libcfa/concurrency/invoke.h	(revision 82c948c3ab2d77f43fcf3cdbcab750b272c8e59b)
@@ -121,4 +121,7 @@
 		// coroutine body used to store context
 		struct coroutine_desc  self_cor;
+
+		// current active context
+		struct coroutine_desc * curr_cor;
 
 		// monitor body used for mutual exclusion
Index: src/libcfa/concurrency/kernel.c
===================================================================
--- src/libcfa/concurrency/kernel.c	(revision d0a045c72e9bfbc1df194dd08347aa79e1d7d574)
+++ src/libcfa/concurrency/kernel.c	(revision 82c948c3ab2d77f43fcf3cdbcab750b272c8e59b)
@@ -108,4 +108,16 @@
 void ?{}( thread_desc & this, current_stack_info_t * info) with( this ) {
 	self_cor{ info };
+	curr_cor = &self_cor;
+	self_mon.owner = &this;
+	self_mon.recursion = 1;
+	self_mon_p = &self_mon;
+	next = NULL;
+	__cfaabi_dbg_debug_do(
+		dbg_next = NULL;
+		dbg_prev = NULL;
+		__cfaabi_dbg_thread_register(&this);
+	)
+
+	monitors{ &self_mon_p, 1, (fptr_t)0 };
 }
 
@@ -225,6 +237,7 @@
 // from the processor coroutine to the target thread
 void runThread(processor * this, thread_desc * dst) {
+	assert(dst->curr_cor);
 	coroutine_desc * proc_cor = get_coroutine(*this->runner);
-	coroutine_desc * thrd_cor = get_coroutine(dst);
+	coroutine_desc * thrd_cor = dst->curr_cor;
 
 	//Reset the terminating actions here
@@ -237,4 +250,10 @@
 	ThreadCtxSwitch(proc_cor, thrd_cor);
 	// when ThreadCtxSwitch returns we are back in the processor coroutine
+}
+
+void returnToKernel() {
+	coroutine_desc * proc_cor = get_coroutine(*this_processor->runner);
+	coroutine_desc * thrd_cor = this_thread->curr_cor = this_coroutine;
+	ThreadCtxSwitch(thrd_cor, proc_cor);
 }
 
@@ -360,5 +379,5 @@
 	disable_interrupts();
 	verify( !preemption_enabled );
-	suspend();
+	returnToKernel();
 	verify( !preemption_enabled );
 	enable_interrupts( __cfaabi_dbg_ctx );
@@ -371,5 +390,5 @@
 
 	verify( !preemption_enabled );
-	suspend();
+	returnToKernel();
 	verify( !preemption_enabled );
 
@@ -383,5 +402,5 @@
 
 	verify( !preemption_enabled );
-	suspend();
+	returnToKernel();
 	verify( !preemption_enabled );
 
@@ -397,5 +416,5 @@
 
 	verify( !preemption_enabled );
-	suspend();
+	returnToKernel();
 	verify( !preemption_enabled );
 
@@ -410,5 +429,5 @@
 
 	verify( !preemption_enabled );
-	suspend();
+	returnToKernel();
 	verify( !preemption_enabled );
 
@@ -425,5 +444,5 @@
 
 	verify( !preemption_enabled );
-	suspend();
+	returnToKernel();
 	verify( !preemption_enabled );
 
@@ -437,5 +456,5 @@
 	this_processor->finish.thrd        = thrd;
 
-	suspend();
+	returnToKernel();
 }
 
@@ -502,5 +521,5 @@
 	// which is currently here
 	mainProcessor->do_terminate = true;
-	suspend();
+	returnToKernel();
 
 	// THE SYSTEM IS NOW COMPLETELY STOPPED
Index: src/libcfa/concurrency/thread.c
===================================================================
--- src/libcfa/concurrency/thread.c	(revision d0a045c72e9bfbc1df194dd08347aa79e1d7d574)
+++ src/libcfa/concurrency/thread.c	(revision 82c948c3ab2d77f43fcf3cdbcab750b272c8e59b)
@@ -34,4 +34,5 @@
 	self_cor{};
 	self_cor.name = "Anonymous Coroutine";
+	curr_cor = &self_cor;
 	self_mon.owner = &this;
 	self_mon.recursion = 1;
@@ -104,7 +105,4 @@
 	dst->state = Active;
 
-	//update the last resumer
-	dst->last = src;
-
 	// set new coroutine that the processor is executing
 	// and context switch to it
