Index: src/AST/Convert.cpp
===================================================================
--- src/AST/Convert.cpp	(revision cc64be1dd3db39d2922758fd6127465b0ad386f1)
+++ src/AST/Convert.cpp	(revision fe8aa2182b90d16d7e1074b52e0dbd330f9287cf)
@@ -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 cc64be1dd3db39d2922758fd6127465b0ad386f1)
+++ src/AST/Fwd.hpp	(revision fe8aa2182b90d16d7e1074b52e0dbd330f9287cf)
@@ -60,4 +60,5 @@
 class NullStmt;
 class ImplicitCtorDtorStmt;
+class MutexStmt;
 
 class Expr;
Index: src/AST/Node.cpp
===================================================================
--- src/AST/Node.cpp	(revision cc64be1dd3db39d2922758fd6127465b0ad386f1)
+++ src/AST/Node.cpp	(revision fe8aa2182b90d16d7e1074b52e0dbd330f9287cf)
@@ -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 cc64be1dd3db39d2922758fd6127465b0ad386f1)
+++ src/AST/Pass.hpp	(revision fe8aa2182b90d16d7e1074b52e0dbd330f9287cf)
@@ -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 cc64be1dd3db39d2922758fd6127465b0ad386f1)
+++ src/AST/Pass.impl.hpp	(revision fe8aa2182b90d16d7e1074b52e0dbd330f9287cf)
@@ -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 cc64be1dd3db39d2922758fd6127465b0ad386f1)
+++ src/AST/Print.cpp	(revision fe8aa2182b90d16d7e1074b52e0dbd330f9287cf)
@@ -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 cc64be1dd3db39d2922758fd6127465b0ad386f1)
+++ src/AST/Stmt.hpp	(revision fe8aa2182b90d16d7e1074b52e0dbd330f9287cf)
@@ -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 cc64be1dd3db39d2922758fd6127465b0ad386f1)
+++ src/AST/Visitor.hpp	(revision fe8aa2182b90d16d7e1074b52e0dbd330f9287cf)
@@ -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;
