Index: src/AST/Convert.cpp
===================================================================
--- src/AST/Convert.cpp	(revision 07de76bb7a0e1179ac6fb9bae0cb96e709315c84)
+++ src/AST/Convert.cpp	(revision 37cdd97f319c512b8374d214748e986930e2e8f8)
@@ -493,4 +493,16 @@
 	}
 
+	const ast::Stmt * visit(const ast::SuspendStmt * node ) override final {
+		if ( inCache( node ) ) return nullptr;
+		auto stmt = new SuspendStmt();
+		stmt->then   = get<CompoundStmt>().accept1( node->then   );
+		switch(node->type) {
+			case ast::SuspendStmt::None     : stmt->type = SuspendStmt::None     ; break;
+			case ast::SuspendStmt::Coroutine: stmt->type = SuspendStmt::Coroutine; break;
+			case ast::SuspendStmt::Generator: stmt->type = SuspendStmt::Generator; break;
+		}
+		return stmtPostamble( stmt, node );
+	}
+
 	const ast::Stmt * visit( const ast::WaitForStmt * node ) override final {
 		if ( inCache( node ) ) return nullptr;
@@ -1859,4 +1871,22 @@
 	}
 
+	virtual void visit( const SuspendStmt * old ) override final {
+		if ( inCache( old ) ) return;
+		ast::SuspendStmt::Type type;
+		switch (old->type) {
+			case SuspendStmt::Coroutine: type = ast::SuspendStmt::Coroutine; break;
+			case SuspendStmt::Generator: type = ast::SuspendStmt::Generator; break;
+			case SuspendStmt::None     : type = ast::SuspendStmt::None     ; break;
+			default: abort();
+		}
+		this->node = new ast::SuspendStmt(
+			old->location,
+			GET_ACCEPT_1(then  , CompoundStmt),
+			type,
+			GET_LABELS_V(old->labels)
+		);
+		cache.emplace( old, this->node );
+	}
+
 	virtual void visit( const WaitForStmt * old ) override final {
 		if ( inCache( old ) ) return;
Index: src/AST/Fwd.hpp
===================================================================
--- src/AST/Fwd.hpp	(revision 07de76bb7a0e1179ac6fb9bae0cb96e709315c84)
+++ src/AST/Fwd.hpp	(revision 37cdd97f319c512b8374d214748e986930e2e8f8)
@@ -53,4 +53,5 @@
 class CatchStmt;
 class FinallyStmt;
+class SuspendStmt;
 class WaitForStmt;
 class WithStmt;
Index: src/AST/Pass.hpp
===================================================================
--- src/AST/Pass.hpp	(revision 07de76bb7a0e1179ac6fb9bae0cb96e709315c84)
+++ src/AST/Pass.hpp	(revision 37cdd97f319c512b8374d214748e986930e2e8f8)
@@ -111,4 +111,5 @@
 	const ast::Stmt *             visit( const ast::CatchStmt            * ) override final;
 	const ast::Stmt *             visit( const ast::FinallyStmt          * ) override final;
+	const ast::Stmt *             visit( const ast::SuspendStmt          * ) override final;
 	const ast::Stmt *             visit( const ast::WaitForStmt          * ) override final;
 	const ast::Decl *             visit( const ast::WithStmt             * ) override final;
Index: src/AST/Pass.impl.hpp
===================================================================
--- src/AST/Pass.impl.hpp	(revision 07de76bb7a0e1179ac6fb9bae0cb96e709315c84)
+++ src/AST/Pass.impl.hpp	(revision 37cdd97f319c512b8374d214748e986930e2e8f8)
@@ -823,4 +823,17 @@
 
 //--------------------------------------------------------------------------
+// FinallyStmt
+template< typename pass_t >
+const ast::Stmt * ast::Pass< pass_t >::visit( const ast::SuspendStmt * node ) {
+	VISIT_START( node );
+
+	VISIT(
+		maybe_accept( node, &SuspendStmt::then   );
+	)
+
+	VISIT_END( Stmt, node );
+}
+
+//--------------------------------------------------------------------------
 // WaitForStmt
 template< typename pass_t >
Index: src/AST/Print.cpp
===================================================================
--- src/AST/Print.cpp	(revision 07de76bb7a0e1179ac6fb9bae0cb96e709315c84)
+++ src/AST/Print.cpp	(revision 37cdd97f319c512b8374d214748e986930e2e8f8)
@@ -674,4 +674,23 @@
 		safe_print( node->body );
 		--indent;
+
+		return node;
+	}
+
+	virtual const ast::Stmt * visit( const ast::SuspendStmt * node ) override final {
+		os << "Suspend Statement";
+		switch (node->type) {
+			case ast::SuspendStmt::None     : os << " with implicit target"; break;
+			case ast::SuspendStmt::Generator: os << " for generator"; break;
+			case ast::SuspendStmt::Coroutine: os << " for coroutine"; break;
+		}
+		os << endl;
+
+		++indent;
+		if(node->then) {
+			os << indent << " with post statement :" << endl;
+			safe_print( node->then );
+		}
+		++indent;
 
 		return node;
Index: src/AST/Stmt.hpp
===================================================================
--- src/AST/Stmt.hpp	(revision 07de76bb7a0e1179ac6fb9bae0cb96e709315c84)
+++ src/AST/Stmt.hpp	(revision 37cdd97f319c512b8374d214748e986930e2e8f8)
@@ -342,4 +342,19 @@
 };
 
+/// Suspend statement
+class SuspendStmt final : public Stmt {
+public:
+	ptr<CompoundStmt> then;
+	enum Type { None, Coroutine, Generator } type = None;
+
+	SuspendStmt( const CodeLocation & loc, const CompoundStmt * then, Type type, std::vector<Label> && labels = {} )
+	: Stmt(loc, std::move(labels)), then(then), type(type) {}
+
+	const Stmt * accept( Visitor & v ) const override { return v.visit( this ); }
+private:
+	SuspendStmt * clone() const override { return new SuspendStmt{ *this }; }
+	MUTATE_FRIEND
+};
+
 /// Wait for concurrency statement `when (...) waitfor (... , ...) ... timeout(...) ... else ...`
 class WaitForStmt final : public Stmt {
Index: src/AST/Visitor.hpp
===================================================================
--- src/AST/Visitor.hpp	(revision 07de76bb7a0e1179ac6fb9bae0cb96e709315c84)
+++ src/AST/Visitor.hpp	(revision 37cdd97f319c512b8374d214748e986930e2e8f8)
@@ -47,4 +47,5 @@
     virtual const ast::Stmt *             visit( const ast::CatchStmt            * ) = 0;
     virtual const ast::Stmt *             visit( const ast::FinallyStmt          * ) = 0;
+    virtual const ast::Stmt *             visit( const ast::SuspendStmt          * ) = 0;
     virtual const ast::Stmt *             visit( const ast::WaitForStmt          * ) = 0;
     virtual const ast::Decl *             visit( const ast::WithStmt             * ) = 0;
