diff --git a/resources/static/shared/xhr.js b/resources/static/shared/xhr.js
index e88b357400ea91671ad84c8f494a3c823717b6ee..ace42d70d9fb5143c61cdde21c04c811ae01b322 100644
--- a/resources/static/shared/xhr.js
+++ b/resources/static/shared/xhr.js
@@ -29,21 +29,19 @@ BrowserID.XHR = (function() {
     clearContext();
   }
 
-  function xhrError(cb, info) {
-    return function(jqXHR, textStatus, errorThrown) {
-      info = info || {};
-      var network = _.extend(info.network || {}, {
-        status: jqXHR && jqXHR.status,
-        textStatus: textStatus,
-        errorThrown: errorThrown,
-        responseText: jqXHR.responseText
-      });
+  function xhrError(cb, info, jqXHR, textStatus, errorThrown) {
+    info = info || {};
+    var network = _.extend(info.network || {}, {
+      status: jqXHR && jqXHR.status,
+      textStatus: textStatus,
+      errorThrown: errorThrown,
+      responseText: jqXHR.responseText
+    });
 
-      info.network = network;
-      mediator.publish("xhr_error", info);
+    info.network = network;
+    mediator.publish("xhr_error", info);
 
-      if (cb) cb(info);
-    };
+    if (cb) cb(info);
   }
 
   function xhrDelay(reqInfo) {
@@ -88,7 +86,7 @@ BrowserID.XHR = (function() {
           }
 
           xhrComplete(reqInfo);
-          _.defer(xhrError(errorCB, reqInfo).curry(resp, jqXHR, textResponse));
+          _.defer(xhrError.curry(errorCB, reqInfo, resp, jqXHR, textResponse));
         };
 
     var req = _.extend({}, options, {
@@ -115,8 +113,6 @@ BrowserID.XHR = (function() {
   function withContext(cb, onFailure) {
     if (typeof context !== 'undefined') cb(context);
     else {
-      // We do not use get because the success response is deferred making our
-      // local/server time offset calculations skewed.
       request({
         type: "GET",
         url: "/wsapi/session_context",
@@ -126,6 +122,10 @@ BrowserID.XHR = (function() {
 
           mediator.publish("context_info", result);
 
+          if(!result.has_cookies) {
+            mediator.publish("no_cookies");
+          }
+
           cb && cb(result);
         },
         error: onFailure
diff --git a/resources/static/test/qunit/mocks/xhr.js b/resources/static/test/qunit/mocks/xhr.js
index 88a9cde5ed50b538d51dd7f375bf161f7fd2db57..b89f89808b71f51f9508e0bee4bb9dee8abdf4d3 100644
--- a/resources/static/test/qunit/mocks/xhr.js
+++ b/resources/static/test/qunit/mocks/xhr.js
@@ -13,7 +13,8 @@ BrowserID.Mocks.xhr = (function() {
       authenticated: false,
       auth_level: undefined,
       code_version: "ABC123",
-      random_seed: "H+ZgKuhjVckv/H4i0Qvj/JGJEGDVOXSIS5RCOjY9/Bo="
+      random_seed: "H+ZgKuhjVckv/H4i0Qvj/JGJEGDVOXSIS5RCOjY9/Bo=",
+      has_cookies: true
     };
 
   // this cert is meaningless, but it has the right format
diff --git a/resources/static/test/qunit/shared/xhr_unit_test.js b/resources/static/test/qunit/shared/xhr_unit_test.js
index 926e7cb646d70d0f22cf1554a79f431937d2ff15..750b96ab7815dbc7f061ad7422ab6df7f850883b 100644
--- a/resources/static/test/qunit/shared/xhr_unit_test.js
+++ b/resources/static/test/qunit/shared/xhr_unit_test.js
@@ -177,7 +177,18 @@
         start();
       }
     });
+  });
+
+  asyncTest("withContext with has_cookies set to false - trigger 'no_cookies'", function() {
+    transport.setContextInfo("has_cookies", false);
+
+    var noCookiesCalled;
+    testHelpers.register("no_cookies");
 
+    xhr.withContext(function() {
+      testHelpers.testTriggered("no_cookies");
+      start();
+    }, testHelpers.unexpectedXHRFailure);
   });
 
 
diff --git a/resources/static/test/qunit/testHelpers/helpers.js b/resources/static/test/qunit/testHelpers/helpers.js
index 3b903d40927160c03d542a4e6fef3832efbf945a..435fde547610f4e7f9d4cde3c72e55f4b96c6687 100644
--- a/resources/static/test/qunit/testHelpers/helpers.js
+++ b/resources/static/test/qunit/testHelpers/helpers.js
@@ -59,6 +59,7 @@ BrowserID.TestHelpers = (function() {
 
       transport.setDelay(0);
       transport.setContextInfo("auth_level", undefined);
+      transport.setContextInfo("has_cookies", true);
       transport.useResult("valid");
 
       network.init();
@@ -109,6 +110,10 @@ BrowserID.TestHelpers = (function() {
       return calls[message];
     },
 
+    testTriggered: function(message) {
+      equal(calls[message], true, message + " was triggered");
+    },
+
     errorVisible: function() {
       return screens.error.visible;
     },