+              
                 Approved Devices:
               
-              
+
             
-              
+              
                 Approved Applications:
               
-              
-            
-              
-                
-                
OAUTH3.discover("", opts);
-                
OAUTH3.urls.discover("", opts);
-                
-                
-                
-                
-                
-              
-            
diff --git a/js/playground.js b/js/playground.js
index 805ebd9..b1e7c2d 100644
--- a/js/playground.js
+++ b/js/playground.js
@@ -31,10 +31,11 @@
     vm.providerUri = vm.conf.client_uri;
     // map of things being debounced presently
     vm.debouncing = {};
+    vm.defaults = { provider: vm.conf.provider_uri, directives: null };
 
     vm.form = {};
     vm.form.id = '';
-    vm.form.user = '';
+    vm.form.subject = '';
     vm.form.userProvider = '';
     vm.form.provider = '';
 
@@ -74,24 +75,35 @@
         // The username may have a single @, the provider may not
         // user@thing.com@whatever.com -> user@thing.com, whatever.com
         provider = parts.pop();
-        vm.form.user = parts.join('');
+        user = parts.join('');
       } else {
         //vm.form.hasUser = false;
-        vm.form.user = '';
+        user = '';
         provider = parts.join('');
       }
 
-      if (!vm.form.providerIndependent) {
-        vm.form.provider = provider;
-      }
-      vm.form.userProvider = provider;
+      vm.form.subject = vm.form.id;
 
-      parts = vm.form.provider.split('.');
       return vm.fn.debounce('provider', 250).then(function () {
+        var parts = vm.form.provider.split('.');
+        if (!vm.form.providerIndependent) {
+          vm.form.provider = provider;
+        }
+        vm.form.userProvider = provider;
         // Careful: don't use state within a debounce function
         // uses vm.form.provider for lookup
         if (parts.length >= 2 && parts[parts.length - 1].length >= 2 && parts.every(function (p) {return p.length})) {
-          return vm.api.discover();
+          return vm.api.discover().then(function () {
+            console.log('[changeUser] vm.directives:');
+            console.log(vm.directives);
+            console.log(provider);
+            console.log(OAUTH3.uri.normalize(vm.directives.issuer));
+            if (vm.directives && provider === OAUTH3.uri.normalize(vm.directives.issuer)) {
+              vm.form.subject = user;
+            } else {
+              vm.form.subject = vm.form.id;
+            }
+          });
         }
       });
     };
@@ -156,6 +168,7 @@
     };
     vm.api._discoverCount = 0;
     vm.api.discover = function () {
+      vm.directives = null;
       vm.validated.provider = '';
       vm.api._discoverCount += 1;
       var latest = vm.api._discoverCount;
@@ -178,8 +191,19 @@
         console.log(dir);
         vm.validated.provider = provider;
         vm.directives = dir;
+
+        var opts = {
+          client_uri: vm.conf.client_uri
+        , subject: vm.form.subject || undefined
+        , debug: vm.debug || undefined
+        };
+        vm.implicitGrantObj = OAUTH3.urls.implicitGrant(vm.directives, opts);
+        vm.implicitGrantUrl = (OAUTH3.url.normalize(provider) + '/' + vm.implicitGrantObj.url).replace(vm.implicitGrantObj.state, '{{random}}');
         //JSON.stringify(dir, null, 2);
       }, function (err) {
+        vm.form.provider = vm.defaults.provider;
+        vm.validated.provider = vm.defaults.provider;
+        vm.directives = vm.defaults.directives;
         if (latest !== vm.api._discoverCount) {
           console.warn('[DEBUG] ignoring stale discover error for', provider);
           console.warn(err);
@@ -195,15 +219,26 @@
       var provider = vm.validated.provider;
       var opts = {
         client_uri: vm.conf.client_uri
-      , subject: vm.form.user
+      , subject: vm.form.subject || undefined
+      , debug: vm.debug || undefined
       };
 
+      console.log('[DEBUG] vm.directives');
+      console.log(vm.directives);
       vm.implicitGrantObj = OAUTH3.urls.implicitGrant(vm.directives, opts);
       console.log('[DEBUG] vm.implicitGrantObj');
       console.log(vm.implicitGrantObj);
-      vm.implicitGrantUrl = OAUTH3.url.normalize(provider) + '/' + vm.implicitGrantObj.query._pathname;
-      return OAUTH3.implicitGrant(provider, opts);
+      vm.implicitGrantUrl = (OAUTH3.url.normalize(provider) + '/' + vm.implicitGrantObj.url);
+      return OAUTH3.implicitGrant(vm.directives, opts).then(function (session) {
+        vm.session = session;
+      });
     };
 
+    vm.form.provider = vm.defaults.provider;
+    vm.validated.provider = vm.defaults.provider;
+    vm.api.discover().then(function () {
+      vm.defaults.directives = vm.directives;
+    });
+
 	} ] );
 }());