Index: src/libcfa/concurrency/coroutine.c
===================================================================
--- src/libcfa/concurrency/coroutine.c	(revision ed235b60f3ae5366fcfed2f86f609b40ebe9c0ce)
+++ src/libcfa/concurrency/coroutine.c	(revision 39fea2f76762fc5d71214cc7fa748f729beb7ffa)
@@ -65,5 +65,5 @@
 	this.errno_ = 0;
 	this.state = Start;
-	this.starter = NULL;
+	this.starter = this_coroutine;
 	this.last = NULL;
 }
@@ -171,4 +171,19 @@
 		suspend();
 	}
+
+	void __leave_coroutine(void) {
+		coroutine_desc * src = this_coroutine;		// optimization
+
+		assertf( src->starter != 0,
+			"Attempt to suspend coroutine \"%.256s\" (%p) that does not have a starter.\n"
+			"Possible cause is a resume of a coroutine already destroyed or not yet constructed",
+			src->name, src );
+		assertf( src->starter->state != Halted,
+			"Attempt by coroutine \"%.256s\" (%p) to suspend back to terminated coroutine \"%.256s\" (%p).\n"
+			"Possible cause is terminated coroutine's main routine has already returned.",
+			src->name, src, src->starter->name, src->starter );
+
+		CoroutineCtxSwitch( src, src->starter );
+	}
 }
 
Index: src/libcfa/concurrency/invoke.c
===================================================================
--- src/libcfa/concurrency/invoke.c	(revision ed235b60f3ae5366fcfed2f86f609b40ebe9c0ce)
+++ src/libcfa/concurrency/invoke.c	(revision 39fea2f76762fc5d71214cc7fa748f729beb7ffa)
@@ -28,4 +28,5 @@
 
 extern void __suspend_internal(void);
+extern void __leave_coroutine(void);
 extern void __leave_thread_monitor( struct thread_desc * this );
 extern void disable_interrupts();
@@ -52,5 +53,5 @@
 
       //Final suspend, should never return
-      __suspend_internal();
+      __leave_coroutine();
       abortf("Resumed dead coroutine");
 }
Index: src/libcfa/concurrency/invoke.h
===================================================================
--- src/libcfa/concurrency/invoke.h	(revision ed235b60f3ae5366fcfed2f86f609b40ebe9c0ce)
+++ src/libcfa/concurrency/invoke.h	(revision 39fea2f76762fc5d71214cc7fa748f729beb7ffa)
@@ -80,6 +80,6 @@
             int errno_;                               // copy of global UNIX variable errno
             enum coroutine_state state;               // current execution status for coroutine
-            struct coroutine_desc *starter;           // first coroutine to resume this one
-            struct coroutine_desc *last;	            // last coroutine to resume this one
+            struct coroutine_desc * starter;          // first coroutine to resume this one
+            struct coroutine_desc * last;             // last coroutine to resume this one
       };
 
Index: src/libcfa/concurrency/kernel.c
===================================================================
--- src/libcfa/concurrency/kernel.c	(revision ed235b60f3ae5366fcfed2f86f609b40ebe9c0ce)
+++ src/libcfa/concurrency/kernel.c	(revision 39fea2f76762fc5d71214cc7fa748f729beb7ffa)
@@ -102,4 +102,5 @@
 	this.errno_ = 0;
 	this.state = Start;
+	this.starter = NULL;
 }
 
@@ -110,10 +111,14 @@
 //-----------------------------------------------------------------------------
 // Processor coroutine
+
+// Construct the processor context of the main processor
 void ?{}(processorCtx_t & this, processor * proc) {
 	(this.__cor){ "Processor" };
+	this.__cor.starter = &mainThread->cor;
 	this.proc = proc;
 	proc->runner = &this;
 }
 
+// Construct the processor context of non-main processors
 void ?{}(processorCtx_t & this, processor * proc, current_stack_info_t * info) {
 	(this.__cor){ info };
