Index: src/benchmark/CorCtxSwitch.c
===================================================================
--- src/benchmark/CorCtxSwitch.c	(revision ed8a0d2378d457af8e5826c9d961a9d400fcc6c1)
+++ src/benchmark/CorCtxSwitch.c	(revision 9042795845e8a316c8348ae92925af2f17ce1492)
@@ -23,9 +23,5 @@
 } // Time
 
-struct GreatSuspender {
-	coroutine_desc __cor;
-};
-
-DECL_COROUTINE(GreatSuspender);
+coroutine GreatSuspender {};
 
 void ?{}( GreatSuspender * this ) {
Index: src/benchmark/bench.c
===================================================================
--- src/benchmark/bench.c	(revision ed8a0d2378d457af8e5826c9d961a9d400fcc6c1)
+++ src/benchmark/bench.c	(revision 9042795845e8a316c8348ae92925af2f17ce1492)
@@ -86,6 +86,5 @@
 //=======================================
 
-struct CoroutineDummy { coroutine_desc __cor; };
-DECL_COROUTINE(CoroutineDummy);
+coroutine CoroutineDummy {};
 void main(CoroutineDummy * this) {}
 
@@ -117,10 +116,7 @@
 }
 
-struct CoroutineResume {
+coroutine CoroutineResume {
     int N;
-    coroutine_desc __cor;
 };
-
-DECL_COROUTINE(CoroutineResume);
 
 void ?{}(CoroutineResume* this, int N) {
@@ -150,6 +146,5 @@
 //=======================================
 
-struct ThreadDummy { thread_desc __thrd; };
-DECL_THREAD(ThreadDummy);
+thread ThreadDummy {};
 void main(ThreadDummy * this) {}
 
@@ -177,11 +172,8 @@
 }
 
-struct ContextSwitch {
+thread ContextSwitch {
     int N;
     long long result;
-    thread_desc __thrd;
 };
-
-DECL_THREAD(ContextSwitch);
 
 void main(ContextSwitch * this) {    
@@ -241,5 +233,5 @@
 	DynamicTaskCreateDelete( NoOfTimes );
 	{
-		scoped(ContextSwitch) dummy = { (int)NoOfTimes };		// context switch
+		ContextSwitch dummy = { (int)NoOfTimes };		// context switch
 	}
 	sout | "\t" | endl;
Index: src/benchmark/csv-data.c
===================================================================
--- src/benchmark/csv-data.c	(revision ed8a0d2378d457af8e5826c9d961a9d400fcc6c1)
+++ src/benchmark/csv-data.c	(revision 9042795845e8a316c8348ae92925af2f17ce1492)
@@ -25,9 +25,5 @@
 } // Time
 
-struct GreatSuspender {
-	coroutine_desc __cor;
-};
-
-DECL_COROUTINE(GreatSuspender);
+coroutine GreatSuspender {};
 
 void ?{}( GreatSuspender * this ) {
Index: src/libcfa/concurrency/monitor.c
===================================================================
--- src/libcfa/concurrency/monitor.c	(revision ed8a0d2378d457af8e5826c9d961a9d400fcc6c1)
+++ src/libcfa/concurrency/monitor.c	(revision 9042795845e8a316c8348ae92925af2f17ce1492)
@@ -17,4 +17,6 @@
 #include "monitor"
 
+#include <stdlib>
+
 #include "kernel_private.h"
 #include "libhdr.h"
@@ -130,4 +132,9 @@
 	this_thread()->current_monitors      = this->prev_mntrs;
 	this_thread()->current_monitor_count = this->prev_count;
+}
+
+void debug_break() __attribute__(( noinline ))
+{
+	
 }
 
@@ -171,11 +178,18 @@
 
 	//Find the next thread(s) to run
-	unsigned short thread_count = count;
+	unsigned short thread_count = 0;
 	thread_desc * threads[ count ];
+	for(int i = 0; i < count; i++) {
+		threads[i] = 0;
+	}
+
+	debug_break();
 
 	for( int i = 0; i < count; i++) {
 		thread_desc * new_owner = next_thread( this->monitors[i] );
-		thread_count = insert_unique( threads, i, new_owner );
-	}
+		thread_count = insert_unique( threads, thread_count, new_owner );
+	}
+
+	debug_break();
 
 	LIB_DEBUG_PRINT_SAFE("Will unblock: ");
@@ -339,11 +353,17 @@
 		LIB_DEBUG_PRINT_SAFE("Branding\n");
 		assertf( thrd->current_monitors != NULL, "No current monitor to brand condition", thrd->current_monitors );
-		this->monitors = thrd->current_monitors;
 		this->monitor_count = thrd->current_monitor_count;
+
+		this->monitors = malloc( this->monitor_count * sizeof( *this->monitors ) );
+		for( int i = 0; i < this->monitor_count; i++ ) {
+			this->monitors[i] = thrd->current_monitors[i];
+		}
 	}
 }
 
 static inline unsigned short insert_unique( thread_desc ** thrds, unsigned short end, thread_desc * val ) {
-	for(int i = 0; i < end; i++) {
+	if( !val ) return end;
+
+	for(int i = 0; i <= end; i++) {
 		if( thrds[i] == val ) return end;
 	}
Index: src/tests/.expect/concurrent/sched-int-multi.txt
===================================================================
--- src/tests/.expect/concurrent/sched-int-multi.txt	(revision ed8a0d2378d457af8e5826c9d961a9d400fcc6c1)
+++ src/tests/.expect/concurrent/sched-int-multi.txt	(revision 9042795845e8a316c8348ae92925af2f17ce1492)
@@ -1,7 +1,100 @@
-Waiting All
-Entering A
-Entering A & B
-Signal
-Leaving  A & B
-Leaving  A
-Done waiting
+1000
+2000
+3000
+4000
+5000
+6000
+7000
+8000
+9000
+10000
+11000
+12000
+13000
+14000
+15000
+16000
+17000
+18000
+19000
+20000
+21000
+22000
+23000
+24000
+25000
+26000
+27000
+28000
+29000
+30000
+31000
+32000
+33000
+34000
+35000
+36000
+37000
+38000
+39000
+40000
+41000
+42000
+43000
+44000
+45000
+46000
+47000
+48000
+49000
+50000
+51000
+52000
+53000
+54000
+55000
+56000
+57000
+58000
+59000
+60000
+61000
+62000
+63000
+64000
+65000
+66000
+67000
+68000
+69000
+70000
+71000
+72000
+73000
+74000
+75000
+76000
+77000
+78000
+79000
+80000
+81000
+82000
+83000
+84000
+85000
+86000
+87000
+88000
+89000
+90000
+91000
+92000
+93000
+94000
+95000
+96000
+97000
+98000
+99000
+100000
Index: src/tests/sched-int-multi.c
===================================================================
--- src/tests/sched-int-multi.c	(revision ed8a0d2378d457af8e5826c9d961a9d400fcc6c1)
+++ src/tests/sched-int-multi.c	(revision 9042795845e8a316c8348ae92925af2f17ce1492)
@@ -4,50 +4,85 @@
 #include <thread>
 
+enum state_t { WAIT, SIGNAL, BARGE };
+
 monitor global_t {};
 
+monitor global_data_t {
+	bool done;
+	int counter;
+	state_t state;
+};
+
+void ?{} ( global_data_t * this ) {
+	this->done = false;
+	this->counter = 0;
+	this->state = BARGE;
+}
+
+void ^?{} ( global_data_t * this ) {}
+
+global_t globalA;
 global_t globalB;
-global_t globalA;
+global_data_t globalC;
 
 condition cond;
 
-thread Signalee {};
-thread Signaler {};
+thread Threads {};
 
-void signalee_action( global_t * mutex a, global_t * mutex b ) {
-	sout | "Waiting All" | endl;
-	wait( &cond );
-	sout | "Done waiting" | endl;
+bool logicC( global_t * mutex a, global_t * mutex b, global_data_t * mutex c ) {
+	c->counter++;
+
+	int action = c->counter % 10;
+
+	if( action == 1 || action == 3 ) {
+		if(c->state != BARGE) {
+			sout | "ERROR Mutual exclusion is inconsistent for wait" | endl;
+			abort();
+		}
+
+		c->state = WAIT;
+		wait( &cond );
+
+		if(c->state != SIGNAL) {
+			sout | "ERROR Barging detected" | endl;
+			abort();
+		}
+	}
+	else if( action == 6 ) {
+		if(c->state != BARGE) {
+			sout | "ERROR Mutual exclusion is inconsistent for signal" | endl;
+			abort();
+		}
+
+		c->state = SIGNAL;
+
+		signal( &cond );
+		signal( &cond );
+	}
+	else {
+		c->state = BARGE;
+	}
+
+	if( (c->counter % 1000) == 0 ) sout | c->counter | endl;
+	if( c->counter == 100_000 ) c->done = true;
+	return !c->done;
 }
 
-void main( Signalee* this ) {
-	signalee_action( &globalA, &globalB );
+bool logicB( global_t * mutex a, global_t * mutex b ) {
+	return logicC(a, b, &globalC);
 }
 
-void signaler_action_inner( global_t * mutex a, global_t * mutex b ) {
-	sout | "Entering A & B" | endl;
-	sout | "Signal" | endl;
-	signal( &cond );
-	sout | "Leaving  A & B" | endl;
+bool logicA( global_t * mutex a ) {
+	return logicB(a, &globalB);
 }
 
-void signaler_action( global_t * mutex a, global_t * b ) {
-	sout | "Entering A" | endl;
-	signaler_action_inner( a, b );
-	sout | "Leaving  A" | endl;
-}
-
-void main( Signaler* this ) {
-	for(int i = 0; i < 10_000; i++) {
-		asm volatile ("" : : : "memory");
-	}
-
-	signaler_action( &globalA, &globalB );
+void main( Threads* this ) {
+	while( logicA(&globalA) ) { yield(); };
 }
 
 int main(int argc, char* argv[]) {
-	processor p;
+	processor p[3];
 	{
-		Signalee a;
-		Signaler b;
+		Threads t[20];
 	}
 }
