Index: src/Concurrency/Keywords.cc
===================================================================
--- src/Concurrency/Keywords.cc	(revision 6b224a52e644258a65fc4b1af5b45c5d9c835149)
+++ src/Concurrency/Keywords.cc	(revision 39c7fd015669a4b1bec3cde748dfbfc9113d0b86)
@@ -19,4 +19,5 @@
 #include <string>                  // for string, operator==
 
+#include "Common/PassVisitor.h"    // for PassVisitor
 #include "Common/SemanticError.h"  // for SemanticError
 #include "Common/utility.h"        // for deleteAll, map_range
@@ -46,5 +47,5 @@
 
 	//=============================================================================================
-	// Visitors declaration
+	// Pass declarations
 	//=============================================================================================
 
@@ -58,8 +59,5 @@
 	//                                           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 );
+	class ConcurrentSueKeyword : public WithDeclsToAdd {
 	  public:
 
@@ -69,6 +67,5 @@
 		virtual ~ConcurrentSueKeyword() {}
 
-		using Visitor::visit;
-		virtual void visit( StructDecl * decl ) override final;
+		void postvisit( StructDecl * decl );
 
 		void handle( StructDecl * );
@@ -86,5 +83,4 @@
 		bool needs_main;
 
-		std::list< Declaration * > declsToAdd, declsToAddAfter;
 		StructDecl* type_decl = nullptr;
 	};
@@ -117,6 +113,6 @@
 
 		static void implement( std::list< Declaration * > & translationUnit ) {
-			ThreadKeyword impl;
-			SymTab::acceptAndAdd( translationUnit, impl );
+			PassVisitor< ThreadKeyword > impl;
+			acceptAll( translationUnit, impl );
 		}
 	};
@@ -148,6 +144,6 @@
 
 		static void implement( std::list< Declaration * > & translationUnit ) {
-			CoroutineKeyword impl;
-			SymTab::acceptAndAdd( translationUnit, impl );
+			PassVisitor< CoroutineKeyword > impl;
+			acceptAll( translationUnit, impl );
 		}
 	};
@@ -179,6 +175,6 @@
 
 		static void implement( std::list< Declaration * > & translationUnit ) {
-			MonitorKeyword impl;
-			SymTab::acceptAndAdd( translationUnit, impl );
+			PassVisitor< MonitorKeyword > impl;
+			acceptAll( translationUnit, impl );
 		}
 	};
@@ -192,10 +188,9 @@
 	// }                                                               }
 	//
-	class MutexKeyword final : public Visitor {
+	class MutexKeyword final {
 	  public:
 
-		using Visitor::visit;
-		virtual void visit( FunctionDecl * decl ) override final;
-		virtual void visit(   StructDecl * decl ) override final;
+		void postvisit( FunctionDecl * decl );
+		void postvisit(   StructDecl * decl );
 
 		std::list<DeclarationWithType*> findMutexArgs( FunctionDecl* );
@@ -204,5 +199,5 @@
 
 		static void implement( std::list< Declaration * > & translationUnit ) {
-			MutexKeyword impl;
+			PassVisitor< MutexKeyword > impl;
 			acceptAll( translationUnit, impl );
 		}
@@ -230,14 +225,13 @@
 	// }                                                               }
 	//
-	class ThreadStarter final : public Visitor {
+	class ThreadStarter final {
 	  public:
 
-		using Visitor::visit;
-		virtual void visit( FunctionDecl * decl ) override final;
+		void postvisit( FunctionDecl * decl );
 
 		void addStartStatement( FunctionDecl * decl, DeclarationWithType * param );
 
 		static void implement( std::list< Declaration * > & translationUnit ) {
-			ThreadStarter impl;
+			PassVisitor< ThreadStarter > impl;
 			acceptAll( translationUnit, impl );
 		}
@@ -264,6 +258,5 @@
 	// Generic keyword implementation
 	//=============================================================================================
-	void ConcurrentSueKeyword::visit(StructDecl * decl) {
-		Visitor::visit(decl);
+	void ConcurrentSueKeyword::postvisit(StructDecl * decl) {
 		if( decl->get_name() == type_name && decl->has_body() ) {
 			assert( !type_decl );
@@ -353,7 +346,7 @@
 		}
 
-		declsToAdd.push_back( forward );
-		if( needs_main ) declsToAdd.push_back( main_decl );
-		declsToAdd.push_back( get_decl );
+		declsToAddBefore.push_back( forward );
+		if( needs_main ) declsToAddBefore.push_back( main_decl );
+		declsToAddBefore.push_back( get_decl );
 
 		return get_decl;
@@ -405,6 +398,5 @@
 	//=============================================================================================
 
-	void MutexKeyword::visit(FunctionDecl* decl) {
-		Visitor::visit(decl);
+	void MutexKeyword::postvisit(FunctionDecl* decl) {
 
 		std::list<DeclarationWithType*> mutexArgs = findMutexArgs( decl );
@@ -424,6 +416,5 @@
 	}
 
-	void MutexKeyword::visit(StructDecl* decl) {
-		Visitor::visit(decl);
+	void MutexKeyword::postvisit(StructDecl* decl) {
 
 		if( decl->get_name() == "monitor_desc" ) {
@@ -532,7 +523,5 @@
 	// General entry routine
 	//=============================================================================================
-	void ThreadStarter::visit(FunctionDecl * decl) {
-		Visitor::visit(decl);
-
+	void ThreadStarter::postvisit(FunctionDecl * decl) {
 		if( ! CodeGen::isConstructor(decl->get_name()) ) return;
 
