diff --git a/browserid/static/dialog/controllers/authenticate_controller.js b/browserid/static/dialog/controllers/authenticate_controller.js
index ee62a1988df743ea40559db159129223ed2b1bd1..4daaa55d7bd90a33bd7e173ab0845d886c0a51bf 100644
--- a/browserid/static/dialog/controllers/authenticate_controller.js
+++ b/browserid/static/dialog/controllers/authenticate_controller.js
@@ -193,11 +193,10 @@
     init: function(el, options) {
       options = options || {};
 
-      this._super({
+      this._super(el, {
         bodyTemplate: "authenticate.ejs",
         bodyVars: {
           sitename: user.getOrigin(),
-          siteicon: "/i/times.gif",
           email: options.email || ""
         }
       });
diff --git a/browserid/static/dialog/controllers/checkregistration_controller.js b/browserid/static/dialog/controllers/checkregistration_controller.js
index 9988c00a4e70b9620cb00187c26a775eac899874..e9c15fd1650f7840cf19a586d903c91ece36b05d 100644
--- a/browserid/static/dialog/controllers/checkregistration_controller.js
+++ b/browserid/static/dialog/controllers/checkregistration_controller.js
@@ -42,9 +42,9 @@
   PageController.extend("Checkregistration", {}, {
     init: function(el, options) {
       var me=this;
-      me._super({
-        bodyTemplate: "confirmemail.ejs",
-        bodyVars: {
+      me._super(el, {
+        waitTemplate: "confirmemail.ejs",
+        waitVars: {
           email: options.email
         }
       });
diff --git a/browserid/static/dialog/controllers/dialog_controller.js b/browserid/static/dialog/controllers/dialog_controller.js
index 924f77cbb3e9e8e5fe6e879f1ed48f85200af6a1..5583cbd4787e8d19b94267f86a5433b8557c6919 100644
--- a/browserid/static/dialog/controllers/dialog_controller.js
+++ b/browserid/static/dialog/controllers/dialog_controller.js
@@ -61,6 +61,9 @@
         this.onerror = onerror;
 
         user.setOrigin(origin_url);
+        
+        // get the cleaned origin.
+        $("#sitename").text(user.getOrigin());
 
         this.doCheckAuth();
 
diff --git a/browserid/static/dialog/controllers/page_controller.js b/browserid/static/dialog/controllers/page_controller.js
index 40a2ec79b4a6c3acbc73011336b57440d0429887..6904b0fb8655e5e19a6b3a98399796dff154e070 100644
--- a/browserid/static/dialog/controllers/page_controller.js
+++ b/browserid/static/dialog/controllers/page_controller.js
@@ -42,13 +42,23 @@
 
   $.Controller.extend("PageController", {
     }, {
-    init: function(options) {
+    init: function(el, options) {
+      options = options || {};
+
       var me=this,
           bodyTemplate = options.bodyTemplate,
-          bodyVars = options.bodyVars;
+          bodyVars = options.bodyVars,
+          waitTemplate = options.waitTemplate,
+          waitVars = options.waitVars;
 
 
-      me.renderTemplates(bodyTemplate, bodyVars);
+      if(bodyTemplate) {
+        me.renderDialog(bodyTemplate, bodyVars);
+      }
+
+      if(waitTemplate) {
+        me.renderWait(waitTemplate, waitVars);
+      }
 
       // XXX move all of these, bleck.
       $("form").bind("submit", me.onSubmit.bind(me));
@@ -69,18 +79,29 @@
       this._super();
     },
 
-    renderTemplates: function(body, body_vars) {
-
+    renderTemplates: function(target, body, body_vars) {
       if (body) {
         var bodyHtml = $.View("//dialog/views/" + body, body_vars);
-        var form = $("#formWrap > form");
-        form.html(bodyHtml).hide().fadeIn(ANIMATION_TIME, function() {
-          $("body").removeClass("waiting");
-          form.find("input").eq(0).focus(); 
-        });
+        target = $(target + " .contents");
+        target.html(bodyHtml).find("input").eq(0).focus(); 
       }
     },
 
+    renderDialog: function(body, body_vars) {
+      this.renderTemplates("#formWrap", body, body_vars);
+      $("#wait").stop().fadeOut(ANIMATION_TIME);
+    },
+
+    renderWait: function(body, body_vars) {
+      this.renderTemplates("#wait", body, body_vars);
+      $("#wait").stop().css('opacity', 1).hide().fadeIn(ANIMATION_TIME);
+    },
+
+    renderError: function(error_vars) {
+      this.renderTemplates("#error", "wait.ejs", error_vars);
+      $("#error").stop().css('opacity', 1).hide().fadeIn(ANIMATION_TIME);
+    },
+
     onSubmit: function(event) {
       event.stopPropagation();
       event.preventDefault();
@@ -100,7 +121,7 @@
     },
 
     doWait: function(info) {
-      this.renderTemplates("wait.ejs", {title: info.message, message: info.description});
+      this.renderWait("wait.ejs", info);
 
       $("body").addClass("waiting");
     },
@@ -112,23 +133,6 @@
       }
     },
 
-    /**
-     * Immediately show the error dialog
-     * @method errorDialog
-     * @param {object} info - info to use for the error dialog.  Should have 
-     * two fields, message, description.
-     */
-    errorDialog: function(info) {
-      $("form").hide();
-
-      $("#error_dialog .title").text(info.message);
-      $("#error_dialog .content").text(info.description);
-
-      $("body").removeClass("authenticated").addClass("error");
-
-      $("#error_dialog").fadeIn(ANIMATION_TIME);
-    },
-
     /**
      * Get a curried function to an error dialog.
      * @method getErrorDialog
@@ -137,7 +141,7 @@
      */
     getErrorDialog: function(info) {
       var self=this;
-      return self.errorDialog.bind(self, info);
+      return self.renderError.bind(self, info);
     },
 
     onCancel: function(event) {
diff --git a/browserid/static/dialog/controllers/pickemail_controller.js b/browserid/static/dialog/controllers/pickemail_controller.js
index b0ebdaa3dc657175cef6444768d5d45877b9615a..43e23513bec1d6b5cfb0a6ca6557291cdea11209 100644
--- a/browserid/static/dialog/controllers/pickemail_controller.js
+++ b/browserid/static/dialog/controllers/pickemail_controller.js
@@ -134,6 +134,7 @@
 
     var valid = checkEmail.call(self, email);
     if (valid) {
+//      self.doWait(bid.Wait.generateKey);
       getAssertion.call(self, email);
       startAnimation.call(self);
     }
@@ -172,13 +173,11 @@
 
 
   PageController.extend("Pickemail", {}, {
-    init: function(options) {
-      this._super({
+    init: function(el, options) {
+      this._super(el, {
         bodyTemplate: "pickemail.ejs",
         bodyVars: {
-          sitename: user.getOrigin(),
-          siteicon: '/i/times.gif',
-          identities: user.getStoredEmailKeypairs(),
+          identities: user.getStoredEmailKeypairs()
         }
       });
 
diff --git a/browserid/static/dialog/css/m.css b/browserid/static/dialog/css/m.css
index 486ef920599d9bad0f05d6375f13c111e46d13c2..6688319e75c24c28df1069b9eb3b6a4676b9aed3 100644
--- a/browserid/static/dialog/css/m.css
+++ b/browserid/static/dialog/css/m.css
@@ -24,6 +24,11 @@
     font-size: 17px;
   }
 
+  section {
+    position: static;
+    overflow: visible;
+  }
+
   .inputs > li > label {
     font-size: 18px;
   }
@@ -73,11 +78,6 @@
       background-color: transparent;
   }
 
-  #formWrap,
-  .vertical {
-      height: auto;
-  }
-
   .arrow {
       display: none;
   }
@@ -86,10 +86,6 @@
       height: 250px;
   }
 
-  #footer {
-      padding: 10px;
-  }
-
   #signIn .vertical {
     padding-bottom: 0;
   }
@@ -101,4 +97,9 @@
   #signIn .submit > p {
     font-size: 14px;
   }
+
+  #content, .pickemail .form_section, .pickemail .inputs, .vertical {
+    height: auto;
+    overflow: visible;
+  }
 }
diff --git a/browserid/static/dialog/css/popup.css b/browserid/static/dialog/css/popup.css
index 872a2fade3ed7565bfc2ace0a058ef4420a09376..b1b54243f2d023bc6e2a46f27d7a621ad3b1ba01 100644
--- a/browserid/static/dialog/css/popup.css
+++ b/browserid/static/dialog/css/popup.css
@@ -65,9 +65,13 @@ h1 {
 }
 
 h2 {
-    font-size: 1em;
+    margin-bottom: 20px;
+    font-size: 150%;
+    color: #222;
+    font-weight: bold;
 }
 
+
 .right {
     text-align: right;
 }
@@ -77,11 +81,6 @@ h2 {
     position: relative;
 }
 
-#error_dialog {
-  text-align: center;
-  margin: 100px auto;
-  display: none;
-}
 
 .table {
     display: table;
@@ -95,37 +94,55 @@ h2 {
     width: 100%;
 }
 
-.authenticate #formWrap, .pickemail #formWrap {
-    background-color: #fff;
-    background-image: none;
-}
-
-#formWrap, .waiting #formWrap, .checkregistration #formWrap  {
-    background-color: rgba(0, 0, 0, 0.035);
-    background-image: url('/i/bg.png');
+#content {
     position: relative;
-    width: 100%;
     height: 250px;
     overflow: hidden;
 }
 
-.waiting #formWrap, .checkregistration #formWrap {
-    width: 325px;
-    margin: 0 auto;
-    text-align: center;
+section {
+    display: block;
+    position: absolute;
+    top: 0;
+    left: 0;
+    bottom: 0;
+    right: 0;
+    z-index: 0;
 }
 
-.waiting #formWrap > form, .checkregistration #formWrap > form {
-    height: 250px;
-    width: 325px;
+section > .contents {
     display: table-cell;
     vertical-align: middle;
+    height: 250px;
 }
 
-#signIn,
-#favicon {
-    display: inline-block;
-    float: left;
+#wait, #error {
+    text-align: center;
+    background-image: url("/i/bg.png");
+}
+
+#wait {
+    z-index: 1;
+}
+
+#error {
+    display: none;
+    z-index: 2;
+}
+
+#wait strong, #error strong {
+    color: #222;
+    font-weight: bold;
+}
+
+#error {
+    z-index: 2;
+}
+
+#formWrap {
+    background-color: #fff;
+    background-image: none;
+    display: block;
 }
 
 #signIn {
@@ -166,6 +183,7 @@ h2 {
 #favicon {
     position: absolute;
     left: 450px;
+    top: 0;
     z-index: 10;
 }
 
@@ -355,21 +373,12 @@ footer .learn a {
     text-shadow: 1px 1px 0 rgba(255, 255, 255, 0.5);
 }
 
-.checkregistration p:first-child {
-    margin-bottom: 20px;
-    font-size: 150%;
-}
-
-.checkregistration strong {
-    color: #222;
-    font-weight: bold;
-}
-
+    /*
 #favicon {
     text-align: center;
     max-width: 940px;
 }
-
+*/
 header {
     padding: 20px;
     font-weight: bold;
@@ -435,11 +444,11 @@ header,
 footer {
     display: block;
     width: 100%;
+    border-top: 1px solid rgba(0, 0, 0, 0.05);
 }
 
 footer {
     padding: 20px;
-    border-top: 1px solid rgba(0,0,0,0.05);
     color: #aaa;   
 }
 
diff --git a/browserid/static/dialog/qunit.html b/browserid/static/dialog/qunit.html
index 8b7142e7746ea2a5a0b69dc5350c7f27ac6f3699..108cc60fd8fbc23e0105384c865a527e58e19b92 100644
--- a/browserid/static/dialog/qunit.html
+++ b/browserid/static/dialog/qunit.html
@@ -2,9 +2,6 @@
 	<head>
 		<link rel="stylesheet" type="text/css" href="/funcunit/qunit/qunit.css" />
 		<title>dialog QUnit Test</title>
-		<script type='text/javascript'>
-			steal = {ignoreControllers: true}
-		</script>
 		<script type='text/javascript' src='/vepbundle'></script>
 		<script type='text/javascript' src='/steal/steal.js?/dialog/test/qunit'></script>
 	</head>
@@ -14,7 +11,23 @@
 		<h2 id="qunit-banner"></h2>
 		<div id="qunit-testrunner-toolbar"></div>
 		<h2 id="qunit-userAgent"></h2>
-		<div id="test-content"></div>
+		<div id="test-content">
+      <div id="page_controller">
+
+        <div id="formWrap">
+            <div class="contents"></div>
+        </div>
+
+        <div id="wait">
+            <div class="contents"></div>
+        </div>
+
+        <div id="error">
+            <div class="contents"></div>
+        </div>
+
+      </div>
+    </div>
 		<ol id="qunit-tests"></ol>
 		<div id="qunit-test-area"></div>
 	</body>
diff --git a/browserid/static/dialog/resources/error-messages.js b/browserid/static/dialog/resources/error-messages.js
index dd7ee7313210e4a5dd20645c2c06ed030e77fd05..860760fb88febb0e2645a94dda23b3cf7f314b5f 100644
--- a/browserid/static/dialog/resources/error-messages.js
+++ b/browserid/static/dialog/resources/error-messages.js
@@ -38,44 +38,44 @@ BrowserID.Errors = (function(){
   var Errors = {
     authentication: {
       type: "serverError",
-      message: "Error Authenticating",
-      description: "There was a technical problem while trying to log you in.  Yucky!"
+      title: "Error Authenticating",
+      message: "There was a technical problem while trying to log you in.  Yucky!"
     },
 
     addEmail: {
       type: "serverError",
-      message: "Error Adding Address",
-      description: "There was a technical problem while trying to add this email to your account.  Yucky!"
+      title: "Error Adding Address",
+      message: "There was a technical problem while trying to add this email to your account.  Yucky!"
     },
 
     checkAuthentication: {
       type: "serverError",
-      message: "Error Checking Authentication",
-      description: "There was a technical problem while trying to log you in.  Yucky!"
+      title: "Error Checking Authentication",
+      message: "There was a technical problem while trying to log you in.  Yucky!"
     },
 
     createAccount: {
       type: "serverError",
-      message: "Error Creating Account",
-      description: "There was a technical problem while trying to create your account.  Yucky!"
+      title: "Error Creating Account",
+      message: "There was a technical problem while trying to create your account.  Yucky!"
     },
 
     registration: {
       type: "serverError",
-      message: "Registration Failed",
-      description: "An error was encountered and the signup cannot be completed.  Yucky!"
+      title: "Registration Failed",
+      message: "An error was encountered and the signup cannot be completed.  Yucky!"
     },
 
     signIn: {
       type: "serverError",
-      message: "Signin Failed",
-      description: "There was an error signing in. Yucky!"
+      title: "Signin Failed",
+      message: "There was an error signing in. Yucky!"
     },
 
     syncAddress: {
       type: "serverError",
-      message: "Error Syncing Address",
-      description: "There was a technical problem while trying to synchronize your account.  Yucky!"
+      title: "Error Syncing Address",
+      message: "There was a technical problem while trying to synchronize your account.  Yucky!"
     }
 
   };
diff --git a/browserid/static/dialog/resources/wait-messages.js b/browserid/static/dialog/resources/wait-messages.js
index 190074c3096c8df63338351037e84a0805912ac3..561a93a57e623220282b5f0ef749c2db686de8e1 100644
--- a/browserid/static/dialog/resources/wait-messages.js
+++ b/browserid/static/dialog/resources/wait-messages.js
@@ -37,24 +37,15 @@ BrowserID.Wait = (function(){
 
   var Wait = {
     authentication: {
-      message: "Finishing Sign In...",
-      description: "In just a moment you'll be signed into BrowserID."
+      title: "Finishing Sign In...",
+      message: "In just a moment you'll be signed into BrowserID."
     },
 
-    addEmail: {
-      message: "One Moment Please...",
-      description: "We're adding this email to your account, this should only take a couple of seconds."
-    },
-
-    checkAuth: {
-      message: "Communicating with server",
-      description: "Just a moment while we talk with the server."
-    },
-
-    createAccount: {
-      message: "One Moment Please...",
-      description: "We're creating your account, this should only take a couple of seconds."
+    generateKey: {
+      title: "Finishing Sign In...",
+      message: "Please wait just a moment while your account is authenticated."
     }
+
   };
 
 
diff --git a/browserid/static/dialog/test/qunit/controllers/page_controller_unit_test.js b/browserid/static/dialog/test/qunit/controllers/page_controller_unit_test.js
new file mode 100644
index 0000000000000000000000000000000000000000..fca829d5c917981be1272ff7ee2148d1f089fa5c
--- /dev/null
+++ b/browserid/static/dialog/test/qunit/controllers/page_controller_unit_test.js
@@ -0,0 +1,146 @@
+/*jshint browsers:true, forin: true, laxbreak: true */
+/*global steal: true, test: true, start: true, stop: true, module: true, ok: true, equal: true, BrowserID:true */
+/* ***** BEGIN LICENSE BLOCK *****
+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Original Code is Mozilla BrowserID.
+ *
+ * The Initial Developer of the Original Code is Mozilla.
+ * Portions created by the Initial Developer are Copyright (C) 2011
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s):
+ *
+ * Alternatively, the contents of this file may be used under the terms of
+ * either the GNU General Public License Version 2 or later (the "GPL"), or
+ * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+ * in which case the provisions of the GPL or the LGPL are applicable instead
+ * of those above. If you wish to allow use of your version of this file only
+ * under the terms of either the GPL or the LGPL, and not to allow others to
+ * use your version of this file under the terms of the MPL, indicate your
+ * decision by deleting the provisions above and replace them with the notice
+ * and other provisions required by the GPL or the LGPL. If you do not delete
+ * the provisions above, a recipient may use your version of this file under
+ * the terms of any one of the MPL, the GPL or the LGPL.
+ *
+ * ***** END LICENSE BLOCK ***** */
+steal.plugins("jquery").then("/dialog/controllers/page_controller", function() {
+  "use strict";
+
+  var controller, el,
+      bodyTemplate = "testBodyTemplate.ejs",
+      waitTemplate = "wait.ejs";
+
+  module("PageController", {
+    setup: function() {
+      el = $("#page_controller");
+    },
+
+    teardown: function() {
+      el.find("#formWrap .contents").html("");
+      el.find("#wait .contents").html("");
+      el.find("#error .contents").html("");
+      controller.destroy();
+    } 
+  });
+
+  test("page controller with no template causes no side effects", function() {
+    controller = el.page().controller();
+
+    var html = el.find("#formWrap .contents").html();
+    equal(html, "", "with no template specified, no text is loaded");
+
+    html = el.find("#wait .contents").html();
+    equal(html, "", "with no template specified, no text is loaded");
+  });
+
+  test("page controller with body template renders in #formWrap .contents", function() {
+    controller = el.page({
+      bodyTemplate: bodyTemplate,
+      bodyVars: {
+        title: "Test title",
+        message: "Test message"
+      }
+    }).controller();
+
+    var html = el.find("#formWrap .contents").html();
+    ok(html.length, "with template specified, form text is loaded");
+
+
+    var input = el.find("input").eq(0);
+    ok(input.is(":focus"), "make sure the first input is focused");
+
+    html = el.find("#wait .contents").html();
+    equal(html, "", "with body template specified, wait text is not loaded");
+  });
+
+  test("page controller with wait template renders in #wait .contents", function() {
+    controller = el.page({
+      waitTemplate: waitTemplate,
+      waitVars: {
+        title: "Test title",
+        message: "Test message"
+      }
+    }).controller();
+
+    var html = el.find("#formWrap .contents").html();
+    equal(html, "", "with wait template specified, form is ignored");
+
+    html = el.find("#wait .contents").html();
+    ok(html.length, "with wait template specified, wait text is loaded");
+  });
+
+  test("renderError renders an error message", function() {
+    controller = el.page({
+      waitTemplate: waitTemplate,
+      waitVars: {
+        title: "Test title",
+        message: "Test message"
+      }
+    }).controller();
+   
+    controller.renderError({
+      title: "error title",
+      message: "error message"
+    });
+
+    var html = el.find("#error .contents").html();
+    // XXX underpowered test, we don't actually check the contents.
+    ok(html.length, "with error template specified, error text is loaded");
+  });
+
+  test("getErrorDialog gets a function that can be used to render an error message", function() {
+    controller = el.page({
+      waitTemplate: waitTemplate,
+      waitVars: {
+        title: "Test title",
+        message: "Test message"
+      }
+    }).controller();
+   
+    var func = controller.getErrorDialog({
+      title: "error title",
+      message: "error message"
+    });
+
+    equal(typeof func, "function", "a function was returned from getErrorDialog");
+    func();
+
+    var html = el.find("#error .contents").html();
+    // XXX underpowered test, we don't actually check the contents.
+    ok(html.length, "when function is run, error text is loaded");
+
+  });
+
+});
+
diff --git a/browserid/static/dialog/test/qunit/qunit.js b/browserid/static/dialog/test/qunit/qunit.js
index 9c0289f75ab429893ca827cdbbc14277f93c65ac..435935bdb970b11177eb07a37efc7aaa60a63e99 100644
--- a/browserid/static/dialog/test/qunit/qunit.js
+++ b/browserid/static/dialog/test/qunit/qunit.js
@@ -3,9 +3,18 @@ steal("/dialog/resources/browserid.js",
       "/dialog/resources/tooltip.js",
       "/dialog/resources/validation.js",
       "/dialog/resources/underscore-min.js")
-  .plugins("funcunit/qunit")
+  .plugins(
+    "jquery", 
+    "jquery/controller",
+    "jquery/controller/subscribe",
+    "jquery/controller/view",
+    "jquery/view/ejs",
+    "funcunit/qunit")
+	.views('testBodyTemplate.ejs')
+	.views('wait.ejs')
   .then("browserid_unit_test")
-  .then("validation_unit_test")
-  .then("storage_unit_test")
-  .then("network_unit_test")
-  .then("user_unit_test")
+  .then("controllers/page_controller_unit_test")
+  .then("resources/validation_unit_test")
+  .then("resources/storage_unit_test")
+  .then("resources/network_unit_test")
+  .then("resources/user_unit_test")
diff --git a/browserid/static/dialog/test/qunit/network_unit_test.js b/browserid/static/dialog/test/qunit/resources/network_unit_test.js
similarity index 100%
rename from browserid/static/dialog/test/qunit/network_unit_test.js
rename to browserid/static/dialog/test/qunit/resources/network_unit_test.js
diff --git a/browserid/static/dialog/test/qunit/storage_unit_test.js b/browserid/static/dialog/test/qunit/resources/storage_unit_test.js
similarity index 100%
rename from browserid/static/dialog/test/qunit/storage_unit_test.js
rename to browserid/static/dialog/test/qunit/resources/storage_unit_test.js
diff --git a/browserid/static/dialog/test/qunit/user_unit_test.js b/browserid/static/dialog/test/qunit/resources/user_unit_test.js
similarity index 100%
rename from browserid/static/dialog/test/qunit/user_unit_test.js
rename to browserid/static/dialog/test/qunit/resources/user_unit_test.js
diff --git a/browserid/static/dialog/test/qunit/validation_unit_test.js b/browserid/static/dialog/test/qunit/resources/validation_unit_test.js
similarity index 100%
rename from browserid/static/dialog/test/qunit/validation_unit_test.js
rename to browserid/static/dialog/test/qunit/resources/validation_unit_test.js
diff --git a/browserid/static/dialog/views/authenticate.ejs b/browserid/static/dialog/views/authenticate.ejs
index 81150fcbab15c53b08bb085340f91acd6e70b671..3341bac640d68f72ff23d609be20cdc9eb3e736f 100644
--- a/browserid/static/dialog/views/authenticate.ejs
+++ b/browserid/static/dialog/views/authenticate.ejs
@@ -1,78 +1,54 @@
-  <!-- This takes care of the core user creation/authentication.  When the user 
-        enters an email address and hits "next", the address will be checked
-        against the currently registered addresses.  If the address exists,
-        the password container is shown, if the address does not exist, the
-        option to create a new account is given.
-      -->
+  <strong>Sign in using</strong>
+  <ul class="inputs">
 
-    <div id="favicon">
-        <div class="table">
-            <div class="vertical">
-                <strong><%= sitename %></strong>
-            </div>
-        </div>
-    </div>
+      <li>
+          <label for="email" class="serif">Email</label>
+          <input id="email" class="sans" type="email" autocapitalize="off" autocorrect="off" value="<%= email %>" />
 
-    <div id="signIn">
-        <div class="arrow"></div>
-        <div class="table">
-            <div class="vertical">
-                <strong>Sign in using</strong>
-                <ul class="inputs">
+          <div id="email_format" class="tooltip" for="email">
+            This field must be an email address.
+          </div>
 
-                    <li>
-                        <label for="email" class="serif">Email</label>
-                        <input id="email" class="sans" type="email" autocapitalize="off" autocorrect="off" value="<%= email %>" />
+          <div id="email_required" class="tooltip" for="email">
+            The email field is required.
+          </div>
+      </li>
 
-                        <div id="email_format" class="tooltip" for="email">
-                          This field must be an email address.
-                        </div>
+      <li id="hint_section" class="start">
+          <p>Enter your email address to sign in to <strong><%= sitename %></strong></p>
+      </li>
 
-                        <div id="email_required" class="tooltip" for="email">
-                          The email field is required.
-                        </div>
-                    </li>
+      <li id="create_text_section" class="newuser">
+          <p><strong>Welcome to BrowserID!</strong></p>
+          <p>This email looks new, so let's get you set up.</p>
+      </li>
 
-                    <li id="hint_section" class="start">
-                        <p>Enter your email address to sign in to <strong><%= sitename %></strong></p>
-                    </li>
+      <li id="password_section" class="returning">
 
-                    <li id="create_text_section" class="newuser">
-                        <p><strong>Welcome to BrowserID!</strong></p>
-                        <p>This email looks new, so let's get you set up.</p>
-                    </li>
+          <label for="password" class="half serif">Password</label>
+          <div class="half right">
+              <a id="forgotPassword" href="#">forgot your password?</a>
+          </div>
+          <input id="password" class="sans" type="password" maxlength="80">
 
-                    <li id="password_section" class="returning">
 
-                        <label for="password" class="half serif">Password</label>
-                        <div class="half right">
-                            <a id="forgotPassword" href="#">forgot your password?</a>
-                        </div>
-                        <input id="password" class="sans" type="password" maxlength="80">
+          <div id="password_required" class="tooltip" for="password">
+            The password field is required.
+          </div>
 
+          <div id="cannot_authenticate" class="tooltip" for="password">
+            The account cannot be logged in with this username and password.
+          </div>
+      </li>
+  
+  </ul>
 
-                        <div id="password_required" class="tooltip" for="password">
-                          The password field is required.
-                        </div>
-
-                        <div id="cannot_authenticate" class="tooltip" for="password">
-                          The account cannot be logged in with this username and password.
-                        </div>
-                    </li>
-                
-                </ul>
-
-                <div class="submit cf">
-                    <button class="start">next</button>
-                    <button class="newuser">Verify Email</button>
-
-                    <button class="returning">sign in</button>
-
-                    <button class="forgot">Reset Password</button>
-                    <button id="cancel_forgot_password" class="forgot">Cancel</button>
-                </div>
-            </div>
-        </div>
-    </div>
+  <div class="submit cf">
+      <button class="start">next</button>
+      <button class="newuser">Verify Email</button>
 
+      <button class="returning">sign in</button>
 
+      <button class="forgot">Reset Password</button>
+      <button id="cancel_forgot_password" class="forgot">Cancel</button>
+  </div>
diff --git a/browserid/static/dialog/views/confirmemail.ejs b/browserid/static/dialog/views/confirmemail.ejs
index 008e988e20443aba4aeb436c0990e442b88ffeaa..6b264b86267b4e5bba8a8b33bf5f9dd875b616e0 100644
--- a/browserid/static/dialog/views/confirmemail.ejs
+++ b/browserid/static/dialog/views/confirmemail.ejs
@@ -1,4 +1,4 @@
-    <p><strong>Check your email!</strong></p>
+    <h2>Check your email!</h2>
     <p>We sent a confirmation email to <strong><%= email %></strong></p>
     <p>To finish signing in just click the verify link we sent to your email address.</p><br />
     <p>If this is a mistake, <a href="#" id="back">cancel this email</a>.</p>
diff --git a/browserid/static/dialog/views/pickemail.ejs b/browserid/static/dialog/views/pickemail.ejs
index e710c8e829bd4522f89f6cb773240e1bb08f2c66..f7d3c60a5072b187d839501bf23fbc97bdf4ce23 100644
--- a/browserid/static/dialog/views/pickemail.ejs
+++ b/browserid/static/dialog/views/pickemail.ejs
@@ -1,72 +1,55 @@
-  <div id="favicon">
-      <div class="table">
-          <div class="vertical">
-              <strong><%= sitename %></strong>
-          </div>
+  <strong>Sign in using</strong>
+
+  <div id="selectEmail" class="form_section">
+      <ul class="inputs">
+          <% _.each(identities, function(email_obj, email_address) { %>
+              <li>
+                  <label for="<%= email_address %>" class="serif">
+                    <input type="radio" name="email" id="<%= email_address %>" value="<%= email_address %>" />
+                    <%= email_address %>
+                  </label>
+              </li>
+          <% }); %>
+      </ul>
+
+      <div class="submit add cf">
+          <button id="signInButton">sign in</button>
+          <p>
+            <a id="thisIsNotMe" href="#">This is not me</a>
+            <a id="useNewEmail" href="#">Use a different email</a>
+          </p>
       </div>
   </div>
 
+  <div id="addEmail" class="cf form_section">
 
-  <div id="signIn">
-      <div class="arrow"></div>
-      <div class="table">
-          <div class="vertical">
-              <strong>Sign in using</strong>
+      <ul class="inputs">
+          <li>
+              <label for="newEmail">New email address</label>
+              <input id="newEmail" name="newEmail" type="email" />
 
-              <div id="selectEmail" class="form_section">
-                  <ul class="inputs">
-                      <% _.each(identities, function(email_obj, email_address) { %>
-                          <li>
-                              <label for="<%= email_address %>" class="serif">
-                                <input type="radio" name="email" id="<%= email_address %>" value="<%= email_address %>" />
-                                <%= email_address %>
-                              </label>
-                          </li>
-                      <% }); %>
-                  </ul>
-
-                  <div class="submit add cf">
-                      <button id="signInButton">sign in</button>
-                      <p>
-                        <a id="thisIsNotMe" href="#">This is not me</a>
-                        <a id="useNewEmail" href="#">Use a different email</a>
-                      </p>
-                  </div>
+              <div id="email_format" class="tooltip" for="newEmail">
+                This field must be an email address.
               </div>
 
-              <div id="addEmail" class="cf form_section">
-
-                  <ul class="inputs">
-                      <li>
-                          <label for="newEmail">New email address</label>
-                          <input id="newEmail" name="newEmail" type="email" />
-
-                          <div id="email_format" class="tooltip" for="newEmail">
-                            This field must be an email address.
-                          </div>
-
-                          <div id="email_required" class="tooltip" for="newEmail">
-                            The email field is required.
-                          </div>
-
-                          <div id="could_not_add" class="tooltip" for="newEmail">
-                            This email address could not be added.
-                          </div>
-
-                          <div id="already_taken" class="tooltip" for="newEmail">
-                            This email address is already taken.
-                          </div>
-                      </li>
-                  </ul>
+              <div id="email_required" class="tooltip" for="newEmail">
+                The email field is required.
+              </div>
 
-                  <div class="submit cf">
-                      <button id="addNewEmail">add</button>
-                      <button id="cancelNewEmail">cancel</button>
-                  </div>
+              <div id="could_not_add" class="tooltip" for="newEmail">
+                This email address could not be added.
+              </div>
 
+              <div id="already_taken" class="tooltip" for="newEmail">
+                This email address is already taken.
               </div>
+          </li>
+      </ul>
 
-          </div>
+      <div class="submit cf">
+          <button id="addNewEmail">add</button>
+          <button id="cancelNewEmail">cancel</button>
       </div>
+
   </div>
 
diff --git a/browserid/static/dialog/views/testBodyTemplate.ejs b/browserid/static/dialog/views/testBodyTemplate.ejs
new file mode 100644
index 0000000000000000000000000000000000000000..77a06e46bbf5acedeb0fbb140b6f289c40389a8b
--- /dev/null
+++ b/browserid/static/dialog/views/testBodyTemplate.ejs
@@ -0,0 +1,2 @@
+<input type="text" value="" />
+
diff --git a/browserid/views/dialog.ejs b/browserid/views/dialog.ejs
index 9adac52ad887be1a5c3913f2c8369df5e82e6ba3..4bde9a26a0106b5e5f6664f4f357ef107b42cfc3 100644
--- a/browserid/views/dialog.ejs
+++ b/browserid/views/dialog.ejs
@@ -23,20 +23,42 @@
               </ul>
           </header>
 
-          <div id="formWrap" class="cf">
-            <form novalidate class="cf"> 
+          <div id="content">
+              <section id="formWrap">
+                <form novalidate> 
+                  <div id="favicon">
+                      <div class="vertical">
+                          <strong id="sitename"></strong>
+                      </div>
+                  </div>
 
-              <!-- All of this is going to be replaced on startup, but we need some temporary placeholder -->
-              <h2>Communicating with server</h2>
-              <p>Just a moment while we talk with the server.</p>
+                  <div id="signIn">
+                      <div class="arrow"></div>
+                      <div class="table">
+                          <div class="vertical contents">
+                          </div>
+                      </div>
+                  </div>
+                </form>
+              </section>
 
-            </form>
 
-            <div id="error_dialog">
-                <h3 class="title"></h3>
-                <p class="content"></p>
-            </div>
+              <section id="wait">
+                  <div class="table">
+                      <div class="vertical contents">
+                          <h2>Communicating with server</h2>
+                          <p>Just a moment while we talk with the server.</p>
+                      </div>
+                  </div>
+              </section>
 
+
+              <section id="error">
+                  <div class="table">
+                      <div class="vertical contents">
+                      </div>
+                  </div>
+              </section>
           </div>
 
           <footer>