Index: src/libcfa/concurrency/monitor.c
===================================================================
--- src/libcfa/concurrency/monitor.c	(revision 5ea06d660ab6356382606a997c07e3b85c308c4d)
+++ src/libcfa/concurrency/monitor.c	(revision e464759b49c8d2ebccb89821c40321561033cefd)
@@ -33,11 +33,12 @@
 		thread_desc * thrd = this_thread();
 
-		//Update the stack owner
-		this->stack_owner = leader;
+		// //Update the stack owner
+		// this->stack_owner = leader;
+
+		LIB_DEBUG_PRINT_SAFE("Entering %p (o: %p, r: %i)\n", this, this->owner, this->recursion);
 
 		if( !this->owner ) {
 			//No one has the monitor, just take it
-			this->owner = thrd;
-			this->recursion = 1;
+			set_owner( this, thrd );
 		}
 		else if( this->owner == thrd) {
@@ -77,6 +78,8 @@
 		lock( &this->lock );
 
+		LIB_DEBUG_PRINT_SAFE("Leaving %p (o: %p, r: %i)\n", this, this->owner, this->recursion);
+
 		thread_desc * thrd = this_thread();
-		assert( thrd == this->owner || this->stack_owner );
+		assertf( thrd == this->owner, "Expected owner to be %p, got %p (r: %i)", this->owner, thrd, this->recursion );
 
 		//Leaving a recursion level, decrement the counter
@@ -86,15 +89,15 @@
 		//it means we don't need to do anything
 		if( this->recursion != 0) {
-			this->stack_owner = leader;
+			// this->stack_owner = leader;
 			unlock( &this->lock );
 			return;
 		}
 			
-		//If we don't own the signal stack then just leave it to the owner
-		if( this->stack_owner ) {
-			this->stack_owner = leader;
-			unlock( &this->lock );
-			return;
-		}
+		// //If we don't own the signal stack then just leave it to the owner
+		// if( this->stack_owner ) {
+		// 	this->stack_owner = leader;
+		// 	unlock( &this->lock );
+		// 	return;
+		// }
 
 		//We are the stack owner and have left the last recursion level.
@@ -108,5 +111,5 @@
 			//transfer control immediately
 			set_owner( this, new_owner );
-			this->stack_owner = leader;
+			// this->stack_owner = leader;
 			ScheduleInternal( &this->lock, new_owner );
 			return;
@@ -118,6 +121,6 @@
 		set_owner( this, new_owner );
 
-		//Update the stack owner
-		this->stack_owner = leader;
+		// //Update the stack owner
+		// this->stack_owner = leader;
 
 		//We can now let other threads in safely
@@ -138,5 +141,5 @@
 static inline void leave(monitor_desc ** monitors, int count) {
 	__leave_monitor_desc( monitors[0], NULL );
-	for(int i = count - 1; i >= 0; i--) {
+	for(int i = count - 1; i >= 1; i--) {
 		__leave_monitor_desc( monitors[i], monitors[0] );
 	}
@@ -166,4 +169,5 @@
 // Internal scheduling
 void wait( condition * this ) {
+	assertf(false, "NO SUPPORTED");
 	// LIB_DEBUG_FPRINTF("Waiting\n");
 	thread_desc * this_thrd = this_thread();
@@ -236,4 +240,5 @@
 
 static void __signal_internal( condition * this ) {
+	assertf(false, "NO SUPPORTED");
 	if( !this->blocked.head ) return;
 
