Index: libcfa/src/concurrency/coroutine.cfa
===================================================================
--- libcfa/src/concurrency/coroutine.cfa	(revision aec68b626be82e47f89ad2feda062b0f1c4a568b)
+++ libcfa/src/concurrency/coroutine.cfa	(revision 54565371c3b9261036f76efc5fd039c32cc8a5ae)
@@ -61,5 +61,5 @@
 forall(T & | is_coroutine(T))
 void __cfaehm_cancelled_coroutine(
-		T & cor, $coroutine * desc, _EHM_VTABLE_TYPE(CoroutineCancelled)(T) & const _default_vtable ) {
+		T & cor, $coroutine * desc, EHM_DEFAULT_VTABLE(CoroutineCancelled, (T)) ) {
 	verify( desc->cancellation );
 	desc->state = Cancelled;
@@ -145,5 +145,5 @@
 // Part of the Public API
 // Not inline since only ever called once per coroutine
-forall(T & | is_coroutine(T) | { _EHM_VTABLE_TYPE(CoroutineCancelled)(T) & const _default_vtable; })
+forall(T & | is_coroutine(T) | { EHM_DEFAULT_VTABLE(CoroutineCancelled, (T)); })
 void prime(T& cor) {
 	$coroutine* this = get_coroutine(cor);
Index: libcfa/src/concurrency/coroutine.hfa
===================================================================
--- libcfa/src/concurrency/coroutine.hfa	(revision aec68b626be82e47f89ad2feda062b0f1c4a568b)
+++ libcfa/src/concurrency/coroutine.hfa	(revision 54565371c3b9261036f76efc5fd039c32cc8a5ae)
@@ -60,5 +60,5 @@
 //-----------------------------------------------------------------------------
 // Public coroutine API
-forall(T & | is_coroutine(T) | { _EHM_VTABLE_TYPE(CoroutineCancelled)(T) & const _default_vtable; })
+forall(T & | is_coroutine(T) | { EHM_DEFAULT_VTABLE(CoroutineCancelled, (T)); })
 void prime(T & cor);
 
@@ -131,8 +131,8 @@
 forall(T & | is_coroutine(T))
 void __cfaehm_cancelled_coroutine(
-	T & cor, $coroutine * desc, _EHM_VTABLE_TYPE(CoroutineCancelled)(T) & const _default_vtable );
+	T & cor, $coroutine * desc, EHM_DEFAULT_VTABLE(CoroutineCancelled, (T)) );
 
 // Resume implementation inlined for performance
-forall(T & | is_coroutine(T) | { _EHM_VTABLE_TYPE(CoroutineCancelled)(T) & const _default_vtable; })
+forall(T & | is_coroutine(T) | { EHM_DEFAULT_VTABLE(CoroutineCancelled, (T)); })
 static inline T & resume(T & cor) {
 	// optimization : read TLS once and reuse it
Index: libcfa/src/concurrency/thread.cfa
===================================================================
--- libcfa/src/concurrency/thread.cfa	(revision aec68b626be82e47f89ad2feda062b0f1c4a568b)
+++ libcfa/src/concurrency/thread.cfa	(revision 54565371c3b9261036f76efc5fd039c32cc8a5ae)
@@ -80,5 +80,5 @@
 
 forall(T & | is_thread(T) | IS_EXCEPTION(ThreadCancelled, (T))
-    | { _EHM_VTABLE_TYPE(ThreadCancelled)(T) & const _default_vtable; })
+    | { EHM_DEFAULT_VTABLE(ThreadCancelled, (T)); })
 void ?{}( thread_dtor_guard_t & this,
 		T & thrd, void(*cancelHandler)(ThreadCancelled(T) &)) {
@@ -159,5 +159,5 @@
 //-----------------------------------------------------------------------------
 forall(T & | is_thread(T) | IS_RESUMPTION_EXCEPTION(ThreadCancelled, (T))
-    | { _EHM_VTABLE_TYPE(ThreadCancelled)(T) & const _default_vtable; })
+    | { EHM_DEFAULT_VTABLE(ThreadCancelled, (T)); })
 T & join( T & this ) {
 	thread_dtor_guard_t guard = { this, defaultResumptionHandler };
Index: libcfa/src/concurrency/thread.hfa
===================================================================
--- libcfa/src/concurrency/thread.hfa	(revision aec68b626be82e47f89ad2feda062b0f1c4a568b)
+++ libcfa/src/concurrency/thread.hfa	(revision 54565371c3b9261036f76efc5fd039c32cc8a5ae)
@@ -80,5 +80,5 @@
 
 forall( T & | is_thread(T) | IS_EXCEPTION(ThreadCancelled, (T))
-    | { _EHM_VTABLE_TYPE(ThreadCancelled)(T) & const _default_vtable; } )
+    | { EHM_DEFAULT_VTABLE(ThreadCancelled, (T)); })
 void ?{}( thread_dtor_guard_t & this, T & thrd, void(*)(ThreadCancelled(T) &) );
 void ^?{}( thread_dtor_guard_t & this );
@@ -127,5 +127,5 @@
 // join
 forall( T & | is_thread(T) | IS_RESUMPTION_EXCEPTION(ThreadCancelled, (T))
-    | { _EHM_VTABLE_TYPE(ThreadCancelled)(T) & const _default_vtable; } )
+    | { EHM_DEFAULT_VTABLE(ThreadCancelled, (T)); })
 T & join( T & this );
 
Index: libcfa/src/exception.hfa
===================================================================
--- libcfa/src/exception.hfa	(revision aec68b626be82e47f89ad2feda062b0f1c4a568b)
+++ libcfa/src/exception.hfa	(revision 54565371c3b9261036f76efc5fd039c32cc8a5ae)
@@ -64,7 +64,8 @@
 	_EHM_VIRTUAL_TABLE(exception_name, arguments, table_name)
 
-#define EHM_TYPE_ID(exception_name) _EHM_TYPE_ID_TYPE(exception_name)
-
-#define EHM_MATCH_ALL __cfa__parent_vtable
+// EHM_DEFAULT_VTABLE(exception_name, (arguments))
+// Create a declaration for a (possibly polymorphic) default vtable.
+#define EHM_DEFAULT_VTABLE(exception_name, arguments) \
+	_EHM_VTABLE_TYPE(exception_name) arguments & const _default_vtable
 
 // IS_EXCEPTION(exception_name [, (...parameters)])
