Index: src/Concurrency/Keywords.cc
===================================================================
--- src/Concurrency/Keywords.cc	(revision 68fe077a5764a46debddf5a5dc89ef3614748ccd)
+++ src/Concurrency/Keywords.cc	(revision 9f1695b6330182a20c37121261ecfa8d045ebd62)
@@ -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) );
 	}
