diff --git a/resources/static/dialog/controllers/dialog_controller.js b/resources/static/dialog/controllers/dialog_controller.js
index 7bffc9bb41da665f7a7a638dc88c79fb5373d2a8..9efb1d683554618f92b77130bc7d8aa32a552622 100644
--- a/resources/static/dialog/controllers/dialog_controller.js
+++ b/resources/static/dialog/controllers/dialog_controller.js
@@ -118,8 +118,13 @@
         self.doCheckAuth();
 
         dom.bindEvent(win, "unload", function() {
-          bid.Storage.setStagedOnBehalfOf("");
-          self.doCancel();
+          // do this only if something else hasn't
+          // declared success
+          if (!self.success) {
+            bid.Storage.setStagedOnBehalfOf("");
+            self.doCancel();
+          }
+          window.teardownChannel();
         });
       },
 
@@ -295,6 +300,7 @@
         // calls window.close, which would trigger the onerror callback if we
         // tried this afterwards.
         self.onerror = null;
+        self.success = true;
         self.onsuccess(assertion);
       },
 
diff --git a/resources/static/dialog/resources/channel.js b/resources/static/dialog/resources/channel.js
index d98f44680cc76dcbf8887d0579b779ba7909256d..5e51e0e21ef80a63d1090851193e4bcf613ed194 100644
--- a/resources/static/dialog/resources/channel.js
+++ b/resources/static/dialog/resources/channel.js
@@ -110,6 +110,16 @@
       setupIFrameChannel(controller);
   }
 
+  function close() {
+    var frameWindow = getRelayWindow();
+    
+    if (frameWindow) {
+      frameWindow.BrowserID.Relay.unregisterClient();
+    }
+    else {
+      throw "relay frame not found";
+    }    
+  }
 
   function init(options) {
     onCompleteCallback = undefined;
@@ -139,7 +149,12 @@
        * @param {object} options - contains:
        * *   options.getVerifiedEmail {function} - function to /get
        */
-      open: open
+      open: open,
+
+      /**
+       * Close the channel
+       */
+      close: close
     };
   }
 
@@ -148,4 +163,5 @@
    * window.setupChannel;
    */
   window.setupChannel = open;
+  window.teardownChannel = close;
 }());
diff --git a/resources/static/relay/relay.js b/resources/static/relay/relay.js
index 2c434508d6f866eb6c97929c892d3b5dcadaccf1..73dd22d89f1a0e50cd2cd2a6cdfea23749d02a24 100644
--- a/resources/static/relay/relay.js
+++ b/resources/static/relay/relay.js
@@ -124,6 +124,10 @@
       forwardCall();
     }
 
+    function unregisterClient() {
+      registeredMethods = null;
+    }
+
     function getVerboseMessage(code) {
       var msgs = {
         "canceled": "user canceled selection",
@@ -157,7 +161,8 @@
        * Register a client to use the relay
        * @method registerClient
        */
-      registerClient: registerClient
+      registerClient: registerClient,
+      unregisterClient: unregisterClient
     };
   }());