Index: libcfa/src/concurrency/invoke.h
===================================================================
--- libcfa/src/concurrency/invoke.h	(revision f9b68d6fb9c867b6b46f5ddf1f0999759d9d443b)
+++ libcfa/src/concurrency/invoke.h	(revision 478c6103a511169384196eb6ac4bf8b72c9d50a9)
@@ -170,4 +170,6 @@
 		bool corctx_flag;
 
+		int last_cpu;
+
 		//SKULLDUGGERY errno is not save in the thread data structure because returnToKernel appears to be the only function to require saving and restoring it
 
Index: libcfa/src/concurrency/kernel.cfa
===================================================================
--- libcfa/src/concurrency/kernel.cfa	(revision f9b68d6fb9c867b6b46f5ddf1f0999759d9d443b)
+++ libcfa/src/concurrency/kernel.cfa	(revision 478c6103a511169384196eb6ac4bf8b72c9d50a9)
@@ -394,4 +394,14 @@
 	__builtin_prefetch( thrd_dst->context.SP );
 
+	int curr = __kernel_getcpu();
+	if(thrd_dst->last_cpu != curr) {
+		int64_t l = thrd_dst->last_cpu;
+		int64_t c = curr;
+		int64_t v = (l << 32) | c;
+		__push_stat( __tls_stats(), v, false, "Processor", this );
+	}
+
+	thrd_dst->last_cpu = curr;
+
 	__cfadbg_print_safe(runtime_core, "Kernel : core %p running thread %p (%s)\n", this, thrd_dst, thrd_dst->self_cor.name);
 
@@ -470,5 +480,4 @@
 				#if !defined(__CFA_NO_STATISTICS__)
 					__tls_stats()->ready.threads.threads++;
-					__push_stat( __tls_stats(), __tls_stats()->ready.threads.threads, false, "Processor", this );
 				#endif
 				// This is case 2, the racy case, someone tried to run this thread before it finished blocking
@@ -488,5 +497,4 @@
 	#if !defined(__CFA_NO_STATISTICS__)
 		__tls_stats()->ready.threads.threads--;
-		__push_stat( __tls_stats(), __tls_stats()->ready.threads.threads, false, "Processor", this );
 	#endif
 
@@ -570,10 +578,8 @@
 				__tls_stats()->ready.threads.extunpark++;
 			}
-			__push_stat( __tls_stats(), __tls_stats()->ready.threads.threads, false, "Processor", kernelTLS().this_processor );
 		}
 		else {
 			__atomic_fetch_add(&cl->stats->ready.threads.threads, 1, __ATOMIC_RELAXED);
 			__atomic_fetch_add(&cl->stats->ready.threads.extunpark, 1, __ATOMIC_RELAXED);
-			__push_stat( cl->stats, cl->stats->ready.threads.threads, true, "Cluster", cl );
 		}
 	#endif
Index: libcfa/src/concurrency/kernel.hfa
===================================================================
--- libcfa/src/concurrency/kernel.hfa	(revision f9b68d6fb9c867b6b46f5ddf1f0999759d9d443b)
+++ libcfa/src/concurrency/kernel.hfa	(revision 478c6103a511169384196eb6ac4bf8b72c9d50a9)
@@ -67,4 +67,5 @@
 		unsigned target;
 		unsigned last;
+		unsigned cnt;
 		unsigned long long int cutoff;
 	} rdq;
Index: libcfa/src/concurrency/kernel/startup.cfa
===================================================================
--- libcfa/src/concurrency/kernel/startup.cfa	(revision f9b68d6fb9c867b6b46f5ddf1f0999759d9d443b)
+++ libcfa/src/concurrency/kernel/startup.cfa	(revision 478c6103a511169384196eb6ac4bf8b72c9d50a9)
@@ -478,4 +478,5 @@
 	state = Start;
 	self_cor{ info };
+	last_cpu = __kernel_getcpu();
 	curr_cor = &self_cor;
 	curr_cluster = mainCluster;
Index: libcfa/src/concurrency/ready_queue.cfa
===================================================================
--- libcfa/src/concurrency/ready_queue.cfa	(revision f9b68d6fb9c867b6b46f5ddf1f0999759d9d443b)
+++ libcfa/src/concurrency/ready_queue.cfa	(revision 478c6103a511169384196eb6ac4bf8b72c9d50a9)
@@ -345,17 +345,10 @@
 			/* paranoid */ verify(lanes.count < 65536); // The following code assumes max 65536 cores.
 			/* paranoid */ verify(map.count < 65536); // The following code assumes max 65536 cores.
-			uint64_t chaos = __tls_rand();
-			uint64_t high_chaos = (chaos >> 32);
-			uint64_t  mid_chaos = (chaos >> 16) & 0xffff;
-			uint64_t  low_chaos = chaos & 0xffff;
-
-			unsigned me = map.self;
-			unsigned cpu_chaos = map.start + (mid_chaos % map.count);
-			bool global = cpu_chaos == me;
-
-			if(global) {
-				proc->rdq.target = high_chaos % lanes.count;
+
+			if(0 == (__tls_rand() % 10_000)) {
+				proc->rdq.target = __tls_rand() % lanes.count;
 			} else {
-				proc->rdq.target = (cpu_chaos * READYQ_SHARD_FACTOR) + (low_chaos % READYQ_SHARD_FACTOR);
+				unsigned cpu_chaos = map.start + (__tls_rand() % map.count);
+				proc->rdq.target = (cpu_chaos * READYQ_SHARD_FACTOR) + (__tls_rand() % READYQ_SHARD_FACTOR);
 				/* paranoid */ verify(proc->rdq.target >= (map.start * READYQ_SHARD_FACTOR));
 				/* paranoid */ verify(proc->rdq.target <  ((map.start + map.count) * READYQ_SHARD_FACTOR));
Index: libcfa/src/concurrency/thread.cfa
===================================================================
--- libcfa/src/concurrency/thread.cfa	(revision f9b68d6fb9c867b6b46f5ddf1f0999759d9d443b)
+++ libcfa/src/concurrency/thread.cfa	(revision 478c6103a511169384196eb6ac4bf8b72c9d50a9)
@@ -34,4 +34,5 @@
 	preempted = __NO_PREEMPTION;
 	corctx_flag = false;
+	last_cpu = __kernel_getcpu();
 	curr_cor = &self_cor;
 	self_mon.owner = &this;
