diff --git a/native/avatars/avatar-hooks.js b/native/avatars/avatar-hooks.js
--- a/native/avatars/avatar-hooks.js
+++ b/native/avatars/avatar-hooks.js
@@ -6,6 +6,10 @@
 import { Platform } from 'react-native';
 import { useSafeAreaInsets } from 'react-native-safe-area-context';
 
+import {
+  changeThreadSettings,
+  changeThreadSettingsActionTypes,
+} from 'lib/actions/thread-actions.js';
 import { uploadMultimedia } from 'lib/actions/upload-actions.js';
 import {
   updateUserAvatar,
@@ -21,6 +25,7 @@
   MediaMissionFailure,
   UploadMultimediaResult,
 } from 'lib/types/media-types.js';
+import type { UpdateThreadRequest } from 'lib/types/thread-types.js';
 import {
   useDispatchActionPromise,
   useServerCall,
@@ -178,6 +183,74 @@
   return selectFromGalleryAndUpdateUserAvatar;
 }
 
+function useSelectFromGalleryAndUpdateThreadAvatar(
+  threadID: string,
+): () => Promise<void> {
+  const dispatchActionPromise = useDispatchActionPromise();
+  const changeThreadSettingsCall = useServerCall(changeThreadSettings);
+
+  const selectFromGallery = useSelectFromGallery();
+  const processSelectedMedia = useProcessSelectedMedia();
+  const uploadProcessedMedia = useUploadProcessedMedia();
+
+  const selectFromGalleryAndUpdateThreadAvatar = React.useCallback(async () => {
+    const selection: ?MediaLibrarySelection = await selectFromGallery();
+    if (!selection) {
+      console.log('MEDIA_SELECTION_FAILED');
+      return;
+    }
+
+    const processedMedia = await processSelectedMedia(selection);
+    if (!processedMedia.success) {
+      console.log('MEDIA_PROCESSING_FAILED');
+      // TODO (atul): Clean up any temporary files.
+      return;
+    }
+
+    let uploadedMedia: ?UploadMultimediaResult;
+    try {
+      uploadedMedia = await uploadProcessedMedia(processedMedia);
+      // TODO (atul): Clean up any temporary files.
+    } catch {
+      console.log('MEDIA_UPLOAD_FAILED');
+      // TODO (atul): Clean up any temporary files.
+      return;
+    }
+
+    if (!uploadedMedia) {
+      console.log('MEDIA_UPLOAD_FAILED');
+      // TODO (atul): Clean up any temporary files.
+      return;
+    }
+
+    const imageAvatarUpdateRequest: ImageAvatarDBContent = {
+      type: 'image',
+      uploadID: uploadedMedia.id,
+    };
+
+    const updateThreadRequest: UpdateThreadRequest = {
+      threadID,
+      changes: {
+        avatar: imageAvatarUpdateRequest,
+      },
+    };
+
+    dispatchActionPromise(
+      changeThreadSettingsActionTypes,
+      changeThreadSettingsCall(updateThreadRequest),
+    );
+  }, [
+    changeThreadSettingsCall,
+    dispatchActionPromise,
+    processSelectedMedia,
+    selectFromGallery,
+    threadID,
+    uploadProcessedMedia,
+  ]);
+
+  return selectFromGalleryAndUpdateThreadAvatar;
+}
+
 type ShowAvatarActionSheetOptions = {
   +id: 'emoji' | 'image' | 'cancel',
   +onPress?: () => mixed,
@@ -276,4 +349,5 @@
   useProcessSelectedMedia,
   useShowAvatarActionSheet,
   useSelectFromGalleryAndUpdateUserAvatar,
+  useSelectFromGalleryAndUpdateThreadAvatar,
 };
diff --git a/native/avatars/edit-thread-avatar.react.js b/native/avatars/edit-thread-avatar.react.js
--- a/native/avatars/edit-thread-avatar.react.js
+++ b/native/avatars/edit-thread-avatar.react.js
@@ -6,7 +6,7 @@
 import type { RawThreadInfo, ThreadInfo } from 'lib/types/thread-types.js';
 
 import {
-  useSelectFromGalleryAndUpdateUserAvatar,
+  useSelectFromGalleryAndUpdateThreadAvatar,
   useShowAvatarActionSheet,
 } from './avatar-hooks.js';
 import EditAvatarBadge from './edit-avatar-badge.react.js';
@@ -20,15 +20,15 @@
 function EditThreadAvatar(props: Props): React.Node {
   const { threadInfo, onPressEmojiAvatarFlow, disabled } = props;
 
-  const selectFromGalleryAndUpdateUserAvatar =
-    useSelectFromGalleryAndUpdateUserAvatar();
+  const selectFromGalleryAndUpdateThreadAvatar =
+    useSelectFromGalleryAndUpdateThreadAvatar(threadInfo.id);
 
   const actionSheetConfig = React.useMemo(
     () => [
       { id: 'emoji', onPress: onPressEmojiAvatarFlow },
-      { id: 'image', onPress: selectFromGalleryAndUpdateUserAvatar },
+      { id: 'image', onPress: selectFromGalleryAndUpdateThreadAvatar },
     ],
-    [onPressEmojiAvatarFlow, selectFromGalleryAndUpdateUserAvatar],
+    [onPressEmojiAvatarFlow, selectFromGalleryAndUpdateThreadAvatar],
   );
 
   const showAvatarActionSheet = useShowAvatarActionSheet(actionSheetConfig);