Index: src/libcfa/concurrency/monitor
===================================================================
--- src/libcfa/concurrency/monitor	(revision 6ae8c9224918ef2c006d4c8bf50aea46e0c7a205)
+++ src/libcfa/concurrency/monitor	(revision aaa4f93bb24090911402658ab4712faeadc90a06)
@@ -105,5 +105,5 @@
 
 struct __acceptable_t {
-	__monitor_group_t monitors;
+	__monitor_group_t;
 	bool is_dtor;
 };
Index: src/libcfa/concurrency/monitor.c
===================================================================
--- src/libcfa/concurrency/monitor.c	(revision 6ae8c9224918ef2c006d4c8bf50aea46e0c7a205)
+++ src/libcfa/concurrency/monitor.c	(revision aaa4f93bb24090911402658ab4712faeadc90a06)
@@ -280,9 +280,4 @@
 	lock_all( monitors, locks, count );
 
-	// DON'T unlock, ask the kernel to do it
-
-	// Save monitor state
-	save_recursion( monitors, recursions, count );
-
 	// Find the next thread(s) to run
 	unsigned short thread_count = 0;
@@ -297,4 +292,7 @@
 		thread_count = insert_unique( threads, thread_count, new_owner );
 	}
+
+	// Save monitor state
+	save_recursion( monitors, recursions, count );
 
 	// Everything is ready to go to sleep
@@ -634,5 +632,5 @@
 	// For all acceptable functions check if this is the current function.
 	for( short i = 0; i < count; i++, it++ ) {
-		if( it->monitors == group ) {
+		if( *it == group ) {
 			*this->mask.accepted = i;
 			return true;
@@ -658,5 +656,5 @@
 		for( __acceptable_t * it = mask.clauses; it != end; it++, i++ ) {
 			// Check if we have a match
-			if( it->monitors == (*thrd_it)->monitors ) {
+			if( *it == (*thrd_it)->monitors ) {
 
 				// If we have a match return it
@@ -673,5 +671,5 @@
 	short max = 0;
 	for( int i = 0; i < mask.size; i++ ) {
-		max += mask.clauses[i].monitors.size;
+		max += mask.clauses[i].size;
 	}
 	return max;
