Index: src/Concurrency/Waitfor.cc
===================================================================
--- src/Concurrency/Waitfor.cc	(revision 1dcd955480c332b81ce157f2b7ccf8e34ad2acd3)
+++ src/Concurrency/Waitfor.cc	(revision 310e5b7a73ac432e83f04a8d32b171a31ac8c68f)
@@ -204,4 +204,19 @@
 			return new ConstantExpr( Constant::from_bool( ifnull ) );
 		}
+
+		VariableExpr * extractVariable( Expression * func ) {
+			if( VariableExpr * var = dynamic_cast< VariableExpr * >( func ) ) {
+				return var;
+			}
+
+			CastExpr * cast = strict_dynamic_cast< CastExpr * >( func );
+			return strict_dynamic_cast< VariableExpr * >( cast->arg );
+		}
+
+		Expression * betterIsDtor( Expression * func ) {
+			VariableExpr * typed_func = extractVariable( func );
+			bool is_dtor = InitTweak::isDestructor( typed_func->var );
+			return new ConstantExpr( Constant::from_bool( is_dtor ) );
+		}
 	};
 
@@ -212,5 +227,5 @@
 
 	void GenerateWaitForPass::premutate( FunctionDecl * decl) {
-		if( decl->name != "__accept_internal" ) return;
+		if( decl->name != "__waitfor_internal" ) return;
 
 		decl_waitfor = decl;
@@ -313,9 +328,10 @@
 		Type * fptr_t = new PointerType( noQualifiers, new FunctionType( noQualifiers, true ) );
 
+		Expression * is_dtor = betterIsDtor( clause.target.function );
 		CompoundStmt * compound = new CompoundStmt( noLabels );
 		compound->push_back( makeAccStatement( acceptables, index, "func"    , new CastExpr( clause.target.function, fptr_t )                            , indexer ) );
 		compound->push_back( makeAccStatement( acceptables, index, "count"   , new ConstantExpr( Constant::from_ulong( clause.target.arguments.size() ) ), indexer ) );
 		compound->push_back( makeAccStatement( acceptables, index, "monitors", new VariableExpr( monitors )                                              , indexer ) );
-		compound->push_back( makeAccStatement( acceptables, index, "is_dtor" , new ConstantExpr( Constant::from_bool( true ) )                           , indexer ) );
+		compound->push_back( makeAccStatement( acceptables, index, "is_dtor" , is_dtor                                                                   , indexer ) );
 
 		stmt->push_back( new IfStmt(
Index: src/Parser/StatementNode.cc
===================================================================
--- src/Parser/StatementNode.cc	(revision 1dcd955480c332b81ce157f2b7ccf8e34ad2acd3)
+++ src/Parser/StatementNode.cc	(revision 310e5b7a73ac432e83f04a8d32b171a31ac8c68f)
@@ -250,5 +250,5 @@
 	delete targetExpr;
 
-	node->clauses.push_back( WaitForStmt::Clause{
+	node->clauses.insert( node->clauses.begin(), WaitForStmt::Clause{
 		std::move( target ),
 		maybeMoveBuild<Statement >( stmt ),
Index: src/Parser/parserutility.cc
===================================================================
--- src/Parser/parserutility.cc	(revision 1dcd955480c332b81ce157f2b7ccf8e34ad2acd3)
+++ src/Parser/parserutility.cc	(revision 310e5b7a73ac432e83f04a8d32b171a31ac8c68f)
@@ -29,4 +29,5 @@
 
 Expression *notZeroExpr( Expression *orig ) {
+	if( !orig ) return nullptr;
 	UntypedExpr *comparison = new UntypedExpr( new NameExpr( "?!=?" ) );
 	comparison->get_args().push_back( orig );
Index: src/libcfa/concurrency/monitor
===================================================================
--- src/libcfa/concurrency/monitor	(revision 1dcd955480c332b81ce157f2b7ccf8e34ad2acd3)
+++ src/libcfa/concurrency/monitor	(revision 310e5b7a73ac432e83f04a8d32b171a31ac8c68f)
@@ -111,5 +111,5 @@
 };
 
-int __accept_internal( unsigned short count, __acceptable_t * acceptables, int duration );
+int __waitfor_internal( unsigned short count, __acceptable_t * acceptables, int duration );
 
 // Local Variables: //
Index: src/libcfa/concurrency/monitor.c
===================================================================
--- src/libcfa/concurrency/monitor.c	(revision 1dcd955480c332b81ce157f2b7ccf8e34ad2acd3)
+++ src/libcfa/concurrency/monitor.c	(revision 310e5b7a73ac432e83f04a8d32b171a31ac8c68f)
@@ -398,5 +398,5 @@
 //-----------------------------------------------------------------------------
 // Internal scheduling
-int __accept_internal( unsigned short acc_count, __acceptable_t * acceptables ) {
+int __waitfor_internal( unsigned short acc_count, __acceptable_t * acceptables ) {
 	thread_desc * thrd = this_thread;
 
Index: src/tests/sched-ext-parse.c
===================================================================
--- src/tests/sched-ext-parse.c	(revision 1dcd955480c332b81ce157f2b7ccf8e34ad2acd3)
+++ src/tests/sched-ext-parse.c	(revision 310e5b7a73ac432e83f04a8d32b171a31ac8c68f)
@@ -16,5 +16,5 @@
 	//---------------------------------------
 	waitfor( f1, a ) {
-		1;
+		// 1;
 	}
 
@@ -80,5 +80,5 @@
 		16;
 	}
- 	or waitfor( f1, a, a ) {
+ 	or waitfor( f2, a, a ) {
 		17;
 	}
Index: src/tests/sched-ext.c
===================================================================
--- src/tests/sched-ext.c	(revision 1dcd955480c332b81ce157f2b7ccf8e34ad2acd3)
+++ src/tests/sched-ext.c	(revision 310e5b7a73ac432e83f04a8d32b171a31ac8c68f)
@@ -45,5 +45,5 @@
 	acceptable.monitors      = &a;
 
-	__accept_internal( 1, &acceptable );
+	__waitfor_internal( 1, &acceptable );
 
 	sout | "Accepted" | endl;
