diff --git a/synapse/handlers/room.py b/synapse/handlers/room.py
index aca795e1c4fa816664c67ba0bfd53f5b63c5d516..a71cba8ef1cab426a1e6b6523ac1cdd86890e8e6 100644
--- a/synapse/handlers/room.py
+++ b/synapse/handlers/room.py
@@ -1022,7 +1022,7 @@ class RoomEventSource(object):
             events = list(room_events)
             events.extend(e for evs, _ in room_to_events.values() for e in evs)
 
-            events.sort(key=lambda e: e.internal_metadata.after)
+            events.sort(key=lambda e: e.internal_metadata.order)
 
             if limit:
                 events[:] = events[:limit]
diff --git a/synapse/storage/stream.py b/synapse/storage/stream.py
index fd84aa89963f8bfa7014a4caa44f3add3f1a08c7..a03458c2fce75f4e33cd8d11670fae2a03ea9ebc 100644
--- a/synapse/storage/stream.py
+++ b/synapse/storage/stream.py
@@ -598,6 +598,10 @@ class StreamStore(SQLBaseStore):
             internal = event.internal_metadata
             internal.before = str(RoomStreamToken(topo, stream - 1))
             internal.after = str(RoomStreamToken(topo, stream))
+            internal.order = (
+                int(topo) if topo else 0,
+                int(stream),
+            )
 
     @defer.inlineCallbacks
     def get_events_around(self, room_id, event_id, before_limit, after_limit):