Index: src/SymTab/Autogen.cc
===================================================================
--- src/SymTab/Autogen.cc	(revision 615a0968e86dc63f469d72baac2918969c809f3f)
+++ src/SymTab/Autogen.cc	(revision bd4d011a92b605ad83657c777542b73e1fad403f)
@@ -218,7 +218,12 @@
 
 		/// generates a function (?{}, ?=?, ^?{}) based on the data argument and members. If function is generated, inserts the type into the map.
-		void gen( const FuncData & data ) {
+		void gen( const FuncData & data, bool concurrent_type ) {
 			if ( ! shouldGenerate( data.map, aggregateDecl ) ) return;
 			FunctionType * ftype = data.genType( refType );
+
+			if(concurrent_type && InitTweak::isDestructor( data.fname )) {
+				ftype->get_parameters().front()->get_type()->set_mutex( true );
+			}
+
 			cloneAll( typeParams, ftype->get_forall() );
 			*out++ = genFunc( data.fname, ftype, functionNesting );
@@ -403,6 +408,7 @@
 		auto generator = makeFuncGenerator( aggregateDecl, refType, functionNesting, typeParams, back_inserter( newFuncs ) );
 		for ( const FuncData & d : data ) {
-			generator.gen( d );
-		}
+			generator.gen( d, aggregateDecl->is_thread() || aggregateDecl->is_monitor() );
+		}
+
 		// field ctors are only generated if default constructor and copy constructor are both generated
 		unsigned numCtors = std::count_if( newFuncs.begin(), newFuncs.end(), [](FunctionDecl * dcl) { return InitTweak::isConstructor( dcl->get_name() ); } );
Index: src/SymTab/Validate.cc
===================================================================
--- src/SymTab/Validate.cc	(revision 615a0968e86dc63f469d72baac2918969c809f3f)
+++ src/SymTab/Validate.cc	(revision bd4d011a92b605ad83657c777542b73e1fad403f)
@@ -43,4 +43,5 @@
 #include "Common/utility.h"
 #include "Common/UniqueName.h"
+#include "Concurrency/Keywords.h"
 #include "Validate.h"
 #include "SynTree/Visitor.h"
@@ -225,5 +226,8 @@
 		ReturnTypeFixer::fix( translationUnit ); // must happen before autogen
 		acceptAll( translationUnit, lrt ); // must happen before autogen, because sized flag needs to propagate to generated functions
+		Concurrency::applyKeywords( translationUnit );
 		autogenerateRoutines( translationUnit ); // moved up, used to be below compoundLiteral - currently needs EnumAndPointerDecayPass
+		Concurrency::implementMutexFuncs( translationUnit );
+		Concurrency::implementThreadStarter( translationUnit );
 		acceptAll( translationUnit, epc );
 		ReturnChecker::checkFunctionReturns( translationUnit );
