Index: src/Concurrency/Keywords.cc
===================================================================
--- src/Concurrency/Keywords.cc	(revision e61a35e4076580a86ebb332f4596518a59a36f52)
+++ src/Concurrency/Keywords.cc	(revision 9243cc9182698807efb210be324a644e9f390bae)
@@ -88,5 +88,5 @@
 	//Handles mutex routines definitions :
 	// void foo( A * mutex a, B * mutex b,  int i ) {                  void foo( A * a, B * b,  int i ) {
-	// 	                                                                 monitor_desc * __monitors[] = { a, b };
+	// 	                                                                 monitor_desc * __monitors[] = { get_monitor(a), get_monitor(b) };
 	// 	                                                                 monitor_guard_t __guard = { __monitors, 2 };
 	//    /*Some code*/                                       =>           /*Some code*/
@@ -98,4 +98,5 @@
 		using Visitor::visit;
 		virtual void visit( FunctionDecl *functionDecl ) override final;
+		virtual void visit(   StructDecl *functionDecl ) override final;
 
 		std::list<DeclarationWithType*> findMutexArgs( FunctionDecl* );
@@ -107,4 +108,7 @@
 			acceptAll( translationUnit, impl );
 		}
+
+	  private:
+	  	StructDecl* monitor_decl = nullptr;
 	};
 
@@ -133,5 +137,13 @@
 		if( ! body ) return;
 
+		assert(monitor_decl);
 		addStatments( body, mutexArgs );
+	}
+
+	void MutexKeyword::visit(StructDecl* decl) {
+		if( decl->get_name() == "monitor_desc" ) {
+			assert( !monitor_decl );
+			monitor_decl = decl;
+		}
 	}
 
@@ -167,4 +179,33 @@
 
 	void MutexKeyword::addStatments( CompoundStmt * body, const std::list<DeclarationWithType * > & args ) {
+
+		ObjectDecl * monitors = new ObjectDecl(
+			"__monitors",
+			noStorage,
+			LinkageSpec::Cforall,
+			nullptr,
+			new ArrayType(
+				noQualifiers,
+				new PointerType(
+					noQualifiers,
+					new StructInstType(
+						noQualifiers,
+						monitor_decl
+					)
+				),
+				new ConstantExpr( Constant::from_ulong( args.size() ) ),
+				false,
+				false
+			),
+			new ListInit(
+				map_range < std::list<Initializer*> > ( args, [](DeclarationWithType * var ){
+					return new SingleInit( new UntypedExpr(
+						new NameExpr( "get_monitor" ),
+						{  new VariableExpr( var ) }
+					) );
+				})
+			)
+		);
+
 		//in reverse order :
 		// monitor_guard_t __guard = { __monitors, # };
@@ -181,5 +222,5 @@
 				new ListInit(
 					{
-						new SingleInit( new NameExpr( "__monitors" ) ),
+						new SingleInit( new VariableExpr( monitors ) ),
 						new SingleInit( new ConstantExpr( Constant::from_ulong( args.size() ) ) )
 					}
@@ -189,30 +230,5 @@
 
 		//monitor_desc * __monitors[] = { a, b };
-		body->push_front(
-			new DeclStmt( noLabels, new ObjectDecl(
-				"__monitors",
-				noStorage,
-				LinkageSpec::Cforall,
-				nullptr,
-				new ArrayType(
-					noQualifiers,
-					new PointerType(
-						noQualifiers,
-						new StructInstType(
-							noQualifiers,
-							"monitor_desc"
-						)
-					),
-					new ConstantExpr( Constant::from_ulong( args.size() ) ),
-					false,
-					false
-				),
-				new ListInit(
-					map_range < std::list<Initializer*> > ( args, [](DeclarationWithType * var ){
-						return new SingleInit( new VariableExpr( var ) );
-					})
-				)
-			))
-		);
+		body->push_front( new DeclStmt( noLabels, monitors) );
 	}
 };
