diff --git a/src/MatrixClientPeg.js b/src/MatrixClientPeg.js
index 0b6c2649..87e6af08 100644
--- a/src/MatrixClientPeg.js
+++ b/src/MatrixClientPeg.js
@@ -22,18 +22,25 @@ var Matrix = require("matrix-js-sdk");
 var matrixClient = null;
 
 var localStorage = window.localStorage;
+
+function createClient(hs_url, is_url, user_id, access_token) {
+    var opts = {
+        baseUrl: hs_url,
+        idBaseUrl: is_url,
+        accessToken: access_token,
+        userId: user_id
+    };
+
+    matrixClient = Matrix.createClient(opts);
+}
+
 if (localStorage) {
     var hs_url = localStorage.getItem("mx_hs_url");
     var is_url = localStorage.getItem("mx_is_url") || 'https://matrix.org';
     var access_token = localStorage.getItem("mx_access_token");
     var user_id = localStorage.getItem("mx_user_id");
     if (access_token && user_id && hs_url) {
-        matrixClient = Matrix.createClient({
-            baseUrl: hs_url,
-            idBaseUrl: is_url,
-            accessToken: access_token,
-            userId: user_id
-        });
+        matrixClient = createClient(hs_url, is_url, user_id, access_token);
     }
 }
 
@@ -42,15 +49,28 @@ module.exports = {
         return matrixClient;
     },
 
-    replace: function(cli) {
-        matrixClient = cli;
-    },
-
     replaceUsingUrls: function(hs_url, is_url) {
         matrixClient = Matrix.createClient({
             baseUrl: hs_url,
             idBaseUrl: is_url
         });
     }
+
+    replaceUsingAccessToken: function(hs_url, is_url, user_id, access_token) {
+        matrixClient = createClient(hs_url, is_url, user_id, access_token);
+        if (localStorage) {
+            try {
+                localStorage.clear();
+                localStorage.setItem("mx_hs_url", hs_url);
+                localStorage.setItem("mx_is_url", is_url);
+                localStorage.setItem("mx_user_id", user_id);
+                localStorage.setItem("mx_access_token", access_token);
+            } catch (e) {
+                console.warn("Error using local storage: can't persist session!");
+            }
+        } else {
+            console.warn("No local storage available: can't persist session!");
+        }
+    }
 };
 
diff --git a/src/controllers/templates/Login.js b/src/controllers/templates/Login.js
index 27669271..135b6433 100644
--- a/src/controllers/templates/Login.js
+++ b/src/controllers/templates/Login.js
@@ -75,29 +75,13 @@ module.exports = {
             'user': formVals.username,
             'password': formVals.password
         }).done(function(data) {
-            // XXX: we assume this means we're logged in, but there could be a next stage
-            MatrixClientPeg.replace(Matrix.createClient({
-                baseUrl: self.state.hs_url,
-                idBaseUrl: self.state.is_url,
-                userId: data.user_id,
-                accessToken: data.access_token
+            MatrixClientPeg.replaceUsingAccessToken(
+                this.state.hs_url, this.state.is_url,
+                data.user_id, data.access_token
+            );
             }));
-            var localStorage = window.localStorage;
-            if (localStorage) {
-                try {
-                    localStorage.clear();
-                    localStorage.setItem("mx_hs_url", self.state.hs_url);
-                    localStorage.setItem("mx_is_url", self.state.is_url);
-                    localStorage.setItem("mx_user_id", data.user_id);
-                    localStorage.setItem("mx_access_token", data.access_token);
-                } catch (e) {
-                    console.warn("Error using local storage: can't persist session!");
-                }
-            } else {
-                console.warn("No local storage available: can't persist session!");
-            }
-            if (self.props.onLoggedIn) {
-                self.props.onLoggedIn();
+            if (that.props.onLoggedIn) {
+                that.props.onLoggedIn();
             }
         }, function(error) {
             self.setStep("stage_m.login.password");
diff --git a/src/controllers/templates/Register.js b/src/controllers/templates/Register.js
index 89a3872d..faff4c66 100644
--- a/src/controllers/templates/Register.js
+++ b/src/controllers/templates/Register.js
@@ -259,20 +259,9 @@ module.exports = {
     },
 
     onRegistered: function(user_id, access_token) {
-        MatrixClientPeg.replace(Matrix.createClient({
-            baseUrl: this.state.hs_url,
-            idBaseUrl: this.state.is_url,
-            userId: user_id,
-            accessToken: access_token
-        }));
-        var localStorage = window.localStorage;
-        if (localStorage) {
-            localStorage.setItem("mx_hs_url", this.state.hs_url);
-            localStorage.setItem("mx_user_id", user_id);
-            localStorage.setItem("mx_access_token", access_token);
-        } else {
-            console.warn("No local storage available: can't persist session!");
-        }
+        MatrixClientPeg.replaceUsingAccessToken(
+            this.state.hs_url, this.state.is_url, user_id, access_token
+        );
         if (this.props.onLoggedIn) {
             this.props.onLoggedIn();
         }