diff --git a/lib/src/lambda_context.dart b/lib/src/lambda_context.dart
index 13f8f6a..465dc65 100644
--- a/lib/src/lambda_context.dart
+++ b/lib/src/lambda_context.dart
@@ -60,17 +60,15 @@
     
     if (_node is! SectionNode) return '';
     
-    var nodes = (_node as SectionNode).children;
+    SectionNode node = _node;
+    
+    var nodes = node.children;
     
     if (nodes.isEmpty) return '';
     
-    if (nodes.length == 1 && nodes.first is TextNode)
-      return nodes.first.text;
+    if (nodes.length == 1 && nodes.first is TextNode) return nodes.first.text;
     
-    var source = _context.source.substring(
-        _node.contentStart, _node.contentEnd);
-    
-    return source;
+    return _context.source.substring(node.contentStart, node.contentEnd);
   }
 
   /// Evaluate the string as a mustache template using the current context.
diff --git a/lib/src/node.dart b/lib/src/node.dart
index 5228486..670f453 100644
--- a/lib/src/node.dart
+++ b/lib/src/node.dart
@@ -33,11 +33,7 @@
   // or inverse section, then this stores the start of the content of the
   // section.
   final int start;
-  final int end;
-  
-  int contentStart;
-  int contentEnd;
-  
+  final int end;  
 }
 
 
@@ -157,16 +153,17 @@
   
   SectionNode(this.name, int start, int end, this.delimiters,
       {this.inverse: false})
-    : super(start, end);
+    : contentStart = end,
+      super(start, end);
   
   final String name;
   final String delimiters;
   final bool inverse;
-  int contentStart;
-  int contentEnd;
+  final int contentStart;
+  int contentEnd; // Set in parser when close tag is parsed.
   final List<Node> children = <Node>[];
 
-  toString() => '(SectionNode $name inverse: $inverse)';
+  toString() => '(SectionNode $name inverse: $inverse $start $end)';
   
   // TODO Only used for testing.
   //FIXME use deepequals in test for comparing children.
@@ -175,7 +172,8 @@
       && name == o.name
       && delimiters == o.delimiters
       && inverse == o.inverse
-      && contentStart == o.contentEnd;
+      && start == o.start
+      && end == o.end;
   
   // TODO hashcode. import quiver.
 
diff --git a/lib/src/parser.dart b/lib/src/parser.dart
index cd55bce..68c330c 100644
--- a/lib/src/parser.dart
+++ b/lib/src/parser.dart
@@ -96,9 +96,10 @@
       // Close section tag
       case '/':
         if (tag.name != _stack.last.name) throw 'boom!'; //TODO error message.
-        _stack.removeLast();
-        break;
-      
+        var node = _stack.removeLast();
+        node.contentEnd = tag.start;
+        break;        
+        
       default:
         if (node != null) _stack.last.children.add(node);
     }
@@ -113,7 +114,10 @@
     _currentDelimiters = _delimiters;
     
     _stack.add(new SectionNode('root', 0, 0, _delimiters));    
-        
+  
+    // Handle standalone tag on first line.
+    _parseLine();
+    
     for (var token = _peek(); token != null; token = _peek()) {
       switch(token.type) {
         
@@ -134,8 +138,6 @@
           _currentDelimiters = token.value;
           break;
           
-        //TODO think about this. It looks like this loop will usually just call
-        // into parseLine(). May be able to simplify the logic.
         case TokenType.lineEnd:
           //TODO the first line can be a standalone line too, and there is
           // no lineEnd. Perhaps _parseLine(firstLine: true)?
@@ -168,8 +170,11 @@
     //TODO handle EOFs. i.e. check for null return from peek.
     //TODO make this EOF handling clearer.
     
-    assert(_peek().type == TokenType.lineEnd); //TODO expect.
-    var precedingLineEnd = _read();
+    assert(_peek().type == TokenType.lineEnd || _i == 0); //TODO expect.
+
+    //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.
@@ -197,7 +202,7 @@
       
       // This is a standalone line, so do not create text nodes for whitespace,
       // or the following newline.
-
+      _read();
       _appendTag(tag, tagNode);
       
     } else {
diff --git a/test/parser_test.dart b/test/parser_test.dart
index 4914886..d51ea6d 100644
--- a/test/parser_test.dart
+++ b/test/parser_test.dart
@@ -152,7 +152,7 @@
      var nodes = parser.parse();
      expect(nodes, orderedEquals([
        new TextNode('abc\n', 0, 4),
-       new SectionNode('foo', 4, 25, '{{ }}'),
+       new SectionNode('foo', 4, 12, '{{ }}'),
        new TextNode('ghi', 26, 29)
      ]));
      expect(nodes[1].children, orderedEquals([new TextNode('def\n', 13, 17)]));
