diff --git a/lib/src/parser.dart b/lib/src/parser.dart
index 68c330c..ede78d5 100644
--- a/lib/src/parser.dart
+++ b/lib/src/parser.dart
@@ -170,51 +170,63 @@
     //TODO handle EOFs. i.e. check for null return from peek.
     //TODO make this EOF handling clearer.
     
-    assert(_peek().type == TokenType.lineEnd || _i == 0); //TODO expect.
-
-    //TODO _readIf(TokenType) helper.
-    var precedingLineEnd = _peek() != null && _peek().type == TokenType.lineEnd
-        ? _read() : null;
+    // Continue parsing standalone lines until we find one than isn't a
+    // standalone line.
+    bool consecutive = false;
+    while (_peek() != null) {
     
-    // The scanner guarantees that there will only be a single whitespace token,
-    // there are never consecutive whitespace tokens.
-    var precedingWhitespace =
-      _peek() != null && _peek().type == TokenType.whitespace ? _read() : null;
+      assert(_peek().type == TokenType.lineEnd || _i == 0);
+  
+      //TODO _readIf(TokenType) helper.
+      var precedingLineEnd = _peek() != null && _peek().type == TokenType.lineEnd
+          ? _read() : null;
+      
+      // The scanner guarantees that there will only be a single whitespace token,
+      // there are never consecutive whitespace tokens.
+      var precedingWhitespace =
+        _peek() != null && _peek().type == TokenType.whitespace ? _read() : null;
+          
+      Tag tag;
+      Node tagNode;
+      if (_peek() != null && _peek().type == TokenType.openDelimiter) {
+        tag = _readTag();
+        tagNode = _createNodeFromTag(tag,
+            partialIndent: precedingWhitespace == null
+              ? ''
+              : precedingWhitespace.value);
+      }
+      
+      var followingWhitespace =
+        _peek() != null && _peek().type == TokenType.whitespace ? _read() : null;
+
+      // Need to emit leading whitespace if the last line was not a standalone
+      // line. The consecutive flag keeps track of this.
+      if (precedingLineEnd != null && !consecutive) {
+        _appendTextToken(precedingLineEnd);
+      }
+      
+      if (tag != null &&
+          (_peek() == null || _peek().type == TokenType.lineEnd) &&
+          const ['#', '/', '^', '>'].contains(tag.sigil)) {
+                
+        // This is a standalone line, so do not create text nodes for whitespace,
+        // or the following newline.
+            
+        _appendTag(tag, tagNode);
+       
+        // Continue loop parse another line.
+        consecutive = true;
         
-    Tag tag;
-    Node tagNode;
-    if (_peek() != null && _peek().type == TokenType.openDelimiter) {
-      tag = _readTag();
-      tagNode = _createNodeFromTag(tag,
-          partialIndent: precedingWhitespace == null
-            ? ''
-            : precedingWhitespace.value);
-    }
-    
-    var followingWhitespace =
-      _peek() != null && _peek().type == TokenType.whitespace ? _read() : null;
-
-    if (precedingLineEnd != null) _appendTextToken(precedingLineEnd);
-    
-    if (tag != null &&
-        (_peek() == null || _peek().type == TokenType.lineEnd) &&
-        const ['#', '/', '^', '>'].contains(tag.sigil)) {
-      
-      // This is a standalone line, so do not create text nodes for whitespace,
-      // or the following newline.
-      _read();
-      _appendTag(tag, tagNode);
-      
-    } else {
-      
-      // This is not a standalone line so add the whitespace to the ast.
-      if (precedingWhitespace != null) _appendTextToken(precedingWhitespace);
-      
-      // Can be null for comment tags, or close section tags, or if this isn't
-      // a standalone line.
-      if (tag != null) _appendTag(tag, tagNode);
-      
-      if (followingWhitespace != null) _appendTextToken(followingWhitespace);
+      } else {
+  
+        // This is not a standalone line so add the whitespace to the ast.        
+        if (precedingWhitespace != null) _appendTextToken(precedingWhitespace);
+        if (tag != null) _appendTag(tag, tagNode);
+        if (followingWhitespace != null) _appendTextToken(followingWhitespace);
+        
+        // Done parsing standalone lines. Exit the loop.
+        break;
+      }
     }
   }
   
diff --git a/test/parser_test.dart b/test/parser_test.dart
index d51ea6d..b6e4612 100644
--- a/test/parser_test.dart
+++ b/test/parser_test.dart
@@ -158,6 +158,19 @@
      expect(nodes[1].children, orderedEquals([new TextNode('def\n', 13, 17)]));
    });
 
+   test('parse section standalone tag whitespace consecutive', () {
+     var source = 'abc\n{{#foo}}\ndef\n{{/foo}}\n{{#foo}}\ndef\n{{/foo}}\nghi';
+     var parser = new Parser(source, 'foo', '{{ }}', lenient: false);
+     var nodes = parser.parse();
+     expect(nodes, orderedEquals([
+       new TextNode('abc\n', 0, 4),
+       new SectionNode('foo', 4, 12, '{{ }}'),
+       new SectionNode('foo', 26, 34, '{{ }}'),
+       new TextNode('ghi', 48, 51),
+     ]));
+     expect(nodes[1].children, orderedEquals([new TextNode('def\n', 13, 17)]));
+   });
+   
    test('parse section standalone tag whitespace on first line', () {
      var source = '  {{#foo}}  \ndef\n{{/foo}}\nghi';
      var parser = new Parser(source, 'foo', '{{ }}', lenient: false);
