Index: src/libcfa/concurrency/coroutine.c
===================================================================
--- src/libcfa/concurrency/coroutine.c	(revision 6ff4507486f9107e3974f91b56013917560dfa9d)
+++ src/libcfa/concurrency/coroutine.c	(revision a84306790d15c8aad8810aca4dca6b6598a82744)
@@ -123,6 +123,4 @@
 	if(pageSize == 0ul) pageSize = sysconf( _SC_PAGESIZE );
 
-	LIB_DEBUG_PRINT_SAFE("FRED");
-
 	size_t cxtSize = libCeiling( sizeof(machine_context_t), 8 ); // minimum alignment
 
Index: src/libcfa/concurrency/monitor.c
===================================================================
--- src/libcfa/concurrency/monitor.c	(revision 6ff4507486f9107e3974f91b56013917560dfa9d)
+++ src/libcfa/concurrency/monitor.c	(revision a84306790d15c8aad8810aca4dca6b6598a82744)
@@ -84,7 +84,5 @@
 extern "C" {
 	// Enter single monitor
-	static void __enter_monitor_desc( const __monitor_group_t & group ) {
-		monitor_desc * this = group.list[0];
-
+	static void __enter_monitor_desc( monitor_desc * this, const __monitor_group_t & group ) {
 		// Lock the monitor spinlock, lock_yield to reduce contention
 		lock_yield( &this->lock DEBUG_CTX2 );
@@ -137,5 +135,7 @@
 		lock_yield( &this->lock DEBUG_CTX2 );
 
-		verifyf( this_thread == this->owner, "Expected owner to be %p, got %p (r: %i)", this_thread, this->owner, this->recursion );
+		LIB_DEBUG_PRINT_SAFE("Kernel : %10p Leaving mon %p (%p)\n", this_thread, this, this->owner);
+
+		verifyf( this_thread == this->owner, "Expected owner to be %p, got %p (r: %i, m: %p)", this_thread, this->owner, this->recursion, this );
 
 		// Leaving a recursion level, decrement the counter
@@ -172,5 +172,5 @@
 		thrd->self_cor.state = Halted;
 
-		verifyf( thrd == this->owner, "Expected owner to be %p, got %p (r: %i)", thrd, this->owner, this->recursion );
+		verifyf( thrd == this->owner, "Expected owner to be %p, got %p (r: %i, m: %p)", thrd, this->owner, this->recursion, this );
 
 		// Leaving a recursion level, decrement the counter
@@ -197,5 +197,5 @@
 static inline void enter( __monitor_group_t monitors ) {
 	for(int i = 0; i < monitors.size; i++) {
-		__enter_monitor_desc( monitors );
+		__enter_monitor_desc( monitors.list[i], monitors );
 	}
 }
@@ -229,7 +229,11 @@
 	this_thread->monitors.func = func;
 
+	LIB_DEBUG_PRINT_SAFE("MGUARD : enter %d\n", count);
+
 	// Enter the monitors in order
 	__monitor_group_t group = {this.m, this.count, func};
 	enter( group );
+
+	LIB_DEBUG_PRINT_SAFE("MGUARD : entered\n");
 }
 
@@ -237,6 +241,10 @@
 // Dtor for monitor guard
 void ^?{}( monitor_guard_t & this ) {
+	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");
 
 	// Restore thread context
@@ -299,4 +307,7 @@
 	}
 
+	// Save monitor states
+	monitor_save;
+
 	// Remove any duplicate threads
 	for( int i = 0; i < count; i++) {
@@ -305,5 +316,9 @@
 	}
 
-	blockAndWake( threads, thread_count );
+	// Everything is ready to go to sleep
+	BlockInternal( locks, count, threads, thread_count );
+
+	// We are back, restore the owners and recursions
+	monitor_restore;
 }
 
@@ -458,4 +473,6 @@
 
 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 );
+
 	//Pass the monitor appropriately
 	this->owner = owner;
@@ -502,5 +519,5 @@
 
 	// Check if there are any acceptable functions
-	if( !it ) return -1;
+	if( !it ) return false;
 
 	// If this isn't the first monitor to test this, there is no reason to repeat the test.
