Index: libcfa/src/concurrency/clib/cfathread.cfa
===================================================================
--- libcfa/src/concurrency/clib/cfathread.cfa	(revision fec63b21f5efc819f13b798d37a05390d81a66ee)
+++ libcfa/src/concurrency/clib/cfathread.cfa	(revision 50f6afb777a2a99adaa5c5a1c12c05fea3ddc2c4)
@@ -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/coroutine.cfa
===================================================================
--- libcfa/src/concurrency/coroutine.cfa	(revision fec63b21f5efc819f13b798d37a05390d81a66ee)
+++ libcfa/src/concurrency/coroutine.cfa	(revision 50f6afb777a2a99adaa5c5a1c12c05fea3ddc2c4)
@@ -46,6 +46,4 @@
 
 //-----------------------------------------------------------------------------
-EHM_VIRTUAL_TABLE(SomeCoroutineCancelled, std_coroutine_cancelled);
-
 forall(T &)
 void copy(CoroutineCancelled(T) * dst, CoroutineCancelled(T) * src) {
@@ -62,5 +60,6 @@
 // This code should not be inlined. It is the error path on resume.
 forall(T & | is_coroutine(T))
-void __cfaehm_cancelled_coroutine( T & cor, $coroutine * desc ) {
+void __cfaehm_cancelled_coroutine(
+		T & cor, $coroutine * desc, _EHM_VTABLE_TYPE(CoroutineCancelled)(T) & const _default_vtable ) {
 	verify( desc->cancellation );
 	desc->state = Cancelled;
@@ -68,10 +67,10 @@
 
 	// TODO: Remove explitate vtable set once trac#186 is fixed.
-	SomeCoroutineCancelled except;
-	except.virtual_table = &std_coroutine_cancelled;
+	CoroutineCancelled(T) except;
+	except.virtual_table = &_default_vtable;
 	except.the_coroutine = &cor;
 	except.the_exception = except;
 	// Why does this need a cast?
-	throwResume (SomeCoroutineCancelled &)except;
+	throwResume (CoroutineCancelled(T) &)except;
 
 	except->virtual_table->free( except );
@@ -146,5 +145,5 @@
 // Part of the Public API
 // Not inline since only ever called once per coroutine
-forall(T & | is_coroutine(T))
+forall(T & | is_coroutine(T) | { _EHM_VTABLE_TYPE(CoroutineCancelled)(T) & const _default_vtable; })
 void prime(T& cor) {
 	$coroutine* this = get_coroutine(cor);
Index: libcfa/src/concurrency/coroutine.hfa
===================================================================
--- libcfa/src/concurrency/coroutine.hfa	(revision fec63b21f5efc819f13b798d37a05390d81a66ee)
+++ libcfa/src/concurrency/coroutine.hfa	(revision 50f6afb777a2a99adaa5c5a1c12c05fea3ddc2c4)
@@ -22,11 +22,4 @@
 //-----------------------------------------------------------------------------
 // Exception thrown from resume when a coroutine stack is cancelled.
-EHM_EXCEPTION(SomeCoroutineCancelled)(
-	void * the_coroutine;
-	exception_t * the_exception;
-);
-
-EHM_EXTERN_VTABLE(SomeCoroutineCancelled, std_coroutine_cancelled);
-
 EHM_FORALL_EXCEPTION(CoroutineCancelled, (coroutine_t &), (coroutine_t)) (
 	coroutine_t * the_coroutine;
@@ -44,5 +37,5 @@
 // Anything that implements this trait can be resumed.
 // Anything that is resumed is a coroutine.
-trait is_coroutine(T & | IS_RESUMPTION_EXCEPTION(SomeCoroutineCancelled)) {
+trait is_coroutine(T & | IS_RESUMPTION_EXCEPTION(CoroutineCancelled, (T))) {
 	void main(T & this);
 	$coroutine * get_coroutine(T & this);
@@ -67,5 +60,5 @@
 //-----------------------------------------------------------------------------
 // Public coroutine API
-forall(T & | is_coroutine(T))
+forall(T & | is_coroutine(T) | { _EHM_VTABLE_TYPE(CoroutineCancelled)(T) & const _default_vtable; })
 void prime(T & cor);
 
@@ -137,8 +130,9 @@
 
 forall(T & | is_coroutine(T))
-void __cfaehm_cancelled_coroutine( T & cor, $coroutine * desc );
+void __cfaehm_cancelled_coroutine(
+	T & cor, $coroutine * desc, _EHM_VTABLE_TYPE(CoroutineCancelled)(T) & const _default_vtable );
 
 // Resume implementation inlined for performance
-forall(T & | is_coroutine(T))
+forall(T & | is_coroutine(T) | { _EHM_VTABLE_TYPE(CoroutineCancelled)(T) & const _default_vtable; })
 static inline T & resume(T & cor) {
 	// optimization : read TLS once and reuse it
@@ -170,5 +164,5 @@
 	$ctx_switch( src, dst );
 	if ( unlikely(dst->cancellation) ) {
-		__cfaehm_cancelled_coroutine( cor, dst );
+		__cfaehm_cancelled_coroutine( cor, dst, _default_vtable );
 	}
 
Index: libcfa/src/concurrency/locks.hfa
===================================================================
--- libcfa/src/concurrency/locks.hfa	(revision fec63b21f5efc819f13b798d37a05390d81a66ee)
+++ libcfa/src/concurrency/locks.hfa	(revision 50f6afb777a2a99adaa5c5a1c12c05fea3ddc2c4)
@@ -197,6 +197,5 @@
 static inline $thread * unlock( fast_lock & this ) __attribute__((artificial));
 static inline $thread * unlock( fast_lock & this ) {
-	$thread * thrd = active_thread();
-	/* paranoid */ verify(thrd == this.owner);
+	/* paranoid */ verify(active_thread() == this.owner);
 
 	// open 'owner' before unlocking anyone
Index: libcfa/src/concurrency/ready_queue.cfa
===================================================================
--- libcfa/src/concurrency/ready_queue.cfa	(revision fec63b21f5efc819f13b798d37a05390d81a66ee)
+++ libcfa/src/concurrency/ready_queue.cfa	(revision 50f6afb777a2a99adaa5c5a1c12c05fea3ddc2c4)
@@ -413,13 +413,17 @@
 			unsigned it2  = proc->rdq.itr + 1;
 			unsigned idx1 = proc->rdq.id + (it1 % READYQ_SHARD_FACTOR);
-			unsigned idx2 = proc->rdq.id + (it1 % READYQ_SHARD_FACTOR);
+			unsigned idx2 = proc->rdq.id + (it2 % READYQ_SHARD_FACTOR);
 			unsigned long long tsc1 = ts(lanes.data[idx1]);
 			unsigned long long tsc2 = ts(lanes.data[idx2]);
 			proc->rdq.cutoff = min(tsc1, tsc2);
-		}
-		else if(lanes.tscs[proc->rdq.target].tv < proc->rdq.cutoff) {
-			$thread * t = try_pop(cltr, proc->rdq.target __STATS(, __tls_stats()->ready.pop.help));
+			if(proc->rdq.cutoff == 0) proc->rdq.cutoff = -1ull;
+		}
+		else {
+			unsigned target = proc->rdq.target;
 			proc->rdq.target = -1u;
-			if(t) return t;
+			if(lanes.tscs[target].tv < proc->rdq.cutoff) {
+				$thread * t = try_pop(cltr, target __STATS(, __tls_stats()->ready.pop.help));
+				if(t) return t;
+			}
 		}
 
Index: libcfa/src/concurrency/stats.cfa
===================================================================
--- libcfa/src/concurrency/stats.cfa	(revision fec63b21f5efc819f13b798d37a05390d81a66ee)
+++ libcfa/src/concurrency/stats.cfa	(revision 50f6afb777a2a99adaa5c5a1c12c05fea3ddc2c4)
@@ -126,28 +126,29 @@
 			double sExt_len = ready.push.extrn.success ? ((double)ready.push.extrn.attempt) / ready.push.extrn.success : 0;
 
-			double rLcl_len  = ready.pop.local .success ? ((double)ready.pop.local .attempt) / ready.pop.local .success : 0;
-			double rHlp_len  = ready.pop.help  .success ? ((double)ready.pop.help  .attempt) / ready.pop.help  .success : 0;
-			double rStl_len  = ready.pop.steal .success ? ((double)ready.pop.steal .attempt) / ready.pop.steal .success : 0;
-			double rSch_len  = ready.pop.search.success ? ((double)ready.pop.search.attempt) / ready.pop.search.success : 0;
+			uint64_t total = ready.pop.local.success + ready.pop.help.success + ready.pop.steal.success + ready.pop.search.success;
+			double rLcl_pc = (100.0 * (double)ready.pop.local .success) / total;
+			double rHlp_pc = (100.0 * (double)ready.pop.help  .success) / total;
+			double rStl_pc = (100.0 * (double)ready.pop.steal .success) / total;
+			double rSch_pc = (100.0 * (double)ready.pop.search.success) / total;
 
 			__cfaabi_bits_print_safe( STDOUT_FILENO,
 				"----- %s \"%s\" (%p) - Ready Q Stats -----\n"
 				"- totals   : %'3" PRIu64 " run, %'3" PRIu64 " schd (%'" PRIu64 "ext, %'" PRIu64 "mig, %'" PRId64 " )\n"
-				"- push avg : %'3.2lf (l: %'3.2lf/%'" PRIu64 ", s: %'3.2lf/%'" PRIu64 ", e: %'3.2lf : %'" PRIu64 "e)\n"
-				"- local    : %'3.2lf (%'3" PRIu64 " try, %'3" PRIu64 " spc, %'3" PRIu64 " lck, %'3" PRIu64 " ept)\n"
-				"- help     : %'3.2lf (%'3" PRIu64 " try, %'3" PRIu64 " spc, %'3" PRIu64 " lck, %'3" PRIu64 " ept)\n"
-				"- steal    : %'3.2lf (%'3" PRIu64 " try, %'3" PRIu64 " spc, %'3" PRIu64 " lck, %'3" PRIu64 " ept)\n"
-				"- search   : %'3.2lf (%'3" PRIu64 " try, %'3" PRIu64 " spc, %'3" PRIu64 " lck, %'3" PRIu64 " ept)\n"
+				"- push avg : %'3.0lf (l: %'3.2lf/%'" PRIu64 ", s: %'3.2lf/%'" PRIu64 ", e: %'3.2lf : %'" PRIu64 "e)\n"
+				"- local    : %'3.0lf%%: %'3" PRIu64 " (%'3" PRIu64 " try, %'3" PRIu64 " spc, %'3" PRIu64 " lck, %'3" PRIu64 " ept)\n"
+				"- help     : %'3.0lf%%: %'3" PRIu64 " (%'3" PRIu64 " try, %'3" PRIu64 " spc, %'3" PRIu64 " lck, %'3" PRIu64 " ept)\n"
+				"- steal    : %'3.0lf%%: %'3" PRIu64 " (%'3" PRIu64 " try, %'3" PRIu64 " spc, %'3" PRIu64 " lck, %'3" PRIu64 " ept)\n"
+				"- search   : %'3.0lf%%: %'3" PRIu64 " (%'3" PRIu64 " try, %'3" PRIu64 " spc, %'3" PRIu64 " lck, %'3" PRIu64 " ept)\n"
 				"- Idle Slp : %'3" PRIu64 "h, %'3" PRIu64 "c, %'3" PRIu64 "w, %'3" PRIu64 "e\n"
 				"\n"
 				, type, name, id
-				, ready.pop.local.success + ready.pop.help.success + ready.pop.steal.success + ready.pop.search.success
+				, total
 				, ready.push.local.success + ready.push.share.success + ready.push.extrn.success
 				, ready.push.extrn.success, ready.threads.migration, ready.threads.threads
 				, push_len, sLcl_len, ready.push.local.attempt, sOth_len, ready.push.share.attempt, sExt_len, ready.push.extrn.attempt
-				, rLcl_len, ready.pop.local .attempt, ready.pop.local .espec, ready.pop.local .elock, ready.pop.local .eempty
-				, rHlp_len, ready.pop.help  .attempt, ready.pop.help  .espec, ready.pop.help  .elock, ready.pop.help  .eempty
-				, rStl_len, ready.pop.steal .attempt, ready.pop.steal .espec, ready.pop.steal .elock, ready.pop.steal .eempty
-				, rSch_len, ready.pop.search.attempt, ready.pop.search.espec, ready.pop.search.elock, ready.pop.search.eempty
+				, rLcl_pc, ready.pop.local .success, ready.pop.local .attempt, ready.pop.local .espec, ready.pop.local .elock, ready.pop.local .eempty
+				, rHlp_pc, ready.pop.help  .success, ready.pop.help  .attempt, ready.pop.help  .espec, ready.pop.help  .elock, ready.pop.help  .eempty
+				, rStl_pc, ready.pop.steal .success, ready.pop.steal .attempt, ready.pop.steal .espec, ready.pop.steal .elock, ready.pop.steal .eempty
+				, rSch_pc, ready.pop.search.success, ready.pop.search.attempt, ready.pop.search.espec, ready.pop.search.elock, ready.pop.search.eempty
 				, ready.sleep.halts, ready.sleep.cancels, ready.sleep.wakes, ready.sleep.exits
 			);
Index: libcfa/src/concurrency/thread.cfa
===================================================================
--- libcfa/src/concurrency/thread.cfa	(revision fec63b21f5efc819f13b798d37a05390d81a66ee)
+++ libcfa/src/concurrency/thread.cfa	(revision 50f6afb777a2a99adaa5c5a1c12c05fea3ddc2c4)
@@ -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 fec63b21f5efc819f13b798d37a05390d81a66ee)
+++ libcfa/src/concurrency/thread.hfa	(revision 50f6afb777a2a99adaa5c5a1c12c05fea3ddc2c4)
@@ -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: libcfa/src/exception.hfa
===================================================================
--- libcfa/src/exception.hfa	(revision fec63b21f5efc819f13b798d37a05390d81a66ee)
+++ libcfa/src/exception.hfa	(revision 50f6afb777a2a99adaa5c5a1c12c05fea3ddc2c4)
@@ -142,8 +142,4 @@
 		_EHM_VTABLE_TYPE(exception_name) parameters const &) {} \
 
-#define _EHM_TRAIT_FUNCTION2(exception_name, forall_clause, parameters) \
-	forall_clause _EHM_VTABLE_TYPE(exception_name) parameters const & \
-			get_exception_vtable(exception_name parameters const & this)
-
 #define __EHM_TRAIT_FUNCTION(exception_name, forall_clause, parameters) \
 	forall_clause inline _EHM_VTABLE_TYPE(exception_name) parameters const & \
