diff --git a/src/components/navigation/left/HomeSidebar.tsx b/src/components/navigation/left/HomeSidebar.tsx
index d014de108e53c75ab3a86331a47b7318fc6abcd1..a3082f354d517245725f3ff00e264bf3b6f7adc8 100644
--- a/src/components/navigation/left/HomeSidebar.tsx
+++ b/src/components/navigation/left/HomeSidebar.tsx
@@ -7,7 +7,7 @@ import { WithDispatcher } from "../../../redux/reducers";
 import { Unreads } from "../../../redux/reducers/unreads";
 import { connectState } from "../../../redux/connector";
 import { AppContext } from "../../../context/revoltjs/RevoltClient";
-import { useChannels, useForceUpdate, useUsers } from "../../../context/revoltjs/hooks";
+import { useChannels, useDMs, useForceUpdate, useUsers } from "../../../context/revoltjs/hooks";
 import { Users as UsersNS } from 'revolt.js/dist/api/objects';
 import { mapChannelWithUnread, useUnreads } from "./common";
 import { Channels } from "revolt.js/dist/api/objects";
@@ -47,22 +47,24 @@ function HomeSidebar(props: Props) {
     const { pathname } = useLocation();
     const client = useContext(AppContext);
     const { channel } = useParams<{ channel: string }>();
-    const { openScreen, writeClipboard } = useIntermediate();
+    const { openScreen } = useIntermediate();
 
     const ctx = useForceUpdate();
-    const users = useUsers(undefined, ctx);
-    const channels = useChannels(undefined, ctx);
+    const channels = useDMs(ctx);
 
     const obj = channels.find(x => x?._id === channel);
     if (channel && !obj) return <Redirect to="/" />;
     if (obj) useUnreads({ ...props, channel: obj });
 
-    const channelsArr = (channels
-        .filter(
-            x => x && (x.channel_type === "Group" || (x.channel_type === 'DirectMessage' && x.active))
-        ) as (Channels.GroupChannel | Channels.DirectMessageChannel)[])
+    const channelsArr = channels
+        .filter(x => x.channel_type !== 'SavedMessages')
         .map(x => mapChannelWithUnread(x, props.unreads));
 
+    const users = useUsers(
+        (channelsArr as (Channels.DirectMessageChannel | Channels.GroupChannel)[])
+            .reduce((prev: any, cur) => [ ...prev, ...cur.recipients ], [])
+    , ctx);
+
     channelsArr.sort((b, a) => a.timestamp.localeCompare(b.timestamp));
 
     return (
diff --git a/src/context/revoltjs/hooks.ts b/src/context/revoltjs/hooks.ts
index e8ccb64fd2ff99c4ec93734c243ecdd893ba4c88..bb9fae1389013fa928be172cf54df6666b2f4312 100644
--- a/src/context/revoltjs/hooks.ts
+++ b/src/context/revoltjs/hooks.ts
@@ -68,6 +68,29 @@ export function useServers(ids?: string[], context?: HookContext) {
     return useObject('servers', ids, context) as (Readonly<Servers.Server> | undefined)[];
 }
 
+export function useDMs(context?: HookContext) {
+    const ctx = useForceUpdate(context);
+
+    function mutation(target: string) {
+        let channel = ctx.client.channels.get(target);
+        if (channel) {
+            if ((channel.channel_type === 'DirectMessage' && channel.active) || channel.channel_type === 'Group') {
+                ctx.forceUpdate();
+            }
+        }
+    }
+
+    const map = ctx.client.channels;
+    useEffect(() => {
+        map.addListener("update", mutation);
+        return () => map.removeListener("update", mutation);
+    }, []);
+
+    return map
+        .toArray()
+        .filter(x => x.channel_type === 'DirectMessage' || x.channel_type === 'Group' || x.channel_type === 'SavedMessages') as (Channels.GroupChannel | Channels.DirectMessageChannel | Channels.SavedMessagesChannel)[];
+}
+
 export function useUserPermission(id: string, context?: HookContext) {
     const ctx = useForceUpdate(context);