Index: libcfa/src/concurrency/thread.cfa
===================================================================
--- libcfa/src/concurrency/thread.cfa	(revision ab8c6a6efe9f4120bf5d5eed0b649cad34d89af3)
+++ libcfa/src/concurrency/thread.cfa	(revision 342be435469470dee71cab92b46cf14f8fee7f3a)
@@ -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;
 }
 
