diff --git a/package.json b/package.json
index e81227495649ee5b68f9e5be8c1d3d244c3d1b64..e75ed621df3f3b3e85b3a9424434bfd53677ba22 100644
--- a/package.json
+++ b/package.json
@@ -9,7 +9,7 @@
         "connect": "1.7.2",
         "convict": "0.0.6",
         "cjson": "0.0.6",
-        "client-sessions": "https://github.com/downloads/lloyd/node-client-sessions/d5f06c5.tgz",
+        "client-sessions": "0.0.6",
         "connect-cachify": "0.0.9",
         "connect-cookie-session": "0.0.2",
         "connect-logger-statsd": "0.0.1",
diff --git a/resources/static/dialog/controllers/check_registration.js b/resources/static/dialog/controllers/check_registration.js
index cc7fdf53ed7c68f1e67779c855f95d21c5bc0588..7e4e90ab8e5de2856bfc2c87e518ef28cace42c1 100644
--- a/resources/static/dialog/controllers/check_registration.js
+++ b/resources/static/dialog/controllers/check_registration.js
@@ -18,12 +18,13 @@ BrowserID.Modules.CheckRegistration = (function() {
       options.required = !!options.required;
 
       self.renderWait("confirm_email", options);
+
       self.email = options.email;
       self.verifier = options.verifier;
       self.verificationMessage = options.verificationMessage;
+      self.required = options.required;
 
       self.click("#back", self.back);
-      self.click("#cancel", self.cancel);
 
       Module.sc.start.call(self, options);
     },
@@ -46,16 +47,9 @@ BrowserID.Modules.CheckRegistration = (function() {
     },
 
     back: function() {
-      // XXX this should change to cancelEmailValidation for email, but this
-      // will work.
       user.cancelUserValidation();
-      this.close("cancel_state");
-    },
-
-    cancel: function() {
-      this.close("cancel");
+      this.publish(this.required ? "cancel" : "cancel_state");
     }
-
   });
 
   return Module;
diff --git a/resources/static/dialog/resources/state.js b/resources/static/dialog/resources/state.js
index 6fb5c9ec6363dd9475612df059cf354e8f69137a..1d8bcfdbceb2c2f6124112342c0d0ff39bda75be 100644
--- a/resources/static/dialog/resources/state.js
+++ b/resources/static/dialog/resources/state.js
@@ -249,15 +249,17 @@ BrowserID.State = (function() {
     handleState("assertion_generated", function(msg, info) {
       self.success = true;
       if (info.assertion !== null) {
-        if (storage.usersComputer.shouldAsk(network.userid())) {
-          // We have to confirm the user's status
-          self.assertion_info = info;
-          redirectToState("is_this_your_computer", info);
-        }
-        else {
-          storage.setLoggedIn(user.getOrigin(), self.email);
-          startAction("doAssertionGenerated", { assertion: info.assertion, email: self.email });
-        }
+        user.shouldAskIfUsersComputer(function(shouldAsk) {
+          if (shouldAsk) {
+            // We have to confirm the user's status
+            self.assertion_info = info;
+            redirectToState("is_this_your_computer", info);
+          }
+          else {
+            storage.setLoggedIn(user.getOrigin(), self.email);
+            startAction("doAssertionGenerated", { assertion: info.assertion, email: self.email });
+          }
+        });
       }
       else {
         redirectToState("pick_email");
diff --git a/resources/static/dialog/views/confirm_email.ejs b/resources/static/dialog/views/confirm_email.ejs
index 79e472165f954d82ef51785aa206e5ee828cfdeb..01ab935ed3d7b5206b7ae244bf4eec9cda20fa44 100644
--- a/resources/static/dialog/views/confirm_email.ejs
+++ b/resources/static/dialog/views/confirm_email.ejs
@@ -15,9 +15,9 @@
 
     <p>
       <% if(required) { %>
-        <%= gettext('If this is a mistake, just ignore the sent email and <a href="#" id="cancel">cancel</a>.') %>
+        <%= format(gettext('If this is a mistake, just ignore the sent email and <a %s>cancel</a>.'), [' href="#" id="back"']) %>
       <% } else { %>
-        <%= gettext('If this is a mistake, just ignore the sent email and <a href="#" id="back">use another email address</a>.') %>
+        <%= format(gettext('If this is a mistake, just ignore the sent email and <a %s>use another email address</a>.'), [' href="#" id="back"']) %>
       <% } %>
     </p>
 
diff --git a/resources/static/shared/user.js b/resources/static/shared/user.js
index dd3e182e82563b605fe270575ae798b97b6adccc..48778cd31e4e00736dde561cfa02a0a5b584fbae 100644
--- a/resources/static/shared/user.js
+++ b/resources/static/shared/user.js
@@ -15,7 +15,8 @@ BrowserID.User = (function() {
       provisioning = bid.Provisioning,
       addressCache = {},
       primaryAuthCache = {},
-      complete = bid.Helpers.complete;
+      complete = bid.Helpers.complete,
+      registrationComplete = false;
 
   function prepareDeps() {
     if (!jwk) {
@@ -130,6 +131,11 @@ BrowserID.User = (function() {
             addressCache[email].known = true;
           }
 
+          // registrationComplete is used in shouldAskIfUsersComputer to
+          // prevent the user from seeing the "is this your computer" screen if
+          // they just completed a registration.
+          registrationComplete = true;
+
           if (onSuccess) {
             onSuccess(status);
           }
@@ -220,11 +226,13 @@ BrowserID.User = (function() {
       if (config.provisioning) {
         provisioning = config.provisioning;
       }
+
     },
 
     reset: function() {
       provisioning = BrowserID.Provisioning;
       User.resetCaches();
+      registrationComplete = false;
     },
 
     resetCaches: function() {
@@ -1152,6 +1160,10 @@ BrowserID.User = (function() {
       }
     },
 
+    /**
+     * Check if the user owns the computer
+     * @method isUsersComputer
+     */
     isUsersComputer: function(onComplete, onFailure) {
       var userID = network.userid();
       if(typeof userID !== "undefined") {
@@ -1159,7 +1171,25 @@ BrowserID.User = (function() {
       } else {
         complete(onFailure, "user is not authenticated");
       }
+    },
+
+    /**
+     * Check whether the user should be asked if this is their computer
+     * @method shouldAskIfUsersComputer
+     */
+    shouldAskIfUsersComputer: function(onComplete, onFailure) {
+      var userID = network.userid();
+      if(typeof userID !== "undefined") {
+        // A user should never be asked if they completed an email
+        // registration/validation in this dialog session.
+        var shouldAsk = storage.usersComputer.shouldAsk(userID)
+                        && !registrationComplete;
+        complete(onComplete, shouldAsk);
+      } else {
+        complete(onFailure, "user is not authenticated");
+      }
 
+      return shouldAsk;
     }
   };
 
diff --git a/resources/static/test/cases/controllers/check_registration.js b/resources/static/test/cases/controllers/check_registration.js
index d24c8efc92ec8da04e6fffb691ae9270396d3361..8619cfa0a11c0b392b7cf7529ffdd3d12ac5aea3 100644
--- a/resources/static/test/cases/controllers/check_registration.js
+++ b/resources/static/test/cases/controllers/check_registration.js
@@ -13,12 +13,13 @@
       testHelpers = bid.TestHelpers,
       register = testHelpers.register;
 
-  function createController(verifier, message) {
+  function createController(verifier, message, required) {
     controller = bid.Modules.CheckRegistration.create();
     controller.start({
       email: "registered@testuser.com",
       verifier: verifier,
-      verificationMessage: message
+      verificationMessage: message,
+      required: required
     });
   }
 
@@ -76,7 +77,7 @@
     });
   });
 
-  asyncTest("back - raise cancel_state", function() {
+  asyncTest("back for normal account creation/email addition - raise cancel_state", function() {
     createController("waitForUserValidation", "user_verified");
     controller.startCheck(function() {
       register("cancel_state", function() {
@@ -87,14 +88,14 @@
     });
   });
 
-  asyncTest("cancel - raise cancel", function() {
-    createController("waitForUserValidation", "user_verified");
+  asyncTest("back for required email - raise cancel", function() {
+    createController("waitForUserValidation", "user_verified", true);
     controller.startCheck(function() {
       register("cancel", function() {
         ok(true, "cancel is triggered");
         start();
       });
-      controller.cancel();
+      controller.back();
     });
   });
 
diff --git a/resources/static/test/cases/shared/user.js b/resources/static/test/cases/shared/user.js
index 20ece75b71109281fc0bc0f2a01459a7611cf66b..a1269fb9305ca913aa41344474b19a4f1f3b52a8 100644
--- a/resources/static/test/cases/shared/user.js
+++ b/resources/static/test/cases/shared/user.js
@@ -1,5 +1,5 @@
 /*jshint browsers:true, forin: true, laxbreak: true */
-/*global test: true, start: true, module: true, ok: true, equal: true, BrowserID: true */
+/*global test: true, start: true, module: true, ok: true, equal: true, strictEqual: true, BrowserID: true */
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
@@ -17,7 +17,8 @@ var vep = require("./vep");
       testHelpers = bid.TestHelpers,
       testOrigin = testHelpers.testOrigin,
       failureCheck = testHelpers.failureCheck,
-      provisioning = bid.Mocks.Provisioning
+      provisioning = bid.Mocks.Provisioning,
+      TEST_EMAIL = "testuser@testuser.com";
 
   // I generated these locally, they are used nowhere else.
   var pubkey = {"algorithm":"RS","n":"56063028070432982322087418176876748072035482898334811368408525596198252519267108132604198004792849077868951906170812540713982954653810539949384712773390200791949565903439521424909576832418890819204354729217207360105906039023299561374098942789996780102073071760852841068989860403431737480182725853899733706069","e":"65537"};
@@ -104,8 +105,8 @@ var vep = require("./vep");
   });
 
   asyncTest("getStoredEmailKeypair with known key - return identity", function() {
-    lib.syncEmailKeypair("testuser@testuser.com", function() {
-      var identity = lib.getStoredEmailKeypair("testuser@testuser.com");
+    lib.syncEmailKeypair(TEST_EMAIL, function() {
+      var identity = lib.getStoredEmailKeypair(TEST_EMAIL);
 
       ok(identity, "we have an identity");
       start();
@@ -113,7 +114,7 @@ var vep = require("./vep");
   });
 
   test("getStoredEmailKeypair with unknown key", function() {
-    var identity = lib.getStoredEmailKeypair("testuser@testuser.com");
+    var identity = lib.getStoredEmailKeypair(TEST_EMAIL);
 
     equal(typeof identity, "undefined", "identity is undefined for unknown key");
   });
@@ -132,7 +133,7 @@ var vep = require("./vep");
   });
 
   asyncTest("createSecondaryUser", function() {
-    lib.createSecondaryUser("testuser@testuser.com", function(status) {
+    lib.createSecondaryUser(TEST_EMAIL, function(status) {
       ok(status, "user created");
       start();
     }, testHelpers.unexpectedXHRFailure);
@@ -141,14 +142,14 @@ var vep = require("./vep");
   asyncTest("createSecondaryUser with user creation refused", function() {
     xhr.useResult("throttle");
 
-    lib.createSecondaryUser("testuser@testuser.com", function(status) {
+    lib.createSecondaryUser(TEST_EMAIL, function(status) {
       equal(status, false, "user creation refused");
       start();
     }, testHelpers.unexpectedXHRFailure);
   });
 
   asyncTest("createSecondaryUser with XHR failure", function() {
-    failureCheck(lib.createSecondaryUser, "testuser@testuser.com");
+    failureCheck(lib.createSecondaryUser, TEST_EMAIL);
   });
 
   asyncTest("createUser with unknown secondary happy case - expect 'secondary.verify'", function() {
@@ -252,7 +253,7 @@ var vep = require("./vep");
   asyncTest("primaryUserAuthenticationInfo, user authenticated to IdP, expect keypair, cert, authenticated status", function() {
     provisioning.setStatus(provisioning.AUTHENTICATED);
 
-    lib.primaryUserAuthenticationInfo("testuser@testuser.com", {},
+    lib.primaryUserAuthenticationInfo(TEST_EMAIL, {},
       function(info) {
         equal(info.authenticated, true, "user is authenticated");
         ok(info.keypair, "keypair passed");
@@ -266,7 +267,7 @@ var vep = require("./vep");
   asyncTest("primaryUserAuthenticationInfo, user not authenticated to IdP, expect false authenticated status", function() {
     provisioning.setStatus(provisioning.NOT_AUTHENTICATED);
 
-    lib.primaryUserAuthenticationInfo("testuser@testuser.com", {},
+    lib.primaryUserAuthenticationInfo(TEST_EMAIL, {},
       function(info) {
         equal(info.authenticated, false, "user is not authenticated");
         start();
@@ -279,7 +280,7 @@ var vep = require("./vep");
     provisioning.setFailure("failure");
 
     lib.primaryUserAuthenticationInfo(
-      "testuser@testuser.com",
+      TEST_EMAIL,
       {},
       testHelpers.unexpectedSuccess,
       testHelpers.expectedXHRFailure
@@ -289,7 +290,7 @@ var vep = require("./vep");
   asyncTest("isUserAuthenticatedToPrimary with authed user, expect true status", function() {
     provisioning.setStatus(provisioning.AUTHENTICATED);
 
-    lib.isUserAuthenticatedToPrimary("testuser@testuser.com", {},
+    lib.isUserAuthenticatedToPrimary(TEST_EMAIL, {},
       function(status) {
         equal(status, true, "user is authenticated, correct status");
         start();
@@ -301,7 +302,7 @@ var vep = require("./vep");
   asyncTest("isUserAuthenticatedToPrimary with non-authed user, expect false status", function() {
     provisioning.setStatus(provisioning.NOT_AUTHENTICATED);
 
-    lib.isUserAuthenticatedToPrimary("testuser@testuser.com", {},
+    lib.isUserAuthenticatedToPrimary(TEST_EMAIL, {},
       function(status) {
         equal(status, false, "user is not authenticated, correct status");
         start();
@@ -313,7 +314,7 @@ var vep = require("./vep");
   asyncTest("isUserAuthenticatedToPrimary with failure", function() {
     provisioning.setFailure("failure");
 
-    lib.isUserAuthenticatedToPrimary("testuser@testuser.com", {},
+    lib.isUserAuthenticatedToPrimary(TEST_EMAIL, {},
       testHelpers.unexpectedSuccess,
       testHelpers.expectedXHRFailure
     );
@@ -397,7 +398,7 @@ var vep = require("./vep");
     storage.setStagedOnBehalfOf(testOrigin);
 
     lib.tokenInfo("token", function(info) {
-      equal(info.email, "testuser@testuser.com", "correct email");
+      equal(info.email, TEST_EMAIL, "correct email");
       equal(info.origin, testOrigin, "correct origin");
       start();
     }, testHelpers.unexpectedXHRFailure);
@@ -405,7 +406,7 @@ var vep = require("./vep");
 
   asyncTest("tokenInfo with a bad token without site info, no site in results", function() {
     lib.tokenInfo("token", function(info) {
-      equal(info.email, "testuser@testuser.com", "correct email");
+      equal(info.email, TEST_EMAIL, "correct email");
       equal(typeof info.origin, "undefined", "origin is undefined");
       start();
     }, testHelpers.unexpectedXHRFailure);
@@ -421,7 +422,7 @@ var vep = require("./vep");
     lib.verifyUser("token", "password", function onSuccess(info) {
 
       ok(info.valid, "token was valid");
-      equal(info.email, "testuser@testuser.com", "email part of info");
+      equal(info.email, TEST_EMAIL, "email part of info");
       equal(info.origin, testOrigin, "origin in info");
       equal(storage.getStagedOnBehalfOf(), "", "initiating origin was removed");
 
@@ -450,7 +451,7 @@ var vep = require("./vep");
   });
 
   asyncTest("canSetPassword with only primary addresses - expect false", function() {
-    storage.addEmail("testuser@testuser.com", { type: "primary" });
+    storage.addEmail(TEST_EMAIL, { type: "primary" });
 
     lib.canSetPassword(function(status) {
       equal(false, status, "status is false with user with only primaries");
@@ -459,7 +460,7 @@ var vep = require("./vep");
   });
 
   asyncTest("canSetPassword with secondary addresses - expect true", function() {
-    storage.addEmail("testuser@testuser.com", { type: "secondary" });
+    storage.addEmail(TEST_EMAIL, { type: "secondary" });
 
     lib.canSetPassword(function(status) {
       equal(true, status, "status is true with user with secondaries");
@@ -518,7 +519,7 @@ var vep = require("./vep");
 
 
   asyncTest("authenticate with valid credentials, also syncs email with server", function() {
-    lib.authenticate("testuser@testuser.com", "testuser", function(authenticated) {
+    lib.authenticate(TEST_EMAIL, "testuser", function(authenticated) {
       equal(true, authenticated, "we are authenticated!");
       var emails = lib.getStoredEmailKeypairs();
       equal(_.size(emails) > 0, true, "emails have been synced to server");
@@ -529,7 +530,7 @@ var vep = require("./vep");
 
   asyncTest("authenticate with invalid credentials", function() {
     xhr.useResult("invalid");
-    lib.authenticate("testuser@testuser.com", "testuser", function onComplete(authenticated) {
+    lib.authenticate(TEST_EMAIL, "testuser", function onComplete(authenticated) {
       equal(false, authenticated, "invalid authentication.");
       start();
     }, testHelpers.unexpectedXHRFailure);
@@ -537,7 +538,7 @@ var vep = require("./vep");
 
 
   asyncTest("authenticate with XHR failure", function() {
-    failureCheck(lib.authenticate, "testuser@testuser.com", "testuser");
+    failureCheck(lib.authenticate, TEST_EMAIL, "testuser");
   });
 
 
@@ -717,7 +718,7 @@ var vep = require("./vep");
     lib.verifyEmailNoPassword("token", function onSuccess(info) {
 
       ok(info.valid, "token was valid");
-      equal(info.email, "testuser@testuser.com", "email part of info");
+      equal(info.email, TEST_EMAIL, "email part of info");
       equal(info.origin, testOrigin, "origin in info");
       equal(storage.getStagedOnBehalfOf(), "", "initiating origin was removed");
 
@@ -750,7 +751,7 @@ var vep = require("./vep");
     lib.verifyEmailWithPassword("token", "password", function onSuccess(info) {
 
       ok(info.valid, "token was valid");
-      equal(info.email, "testuser@testuser.com", "email part of info");
+      equal(info.email, TEST_EMAIL, "email part of info");
       equal(info.origin, testOrigin, "origin in info");
       equal(storage.getStagedOnBehalfOf(), "", "initiating origin was removed");
 
@@ -853,17 +854,17 @@ var vep = require("./vep");
   asyncTest("syncEmails with no pre-loaded identities and identities to add", function() {
     lib.syncEmails(function onSuccess() {
       var identities = lib.getStoredEmailKeypairs();
-      ok("testuser@testuser.com" in identities, "Our new email is added");
+      ok(TEST_EMAIL in identities, "Our new email is added");
       equal(_.size(identities), 1, "there is one identity");
       start();
     }, testHelpers.unexpectedXHRFailure);
   });
 
   asyncTest("syncEmails with identities preloaded and none to add", function() {
-    storage.addEmail("testuser@testuser.com", {});
+    storage.addEmail(TEST_EMAIL, {});
     lib.syncEmails(function onSuccess() {
       var identities = lib.getStoredEmailKeypairs();
-      ok("testuser@testuser.com" in identities, "Our new email is added");
+      ok(TEST_EMAIL in identities, "Our new email is added");
       equal(_.size(identities), 1, "there is one identity");
       start();
     }, testHelpers.unexpectedXHRFailure);
@@ -871,13 +872,13 @@ var vep = require("./vep");
 
 
   asyncTest("syncEmails with identities preloaded and one to add", function() {
-    storage.addEmail("testuser@testuser.com", {pubkey: pubkey, cert: random_cert});
+    storage.addEmail(TEST_EMAIL, {pubkey: pubkey, cert: random_cert});
 
     xhr.useResult("multiple");
 
     lib.syncEmails(function onSuccess() {
       var identities = lib.getStoredEmailKeypairs();
-      ok("testuser@testuser.com" in identities, "Our old email address is still there");
+      ok(TEST_EMAIL in identities, "Our old email address is still there");
       ok("testuser2@testuser.com" in identities, "Our new email is added");
       equal(_.size(identities), 2, "there are two identities");
       start();
@@ -886,12 +887,12 @@ var vep = require("./vep");
 
 
   asyncTest("syncEmails with identities preloaded and one to remove", function() {
-    storage.addEmail("testuser@testuser.com", {pub: pubkey, cert: random_cert});
+    storage.addEmail(TEST_EMAIL, {pub: pubkey, cert: random_cert});
     storage.addEmail("testuser2@testuser.com", {pub: pubkey, cert: random_cert});
 
     lib.syncEmails(function onSuccess() {
       var identities = lib.getStoredEmailKeypairs();
-      ok("testuser@testuser.com" in identities, "Our old email address is still there");
+      ok(TEST_EMAIL in identities, "Our old email address is still there");
       equal("testuser2@testuser.com" in identities, false, "Our unknown email is removed");
       equal(_.size(identities), 1, "there is one identity");
       start();
@@ -899,11 +900,11 @@ var vep = require("./vep");
   });
 
   asyncTest("syncEmails with one to refresh", function() {
-    storage.addEmail("testuser@testuser.com", {pub: pubkey, cert: random_cert});
+    storage.addEmail(TEST_EMAIL, {pub: pubkey, cert: random_cert});
 
     lib.syncEmails(function onSuccess() {
       var identities = lib.getStoredEmailKeypairs();
-      ok("testuser@testuser.com" in identities, "refreshed key is synced");
+      ok(TEST_EMAIL in identities, "refreshed key is synced");
       start();
     }, testHelpers.unexpectedXHRFailure);
   });
@@ -913,20 +914,20 @@ var vep = require("./vep");
   });
 
   asyncTest("getAssertion with known email that has key", function() {
-    lib.syncEmailKeypair("testuser@testuser.com", function() {
-      lib.getAssertion("testuser@testuser.com", lib.getOrigin(), function onSuccess(assertion) {
+    lib.syncEmailKeypair(TEST_EMAIL, function() {
+      lib.getAssertion(TEST_EMAIL, lib.getOrigin(), function onSuccess(assertion) {
         testAssertion(assertion, start);
-        equal(storage.site.get(testOrigin, "email"), "testuser@testuser.com", "email address was persisted");
+        equal(storage.site.get(testOrigin, "email"), TEST_EMAIL, "email address was persisted");
       }, testHelpers.unexpectedXHRFailure);
     }, testHelpers.unexpectedXHRFailure);
   });
 
 
   asyncTest("getAssertion with known secondary email that does not have a key", function() {
-    storage.addEmail("testuser@testuser.com", { type: "secondary" });
-    lib.getAssertion("testuser@testuser.com", lib.getOrigin(), function onSuccess(assertion) {
+    storage.addEmail(TEST_EMAIL, { type: "secondary" });
+    lib.getAssertion(TEST_EMAIL, lib.getOrigin(), function onSuccess(assertion) {
       testAssertion(assertion, start);
-      equal(storage.site.get(testOrigin, "email"), "testuser@testuser.com", "email address was persisted");
+      equal(storage.site.get(testOrigin, "email"), TEST_EMAIL, "email address was persisted");
     }, testHelpers.unexpectedXHRFailure);
   });
 
@@ -962,7 +963,7 @@ var vep = require("./vep");
   });
 
   asyncTest("getAssertion with unknown email", function() {
-    lib.syncEmailKeypair("testuser@testuser.com", function() {
+    lib.syncEmailKeypair(TEST_EMAIL, function() {
       lib.getAssertion("testuser2@testuser.com", lib.getOrigin(), function onSuccess(assertion) {
         equal(null, assertion, "email was unknown, we do not have an assertion");
         equal(storage.site.get(testOrigin, "email"), undefined, "email address was not set");
@@ -972,13 +973,13 @@ var vep = require("./vep");
   });
 
   asyncTest("getAssertion with XHR failure", function() {
-    storage.addEmail("testuser@testuser.com", {});
-    failureCheck(lib.getAssertion, "testuser@testuser.com", lib.getOrigin());
+    storage.addEmail(TEST_EMAIL, {});
+    failureCheck(lib.getAssertion, TEST_EMAIL, lib.getOrigin());
   });
 
 
   asyncTest("logoutUser", function(onSuccess) {
-    lib.authenticate("testuser@testuser.com", "testuser", function(authenticated) {
+    lib.authenticate(TEST_EMAIL, "testuser", function(authenticated) {
       lib.syncEmails(function() {
         var storedIdentities = storage.getEmails();
         equal(_.size(storedIdentities), 1, "one identity");
@@ -996,7 +997,7 @@ var vep = require("./vep");
   });
 
   asyncTest("logoutUser with XHR failure", function(onSuccess) {
-    lib.authenticate("testuser@testuser.com", "testuser", function(authenticated) {
+    lib.authenticate(TEST_EMAIL, "testuser", function(authenticated) {
       lib.syncEmails(function() {
         failureCheck(lib.logoutUser);
       }, testHelpers.unexpectedXHRFailure);
@@ -1036,7 +1037,7 @@ var vep = require("./vep");
   });
 
   asyncTest("addressInfo with XHR Error", function() {
-    failureCheck(lib.addressInfo, "testuser@testuser.com");
+    failureCheck(lib.addressInfo, TEST_EMAIL);
   });
 
   asyncTest("addressInfo with unknown secondary user", function() {
@@ -1106,7 +1107,7 @@ var vep = require("./vep");
   });
 
   asyncTest("hasSecondary returns true if the user has at least one secondary email address", function() {
-    storage.addEmail("testuser@testuser.com", { type: "secondary" });
+    storage.addEmail(TEST_EMAIL, { type: "secondary" });
     lib.hasSecondary(function(hasSecondary) {
       equal(hasSecondary, true, "hasSecondary is true");
       start();
@@ -1114,7 +1115,7 @@ var vep = require("./vep");
   });
 
   asyncTest("setComputerOwnershipStatus with true, isUsersComputer - mark the computer as the users, prolongs the user's session", function() {
-    lib.authenticate("testuser@testuser.com", "password", function() {
+    lib.authenticate(TEST_EMAIL, "password", function() {
       storage.usersComputer.clear(network.userid());
       lib.setComputerOwnershipStatus(true, function() {
         lib.isUsersComputer(function(usersComputer) {
@@ -1126,7 +1127,7 @@ var vep = require("./vep");
   });
 
   asyncTest("setComputerOwnershipStatus with false, isUsersComputer - mark the computer as not the users", function() {
-    lib.authenticate("testuser@testuser.com", "password", function() {
+    lib.authenticate(TEST_EMAIL, "password", function() {
       storage.usersComputer.clear(network.userid());
       lib.setComputerOwnershipStatus(false, function() {
         lib.isUsersComputer(function(usersComputer) {
@@ -1145,7 +1146,7 @@ var vep = require("./vep");
   });
 
   asyncTest("setComputerOwnershipStatus with true & XHR Failure - call onFailure", function() {
-    lib.authenticate("testuser@testuser.com", "password", function() {
+    lib.authenticate(TEST_EMAIL, "password", function() {
       xhr.useResult("ajaxError");
       lib.setComputerOwnershipStatus(true,
         testHelpers.unexpectedSuccess,
@@ -1154,4 +1155,40 @@ var vep = require("./vep");
     }, testHelpers.unexpectedXHRFailure);
   });
 
+  asyncTest("shouldAskIfUsersComputer with user who has been asked - call onSuccess with false", function() {
+    lib.authenticate(TEST_EMAIL, "password", function() {
+      storage.usersComputer.setConfirmed(network.userid());
+      lib.shouldAskIfUsersComputer(function(shouldAsk) {
+        equal(shouldAsk, false, "user has been asked already, do not ask again");
+        start();
+      }, testHelpers.expectedXHRFailure);
+    }, testHelpers.unexpectedXHRFailure);
+  });
+
+  asyncTest("shouldAskIfUsersComputer with user who has not been asked and has not verified email this dialog session - call onSuccess with true", function() {
+    lib.authenticate(TEST_EMAIL, "password", function() {
+      storage.usersComputer.forceAsk(network.userid());
+      lib.shouldAskIfUsersComputer(function(shouldAsk) {
+        equal(shouldAsk, true, "user has not verified an email this dialog session and should be asked");
+        start();
+      }, testHelpers.expectedXHRFailure);
+    }, testHelpers.unexpectedXHRFailure);
+  });
+
+  asyncTest("shouldAskIfUsersComputer with user who has not been asked and has verified email in this dialog session - call onSuccess with false", function() {
+    lib.authenticate(TEST_EMAIL, "password", function() {
+      storage.setStagedOnBehalfOf(testOrigin);
+      xhr.useResult("complete");
+
+      lib.waitForEmailValidation(TEST_EMAIL, function() {
+        storage.usersComputer.forceAsk(network.userid());
+        lib.shouldAskIfUsersComputer(function(shouldAsk) {
+          equal(shouldAsk, false, "user has verified an email this dialog session and should be asked");
+          start();
+        }, testHelpers.expectedXHRFailure);
+      }, testHelpers.unexpectedXHRFailure);
+      xhr.useResult
+    }, testHelpers.unexpectedXHRFailure);
+  });
+
 }());
diff --git a/resources/static/test/mocks/xhr.js b/resources/static/test/mocks/xhr.js
index 7ff902b893270b62b6916fdbff90848cb4a8c4b8..14c08098bdb87b1653e03db4ce9e85cc62811596 100644
--- a/resources/static/test/mocks/xhr.js
+++ b/resources/static/test/mocks/xhr.js
@@ -82,6 +82,7 @@ BrowserID.Mocks.xhr = (function() {
       "post /wsapi/stage_email throttle": 429,
       "post /wsapi/stage_email ajaxError": undefined,
       "post /wsapi/cert_key ajaxError": undefined,
+      "get /wsapi/email_addition_status?email=testuser%40testuser.com complete": { status: "complete" },
       "get /wsapi/email_addition_status?email=registered%40testuser.com pending": { status: "pending" },
       "get /wsapi/email_addition_status?email=registered%40testuser.com complete": { status: "complete" },
       "get /wsapi/email_addition_status?email=registered%40testuser.com mustAuth": { status: "mustAuth" },