Index: src/Concurrency/Waitfor.cc
===================================================================
--- src/Concurrency/Waitfor.cc	(revision 695e00deb437e7e1ea8ef4dd70418cf6c70c8896)
+++ src/Concurrency/Waitfor.cc	(revision 8f98b782aebdb59bd3ba7eae826ba604a978928a)
@@ -214,5 +214,5 @@
 		}
 
-		Expression * betterIsDtor( Expression * func ) {
+		Expression * detectIsDtor( Expression * func ) {
 			VariableExpr * typed_func = extractVariable( func );
 			bool is_dtor = InitTweak::isDestructor( typed_func->var );
@@ -302,7 +302,10 @@
 			new ArrayType(
 				noQualifiers,
-				new StructInstType(
+				new PointerType(
 					noQualifiers,
-					decl_monitor
+					new StructInstType(
+						noQualifiers,
+						decl_monitor
+					)
 				),
 				new ConstantExpr( Constant::from_ulong( clause.target.arguments.size() ) ),
@@ -312,5 +315,21 @@
 			new ListInit(
 				map_range < std::list<Initializer*> > ( clause.target.arguments, [this](Expression * expr ){
-					return new SingleInit( expr );
+					Expression * untyped = new CastExpr(
+						new UntypedExpr(
+							new NameExpr( "get_monitor" ),
+							{ expr }
+						),
+						new PointerType(
+							noQualifiers,
+							new StructInstType(
+								noQualifiers,
+								decl_monitor
+							)
+						)
+					);
+
+					Expression * init = ResolvExpr::findSingleExpression( untyped, indexer );
+					delete untyped;
+					return new SingleInit( init );
 				})
 			)
@@ -328,10 +347,9 @@
 		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, "is_dtor" , detectIsDtor( clause.target.function )                                    , indexer ) );
 		compound->push_back( makeAccStatement( acceptables, index, "func"    , new CastExpr( clause.target.function, fptr_t )                            , indexer ) );
+		compound->push_back( makeAccStatement( acceptables, index, "monitors", new VariableExpr( monitors )                                              , 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" , is_dtor                                                                   , indexer ) );
 
 		stmt->push_back( new IfStmt(
Index: src/ResolvExpr/Resolver.cc
===================================================================
--- src/ResolvExpr/Resolver.cc	(revision 695e00deb437e7e1ea8ef4dd70418cf6c70c8896)
+++ src/ResolvExpr/Resolver.cc	(revision 8f98b782aebdb59bd3ba7eae826ba604a978928a)
@@ -118,26 +118,26 @@
 	}
 
+	Expression * findSingleExpression( Expression *untyped, const SymTab::Indexer &indexer ) {
+		TypeEnvironment env;
+		AlternativeFinder finder( indexer, env );
+		finder.find( untyped );
+		#if 0
+		if ( finder.get_alternatives().size() != 1 ) {
+			std::cout << "untyped expr is ";
+			untyped->print( std::cout );
+			std::cout << std::endl << "alternatives are:";
+			for ( std::list< Alternative >::const_iterator i = finder.get_alternatives().begin(); i != finder.get_alternatives().end(); ++i ) {
+				i->print( std::cout );
+			} // for
+		} // if
+		#endif
+		assertf( finder.get_alternatives().size() == 1, "findSingleExpression: must have exactly one alternative at the end." );
+		Alternative &choice = finder.get_alternatives().front();
+		Expression *newExpr = choice.expr->clone();
+		finishExpr( newExpr, choice.env );
+		return newExpr;
+	}
+
 	namespace {
-		Expression *findSingleExpression( Expression *untyped, const SymTab::Indexer &indexer ) {
-			TypeEnvironment env;
-			AlternativeFinder finder( indexer, env );
-			finder.find( untyped );
-#if 0
-			if ( finder.get_alternatives().size() != 1 ) {
-				std::cout << "untyped expr is ";
-				untyped->print( std::cout );
-				std::cout << std::endl << "alternatives are:";
-				for ( std::list< Alternative >::const_iterator i = finder.get_alternatives().begin(); i != finder.get_alternatives().end(); ++i ) {
-					i->print( std::cout );
-				} // for
-			} // if
-#endif
-			assertf( finder.get_alternatives().size() == 1, "findSingleExpression: must have exactly one alternative at the end." );
-			Alternative &choice = finder.get_alternatives().front();
-			Expression *newExpr = choice.expr->clone();
-			finishExpr( newExpr, choice.env );
-			return newExpr;
-		}
-
 		bool isIntegralType( Type *type ) {
 			if ( dynamic_cast< EnumInstType * >( type ) ) {
@@ -393,14 +393,14 @@
 	}
 
-	inline void resolveAsIf( Expression *& expr, Resolver & resolver ) {
+	inline void resolveAsIf( Expression *& expr, SymTab::Indexer & indexer ) {
 		if( !expr ) return;
-		Expression * newExpr = findSingleExpression( expr, resolver );
+		Expression * newExpr = findSingleExpression( expr, indexer );
 		delete expr;
 		expr = newExpr;
 	}
 
-	inline void resolveAsType( Expression *& expr, Type * type, Resolver & resolver ) {
+	inline void resolveAsType( Expression *& expr, Type * type, SymTab::Indexer & indexer ) {
 		if( !expr ) return;
-		Expression * newExpr = findSingleExpression( new CastExpr( expr, type ), resolver );
+		Expression * newExpr = findSingleExpression( new CastExpr( expr, type ), indexer );
 		delete expr;
 		expr = newExpr;
@@ -417,4 +417,5 @@
 
 	void Resolver::previsit( WaitForStmt * stmt ) {
+		visit_children = false;
 
 		// Resolve all clauses first
@@ -422,5 +423,5 @@
 
 			TypeEnvironment env;
-			AlternativeFinder funcFinder( *this, env );
+			AlternativeFinder funcFinder( indexer, env );
 
 			// Find all alternatives for a function in canonical form
@@ -511,5 +512,5 @@
 
 								// Check if the argument matches the parameter type in the current scope
-								if( ! unify( (*param)->get_type(), arg.expr->get_result(), resultEnv, resultNeed, resultHave, openVars, *this ) ) {
+								if( ! unify( (*param)->get_type(), arg.expr->get_result(), resultEnv, resultNeed, resultHave, openVars, this->indexer ) ) {
 									// Type doesn't match
 									stringstream ss;
@@ -573,6 +574,6 @@
 			// Resolve the conditions as if it were an IfStmt
 			// Resolve the statments normally
-			resolveAsIf( clause.condition, *this );
-			clause.statement->accept( *this );
+			resolveAsIf( clause.condition, this->indexer );
+			clause.statement->accept( *visitor );
 		}
 
@@ -582,7 +583,7 @@
 			// Resolve the conditions as if it were an IfStmt
 			// Resolve the statments normally
-			resolveAsType( stmt->timeout.time, new BasicType( noQualifiers, BasicType::LongLongUnsignedInt ), *this );
-			resolveAsIf  ( stmt->timeout.condition, *this );
-			stmt->timeout.statement->accept( *this );
+			resolveAsType( stmt->timeout.time, new BasicType( noQualifiers, BasicType::LongLongUnsignedInt ), this->indexer );
+			resolveAsIf  ( stmt->timeout.condition, this->indexer );
+			stmt->timeout.statement->accept( *visitor );
 		}
 
@@ -590,6 +591,6 @@
 			// Resolve the conditions as if it were an IfStmt
 			// Resolve the statments normally
-			resolveAsIf( stmt->orelse.condition, *this );
-			stmt->orelse.statement->accept( *this );
+			resolveAsIf( stmt->orelse.condition, this->indexer );
+			stmt->orelse.statement->accept( *visitor );
 		}
 	}
Index: src/ResolvExpr/Resolver.h
===================================================================
--- src/ResolvExpr/Resolver.h	(revision 695e00deb437e7e1ea8ef4dd70418cf6c70c8896)
+++ src/ResolvExpr/Resolver.h	(revision 8f98b782aebdb59bd3ba7eae826ba604a978928a)
@@ -29,6 +29,7 @@
 	/// Checks types and binds syntactic constructs to typed representations
 	void resolve( std::list< Declaration * > translationUnit );
-	Expression *resolveInVoidContext( Expression *expr, const SymTab::Indexer &indexer );
-	Expression *findVoidExpression( Expression *untyped, const SymTab::Indexer &indexer );
+	Expression * resolveInVoidContext( Expression *expr   , const SymTab::Indexer &indexer );
+	Expression * findVoidExpression  ( Expression *untyped, const SymTab::Indexer &indexer );
+	Expression * findSingleExpression( Expression *untyped, const SymTab::Indexer &indexer );
 	void resolveCtorInit( ConstructorInit * ctorInit, const SymTab::Indexer & indexer );
 	void resolveStmtExpr( StmtExpr * stmtExpr, const SymTab::Indexer & indexer );
Index: src/tests/.expect/sched-ext-parse.txt
===================================================================
--- src/tests/.expect/sched-ext-parse.txt	(revision 8f98b782aebdb59bd3ba7eae826ba604a978928a)
+++ src/tests/.expect/sched-ext-parse.txt	(revision 8f98b782aebdb59bd3ba7eae826ba604a978928a)
@@ -0,0 +1,18 @@
+/tmp/ccxbaJ5L.o: In function `__foo__F___1':
+/home/tdelisle/workspace/cforall/main/src/tests/sched-ext-parse.c:69: undefined reference to `__f1__F_MR2sM__1'
+/home/tdelisle/workspace/cforall/main/src/tests/sched-ext-parse.c:75: undefined reference to `____waitfor_internal__Fi_UsP15s__acceptable_ti__1'
+/home/tdelisle/workspace/cforall/main/src/tests/sched-ext-parse.c:91: undefined reference to `__f1__F_MR2sM__1'
+/home/tdelisle/workspace/cforall/main/src/tests/sched-ext-parse.c:97: undefined reference to `____waitfor_internal__Fi_UsP15s__acceptable_ti__1'
+/home/tdelisle/workspace/cforall/main/src/tests/sched-ext-parse.c:113: undefined reference to `__f2__F_MR2sM__1'
+/home/tdelisle/workspace/cforall/main/src/tests/sched-ext-parse.c:119: undefined reference to `____waitfor_internal__Fi_UsP15s__acceptable_ti__1'
+/home/tdelisle/workspace/cforall/main/src/tests/sched-ext-parse.c:135: undefined reference to `__f2__F_MR2sMMR2sM__1'
+/home/tdelisle/workspace/cforall/main/src/tests/sched-ext-parse.c:143: undefined reference to `____waitfor_internal__Fi_UsP15s__acceptable_ti__1'
+/home/tdelisle/workspace/cforall/main/src/tests/sched-ext-parse.c:164: undefined reference to `__f3__F_MR2sM__1'
+/home/tdelisle/workspace/cforall/main/src/tests/sched-ext-parse.c:172: undefined reference to `____waitfor_internal__Fi_UsP15s__acceptable_ti__1'
+/home/tdelisle/workspace/cforall/main/src/tests/sched-ext-parse.c:203: undefined reference to `____waitfor_internal__Fi_UsP15s__acceptable_ti__1'
+/home/tdelisle/workspace/cforall/main/src/tests/sched-ext-parse.c:245: undefined reference to `____waitfor_internal__Fi_UsP15s__acceptable_ti__1'
+/home/tdelisle/workspace/cforall/main/src/tests/sched-ext-parse.c:279: undefined reference to `__f1__F_MR2sM__1'
+/home/tdelisle/workspace/cforall/main/src/tests/sched-ext-parse.c:287: undefined reference to `____waitfor_internal__Fi_UsP15s__acceptable_ti__1'
+/home/tdelisle/workspace/cforall/main/src/tests/sched-ext-parse.c:321: undefined reference to `__f2__F_MR2sMMR2sM__1'
+/home/tdelisle/workspace/cforall/main/src/tests/sched-ext-parse.c:331: undefined reference to `____waitfor_internal__Fi_UsP15s__acceptable_ti__1'
+collect2: error: ld returned 1 exit status
Index: src/tests/sched-ext-parse.c
===================================================================
--- src/tests/sched-ext-parse.c	(revision 695e00deb437e7e1ea8ef4dd70418cf6c70c8896)
+++ src/tests/sched-ext-parse.c	(revision 8f98b782aebdb59bd3ba7eae826ba604a978928a)
@@ -16,5 +16,5 @@
 	//---------------------------------------
 	waitfor( f1, a ) {
-		// 1;
+		1;
 	}
 
