diff --git a/src/DMRoomMap.js b/src/DMRoomMap.js
new file mode 100644
index 0000000000..d92ae87e64
--- /dev/null
+++ b/src/DMRoomMap.js
@@ -0,0 +1,46 @@
+/*
+Copyright 2016 OpenMarket Ltd
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+/**
+ * Class that takes a Matrix Client and flips the m.direct map
+ * so the operation of mapping a room ID to which user it's a DM
+ * with can be performed efficiently.
+ */
+export default class DMRoomMap {
+    constructor(matrixClient) {
+        const mDirectEvent = matrixClient.getAccountData('m.direct');
+        if (!mDirectEvent) {
+            this.userToRooms = {};
+            this.roomToUser = {};
+        } else {
+            this.userToRooms = mDirectEvent.getContent();
+            this.roomToUser = {};
+            for (const user of Object.keys(this.userToRooms)) {
+                for (const roomId of this.userToRooms[user]) {
+                    this.roomToUser[roomId] = user;
+                }
+            }
+        }
+    }
+
+    getDMRoomsForUserId(userId) {
+        return this.userToRooms[userId];
+    }
+
+    getUserIdForRoomId(roomId) {
+        return this.roomToUser[roomId];
+    }
+}
diff --git a/src/MatrixTools.js b/src/MatrixTools.js
index b95e21a4af..f3c0cd6949 100644
--- a/src/MatrixTools.js
+++ b/src/MatrixTools.js
@@ -59,7 +59,7 @@ module.exports = {
         }
     },
 
-    isDirectMessageRoom: function(room, me) {
+    looksLikeDirectMessageRoom: function(room, me) {
         if (me.membership == "join" || me.membership === "ban" ||
             (me.membership === "leave" && me.events.member.getSender() !== me.events.member.getStateKey()))
         {
diff --git a/src/components/views/rooms/RoomList.js b/src/components/views/rooms/RoomList.js
index 4fef4ff0a4..6ce85af82b 100644
--- a/src/components/views/rooms/RoomList.js
+++ b/src/components/views/rooms/RoomList.js
@@ -26,6 +26,7 @@ var dis = require("../../../dispatcher");
 var sdk = require('../../../index');
 var rate_limited_func = require('../../../ratelimitedfunc');
 var MatrixTools = require('../../../MatrixTools');
+var DMRoomMap = require('../../../DMRoomMap');
 
 var HIDE_CONFERENCE_CHANS = true;
 
@@ -209,8 +210,10 @@ module.exports = React.createClass({
         s.lists["m.lowpriority"] = [];
         s.lists["im.vector.fake.archived"] = [];
 
+        const dmRoomMap = new DMRoomMap(MatrixClientPeg.get());
+
         MatrixClientPeg.get().getRooms().forEach(function(room) {
-            var me = room.getMember(MatrixClientPeg.get().credentials.userId);
+            const me = room.getMember(MatrixClientPeg.get().credentials.userId);
             if (!me) return;
 
             // console.log("room = " + room.name + ", me.membership = " + me.membership +
@@ -224,7 +227,7 @@ module.exports = React.createClass({
             else if (HIDE_CONFERENCE_CHANS && MatrixTools.isConfCallRoom(room, me, self.props.ConferenceHandler)) {
                 // skip past this room & don't put it in any lists
             }
-            else if (MatrixTools.isDirectMessageRoom(room, me)) {
+            else if (dmRoomMap.getUserIdForRoomId(room.roomId)) {
                 // "Direct Message" rooms
                 s.lists["im.vector.fake.direct"].push(room);
             }
@@ -253,6 +256,23 @@ module.exports = React.createClass({
             }
         });
 
+        if (s.lists["im.vector.fake.direct"].length == 0 && MatrixClientPeg.get().getAccountData('m.direct') === undefined) {
+            // scan through the 'recents' list for any rooms which look like DM rooms
+            // and make them DM rooms
+            const oldRecents = s.lists["im.vector.fake.recent"];
+            s.lists["im.vector.fake.recent"] = [];
+
+            for (const room of oldRecents) {
+                const me = room.getMember(MatrixClientPeg.get().credentials.userId);
+
+                if (!me || MatrixTools.looksLikeDirectMessageRoom(room, me)) {
+                    s.lists["im.vector.fake.recent"].push(room);
+                } else {
+                    s.lists["im.vector.fake.direct"].push(room);
+                }
+            }
+        }
+
         //console.log("calculated new roomLists; im.vector.fake.recent = " + s.lists["im.vector.fake.recent"]);
 
         // we actually apply the sorting to this when receiving the prop in RoomSubLists.