Index: src/Parser/ParseNode.h
===================================================================
--- src/Parser/ParseNode.h	(revision 0a2168f70d19fcd419798e37c616d95122265421)
+++ src/Parser/ParseNode.h	(revision a4d188fa9bbc44789d6a360cac9dc109d8e4774c)
@@ -392,5 +392,5 @@
 
 Statement * build_if( IfCtl * ctl, StatementNode * then_stmt, StatementNode * else_stmt );
-Statement * build_switch( ExpressionNode * ctl, StatementNode * stmt );
+Statement * build_switch( bool isSwitch, ExpressionNode * ctl, StatementNode * stmt );
 Statement * build_case( ExpressionNode * ctl );
 Statement * build_default();
Index: src/Parser/StatementNode.cc
===================================================================
--- src/Parser/StatementNode.cc	(revision 0a2168f70d19fcd419798e37c616d95122265421)
+++ src/Parser/StatementNode.cc	(revision a4d188fa9bbc44789d6a360cac9dc109d8e4774c)
@@ -10,6 +10,6 @@
 // Created On       : Sat May 16 14:59:41 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Fri Sep  1 23:25:23 2017
-// Update Count     : 346
+// Last Modified On : Thu Mar  8 14:31:32 2018
+// Update Count     : 348
 //
 
@@ -116,7 +116,16 @@
 }
 
-Statement *build_switch( ExpressionNode *ctl, StatementNode *stmt ) {
+Statement *build_switch( bool isSwitch, ExpressionNode *ctl, StatementNode *stmt ) {
 	std::list< Statement * > branches;
 	buildMoveList< Statement, StatementNode >( stmt, branches );
+	if ( ! isSwitch ) {										// choose statement
+		for ( Statement * stmt : branches ) {
+			CaseStmt * caseStmt = strict_dynamic_cast< CaseStmt * >( stmt );
+			if ( ! caseStmt->stmts.empty() ) {			// code after "case" => end of case list
+				CompoundStmt * block = strict_dynamic_cast< CompoundStmt * >( caseStmt->stmts.front() );
+				block->kids.push_back( new BranchStmt( "", BranchStmt::Break ) );
+			} // if
+		} // for
+	} // if
 	// branches.size() == 0 for switch (...) {}, i.e., no declaration or statements
 	return new SwitchStmt( maybeMoveBuild< Expression >(ctl), branches );
Index: src/Parser/parser.yy
===================================================================
--- src/Parser/parser.yy	(revision 0a2168f70d19fcd419798e37c616d95122265421)
+++ src/Parser/parser.yy	(revision a4d188fa9bbc44789d6a360cac9dc109d8e4774c)
@@ -10,6 +10,6 @@
 // Created On       : Sat Sep  1 20:22:55 2001
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Feb 22 17:48:54 2018
-// Update Count     : 3028
+// Last Modified On : Fri Mar  9 11:37:35 2018
+// Update Count     : 3075
 //
 
@@ -254,8 +254,7 @@
 %type<sn> statement_decl				statement_decl_list			statement_list_nodecl
 %type<sn> selection_statement
-%type<sn> switch_clause_list_opt		switch_clause_list			choose_clause_list_opt		choose_clause_list
+%type<sn> switch_clause_list_opt		switch_clause_list
 %type<en> case_value
 %type<sn> case_clause					case_value_list				case_label					case_label_list
-%type<sn> fall_through					fall_through_opt
 %type<sn> iteration_statement			jump_statement
 %type<sn> expression_statement			asm_statement
@@ -917,8 +916,8 @@
 		{ $$ = new StatementNode( build_if( $4, $6, $8 ) ); }
 	| SWITCH '(' comma_expression ')' case_clause
-		{ $$ = new StatementNode( build_switch( $3, $5 ) ); }
+		{ $$ = new StatementNode( build_switch( true, $3, $5 ) ); }
 	| SWITCH '(' comma_expression ')' '{' push declaration_list_opt switch_clause_list_opt '}' // CFA
 		{
-			StatementNode *sw = new StatementNode( build_switch( $3, $8 ) );
+			StatementNode *sw = new StatementNode( build_switch( true, $3, $8 ) );
 			// The semantics of the declaration list is changed to include associated initialization, which is performed
 			// *before* the transfer to the appropriate case clause by hoisting the declarations into a compound
@@ -929,8 +928,8 @@
 		}
 	| CHOOSE '(' comma_expression ')' case_clause		// CFA
-		{ $$ = new StatementNode( build_switch( $3, $5 ) ); }
-	| CHOOSE '(' comma_expression ')' '{' push declaration_list_opt choose_clause_list_opt '}' // CFA
-		{
-			StatementNode *sw = new StatementNode( build_switch( $3, $8 ) );
+		{ $$ = new StatementNode( build_switch( false, $3, $5 ) ); }
+	| CHOOSE '(' comma_expression ')' '{' push declaration_list_opt switch_clause_list_opt '}' // CFA
+		{
+			StatementNode *sw = new StatementNode( build_switch( false, $3, $8 ) );
 			$$ = $7 ? new StatementNode( build_compound( (StatementNode *)((new StatementNode( $7 ))->set_last( sw )) ) ) : sw;
 		}
@@ -970,4 +969,10 @@
 	;
 
+//label_list_opt:
+//	// empty
+//	| identifier_or_type_name ':'
+//	| label_list_opt identifier_or_type_name ':'
+//	;
+
 case_label_list:										// CFA
 	case_label
@@ -990,39 +995,4 @@
 	| switch_clause_list case_label_list statement_list_nodecl
 		{ $$ = (StatementNode *)( $1->set_last( $2->append_last_case( new StatementNode( build_compound( $3 ) ) ) ) ); }
-	;
-
-choose_clause_list_opt:									// CFA
-	// empty
-		{ $$ = nullptr; }
-	| choose_clause_list
-	;
-
-choose_clause_list:										// CFA
-	case_label_list fall_through
-		{ $$ = $1->append_last_case( $2 ); }
-	| case_label_list statement_list_nodecl fall_through_opt
-		{ $$ = $1->append_last_case( new StatementNode( build_compound( (StatementNode *)$2->set_last( $3 ) ) ) ); }
-	| choose_clause_list case_label_list fall_through
-		{ $$ = (StatementNode *)( $1->set_last( $2->append_last_case( $3 ))); }
-	| choose_clause_list case_label_list statement_list_nodecl fall_through_opt
-		{ $$ = (StatementNode *)( $1->set_last( $2->append_last_case( new StatementNode( build_compound( (StatementNode *)$3->set_last( $4 ) ) ) ) ) ); }
-	;
-
-fall_through_opt:										// CFA
-	// empty
-		{ $$ = new StatementNode( build_branch( BranchStmt::Break ) ); } // insert implicit break
-	| fall_through
-	;
-
-fall_through_name:										// CFA
-	FALLTHRU
-	| FALLTHROUGH
-	;
-
-fall_through:											// CFA
-	fall_through_name
-		{ $$ = nullptr; }
-	| fall_through_name ';'
-		{ $$ = nullptr; }
 	;
 
@@ -1050,4 +1020,11 @@
 		// whereas normal operator precedence yields goto (*i)+3;
 		{ $$ = new StatementNode( build_computedgoto( $3 ) ); }
+		// A semantic check is required to ensure fallthru appears only in the body of a choose statement.
+    | fall_through_name ';'								// CFA
+		{ $$ = new StatementNode( build_branch( BranchStmt::FallThrough ) ); }
+    | fall_through_name identifier_or_type_name ';'		// CFA
+		{ $$ = new StatementNode( build_branch( $2, BranchStmt::FallThrough ) ); }
+	| fall_through_name DEFAULT ';'						// CFA
+		{ $$ = new StatementNode( build_branch( BranchStmt::FallThroughDefault ) ); }
 	| CONTINUE ';'
 		// A semantic check is required to ensure this statement appears only in the body of an iteration statement.
@@ -1076,4 +1053,9 @@
 	;
 
+fall_through_name:										// CFA
+	FALLTHRU
+	| FALLTHROUGH
+	;
+
 with_statement:
 	WITH '(' tuple_expression_list ')' statement
@@ -1090,6 +1072,5 @@
 
 when_clause:
-	WHEN '(' comma_expression ')'
-		{ $$ = $3; }
+	WHEN '(' comma_expression ')'				{ $$ = $3; }
 	;
 
@@ -1115,6 +1096,5 @@
 
 timeout:
-	TIMEOUT '(' comma_expression ')'
- 		{ $$ = $3; }
+	TIMEOUT '(' comma_expression ')'	 		{ $$ = $3; }
 	;
 
@@ -1159,20 +1139,14 @@
 	//empty
 		{ $$ = nullptr; }
-	| ';' conditional_expression
-		{ $$ = $2; }
+	| ';' conditional_expression				{ $$ = $2; }
 	;
 
 handler_key:
-	CATCH
-		{ $$ = CatchStmt::Terminate; }
-	| CATCHRESUME
-		{ $$ = CatchStmt::Resume; }
+	CATCH										{ $$ = CatchStmt::Terminate; }
+	| CATCHRESUME								{ $$ = CatchStmt::Resume; }
 	;
 
 finally_clause:
-	FINALLY compound_statement
-		{
-			$$ = new StatementNode( build_finally( $2 ) );
-		}
+	FINALLY compound_statement					{ $$ = new StatementNode( build_finally( $2 ) ); }
 	;
 
@@ -2413,5 +2387,5 @@
 			$$ = $2;
 		}
-	| forall '{' external_definition_list '}'			// CFA, namespace
+	| type_qualifier_list '{' external_definition_list '}'			// CFA, namespace
 	;
 
