Index: src/AST/Convert.cpp
===================================================================
--- src/AST/Convert.cpp	(revision aeb5d0df40d6c1725a4d281a07385c12b9694732)
+++ 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 aeb5d0df40d6c1725a4d281a07385c12b9694732)
+++ 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 aeb5d0df40d6c1725a4d281a07385c12b9694732)
+++ 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 aeb5d0df40d6c1725a4d281a07385c12b9694732)
+++ 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 aeb5d0df40d6c1725a4d281a07385c12b9694732)
+++ 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 aeb5d0df40d6c1725a4d281a07385c12b9694732)
+++ 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 aeb5d0df40d6c1725a4d281a07385c12b9694732)
+++ 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;
Index: src/Common/PassVisitor.h
===================================================================
--- src/Common/PassVisitor.h	(revision aeb5d0df40d6c1725a4d281a07385c12b9694732)
+++ src/Common/PassVisitor.h	(revision 37cdd97f319c512b8374d214748e986930e2e8f8)
@@ -110,4 +110,6 @@
 	virtual void visit( FinallyStmt * finallyStmt ) override final;
 	virtual void visit( const FinallyStmt * finallyStmt ) override final;
+	virtual void visit( SuspendStmt * suspendStmt ) override final;
+	virtual void visit( const SuspendStmt * suspendStmt ) override final;
 	virtual void visit( WaitForStmt * waitforStmt ) override final;
 	virtual void visit( const WaitForStmt * waitforStmt ) override final;
@@ -276,4 +278,5 @@
 	virtual Statement * mutate( CatchStmt * catchStmt ) override final;
 	virtual Statement * mutate( FinallyStmt * finallyStmt ) override final;
+	virtual Statement * mutate( SuspendStmt * suspendStmt ) override final;
 	virtual Statement * mutate( WaitForStmt * waitforStmt ) override final;
 	virtual Declaration * mutate( WithStmt * withStmt ) override final;
Index: src/Common/PassVisitor.impl.h
===================================================================
--- src/Common/PassVisitor.impl.h	(revision aeb5d0df40d6c1725a4d281a07385c12b9694732)
+++ src/Common/PassVisitor.impl.h	(revision 37cdd97f319c512b8374d214748e986930e2e8f8)
@@ -1522,4 +1522,33 @@
 
 //--------------------------------------------------------------------------
+// SuspendStmt
+template< typename pass_type >
+void PassVisitor< pass_type >::visit( SuspendStmt * node ) {
+	VISIT_START( node );
+
+	maybeAccept_impl( node->then  , *this );
+
+	VISIT_END( node );
+}
+
+template< typename pass_type >
+void PassVisitor< pass_type >::visit( const SuspendStmt * node ) {
+	VISIT_START( node );
+
+	maybeAccept_impl( node->then  , *this );
+
+	VISIT_END( node );
+}
+
+template< typename pass_type >
+Statement * PassVisitor< pass_type >::mutate( SuspendStmt * node ) {
+	MUTATE_START( node );
+
+	maybeMutate_impl( node->then  , *this );
+
+	MUTATE_END( Statement, node );
+}
+
+//--------------------------------------------------------------------------
 // WaitForStmt
 template< typename pass_type >
Index: src/Parser/lex.ll
===================================================================
--- src/Parser/lex.ll	(revision aeb5d0df40d6c1725a4d281a07385c12b9694732)
+++ src/Parser/lex.ll	(revision 37cdd97f319c512b8374d214748e986930e2e8f8)
@@ -65,5 +65,5 @@
 #define FLOATXX(v) KEYWORD_RETURN(v);
 #else
-#define FLOATXX(v) IDENTIFIER_RETURN();	
+#define FLOATXX(v) IDENTIFIER_RETURN();
 #endif // HAVE_KEYWORDS_FLOATXX
 
@@ -301,5 +301,5 @@
 _Static_assert	{ KEYWORD_RETURN(STATICASSERT); }		// C11
 struct			{ KEYWORD_RETURN(STRUCT); }
-	/* suspend			{ KEYWORD_RETURN(SUSPEND); }			// CFA */
+suspend			{ KEYWORD_RETURN(SUSPEND); }			// CFA
 switch			{ KEYWORD_RETURN(SWITCH); }
 thread			{ KEYWORD_RETURN(THREAD); }				// C11
Index: src/Parser/parser.yy
===================================================================
--- src/Parser/parser.yy	(revision aeb5d0df40d6c1725a4d281a07385c12b9694732)
+++ src/Parser/parser.yy	(revision 37cdd97f319c512b8374d214748e986930e2e8f8)
@@ -278,5 +278,6 @@
 %token OTYPE FTYPE DTYPE TTYPE TRAIT					// CFA
 %token SIZEOF OFFSETOF
-// %token SUSPEND RESUME									// CFA
+// %token RESUME									// CFA
+%token SUSPEND									// CFA
 %token ATTRIBUTE EXTENSION								// GCC
 %token IF ELSE SWITCH CASE DEFAULT DO WHILE FOR BREAK CONTINUE GOTO RETURN
@@ -1259,8 +1260,16 @@
 	| RETURN '{' initializer_list_opt comma_opt '}' ';'
 		{ SemanticError( yylloc, "Initializer return is currently unimplemented." ); $$ = nullptr; }
-	// | SUSPEND ';'
-	//   	{ SemanticError( yylloc, "Suspend expression is currently unimplemented." ); $$ = nullptr; }
-	// | SUSPEND compound_statement ';'
-	//   	{ SemanticError( yylloc, "Suspend expression is currently unimplemented." ); $$ = nullptr; }
+	| SUSPEND ';'
+	  	{ SemanticError( yylloc, "Suspend expression is currently unimplemented." ); $$ = nullptr; }
+	| SUSPEND compound_statement ';'
+	  	{ SemanticError( yylloc, "Suspend expression is currently unimplemented." ); $$ = nullptr; }
+	| SUSPEND COROUTINE ';'
+	  	{ SemanticError( yylloc, "Suspend expression is currently unimplemented." ); $$ = nullptr; }
+	| SUSPEND COROUTINE compound_statement
+	  	{ SemanticError( yylloc, "Suspend expression is currently unimplemented." ); $$ = nullptr; }
+	| SUSPEND GENERATOR ';'
+	  	{ SemanticError( yylloc, "Suspend expression is currently unimplemented." ); $$ = nullptr; }
+	| SUSPEND GENERATOR compound_statement
+	  	{ SemanticError( yylloc, "Suspend expression is currently unimplemented." ); $$ = nullptr; }
 	| THROW assignment_expression_opt ';'				// handles rethrow
 		{ $$ = new StatementNode( build_throw( $2 ) ); }
Index: src/SynTree/Mutator.h
===================================================================
--- src/SynTree/Mutator.h	(revision aeb5d0df40d6c1725a4d281a07385c12b9694732)
+++ src/SynTree/Mutator.h	(revision 37cdd97f319c512b8374d214748e986930e2e8f8)
@@ -51,4 +51,5 @@
 	virtual Statement * mutate( CatchStmt * catchStmt ) = 0;
 	virtual Statement * mutate( FinallyStmt * catchStmt ) = 0;
+	virtual Statement * mutate( SuspendStmt * suspendStmt ) = 0;
 	virtual Statement * mutate( WaitForStmt * waitforStmt ) = 0;
 	virtual Declaration * mutate( WithStmt * withStmt ) = 0;
Index: src/SynTree/Statement.cc
===================================================================
--- src/SynTree/Statement.cc	(revision aeb5d0df40d6c1725a4d281a07385c12b9694732)
+++ src/SynTree/Statement.cc	(revision 37cdd97f319c512b8374d214748e986930e2e8f8)
@@ -420,4 +420,29 @@
 }
 
+SuspendStmt::SuspendStmt( const SuspendStmt & other )
+	: Statement( other )
+	, then( maybeClone(other.then) )
+{}
+
+SuspendStmt::~SuspendStmt() {
+	delete then;
+}
+
+void SuspendStmt::print( std::ostream & os, Indenter indent ) const {
+	os << "Suspend Statement";
+	switch (type) {
+		case None     : os << " with implicit target"; break;
+		case Generator: os << " for generator"       ; break;
+		case Coroutine: os << " for coroutine"       ; break;
+	}
+	os << endl;
+	indent += 1;
+
+	if(then) {
+		os << indent << " with post statement :" << endl;
+		then->print( os, indent + 1);
+	}
+}
+
 WaitForStmt::WaitForStmt() : Statement() {
 	timeout.time      = nullptr;
Index: src/SynTree/Statement.h
===================================================================
--- src/SynTree/Statement.h	(revision aeb5d0df40d6c1725a4d281a07385c12b9694732)
+++ src/SynTree/Statement.h	(revision 37cdd97f319c512b8374d214748e986930e2e8f8)
@@ -422,4 +422,20 @@
 };
 
+class SuspendStmt : public Statement {
+  public:
+	CompoundStmt * then = nullptr;
+	enum { None, Coroutine, Generator } type = None;
+
+	SuspendStmt() = default;
+	SuspendStmt( const SuspendStmt & );
+	virtual ~SuspendStmt();
+
+	virtual SuspendStmt * clone() const override { return new SuspendStmt( *this ); }
+	virtual void accept( Visitor & v ) override { v.visit( this ); }
+	virtual void accept( Visitor & v ) const override { v.visit( this ); }
+	virtual Statement * acceptMutator( Mutator & m )  override { return m.mutate( this ); }
+	virtual void print( std::ostream & os, Indenter indent = {} ) const override;
+};
+
 class WaitForStmt : public Statement {
   public:
Index: src/SynTree/SynTree.h
===================================================================
--- src/SynTree/SynTree.h	(revision aeb5d0df40d6c1725a4d281a07385c12b9694732)
+++ src/SynTree/SynTree.h	(revision 37cdd97f319c512b8374d214748e986930e2e8f8)
@@ -54,4 +54,5 @@
 class CatchStmt;
 class FinallyStmt;
+class SuspendStmt;
 class WaitForStmt;
 class WithStmt;
Index: src/SynTree/Visitor.h
===================================================================
--- src/SynTree/Visitor.h	(revision aeb5d0df40d6c1725a4d281a07385c12b9694732)
+++ src/SynTree/Visitor.h	(revision 37cdd97f319c512b8374d214748e986930e2e8f8)
@@ -78,4 +78,6 @@
 	virtual void visit( FinallyStmt * node ) { visit( const_cast<const FinallyStmt *>(node) ); }
 	virtual void visit( const FinallyStmt * finallyStmt ) = 0;
+	virtual void visit( SuspendStmt * node ) { visit( const_cast<const SuspendStmt *>(node) ); }
+	virtual void visit( const SuspendStmt * suspendStmt ) = 0;
 	virtual void visit( WaitForStmt * node ) { visit( const_cast<const WaitForStmt *>(node) ); }
 	virtual void visit( const WaitForStmt * waitforStmt ) = 0;
