Index: libcfa/src/concurrency/coroutine.cfa
===================================================================
--- libcfa/src/concurrency/coroutine.cfa	(revision 41b8ea40e8b670142d317601e53338340fee08be)
+++ libcfa/src/concurrency/coroutine.cfa	(revision 69c5c001921edf7a77ff0c53ac4f0d0e8044b405)
@@ -47,6 +47,5 @@
 
 //-----------------------------------------------------------------------------
-FORALL_DATA_INSTANCE(CoroutineCancelled,
-		(dtype coroutine_t | sized(coroutine_t)), (coroutine_t))
+FORALL_DATA_INSTANCE(CoroutineCancelled, (dtype coroutine_t), (coroutine_t))
 
 struct __cfaehm_node {
@@ -59,5 +58,5 @@
 void mark_exception(CoroutineCancelled(T) *) {}
 
-forall(dtype T | sized(T))
+forall(dtype T)
 void copy(CoroutineCancelled(T) * dst, CoroutineCancelled(T) * src) {
 	dst->the_coroutine = src->the_coroutine;
@@ -77,5 +76,7 @@
 	exception_t * except = (exception_t *)(1 + (__cfaehm_node *)desc->cancellation);
 
+	// TODO: Remove explitate vtable set once trac#186 is fixed.
 	CoroutineCancelled(T) except;
+	except.virtual_table = &get_exception_vtable(&except);
 	except.the_coroutine = &cor;
 	except.the_exception = except;
Index: libcfa/src/concurrency/coroutine.hfa
===================================================================
--- libcfa/src/concurrency/coroutine.hfa	(revision 41b8ea40e8b670142d317601e53338340fee08be)
+++ libcfa/src/concurrency/coroutine.hfa	(revision 69c5c001921edf7a77ff0c53ac4f0d0e8044b405)
@@ -22,7 +22,5 @@
 //-----------------------------------------------------------------------------
 // Exception thrown from resume when a coroutine stack is cancelled.
-// Should not have to be be sized (see trac #196).
-FORALL_DATA_EXCEPTION(CoroutineCancelled,
-		(dtype coroutine_t | sized(coroutine_t)), (coroutine_t)) (
+FORALL_DATA_EXCEPTION(CoroutineCancelled, (dtype coroutine_t), (coroutine_t)) (
 	coroutine_t * the_coroutine;
 	exception_t * the_exception;
@@ -30,7 +28,4 @@
 
 forall(dtype T)
-void mark_exception(CoroutineCancelled(T) *);
-
-forall(dtype T | sized(T))
 void copy(CoroutineCancelled(T) * dst, CoroutineCancelled(T) * src);
 
@@ -42,7 +37,7 @@
 // Anything that implements this trait can be resumed.
 // Anything that is resumed is a coroutine.
-trait is_coroutine(dtype T | sized(T)
-		| is_resumption_exception(CoroutineCancelled(T))
-		| VTABLE_ASSERTION(CoroutineCancelled, (T))) {
+trait is_coroutine(dtype T
+		| is_resumption_exception(CoroutineCancelled(T),
+			CoroutineCancelled_vtable(T))) {
 	void main(T & this);
 	$coroutine * get_coroutine(T & this);
Index: libcfa/src/exception.h
===================================================================
--- libcfa/src/exception.h	(revision 41b8ea40e8b670142d317601e53338340fee08be)
+++ libcfa/src/exception.h	(revision 69c5c001921edf7a77ff0c53ac4f0d0e8044b405)
@@ -76,21 +76,21 @@
 // implemented in the .c file either so they all have to be inline.
 
-trait is_exception(dtype exceptT) {
+trait is_exception(dtype exceptT, dtype virtualT) {
 	/* The first field must be a pointer to a virtual table.
-	 * That virtual table must be a decendent of the base exception virtual tab$
+	 * That virtual table must be a decendent of the base exception virtual table.
 	 */
-	void mark_exception(exceptT *);
-	// This is never used and should be a no-op.
+	virtualT const & get_exception_vtable(exceptT *);
+	// Always returns the virtual table for this type (associated types hack).
 };
 
-trait is_termination_exception(dtype exceptT | is_exception(exceptT)) {
+trait is_termination_exception(dtype exceptT, dtype virtualT | is_exception(exceptT, virtualT)) {
 	void defaultTerminationHandler(exceptT &);
 };
 
-trait is_resumption_exception(dtype exceptT | is_exception(exceptT)) {
+trait is_resumption_exception(dtype exceptT, dtype virtualT | is_exception(exceptT, virtualT)) {
 	void defaultResumptionHandler(exceptT &);
 };
 
-forall(dtype exceptT | is_termination_exception(exceptT))
+forall(dtype exceptT, dtype virtualT | is_termination_exception(exceptT, virtualT))
 static inline void $throw(exceptT & except) {
 	__cfaehm_throw_terminate(
@@ -100,5 +100,5 @@
 }
 
-forall(dtype exceptT | is_resumption_exception(exceptT))
+forall(dtype exceptT, dtype virtualT | is_resumption_exception(exceptT, virtualT))
 static inline void $throwResume(exceptT & except) {
 	__cfaehm_throw_resume(
@@ -108,15 +108,15 @@
 }
 
-forall(dtype exceptT | is_exception(exceptT))
+forall(dtype exceptT, dtype virtualT | is_exception(exceptT, virtualT))
 static inline void cancel_stack(exceptT & except) __attribute__((noreturn)) {
 	__cfaehm_cancel_stack( (exception_t *)&except );
 }
 
-forall(dtype exceptT | is_exception(exceptT))
+forall(dtype exceptT, dtype virtualT | is_exception(exceptT, virtualT))
 static inline void defaultTerminationHandler(exceptT & except) {
 	return cancel_stack( except );
 }
 
-forall(dtype exceptT | is_exception(exceptT))
+forall(dtype exceptT, dtype virtualT | is_exception(exceptT, virtualT))
 static inline void defaultResumptionHandler(exceptT & except) {
 	throw except;
Index: libcfa/src/exception.hfa
===================================================================
--- libcfa/src/exception.hfa	(revision 41b8ea40e8b670142d317601e53338340fee08be)
+++ libcfa/src/exception.hfa	(revision 69c5c001921edf7a77ff0c53ac4f0d0e8044b405)
@@ -95,5 +95,5 @@
 // visible anywhere you use the instantiation of the exception is used.
 #define POLY_VTABLE_DECLARATION(exception_name, ...) \
-	void mark_exception(exception_name(__VA_ARGS__) *); \
+	VTABLE_TYPE(exception_name)(__VA_ARGS__) const & get_exception_vtable(exception_name(__VA_ARGS__) *); \
 	extern VTABLE_TYPE(exception_name)(__VA_ARGS__) VTABLE_NAME(exception_name)
 
@@ -160,10 +160,11 @@
 
 #define _FORALL_CTOR0_DECLARATION(exception_name, assertions, parameters) \
-	forall(_UNPACK assertions | VTABLE_ASSERTION(exception_name, parameters) ) \
+	forall(_UNPACK assertions | \
+		is_exception(exception_name parameters, VTABLE_TYPE(exception_name) parameters)) \
 	void ?{}(exception_name parameters & this)
 
 #define _FORALL_CTOR0_INSTANCE(exception_name, assertions, parameters) \
 	_FORALL_CTOR0_DECLARATION(exception_name, assertions, parameters) { \
-		VTABLE_INIT(this, exception_name); \
+		(this).virtual_table = &get_exception_vtable(&this); \
 	}
 
@@ -185,6 +186,6 @@
 #define _VTABLE_DECLARATION(exception_name, parent_name, ...) \
 	struct exception_name; \
-	void mark_exception(exception_name *); \
 	VTABLE_TYPE(exception_name); \
+	VTABLE_TYPE(exception_name) const & get_exception_vtable(exception_name *); \
 	extern VTABLE_TYPE(exception_name) VTABLE_NAME(exception_name); \
 	VTABLE_TYPE(exception_name) { \
@@ -197,5 +198,7 @@
 
 #define _VTABLE_INSTANCE(exception_name, parent_name, ...) \
-	void mark_exception(exception_name *) {} \
+	VTABLE_TYPE(exception_name) const & get_exception_vtable(exception_name *) { \
+		return VTABLE_NAME(exception_name); \
+	} \
 	void _GLUE2(exception_name,_copy)(exception_name * this, exception_name * other) { \
 		*this = *other; \
@@ -218,5 +221,9 @@
 
 #define _POLY_VTABLE_INSTANCE(exception_name, parent_name, ...) \
-	void mark_exception(exception_name(__VA_ARGS__) *) {} \
+	extern VTABLE_TYPE(exception_name)(__VA_ARGS__) VTABLE_NAME(exception_name); \
+	VTABLE_TYPE(exception_name)(__VA_ARGS__) const & get_exception_vtable( \
+			exception_name(__VA_ARGS__) *) { \
+		return VTABLE_NAME(exception_name); \
+	} \
 	void _GLUE2(exception_name,_copy)( \
 			exception_name(__VA_ARGS__) * this, exception_name(__VA_ARGS__) * other) { \
Index: src/Concurrency/Keywords.cc
===================================================================
--- src/Concurrency/Keywords.cc	(revision 41b8ea40e8b670142d317601e53338340fee08be)
+++ src/Concurrency/Keywords.cc	(revision 69c5c001921edf7a77ff0c53ac4f0d0e8044b405)
@@ -66,5 +66,6 @@
 			bool needs_main, AggregateDecl::Aggregate cast_target ) :
 		  type_name( type_name ), field_name( field_name ), getter_name( getter_name ),
-		  context_error( context_error ), vtable_name( getVTableName( exception_name ) ),
+		  context_error( context_error ), exception_name( exception_name ),
+		  vtable_name( getVTableName( exception_name ) ),
 		  needs_main( needs_main ), cast_target( cast_target ) {}
 
@@ -89,4 +90,5 @@
 		const std::string getter_name;
 		const std::string context_error;
+		const std::string exception_name;
 		const std::string vtable_name;
 		bool needs_main;
@@ -95,4 +97,5 @@
 		StructDecl   * type_decl = nullptr;
 		FunctionDecl * dtor_decl = nullptr;
+		StructDecl * except_decl = nullptr;
 		StructDecl * vtable_decl = nullptr;
 	};
@@ -376,4 +379,7 @@
 		else if ( is_target(decl) ) {
 			handle( decl );
+		}
+		else if ( !except_decl && exception_name == decl->name && decl->body ) {
+			except_decl = decl;
 		}
 		else if ( !vtable_decl && vtable_name == decl->name && decl->body ) {
@@ -398,7 +404,11 @@
 			assert( struct_type );
 
-			declsToAddAfter.push_back( Virtual::makeVtableInstance( vtable_decl, {
-				new TypeExpr( struct_type->clone() ),
-			}, struct_type, nullptr ) );
+			std::list< Expression * > poly_args = { new TypeExpr( struct_type->clone() ) };
+			ObjectDecl * vtable_object = Virtual::makeVtableInstance(
+				vtable_decl->makeInst( poly_args ), struct_type, nullptr );
+			declsToAddAfter.push_back( vtable_object );
+			declsToAddAfter.push_back( Virtual::makeGetExceptionFunction(
+				vtable_object, except_decl->makeInst( std::move( poly_args ) )
+			) );
 		}
 
@@ -434,7 +444,13 @@
 	void ConcurrentSueKeyword::addVtableForward( StructDecl * decl ) {
 		if ( vtable_decl ) {
-			declsToAddBefore.push_back( Virtual::makeVtableForward( vtable_decl, {
+			std::list< Expression * > poly_args = {
 				new TypeExpr( new StructInstType( noQualifiers, decl ) ),
-			} ) );
+			};
+			declsToAddBefore.push_back( Virtual::makeGetExceptionForward(
+				vtable_decl->makeInst( poly_args ),
+				except_decl->makeInst( poly_args )
+			) );
+			declsToAddBefore.push_back( Virtual::makeVtableForward(
+				vtable_decl->makeInst( move( poly_args ) ) ) );
 		// Its only an error if we want a vtable and don't have one.
 		} else if ( ! vtable_name.empty() ) {
Index: src/SynTree/AggregateDecl.cc
===================================================================
--- src/SynTree/AggregateDecl.cc	(revision 41b8ea40e8b670142d317601e53338340fee08be)
+++ src/SynTree/AggregateDecl.cc	(revision 69c5c001921edf7a77ff0c53ac4f0d0e8044b405)
@@ -21,4 +21,5 @@
 #include "Common/utility.h"      // for printAll, cloneAll, deleteAll
 #include "Declaration.h"         // for AggregateDecl, TypeDecl, Declaration
+#include "Expression.h"
 #include "Initializer.h"
 #include "LinkageSpec.h"         // for Spec, linkageName, Cforall
@@ -88,4 +89,17 @@
 const char * StructDecl::typeString() const { return aggrString( kind ); }
 
+StructInstType * StructDecl::makeInst( std::list< Expression * > const & new_parameters ) {
+	std::list< Expression * > copy_parameters;
+	cloneAll( new_parameters, copy_parameters );
+	return makeInst( move( copy( copy_parameters ) ) );
+}
+
+StructInstType * StructDecl::makeInst( std::list< Expression * > && new_parameters ) {
+	assert( parameters.size() == new_parameters.size() );
+	StructInstType * type = new StructInstType( noQualifiers, this );
+	type->parameters = std::move( new_parameters );
+	return type;
+}
+
 const char * UnionDecl::typeString() const { return aggrString( Union ); }
 
Index: src/SynTree/Declaration.h
===================================================================
--- src/SynTree/Declaration.h	(revision 41b8ea40e8b670142d317601e53338340fee08be)
+++ src/SynTree/Declaration.h	(revision 69c5c001921edf7a77ff0c53ac4f0d0e8044b405)
@@ -306,4 +306,8 @@
 	bool is_thread   () { return kind == Thread   ; }
 
+	// Make a type instance of this declaration.
+	StructInstType * makeInst( std::list< Expression * > const & parameters );
+	StructInstType * makeInst( std::list< Expression * > && parameters );
+
 	virtual StructDecl * clone() const override { return new StructDecl( *this ); }
 	virtual void accept( Visitor & v ) override { v.visit( this ); }
Index: src/Virtual/Tables.cc
===================================================================
--- src/Virtual/Tables.cc	(revision 41b8ea40e8b670142d317601e53338340fee08be)
+++ src/Virtual/Tables.cc	(revision 69c5c001921edf7a77ff0c53ac4f0d0e8044b405)
@@ -14,6 +14,8 @@
 //
 
+#include <SynTree/Attribute.h>
 #include <SynTree/Declaration.h>
 #include <SynTree/Expression.h>
+#include <SynTree/Statement.h>
 #include <SynTree/Type.h>
 
@@ -38,14 +40,4 @@
 }
 
-// Fuse base polymorphic declaration and forall arguments into a new type.
-static StructInstType * vtableInstType(
-		StructDecl * polyDecl, std::list< Expression * > && parameters ) {
-	assert( parameters.size() == polyDecl->parameters.size() );
-	StructInstType * type = new StructInstType(
-			Type::Qualifiers( /* Type::Const */ ), polyDecl );
-	type->parameters = std::move( parameters );
-	return type;
-}
-
 static ObjectDecl * makeVtableDeclaration(
 		StructInstType * type, Initializer * init ) {
@@ -66,14 +58,12 @@
 
 ObjectDecl * makeVtableForward( StructInstType * type ) {
+	assert( type );
 	return makeVtableDeclaration( type, nullptr );
 }
 
-ObjectDecl * makeVtableForward(
-		StructDecl * polyDecl, std::list< Expression * > && parameters ) {
-	return makeVtableForward( vtableInstType( polyDecl, std::move( parameters ) ) );
-}
-
 ObjectDecl * makeVtableInstance(
-		StructInstType * vtableType, Type * vobject_type, Initializer * init ) {
+		StructInstType * vtableType, Type * objectType, Initializer * init ) {
+	assert( vtableType );
+	assert( objectType );
 	StructDecl * vtableStruct = vtableType->baseStruct;
 	// Build the initialization
@@ -92,7 +82,7 @@
 						new SingleInit( new AddressExpr( new NameExpr( parentInstance ) ) ) );
 			} else if ( std::string( "size" ) == field->name ) {
-				inits.push_back( new SingleInit( new SizeofExpr( vobject_type->clone() ) ) );
+				inits.push_back( new SingleInit( new SizeofExpr( objectType->clone() ) ) );
 			} else if ( std::string( "align" ) == field->name ) {
-				inits.push_back( new SingleInit( new AlignofExpr( vobject_type->clone() ) ) );
+				inits.push_back( new SingleInit( new AlignofExpr( objectType->clone() ) ) );
 			} else {
 				inits.push_back( new SingleInit( new NameExpr( field->name ) ) );
@@ -108,9 +98,51 @@
 }
 
-ObjectDecl * makeVtableInstance(
-		StructDecl * polyDecl, std::list< Expression * > && parameters,
-		Type * vobject, Initializer * init ) {
-	return makeVtableInstance(
-		vtableInstType( polyDecl, std::move( parameters ) ), vobject, init );
+namespace {
+	std::string const functionName = "get_exception_vtable";
+}
+
+FunctionDecl * makeGetExceptionForward(
+		Type * vtableType, Type * exceptType ) {
+	assert( vtableType );
+	assert( exceptType );
+	FunctionType * type = new FunctionType( noQualifiers, false );
+	vtableType->tq.is_const = true;
+	type->returnVals.push_back( new ObjectDecl(
+		"_retvalue",
+		noStorageClasses,
+		LinkageSpec::Cforall,
+		nullptr,
+		new ReferenceType( noQualifiers, vtableType ),
+		nullptr,
+        { new Attribute("unused") }
+	) );
+	type->parameters.push_back( new ObjectDecl(
+		"__unused",
+		noStorageClasses,
+		LinkageSpec::Cforall,
+		nullptr,
+		new PointerType( noQualifiers, exceptType ),
+		nullptr,
+		{ new Attribute("unused") }
+	) );
+	return new FunctionDecl(
+		functionName,
+		noStorageClasses,
+		LinkageSpec::Cforall,
+		type,
+		nullptr
+	);
+}
+
+FunctionDecl * makeGetExceptionFunction(
+		ObjectDecl * vtableInstance, Type * exceptType ) {
+	assert( vtableInstance );
+	assert( exceptType );
+	FunctionDecl * func = makeGetExceptionForward(
+		vtableInstance->type->clone(), exceptType );
+	func->statements = new CompoundStmt( {
+		new ReturnStmt( new VariableExpr( vtableInstance ) ),
+	} );
+	return func;
 }
 
Index: src/Virtual/Tables.h
===================================================================
--- src/Virtual/Tables.h	(revision 41b8ea40e8b670142d317601e53338340fee08be)
+++ src/Virtual/Tables.h	(revision 69c5c001921edf7a77ff0c53ac4f0d0e8044b405)
@@ -27,25 +27,25 @@
 bool isVTableInstanceName( std::string const & name );
 
-/// Converts exceptions into regular structures.
-//void ( std::list< Declaration * > & translationUnit );
-
-ObjectDecl * makeVtableForward( StructInstType * );
-ObjectDecl * makeVtableForward( StructDecl *, std::list< Expression * > && );
-/* Create a forward definition of a vtable of the given type.
- *
- * Instead of the virtual table type you may provide the declaration and all
- * the forall parameters.
+ObjectDecl * makeVtableForward( StructInstType * vtableType );
+/* Create a forward declaration of a vtable of the given type.
+ * vtableType node is consumed.
  */
 
-ObjectDecl * makeVtableInstance( StructInstType *, Type *, Initializer * );
-ObjectDecl * makeVtableInstance(
-	StructDecl *, std::list< Expression * > &&, Type *, Initializer * );
+ObjectDecl * makeVtableInstance( StructInstType * vtableType, Type * objectType,
+	Initializer * init = nullptr );
 /* Create an initialized definition of a vtable.
- *
- * The parameters are the virtual table type (or the base declaration and the
- * forall parameters), the object type and optionally an initializer.
- *
- * Instead of the virtual table type you may provide the declaration and all
- * the forall parameters.
+ * vtableType and init (if provided) nodes are consumed.
+ */
+
+// Some special code for how exceptions interact with virtual tables.
+FunctionDecl * makeGetExceptionForward( Type * vtableType, Type * exceptType );
+/* Create a forward declaration of the exception virtual function
+ * linking the vtableType to the exceptType. Both nodes are consumed.
+ */
+
+FunctionDecl * makeGetExceptionFunction(
+	ObjectDecl * vtableInstance, Type * exceptType );
+/* Create the definition of the exception virtual function.
+ * exceptType node is consumed.
  */
 
Index: tests/exceptions/defaults.cfa
===================================================================
--- tests/exceptions/defaults.cfa	(revision 41b8ea40e8b670142d317601e53338340fee08be)
+++ tests/exceptions/defaults.cfa	(revision 69c5c001921edf7a77ff0c53ac4f0d0e8044b405)
@@ -55,5 +55,5 @@
 
 void unhandled_test(void) {
-	forall(dtype T | is_exception(T))
+	forall(dtype T, dtype V | is_exception(T, V))
 	void defaultTerminationHandler(T &) {
 		throw (unhandled_exception){};
