Index: libcfa/src/concurrency/coroutine.cfa
===================================================================
--- libcfa/src/concurrency/coroutine.cfa	(revision 7e1dbd72b91978bc0a2745abacb829909bdfc517)
+++ libcfa/src/concurrency/coroutine.cfa	(revision 4269d1b0ba7fe4b45b0a67e4f36421295d8ec009)
@@ -344,4 +344,5 @@
 bool poll() libcfa_public { return poll( active_coroutine() ); }
 coroutine$ * resumer() libcfa_public { return active_coroutine()->last; }
+coroutine$ * first_resumer() libcfa_public { return active_coroutine()->starter; }
 
 // user facing ehm operations
@@ -358,4 +359,5 @@
 
     coroutine$ * resumer( T & cor ) libcfa_public { return get_coroutine( cor )->last; }
+    coroutine$ * first_resumer( T & cor ) libcfa_public { return get_coroutine( cor )->starter; }
 }
 
Index: libcfa/src/concurrency/coroutine.hfa
===================================================================
--- libcfa/src/concurrency/coroutine.hfa	(revision 7e1dbd72b91978bc0a2745abacb829909bdfc517)
+++ libcfa/src/concurrency/coroutine.hfa	(revision 4269d1b0ba7fe4b45b0a67e4f36421295d8ec009)
@@ -124,5 +124,5 @@
 	src->state = Active;
 
-	if( unlikely(src->cancellation != 0p) ) {
+	if( unlikely(src->cancellation != 0p && src->cancellation != 1p) ) {
 		__cfactx_coroutine_unwind(src->cancellation, src);
 	}
@@ -169,4 +169,6 @@
 	coroutine$ * dst = get_coroutine(cor);
 
+    // printf("FROM RES src: %p, dest: %p\n", src, dst);
+
 	if( unlikely(dst->context.SP == 0p) ) {
 		__stack_prepare(&dst->stack, DEFAULT_STACK_SIZE);
@@ -188,5 +190,8 @@
 	// always done for performance testing
 	$ctx_switch( src, dst );
-	if ( unlikely(dst->cancellation) ) {
+
+	if ( unlikely(src->cancellation == 1p) ) {
+        src->cancellation = 0p;
+        // we know dst hasn't been deallocated
 		__cfaehm_cancelled_coroutine( cor, dst, _default_vtable );
 	}
@@ -222,4 +227,5 @@
 bool poll();
 coroutine$ * resumer();
+coroutine$ * first_resumer();
 
 forall(T & | is_coroutine(T)) {
@@ -229,4 +235,5 @@
     bool checked_poll( T & cor );
     coroutine$ * resumer( T & cor );
+    coroutine$ * first_resumer( T & cor );
 }
 
Index: libcfa/src/concurrency/exception.cfa
===================================================================
--- libcfa/src/concurrency/exception.cfa	(revision 7e1dbd72b91978bc0a2745abacb829909bdfc517)
+++ libcfa/src/concurrency/exception.cfa	(revision 4269d1b0ba7fe4b45b0a67e4f36421295d8ec009)
@@ -57,5 +57,5 @@
 	struct coroutine$ * src = (coroutine$ *)stop_param;
 	struct coroutine$ * dst = src->last;
-
+    dst->cancellation = 1p;
 	$ctx_switch( src, dst );
 	abort();
