diff --git a/src/components/structures/MatrixChat.js b/src/components/structures/MatrixChat.js
index 14c78bd7dc..e2c2a928d1 100644
--- a/src/components/structures/MatrixChat.js
+++ b/src/components/structures/MatrixChat.js
@@ -1104,6 +1104,7 @@ module.exports = React.createClass({
                     SettingLevel.ROOM_DEVICE,
                     "blacklistUnverifiedDevices",
                     room.roomId,
+                    /*explicit=*/true,
                 );
                 room.setBlacklistUnverifiedDevices(blacklistEnabled);
             }
diff --git a/src/components/views/dialogs/UnknownDeviceDialog.js b/src/components/views/dialogs/UnknownDeviceDialog.js
index ff2accf0b0..13c92cecc9 100644
--- a/src/components/views/dialogs/UnknownDeviceDialog.js
+++ b/src/components/views/dialogs/UnknownDeviceDialog.js
@@ -147,9 +147,12 @@ export default React.createClass({
             return <Spinner />;
         }
 
+        // The global value is treated as a default for when rooms don't specify a value.
         const client = MatrixClientPeg.get();
-        const blacklistUnverified = client.getGlobalBlacklistUnverifiedDevices() ||
-              this.props.room.getBlacklistUnverifiedDevices();
+        let blacklistUnverified = client.getGlobalBlacklistUnverifiedDevices();
+        if (this.props.room.getBlacklistUnverifiedDevices() !== null) {
+            blacklistUnverified = this.props.room.getBlacklistUnverifiedDevices();
+        }
 
         let warning;
         if (blacklistUnverified) {
diff --git a/src/components/views/rooms/RoomSettings.js b/src/components/views/rooms/RoomSettings.js
index ad26f19af5..fa108ce6c1 100644
--- a/src/components/views/rooms/RoomSettings.js
+++ b/src/components/views/rooms/RoomSettings.js
@@ -369,6 +369,7 @@ module.exports = React.createClass({
                 SettingLevel.ROOM_DEVICE,
                 "blacklistUnverifiedDevices",
                 this.props.room.roomId,
+                /*explicit=*/true,
             );
             this.props.room.setBlacklistUnverifiedDevices(value);
         });
@@ -592,21 +593,6 @@ module.exports = React.createClass({
             />
         );
 
-        const deviceBlacklisting = SettingsStore.getValueAt(
-            SettingLevel.DEVICE,
-            "blacklistUnverifiedDevices",
-            this.props.room.roomId,
-            /*explicit=*/true
-        );
-        if (deviceBlacklisting === true) {
-            settings = (
-                <label>
-                    <input type="checkbox" disabled={true} checked={true} />
-                    { SettingsStore.getDisplayName("blacklistUnverifiedDevices", SettingLevel.ROOM_DEVICE) }
-                </label>
-            );
-        }
-
         if (!isEncrypted && roomState.mayClientSendStateEvent("m.room.encryption", cli)) {
             return (
                 <div>
diff --git a/src/settings/Settings.js b/src/settings/Settings.js
index b432e613d3..52f85da58f 100644
--- a/src/settings/Settings.js
+++ b/src/settings/Settings.js
@@ -70,6 +70,11 @@ export const SETTINGS = {
     //
     //     // Optional settings controller. See SettingsController for more information.
     //     controller: new MySettingController(),
+    //
+    //     // Optional flag to make supportedLevels be respected as the order to handle
+    //     // settings. The first element is treated as "most preferred". The "default"
+    //     // level is always appended to the end.
+    //     supportedLevelsAreOrdered: false,
     // },
     "feature_groups": {
         isFeature: true,
@@ -197,7 +202,10 @@ export const SETTINGS = {
         default: 200,
     },
     "blacklistUnverifiedDevices": {
-        supportedLevels: ['device', 'room-device'],
+        // We specifically want to have room-device > device so that users may set a device default
+        // with a per-room override.
+        supportedLevels: ['room-device', 'device'],
+        supportedLevelsAreOrdered: true,
         displayName: {
             "default": _td('Never send encrypted messages to unverified devices from this device'),
             "room-device": _td('Never send encrypted messages to unverified devices in this room from this device'),
diff --git a/src/settings/SettingsStore.js b/src/settings/SettingsStore.js
index db7ae807e3..b6343c4a96 100644
--- a/src/settings/SettingsStore.js
+++ b/src/settings/SettingsStore.js
@@ -191,14 +191,18 @@ export default class SettingsStore {
      * @return {*} The value, or null if not found.
      */
     static getValueAt(level, settingName, roomId = null, explicit = false, excludeDefault = false) {
-        const minIndex = LEVEL_ORDER.indexOf(level);
-        if (minIndex === -1) throw new Error("Level " + level + " is not prioritized");
-
         // Verify that the setting is actually a setting
         if (!SETTINGS[settingName]) {
             throw new Error("Setting '" + settingName + "' does not appear to be a setting.");
         }
 
+        const setting = SETTINGS[settingName];
+        const levelOrder = (setting.supportedLevelsAreOrdered ? setting.supportedLevels : LEVEL_ORDER);
+        if (!levelOrder.includes("default")) levelOrder.push("default"); // always include default
+
+        const minIndex = levelOrder.indexOf(level);
+        if (minIndex === -1) throw new Error("Level " + level + " is not prioritized");
+
         if (SettingsStore.isFeature(settingName)) {
             const configValue = SettingsStore._getFeatureState(settingName);
             if (configValue === "enable") return true;
@@ -215,10 +219,10 @@ export default class SettingsStore {
             return SettingsStore._tryControllerOverride(settingName, level, roomId, value);
         }
 
-        for (let i = minIndex; i < LEVEL_ORDER.length; i++) {
-            const handler = handlers[LEVEL_ORDER[i]];
+        for (let i = minIndex; i < levelOrder.length; i++) {
+            const handler = handlers[levelOrder[i]];
             if (!handler) continue;
-            if (excludeDefault && LEVEL_ORDER[i] === "default") continue;
+            if (excludeDefault && levelOrder[i] === "default") continue;
 
             const value = handler.getValue(settingName, roomId);
             if (value === null || value === undefined) continue;