diff --git a/lib/static/views.js b/lib/static/views.js
index 800eb4b19e5229a54ece1d1e585bf8a9266ca749..03b310f4783a16266a10abd46b89253954031562 100644
--- a/lib/static/views.js
+++ b/lib/static/views.js
@@ -239,8 +239,13 @@ exports.setup = function(app) {
     });
 
     var siteTemplatesPath = path.join(__dirname, "../../resources/views");
+    var sitePartialTemplatesPath = path.join(__dirname, "../../resources/views/partial");
     app.get('/test/mocks/site-templates.js', function(req, res) {
-      res.send(templates.generate(siteTemplatesPath, "site/"));
+      // combine main templates and partials into one big set for development
+      // mode.
+      var siteTemplates = templates.generate(siteTemplatesPath, "site/");
+      siteTemplates += templates.generate(sitePartialTemplatesPath, "partial/");
+      res.send(siteTemplates);
     });
   }
 
diff --git a/lib/templates.js b/lib/templates.js
index f9caaa4498d74201b59fbe41a1b76b3857f0dee1..4df22cdbe7ffacb9ac66262f4e7357f5076304e4 100644
--- a/lib/templates.js
+++ b/lib/templates.js
@@ -51,7 +51,7 @@ exports.generate = function generate(templatesDir, namePrefix, lastGen) {
   templateData = "BrowserID.Templates = BrowserID.Templates || {};";
   for (var t in templates) {
     if (templates.hasOwnProperty(t)) {
-      templateData += "\nBrowserID.Templates['" + t + "'] = " + String(templates[t]);
+      templateData += "\nBrowserID.Templates['" + t + "'] = " + String(templates[t]) + ";";
     }
   }
 
diff --git a/resources/static/common/js/renderer.js b/resources/static/common/js/renderer.js
index 4a613d473009f666e59c94fb125f1379b41c5fdf..ad8dae95a7a0dfa43f767ffa7901a74353637f19 100644
--- a/resources/static/common/js/renderer.js
+++ b/resources/static/common/js/renderer.js
@@ -11,12 +11,19 @@ BrowserID.Renderer = (function() {
 
   function getTemplateHTML(templateName, vars) {
     var templateFn = bid.Templates[templateName];
-    vars = vars || {};
-
     if (!templateFn) throw "Template not found: " + templateName;
 
+    var localVars = _.extend({}, vars);
+    if(!localVars.partial) {
+      localVars.partial = function(name) {
+        // partials are not supported by the client side EJS. Create
+        // a standin that does what partial rendering would do on the backend.
+        return getTemplateHTML(name, vars);
+      }
+    }
+
     // arguments are: locals, filters (which cant be used client-side), escapeFn
-    return templateFn.call(null, vars);
+    return templateFn.call(null, localVars);
   }
 
   function render(target, templateName, vars) {