Index: src/Parser/ParseNode.h
===================================================================
--- src/Parser/ParseNode.h	(revision 9867cdb2b3e0aa40bc00a118a6453ff976bf5afd)
+++ src/Parser/ParseNode.h	(revision ff489bf755a394aca4b40bb42c0ae17e78de5d2d)
@@ -428,4 +428,5 @@
 Statement * build_asm( bool voltile, Expression * instruction, ExpressionNode * output = nullptr, ExpressionNode * input = nullptr, ExpressionNode * clobber = nullptr, LabelNode * gotolabels = nullptr );
 Statement * build_directive( std::string * directive );
+SuspendStmt * build_suspend( StatementNode *, SuspendStmt::Type = SuspendStmt::None);
 WaitForStmt * build_waitfor( ExpressionNode * target, StatementNode * stmt, ExpressionNode * when );
 WaitForStmt * build_waitfor( ExpressionNode * target, StatementNode * stmt, ExpressionNode * when, WaitForStmt * existing );
Index: src/Parser/StatementNode.cc
===================================================================
--- src/Parser/StatementNode.cc	(revision 9867cdb2b3e0aa40bc00a118a6453ff976bf5afd)
+++ src/Parser/StatementNode.cc	(revision ff489bf755a394aca4b40bb42c0ae17e78de5d2d)
@@ -249,4 +249,19 @@
 } // build_finally
 
+SuspendStmt * build_suspend( StatementNode * then, SuspendStmt::Type type ) {
+	auto node = new SuspendStmt();
+
+	node->type = type;
+
+	std::list< Statement * > stmts;
+	buildMoveList< Statement, StatementNode >( then, stmts );
+	if(!stmts.empty()) {
+		assert( stmts.size() == 1 );
+		node->then = dynamic_cast< CompoundStmt * >( stmts.front() );
+	}
+
+	return node;
+}
+
 WaitForStmt * build_waitfor( ExpressionNode * targetExpr, StatementNode * stmt, ExpressionNode * when ) {
 	auto node = new WaitForStmt();
Index: src/Parser/TypeData.cc
===================================================================
--- src/Parser/TypeData.cc	(revision 9867cdb2b3e0aa40bc00a118a6453ff976bf5afd)
+++ src/Parser/TypeData.cc	(revision ff489bf755a394aca4b40bb42c0ae17e78de5d2d)
@@ -769,4 +769,5 @@
 	  case AggregateDecl::Struct:
 	  case AggregateDecl::Coroutine:
+	  case AggregateDecl::Generator:
 	  case AggregateDecl::Monitor:
 	  case AggregateDecl::Thread:
Index: src/Parser/lex.ll
===================================================================
--- src/Parser/lex.ll	(revision 9867cdb2b3e0aa40bc00a118a6453ff976bf5afd)
+++ src/Parser/lex.ll	(revision ff489bf755a394aca4b40bb42c0ae17e78de5d2d)
@@ -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 9867cdb2b3e0aa40bc00a118a6453ff976bf5afd)
+++ src/Parser/parser.yy	(revision ff489bf755a394aca4b40bb42c0ae17e78de5d2d)
@@ -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
@@ -1265,8 +1266,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 ';'
+		{ $$ = new StatementNode( build_suspend( nullptr ) ); }
+	| SUSPEND compound_statement
+		{ $$ = new StatementNode( build_suspend( $2 ) ); }
+	| SUSPEND COROUTINE ';'
+		{ $$ = new StatementNode( build_suspend( nullptr, SuspendStmt::Coroutine ) ); }
+	| SUSPEND COROUTINE compound_statement
+		{ $$ = new StatementNode( build_suspend( $3, SuspendStmt::Coroutine ) ); }
+	| SUSPEND GENERATOR ';'
+		{ $$ = new StatementNode( build_suspend( nullptr, SuspendStmt::Generator ) ); }
+	| SUSPEND GENERATOR compound_statement
+		{ $$ = new StatementNode( build_suspend( $3, SuspendStmt::Generator ) ); }
 	| THROW assignment_expression_opt ';'				// handles rethrow
 		{ $$ = new StatementNode( build_throw( $2 ) ); }
@@ -2083,5 +2092,5 @@
 aggregate_control:										// CFA
 	GENERATOR
-		{ SemanticError( yylloc, "generator is currently unimplemented." ); $$ = AggregateDecl::NoAggregate; }
+		{ yyy = true; $$ = AggregateDecl::Generator; }
 	| MONITOR GENERATOR
 		{ SemanticError( yylloc, "monitor generator is currently unimplemented." ); $$ = AggregateDecl::NoAggregate; }
