Index: libcfa/src/concurrency/coroutine.cfa
===================================================================
--- libcfa/src/concurrency/coroutine.cfa	(revision 57fd66d2309b6cb82d553a6c4079aa5410565b14)
+++ libcfa/src/concurrency/coroutine.cfa	(revision 3318dff9124a356ddd12a7df7cd197d06e1f9722)
@@ -28,4 +28,5 @@
 #include "kernel/private.hfa"
 #include "exception.hfa"
+#include "exception.h"
 #include "math.hfa"
 
@@ -298,4 +299,10 @@
 }
 
+void defaultResumeAtHandler( exception_t * except ) {
+    __cfaehm_allocate_exception( except );
+    free( except );
+    __cfaehm_begin_unwind( (void(*)(exception_t *))defaultTerminationHandler );
+}
+
 bool poll( coroutine$ * cor ) libcfa_public {
     nonlocal_exception * nl_ex = pop_ehm_head( cor );
@@ -308,5 +315,8 @@
         exception_t * ex = nl_ex->the_exception;
         free( nl_ex );
-        throwResume *ex;
+        __cfaehm_throw_resume( ex, defaultResumeAtHandler );
+        
+        // only reached if resumption handled. other dealloc handled in defaultResumeAtHandler
+        free( ex );
         nl_ex = pop_ehm_head( cor );
     }
@@ -316,4 +326,5 @@
 
 bool poll() libcfa_public { return poll( active_coroutine() ); }
+coroutine$ * resumer() libcfa_public { return active_coroutine()->last; }
 
 // user facing ehm operations
@@ -333,9 +344,11 @@
 
 // resume non local exception at receiver (i.e. enqueue in ehm buffer)
-forall(exceptT &, T & | ehm_resume_at( exceptT, T ))
+forall(exceptT *, T & | ehm_resume_at( exceptT, T ))
 void resumeAt( T & receiver, exceptT & ex )  libcfa_public {
     coroutine$ * cor = get_coroutine( receiver );
     nonlocal_exception * nl_ex = alloc();
-    (*nl_ex){ (exception_t *)&ex };
+    exceptT * ex_copy = alloc();
+    memcpy( ex_copy, &ex, sizeof(exceptT) );
+    (*nl_ex){ (exception_t *)ex_copy };
     lock( cor->ehm_state.buffer_lock __cfaabi_dbg_ctx2 );
     append( cor->ehm_state.ehm_buffer, nl_ex ); 
@@ -343,8 +356,10 @@
 }
 
-forall(exceptT & | { void $throwResume(exceptT &); })
+forall(exceptT * | { void $throwResume(exceptT &); })
 void resumeAt( coroutine$ * receiver, exceptT & ex ) libcfa_public {
     nonlocal_exception * nl_ex = alloc();
-    (*nl_ex){ (exception_t *)&ex };
+    exceptT * ex_copy = alloc();
+    memcpy( ex_copy, &ex, sizeof(exceptT) );
+    (*nl_ex){ (exception_t *)ex_copy };
     lock( receiver->ehm_state.buffer_lock __cfaabi_dbg_ctx2 );
     append( receiver->ehm_state.ehm_buffer, nl_ex ); 
Index: libcfa/src/concurrency/coroutine.hfa
===================================================================
--- libcfa/src/concurrency/coroutine.hfa	(revision 57fd66d2309b6cb82d553a6c4079aa5410565b14)
+++ libcfa/src/concurrency/coroutine.hfa	(revision 3318dff9124a356ddd12a7df7cd197d06e1f9722)
@@ -221,4 +221,5 @@
 bool poll( coroutine$ * cor );
 bool poll();
+coroutine$ * resumer();
 
 forall(T & | is_coroutine(T)) {
@@ -231,13 +232,13 @@
 
 // trait for exceptions able to be resumed at another coroutine
-forall(exceptT &, T & | is_coroutine(T))
+forall(exceptT *, T & | is_coroutine(T))
 trait ehm_resume_at { void $throwResume(exceptT &); };
 
 // general resumeAt
-forall(exceptT &, T & | ehm_resume_at( exceptT, T ))
+forall(exceptT *, T & | ehm_resume_at( exceptT, T ))
 void resumeAt( T & receiver, exceptT & ex );
 
 // resumeAt for underlying coroutine$ type
-forall(exceptT & | { void $throwResume(exceptT &); })
+forall(exceptT * | { void $throwResume(exceptT &); })
 void resumeAt( coroutine$ * receiver, exceptT & ex );
 
