Index: src/Common/PassVisitor.h
===================================================================
--- src/Common/PassVisitor.h	(revision 212c421ef409d6b6cfdc46f15d088a510a868f95)
+++ src/Common/PassVisitor.h	(revision 2065609d54faba689bd6249eb4c159415fb8bf29)
@@ -75,4 +75,5 @@
 	virtual void visit( CatchStmt *catchStmt ) override final;
 	virtual void visit( FinallyStmt *finallyStmt ) override final;
+	virtual void visit( WaitForStmt *waitforStmt ) override final;
 	virtual void visit( NullStmt *nullStmt ) override final;
 	virtual void visit( DeclStmt *declStmt ) override final;
@@ -159,7 +160,8 @@
 	virtual Statement* mutate( ReturnStmt *returnStmt ) override final;
 	virtual Statement* mutate( ThrowStmt *throwStmt ) override final;
-	virtual Statement* mutate( TryStmt *returnStmt ) override final;
+	virtual Statement* mutate( TryStmt *tryStmt ) override final;
 	virtual Statement* mutate( CatchStmt *catchStmt ) override final;
-	virtual Statement* mutate( FinallyStmt *catchStmt ) override final;
+	virtual Statement* mutate( FinallyStmt *finallyStmt ) override final;
+	virtual Statement* mutate( WaitForStmt *waitforStmt ) override final;
 	virtual NullStmt* mutate( NullStmt *nullStmt ) override final;
 	virtual Statement* mutate( DeclStmt *declStmt ) override final;
Index: src/Common/PassVisitor.impl.h
===================================================================
--- src/Common/PassVisitor.impl.h	(revision 212c421ef409d6b6cfdc46f15d088a510a868f95)
+++ src/Common/PassVisitor.impl.h	(revision 2065609d54faba689bd6249eb4c159415fb8bf29)
@@ -541,4 +541,6 @@
 }
 
+//--------------------------------------------------------------------------
+// FinallyStmt
 template< typename pass_type >
 void PassVisitor< pass_type >::visit( FinallyStmt * node ) {
@@ -547,4 +549,23 @@
 
 template< typename pass_type >
+Statement * PassVisitor< pass_type >::mutate( FinallyStmt * node ) {
+	MUTATE_BODY( Statement, node );
+}
+
+//--------------------------------------------------------------------------
+// WaitForStmt
+template< typename pass_type >
+void PassVisitor< pass_type >::visit( WaitForStmt * node ) {
+	VISIT_BODY( node );
+}
+
+template< typename pass_type >
+Statement * PassVisitor< pass_type >::mutate( WaitForStmt * node ) {
+	MUTATE_BODY( Statement, node );
+}
+
+//--------------------------------------------------------------------------
+// NullStmt
+template< typename pass_type >
 void PassVisitor< pass_type >::visit( NullStmt * node ) {
 	VISIT_BODY( node );
@@ -552,4 +573,11 @@
 
 template< typename pass_type >
+NullStmt * PassVisitor< pass_type >::mutate( NullStmt * node ) {
+	MUTATE_BODY( NullStmt, node );
+}
+
+//--------------------------------------------------------------------------
+// DeclStmt
+template< typename pass_type >
 void PassVisitor< pass_type >::visit( DeclStmt * node ) {
 	VISIT_BODY( node );
@@ -557,4 +585,11 @@
 
 template< typename pass_type >
+Statement * PassVisitor< pass_type >::mutate( DeclStmt * node ) {
+	MUTATE_BODY( Statement, node );
+}
+
+//--------------------------------------------------------------------------
+// ImplicitCtorDtorStmt
+template< typename pass_type >
 void PassVisitor< pass_type >::visit( ImplicitCtorDtorStmt * node ) {
 	VISIT_BODY( node );
@@ -562,6 +597,18 @@
 
 template< typename pass_type >
+Statement * PassVisitor< pass_type >::mutate( ImplicitCtorDtorStmt * node ) {
+	MUTATE_BODY( Statement, node );
+}
+
+//--------------------------------------------------------------------------
+// ApplicationExpr
+template< typename pass_type >
 void PassVisitor< pass_type >::visit( ApplicationExpr * node ) {
 	VISIT_BODY( node );
+}
+
+template< typename pass_type >
+Expression * PassVisitor< pass_type >::mutate( ApplicationExpr * node ) {
+	MUTATE_BODY( Expression, node );
 }
 
@@ -944,29 +991,4 @@
 
 template< typename pass_type >
-Statement * PassVisitor< pass_type >::mutate( FinallyStmt * node ) {
-	MUTATE_BODY( Statement, node );
-}
-
-template< typename pass_type >
-NullStmt * PassVisitor< pass_type >::mutate( NullStmt * node ) {
-	MUTATE_BODY( NullStmt, node );
-}
-
-template< typename pass_type >
-Statement * PassVisitor< pass_type >::mutate( DeclStmt * node ) {
-	MUTATE_BODY( Statement, node );
-}
-
-template< typename pass_type >
-Statement * PassVisitor< pass_type >::mutate( ImplicitCtorDtorStmt * node ) {
-	MUTATE_BODY( Statement, node );
-}
-
-template< typename pass_type >
-Expression * PassVisitor< pass_type >::mutate( ApplicationExpr * node ) {
-	MUTATE_BODY( Expression, node );
-}
-
-template< typename pass_type >
 Expression * PassVisitor< pass_type >::mutate( NameExpr * node ) {
 	MUTATE_BODY( Expression, node );
Index: src/Concurrency/Keywords.cc
===================================================================
--- src/Concurrency/Keywords.cc	(revision 212c421ef409d6b6cfdc46f15d088a510a868f95)
+++ src/Concurrency/Keywords.cc	(revision 2065609d54faba689bd6249eb4c159415fb8bf29)
@@ -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;
 
Index: src/Parser/StatementNode.cc
===================================================================
--- src/Parser/StatementNode.cc	(revision 212c421ef409d6b6cfdc46f15d088a510a868f95)
+++ src/Parser/StatementNode.cc	(revision 2065609d54faba689bd6249eb4c159415fb8bf29)
@@ -212,5 +212,9 @@
 	WaitForStmt::Target target;
 	target.function = maybeBuild<Expression>( targetExpr );
-	buildMoveList< Expression >( targetExpr, target.arguments );
+
+	ExpressionNode * next = dynamic_cast<ExpressionNode *>( targetExpr->get_next() );
+	targetExpr->set_next( nullptr );
+	buildMoveList< Expression >( next, target.arguments );
+
 	delete targetExpr;
 
@@ -226,7 +230,10 @@
 WaitForStmt * build_waitfor( ExpressionNode * targetExpr, StatementNode * stmt, ExpressionNode * when, WaitForStmt * node ) {
 	WaitForStmt::Target target;
-
 	target.function = maybeBuild<Expression>( targetExpr );
-	buildMoveList< Expression >( targetExpr, target.arguments );
+
+	ExpressionNode * next = dynamic_cast<ExpressionNode *>( targetExpr->get_next() );
+	targetExpr->set_next( nullptr );
+	buildMoveList< Expression >( next, target.arguments );
+
 	delete targetExpr;
 
