diff --git a/web/app.react.js b/web/app.react.js
--- a/web/app.react.js
+++ b/web/app.react.js
@@ -21,6 +21,7 @@
   useModalContext,
 } from 'lib/components/modal-provider.react.js';
 import { StaffContextProvider } from 'lib/components/staff-provider.react.js';
+import { IdentitySearchProvider } from 'lib/identity-search/identity-search-context.js';
 import {
   createLoadingStatusSelector,
   combineLoadingStatuses,
@@ -67,6 +68,7 @@
 import VisibilityHandler from './redux/visibility-handler.react.js';
 import history from './router-history.js';
 import { MessageSearchStateProvider } from './search/message-search-state-provider.react.js';
+import { createIdentitySearchAuthMessage } from './selectors/identity-search-selectors.js';
 import { createTunnelbrokerInitMessage } from './selectors/tunnelbroker-selectors.js';
 import AccountSettings from './settings/account-settings.react.js';
 import DangerZone from './settings/danger-zone.react.js';
@@ -420,10 +422,16 @@
 );
 
 function AppWithProvider(props: BaseProps): React.Node {
+  const identitySearchAuthMessage = useSelector(
+    createIdentitySearchAuthMessage,
+  );
+
   return (
-    <ModalProvider>
-      <ConnectedApp {...props} />
-    </ModalProvider>
+    <IdentitySearchProvider authMessage={identitySearchAuthMessage}>
+      <ModalProvider>
+        <ConnectedApp {...props} />
+      </ModalProvider>
+    </IdentitySearchProvider>
   );
 }
 
diff --git a/web/chat/chat-thread-composer.react.js b/web/chat/chat-thread-composer.react.js
--- a/web/chat/chat-thread-composer.react.js
+++ b/web/chat/chat-thread-composer.react.js
@@ -12,6 +12,7 @@
 import {
   usePotentialMemberItems,
   useSearchUsers,
+  useSearchIdentityUsers,
   notFriendNotice,
 } from 'lib/shared/search-utils.js';
 import {
@@ -22,6 +23,7 @@
 import { threadTypes } from 'lib/types/thread-types-enum.js';
 import type { AccountUserInfo, UserListItem } from 'lib/types/user-types.js';
 import { useDispatch } from 'lib/utils/redux-utils.js';
+import { usingCommServicesAccessToken } from 'lib/utils/services-utils.js';
 
 import css from './chat-thread-composer.css';
 import UserAvatar from '../avatars/user-avatar.react.js';
@@ -55,13 +57,21 @@
     [userInfoInputArray],
   );
 
+  let searchResults;
+  const identitySearchResults = useSearchIdentityUsers(usernameInputText);
   const serverSearchResults = useSearchUsers(usernameInputText);
 
+  if (usingCommServicesAccessToken) {
+    searchResults = identitySearchResults;
+  } else {
+    searchResults = serverSearchResults;
+  }
+
   const userListItems = usePotentialMemberItems({
     text: usernameInputText,
     userInfos: otherUserInfos,
     excludeUserIDs: userInfoInputIDs,
-    includeServerSearchUsers: serverSearchResults,
+    includeServerSearchUsers: searchResults,
   });
 
   const userListItemsWithENSNames = useENSNames(userListItems);
diff --git a/web/selectors/identity-search-selectors.js b/web/selectors/identity-search-selectors.js
new file mode 100644
--- /dev/null
+++ b/web/selectors/identity-search-selectors.js
@@ -0,0 +1,29 @@
+// @flow
+
+import { createSelector } from 'reselect';
+
+import type { AuthMessage } from 'lib/types/identity-search/auth-message-types.js';
+
+import type { AppState } from '../redux/redux-setup.js';
+
+export const createIdentitySearchAuthMessage: AppState => ?AuthMessage =
+  createSelector(
+    (state: AppState) => state.cryptoStore?.primaryIdentityKeys?.ed25519,
+    (state: AppState) => state.commServicesAccessToken,
+    (state: AppState) => state.currentUserInfo?.id,
+    (
+      deviceID: ?string,
+      accessToken: ?string,
+      userID: ?string,
+    ): ?AuthMessage => {
+      if (!deviceID || !accessToken || !userID) {
+        return null;
+      }
+      return ({
+        type: 'AuthMessage',
+        deviceID,
+        accessToken,
+        userID,
+      }: AuthMessage);
+    },
+  );
diff --git a/web/settings/relationship/add-users-list.react.js b/web/settings/relationship/add-users-list.react.js
--- a/web/settings/relationship/add-users-list.react.js
+++ b/web/settings/relationship/add-users-list.react.js
@@ -9,7 +9,10 @@
 import { useENSNames } from 'lib/hooks/ens-cache.js';
 import { createLoadingStatusSelector } from 'lib/selectors/loading-selectors.js';
 import { useUserSearchIndex } from 'lib/selectors/nav-selectors.js';
-import { useSearchUsers } from 'lib/shared/search-utils.js';
+import {
+  useSearchUsers,
+  useSearchIdentityUsers,
+} from 'lib/shared/search-utils.js';
 import type {
   UserRelationshipStatus,
   RelationshipAction,
@@ -21,6 +24,7 @@
 import { useLegacyAshoatKeyserverCall } from 'lib/utils/action-utils.js';
 import { values } from 'lib/utils/objects.js';
 import { useDispatchActionPromise } from 'lib/utils/redux-promise-utils.js';
+import { usingCommServicesAccessToken } from 'lib/utils/services-utils.js';
 
 import AddUsersListItem from './add-users-list-item.react.js';
 import css from './add-users-list.css';
@@ -67,14 +71,22 @@
     );
   }, [searchText, userStoreSearchIndex]);
 
+  let searchResults;
+  const identitySearchResults = useSearchIdentityUsers(searchText);
   const serverSearchResults = useSearchUsers(searchText);
 
+  if (usingCommServicesAccessToken) {
+    searchResults = identitySearchResults;
+  } else {
+    searchResults = serverSearchResults;
+  }
+
   const searchTextPresent = searchText.length > 0;
   const mergedUserInfos = React.useMemo(() => {
     const mergedInfos: { [string]: GlobalAccountUserInfo | AccountUserInfo } =
       {};
 
-    for (const userInfo of serverSearchResults) {
+    for (const userInfo of searchResults) {
       mergedInfos[userInfo.id] = userInfo;
     }
 
@@ -89,12 +101,7 @@
     }
 
     return mergedInfos;
-  }, [
-    searchTextPresent,
-    serverSearchResults,
-    userInfos,
-    userStoreSearchResults,
-  ]);
+  }, [searchTextPresent, searchResults, userInfos, userStoreSearchResults]);
 
   const sortedUsers = React.useMemo(
     () =>