Index: libcfa/src/concurrency/coroutine.cfa
===================================================================
--- libcfa/src/concurrency/coroutine.cfa	(revision ff7f6d0720c5174ccad29c8cb61ff480d6f1f7e1)
+++ libcfa/src/concurrency/coroutine.cfa	(revision c3e510b1da16c821b3fdca7930f911d1a03714ab)
@@ -325,4 +325,6 @@
     // poll iff nonlocal ehm is enabled
     bool checked_poll( T & cor ) libcfa_public { return get_coroutine( cor )->ehm_state.ehm_enabled ? poll( cor ) : false; }
+
+    coroutine$ * resumer( T & cor ) libcfa_public { return get_coroutine( cor )->last; }
 }
 
@@ -338,4 +340,13 @@
 }
 
+forall(exceptT & | { void $throwResume(exceptT &); })
+void resumeAt( coroutine$ * receiver, exceptT & ex ) libcfa_public {
+    nonlocal_exception * nl_ex = alloc();
+    (*nl_ex){ (exception_t *)&ex };
+    lock( receiver->ehm_state.buffer_lock __cfaabi_dbg_ctx2 );
+    append( receiver->ehm_state.ehm_buffer, nl_ex ); 
+    unlock( receiver->ehm_state.buffer_lock );
+}
+
 // Local Variables: //
 // mode: c //
Index: libcfa/src/concurrency/coroutine.hfa
===================================================================
--- libcfa/src/concurrency/coroutine.hfa	(revision ff7f6d0720c5174ccad29c8cb61ff480d6f1f7e1)
+++ libcfa/src/concurrency/coroutine.hfa	(revision c3e510b1da16c821b3fdca7930f911d1a03714ab)
@@ -218,5 +218,5 @@
 }
 
-// non local ehm routines
+// non local ehm and coroutine utility routines
 forall(T & | is_coroutine(T)) {
     void enable_ehm( T & cor );
@@ -224,4 +224,5 @@
     bool poll( T & cor );
     bool checked_poll( T & cor );
+    coroutine$ * resumer( T & cor );
 }
 
@@ -230,6 +231,11 @@
 trait ehm_resume_at { void $throwResume(exceptT &); };
 
+// general resumeAt
 forall(exceptT &, T & | ehm_resume_at( exceptT, T ))
 void resumeAt( T & receiver, exceptT & ex );
+
+// resumeAt for underlying coroutine$ type
+forall(exceptT & | { void $throwResume(exceptT &); })
+void resumeAt( coroutine$ * receiver, exceptT & ex );
 
 // Local Variables: //
Index: tests/exceptions/.expect/cor_resumer.txt
===================================================================
--- tests/exceptions/.expect/cor_resumer.txt	(revision c3e510b1da16c821b3fdca7930f911d1a03714ab)
+++ tests/exceptions/.expect/cor_resumer.txt	(revision c3e510b1da16c821b3fdca7930f911d1a03714ab)
@@ -0,0 +1,23 @@
+main start
+10
+9
+8
+7
+6
+5
+4
+3
+2
+1
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+main end
Index: tests/exceptions/cor_resumer.cfa
===================================================================
--- tests/exceptions/cor_resumer.cfa	(revision c3e510b1da16c821b3fdca7930f911d1a03714ab)
+++ tests/exceptions/cor_resumer.cfa	(revision c3e510b1da16c821b3fdca7930f911d1a03714ab)
@@ -0,0 +1,42 @@
+#include <fstream.hfa>
+#include <thread.hfa>
+
+int num_links = 10;
+
+exception unwind { int num; };
+vtable(unwind) unwind_vt;
+
+coroutine Node { int cnt;  unwind except; };
+void ?{}( Node & this, int cnt ) { this.cnt = cnt; }
+
+void main( Node & this ) with( this ) {
+    sout | cnt;
+    if ( cnt == 0 ) {
+        except{ &unwind_vt, cnt };
+        resumeAt( resumer( this ), except );
+        return;
+    }
+    Node next{ cnt - 1 };
+    resume( next );
+    try {
+        while( ! poll( this ) ) { yield(); }
+    } catch( unwind * e ) {
+        e->num++;
+        if ( e->num != cnt ) {
+            sout | "exception count and thread count should be consistent!";
+            abort();
+        }
+        sout | e->num;
+        if ( cnt == num_links ) return;
+        except{ &unwind_vt, e->num };
+        resumeAt( resumer( this ), except );
+    }
+
+}
+
+int main() {
+	sout | "main start";
+    Node n{ num_links };
+    resume( n );
+	sout | "main end";
+}
Index: tests/exceptions/pingpong_nonlocal.cfa
===================================================================
--- tests/exceptions/pingpong_nonlocal.cfa	(revision ff7f6d0720c5174ccad29c8cb61ff480d6f1f7e1)
+++ tests/exceptions/pingpong_nonlocal.cfa	(revision c3e510b1da16c821b3fdca7930f911d1a03714ab)
@@ -1,5 +1,4 @@
 #include <fstream.hfa>
 #include <thread.hfa>
-#include <fstream.hfa>
 #include <mutex_stmt.hfa>
 
