Index: libcfa/src/concurrency/clib/cfathread.cfa
===================================================================
--- libcfa/src/concurrency/clib/cfathread.cfa	(revision aaf92de26baed13867cb94d561e0a524f4622f79)
+++ libcfa/src/concurrency/clib/cfathread.cfa	(revision 8edbe407c24c9d794ff7c63d67c463043f96ae3b)
@@ -50,4 +50,6 @@
 
 cfathread_vtable _cfathread_vtable_instance;
+
+cfathread_vtable & const _default_vtable = _cfathread_vtable_instance;
 
 cfathread_vtable const & get_exception_vtable(cfathread_exception *) {
Index: libcfa/src/concurrency/thread.cfa
===================================================================
--- libcfa/src/concurrency/thread.cfa	(revision aaf92de26baed13867cb94d561e0a524f4622f79)
+++ libcfa/src/concurrency/thread.cfa	(revision 8edbe407c24c9d794ff7c63d67c463043f96ae3b)
@@ -61,6 +61,4 @@
 }
 
-EHM_VIRTUAL_TABLE(SomeThreadCancelled, std_thread_cancelled);
-
 forall(T &)
 void copy(ThreadCancelled(T) * dst, ThreadCancelled(T) * src) {
@@ -81,12 +79,8 @@
 }
 
-static void default_thread_cancel_handler(SomeThreadCancelled & ) {
-	// Improve this error message, can I do formatting?
-	abort( "Unhandled thread cancellation.\n" );
-}
-
-forall(T & | is_thread(T) | IS_EXCEPTION(SomeThreadCancelled))
+forall(T & | is_thread(T) | IS_EXCEPTION(ThreadCancelled, (T))
+    | { _EHM_VTABLE_TYPE(ThreadCancelled)(T) & const _default_vtable; })
 void ?{}( thread_dtor_guard_t & this,
-		T & thrd, void(*cancelHandler)(SomeThreadCancelled &)) {
+		T & thrd, void(*cancelHandler)(ThreadCancelled(T) &)) {
 	$monitor * m = get_monitor(thrd);
 	$thread * desc = get_thread(thrd);
@@ -94,5 +88,5 @@
 	// Setup the monitor guard
 	void (*dtor)(T& mutex this) = ^?{};
-	bool join = cancelHandler != (void(*)(SomeThreadCancelled&))0;
+	bool join = cancelHandler != (void(*)(ThreadCancelled(T)&))0;
 	(this.mg){&m, (void(*)())dtor, join};
 
@@ -108,14 +102,14 @@
 	}
 	desc->state = Cancelled;
-	void(*defaultResumptionHandler)(SomeThreadCancelled &) =
+	void(*defaultResumptionHandler)(ThreadCancelled(T) &) =
 		join ? cancelHandler : default_thread_cancel_handler;
 
 	// TODO: Remove explitate vtable set once trac#186 is fixed.
-	SomeThreadCancelled except;
-	except.virtual_table = &std_thread_cancelled;
+	ThreadCancelled(T) except;
+	except.virtual_table = &_default_vtable;
 	except.the_thread = &thrd;
 	except.the_exception = __cfaehm_cancellation_exception( cancellation );
 	// Why is this cast required?
-	throwResume (SomeThreadCancelled &)except;
+	throwResume (ThreadCancelled(T) &)except;
 
 	except.the_exception->virtual_table->free( except.the_exception );
@@ -164,5 +158,6 @@
 
 //-----------------------------------------------------------------------------
-forall(T & | is_thread(T) | IS_RESUMPTION_EXCEPTION(SomeThreadCancelled))
+forall(T & | is_thread(T) | IS_RESUMPTION_EXCEPTION(ThreadCancelled, (T))
+    | { _EHM_VTABLE_TYPE(ThreadCancelled)(T) & const _default_vtable; })
 T & join( T & this ) {
 	thread_dtor_guard_t guard = { this, defaultResumptionHandler };
Index: libcfa/src/concurrency/thread.hfa
===================================================================
--- libcfa/src/concurrency/thread.hfa	(revision aaf92de26baed13867cb94d561e0a524f4622f79)
+++ libcfa/src/concurrency/thread.hfa	(revision 8edbe407c24c9d794ff7c63d67c463043f96ae3b)
@@ -31,11 +31,4 @@
 	$thread* get_thread(T& this);
 };
-
-EHM_EXCEPTION(SomeThreadCancelled) (
-	void * the_thread;
-	exception_t * the_exception;
-);
-
-EHM_EXTERN_VTABLE(SomeThreadCancelled, std_thread_cancelled);
 
 EHM_FORALL_EXCEPTION(ThreadCancelled, (thread_t &), (thread_t)) (
@@ -86,6 +79,7 @@
 };
 
-forall( T & | is_thread(T) | IS_EXCEPTION(SomeThreadCancelled) )
-void ?{}( thread_dtor_guard_t & this, T & thrd, void(*)(SomeThreadCancelled &) );
+forall( T & | is_thread(T) | IS_EXCEPTION(ThreadCancelled, (T))
+    | { _EHM_VTABLE_TYPE(ThreadCancelled)(T) & const _default_vtable; } )
+void ?{}( thread_dtor_guard_t & this, T & thrd, void(*)(ThreadCancelled(T) &) );
 void ^?{}( thread_dtor_guard_t & this );
 
@@ -132,5 +126,6 @@
 //----------
 // join
-forall( T & | is_thread(T) | IS_RESUMPTION_EXCEPTION(SomeThreadCancelled) )
+forall( T & | is_thread(T) | IS_RESUMPTION_EXCEPTION(ThreadCancelled, (T))
+    | { _EHM_VTABLE_TYPE(ThreadCancelled)(T) & const _default_vtable; } )
 T & join( T & this );
 
Index: src/Concurrency/Keywords.cc
===================================================================
--- src/Concurrency/Keywords.cc	(revision aaf92de26baed13867cb94d561e0a524f4622f79)
+++ src/Concurrency/Keywords.cc	(revision 8edbe407c24c9d794ff7c63d67c463043f96ae3b)
@@ -501,5 +501,5 @@
 			vtable_decl->makeInst( move( poly_args ) ) );
 		declsToAddBefore.push_back( vtable_object );
-		declsToAddAfter.push_back(
+		declsToAddBefore.push_back(
 			new ObjectDecl(
 				Virtual::concurrentDefaultVTableName(),
Index: tests/exceptions/cancel/thread.cfa
===================================================================
--- tests/exceptions/cancel/thread.cfa	(revision aaf92de26baed13867cb94d561e0a524f4622f79)
+++ tests/exceptions/cancel/thread.cfa	(revision 8edbe407c24c9d794ff7c63d67c463043f96ae3b)
@@ -26,5 +26,5 @@
 		join(cancel);
 		printf("4");
-	} catchResume (SomeThreadCancelled * error) {
+	} catchResume (ThreadCancelled(WillCancel) * error) {
 		printf("2");
 		if ((virtual internal_error *)error->the_exception) {
@@ -43,5 +43,5 @@
 		}
 		printf("4");
-	} catchResume (SomeThreadCancelled * error) {
+	} catchResume (ThreadCancelled(WillCancel) * error) {
 		printf("2");
 		if ((virtual internal_error *)error->the_exception) {
