Index: src/SynTree/Mutator.h
===================================================================
--- src/SynTree/Mutator.h	(revision 60a80627d0a7fda17787b753d33a741d3719f79a)
+++ 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 60a80627d0a7fda17787b753d33a741d3719f79a)
+++ 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 60a80627d0a7fda17787b753d33a741d3719f79a)
+++ 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 60a80627d0a7fda17787b753d33a741d3719f79a)
+++ 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 60a80627d0a7fda17787b753d33a741d3719f79a)
+++ 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;
