Index: src/libcfa/concurrency/kernel.c
===================================================================
--- src/libcfa/concurrency/kernel.c	(revision 66298de8857d6e02eacadf9bc08b192b8662493d)
+++ src/libcfa/concurrency/kernel.c	(revision 6a5be52db68460f917313bc7fb311cfb03b0f0c1)
@@ -548,12 +548,12 @@
 
 	int len = snprintf( abort_text, abort_text_size, "Error occurred while executing task %.256s (%p)", thrd->self_cor.name, thrd );
-	__lib_debug_write( STDERR_FILENO, abort_text, len );
+	__lib_debug_write( abort_text, len );
 
 	if ( thrd != this_coroutine ) {
 		len = snprintf( abort_text, abort_text_size, " in coroutine %.256s (%p).\n", this_coroutine->name, this_coroutine );
-		__lib_debug_write( STDERR_FILENO, abort_text, len );
+		__lib_debug_write( abort_text, len );
 	}
 	else {
-		__lib_debug_write( STDERR_FILENO, ".\n", 2 );
+		__lib_debug_write( ".\n", 2 );
 	}
 }
Index: src/libcfa/concurrency/monitor.c
===================================================================
--- src/libcfa/concurrency/monitor.c	(revision 66298de8857d6e02eacadf9bc08b192b8662493d)
+++ src/libcfa/concurrency/monitor.c	(revision 6a5be52db68460f917313bc7fb311cfb03b0f0c1)
@@ -95,5 +95,4 @@
 		else if( this->owner == thrd) {
 			// We already have the monitor, just note how many times we took it
-			verify( this->recursion > 0 );
 			this->recursion += 1;
 
@@ -207,4 +206,5 @@
 		// it means we don't need to do anything
 		if( this->recursion != 0) {
+			LIB_DEBUG_PRINT_SAFE("Kernel :  recursion still %d\n", this->recursion);
 			unlock( &this->lock );
 			return;
@@ -536,9 +536,9 @@
 	short actual_count = aggregate( mon_storage, mask );
 
-	LIB_DEBUG_PRINT_SAFE("Kernel : waitfor %d (s: %d, m: %d)\n", actual_count, mask.size, (short)max);
+	LIB_DEBUG_PRINT_BUFFER_DECL( "Kernel : waitfor %d (s: %d, m: %d)\n", actual_count, mask.size, (short)max);
 
 	if(actual_count == 0) return;
 
-	LIB_DEBUG_PRINT_SAFE("Kernel : waitfor internal proceeding\n");
+	LIB_DEBUG_PRINT_BUFFER_LOCAL( "Kernel : waitfor internal proceeding\n");
 
 	// Create storage for monitor context
@@ -556,5 +556,5 @@
 			*mask.accepted = index;
 			if( mask.clauses[index].is_dtor ) {
-				LIB_DEBUG_PRINT_SAFE("Kernel : dtor already there\n");
+				LIB_DEBUG_PRINT_BUFFER_LOCAL( "Kernel : dtor already there\n");
 				verifyf( mask.clauses[index].size == 1        , "ERROR: Accepted dtor has more than 1 mutex parameter." );
 
@@ -568,5 +568,5 @@
 			}
 			else {
-				LIB_DEBUG_PRINT_SAFE("Kernel : thread present, baton-passing\n");
+				LIB_DEBUG_PRINT_BUFFER_LOCAL( "Kernel : thread present, baton-passing\n");
 
 				// Create the node specific to this wait operation
@@ -576,4 +576,12 @@
 				monitor_save;
 
+				LIB_DEBUG_PRINT_BUFFER_LOCAL( "Kernel :  baton of %d monitors : ", count );
+				#ifdef __CFA_DEBUG_PRINT__
+					for( int i = 0; i < count; i++) {
+						LIB_DEBUG_PRINT_BUFFER_LOCAL( "%p %p ", monitors[i], monitors[i]->signal_stack.top );
+					}
+				#endif
+				LIB_DEBUG_PRINT_BUFFER_LOCAL( "\n");
+
 				// Set the owners to be the next thread
 				set_owner( monitors, count, next );
@@ -585,8 +593,8 @@
 				monitor_restore;
 
-				LIB_DEBUG_PRINT_SAFE("Kernel : thread present, returned\n");
+				LIB_DEBUG_PRINT_BUFFER_LOCAL( "Kernel : thread present, returned\n");
 			}
 
-			LIB_DEBUG_PRINT_SAFE("Kernel : accepted %d\n", *mask.accepted);
+			LIB_DEBUG_PRINT_BUFFER_LOCAL( "Kernel : accepted %d\n", *mask.accepted);
 
 			return;
@@ -596,9 +604,9 @@
 
 	if( duration == 0 ) {
-		LIB_DEBUG_PRINT_SAFE("Kernel : non-blocking, exiting\n");
+		LIB_DEBUG_PRINT_BUFFER_LOCAL( "Kernel : non-blocking, exiting\n");
 
 		unlock_all( locks, count );
 
-		LIB_DEBUG_PRINT_SAFE("Kernel : accepted %d\n", *mask.accepted);
+		LIB_DEBUG_PRINT_BUFFER_LOCAL( "Kernel : accepted %d\n", *mask.accepted);
 		return;
 	}
@@ -607,5 +615,5 @@
 	verifyf( duration < 0, "Timeout on waitfor statments not supported yet.");
 
-	LIB_DEBUG_PRINT_SAFE("Kernel : blocking waitfor\n");
+	LIB_DEBUG_PRINT_BUFFER_LOCAL( "Kernel : blocking waitfor\n");
 
 	// Create the node specific to this wait operation
@@ -629,7 +637,7 @@
 	monitor_restore;
 
-	LIB_DEBUG_PRINT_SAFE("Kernel : exiting\n");
-
-	LIB_DEBUG_PRINT_SAFE("Kernel : accepted %d\n", *mask.accepted);
+	LIB_DEBUG_PRINT_BUFFER_LOCAL( "Kernel : exiting\n");
+
+	LIB_DEBUG_PRINT_BUFFER_LOCAL( "Kernel : accepted %d\n", *mask.accepted);
 }
 
@@ -648,6 +656,9 @@
 
 static inline void set_owner( monitor_desc ** monitors, short count, thread_desc * owner ) {
-	for( int i = 0; i < count; i++ ) {
-		set_owner( monitors[i], owner );
+	monitors[0]->owner     = owner;
+	monitors[0]->recursion = 1;
+	for( int i = 1; i < count; i++ ) {
+		monitors[i]->owner     = owner;
+		monitors[i]->recursion = 0;
 	}
 }
@@ -667,4 +678,5 @@
 static inline thread_desc * next_thread( monitor_desc * this ) {
 	//Check the signaller stack
+	LIB_DEBUG_PRINT_SAFE("Kernel :  mon %p AS-stack top %p\n", this, this->signal_stack.top);
 	__condition_criterion_t * urgent = pop( &this->signal_stack );
 	if( urgent ) {
@@ -718,4 +730,5 @@
 	for(int i = 0; i < count; i++) {
 		(criteria[i]){ monitors[i], waiter };
+		LIB_DEBUG_PRINT_SAFE( "Kernel :  target %p = %p\n", criteria[i].target, &criteria[i] );
 		push( &criteria[i].target->signal_stack, &criteria[i] );
 	}
@@ -788,5 +801,5 @@
 	}
 
-	// LIB_DEBUG_PRINT_SAFE( "Runing %i\n", ready2run );
+	LIB_DEBUG_PRINT_SAFE( "Kernel :  Runing %i (%p)\n", ready2run, ready2run ? node->waiting_thread : NULL );
 	return ready2run ? node->waiting_thread : NULL;
 }
@@ -856,8 +869,10 @@
 	short size = 0;
 	for( int i = 0; i < mask.size; i++ ) {
+		qsort( mask.clauses[i].list, mask.clauses[i].size );
 		for( int j = 0; j < mask.clauses[i].size; j++) {
 			insert_unique( storage, size, mask.clauses[i].list[j] );
 		}
 	}
+	// TODO insertion sort instead of this
 	qsort( storage, size );
 	return size;
Index: src/libcfa/concurrency/preemption.c
===================================================================
--- src/libcfa/concurrency/preemption.c	(revision 66298de8857d6e02eacadf9bc08b192b8662493d)
+++ src/libcfa/concurrency/preemption.c	(revision 6a5be52db68460f917313bc7fb311cfb03b0f0c1)
@@ -380,5 +380,5 @@
 
 	if ( sigaction( sig, &act, NULL ) == -1 ) {
-		LIB_DEBUG_PRINT_BUFFER_DECL( STDERR_FILENO,
+		LIB_DEBUG_PRINT_BUFFER_DECL(
 			" __kernel_sigaction( sig:%d, handler:%p, flags:%d ), problem installing signal handler, error(%d) %s.\n",
 			sig, handler, flags, errno, strerror( errno )
@@ -397,5 +397,5 @@
 
 	if ( sigaction( sig, &act, NULL ) == -1 ) {
-		LIB_DEBUG_PRINT_BUFFER_DECL( STDERR_FILENO,
+		LIB_DEBUG_PRINT_BUFFER_DECL(
 			" __kernel_sigdefault( sig:%d ), problem reseting signal handler, error(%d) %s.\n",
 			sig, errno, strerror( errno )
