diff --git a/lib/mustache.dart b/lib/mustache.dart
index 9d5683b..9dd87b7 100644
--- a/lib/mustache.dart
+++ b/lib/mustache.dart
@@ -21,7 +21,7 @@
       {bool lenient,
        bool htmlEscapeValues,
        String name,
-       PartialResolver partialResolver}) = impl.TemplateImpl.fromSource;
+       PartialResolver partialResolver}) = impl.Template.fromSource;
   
   String get name;
   String get source;
diff --git a/lib/src/lambda_context.dart b/lib/src/lambda_context.dart
index c5b9a73..135a23e 100644
--- a/lib/src/lambda_context.dart
+++ b/lib/src/lambda_context.dart
@@ -1,14 +1,14 @@
 part of mustache.impl;
 
 /// Passed as an argument to a mustache lambda function.
-class _LambdaContext implements LambdaContext {
+class LambdaContext implements m.LambdaContext {
   
-  final _Node _node;
-  final _RenderContext _context;
+  final Node _node;
+  final RenderContext _context;
   final bool _isSection;
   bool _closed = false;
   
-  _LambdaContext(this._node, this._context, {bool isSection: true})
+  LambdaContext(this._node, this._context, {bool isSection: true})
       : _isSection = isSection;
   
   void close() {
@@ -36,10 +36,10 @@
   }
 
   void _renderSubtree(StringSink sink, Object value) {
-    var ctx = new _RenderContext.subtree(_context, sink);
+    var ctx = new RenderContext.subtree(_context, sink);
     _SectionNode section = _node;
     if (value != null) ctx.push(value);
-    _renderWithContext(ctx, section.children);
+    renderWithContext(ctx, section.children);
   }
   
   void render({Object value}) {
@@ -85,12 +85,12 @@
       delimiters = node.delimiters;
     }
     
-    var nodes = _parse(source,
+    var nodes = parse(source,
         _context.lenient,
         _context.templateName,
         delimiters);
     
-    var ctx = new _RenderContext.lambda(
+    var ctx = new RenderContext.lambda(
         _context,
         source,
         _context.indent,
@@ -98,7 +98,7 @@
         delimiters);
     
     if (value != null) ctx.push(value);
-    _renderWithContext(ctx, nodes);
+    renderWithContext(ctx, nodes);
 
     return sink.toString();
   }
diff --git a/lib/src/mustache_impl.dart b/lib/src/mustache_impl.dart
index 2ecd10a..1531e9d 100644
--- a/lib/src/mustache_impl.dart
+++ b/lib/src/mustache_impl.dart
@@ -1,9 +1,9 @@
 library mustache.impl;
 
-@MirrorsUsed(metaTargets: const [mustache])
+@MirrorsUsed(metaTargets: const [m.mustache])
 import 'dart:mirrors';
 
-import 'package:mustache/mustache.dart';
+import 'package:mustache/mustache.dart' as m;
 
 part 'lambda_context.dart';
 part 'node.dart';
diff --git a/lib/src/node.dart b/lib/src/node.dart
index 2b1356a..62b8b8b 100644
--- a/lib/src/node.dart
+++ b/lib/src/node.dart
@@ -1,6 +1,6 @@
 part of mustache.impl;
 
-void _renderWithContext(_RenderContext ctx, List<_Node> nodes) {
+void renderWithContext(RenderContext ctx, List<Node> nodes) {
   if (ctx.indent == null || ctx.indent == '') {
    nodes.forEach((n) => n.render(ctx));
 
@@ -23,11 +23,11 @@
   }
 }
 
-abstract class _Node {
+abstract class Node {
   
-  _Node(this.start, this.end);
+  Node(this.start, this.end);
   
-  void render(_RenderContext renderer);
+  void render(RenderContext renderer);
   
   // The offset of the start of the token in the file. Unless this is a section
   // or inverse section, then this stores the start of the content of the
@@ -41,13 +41,13 @@
 }
 
 
-class _TextNode extends _Node {
+class _TextNode extends Node {
   
   _TextNode(this.text, int start, int end) : super(start, end);
   
   final String text;
   
-  void render(_RenderContext ctx, {lastNode: false}) {
+  void render(RenderContext ctx, {lastNode: false}) {
     if (text == '') return;
     if (ctx.indent == null || ctx.indent == '') {
       ctx.write(text);
@@ -62,7 +62,7 @@
   }
 }
 
-class _VariableNode extends _Node {
+class _VariableNode extends Node {
   
   _VariableNode(this.name, int start, int end, {this.escape: false})
     : super(start, end);
@@ -70,12 +70,12 @@
   final String name;
   final bool escape;
   
-  void render(_RenderContext ctx) {
+  void render(RenderContext ctx) {
     
     var value = ctx.resolveValue(name);
     
     if (value is Function) {
-      var context = new _LambdaContext(this, ctx, isSection: false);
+      var context = new LambdaContext(this, ctx, isSection: false);
       value = value(context);
       context.close();
     }
@@ -125,7 +125,7 @@
 }
 
 
-class _SectionNode extends _Node {
+class _SectionNode extends Node {
   
   _SectionNode(this.name, int start, int end, this.delimiters,
       {this.inverse: false})
@@ -136,14 +136,14 @@
   final bool inverse;
   int contentStart;
   int contentEnd;
-  final List<_Node> children = <_Node>[];
+  final List<Node> children = <Node>[];
   
   //TODO can probably combine Inv and Normal to shorten.
-  void render(_RenderContext ctx) => inverse
+  void render(RenderContext ctx) => inverse
       ? renderInv(ctx)
       : renderNormal(ctx);
   
-  void renderNormal(_RenderContext renderer) {
+  void renderNormal(RenderContext renderer) {
     var value = renderer.resolveValue(name);
     
     if (value == null) {
@@ -166,7 +166,7 @@
         throw renderer.error('Value was missing for section tag: ${name}.', this);
     
     } else if (value is Function) {
-      var context = new _LambdaContext(this, renderer, isSection: true);
+      var context = new LambdaContext(this, renderer, isSection: true);
       var output = value(context);
       context.close();        
       if (output != null) renderer.write(output);
@@ -178,7 +178,7 @@
     }
   }
   
-  void renderInv(_RenderContext ctx) {
+  void renderInv(RenderContext ctx) {
     var value = ctx.resolveValue(name);
     
     if (value == null) {
@@ -209,14 +209,14 @@
     }
   }
   
-  void _renderWithValue(_RenderContext ctx, value) {
+  void _renderWithValue(RenderContext ctx, value) {
     ctx.push(value);
     children.forEach((n) => n.render(ctx));
     ctx.pop();
   }
 }
 
-class _PartialNode extends _Node {
+class _PartialNode extends Node {
 
   _PartialNode(this.name, int start, int end, this.indent)
     : super(start, end);
@@ -227,14 +227,14 @@
   // it's content can be correctly indented.
   final String indent;
   
-  void render(_RenderContext ctx) {
+  void render(RenderContext ctx) {
     var partialName = name;
-    TemplateImpl template = ctx.partialResolver == null
+    Template template = ctx.partialResolver == null
         ? null
         : ctx.partialResolver(partialName);
     if (template != null) {
-      var partialCtx = new _RenderContext.partial(ctx, template, this.indent);
-      _renderWithContext(partialCtx, template._nodes);
+      var partialCtx = new RenderContext.partial(ctx, template, this.indent);
+      renderWithContext(partialCtx, template._nodes);
     } else if (ctx.lenient) {
       // do nothing
     } else {
diff --git a/lib/src/parse.dart b/lib/src/parse.dart
index d90a866..9f73111 100644
--- a/lib/src/parse.dart
+++ b/lib/src/parse.dart
@@ -1,6 +1,6 @@
 part of mustache.impl;
 
-List<_Node> _parse(String source,
+List<Node> parse(String source,
              bool lenient,
              String templateName,
              String delimiters) {
@@ -8,12 +8,12 @@
   if (source == null) throw new ArgumentError.notNull('Template source');
   
   var tokens = 
-      new _Scanner(source, templateName, delimiters, lenient: lenient).scan();
+      new Scanner(source, templateName, delimiters, lenient: lenient).scan();
   
   tokens = _removeStandaloneWhitespace(tokens);
   tokens = _mergeAdjacentText(tokens);
   
-  var stack = new List<_Node>()..add(new _SectionNode('root', 0, 0, delimiters));
+  var stack = new List<Node>()..add(new _SectionNode('root', 0, 0, delimiters));
 
   var delim;
   
@@ -90,10 +90,10 @@
 // LINE_END => TEXT
 // TODO could rewrite this to use a generator, rather than creating an inter-
 // mediate list.
-List<_Token> _removeStandaloneWhitespace(List<_Token> tokens) {
+List<Token> _removeStandaloneWhitespace(List<Token> tokens) {
   int i = 0;
-  _Token read() { var ret = i < tokens.length ? tokens[i++] : null; return ret; }
-  _Token peek([int n = 0]) => i + n < tokens.length ? tokens[i + n] : null;
+  Token read() { var ret = i < tokens.length ? tokens[i++] : null; return ret; }
+  Token peek([int n = 0]) => i + n < tokens.length ? tokens[i + n] : null;
 
   bool isTag(token) => token != null
       && const [_OPEN_SECTION, _OPEN_INV_SECTION, _CLOSE_SECTION, _COMMENT,
@@ -102,7 +102,7 @@
   bool isWhitespace(token) => token != null && token.type == _WHITESPACE;
   bool isLineEnd(token) => token != null && token.type == _LINE_END;
 
-  var result = new List<_Token>();
+  var result = new List<Token>();
   add(token) => result.add(token);
 
   standaloneLineCheck() {
@@ -147,11 +147,11 @@
   while ((t = read()) != null) {
     if (t.type == _LINE_END) {
       // Convert line end to text token
-      add(new _Token(_TEXT, t.value, t.start, t.end));
+      add(new Token(_TEXT, t.value, t.start, t.end));
       standaloneLineCheck();
     } else if (t.type == _WHITESPACE) {
       // Convert whitespace to text token
-      add(new _Token(_TEXT, t.value, t.start, t.end));
+      add(new Token(_TEXT, t.value, t.start, t.end));
     } else {
       // Preserve token
       add(t);
@@ -164,10 +164,10 @@
 // Merging adjacent text nodes will improve the render speed, but slow down
 // parsing. It will be beneficial where templates are parsed once and rendered
 // a number of times.
-List<_Token> _mergeAdjacentText(List<_Token> tokens) {
-  if (tokens.isEmpty) return <_Token>[];
+List<Token> _mergeAdjacentText(List<Token> tokens) {
+  if (tokens.isEmpty) return <Token>[];
   
-  var result = new List<_Token>();
+  var result = new List<Token>();
   int i = 0;
   while(i < tokens.length) {
     var t = tokens[i];
@@ -182,7 +182,7 @@
         buffer.write(tokens[i].value);
         i++;
       }
-      result.add(new _Token(_TEXT, buffer.toString(), t.start, t.end));
+      result.add(new Token(_TEXT, buffer.toString(), t.start, t.end));
     }
   }
   return result;
diff --git a/lib/src/render_context.dart b/lib/src/render_context.dart
index ffc4d73..d506209 100644
--- a/lib/src/render_context.dart
+++ b/lib/src/render_context.dart
@@ -5,9 +5,9 @@
 
 const Object _noSuchProperty = const Object();
 
-class _RenderContext {
+class RenderContext {
   
-  _RenderContext(this._sink,
+  RenderContext(this._sink,
       List stack,
       this.lenient,
       this.htmlEscapeValues,
@@ -17,7 +17,7 @@
       this.source)
     : _stack = new List.from(stack); 
   
-  _RenderContext.partial(_RenderContext ctx, TemplateImpl partial, String indent)
+  RenderContext.partial(RenderContext ctx, Template partial, String indent)
       : this(ctx._sink,
           ctx._stack,
           ctx.lenient,
@@ -27,7 +27,7 @@
           ctx.indent + indent,
           partial.source);
 
-  _RenderContext.subtree(_RenderContext ctx, StringSink sink)
+  RenderContext.subtree(RenderContext ctx, StringSink sink)
      : this(sink,
          ctx._stack,
          ctx.lenient,
@@ -37,8 +37,8 @@
          ctx.indent,
          ctx.source);
 
-    _RenderContext.lambda(
-        _RenderContext ctx,
+    RenderContext.lambda(
+        RenderContext ctx,
         String source,
         String indent,
         StringSink sink,
@@ -56,7 +56,7 @@
   final List _stack;
   final bool lenient;
   final bool htmlEscapeValues;
-  final PartialResolver partialResolver;
+  final m.PartialResolver partialResolver;
   final String templateName;
   final String indent;
   final String source;
@@ -121,6 +121,6 @@
     return invocation.reflectee;
   }
   
-  TemplateException error(String message, _Node node)
+  m.TemplateException error(String message, Node node)
     => new _TemplateException(message, templateName, source, node.start);
 }
diff --git a/lib/src/scanner.dart b/lib/src/scanner.dart
index 6f2b81b..5b3908c 100644
--- a/lib/src/scanner.dart
+++ b/lib/src/scanner.dart
@@ -1,8 +1,8 @@
 part of mustache.impl;
 
-class _Scanner {
+class Scanner {
   
-	_Scanner(String source, this._templateName, String delimiters, {bool lenient: true})
+	Scanner(String source, this._templateName, String delimiters, {bool lenient: true})
 	 : _source = source,
 	   _lenient = lenient,
 	   _itr = source.runes.iterator {
@@ -29,7 +29,7 @@
   int _offset = 0;
   int _c = 0;
 	
-	final List<_Token> _tokens = new List<_Token>();
+	final List<Token> _tokens = new List<Token>();
 
 	// These can be changed by the change delimiter tag.
 	int _openDelimiter;
@@ -37,7 +37,7 @@
   int _closeDelimiterInner;
   int _closeDelimiter;
 
-  List<_Token> scan() {
+  List<Token> scan() {
     while(true) {
       int c = _peek();
       if (c == _EOF) break;
@@ -122,24 +122,24 @@
 		  } else if (c == _NEWLINE) {
         _read();
         var value = new String.fromCharCode(c);
-        _tokens.add(new _Token(_LINE_END, value, start, _offset));
+        _tokens.add(new Token(_LINE_END, value, start, _offset));
 			  
 		  } else if (c == _RETURN) {
         _read();
         if (_peek() == _NEWLINE) {
           _read();
-          _tokens.add(new _Token(_LINE_END, '\r\n', start, _offset));
+          _tokens.add(new Token(_LINE_END, '\r\n', start, _offset));
         } else {
-          _tokens.add(new _Token(_TEXT, '\r', start, _offset));
+          _tokens.add(new Token(_TEXT, '\r', start, _offset));
         }			  
 			
 			} else if (c == _SPACE || c == _TAB) {
         var value = _readWhile((c) => c == _SPACE || c == _TAB);
-        _tokens.add(new _Token(_WHITESPACE, value, start, _offset));
+        _tokens.add(new Token(_WHITESPACE, value, start, _offset));
         
 			} else {
         var value = _readWhile((c) => c != _openDelimiter && c != _NEWLINE);
-        _tokens.add(new _Token(_TEXT, value, start, _offset));
+        _tokens.add(new Token(_TEXT, value, start, _offset));
 			}
 		}	
 	}
@@ -153,7 +153,7 @@
     // If just a single delimeter character then this is a text token.
     if (_openDelimiterInner != null && _peek() != _openDelimiterInner) {
       var value = new String.fromCharCode(_openDelimiter);
-      _tokens.add(new _Token(_TEXT, value, start, _offset));
+      _tokens.add(new Token(_TEXT, value, start, _offset));
       return;
     }
     
@@ -199,7 +199,7 @@
     var type = sigils[sigil];
     var indent = type == _PARTIAL ? _getPrecedingWhitespace() : ''; 
     
-    _tokens.add(new _Token(type, identifier, start, _offset, indent: indent));
+    _tokens.add(new Token(type, identifier, start, _offset, indent: indent));
   }
 	
   _errorEofInTag() => throw _error('Tag not closed before the end of the template.');
@@ -256,7 +256,7 @@
     _expect(_CLOSE_MUSTACHE);
     if (_closeDelimiterInner != null) _expect(_closeDelimiterInner);
     _expect(_closeDelimiter);
-    _tokens.add(new _Token(_UNESC_VARIABLE, value, start, _offset));
+    _tokens.add(new Token(_UNESC_VARIABLE, value, start, _offset));
   }
   
   void _scanCommentTag(int start) {
@@ -265,7 +265,7 @@
         : _readWhile((c) => c != _closeDelimiter, _errorEofInTag).trim();
     if (_closeDelimiterInner != null) _expect(_closeDelimiterInner);
     _expect(_closeDelimiter);
-    _tokens.add(new _Token(_COMMENT, value, start, _offset));
+    _tokens.add(new Token(_COMMENT, value, start, _offset));
   }
 
   //TODO consider changing the parsing here to use a regexp. It will probably
@@ -319,10 +319,10 @@
          _closeDelimiterInner,
          _closeDelimiter);
           
-     _tokens.add(new _Token(_CHANGE_DELIMITER, value, start, _offset));
+     _tokens.add(new Token(_CHANGE_DELIMITER, value, start, _offset));
   }
   
-	TemplateException _error(String message) {
+	m.TemplateException _error(String message) {
 	  return new _TemplateException(message, _templateName, _source, _offset);
 	}
 
diff --git a/lib/src/template.dart b/lib/src/template.dart
index 440e284..30b1455 100644
--- a/lib/src/template.dart
+++ b/lib/src/template.dart
@@ -1,25 +1,25 @@
 part of mustache.impl;
 
-class TemplateImpl implements Template {
+class Template implements m.Template {
  
-  TemplateImpl.fromSource(String source, 
+  Template.fromSource(String source, 
        {bool lenient: false,
         bool htmlEscapeValues : true,
         String name,
-        PartialResolver partialResolver})
+        m.PartialResolver partialResolver})
        :  source = source,
-          _nodes = _parse(source, lenient, name, '{{ }}'),
+          _nodes = parse(source, lenient, name, '{{ }}'),
           _lenient = lenient,
           _htmlEscapeValues = htmlEscapeValues,
           _name = name,
           _partialResolver = partialResolver;
   
   final String source;
-  final List<_Node> _nodes;
+  final List<Node> _nodes;
   final bool _lenient;
   final bool _htmlEscapeValues;
   final String _name;
-  final PartialResolver _partialResolver;
+  final m.PartialResolver _partialResolver;
   
   String get name => _name;
   
@@ -30,13 +30,13 @@
   }
 
   void render(values, StringSink sink) {
-    var ctx = new _RenderContext(sink, [values], _lenient, _htmlEscapeValues,
+    var ctx = new RenderContext(sink, [values], _lenient, _htmlEscapeValues,
         _partialResolver, _name, '', source);
-    _renderWithContext(ctx, _nodes);
+    renderWithContext(ctx, _nodes);
   }
 }
 
-class _TemplateException implements TemplateException {
+class _TemplateException implements m.TemplateException {
 
   _TemplateException(this.message, this.templateName, this.source, this.offset);
 
diff --git a/lib/src/token.dart b/lib/src/token.dart
index 2683a04..9e9b88f 100644
--- a/lib/src/token.dart
+++ b/lib/src/token.dart
@@ -1,8 +1,8 @@
 part of mustache.impl;
 
-class _Token {
+class Token {
   
-  _Token(this.type, this.value, this.start, this.end, {this.indent : ''});
+  Token(this.type, this.value, this.start, this.end, {this.indent : ''});
   
   final int type;
   final String value;
