Index: libcfa/src/concurrency/monitor.cfa
===================================================================
--- libcfa/src/concurrency/monitor.cfa	(revision c9f9d4fa0f8c21b313d7d200fe5978130a462a5e)
+++ libcfa/src/concurrency/monitor.cfa	(revision 6cebfefc948a4195311c8d0203ba01ed9c1a1bb3)
@@ -367,4 +367,8 @@
 
 	// __cfaabi_dbg_print_safe( "MGUARD : entered\n" );
+}
+
+void ?{}( monitor_guard_t & this, monitor$ * m [], __lock_size_t count ) {
+	this{ m, count, 0p };
 }
 
Index: libcfa/src/concurrency/monitor.hfa
===================================================================
--- libcfa/src/concurrency/monitor.hfa	(revision c9f9d4fa0f8c21b313d7d200fe5978130a462a5e)
+++ libcfa/src/concurrency/monitor.hfa	(revision 6cebfefc948a4195311c8d0203ba01ed9c1a1bb3)
@@ -48,4 +48,5 @@
 
 void ?{}( monitor_guard_t & this, monitor$ ** m, __lock_size_t count, void (*func)() );
+void ?{}( monitor_guard_t & this, monitor$ ** m, __lock_size_t count );
 void ^?{}( monitor_guard_t & this );
 
Index: src/AST/Convert.cpp
===================================================================
--- src/AST/Convert.cpp	(revision c9f9d4fa0f8c21b313d7d200fe5978130a462a5e)
+++ src/AST/Convert.cpp	(revision 6cebfefc948a4195311c8d0203ba01ed9c1a1bb3)
@@ -606,4 +606,13 @@
 	}
 
+	const ast::Stmt * visit( const ast::MutexStmt * node ) override final {
+		if ( inCache( node ) ) return nullptr;
+		 auto stmt = new MutexStmt(
+			get<Statement>().accept1( node->stmt ),
+		 	get<Expression>().acceptL( node->mutexObjs )
+		);
+		return stmtPostamble( stmt, node );
+	}
+
 	TypeSubstitution * convertTypeSubstitution(const ast::TypeSubstitution * src) {
 
@@ -2124,4 +2133,14 @@
 	}
 
+	virtual void visit( const MutexStmt * old ) override final {
+		if ( inCache( old ) ) return;
+		this->node = new ast::MutexStmt(
+			old->location,
+			GET_ACCEPT_1(stmt, Stmt),
+			GET_ACCEPT_V(mutexObjs, Expr)
+		);
+		cache.emplace( old, this->node );
+	}
+
 	// TypeSubstitution shouldn't exist yet in old.
 	ast::TypeSubstitution * convertTypeSubstitution(const TypeSubstitution * old) {
Index: src/AST/Fwd.hpp
===================================================================
--- src/AST/Fwd.hpp	(revision c9f9d4fa0f8c21b313d7d200fe5978130a462a5e)
+++ src/AST/Fwd.hpp	(revision 6cebfefc948a4195311c8d0203ba01ed9c1a1bb3)
@@ -60,4 +60,5 @@
 class NullStmt;
 class ImplicitCtorDtorStmt;
+class MutexStmt;
 
 class Expr;
Index: src/AST/Node.cpp
===================================================================
--- src/AST/Node.cpp	(revision c9f9d4fa0f8c21b313d7d200fe5978130a462a5e)
+++ src/AST/Node.cpp	(revision 6cebfefc948a4195311c8d0203ba01ed9c1a1bb3)
@@ -176,4 +176,6 @@
 template class ast::ptr_base< ast::ImplicitCtorDtorStmt, ast::Node::ref_type::weak >;
 template class ast::ptr_base< ast::ImplicitCtorDtorStmt, ast::Node::ref_type::strong >;
+template class ast::ptr_base< ast::MutexStmt, ast::Node::ref_type::weak >;
+template class ast::ptr_base< ast::MutexStmt, ast::Node::ref_type::strong >;
 template class ast::ptr_base< ast::Expr, ast::Node::ref_type::weak >;
 template class ast::ptr_base< ast::Expr, ast::Node::ref_type::strong >;
Index: src/AST/Pass.hpp
===================================================================
--- src/AST/Pass.hpp	(revision c9f9d4fa0f8c21b313d7d200fe5978130a462a5e)
+++ src/AST/Pass.hpp	(revision 6cebfefc948a4195311c8d0203ba01ed9c1a1bb3)
@@ -162,4 +162,5 @@
 	const ast::Stmt *             visit( const ast::DeclStmt             * ) override final;
 	const ast::Stmt *             visit( const ast::ImplicitCtorDtorStmt * ) override final;
+	const ast::Stmt *             visit( const ast::MutexStmt            * ) override final;
 	const ast::Expr *             visit( const ast::ApplicationExpr      * ) override final;
 	const ast::Expr *             visit( const ast::UntypedExpr          * ) override final;
Index: src/AST/Pass.impl.hpp
===================================================================
--- src/AST/Pass.impl.hpp	(revision c9f9d4fa0f8c21b313d7d200fe5978130a462a5e)
+++ src/AST/Pass.impl.hpp	(revision 6cebfefc948a4195311c8d0203ba01ed9c1a1bb3)
@@ -1039,4 +1039,20 @@
 
 //--------------------------------------------------------------------------
+// MutexStmt
+template< typename core_t >
+const ast::Stmt * ast::Pass< core_t >::visit( const ast::MutexStmt * node ) {
+	VISIT_START( node );
+
+	VISIT({
+		// mutex statements introduce a level of scope (for the initialization)
+		guard_symtab guard { *this };
+		maybe_accept( node, &MutexStmt::stmt );
+		maybe_accept( node, &MutexStmt::mutexObjs );
+	})
+
+	VISIT_END( Stmt, node );
+}
+
+//--------------------------------------------------------------------------
 // ApplicationExpr
 template< typename core_t >
Index: src/AST/Print.cpp
===================================================================
--- src/AST/Print.cpp	(revision c9f9d4fa0f8c21b313d7d200fe5978130a462a5e)
+++ src/AST/Print.cpp	(revision 6cebfefc948a4195311c8d0203ba01ed9c1a1bb3)
@@ -794,4 +794,19 @@
 		++indent;
 		safe_print( node->callStmt );
+		--indent;
+		os << endl;
+
+		return node;
+	}
+
+	virtual const ast::Stmt * visit( const ast::MutexStmt * node ) override final {
+		os << "Mutex Statement" << endl;
+		os << indent << "... with Mutex Parameters: ";
+		++indent;
+		printAll( node->mutexObjs );
+		--indent;
+		os << indent << "... with Statement: ";
+		++indent;
+		safe_print( node->stmt );
 		--indent;
 		os << endl;
Index: src/AST/Stmt.hpp
===================================================================
--- src/AST/Stmt.hpp	(revision c9f9d4fa0f8c21b313d7d200fe5978130a462a5e)
+++ src/AST/Stmt.hpp	(revision 6cebfefc948a4195311c8d0203ba01ed9c1a1bb3)
@@ -426,4 +426,20 @@
 };
 
+/// Mutex Statement
+class MutexStmt final : public Stmt {
+public:
+	ptr<Stmt> stmt;
+	std::vector<ptr<Expr>> mutexObjs;
+
+	MutexStmt( const CodeLocation & loc, const Stmt * stmt, 
+		std::vector<ptr<Expr>> && mutexes, std::vector<Label> && labels = {} )
+	: Stmt(loc, std::move(labels)), stmt(stmt), mutexObjs(std::move(mutexes)) {}
+
+	const Stmt * accept( Visitor & v ) const override { return v.visit( this ); }
+private:
+	MutexStmt * clone() const override { return new MutexStmt{ *this }; }
+	MUTATE_FRIEND
+};
+
 }
 
Index: src/AST/Visitor.hpp
===================================================================
--- src/AST/Visitor.hpp	(revision c9f9d4fa0f8c21b313d7d200fe5978130a462a5e)
+++ src/AST/Visitor.hpp	(revision 6cebfefc948a4195311c8d0203ba01ed9c1a1bb3)
@@ -54,4 +54,5 @@
     virtual const ast::Stmt *             visit( const ast::DeclStmt             * ) = 0;
     virtual const ast::Stmt *             visit( const ast::ImplicitCtorDtorStmt * ) = 0;
+    virtual const ast::Stmt *             visit( const ast::MutexStmt            * ) = 0;
     virtual const ast::Expr *             visit( const ast::ApplicationExpr      * ) = 0;
     virtual const ast::Expr *             visit( const ast::UntypedExpr          * ) = 0;
Index: src/CodeGen/CodeGenerator.cc
===================================================================
--- src/CodeGen/CodeGenerator.cc	(revision c9f9d4fa0f8c21b313d7d200fe5978130a462a5e)
+++ src/CodeGen/CodeGenerator.cc	(revision 6cebfefc948a4195311c8d0203ba01ed9c1a1bb3)
@@ -1187,4 +1187,9 @@
 	}
 
+	void CodeGenerator::postvisit( MutexStmt * stmt ) {
+		assertf( ! options.genC, "ImplicitCtorDtorStmts should not reach code generation." );
+		stmt->stmt->accept( *visitor );
+	}
+
 	void CodeGenerator::handleStorageClass( DeclarationWithType * decl ) {
 		if ( decl->get_storageClasses().any() ) {
Index: src/CodeGen/CodeGenerator.h
===================================================================
--- src/CodeGen/CodeGenerator.h	(revision c9f9d4fa0f8c21b313d7d200fe5978130a462a5e)
+++ src/CodeGen/CodeGenerator.h	(revision 6cebfefc948a4195311c8d0203ba01ed9c1a1bb3)
@@ -121,4 +121,5 @@
 		void postvisit( DeclStmt * );
 		void postvisit( ImplicitCtorDtorStmt * );
+		void postvisit( MutexStmt * stmt );
 
 		void genAttributes( std::list< Attribute * > & attributes );
Index: src/Common/PassVisitor.h
===================================================================
--- src/Common/PassVisitor.h	(revision c9f9d4fa0f8c21b313d7d200fe5978130a462a5e)
+++ src/Common/PassVisitor.h	(revision 6cebfefc948a4195311c8d0203ba01ed9c1a1bb3)
@@ -124,4 +124,6 @@
 	virtual void visit( ImplicitCtorDtorStmt * impCtorDtorStmt ) override final;
 	virtual void visit( const ImplicitCtorDtorStmt * impCtorDtorStmt ) override final;
+	virtual void visit( MutexStmt * mutexStmt ) override final;
+	virtual void visit( const MutexStmt * mutexStmt ) override final;
 
 	virtual void visit( ApplicationExpr * applicationExpr ) override final;
@@ -291,4 +293,5 @@
 	virtual Statement * mutate( DeclStmt * declStmt ) override final;
 	virtual Statement * mutate( ImplicitCtorDtorStmt * impCtorDtorStmt ) override final;
+	virtual Statement * mutate( MutexStmt * mutexStmt ) override final;
 
 	virtual Expression * mutate( ApplicationExpr * applicationExpr ) override final;
Index: src/Common/PassVisitor.impl.h
===================================================================
--- src/Common/PassVisitor.impl.h	(revision c9f9d4fa0f8c21b313d7d200fe5978130a462a5e)
+++ src/Common/PassVisitor.impl.h	(revision 6cebfefc948a4195311c8d0203ba01ed9c1a1bb3)
@@ -1781,4 +1781,40 @@
 
 //--------------------------------------------------------------------------
+// MutexStmt
+template< typename pass_type >
+void PassVisitor< pass_type >::visit( MutexStmt * node ) {
+	VISIT_START( node );
+	// mutex statements introduce a level of scope (for the initialization)
+	maybeAccept_impl( node->mutexObjs, *this );
+	{
+		auto guard = makeFuncGuard( [this]() { indexerScopeEnter(); }, [this]() { indexerScopeLeave(); } );
+		node->stmt = visitStatement( node->stmt );
+	}
+	VISIT_END( node );
+}
+
+template< typename pass_type >
+void PassVisitor< pass_type >::visit( const MutexStmt * node ) {
+	VISIT_START( node );
+	maybeAccept_impl( node->mutexObjs, *this );
+	{
+		auto guard = makeFuncGuard( [this]() { indexerScopeEnter(); }, [this]() { indexerScopeLeave(); } );
+		visitStatement( node->stmt );
+	}
+	VISIT_END( node );
+}
+
+template< typename pass_type >
+Statement * PassVisitor< pass_type >::mutate( MutexStmt * node ) {
+	MUTATE_START( node );
+	maybeMutate_impl( node->mutexObjs, *this );
+	{
+		auto guard = makeFuncGuard( [this]() { indexerScopeEnter(); }, [this]() { indexerScopeLeave(); } );
+		node->stmt = mutateStatement( node->stmt );
+	}
+	MUTATE_END( Statement, node );
+}
+
+//--------------------------------------------------------------------------
 // ApplicationExpr
 template< typename pass_type >
Index: src/Concurrency/Keywords.cc
===================================================================
--- src/Concurrency/Keywords.cc	(revision c9f9d4fa0f8c21b313d7d200fe5978130a462a5e)
+++ src/Concurrency/Keywords.cc	(revision 6cebfefc948a4195311c8d0203ba01ed9c1a1bb3)
@@ -302,4 +302,5 @@
 		void postvisit( FunctionDecl * decl );
 		void postvisit(   StructDecl * decl );
+		Statement * postmutate( MutexStmt * stmt );
 
 		std::list<DeclarationWithType*> findMutexArgs( FunctionDecl*, bool & first );
@@ -307,4 +308,5 @@
 		void addDtorStatements( FunctionDecl* func, CompoundStmt *, const std::list<DeclarationWithType * > &);
 		void addStatements( FunctionDecl* func, CompoundStmt *, const std::list<DeclarationWithType * > &);
+		void addStatements( CompoundStmt * body, const std::list<Expression * > & args );
 		void addThreadDtorStatements( FunctionDecl* func, CompoundStmt * body, const std::list<DeclarationWithType * > & args );
 
@@ -312,4 +314,5 @@
 			PassVisitor< MutexKeyword > impl;
 			acceptAll( translationUnit, impl );
+			mutateAll( translationUnit, impl );
 		}
 
@@ -935,4 +938,12 @@
 			thread_guard_decl = decl;
 		}
+	}
+
+	Statement * MutexKeyword::postmutate( MutexStmt * stmt ) {
+		std::list<Statement *> stmtsForCtor;
+		stmtsForCtor.push_back(stmt->stmt);
+		CompoundStmt * body = new CompoundStmt( stmtsForCtor );
+		addStatements( body, stmt->mutexObjs);
+		return body;
 	}
 
@@ -1058,4 +1069,60 @@
 			))
 		);
+	}
+
+	void MutexKeyword::addStatements( CompoundStmt * body, const std::list<Expression * > & args ) {
+		ObjectDecl * monitors = new ObjectDecl(
+			"__monitors",
+			noStorageClasses,
+			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, [](Expression * var ){
+					return new SingleInit( new UntypedExpr(
+						new NameExpr( "get_monitor" ),
+						{ var }
+					) );
+				})
+			)
+		);
+
+		// in reverse order :
+		// monitor_guard_t __guard = { __monitors, # };
+		body->push_front(
+			new DeclStmt( new ObjectDecl(
+				"__guard",
+				noStorageClasses,
+				LinkageSpec::Cforall,
+				nullptr,
+				new StructInstType(
+					noQualifiers,
+					guard_decl
+				),
+				new ListInit(
+					{
+						new SingleInit( new VariableExpr( monitors ) ),
+						new SingleInit( new ConstantExpr( Constant::from_ulong( args.size() ) ) )
+					},
+					noDesignators,
+					true
+				)
+			))
+		);
+
+		//monitor$ * __monitors[] = { get_monitor(a), get_monitor(b) };
+		body->push_front( new DeclStmt( monitors) );
 	}
 
Index: src/Parser/ParseNode.h
===================================================================
--- src/Parser/ParseNode.h	(revision c9f9d4fa0f8c21b313d7d200fe5978130a462a5e)
+++ src/Parser/ParseNode.h	(revision 6cebfefc948a4195311c8d0203ba01ed9c1a1bb3)
@@ -437,4 +437,5 @@
 WaitForStmt * build_waitfor_timeout( ExpressionNode * timeout, StatementNode * stmt, ExpressionNode * when, StatementNode * else_stmt, ExpressionNode * else_when );
 Statement * build_with( ExpressionNode * exprs, StatementNode * stmt );
+Statement * build_mutex( ExpressionNode * exprs, StatementNode * stmt );
 
 //##############################################################################
Index: src/Parser/parser.yy
===================================================================
--- src/Parser/parser.yy	(revision c9f9d4fa0f8c21b313d7d200fe5978130a462a5e)
+++ src/Parser/parser.yy	(revision 6cebfefc948a4195311c8d0203ba01ed9c1a1bb3)
@@ -1346,5 +1346,5 @@
 mutex_statement:
 	MUTEX '(' argument_expression_list_opt ')' statement
-		{ SemanticError( yylloc, "Mutex statement is currently unimplemented." ); $$ = nullptr; }
+		{ $$ = new StatementNode( build_mutex( $3, $5 ) ); }
 	;
 
Index: src/SynTree/Mutator.h
===================================================================
--- src/SynTree/Mutator.h	(revision c9f9d4fa0f8c21b313d7d200fe5978130a462a5e)
+++ src/SynTree/Mutator.h	(revision 6cebfefc948a4195311c8d0203ba01ed9c1a1bb3)
@@ -58,4 +58,5 @@
 	virtual Statement * mutate( DeclStmt * declStmt ) = 0;
 	virtual Statement * mutate( ImplicitCtorDtorStmt * impCtorDtorStmt ) = 0;
+	virtual Statement * mutate( MutexStmt * mutexStmt ) = 0;
 
 	virtual Expression * mutate( ApplicationExpr * applicationExpr ) = 0;
Index: src/SynTree/Statement.cc
===================================================================
--- src/SynTree/Statement.cc	(revision c9f9d4fa0f8c21b313d7d200fe5978130a462a5e)
+++ src/SynTree/Statement.cc	(revision 6cebfefc948a4195311c8d0203ba01ed9c1a1bb3)
@@ -565,4 +565,28 @@
 }
 
+MutexStmt::MutexStmt( Statement * stmt, std::list<Expression *> mutexObjs ) 
+	: Statement(), stmt( stmt ), mutexObjs( mutexObjs ) { }
+
+MutexStmt::MutexStmt( const MutexStmt & other ) : Statement( other ), stmt( maybeClone( other.stmt ) ) {
+	cloneAll( other.mutexObjs, mutexObjs );
+}
+
+MutexStmt::~MutexStmt() {
+	deleteAll( mutexObjs );
+	delete stmt;
+}
+
+void MutexStmt::print( std::ostream & os, Indenter indent ) const {
+	os << "Mutex Statement" << endl;
+	os << indent << "... with Expressions: " << endl;
+	for (auto * obj : mutexObjs) {
+		os << indent+1;
+		obj->print( os, indent+1);
+		os << endl;
+	}
+	os << indent << "... with Statement: " << endl << indent+1;
+	stmt->print( os, indent+1 );
+}
+
 // Local Variables: //
 // tab-width: 4 //
Index: src/SynTree/Statement.h
===================================================================
--- src/SynTree/Statement.h	(revision c9f9d4fa0f8c21b313d7d200fe5978130a462a5e)
+++ src/SynTree/Statement.h	(revision 6cebfefc948a4195311c8d0203ba01ed9c1a1bb3)
@@ -535,4 +535,20 @@
 };
 
+class MutexStmt : public Statement {
+  public:
+	Statement * stmt;
+	std::list<Expression *> mutexObjs; // list of mutex objects to acquire
+
+	MutexStmt( Statement * stmt, std::list<Expression *> mutexObjs );
+	MutexStmt( const MutexStmt & other );
+	virtual ~MutexStmt();
+
+	virtual MutexStmt * clone() const override { return new MutexStmt( *this ); }
+	virtual void accept( Visitor & v ) override { v.visit( this ); }
+	virtual void accept( Visitor & v ) const override { v.visit( this ); }
+	virtual Statement * acceptMutator( Mutator & m )  override { return m.mutate( this ); }
+	virtual void print( std::ostream & os, Indenter indent = {} ) const override;
+};
+
 // Local Variables: //
 // tab-width: 4 //
Index: src/SynTree/SynTree.h
===================================================================
--- src/SynTree/SynTree.h	(revision c9f9d4fa0f8c21b313d7d200fe5978130a462a5e)
+++ src/SynTree/SynTree.h	(revision 6cebfefc948a4195311c8d0203ba01ed9c1a1bb3)
@@ -62,4 +62,5 @@
 class NullStmt;
 class ImplicitCtorDtorStmt;
+class MutexStmt;
 
 class Expression;
Index: src/SynTree/Visitor.h
===================================================================
--- src/SynTree/Visitor.h	(revision c9f9d4fa0f8c21b313d7d200fe5978130a462a5e)
+++ src/SynTree/Visitor.h	(revision 6cebfefc948a4195311c8d0203ba01ed9c1a1bb3)
@@ -92,4 +92,6 @@
 	virtual void visit( ImplicitCtorDtorStmt * node ) { visit( const_cast<const ImplicitCtorDtorStmt *>(node) ); }
 	virtual void visit( const ImplicitCtorDtorStmt * impCtorDtorStmt ) = 0;
+	virtual void visit( MutexStmt * node ) { visit( const_cast<const MutexStmt *>(node) ); }
+	virtual void visit( const MutexStmt * mutexStmt ) = 0;
 
 	virtual void visit( ApplicationExpr * node ) { visit( const_cast<const ApplicationExpr *>(node) ); }
