Index: src/AST/Convert.cpp
===================================================================
--- src/AST/Convert.cpp	(revision f43146e411ed4e5e92fc5256b6ce039536536923)
+++ src/AST/Convert.cpp	(revision 3d9d0170b69d58d6ff9ab9c9c720c0a1697c7582)
@@ -656,4 +656,10 @@
 	}
 
+	const ast::Stmt * visit( const ast::CoforStmt * node ) override final {
+		// There is no old-AST CoforStmt, so this should never be called.
+		assert( !node );
+		return nullptr;
+	}
+
 	TypeSubstitution * convertTypeSubstitution(const ast::TypeSubstitution * src) {
 
Index: src/AST/Fwd.hpp
===================================================================
--- src/AST/Fwd.hpp	(revision f43146e411ed4e5e92fc5256b6ce039536536923)
+++ src/AST/Fwd.hpp	(revision 3d9d0170b69d58d6ff9ab9c9c720c0a1697c7582)
@@ -68,4 +68,5 @@
 class MutexStmt;
 class CorunStmt;
+class CoforStmt;
 
 class Expr;
Index: src/AST/Node.cpp
===================================================================
--- src/AST/Node.cpp	(revision f43146e411ed4e5e92fc5256b6ce039536536923)
+++ src/AST/Node.cpp	(revision 3d9d0170b69d58d6ff9ab9c9c720c0a1697c7582)
@@ -194,4 +194,6 @@
 template class ast::ptr_base< ast::CorunStmt, ast::Node::ref_type::weak >;
 template class ast::ptr_base< ast::CorunStmt, ast::Node::ref_type::strong >;
+template class ast::ptr_base< ast::CoforStmt, ast::Node::ref_type::weak >;
+template class ast::ptr_base< ast::CoforStmt, ast::Node::ref_type::strong >;
 template class ast::ptr_base< ast::Expr, ast::Node::ref_type::weak >;
 template class ast::ptr_base< ast::Expr, ast::Node::ref_type::strong >;
Index: src/AST/Pass.hpp
===================================================================
--- src/AST/Pass.hpp	(revision f43146e411ed4e5e92fc5256b6ce039536536923)
+++ src/AST/Pass.hpp	(revision 3d9d0170b69d58d6ff9ab9c9c720c0a1697c7582)
@@ -172,4 +172,5 @@
 	const ast::Stmt *             visit( const ast::MutexStmt            * ) override final;
 	const ast::Stmt *             visit( const ast::CorunStmt            * ) override final;
+	const ast::Stmt *             visit( const ast::CoforStmt            * ) override final;
 	const ast::Expr *             visit( const ast::ApplicationExpr      * ) override final;
 	const ast::Expr *             visit( const ast::UntypedExpr          * ) override final;
Index: src/AST/Pass.impl.hpp
===================================================================
--- src/AST/Pass.impl.hpp	(revision f43146e411ed4e5e92fc5256b6ce039536536923)
+++ src/AST/Pass.impl.hpp	(revision 3d9d0170b69d58d6ff9ab9c9c720c0a1697c7582)
@@ -1134,4 +1134,22 @@
 
 //--------------------------------------------------------------------------
+// CoforStmt
+template< typename core_t >
+const ast::Stmt * ast::Pass< core_t >::visit( const ast::CoforStmt * node ) {
+	VISIT_START( node );
+
+	if ( __visit_children() ) {
+		// for statements introduce a level of scope (for the initialization)
+		guard_symtab guard { *this };
+		maybe_accept( node, &CoforStmt::inits );
+		maybe_accept_top( node, &CoforStmt::cond  );
+		maybe_accept_top( node, &CoforStmt::inc   );
+		maybe_accept_as_compound( node, &CoforStmt::body  );
+	}
+
+	VISIT_END( Stmt, node );
+}
+
+//--------------------------------------------------------------------------
 // ApplicationExpr
 template< typename core_t >
Index: src/AST/Print.cpp
===================================================================
--- src/AST/Print.cpp	(revision f43146e411ed4e5e92fc5256b6ce039536536923)
+++ src/AST/Print.cpp	(revision 3d9d0170b69d58d6ff9ab9c9c720c0a1697c7582)
@@ -934,4 +934,46 @@
 	}
 
+	virtual const ast::Stmt * visit( const ast::CoforStmt * node ) override final {
+		os << "Cofor Statement" << endl;
+
+		if ( ! node->inits.empty() ) {
+			os << indent << "... initialization:" << endl;
+			++indent;
+			for ( const ast::Stmt * stmt : node->inits ) {
+				os << indent+1;
+				safe_print( stmt );
+			}
+			--indent;
+		}
+
+		if ( node->cond ) {
+			os << indent << "... condition:" << endl;
+			++indent;
+			os << indent;
+			node->cond->accept( *this );
+			--indent;
+		}
+
+		if ( node->inc ) {
+			os << indent << "... increment:" << endl;
+			++indent;
+			os << indent;
+			node->inc->accept( *this );
+			--indent;
+		}
+
+		if ( node->body ) {
+			os << indent << "... with body:" << endl;
+			++indent;
+			os << indent;
+			node->body->accept( *this );
+			--indent;
+		}
+		os << endl;
+		print( node->labels );
+
+		return node;
+	}
+
 	virtual const ast::Expr * visit( const ast::ApplicationExpr * node ) override final {
 		++indent;
Index: src/AST/Stmt.hpp
===================================================================
--- src/AST/Stmt.hpp	(revision f43146e411ed4e5e92fc5256b6ce039536536923)
+++ src/AST/Stmt.hpp	(revision 3d9d0170b69d58d6ff9ab9c9c720c0a1697c7582)
@@ -546,4 +546,22 @@
 };
 
+// Corun Statement
+class CoforStmt final : public Stmt {
+  public:
+	std::vector<ptr<Stmt>> inits;
+	ptr<Expr> cond;
+	ptr<Expr> inc;
+	ptr<Stmt> body;
+
+	CoforStmt( const CodeLocation & loc, const std::vector<ptr<Stmt>> && inits, const Expr * cond,
+			 const Expr * inc, const Stmt * body, const std::vector<Label> && label = {} )
+		: Stmt(loc, std::move(label)), inits(std::move(inits)), cond(cond), inc(inc), body(body) {}
+
+	const Stmt * accept( Visitor & v ) const override { return v.visit( this ); }
+  private:
+	CoforStmt * clone() const override { return new CoforStmt{ *this }; }
+	MUTATE_FRIEND
+};
+
 } // namespace ast
 
Index: src/AST/Visitor.hpp
===================================================================
--- src/AST/Visitor.hpp	(revision f43146e411ed4e5e92fc5256b6ce039536536923)
+++ src/AST/Visitor.hpp	(revision 3d9d0170b69d58d6ff9ab9c9c720c0a1697c7582)
@@ -60,4 +60,5 @@
     virtual const ast::Stmt *             visit( const ast::MutexStmt            * ) = 0;
     virtual const ast::Stmt *             visit( const ast::CorunStmt            * ) = 0;
+    virtual const ast::Stmt *             visit( const ast::CoforStmt            * ) = 0;
     virtual const ast::Expr *             visit( const ast::ApplicationExpr      * ) = 0;
     virtual const ast::Expr *             visit( const ast::UntypedExpr          * ) = 0;
