Index: src/libcfa/concurrency/monitor.c
===================================================================
--- src/libcfa/concurrency/monitor.c	(revision a2d4d1c02d4227d2418326811c264dc1355f54d8)
+++ src/libcfa/concurrency/monitor.c	(revision 19c43b7eb5e375d3769f89869c10265cdd9ef030)
@@ -72,9 +72,4 @@
 #define monitor_restore restore( monitors, count, locks, recursions, masks )
 
-#define blockAndWake( thrd, cnt )                               /* Create the necessary information to use the signaller stack                         */ \
-	monitor_save;                                             /* Save monitor states                                                                 */ \
-	BlockInternal( locks, count, thrd, cnt );                 /* Everything is ready to go to sleep                                                  */ \
-	monitor_restore;                                          /* We are back, restore the owners and recursions                                      */ \
-
 
 //-----------------------------------------------------------------------------
@@ -229,5 +224,5 @@
 	this_thread->monitors.func = func;
 
-	LIB_DEBUG_PRINT_SAFE("MGUARD : enter %d\n", count);
+	// LIB_DEBUG_PRINT_SAFE("MGUARD : enter %d\n", count);
 
 	// Enter the monitors in order
@@ -235,5 +230,5 @@
 	enter( group );
 
-	LIB_DEBUG_PRINT_SAFE("MGUARD : entered\n");
+	// LIB_DEBUG_PRINT_SAFE("MGUARD : entered\n");
 }
 
@@ -241,10 +236,10 @@
 // Dtor for monitor guard
 void ^?{}( monitor_guard_t & this ) {
-	LIB_DEBUG_PRINT_SAFE("MGUARD : leaving %d\n", this.count);
+	// LIB_DEBUG_PRINT_SAFE("MGUARD : leaving %d\n", this.count);
 
 	// Leave the monitors in order
 	leave( this.m, this.count );
 
-	LIB_DEBUG_PRINT_SAFE("MGUARD : left\n");
+	// LIB_DEBUG_PRINT_SAFE("MGUARD : left\n");
 
 	// Restore thread context
@@ -425,4 +420,6 @@
 // 		block
 void __waitfor_internal( const __waitfor_mask_t & mask, int duration ) {
+	LIB_DEBUG_PRINT_SAFE("Kernel : waitfor internal \n");
+
 	// This statment doesn't have a contiguous list of monitors...
 	// Create one!
@@ -431,5 +428,10 @@
 	short actual_count = aggregate( mon_storage, mask );
 
-	if(actual_count == 0) return;
+	if(actual_count == 0) {
+		LIB_DEBUG_PRINT_SAFE("Kernel :  nothing to wait for \n");
+		return;
+	}
+
+	LIB_DEBUG_PRINT_SAFE("Kernel : waitfor internal proceeding\n");
 
 	// Create storage for monitor context
@@ -445,12 +447,32 @@
 
 		if( next ) {
+			*mask.accepted = index;
 			if( mask.clauses[index].is_dtor ) {
 				#warning case not implemented
 			}
 			else {
-				blockAndWake( &next, 1 );
+				LIB_DEBUG_PRINT_SAFE("Kernel : thread present, baton-passing\n");
+
+				// Create the node specific to this wait operation
+				wait_ctx_primed( this_thread, 0 );
+
+				// Save monitor states
+				monitor_save;
+
+				// Set the owners to be the next thread
+				set_owner( monitors, count, next );
+
+				// Everything is ready to go to sleep
+				BlockInternal( locks, count, &next, 1 );
+
+				// We are back, restore the owners and recursions
+				monitor_restore;
+
+				LIB_DEBUG_PRINT_SAFE("Kernel : thread present, returned\n");
 			}
 
-			return index;
+			LIB_DEBUG_PRINT_SAFE("Kernel : accepted %d\n", *mask.accepted);
+
+			return;
 		}
 	}
@@ -458,5 +480,9 @@
 
 	if( duration == 0 ) {
+		LIB_DEBUG_PRINT_SAFE("Kernel : non-blocking, exiting\n");
+
 		unlock_all( locks, count );
+
+		LIB_DEBUG_PRINT_SAFE("Kernel : accepted %d\n", *mask.accepted);
 		return;
 	}
@@ -465,11 +491,25 @@
 	verifyf( duration < 0, "Timeout on waitfor statments not supported yet.");
 
+	LIB_DEBUG_PRINT_SAFE("Kernel : blocking waitfor\n");
+
+	// Create the node specific to this wait operation
+	wait_ctx_primed( this_thread, 0 );
 
 	monitor_save;
 	set_mask( monitors, count, mask );
 
-	BlockInternal( locks, count );       // Everything is ready to go to sleep
-	//WE WOKE UP
-	monitor_restore;                     //We are back, restore the masks and recursions
+	//Everything is ready to go to sleep
+	BlockInternal( locks, count );
+
+
+	// WE WOKE UP
+
+
+	//We are back, restore the masks and recursions
+	monitor_restore;
+
+	LIB_DEBUG_PRINT_SAFE("Kernel : exiting\n");
+
+	LIB_DEBUG_PRINT_SAFE("Kernel : accepted %d\n", *mask.accepted);
 }
 
@@ -478,5 +518,5 @@
 
 static inline void set_owner( monitor_desc * this, thread_desc * owner ) {
-	LIB_DEBUG_PRINT_SAFE("Kernal :   Setting owner of %p to %p ( was %p)\n", this, owner, this->owner );
+	// LIB_DEBUG_PRINT_SAFE("Kernal :   Setting owner of %p to %p ( was %p)\n", this, owner, this->owner );
 
 	//Pass the monitor appropriately
@@ -559,15 +599,25 @@
 
 static inline void lock_all( spinlock ** locks, unsigned short count ) {
+	LIB_DEBUG_ACQUIRE();
+	LIB_DEBUG_PRINT_NOLOCK("Kernel :   Locking");
 	for( int i = 0; i < count; i++ ) {
+		LIB_DEBUG_PRINT_NOLOCK(" %p", locks[i]);
 		lock_yield( locks[i] DEBUG_CTX2 );
 	}
+	LIB_DEBUG_PRINT_NOLOCK("\n");
+	LIB_DEBUG_RELEASE();
 }
 
 static inline void lock_all( monitor_desc ** source, spinlock ** /*out*/ locks, unsigned short count ) {
+	LIB_DEBUG_ACQUIRE();
+	LIB_DEBUG_PRINT_NOLOCK("Kernel :   Locking");
 	for( int i = 0; i < count; i++ ) {
 		spinlock * l = &source[i]->lock;
+		LIB_DEBUG_PRINT_NOLOCK(" %p", l);
 		lock_yield( l DEBUG_CTX2 );
 		if(locks) locks[i] = l;
 	}
+	LIB_DEBUG_PRINT_NOLOCK("\n");
+	LIB_DEBUG_RELEASE();
 }
 
Index: src/tests/.expect/concurrent/sched-ext-statment.txt
===================================================================
--- src/tests/.expect/concurrent/sched-ext-statment.txt	(revision 19c43b7eb5e375d3769f89869c10265cdd9ef030)
+++ src/tests/.expect/concurrent/sched-ext-statment.txt	(revision 19c43b7eb5e375d3769f89869c10265cdd9ef030)
@@ -0,0 +1,702 @@
+Starting
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Statement
+Stopping
Index: src/tests/sched-ext-statment.c
===================================================================
--- src/tests/sched-ext-statment.c	(revision 19c43b7eb5e375d3769f89869c10265cdd9ef030)
+++ src/tests/sched-ext-statment.c	(revision 19c43b7eb5e375d3769f89869c10265cdd9ef030)
@@ -0,0 +1,136 @@
+#include <fstream>
+#include <kernel>
+#include <monitor>
+#include <thread>
+
+#include <stdbool.h>
+
+monitor M {
+	int index;
+	int last_val;
+	int calls[7];
+};
+
+volatile bool start = false;
+
+void ?{}( M & this ) {
+	this.index = 0;
+	this.last_val = 0;
+	for( int i = 0; i < 7; i++ ) {
+		this.calls[i] = 100; //10_000;
+	}
+}
+
+void ^?{} ( M &  mutex this ) {}
+
+int get_index( M & mutex this ) {
+	this.index += 1;
+	return this.index;
+}
+
+bool call1( M & mutex this ) {
+	this.last_val = 1;
+	this.calls[0] -= 1;
+	return this.calls[0] > 0;
+}
+
+bool call2( M & mutex this ) {
+	this.last_val = 2;
+	this.calls[1] -= 1;
+	return this.calls[1] > 0;
+}
+
+bool call3( M & mutex this ) {
+	this.last_val = 3;
+	this.calls[2] -= 1;
+	return this.calls[2] > 0;
+}
+
+bool call4( M & mutex this ) {
+	this.last_val = 4;
+	this.calls[3] -= 1;
+	return this.calls[3] > 0;
+}
+
+bool call5( M & mutex this ) {
+	this.last_val = 5;
+	this.calls[4] -= 1;
+	return this.calls[4] > 0;
+}
+
+bool call6( M & mutex this ) {
+	this.last_val = 6;
+	this.calls[5] -= 1;
+	return this.calls[5] > 0;
+}
+
+bool call7( M & mutex this ) {
+	this.last_val = 7;
+	this.calls[6] -= 1;
+	return this.calls[6] > 0;
+}
+
+M m;
+thread caller{};
+
+bool call( int index ) {
+	switch( index ) {
+		case 1: return call1( m );
+		case 2: return call2( m );
+		case 3: return call3( m );
+		case 4: return call4( m );
+		case 5: return call5( m );
+		case 6: return call6( m );
+		case 7: return call7( m );
+		default :
+			serr | "Incorrect index" | index | endl;
+			abort();
+	}
+}
+
+void main( caller & this ) {
+	int index = get_index( m );
+	while( !start ) yield();
+	while( call( index ) );
+}
+
+void do_wait( M & mutex this ) {
+	bool done = false;
+
+	start = true;
+
+	while( !done ) {
+		   waitfor( get_index, this );
+		or waitfor( call1, this ) { sout | "Statement" | endl; if( this.last_val != 1 ) { serr | "Incorrect index: expected" | 1 | "got" | this.last_val | endl; } }
+		or waitfor( call2, this ) { sout | "Statement" | endl; if( this.last_val != 2 ) { serr | "Incorrect index: expected" | 2 | "got" | this.last_val | endl; } }
+		or waitfor( call3, this ) { sout | "Statement" | endl; if( this.last_val != 3 ) { serr | "Incorrect index: expected" | 3 | "got" | this.last_val | endl; } }
+		or waitfor( call4, this ) { sout | "Statement" | endl; if( this.last_val != 4 ) { serr | "Incorrect index: expected" | 4 | "got" | this.last_val | endl; } }
+		or waitfor( call5, this ) { sout | "Statement" | endl; if( this.last_val != 5 ) { serr | "Incorrect index: expected" | 5 | "got" | this.last_val | endl; } }
+		or waitfor( call6, this ) { sout | "Statement" | endl; if( this.last_val != 6 ) { serr | "Incorrect index: expected" | 6 | "got" | this.last_val | endl; } }
+		or waitfor( call7, this ) { sout | "Statement" | endl; if( this.last_val != 7 ) { serr | "Incorrect index: expected" | 7 | "got" | this.last_val | endl; } }
+
+		done = true;
+		for( int i = 0; i < 7; i++ ) {
+			if( this.calls[i] > 0 ) {
+				done = false;
+				break;
+			}
+		}
+	}
+}
+
+thread waiter{};
+
+void main( waiter & this ) {
+	do_wait( m );
+}
+
+int main() {
+	processor p[2];
+	sout | "Starting" | endl;
+	{
+		caller c[7];
+		waiter w;
+	}
+	sout | "Stopping" | endl;
+}
