Index: src/Concurrency/Keywords.cc
===================================================================
--- src/Concurrency/Keywords.cc	(revision 578b637758f8bf4a583b6757ee3bec0c6bf462c0)
+++ src/Concurrency/Keywords.cc	(revision bcda04c57444ccd998e9f7511b75c66e90f0301a)
@@ -21,5 +21,4 @@
 #include "SynTree/Expression.h"
 #include "SynTree/Initializer.h"
-#include "SynTree/Mutator.h"
 #include "SynTree/Statement.h"
 #include "SynTree/Type.h"
@@ -38,4 +37,45 @@
 	// Visitors declaration
 	//=============================================================================================
+
+	//-----------------------------------------------------------------------------
+	//Handles sue type declarations :
+	// sue MyType {                             struct MyType {
+	// 	int data;                                  int data;
+	// 	a_struct_t more_data;                      a_struct_t more_data;
+	//                                =>             NewField_t newField;
+	// };                                        };
+	//                                           static inline NewField_t * getter_name( MyType * this ) { return &this->newField; }
+	//
+	class ConcurrentSueKeyword : public Visitor {
+	  protected:
+	    template< typename Visitor >
+	    friend void SymTab::acceptAndAdd( std::list< Declaration * > &translationUnit, Visitor &visitor );
+	  public:
+
+	  	ConcurrentSueKeyword( std::string&& type_name, std::string&& field_name, std::string&& getter_name, std::string&& context_error ) :
+		  type_name( type_name ), field_name( field_name ), getter_name( getter_name ), context_error( context_error ) {}
+
+		virtual ~ConcurrentSueKeyword() {}
+
+		using Visitor::visit;
+		virtual void visit( StructDecl * decl ) override final;
+
+		void handle( StructDecl * );
+		FunctionDecl * forwardDeclare( StructDecl * );
+		ObjectDecl * addField( StructDecl * );
+		void addRoutines( StructDecl *, ObjectDecl *, FunctionDecl * );
+
+		virtual bool is_target( StructDecl * decl ) = 0;
+
+	  private:
+		const std::string type_name;
+		const std::string field_name;
+		const std::string getter_name;
+		const std::string context_error;
+
+		std::list< Declaration * > declsToAdd, declsToAddAfter;
+		StructDecl* type_decl = nullptr;
+	};
+
 
 	//-----------------------------------------------------------------------------
@@ -47,10 +87,24 @@
 	// };                                        };
 	//                                           static inline thread_desc * get_thread( MyThread * this ) { return &this->__thrd_d; }
-	//                                           void main( MyThread * this );
 	//
-	class ThreadKeyword final : public Mutator {
+	class ThreadKeyword final : public ConcurrentSueKeyword {
 	  public:
 
-		static void implement( std::list< Declaration * > & translationUnit ) {}
+	  	ThreadKeyword() : ConcurrentSueKeyword(
+			"thread_desc",
+			"__thrd",
+			"get_thread",
+			"thread keyword requires threads to be in scope, add #include <thread>"
+		)
+		{}
+
+		virtual ~ThreadKeyword() {}
+
+		virtual bool is_target( StructDecl * decl ) override final { return decl->is_thread(); }
+
+		static void implement( std::list< Declaration * > & translationUnit ) {
+			ThreadKeyword impl;
+			SymTab::acceptAndAdd( translationUnit, impl );
+		}
 	};
 
@@ -63,17 +117,19 @@
 	// };                                        };
 	//                                           static inline coroutine_desc * get_coroutine( MyCoroutine * this ) { return &this->__cor_d; }
-	//                                           void main( MyCoroutine * this );
 	//
-	class CoroutineKeyword final : public Visitor {
-	    template< typename Visitor >
-	    friend void SymTab::acceptAndAdd( std::list< Declaration * > &translationUnit, Visitor &visitor );
+	class CoroutineKeyword final : public ConcurrentSueKeyword {
 	  public:
 
-		using Visitor::visit;
-		virtual void visit( StructDecl * decl ) override final;
-
-		void handle( StructDecl * );
-		Declaration * addField( StructDecl * );
-		void addRoutines( StructDecl *, Declaration * );
+	  	CoroutineKeyword() : ConcurrentSueKeyword(
+			"coroutine_desc",
+			"__cor",
+			"get_coroutine",
+			"coroutine keyword requires coroutines to be in scope, add #include <coroutine>"
+		)
+		{}
+
+		virtual ~CoroutineKeyword() {}
+
+		virtual bool is_target( StructDecl * decl ) override final { return decl->is_coroutine(); }
 
 		static void implement( std::list< Declaration * > & translationUnit ) {
@@ -81,8 +137,4 @@
 			SymTab::acceptAndAdd( translationUnit, impl );
 		}
-
-	  private:
-		std::list< Declaration * > declsToAdd, declsToAddAfter;
-		StructDecl* coroutine_decl = nullptr;
 	};
 
@@ -95,10 +147,24 @@
 	// };                                        };
 	//                                           static inline monitor_desc * get_coroutine( MyMonitor * this ) { return &this->__cor_d; }
-	//                                           void main( MyMonitor * this );
 	//
-	class MonitorKeyword final : public Mutator {
+	class MonitorKeyword final : public ConcurrentSueKeyword {
 	  public:
 
-		static void implement( std::list< Declaration * > & translationUnit ) {}
+	  	MonitorKeyword() : ConcurrentSueKeyword(
+			"monitor_desc",
+			"__mon",
+			"get_monitor",
+			"monitor keyword requires monitors to be in scope, add #include <monitor>"
+		)
+		{}
+
+		virtual ~MonitorKeyword() {}
+
+		virtual bool is_target( StructDecl * decl ) override final { return decl->is_monitor(); }
+
+		static void implement( std::list< Declaration * > & translationUnit ) {
+			MonitorKeyword impl;
+			SymTab::acceptAndAdd( translationUnit, impl );
+		}
 	};
 
@@ -139,16 +205,23 @@
 		CoroutineKeyword	::implement( translationUnit );
 		MonitorKeyword	::implement( translationUnit );
+	}
+
+	void implementMutexFuncs( std::list< Declaration * > & translationUnit ) {
 		MutexKeyword	::implement( translationUnit );
 	}
 
-	//=============================================================================================
-	// Coroutine keyword implementation
-	//=============================================================================================
-	void CoroutineKeyword::visit(StructDecl * decl) {
-		if( decl->get_name() == "coroutine_desc" ) {
-			assert( !coroutine_decl );
-			coroutine_decl = decl;
-		}
-		else if ( decl->is_coroutine() ) {
+	void implementThreadStarter( std::list< Declaration * > & translationUnit ) {
+
+	}
+
+	//=============================================================================================
+	// Generic keyword implementation
+	//=============================================================================================
+	void ConcurrentSueKeyword::visit(StructDecl * decl) {
+		if( decl->get_name() == type_name ) {
+			assert( !type_decl );
+			type_decl = decl;
+		}
+		else if ( is_target(decl) ) {
 			handle( decl );
 		}
@@ -156,49 +229,38 @@
 	}
 
-	void CoroutineKeyword::handle( StructDecl * decl ) {
+	void ConcurrentSueKeyword::handle( StructDecl * decl ) {
 		if( ! decl->has_body() ) return;
 
-		if( !coroutine_decl ) throw SemanticError( "coroutine keyword requires coroutines to be in scope, add #include <coroutine>", decl );
-
-		Declaration * field = addField( decl );
-		addRoutines( decl, field );
-	}
-
-	Declaration * CoroutineKeyword::addField( StructDecl * decl ) {
-		Declaration * cor = new ObjectDecl(
-			"__cor",
+		if( !type_decl ) throw SemanticError( context_error, decl );
+
+		FunctionDecl * func = forwardDeclare( decl );
+		ObjectDecl * field = addField( decl );
+		addRoutines( decl, field, func );
+	}
+
+	FunctionDecl * ConcurrentSueKeyword::forwardDeclare( StructDecl * decl ) {
+
+		StructDecl * forward = decl->clone();
+		forward->set_body( false );
+		deleteAll( forward->get_members() );
+		forward->get_members().clear();
+
+		FunctionType * type = new FunctionType( noQualifiers, false );
+		ObjectDecl * this_decl = new ObjectDecl(
+			"this",
 			noStorage,
 			LinkageSpec::Cforall,
 			nullptr,
-			new StructInstType(
+			new PointerType(
 				noQualifiers,
-				coroutine_decl
+				new StructInstType(
+					noQualifiers,
+					decl
+				)
 			),
 			nullptr
 		);
 
-		decl->get_members().push_back( cor );
-
-		return cor;
-	}
-
-	void CoroutineKeyword::addRoutines( StructDecl * decl, Declaration * field ) {
-		FunctionType * type = new FunctionType( noQualifiers, false );
-		type->get_parameters().push_back(
-			new ObjectDecl(
-				"this",
-				noStorage,
-				LinkageSpec::Cforall,
-				nullptr,
-				new PointerType(
-					noQualifiers,
-					new StructInstType(
-						noQualifiers,
-						decl
-					)
-				),
-				nullptr
-			)
-		);
+		type->get_parameters().push_back( this_decl );
 		type->get_returnVals().push_back(
 			new ObjectDecl(
@@ -211,5 +273,5 @@
 					new StructInstType(
 						noQualifiers,
-						coroutine_decl
+						type_decl
 					)
 				),
@@ -218,4 +280,39 @@
 		);
 
+		FunctionDecl * get_decl = new FunctionDecl(
+			getter_name,
+			Type::Static,
+			LinkageSpec::Cforall,
+			type,
+			nullptr,
+			noAttributes,
+			Type::Inline
+		);
+
+		declsToAdd.push_back( forward );
+		declsToAdd.push_back( get_decl );
+
+		return get_decl;
+	}
+
+	ObjectDecl * ConcurrentSueKeyword::addField( StructDecl * decl ) {
+		ObjectDecl * field = new ObjectDecl(
+			field_name,
+			noStorage,
+			LinkageSpec::Cforall,
+			nullptr,
+			new StructInstType(
+				noQualifiers,
+				type_decl
+			),
+			nullptr
+		);
+
+		decl->get_members().push_back( field );
+
+		return field;
+	}
+
+	void ConcurrentSueKeyword::addRoutines( StructDecl * decl, ObjectDecl * field, FunctionDecl * func ) {
 		CompoundStmt * statement = new CompoundStmt( noLabels );
 		statement->push_back( 
@@ -223,10 +320,7 @@
 				noLabels,
 				new AddressExpr(
-					new UntypedMemberExpr(
-						new NameExpr( "__cor" ),
-						new UntypedExpr(
-							new NameExpr( "*?" ),
-							{ new NameExpr( "this" ) }
-						)
+					new MemberExpr(
+						field,
+						UntypedExpr::createDeref( new VariableExpr( func->get_functionType()->get_parameters().front() ) )
 					)
 				)
@@ -234,19 +328,12 @@
 		);
 
-		FunctionDecl * get_decl = new FunctionDecl(
-			"get_coroutine",
-			Type::Static,
-			LinkageSpec::Cforall,
-			type,
-			statement,
-			noAttributes,
-			Type::Inline
-		);
+		FunctionDecl * get_decl = func->clone();
+
+		get_decl->set_statements( statement );
 
 		declsToAddAfter.push_back( get_decl );
 
-		get_decl->fixUniqueId();
-	}
-	
+		// get_decl->fixUniqueId();
+	}
 
 	//=============================================================================================
Index: src/Concurrency/Keywords.h
===================================================================
--- src/Concurrency/Keywords.h	(revision 578b637758f8bf4a583b6757ee3bec0c6bf462c0)
+++ src/Concurrency/Keywords.h	(revision bcda04c57444ccd998e9f7511b75c66e90f0301a)
@@ -24,4 +24,6 @@
 namespace Concurrency {
 	void applyKeywords( std::list< Declaration * > & translationUnit );
+	void implementMutexFuncs( std::list< Declaration * > & translationUnit );
+	void implementThreadStarter( std::list< Declaration * > & translationUnit );
 };
 
Index: src/Parser/lex.ll
===================================================================
--- src/Parser/lex.ll	(revision 578b637758f8bf4a583b6757ee3bec0c6bf462c0)
+++ src/Parser/lex.ll	(revision bcda04c57444ccd998e9f7511b75c66e90f0301a)
@@ -236,5 +236,5 @@
 long			{ KEYWORD_RETURN(LONG); }
 lvalue			{ KEYWORD_RETURN(LVALUE); }				// CFA
-_Monitor		{ KEYWORD_RETURN(MONITOR); }			// CFA
+monitor		{ KEYWORD_RETURN(MONITOR); }			// CFA
 mutex			{ KEYWORD_RETURN(MUTEX); }				// CFA
 _Noreturn		{ KEYWORD_RETURN(NORETURN); }			// C11
Index: src/SymTab/Autogen.cc
===================================================================
--- src/SymTab/Autogen.cc	(revision 578b637758f8bf4a583b6757ee3bec0c6bf462c0)
+++ src/SymTab/Autogen.cc	(revision bcda04c57444ccd998e9f7511b75c66e90f0301a)
@@ -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 578b637758f8bf4a583b6757ee3bec0c6bf462c0)
+++ src/SymTab/Validate.cc	(revision bcda04c57444ccd998e9f7511b75c66e90f0301a)
@@ -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 );
Index: src/main.cc
===================================================================
--- src/main.cc	(revision 578b637758f8bf4a583b6757ee3bec0c6bf462c0)
+++ src/main.cc	(revision bcda04c57444ccd998e9f7511b75c66e90f0301a)
@@ -216,4 +216,7 @@
 		} // if
 
+		// OPTPRINT( "Concurrency" )
+		// Concurrency::applyKeywords( translationUnit );
+
 		// add the assignment statement after the initialization of a type parameter
 		OPTPRINT( "validate" )
@@ -237,6 +240,4 @@
 		OPTPRINT( "mutate" )
 		ControlStruct::mutate( translationUnit );
-		OPTPRINT( "Concurrency" )
-		Concurrency::applyKeywords( translationUnit );
 		OPTPRINT( "fixNames" )
 		CodeGen::fixNames( translationUnit );
Index: src/tests/monitor.c
===================================================================
--- src/tests/monitor.c	(revision 578b637758f8bf4a583b6757ee3bec0c6bf462c0)
+++ src/tests/monitor.c	(revision bcda04c57444ccd998e9f7511b75c66e90f0301a)
@@ -4,15 +4,10 @@
 #include <thread>
 
-struct global_t {
+monitor global_t {
 	int value;
-	monitor_desc m;
 };
 
 void ?{}(global_t * this) {
 	this->value = 0;
-}
-
-monitor_desc * get_monitor( global_t * this ) {
-	return &this->m;
 }
 
@@ -45,5 +40,5 @@
 
 int main(int argc, char* argv[]) {
-	assert( global.m.entry_queue.tail != NULL );
+	assert( global.__mon.entry_queue.tail != NULL );
 	processor p;
 	{
Index: src/tests/multi-monitor.c
===================================================================
--- src/tests/multi-monitor.c	(revision 578b637758f8bf4a583b6757ee3bec0c6bf462c0)
+++ src/tests/multi-monitor.c	(revision bcda04c57444ccd998e9f7511b75c66e90f0301a)
@@ -6,11 +6,5 @@
 static int global12, global23, global13;
 
-struct monitor_t {
-	monitor_desc m;
-};
-
-monitor_desc * get_monitor( monitor_t * this ) {
-	return &this->m;
-}
+monitor monitor_t {};
 
 static monitor_t m1, m2, m3;
