Index: src/AST/Print.cpp
===================================================================
--- src/AST/Print.cpp	(revision bfa7bf0d6e9d62479e746302c0d02bbf4ed4c0ed)
+++ src/AST/Print.cpp	(revision 88bc8767b6502fe26936931ac4d52200490e035d)
@@ -566,6 +566,4 @@
 		++indent;
 		safe_print( node->cond );
-		os << indent-1 << "... with body:" << endl;
-		safe_print( node->body );
 
 		if ( ! node->inits.empty() ) {
@@ -573,4 +571,14 @@
 			printAll( node->inits );
 		}
+
+		os << indent-1 << "... with body:" << endl;
+		safe_print( node->body );
+
+		if ( node->else_ ) {
+			os << indent-1 << "... with else:" << endl;
+			os << indent;
+			node->else_->accept( *this );
+		}
+
 		--indent;
 
@@ -614,4 +622,13 @@
 			--indent;
 		}
+
+		if ( node->else_ ) {
+			os << indent << "... with else:" << endl;
+			++indent;
+			os << indent;
+			node->else_->accept( *this );
+			--indent;
+		}
+
 		os << endl;
 		print( node->labels );
Index: src/CodeGen/CodeGenerator.cpp
===================================================================
--- src/CodeGen/CodeGenerator.cpp	(revision bfa7bf0d6e9d62479e746302c0d02bbf4ed4c0ed)
+++ src/CodeGen/CodeGenerator.cpp	(revision 88bc8767b6502fe26936931ac4d52200490e035d)
@@ -1195,10 +1195,12 @@
 	stmt->body->accept( *visitor );
 
-	output << indent;
-
 	if ( stmt->isDoWhile ) {
 		output << " while (";
 		stmt->cond->accept( *visitor );
-		output << ");";
+		output << ( ( nullptr == stmt->else_ ) ? ");" : ")" );
+	}
+	if ( stmt->else_ ) {
+		output << " else ";
+		stmt->else_->accept( *visitor );
 	}
 }
@@ -1225,4 +1227,10 @@
 		stmt->body->accept( *visitor );
 	}
+
+	if ( nullptr != stmt->else_ ) {
+		assertf( !options.genC, "Loop else should not reach code generation." );
+		output << " else ";
+		stmt->else_->accept( *visitor );
+	}
 }
 
Index: src/ControlStruct/MultiLevelExit.cpp
===================================================================
--- src/ControlStruct/MultiLevelExit.cpp	(revision bfa7bf0d6e9d62479e746302c0d02bbf4ed4c0ed)
+++ src/ControlStruct/MultiLevelExit.cpp	(revision 88bc8767b6502fe26936931ac4d52200490e035d)
@@ -78,4 +78,5 @@
 		stmt( stmt ), firstTarget( breakExit ), secondTarget(), kind( TryStmtK ) {}
 
+	// Check if this entry can be the target of the given type of control flow.
 	bool isContTarget() const { return kind <= WhileDoStmtK; }
 	bool isBreakTarget() const { return kind != CaseClauseK; }
@@ -207,5 +208,5 @@
 
 	// If the label is empty, do not add unused attribute.
-  if ( originalTarget.empty() ) return size;
+	if ( originalTarget.empty() ) return size;
 
 	// Search for a label that matches the originalTarget.
@@ -343,4 +344,5 @@
 		assert(0);
 	}
+	assert( !exitLabel.empty() );
 
 	// Add unused attribute to silence warnings.
@@ -486,7 +488,5 @@
 		}
 
-		auto caseStmt = mutStmt->cases.back().get();
-		auto mutCase = mutate( caseStmt );
-		mutStmt->cases.back() = mutCase;
+		auto mutCase = mutStmt->cases.back().get_and_mutate();
 
 		Label label( mutCase->location, "breakLabel" );
@@ -597,14 +597,14 @@
 template<typename LoopNode>
 void MultiLevelExitCore::prehandleLoopStmt( const LoopNode * loopStmt ) {
-	// Remember is loop before going onto mutate the body.
+	// Create temporary labels and mark the enclosing loop before traversal.
 	// The labels will be folded in if they are used.
 	Label breakLabel = newLabel( "loopBreak", loopStmt );
 	Label contLabel = newLabel( "loopContinue", loopStmt );
 	enclosing_control_structures.emplace_back( loopStmt, breakLabel, contLabel );
-	// labels are added temporarily to see if they are used and then added permanently in postvisit if ther are used
-	// children will tag labels as being used during their traversal which occurs before postvisit
-
-	// GuardAction calls the lambda after the node is done being visited
+
 	GuardAction( [this](){ enclosing_control_structures.pop_back(); } );
+
+	// Because of fixBlock, this should be empty now (and must be).
+	assert( nullptr == loopStmt->else_ );
 }
 
@@ -617,7 +617,4 @@
 	// Now check if the labels are used and add them if so.
 	return mutate_field( loopStmt, &LoopNode::body, mutateLoop( loopStmt->body, entry ) );
-	// this call to mutate_field compares loopStmt->body and the result of mutateLoop
-	// 		if they are the same the node isn't mutated, if they differ then the new mutated node is returned
-	// 		the stmts will only differ if a label is used
 }
 
@@ -639,33 +636,46 @@
 
 		ptr<Stmt> else_stmt = nullptr;
-		const Stmt * loop_kid = nullptr;
+		const Stmt * to_visit;
 		// check if loop node and if so add else clause if it exists
-		const WhileDoStmt * whilePtr = kid.as<WhileDoStmt>();
-		if ( whilePtr && whilePtr->else_ ) {
-			else_stmt = whilePtr->else_;
-			loop_kid = mutate_field( whilePtr, &WhileDoStmt::else_, nullptr );
-		}
-		const ForStmt * forPtr = kid.as<ForStmt>();
-		if ( forPtr && forPtr->else_ ) {
-			else_stmt = forPtr->else_;
-			loop_kid = mutate_field( forPtr, &ForStmt::else_, nullptr );
-		}
-
+		if ( auto ptr = kid.as<WhileDoStmt>() ; ptr && ptr->else_ ) {
+			else_stmt = ptr->else_;
+			to_visit = mutate_field( ptr, &WhileDoStmt::else_, nullptr );
+		} else if ( auto ptr = kid.as<ForStmt>() ; ptr && ptr->else_ ) {
+			else_stmt = ptr->else_;
+			to_visit = mutate_field( ptr, &ForStmt::else_, nullptr );
+		} else {
+			to_visit = kid.get();
+		}
+
+		// This is the main (safe) visit of the child node.
 		try {
-			if (else_stmt) ret.push_back( loop_kid->accept( *visitor ) );
-			else ret.push_back( kid->accept( *visitor ) );
+			ret.push_back( to_visit->accept( *visitor ) );
 		} catch ( SemanticErrorException & e ) {
 			errors.append( e );
 		}
 
-		if (else_stmt) ret.push_back(else_stmt);
-
-		if ( ! break_label.empty() ) {
+		// The following sections handle visiting loop else clause and makes
+		// sure breaking from a loop body does not execute that clause.
+		Label local_break_label = std::move( break_label );
+		break_label = Label( CodeLocation(), "" );
+
+		if ( else_stmt ) try {
+			ret.push_back( else_stmt->accept( *visitor ) );
+		} catch ( SemanticErrorException & e ) {
+			errors.append( e );
+		}
+
+		if ( !break_label.empty() ) {
 			ret.push_back( labelledNullStmt( ret.back()->location, break_label ) );
 			break_label = Label( CodeLocation(), "" );
 		}
-	}
-
-	if ( ! errors.isEmpty() ) {
+
+		// This handles a break from the body or non-loop statement.
+		if ( !local_break_label.empty() ) {
+			ret.push_back( labelledNullStmt( ret.back()->location, local_break_label ) );
+		}
+	}
+
+	if ( !errors.isEmpty() ) {
 		throw errors;
 	}
