diff --git a/lib/handlers/user-infos-handler.react.js b/lib/handlers/user-infos-handler.react.js
--- a/lib/handlers/user-infos-handler.react.js
+++ b/lib/handlers/user-infos-handler.react.js
@@ -2,6 +2,11 @@
 
 import * as React from 'react';
 
+import {
+  useFindUserIdentities,
+  findUserIdentitiesActionTypes,
+} from '../actions/user-actions.js';
+import { useDispatchActionPromise } from '../utils/redux-promise-utils.js';
 import { useSelector } from '../utils/redux-utils.js';
 import {
   relyingOnAuthoritativeKeyserver,
@@ -18,17 +23,46 @@
     return Object.fromEntries(entriesWithoutUsernames);
   }, [userInfos]);
 
+  const dispatchActionPromise = useDispatchActionPromise();
+  const findUserIdentities = useFindUserIdentities();
+
+  const requestedIDsRef = React.useRef(new Set<string>());
+
   React.useEffect(() => {
-    if (!usingCommServicesAccessToken) {
+    const newUserIDs = Object.keys(userInfosWithMissingUsernames).filter(
+      id => !requestedIDsRef.current.has(id),
+    );
+    if (!usingCommServicesAccessToken || newUserIDs.length === 0) {
       return;
     }
-    // 1. TODO: fetch usernames from identity
 
-    // 2. Fetch avatars and settings from auth keyserver
-    if (relyingOnAuthoritativeKeyserver) {
-      // TODO
-    }
-  }, [userInfosWithMissingUsernames]);
+    const promise = (async () => {
+      newUserIDs.forEach(id => requestedIDsRef.current.add(id));
+      // 1. Fetch usernames from identity
+      const identities = await findUserIdentities(newUserIDs);
+
+      // 2. Fetch avatars and settings from auth keyserver
+      if (relyingOnAuthoritativeKeyserver) {
+        // TODO
+      }
+      newUserIDs.forEach(id => requestedIDsRef.current.delete(id));
+
+      const newUserInfos = [];
+      for (const id in identities) {
+        newUserInfos.push({
+          id,
+          username: identities[id].username,
+        });
+      }
+      return { userInfos: newUserInfos };
+    })();
+    void dispatchActionPromise(findUserIdentitiesActionTypes, promise);
+  }, [
+    dispatchActionPromise,
+    findUserIdentities,
+    userInfos,
+    userInfosWithMissingUsernames,
+  ]);
 }
 
 export { UserInfosHandler };