Index: src/CodeGen/CodeGenerator.cc
===================================================================
--- src/CodeGen/CodeGenerator.cc	(revision f265042c897846bca67d9bccada8b87b9ad4daf8)
+++ src/CodeGen/CodeGenerator.cc	(revision e4ea10b710e04f53a7de7ad019f3ee9bc1a34ed3)
@@ -943,4 +943,67 @@
 		output << ";";
 	}
+	void CodeGenerator::postvisit( CatchStmt * stmt ) {
+		assertf( ! genC, "Catch statements should not reach code generation." );
+
+		output << ((stmt->get_kind() == CatchStmt::Terminate) ?
+		"catch" : "catchResume");
+		output << "( ";
+		stmt->decl->accept( *visitor );
+		output << " ) ";
+
+		if( stmt->cond ) {
+			output << "if/when(?) (";
+			stmt->cond->accept( *visitor );
+			output << ") ";
+		}
+		stmt->body->accept( *visitor );
+	}
+
+	void CodeGenerator::postvisit( WaitForStmt * stmt ) {
+		assertf( ! genC, "Waitfor statements should not reach code generation." );
+
+		bool first = true;
+		for( auto & clause : stmt->clauses ) {
+			if(first) { output << "or "; first = false; }
+			if( clause.condition ) {
+				output << "when(";
+				stmt->timeout.condition->accept( *visitor );
+				output << ") ";
+			}
+			output << "waitfor(";
+			clause.target.function->accept( *visitor );
+			for( Expression * expr : clause.target.arguments ) {
+				output << ",";
+				expr->accept( *visitor );
+			}
+			output << ") ";
+			clause.statement->accept( *visitor );
+		}
+
+		if( stmt->timeout.statement ) {
+			output << "or ";
+			if( stmt->timeout.condition ) {
+				output << "when(";
+				stmt->timeout.condition->accept( *visitor );
+				output << ") ";
+			}
+			output << "timeout(";
+			stmt->timeout.time->accept( *visitor );
+			output << ") ";
+			stmt->timeout.statement->accept( *visitor );
+		}
+
+		if( stmt->orelse.statement ) {
+			output << "or ";
+			if( stmt->orelse.condition ) {
+				output << "when(";
+				stmt->orelse.condition->accept( *visitor );
+				output << ")";
+			}
+			output << "else ";
+			stmt->orelse.statement->accept( *visitor );
+		}
+	}
+
 
 	void CodeGenerator::postvisit( WhileStmt * whileStmt ) {
Index: src/CodeGen/CodeGenerator.h
===================================================================
--- src/CodeGen/CodeGenerator.h	(revision f265042c897846bca67d9bccada8b87b9ad4daf8)
+++ src/CodeGen/CodeGenerator.h	(revision e4ea10b710e04f53a7de7ad019f3ee9bc1a34ed3)
@@ -100,4 +100,6 @@
 		void postvisit( ReturnStmt * );
 		void postvisit( ThrowStmt * );
+		void postvisit( CatchStmt * );
+		void postvisit( WaitForStmt * );
 		void postvisit( WhileStmt * );
 		void postvisit( ForStmt * );
