Index: src/libcfa/concurrency/monitor
===================================================================
--- src/libcfa/concurrency/monitor	(revision cc7f4b1e1f5f47761e1092680bb42e28d29e1724)
+++ src/libcfa/concurrency/monitor	(revision 2781e65c359cf1977f2538da573898134135ea2b)
@@ -20,4 +20,5 @@
 #include "assert"
 #include "invoke.h"
+#include "stdlib"
 
 struct __monitor_t {
@@ -33,19 +34,38 @@
 }
 
+//Basic entering routine
 void enter(__monitor_t *);
 void leave(__monitor_t *);
 
+//Array entering routine
+void enter(__monitor_t **, int count);
+void leave(__monitor_t **, int count);
+
 struct monitor_guard_t {
-	__monitor_t * m;
+	__monitor_t ** m;
+	int count;
 };
 
-static inline void ?{}( monitor_guard_t * this, __monitor_t * m ) {
+static inline int ?<?(__monitor_t* lhs, __monitor_t* rhs) {
+	return ((intptr_t)lhs) < ((intptr_t)rhs);
+}
+
+static inline void ?{}( monitor_guard_t * this, __monitor_t ** m ) {
 	this->m = m;
-	enter( this->m );
+	this->count = 1;
+	enter( *this->m );
+}
+
+static inline void ?{}( monitor_guard_t * this, __monitor_t ** m, int count ) {
+	this->m = m;
+	this->count = count;
+	qsort(this->m, count);
+	enter( this->m, this->count );
 }
 
 static inline void ^?{}( monitor_guard_t * this ) {
-	leave( this->m );
+	leave( this->m, this->count );
 }
 
+
 #endif //MONITOR_H
Index: src/libcfa/concurrency/monitor.c
===================================================================
--- src/libcfa/concurrency/monitor.c	(revision cc7f4b1e1f5f47761e1092680bb42e28d29e1724)
+++ src/libcfa/concurrency/monitor.c	(revision 2781e65c359cf1977f2538da573898134135ea2b)
@@ -71,2 +71,16 @@
 	}
 }
+
+void enter(__monitor_t ** monitors, int count) {
+	for(int i = 0; i < count; i++) {
+		// printf("%d\n", i);
+		enter( monitors[i] );
+	}
+}
+
+void leave(__monitor_t ** monitors, int count) {
+	for(int i = count - 1; i >= 0; i--) {
+		// printf("%d\n", i);
+		leave( monitors[i] );
+	}
+}
Index: src/tests/.expect/multi-monitor.txt
===================================================================
--- src/tests/.expect/multi-monitor.txt	(revision 2781e65c359cf1977f2538da573898134135ea2b)
+++ src/tests/.expect/multi-monitor.txt	(revision 2781e65c359cf1977f2538da573898134135ea2b)
@@ -0,0 +1,1 @@
+2000000 2000000 2000000
Index: src/tests/monitor.c
===================================================================
--- src/tests/monitor.c	(revision cc7f4b1e1f5f47761e1092680bb42e28d29e1724)
+++ src/tests/monitor.c	(revision 2781e65c359cf1977f2538da573898134135ea2b)
@@ -16,9 +16,10 @@
 
 void increment( /*mutex*/ global_t * this ) {
-	monitor_guard_t g1 = { &this->m };
+	__monitor_t * mon = &this->m;
+	monitor_guard_t g1 = { &mon };
 	{
-		monitor_guard_t g2 = { &this->m };
+		monitor_guard_t g2 = { &mon };
 		{
-			monitor_guard_t g3 = { &this->m };
+			monitor_guard_t g3 = { &mon };
 			this->value += 1;
 		}
Index: src/tests/multi-monitor.c
===================================================================
--- src/tests/multi-monitor.c	(revision 2781e65c359cf1977f2538da573898134135ea2b)
+++ src/tests/multi-monitor.c	(revision 2781e65c359cf1977f2538da573898134135ea2b)
@@ -0,0 +1,50 @@
+#include <fstream>
+#include <kernel>
+#include <monitor>
+#include <threads>
+
+static int global12, global23, global13;
+
+static __monitor_t m1, m2, m3;
+
+void increment( /*mutex*/ __monitor_t * p1, /*mutex*/ __monitor_t * p2, int * value ) {
+	__monitor_t * mons[] = { p1, p2 };
+	monitor_guard_t g = { mons, 2 };
+	*value += 1;
+}
+
+struct MyThread { 
+	thread t; 
+	int target;
+};
+
+DECL_THREAD(MyThread);
+
+void ?{}( MyThread * this, int target ) {
+	this->target = target;
+}
+
+void main( MyThread* this ) {
+	for(int i = 0; i < 1000000; i++) {
+		choose(this->target) {
+			case 0: increment( &m1, &m2, &global12 );
+			case 1: increment( &m2, &m3, &global23 );
+			case 2: increment( &m1, &m3, &global13 );
+		}
+	}
+}
+
+int main(int argc, char* argv[]) {
+	processor p;
+	{
+		scoped(MyThread) * f[6];
+		for(int i = 0; i < 6; i++) {
+			f[i] = ((scoped(MyThread) *)malloc()){ i % 3 };
+		}
+
+		for(int i = 0; i < 6; i++) {
+			delete( f[i] );
+		}
+	}
+	sout | global12 | global23 | global13 | endl;
+}
