diff --git a/resources/static/dialog/resources/channel.js b/resources/static/dialog/resources/channel.js
index b8ba0f92c790ede7a170862535b570ce06f7c468..a2dad83d7475d8e0d7cd0a1f97ac01afb4e38ba1 100644
--- a/resources/static/dialog/resources/channel.js
+++ b/resources/static/dialog/resources/channel.js
@@ -90,24 +90,24 @@
       // In a native channel, do nothing.
     }
     else {
-      var REGISTERED_METHODS = {
-        'get': function(origin, params, onsuccess, onerror) {
-          // check for old controller methods
-          // FIXME KILL THIS SOON
-          if (controller.get) {
-            return controller.get(origin, params, onsuccess, onerror);
-          } else {
-            return controller.getVerifiedEmail(origin, onsuccess, onerror);
+     getRelayWindow();
+
+      if (_relayWindow) {
+        var REGISTERED_METHODS = {
+          // The relay frame will give us the origin and a function to call when
+          // dialog processing is complete.
+          'get': function(origin, params, onsuccess, onerror) {
+            // check for old controller methods
+            // FIXME KILL THIS SOON
+            if (controller.get) {
+              return controller.get(origin, params, onsuccess, onerror);
+            } else {
+              return controller.getVerifiedEmail(origin, onsuccess, onerror);
+            }
           }
-        }
-      };
+        };
 
-      // The relay frame will give us the origin and a function to call when
-      // dialog processing is complete.
-      var frameWindow = getRelayWindow();
-
-      if (frameWindow) {
-        frameWindow.BrowserID.Relay.registerClient(REGISTERED_METHODS);
+        _relayWindow.BrowserID.Relay.registerClient(REGISTERED_METHODS);
       }
       else {
         throw "relay frame not found";
@@ -123,15 +123,11 @@
   }
 
   function close() {
-    var frameWindow = getRelayWindow();
-
-    if (frameWindow) {
-      frameWindow.BrowserID.Relay.unregisterClient();
+    // Only tear down if a channel has been established with a relay frame.
+    if (_relayWindow) {
+      _relayWindow.BrowserID.Relay.unregisterClient();
       _relayWindow = null;
     }
-    else {
-      throw "relay frame not found";
-    }
   }
 
   function init(options) {
diff --git a/resources/static/test/qunit/controllers/dialog_unit_test.js b/resources/static/test/qunit/controllers/dialog_unit_test.js
index 23941014f4bc74e8533f55d88914cff4aef97623..e6c2ea1a6b280bce3106765788e92a8fa50dc7e9 100644
--- a/resources/static/test/qunit/controllers/dialog_unit_test.js
+++ b/resources/static/test/qunit/controllers/dialog_unit_test.js
@@ -204,7 +204,7 @@
       error = e;
     }
 
-    equal(typeof error, "undefined", "no error thrown when unloading window");
+    equal(typeof error, "undefined", "unexpected error thrown when unloading window (" + error + ")");
   });
 
 }());
diff --git a/resources/static/test/qunit/resources/channel_unit_test.js b/resources/static/test/qunit/resources/channel_unit_test.js
index 878f2acbe0de4fe59db27a0b5052980c717e1536..6caff044943d0001347279d77a9e051c7d9d2bb2 100644
--- a/resources/static/test/qunit/resources/channel_unit_test.js
+++ b/resources/static/test/qunit/resources/channel_unit_test.js
@@ -159,5 +159,18 @@
     }
   });
 
+  test("close on a channel that has not been opened expects no errors", function() {
+    var error;
+
+    try {
+      channel.close();
+    }
+    catch(e) {
+      error = e;
+    }
+
+    equal(typeof error, "undefined", "unexpected error when closing channel (" + error + ")");
+  });
+
 }());