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;
+}
