diff --git a/test/mustache_test.dart b/test/mustache_test.dart
index a4548e5..10c5fff 100644
--- a/test/mustache_test.dart
+++ b/test/mustache_test.dart
@@ -101,7 +101,7 @@
 '''));
       expect(t.renderString({"section": [] }), equals('Empty.\n'));
     });
-		
+
 		test('Whitespace in section tags', () {
       expect(parse('{{#foo.bar}}oi{{/foo.bar}}').renderString({'foo': {'bar': true}}), equals('oi'));
       expect(parse('{{# foo.bar}}oi{{/foo.bar}}').renderString({'foo': {'bar': true}}), equals('oi'));
@@ -112,27 +112,27 @@
       expect(parse('{{#foo.bar}}oi{{/ foo.bar }}').renderString({'foo': {'bar': true}}), equals('oi'));
       expect(parse('{{# foo.bar }}oi{{/ foo.bar }}').renderString({'foo': {'bar': true}}), equals('oi'));
 		});
-		
+
     test('Whitespace in variable tags', () {
       expect(parse('{{foo.bar}}').renderString({'foo': {'bar': true}}), equals('true'));
       expect(parse('{{ foo.bar}}').renderString({'foo': {'bar': true}}), equals('true'));
       expect(parse('{{foo.bar }}').renderString({'foo': {'bar': true}}), equals('true'));
       expect(parse('{{ foo.bar }}').renderString({'foo': {'bar': true}}), equals('true'));
     });
-    
-    
-    
+
+
+
     test('Odd whitespace in tags', () {
-      
-      render(source, values, output) 
+
+      render(source, values, output)
         => expect(parse(source, lenient: true)
             .renderString(values), equals(output));
-      
+
       render(
         "{{\t# foo}}oi{{\n/foo}}",
         {'foo': true},
         'oi');
-      
+
       render(
         "{{ # # foo }} {{ oi }} {{ / # foo }}",
         {'# foo': [{'oi': 'OI!'}]},
@@ -183,23 +183,23 @@
 //      render(
 //        "{{ > }}",
 //        {'>': 'oi'},
-//        '');      
+//        '');
     });
-    
+
     test('Empty source', () {
       var t = new Template('');
       expect(t.renderString({}), equals(''));
     });
-    
+
     test('Template name', () {
       var t = new Template('', name: 'foo');
       expect(t.name, equals('foo'));
     });
-    
+
     test('Bad tag', () {
       expect(() => new Template('{{{ foo }|'), throwsException);
     });
-    
+
 	});
 
 	group('Inverse Section', () {
@@ -297,7 +297,7 @@
 	group('Invalid format', () {
 		test('Mismatched tag', () {
 			var source = '{{#section}}_{{var}}_{{/notsection}}';
-			var ex = renderFail(source, {"section": {"var": "bob"}});			
+			var ex = renderFail(source, {"section": {"var": "bob"}});
 			expectFail(ex, 1, 22, 'Mismatched tag');
 		});
 
@@ -330,20 +330,20 @@
       var ex = renderFail(source, {"section": {}});
       expectFail(ex, null, null, VALUE_MISSING);
 		});
-		
+
 		// Null variables shouldn't be a problem.
     test('Null variable', () {
       var t = new Template('{{#section}}_{{var}}_{{/section}}');
       var output = t.renderString({"section": {'var': null}});
       expect(output, equals('__'));
     });
-    
+
     test('Unclosed section', () {
       var source = r'{{#section}}foo';
       var ex = renderFail(source, {"section": {}});
       expectFail(ex, null, null, UNCLOSED_TAG);
     });
-   
+
 	});
 
 	group('Lenient', () {
@@ -404,7 +404,7 @@
 	    var t = resolver(renderTemplate);
 	    return t.renderString(values);
 	  }
-	  
+
     test('basic', () {
       var output = _partialTest(
           {'foo': 'bar'},
@@ -420,13 +420,13 @@
           {'foo': 'bar'},
           {'root': '{{>partial}}'},
           'root',
-          lenient: false);  
+          lenient: false);
       } catch (e) {
         expect(e is TemplateException, isTrue);
         threw = true;
       }
       expect(threw, isTrue);
-    });   
+    });
 
     test('missing partial lenient', () {
       var output = _partialTest(
@@ -468,7 +468,7 @@
       expect(output, equals('  >\n  >>'));
     });
 
-    
+
     test('standalone indentation', () {
       var output = _partialTest(
           { 'content': "<\n->" },
@@ -478,14 +478,14 @@
           lenient: true);
       expect(output, equals("\\\n |\n <\n->\n |\n\/\n"));
     });
-    
+
 	});
 
   group('Lambdas', () {
-    
+
     _lambdaTest({template, lambda, output}) =>
         expect(parse(template).renderString({'lambda': lambda}), equals(output));
-    
+
     test('basic', () {
       _lambdaTest(
           template: 'Hello, {{lambda}}!',
@@ -514,52 +514,52 @@
       var output = '<>';
       expect(parse(template).renderString(values), equals(output));
     });
-  
+
     test("seth's use case", () {
       var template = '<{{#markdown}}{{content}}{{/markdown}}>';
       var values = {'markdown': (ctx) => ctx.renderString().toLowerCase(), 'content': 'OI YOU!'};
       var output = '<oi you!>';
-      expect(parse(template).renderString(values), equals(output));      
+      expect(parse(template).renderString(values), equals(output));
     });
 
-    
+
     test("Lambda v2", () {
       var template = '<{{#markdown}}{{content}}{{/markdown}}>';
       var values = {'markdown': (ctx) => ctx.source, 'content': 'OI YOU!'};
       var output = '<{{content}}>';
-      expect(parse(template).renderString(values), equals(output));      
+      expect(parse(template).renderString(values), equals(output));
     });
-    
-    
+
+
     test("Lambda v2...", () {
       var template = '<{{#markdown}}dsfsf dsfsdf dfsdfsd{{/markdown}}>';
       var values = {'markdown': (ctx) => ctx.source};
       var output = '<dsfsf dsfsdf dfsdfsd>';
-      expect(parse(template).renderString(values), equals(output));      
+      expect(parse(template).renderString(values), equals(output));
     });
 
     test('Alternate Delimiters', () {
 
       // A lambda's return value should parse with the default delimiters.
-      
+
       var template = '{{= | | =}}\nHello, (|&lambda|)!';
-      
+
       //function() { return "|planet| => {{planet}}" }
       var values = {'planet': 'world',
                     'lambda': (LambdaContext ctx) => ctx.renderSource(
                         '|planet| => {{planet}}') };
-      
+
       var output = 'Hello, (|planet| => world)!';
-      
+
       expect(parse(template).renderString(values), equals(output));
     });
 
     test('Alternate Delimiters 2', () {
 
       // Lambdas used for sections should parse with the current delimiters.
-      
+
       var template = '{{= | | =}}<|#lambda|-|/lambda|>';
-      
+
       //function() { return "|planet| => {{planet}}" }
       var values = {'planet': 'Earth',
                     'lambda': (LambdaContext ctx) {
@@ -567,12 +567,12 @@
                       return ctx.renderSource('$txt{{planet}} => |planet|$txt');
                      }
       };
-      
+
       var output = '<-{{planet}} => Earth->';
-      
+
       expect(parse(template).renderString(values), equals(output));
     });
-    
+
     test('LambdaContext.lookup', () {
       var t = new Template('{{ foo }}');
       var s = t.renderString({'foo': (lc) => lc.lookup('bar'), 'bar': 'jim'});
@@ -582,12 +582,12 @@
     test('LambdaContext.lookup closed', () {
       var t = new Template('{{ foo }}');
       var lc2;
-      var s = t.renderString({'foo': (lc) => lc2 = lc, 'bar': 'jim'});      
+      var s = t.renderString({'foo': (lc) => lc2 = lc, 'bar': 'jim'});
       expect(() => lc2.lookup('foo'), throwsException);
     });
-    
+
   });
-	
+
 	group('Other', () {
 		test('Standalone line', () {
 			var val = parse('|\n{{#bob}}\n{{/bob}}\n|').renderString({'bob': []});
@@ -618,7 +618,7 @@
         .renderString(new Foo());
       expect(output, equals('_bob_'));
     });
-    
+
     test('Lambda', () {
       var output = parse('_{{lambda}}_')
         .renderString(new Foo()..lambda = (_) => 'yo');
@@ -639,16 +639,25 @@
       expect(val, equals('(It worked!)'));
     });
   });
-  
+
+  group('Template with custom delimiters', () {
+    test('Basic', () {
+      var t = new Template('(<%text%>)', delimiters: '<% %>');
+      var val = t.renderString(model);
+      
+      expect(val, equals('(Hey!)'));
+    });
+  });
+
   group('Lambda context', () {
-    
+
     test("LambdaContext write", () {
       var template = '<{{#markdown}}{{content}}{{/markdown}}>';
       var values = {'markdown': (ctx) {
         ctx.write('foo');
       }};
       var output = '<foo>';
-      expect(parse(template).renderString(values), equals(output));      
+      expect(parse(template).renderString(values), equals(output));
     });
 
     test("LambdaContext render", () {
@@ -657,7 +666,7 @@
         ctx.render();
       }};
       var output = '<bar>';
-      expect(parse(template).renderString(values), equals(output));      
+      expect(parse(template).renderString(values), equals(output));
     });
 
     test("LambdaContext render with value", () {
@@ -666,7 +675,7 @@
         ctx.render(value: {'content': 'oi!'});
       }};
       var output = '<oi!>';
-      expect(parse(template).renderString(values), equals(output));      
+      expect(parse(template).renderString(values), equals(output));
     });
 
     test("LambdaContext renderString with value", () {
@@ -675,7 +684,7 @@
         return ctx.renderString(value: {'content': 'oi!'});
       }};
       var output = '<oi!>';
-      expect(parse(template).renderString(values), equals(output));      
+      expect(parse(template).renderString(values), equals(output));
     });
 
     test("LambdaContext write and return", () {
@@ -685,7 +694,7 @@
         return 'bar';
       }};
       var output = '<foobar>';
-      expect(parse(template).renderString(values), equals(output));      
+      expect(parse(template).renderString(values), equals(output));
     });
 
     test("LambdaContext renderSource with value", () {
@@ -694,9 +703,9 @@
         return ctx.renderSource(ctx.source, value: {'content': 'oi!'});
       }};
       var output = '<oi!>';
-      expect(parse(template).renderString(values), equals(output));      
+      expect(parse(template).renderString(values), equals(output));
     });
-    
+
   });
 }
 
