Index: libcfa/src/concurrency/coroutine.cfa
===================================================================
--- libcfa/src/concurrency/coroutine.cfa	(revision ab8c6a6efe9f4120bf5d5eed0b649cad34d89af3)
+++ libcfa/src/concurrency/coroutine.cfa	(revision 5d2db68b7f82136b007338d3c5ce005b471a7644)
@@ -49,10 +49,4 @@
 FORALL_DATA_INSTANCE(CoroutineCancelled, (dtype coroutine_t), (coroutine_t))
 
-struct __cfaehm_node {
-	struct _Unwind_Exception unwind_exception;
-	struct __cfaehm_node * next;
-	int handler_index;
-};
-
 forall(dtype T)
 void mark_exception(CoroutineCancelled(T) *) {}
@@ -60,4 +54,5 @@
 forall(dtype T)
 void copy(CoroutineCancelled(T) * dst, CoroutineCancelled(T) * src) {
+	dst->virtual_table = src->virtual_table;
 	dst->the_coroutine = src->the_coroutine;
 	dst->the_exception = src->the_exception;
@@ -74,5 +69,5 @@
 	verify( desc->cancellation );
 	desc->state = Cancelled;
-	exception_t * except = (exception_t *)(1 + (__cfaehm_node *)desc->cancellation);
+	exception_t * except = __cfaehm_cancellation_exception( desc->cancellation );
 
 	// TODO: Remove explitate vtable set once trac#186 is fixed.
Index: libcfa/src/concurrency/exception.cfa
===================================================================
--- libcfa/src/concurrency/exception.cfa	(revision ab8c6a6efe9f4120bf5d5eed0b649cad34d89af3)
+++ libcfa/src/concurrency/exception.cfa	(revision 5d2db68b7f82136b007338d3c5ce005b471a7644)
@@ -54,6 +54,6 @@
 
 STOP_AT_END_FUNCTION(thread_cancelstop,
-    __cfactx_thrd_leave();
-    __cabi_abort( "Resumed cancelled thread" );
+	__cfactx_thrd_leave();
+	__cabi_abort( "Resumed cancelled thread" );
 )
 
Index: libcfa/src/concurrency/exception.hfa
===================================================================
--- libcfa/src/concurrency/exception.hfa	(revision ab8c6a6efe9f4120bf5d5eed0b649cad34d89af3)
+++ libcfa/src/concurrency/exception.hfa	(revision 5d2db68b7f82136b007338d3c5ce005b471a7644)
@@ -16,4 +16,6 @@
 #pragma once
 
+// This is an internal bridge between the two modes and must be C compatable.
+
 #include "bits/defs.hfa"
 #include "invoke.h"
@@ -31,4 +33,15 @@
 		struct _Unwind_Exception * unwind_exception ) OPTIONAL_THREAD;
 
+struct __cfaehm_node {
+	struct _Unwind_Exception unwind_exception;
+	struct __cfaehm_node * next;
+	int handler_index;
+};
+
+static inline exception_t * __cfaehm_cancellation_exception(
+		struct _Unwind_Exception * unwind_exception ) {
+	return (exception_t *)(1 + (struct __cfaehm_node *)unwind_exception);
+}
+
 #ifdef __cforall
 #undef HIDE_EXPORTS
Index: libcfa/src/concurrency/thread.cfa
===================================================================
--- libcfa/src/concurrency/thread.cfa	(revision ab8c6a6efe9f4120bf5d5eed0b649cad34d89af3)
+++ libcfa/src/concurrency/thread.cfa	(revision 5d2db68b7f82136b007338d3c5ce005b471a7644)
@@ -73,10 +73,4 @@
 }
 
-struct __cfaehm_node {
-	struct _Unwind_Exception unwind_exception;
-	struct __cfaehm_node * next;
-	int handler_index;
-};
-
 forall(dtype T)
 static void default_thread_cancel_handler(ThreadCancelled(T) & ) {
@@ -91,27 +85,28 @@
 	bool join = defaultResumptionHandler != (void(*)(ThreadCancelled(T)&))0;
 	(this.mg){&m, (void(*)())dtor, join};
-	{
-		$thread * desc = get_thread(thrd);
-		struct _Unwind_Exception * cancellation = desc->self_cor.cancellation;
-		if ( likely(0p == cancellation) ) {
-			return;
-		} else if ( Cancelled == desc->state ) {
-			return;
-		}
-		desc->state = Cancelled;
-		if (!join) {
-			defaultResumptionHandler = default_thread_cancel_handler;
-		}
-		ThreadCancelled(T) except;
-		// TODO: Remove explitate vtable set once trac#186 is fixed.
-		except.virtual_table = &get_exception_vtable(&except);
-		except.the_thread = &thrd;
-		except.the_exception = (exception_t *)(1 + (__cfaehm_node *)cancellation);
-		throwResume except;
 
-		except.the_exception->virtual_table->free( except.the_exception );
-		free( cancellation );
-		desc->self_cor.cancellation = 0p;
+	// After the guard set-up and any wait, check for cancellation.
+	$thread * desc = get_thread(thrd);
+	struct _Unwind_Exception * cancellation = desc->self_cor.cancellation;
+	if ( likely( 0p == cancellation ) ) {
+		return;
+	} else if ( Cancelled == desc->state ) {
+		return;
 	}
+	desc->state = Cancelled;
+	if (!join) {
+		defaultResumptionHandler = default_thread_cancel_handler;
+	}
+
+	ThreadCancelled(T) except;
+	// TODO: Remove explitate vtable set once trac#186 is fixed.
+	except.virtual_table = &get_exception_vtable(&except);
+	except.the_thread = &thrd;
+	except.the_exception = __cfaehm_cancellation_exception( cancellation );
+	throwResume except;
+
+	except.the_exception->virtual_table->free( except.the_exception );
+	free( cancellation );
+	desc->self_cor.cancellation = 0p;
 }
 
Index: libcfa/src/exception.c
===================================================================
--- libcfa/src/exception.c	(revision ab8c6a6efe9f4120bf5d5eed0b649cad34d89af3)
+++ libcfa/src/exception.c	(revision 5d2db68b7f82136b007338d3c5ce005b471a7644)
@@ -24,4 +24,5 @@
 #include <bits/debug.hfa>
 #include "concurrency/invoke.h"
+#include "concurrency/exception.hfa"
 #include "stdhdr/assert.h"
 
@@ -113,10 +114,4 @@
 
 // MEMORY MANAGEMENT =========================================================
-
-struct __cfaehm_node {
-	struct _Unwind_Exception unwind_exception;
-	struct __cfaehm_node * next;
-	int handler_index;
-};
 
 #define NODE_TO_EXCEPT(node) ((exception_t *)(1 + (node)))
