diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..6bb39e4
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,8 @@
+Copyright (c) 2013, Greg Lowe
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
\ No newline at end of file
diff --git a/lib/mustache.dart b/lib/mustache.dart
index ef33df0..4198992 100644
--- a/lib/mustache.dart
+++ b/lib/mustache.dart
@@ -3,6 +3,8 @@
 part 'template.dart';
 part 'scanner.dart';
 
+/// http://mustache.github.com/mustache.5.html
+
 render(String source, values) => new Template(source).render(values);
 
 abstract class Template {
diff --git a/lib/template.dart b/lib/template.dart
index fe0d7b7..00a86e6 100644
--- a/lib/template.dart
+++ b/lib/template.dart
@@ -1,22 +1,20 @@
 part of mustache;
 
-// http://mustache.github.com/mustache.5.html
-
-class Node {
-	Node(this.type, this.value);
+class _Node {
+	_Node(this.type, this.value);
 	final int type;
 	final String value;
-	final List<Node> children = new List<Node>();
-	String toString() => 'Node: ${tokenTypeString(type)}';
+	final List<_Node> children = new List<_Node>();
+	String toString() => '_Node: ${tokenTypeString(type)}';
 }
 
-Node _parse(List<_Token> tokens) {
-	var stack = new List<Node>()..add(new Node(_OPEN_SECTION, 'root'));
+_Node _parse(List<_Token> tokens) {
+	var stack = new List<_Node>()..add(new _Node(_OPEN_SECTION, 'root'));
 	for (var t in tokens) {
 		if (t.type == _TEXT || t.type == _VARIABLE) {
-			stack.last.children.add(new Node(t.type, t.value));
+			stack.last.children.add(new _Node(t.type, t.value));
 		} else if (t.type == _OPEN_SECTION || t.type == _OPEN_INV_SECTION) {
-			var child = new Node(t.type, t.value);
+			var child = new _Node(t.type, t.value);
 			stack.last.children.add(child);
 			stack.add(child);
 		} else if (t.type == _CLOSE_SECTION) {
@@ -30,11 +28,11 @@
 	return stack.last;
 }
 
-class _Template {
+class _Template implements Template {
 	_Template(String source) 
 		: _root = _parse(_scan(source));
 
-	final Node _root;
+	final _Node _root;
 	final ctl = new List(); //TODO StreamController();
 	final stack = new List();
 
@@ -42,11 +40,11 @@
 		ctl.clear();
 		stack.clear();
 		stack.add(values);	
-		_root.children.forEach(_renderNode);
+		_root.children.forEach(_render_Node);
 		return ctl;
 	}
 
-	_renderNode(node) {
+	_render_Node(node) {
 		switch (node.type) {
 			case _TEXT:
 				_renderText(node);
@@ -77,7 +75,7 @@
 
 	_renderSectionWithValue(node, value) {
 		stack.add(value);
-		node.children.forEach(_renderNode);
+		node.children.forEach(_render_Node);
 		stack.removeLast();
 	}
 
@@ -119,8 +117,8 @@
 	}
 }
 
-_visit(Node root, visitor(Node n)) {
-	var stack = new List<Node>()..add(root);
+_visit(_Node root, visitor(_Node n)) {
+	var stack = new List<_Node>()..add(root);
 	while (!stack.isEmpty) {
 		var node = stack.removeLast();
 		stack.addAll(node.children);
diff --git a/test/mustache_test.dart b/test/mustache_test.dart
index 4493e57..c028603 100644
--- a/test/mustache_test.dart
+++ b/test/mustache_test.dart
@@ -2,53 +2,11 @@
 
 import 'package:mustache/mustache.dart';
 
-var scannerTests = [
-'_{{variable}}_',
-'_{{variable}}',
-'{{variable}}_',
-'{{variable}}',
-' { ',
-' } ',
-' {} ',
-' }{} ',
-'{{{escaped text}}}',
-'{{&escaped text}}',
-'{{!comment}}',
-'{{#section}}oi{{/section}}',
-'{{^section}}oi{{/section}}',
-'{{>partial}}'
-];
-
+//FIXME I am not a real test :(
 main() {
-	tokens();
-	
 	var source = '{{#section}}_{{var}}_{{/section}}';
 	var t = new Template(source);
 	var output = t.render({"section": {"var": "bob"}});
 	print(source);
 	print(output);
 }
-
-tokens() {
-	for (var src in scannerTests) {
-		print('${_pad(src, 40)}${_scan(src)}');
-	}	
-}
-
-_pad(String s, int len) {
-	for (int i = s.length; i < len; i++)
-		s = s + ' ';
-	return s;
-}
-
-	_stringify(Node n, int indent) {
-		var pad = '';
-		for (int i = 0; i < indent; i++)
-			pad = '$pad-';
-		var s = '$pad${tokenTypeString(type)} $value\n';		
-		++indent;
-		for (var c in n.children) {
-			s += _stringify(c, indent);
-		}
-		return s;
-	}
