Update README.md
diff --git a/README.md b/README.md
index e7ab5f7..18632a3 100644
--- a/README.md
+++ b/README.md
@@ -1,83 +1,116 @@
 # Mustache templates
 
-A Dart library to parse and render [mustache templates](http://mustache.github.com/mustache.5.html).
+A Dart library to parse and render [mustache templates](https://mustache.github.io/).
 
-[![Build Status](https://drone.io/github.com/xxgreg/mustache/status.png)](https://drone.io/github.com/xxgreg/mustache/latest)
+[![Build Status](https://drone.io/github.com/xxgreg/mustache/status.png)](https://drone.io/github.com/xxgreg/mustache/latest) [![Coverage Status](https://coveralls.io/repos/xxgreg/mustache/badge.svg)](https://coveralls.io/r/xxgreg/mustache)
+
+See the [mustache manual](http://mustache.github.com/mustache.5.html) for detailed usage information.
+
+This library passes all [mustache specification](https://github.com/mustache/spec/tree/master/specs) tests.
+
+## Example usage
+```dart
+import 'package:mustache/mustache.dart';
+
+main() {
+	var source = '''
+	  {{# names }}
+            <div>{{ lastname }}, {{ firstname }}</div>
+	  {{/ names }}
+	  {{^ names }}
+	    <div>No names.</div>
+	  {{/ names }}
+	  {{! I am a comment. }}
+	''';
+	
+	var template = new Template(source);
+	
+	var output = template.renderString({'names': [
+		{'firstname': 'Greg', 'lastname': 'Lowe'},
+		{'firstname': 'Bob', 'lastname': 'Johnson'}
+	]});
+	
+	print(output);
+}
+```
+
+A template is parsed when it is created, after parsing it can be rendered any number of times with different values. A TemplateException is thrown if there is a problem parsing or rendering the template.
+
+The Template contstructor allows passing a name, this name will be used in error messages. When working with a number of templates, it is important to pass a name so that the error messages specify which template caused the error.
+
+By default all output from `{{variable}}` tags is html escaped, this behaviour can be changed by passing htmlEscapeValues : false to the Template constructor. Also see the `{{{triple mustache}}}` tag, and unescaped variable tag `{{&unescaped}}`.
+
+## Differences between strict mode and lenient mode.
+
+### Strict mode (default)
+
+* Tag names may only the characters a-z, A-Z, 0-9, underscore, period and minus. Other characters in tags will cause a TemplateException to be thrown during parsing.
+
+* During rendering variables which resolve to null will cause a TemplateException will be thrown.
+
+### Lenient mode
+
+* Tag names may use any characters.
+* During rendering variables which resolve to null will be silently ignored.
+
+## Partials - example usage
+
+```dart
+
+var partial = new Template('{{ foo }}', name: 'partial');
+
+var resolver = (String name) {
+   if (name == 'partial-name') { // Name of partial tag.
+     return partial;
+   }
+};
+
+var t = new Template('{{> partial-name }}', partialResolver: resolver);
+
+var output = t.renderString({'foo': 'bar'}); // bar
+
+```
+
+## Lambdas - example usage
+
+```dart
+    var t = new Template('{{# foo }}');
+    var lambda = (_) => 'bar'};
+    t.renderString({'foo': lambda); // bar
+```
+
+```dart
+    var t = new Template('{{# foo }}hidden{{/ foo }}');
+    var lambda = (_) => 'shown'};
+    t.renderString({'foo': lambda); // shown
+```
+
+```dart
+    var t = new Template('{{# foo }}oi{{/ foo }}');
+    var lambda = (LambdaContext ctx) => '<b>${ctx.renderString().toUpperCase()}</b>'};
+    t.renderString({'foo': lambda); // <b>OI</b>
+```
+
+```dart
+    var t = new Template('{{# foo }}{{bar}}{{/ foo }}');
+    var lambda = (LambdaContext ctx) => '<b>${ctx.renderString().toUpperCase()}</b>'};
+    t.renderString({'foo': lambda, 'bar': 'pub'); // <b>PUB</b>
+```
+
+```dart
+    var t = new Template('{{# foo }}{{bar}}{{/ foo }}');
+    var lambda = (LambdaContext ctx) => '<b>${ctx.renderString().toUpperCase()}</b>'};
+    t.renderString({'foo': lambda, 'bar': 'pub'); // <b>PUB</b>
+```
+
+In the following example `LambdaContext.renderSource(source)` re-parses the source string in the current context, this is the default behaviour in many mustache implementations. Since re-parsing the content is slow, and often not required, this library makes this step optional.
+
+```dart
+    var t = new Template('{{# foo }}{{bar}}{{/ foo }}');
+    var lambda = (LambdaContext ctx) => ctx.renderSource(ctx.source + '{{cmd}}')};
+    t.renderString({'foo': lambda, 'bar': 'pub', 'cmd': 'build'); // pub build
+```
 
 ## Dart2js
 
 This library uses mirrors. When compiling with dart2js you will need to pass the experimental mirrors flag. You also need to mark any objects which will be rendered with the @mustache annotation. There is also another version of this library available which doesn't use mirrors.
-
-## Example
-```dart
-	import 'package:mustache/mustache.dart';
-
-	main() {
-		var source = '{{#names}}<div>{{lastname}}, {{firstname}}</div>{{/names}}';
-		var template = new Template(source);
-		var output = template.renderString({'names': [
-			{'firstname': 'Greg', 'lastname': 'Lowe'},
-			{'firstname': 'Bob', 'lastname': 'Johnson'}
-		]});
-		print(output);
-	}
-```
-
-## API
-
-```dart
-
-abstract class Template {
-	
-	Template(String source, 
-	    {bool lenient : false,
-       bool htmlEscapeValues : true,
-       String name,
-       PartialResolver partialResolver});
-
-	String renderString(values);
-	void render(values, StringSink sink);
-}
-
-```
-
-Once a template has been created it can be rendered any number of times.
-
-Both parsing and render throw a TemplateException if there is a problem with the template or rendering the values.
-
-When lenient mode is enabled tag names may use any characters, otherwise only a-z, A-Z, 0-9, underscore and minus. Lenient mode will also silently ignore nulls passed as values.
-
-By default all variables are html escaped, this behaviour can be changed by passing htmlEscapeValues : false.
-
-
-## Supported 
-```
- Variables             {{var-name}}
- 
- Sections              {{#section}}Blah{{/section}}
- 
- Inverse sections      {{^section}}Blah{{/section}}
- 
- Comments              {{! Not output. }}
- 
- Unescaped variables   {{{var-name}}} and {{&var-name}}
- 
- Partials              {{>include-other-file}}
-
- Lambdas               new Template('{{# foo }}oi{{/ foo }}')
-                          .renderString({'foo': (s) => '<b>${s.toUpperCase()}</b>'});
-```
-See the [mustache templates tutorial](http://mustache.github.com/mustache.5.html) for more information.
-
-Passing all [mustache specification](https://github.com/mustache/spec/tree/master/specs) tests for interpolation, sections, inverted, comments.
-
-Lambdas are implemented differently from the specification. In this implementation, a lambda is provided with a String containing the rendered body of the template, and the output of the lambda is not re-interpolated. However this is sufficient for common use cases such as:
-
-    new Template('{{# foo }}oi{{/ foo }}')
-	     .renderString({'foo': (s) => '<b>${s.toUpperCase()}</b>'}); // <b>OI</b>
-
-## To do
-```
-Implement auto-indenting for partials
-Set Delimiter tags
-```