Index: src/Concurrency/Keywords.cc
===================================================================
--- src/Concurrency/Keywords.cc	(revision 1fbab5a0107bc631a52826378ed50c1187d6284c)
+++ src/Concurrency/Keywords.cc	(revision 37439835310395c5cb4dfacff44eb0b8453cc00e)
@@ -111,4 +111,5 @@
 	  private:
 	  	StructDecl* monitor_decl = nullptr;
+		StructDecl* guard_decl = nullptr;
 	};
 
@@ -137,5 +138,4 @@
 		if( ! body ) return;
 
-		assert(monitor_decl);
 		addStatments( body, mutexArgs );
 	}
@@ -146,4 +146,8 @@
 			monitor_decl = decl;
 		}
+		else if( decl->get_name() == "monitor_guard_t" ) {
+			assert( !guard_decl );
+			guard_decl = decl;
+		}
 	}
 
@@ -175,8 +179,10 @@
 
 		//Make sure that typed isn't mutex
-		if( ! base->get_qualifiers().isMutex ) throw SemanticError( "mutex keyword may only appear once per argument ", arg );
+		if( base->get_qualifiers().isMutex ) throw SemanticError( "mutex keyword may only appear once per argument ", arg );
 	}
 
 	void MutexKeyword::addStatments( CompoundStmt * body, const std::list<DeclarationWithType * > & args ) {
+		assert(monitor_decl);
+		assert(guard_decl);
 
 		ObjectDecl * monitors = new ObjectDecl(
@@ -218,5 +224,5 @@
 				new StructInstType(
 					noQualifiers,
-					"monitor_guard_t"
+					guard_decl
 				),
 				new ListInit(
@@ -224,10 +230,12 @@
 						new SingleInit( new VariableExpr( monitors ) ),
 						new SingleInit( new ConstantExpr( Constant::from_ulong( args.size() ) ) )
-					}
+					},
+					noDesignators,
+					true
 				)
 			))
 		);
 
-		//monitor_desc * __monitors[] = { a, b };
+		//monitor_desc * __monitors[] = { get_monitor(a), get_monitor(b) };
 		body->push_front( new DeclStmt( noLabels, monitors) );
 	}
Index: src/SynTree/Type.h
===================================================================
--- src/SynTree/Type.h	(revision 1fbab5a0107bc631a52826378ed50c1187d6284c)
+++ src/SynTree/Type.h	(revision 37439835310395c5cb4dfacff44eb0b8453cc00e)
@@ -92,9 +92,9 @@
 		bool operator<=( Qualifiers other ) const {
 			return isConst <= other.isConst && isVolatile <= other.isVolatile &&
-				isMutex == other.isMutex && isAtomic == other.isAtomic;
+				isMutex >= other.isMutex && isAtomic == other.isAtomic;
 		}
 	 	bool operator>=( Qualifiers other ) const {
 			return isConst >= other.isConst	&& isVolatile >= other.isVolatile &&
-				isMutex == other.isMutex && isAtomic == other.isAtomic;
+				isMutex <= other.isMutex && isAtomic == other.isAtomic;
 		}
 		bool operator<( Qualifiers other ) const {
Index: src/main.cc
===================================================================
--- src/main.cc	(revision 1fbab5a0107bc631a52826378ed50c1187d6284c)
+++ src/main.cc	(revision 37439835310395c5cb4dfacff44eb0b8453cc00e)
@@ -241,5 +241,5 @@
 		OPTPRINT( "fixNames" )
 		CodeGen::fixNames( translationUnit );
-		OPTPRINT( "tweakInit" )
+		OPTPRINT( "genInit" )
 		InitTweak::genInit( translationUnit );
 		OPTPRINT( "expandMemberTuples" );
Index: src/tests/monitor.c
===================================================================
--- src/tests/monitor.c	(revision 1fbab5a0107bc631a52826378ed50c1187d6284c)
+++ src/tests/monitor.c	(revision 37439835310395c5cb4dfacff44eb0b8453cc00e)
@@ -13,16 +13,20 @@
 }
 
+monitor_desc * get_monitor( global_t * this ) {
+	return &this->m;
+}
+
 static global_t global;
 
-void increment( /*mutex*/ global_t * this ) {
-	monitor_desc * mon = &this->m;
-	monitor_guard_t g1 = { &mon };
-	{
-		monitor_guard_t g2 = { &mon };
-		{
-			monitor_guard_t g3 = { &mon };
-			this->value += 1;
-		}
-	}
+void increment3( global_t * mutex this ) {
+	this->value += 1;
+}
+
+void increment2( global_t * mutex this ) {
+	increment3( this );
+}
+
+void increment( global_t * mutex this ) {
+	increment2( this );
 }
 
Index: src/tests/multi-monitor.c
===================================================================
--- src/tests/multi-monitor.c	(revision 1fbab5a0107bc631a52826378ed50c1187d6284c)
+++ src/tests/multi-monitor.c	(revision 37439835310395c5cb4dfacff44eb0b8453cc00e)
@@ -6,9 +6,15 @@
 static int global12, global23, global13;
 
-static monitor_desc m1, m2, m3;
+struct monitor_t {
+	monitor_desc m;
+};
 
-void increment( /*mutex*/ monitor_desc * p1, /*mutex*/ monitor_desc * p2, int * value ) {
-	monitor_desc * mons[] = { p1, p2 };
-	monitor_guard_t g = { mons, 2 };
+monitor_desc * get_monitor( monitor_t * this ) {
+	return &this->m;
+}
+
+static monitor_t m1, m2, m3;
+
+void increment( monitor_t * mutex p1, monitor_t * mutex p2, int * value ) {
 	*value += 1;
 }
