diff --git a/src/vector/getconfig.js b/src/vector/getconfig.js
index f3e7bea1..239ba806 100644
--- a/src/vector/getconfig.js
+++ b/src/vector/getconfig.js
@@ -33,35 +33,33 @@ export async function getVectorConfig(relativeLocation) {
 }
 
 function getConfig(configJsonFilename) {
-    let deferred = Promise.defer();
-
-    request(
-        { method: "GET", url: configJsonFilename },
-        (err, response, body) => {
-            if (err || response.status < 200 || response.status >= 300) {
-                // Lack of a config isn't an error, we should
-                // just use the defaults.
-                // Also treat a blank config as no config, assuming
-                // the status code is 0, because we don't get 404s
-                // from file: URIs so this is the only way we can
-                // not fail if the file doesn't exist when loading
-                // from a file:// URI.
-                if (response) {
-                    if (response.status == 404 || (response.status == 0 && body == '')) {
-                        deferred.resolve({});
+    return new Promise(function(resolve, reject) {
+        request(
+            { method: "GET", url: configJsonFilename },
+            (err, response, body) => {
+                if (err || response.status < 200 || response.status >= 300) {
+                    // Lack of a config isn't an error, we should
+                    // just use the defaults.
+                    // Also treat a blank config as no config, assuming
+                    // the status code is 0, because we don't get 404s
+                    // from file: URIs so this is the only way we can
+                    // not fail if the file doesn't exist when loading
+                    // from a file:// URI.
+                    if (response) {
+                        if (response.status == 404 || (response.status == 0 && body == '')) {
+                            resolve({});
+                        }
                     }
+                    reject({err: err, response: response});
+                    return;
                 }
-                deferred.reject({err: err, response: response});
-                return;
-            }
 
-            // We parse the JSON ourselves rather than use the JSON
-            // parameter, since this throws a parse error on empty
-            // which breaks if there's no config.json and we're
-            // loading from the filesystem (see above).
-            deferred.resolve(JSON.parse(body));
-        }
-    );
-
-    return deferred.promise;
+                // We parse the JSON ourselves rather than use the JSON
+                // parameter, since this throws a parse error on empty
+                // which breaks if there's no config.json and we're
+                // loading from the filesystem (see above).
+                resolve(JSON.parse(body));
+            },
+        );
+    });
 }
diff --git a/src/vector/index.js b/src/vector/index.js
index fffdac1b..ec3cb4dc 100644
--- a/src/vector/index.js
+++ b/src/vector/index.js
@@ -60,12 +60,12 @@ import CallHandler from 'matrix-react-sdk/lib/CallHandler';
 
 import {getVectorConfig} from './getconfig';
 
+let lastLocationHashSet = null;
+
 // Disable warnings for now: we use deprecated bluebird functions
 // and need to migrate, but they spam the console with warnings.
 Promise.config({warnings: false});
 
-let lastLocationHashSet = null;
-
 function initRageshake() {
     rageshake.init().then(() => {
         console.log("Initialised rageshake: See https://bugs.chromium.org/p/chromium/issues/detail?id=583193 to fix line numbers on Chrome.");
@@ -179,37 +179,35 @@ function makeRegistrationUrl(params) {
 }
 
 function getConfig(configJsonFilename) {
-    let deferred = Promise.defer();
-
-    request(
-        { method: "GET", url: configJsonFilename },
-        (err, response, body) => {
-            if (err || response.status < 200 || response.status >= 300) {
-                // Lack of a config isn't an error, we should
-                // just use the defaults.
-                // Also treat a blank config as no config, assuming
-                // the status code is 0, because we don't get 404s
-                // from file: URIs so this is the only way we can
-                // not fail if the file doesn't exist when loading
-                // from a file:// URI.
-                if (response) {
-                    if (response.status == 404 || (response.status == 0 && body == '')) {
-                        deferred.resolve({});
+    return new Promise(function(resolve, reject) {
+        request(
+            { method: "GET", url: configJsonFilename },
+            (err, response, body) => {
+                if (err || response.status < 200 || response.status >= 300) {
+                    // Lack of a config isn't an error, we should
+                    // just use the defaults.
+                    // Also treat a blank config as no config, assuming
+                    // the status code is 0, because we don't get 404s
+                    // from file: URIs so this is the only way we can
+                    // not fail if the file doesn't exist when loading
+                    // from a file:// URI.
+                    if (response) {
+                        if (response.status == 404 || (response.status == 0 && body == '')) {
+                            resolve({});
+                        }
                     }
+                    reject({err: err, response: response});
+                    return;
                 }
-                deferred.reject({err: err, response: response});
-                return;
-            }
 
-            // We parse the JSON ourselves rather than use the JSON
-            // parameter, since this throws a parse error on empty
-            // which breaks if there's no config.json and we're
-            // loading from the filesystem (see above).
-            deferred.resolve(JSON.parse(body));
-        }
-    );
-
-    return deferred.promise;
+                // We parse the JSON ourselves rather than use the JSON
+                // parameter, since this throws a parse error on empty
+                // which breaks if there's no config.json and we're
+                // loading from the filesystem (see above).
+                resolve(JSON.parse(body));
+            },
+        );
+    });
 }
 
 function onTokenLoginCompleted() {
diff --git a/src/vector/platform/WebPlatform.js b/src/vector/platform/WebPlatform.js
index a3ea12e8..cfe51346 100644
--- a/src/vector/platform/WebPlatform.js
+++ b/src/vector/platform/WebPlatform.js
@@ -68,11 +68,11 @@ export default class WebPlatform extends VectorBasePlatform {
         // annoyingly, the latest spec says this returns a
         // promise, but this is only supported in Chrome 46
         // and Firefox 47, so adapt the callback API.
-        const defer = Promise.defer();
-        global.Notification.requestPermission((result) => {
-            defer.resolve(result);
+        return new Promise(function(resolve, reject) {
+            global.Notification.requestPermission((result) => {
+                resolve(result);
+            });
         });
-        return defer.promise;
     }
 
     displayNotification(title: string, msg: string, avatarUrl: string, room: Object) {
@@ -103,31 +103,31 @@ export default class WebPlatform extends VectorBasePlatform {
     }
 
     _getVersion(): Promise<string> {
-        const deferred = Promise.defer();
-
         // We add a cachebuster to the request to make sure that we know about
         // the most recent version on the origin server. That might not
         // actually be the version we'd get on a reload (particularly in the
         // presence of intermediate caching proxies), but still: we're trying
         // to tell the user that there is a new version.
-        request(
-            {
-                method: "GET",
-                url: "version",
-                qs: { cachebuster: Date.now() },
-            },
-            (err, response, body) => {
-                if (err || response.status < 200 || response.status >= 300) {
-                    if (err === null) err = { status: response.status };
-                    deferred.reject(err);
-                    return;
-                }
 
-                const ver = body.trim();
-                deferred.resolve(ver);
-            },
-        );
-        return deferred.promise;
+        return new Promise(function(resolve, reject) {
+            request(
+                {
+                    method: "GET",
+                    url: "version",
+                    qs: { cachebuster: Date.now() },
+                },
+                (err, response, body) => {
+                    if (err || response.status < 200 || response.status >= 300) {
+                        if (err === null) err = { status: response.status };
+                        reject(err);
+                        return;
+                    }
+
+                    const ver = body.trim();
+                    resolve(ver);
+                },
+            );
+        });
     }
 
     getAppVersion(): Promise<string> {