Index: src/Concurrency/KeywordsNew.cpp
===================================================================
--- src/Concurrency/KeywordsNew.cpp	(revision 4bae7b4e4a434778d66ee17c5aa961b8b246ab9c)
+++ src/Concurrency/KeywordsNew.cpp	(revision d464b791d5bd75566b03d39595db6a7a316a6884)
@@ -1236,4 +1236,12 @@
 }
 
+void flattenTuple( const ast::UntypedTupleExpr * tuple, std::vector<ast::ptr<ast::Expr>> & output ) {
+    for ( auto & expr : tuple->exprs ) {
+        const ast::UntypedTupleExpr * innerTuple = dynamic_cast<const ast::UntypedTupleExpr *>(expr.get());
+        if ( innerTuple ) flattenTuple( innerTuple, output );
+        else output.emplace_back( ast::deepCopy( expr ));
+    }
+}
+
 ast::CompoundStmt * MutexKeyword::addStatements(
 		const ast::CompoundStmt * body,
@@ -1248,4 +1256,12 @@
 	// std::string lockFnName = mutex_func_namer.newName();
 	// std::string unlockFnName = mutex_func_namer.newName();
+
+    // If any arguments to the mutex stmt are tuples, flatten them
+    std::vector<ast::ptr<ast::Expr>> flattenedArgs;
+    for ( auto & arg : args ) {
+        const ast::UntypedTupleExpr * tuple = dynamic_cast<const ast::UntypedTupleExpr *>(args.at(0).get());
+        if ( tuple ) flattenTuple( tuple, flattenedArgs );
+        else flattenedArgs.emplace_back( ast::deepCopy( arg ));
+    }
 
 	// Make pointer to the monitors.
@@ -1257,5 +1273,5 @@
 				new ast::VoidType()
 			),
-			ast::ConstantExpr::from_ulong( location, args.size() ),
+			ast::ConstantExpr::from_ulong( location, flattenedArgs.size() ),
 			ast::FixedLen,
 			ast::DynamicDim
@@ -1264,5 +1280,5 @@
 			location,
 			map_range<std::vector<ast::ptr<ast::Init>>>(
-				args, [](const ast::Expr * expr) {
+				flattenedArgs, [](const ast::Expr * expr) {
 					return new ast::SingleInit(
 						expr->location,
@@ -1287,5 +1303,5 @@
 
 	// adds a nested try stmt for each lock we are locking
-	for ( long unsigned int i = 0; i < args.size(); i++ ) {
+	for ( long unsigned int i = 0; i < flattenedArgs.size(); i++ ) {
 		ast::UntypedExpr * innerAccess = new ast::UntypedExpr( 
 			location,
@@ -1298,10 +1314,10 @@
 		// make the try body
 		ast::CompoundStmt * currTryBody = new ast::CompoundStmt( location );
-		ast::IfStmt * lockCall = genTypeDiscrimLockUnlock( "lock", args, location, innerAccess );
+		ast::IfStmt * lockCall = genTypeDiscrimLockUnlock( "lock", flattenedArgs, location, innerAccess );
 		currTryBody->push_back( lockCall );
 
 		// make the finally stmt
 		ast::CompoundStmt * currFinallyBody = new ast::CompoundStmt( location );
-		ast::IfStmt * unlockCall = genTypeDiscrimLockUnlock( "unlock", args, location, innerAccess );
+		ast::IfStmt * unlockCall = genTypeDiscrimLockUnlock( "unlock", flattenedArgs, location, innerAccess );
 		currFinallyBody->push_back( unlockCall );
 
@@ -1343,5 +1359,5 @@
 						new ast::SingleInit(
 							location,
-							ast::ConstantExpr::from_ulong( location, args.size() ) ),
+							ast::ConstantExpr::from_ulong( location, flattenedArgs.size() ) ),
 					},
 					{},
