Index: libcfa/src/concurrency/coroutine.cfa
===================================================================
--- libcfa/src/concurrency/coroutine.cfa	(revision f23b685159eb22b124d2036074b1dcf5a7f5b4a6)
+++ libcfa/src/concurrency/coroutine.cfa	(revision 76e069f60f25f15fd560f58493e8882f48bfd579)
@@ -22,4 +22,8 @@
 #include <string.h>
 #include <unistd.h>
+// use this define to make unwind.h play nice, definetely a hack
+#define HIDE_EXPORTS
+#include <unwind.h>
+#undef HIDE_EXPORTS
 #include <sys/mman.h>
 }
@@ -29,4 +33,12 @@
 #define __CFA_INVOKE_PRIVATE__
 #include "invoke.h"
+
+extern "C" {
+      void _CtxCoroutine_Unwind(struct _Unwind_Exception * storage) __attribute__ ((__noreturn__));
+      static void _CtxCoroutine_UnwindCleanup(_Unwind_Reason_Code, struct _Unwind_Exception *) __attribute__ ((__noreturn__));
+      static void _CtxCoroutine_UnwindCleanup(_Unwind_Reason_Code, struct _Unwind_Exception *) {
+            abort();
+      }
+}
 
 //-----------------------------------------------------------------------------
@@ -67,7 +79,26 @@
       starter = NULL;
       last = NULL;
-}
-
-void ^?{}(coroutine_desc& this) {}
+      cancellation = NULL;
+}
+
+void ^?{}(coroutine_desc& this) {
+      if(this.state != Halted) {
+            coroutine_desc * src = TL_GET( this_coroutine );
+            coroutine_desc * dst = &this;
+
+            struct _Unwind_Exception storage;
+            storage.exception_class = -1;
+            storage.exception_cleanup = _CtxCoroutine_UnwindCleanup;
+            this.cancellation = &storage;
+            this.last = src;
+
+	      // not resuming self ?
+	      if ( src == dst ) {
+		      abort( "Attempt by coroutine %.256s (%p) to terminate itself.\n", src->name, src );
+            }
+
+	      CoroutineCtxSwitch( src, dst );
+      }
+}
 
 // Part of the Public API
@@ -105,4 +136,8 @@
       // Safety note : This could cause some false positives due to preemption
       verify( TL_GET( preemption_state.enabled ) || TL_GET( this_processor )->do_terminate );
+
+      if( unlikely(src->cancellation != NULL) ) {
+            _CtxCoroutine_Unwind(src->cancellation);
+      }
 } //ctxSwitchDirect
 
@@ -162,19 +197,20 @@
       }
 
-      void __leave_coroutine(void) {
+      void __leave_coroutine() {
             coroutine_desc * src = TL_GET( this_coroutine ); // optimization
+            coroutine_desc * starter = src->cancellation != 0 ? src->last : src->starter;
 
             src->state = Halted;
 
-            assertf( src->starter != 0,
+            assertf( starter != 0,
                   "Attempt to suspend/leave coroutine \"%.256s\" (%p) that has never been resumed.\n"
                   "Possible cause is a suspend executed in a member called by a coroutine user rather than by the coroutine main.",
                   src->name, src );
-            assertf( src->starter->state != Halted,
+            assertf( starter->state != Halted,
                   "Attempt by coroutine \"%.256s\" (%p) to suspend/leave 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 );
+                  src->name, src, starter->name, starter );
+
+            CoroutineCtxSwitch( src, starter );
       }
 }
Index: libcfa/src/concurrency/invoke.c
===================================================================
--- libcfa/src/concurrency/invoke.c	(revision f23b685159eb22b124d2036074b1dcf5a7f5b4a6)
+++ libcfa/src/concurrency/invoke.c	(revision 76e069f60f25f15fd560f58493e8882f48bfd579)
@@ -17,4 +17,5 @@
 #include <stdlib.h>
 #include <stdio.h>
+#include <unwind.h>
 
 #include "invoke.h"
@@ -53,4 +54,30 @@
 	__leave_coroutine();
 	__cabi_abort( "Resumed dead coroutine" );
+}
+
+static _Unwind_Reason_Code _CtxCoroutine_UnwindStop(
+	__attribute((__unused__)) int version,
+	_Unwind_Action actions,
+	__attribute((__unused__)) _Unwind_Exception_Class exceptionClass,
+	__attribute((__unused__)) struct _Unwind_Exception * unwind_exception,
+	__attribute((__unused__)) struct _Unwind_Context * context,
+	__attribute((__unused__)) void * param
+) {
+	if( actions & _UA_END_OF_STACK  ) {
+		// We finished unwinding the coroutine,
+		// leave it
+		__leave_coroutine();
+		__cabi_abort( "Resumed dead coroutine" );
+	}
+	if( actions & _UA_CLEANUP_PHASE ) return _URC_NO_REASON;
+
+	return _URC_FATAL_PHASE2_ERROR;
+}
+
+void _CtxCoroutine_Unwind(struct _Unwind_Exception * storage) __attribute__ ((__noreturn__));
+void _CtxCoroutine_Unwind(struct _Unwind_Exception * storage) {
+	_Unwind_Reason_Code ret = _Unwind_ForcedUnwind( storage, _CtxCoroutine_UnwindStop, NULL );
+	printf("UNWIND ERROR %d after force unwind\n", ret);
+	abort();
 }
 
Index: libcfa/src/concurrency/invoke.h
===================================================================
--- libcfa/src/concurrency/invoke.h	(revision f23b685159eb22b124d2036074b1dcf5a7f5b4a6)
+++ libcfa/src/concurrency/invoke.h	(revision 76e069f60f25f15fd560f58493e8882f48bfd579)
@@ -80,10 +80,24 @@
 
 	struct coroutine_desc {
-		struct coStack_t stack;							// stack information of the coroutine
-		const char * name;								// textual name for coroutine/task, initialized by uC++ generated code
-		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
+		// stack information of the coroutine
+		struct coStack_t stack;
+
+		// textual name for coroutine/task, initialized by uC++ generated code
+		const char * name;
+
+		// copy of global UNIX variable errno
+		int errno_;
+
+		// current execution status for coroutine
+		enum coroutine_state state;
+		// first coroutine to resume this one
+		struct coroutine_desc * starter;
+
+		// last coroutine to resume this one
+		struct coroutine_desc * last;
+
+		// If non-null stack must be unwound with this exception
+		struct _Unwind_Exception * cancellation;
+
 	};
 
