Index: src/libcfa/concurrency/invoke.h
===================================================================
--- src/libcfa/concurrency/invoke.h	(revision 0188a0bce49abf2833b0cb95e8193b3beaaadced)
+++ 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 0188a0bce49abf2833b0cb95e8193b3beaaadced)
+++ 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 0188a0bce49abf2833b0cb95e8193b3beaaadced)
+++ 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
Index: src/tests/concurrent/.expect/coroutineYield.txt
===================================================================
--- src/tests/concurrent/.expect/coroutineYield.txt	(revision 82c948c3ab2d77f43fcf3cdbcab750b272c8e59b)
+++ src/tests/concurrent/.expect/coroutineYield.txt	(revision 82c948c3ab2d77f43fcf3cdbcab750b272c8e59b)
@@ -0,0 +1,4 @@
+Thread 1
+Coroutine 1
+Coroutine 2
+Thread 2
Index: src/tests/concurrent/coroutineYield.c
===================================================================
--- src/tests/concurrent/coroutineYield.c	(revision 82c948c3ab2d77f43fcf3cdbcab750b272c8e59b)
+++ src/tests/concurrent/coroutineYield.c	(revision 82c948c3ab2d77f43fcf3cdbcab750b272c8e59b)
@@ -0,0 +1,20 @@
+#include <fstream>
+#include <kernel>
+#include <stdlib>
+#include <thread>
+
+coroutine Coroutine {};
+
+void main(Coroutine& this) {
+	sout | "Coroutine 1" | endl;
+	yield();
+	sout | "Coroutine 2" | endl;
+}
+
+
+int main(int argc, char* argv[]) {
+	Coroutine c;
+	sout | "Thread 1" | endl;
+	resume(c);
+	sout | "Thread 2" | endl;
+}
