diff --git a/src/components/AttachmentComposerModal.tsx b/src/components/AttachmentComposerModal.tsx
new file mode 100644
index 000000000000..a317716f74cf
--- /dev/null
+++ b/src/components/AttachmentComposerModal.tsx
@@ -0,0 +1,338 @@
+import React, {memo, useCallback, useEffect, useRef, useState} from 'react';
+import type {View} from 'react-native';
+import {InteractionManager} from 'react-native';
+import {GestureHandlerRootView} from 'react-native-gesture-handler';
+import Animated, {FadeIn, LayoutAnimationConfig} from 'react-native-reanimated';
+import type {ValueOf} from 'type-fest';
+import useFilesValidation from '@hooks/useFilesValidation';
+import useLocalize from '@hooks/useLocalize';
+import useResponsiveLayout from '@hooks/useResponsiveLayout';
+import useThemeStyles from '@hooks/useThemeStyles';
+import {cleanFileName, getFileValidationErrorText} from '@libs/fileDownload/FileUtils';
+import CONST from '@src/CONST';
+import type ModalType from '@src/types/utils/ModalType';
+import viewRef from '@src/types/utils/viewRef';
+import AttachmentCarouselView from './Attachments/AttachmentCarousel/AttachmentCarouselView';
+import useCarouselArrows from './Attachments/AttachmentCarousel/useCarouselArrows';
+import useAttachmentErrors from './Attachments/AttachmentView/useAttachmentErrors';
+import type {Attachment} from './Attachments/types';
+import Button from './Button';
+import ConfirmModal from './ConfirmModal';
+import HeaderGap from './HeaderGap';
+import HeaderWithBackButton from './HeaderWithBackButton';
+import Modal from './Modal';
+import SafeAreaConsumer from './SafeAreaConsumer';
+
+type ImagePickerResponse = {
+    height?: number;
+    name: string;
+    size?: number | null;
+    type: string;
+    uri: string;
+    width?: number;
+};
+
+type FileObject = Partial<File | ImagePickerResponse>;
+
+type ChildrenProps = {
+    displayFilesInModal: (data: FileObject[]) => void;
+    show: () => void;
+};
+
+type AttachmentComposerModalProps = {
+    /** Optional callback to fire when we want to preview an image and approve it for use. */
+    onConfirm: ((file: FileObject | FileObject[]) => void) | null;
+
+    /** Title shown in the header of the modal */
+    headerTitle: string;
+
+    /** Optional callback to fire when we want to do something after modal show. */
+    onModalShow: () => void;
+
+    /** Optional callback to fire when we want to do something after modal hide. */
+    onModalHide: () => void;
+
+    /** A function as a child to pass modal launching methods to */
+    children: React.FC<ChildrenProps>;
+
+    /** Should disable send button */
+    shouldDisableSendButton: boolean;
+};
+
+function AttachmentComposerModal({onConfirm, onModalShow = () => {}, onModalHide = () => {}, headerTitle, children, shouldDisableSendButton = false}: AttachmentComposerModalProps) {
+    const styles = useThemeStyles();
+    const {translate} = useLocalize();
+    const {shouldUseNarrowLayout} = useResponsiveLayout();
+    const {setAttachmentError, clearAttachmentErrors} = useAttachmentErrors();
+    const {shouldShowArrows, setShouldShowArrows, autoHideArrows, cancelAutoHideArrows} = useCarouselArrows();
+
+    const [isModalOpen, setIsModalOpen] = useState(false);
+    const [fileError, setFileError] = useState<ValueOf<typeof CONST.FILE_VALIDATION_ERRORS> | null>(null);
+    const [isFileErrorModalVisible, setIsFileErrorModalVisible] = useState(false);
+    const [modalType, setModalType] = useState<ModalType>(CONST.MODAL.MODAL_TYPE.CENTERED_UNSWIPEABLE);
+    const [validFilesToUpload, setValidFilesToUpload] = useState<FileObject[]>([]);
+    const [attachments, setAttachments] = useState<Attachment[]>([]);
+    const [page, setPage] = useState<number>(0);
+    const [currentAttachment, setCurrentAttachment] = useState<Attachment | null>(null);
+
+    // TODO: remove unnecessary logic, ideally in a follow-up PR to avoid breaking changes/regressions
+    /**
+     * If our attachment is a PDF, return the unswipeable Modal type.
+     */
+    const getModalType = useCallback(
+        (sourceURL: string, fileObject: FileObject) => {
+            const fileName = fileObject?.name ?? translate('attachmentView.unknownFilename');
+            return sourceURL && (sourceURL.includes('.pdf') || fileName.includes('.pdf')) ? CONST.MODAL.MODAL_TYPE.CENTERED_UNSWIPEABLE : CONST.MODAL.MODAL_TYPE.CENTERED;
+        },
+        [translate],
+    );
+
+    /**
+     * Execute the onConfirm callback and close the modal.
+     */
+    const submitAndClose = useCallback(() => {
+        // If the modal has already been closed
+        if (!isModalOpen) {
+            return;
+        }
+
+        if (onConfirm) {
+            if (validFilesToUpload.length) {
+                onConfirm(validFilesToUpload);
+            } else if (currentAttachment) {
+                onConfirm(currentAttachment.file ?? (currentAttachment as FileObject));
+            }
+        }
+
+        setIsModalOpen(false);
+    }, [isModalOpen, onConfirm, validFilesToUpload, currentAttachment]);
+
+    const closeConfirmModal = useCallback(() => {
+        setIsFileErrorModalVisible(false);
+    }, []);
+
+    // TODO: Check if this function is still needed, as it doesn't work.
+    const isDirectoryCheck = useCallback((data: FileObject) => {
+        if ('webkitGetAsEntry' in data && (data as DataTransferItem).webkitGetAsEntry()?.isDirectory) {
+            setFileError(CONST.FILE_VALIDATION_ERRORS.FOLDER_NOT_ALLOWED);
+            setIsFileErrorModalVisible(true);
+            return false;
+        }
+        return true;
+    }, []);
+
+    /**
+     * Sanitizes file names and ensures proper URI references for file system compatibility
+     */
+    const cleanFileObjectName = useCallback((fileObject: FileObject): FileObject => {
+        if (fileObject instanceof File) {
+            const cleanName = cleanFileName(fileObject.name);
+            if (fileObject.name !== cleanName) {
+                const updatedFile = new File([fileObject], cleanName, {type: fileObject.type});
+                const inputSource = URL.createObjectURL(updatedFile);
+                updatedFile.uri = inputSource;
+                return updatedFile;
+            }
+            if (!fileObject.uri) {
+                const inputSource = URL.createObjectURL(fileObject);
+                // eslint-disable-next-line no-param-reassign
+                fileObject.uri = inputSource;
+            }
+        }
+        return fileObject;
+    }, []);
+
+    const convertFileToAttachment = useCallback((fileObject: FileObject, source: string): Attachment => {
+        return {
+            source,
+            file: fileObject,
+        };
+    }, []);
+
+    useEffect(() => {
+        if (!validFilesToUpload.length) {
+            return;
+        }
+
+        if (validFilesToUpload.length > 0 && !fileError) {
+            // Convert all files to attachments
+            const newAttachments = validFilesToUpload.map((fileObject) => {
+                const source = fileObject.uri ?? '';
+                return convertFileToAttachment(fileObject, source);
+            });
+
+            const firstAttachment = newAttachments.at(0) ?? null;
+            setAttachments(newAttachments);
+            setCurrentAttachment(firstAttachment);
+            setPage(0);
+
+            if (firstAttachment?.file) {
+                const inputModalType = getModalType(firstAttachment.source as string, firstAttachment.file);
+                setModalType(inputModalType);
+            }
+
+            setIsModalOpen(true);
+        }
+    }, [fileError, validFilesToUpload, convertFileToAttachment, getModalType]);
+
+    const {ErrorModal, validateFiles, PDFValidationComponent} = useFilesValidation(setValidFilesToUpload);
+
+    const confirmAndContinue = () => {
+        if (fileError === CONST.FILE_VALIDATION_ERRORS.MAX_FILE_LIMIT_EXCEEDED) {
+            validateFiles(validFilesToUpload);
+        }
+        setIsFileErrorModalVisible(false);
+        InteractionManager.runAfterInteractions(() => {
+            setFileError(null);
+        });
+    };
+
+    const validateAndDisplayMultipleFilesToUpload = useCallback(
+        (data: FileObject[]) => {
+            if (!data?.length) {
+                return;
+            }
+
+            const fileObjects = data
+                .map((item) => {
+                    let fileObject = item;
+                    if ('getAsFile' in item && typeof item.getAsFile === 'function') {
+                        fileObject = item.getAsFile() as FileObject;
+                    }
+                    return cleanFileObjectName(fileObject);
+                })
+                .filter((fileObject): fileObject is FileObject => fileObject !== null);
+
+            if (!fileObjects.length || fileObjects.some((fileObject) => !isDirectoryCheck(fileObject))) {
+                return;
+            }
+            validateFiles(fileObjects);
+        },
+        [cleanFileObjectName, isDirectoryCheck, validateFiles],
+    );
+
+    const closeModal = useCallback(() => {
+        setIsModalOpen(false);
+    }, []);
+
+    const closeAndResetModal = useCallback(() => {
+        closeConfirmModal();
+        closeModal();
+        InteractionManager.runAfterInteractions(() => {
+            setFileError(null);
+            setValidFilesToUpload([]);
+        });
+    }, [closeConfirmModal, closeModal]);
+
+    const openModal = useCallback(() => {
+        setIsModalOpen(true);
+    }, []);
+
+    const headerTitleNew = headerTitle ?? translate('reportActionCompose.sendAttachment');
+
+    const submitRef = useRef<View | HTMLElement>(null);
+
+    return (
+        <>
+            {PDFValidationComponent}
+            <Modal
+                type={modalType}
+                onClose={closeModal}
+                isVisible={isModalOpen}
+                onModalShow={() => {
+                    onModalShow();
+                }}
+                onModalHide={() => {
+                    onModalHide();
+                    clearAttachmentErrors();
+                    setValidFilesToUpload([]);
+                    setAttachments([]);
+                    setCurrentAttachment(null);
+                    setPage(0);
+                }}
+                propagateSwipe
+                initialFocus={() => {
+                    if (!submitRef.current) {
+                        return false;
+                    }
+                    return submitRef.current;
+                }}
+                shouldHandleNavigationBack
+            >
+                <GestureHandlerRootView style={styles.flex1}>
+                    {shouldUseNarrowLayout && <HeaderGap />}
+                    <HeaderWithBackButton
+                        shouldMinimizeMenuButton
+                        title={headerTitleNew}
+                        shouldShowBorderBottom
+                        shouldShowCloseButton={!shouldUseNarrowLayout}
+                        shouldShowBackButton={shouldUseNarrowLayout}
+                        onBackButtonPress={closeModal}
+                        onCloseButtonPress={closeModal}
+                        shouldSetModalVisibility={false}
+                        shouldDisplayHelpButton={false}
+                    />
+                    {attachments.length > 0 && !!currentAttachment && (
+                        <AttachmentCarouselView
+                            attachments={attachments}
+                            source={currentAttachment.source}
+                            page={page}
+                            setPage={setPage}
+                            onClose={closeModal}
+                            autoHideArrows={autoHideArrows}
+                            cancelAutoHideArrow={cancelAutoHideArrows}
+                            setShouldShowArrows={setShouldShowArrows}
+                            onAttachmentError={setAttachmentError}
+                            shouldShowArrows={shouldShowArrows}
+                        />
+                    )}
+                    <LayoutAnimationConfig skipEntering>
+                        {(validFilesToUpload.length > 0 || !!currentAttachment) && (
+                            <SafeAreaConsumer>
+                                {({safeAreaPaddingBottomStyle}) => (
+                                    <Animated.View
+                                        style={safeAreaPaddingBottomStyle}
+                                        entering={FadeIn}
+                                    >
+                                        <Button
+                                            ref={viewRef(submitRef)}
+                                            success
+                                            large
+                                            style={[styles.buttonConfirm, shouldUseNarrowLayout ? {} : styles.attachmentButtonBigScreen]}
+                                            textStyles={[styles.buttonConfirmText]}
+                                            text={translate('common.send')}
+                                            onPress={submitAndClose}
+                                            isDisabled={shouldDisableSendButton}
+                                            pressOnEnter
+                                        />
+                                    </Animated.View>
+                                )}
+                            </SafeAreaConsumer>
+                        )}
+                    </LayoutAnimationConfig>
+                </GestureHandlerRootView>
+            </Modal>
+            <ConfirmModal
+                title={getFileValidationErrorText(fileError).title}
+                onConfirm={confirmAndContinue}
+                onCancel={closeAndResetModal}
+                isVisible={isFileErrorModalVisible}
+                prompt={getFileValidationErrorText(fileError).reason}
+                confirmText={translate(validFilesToUpload.length ? 'common.continue' : 'common.close')}
+                shouldShowCancelButton={!!validFilesToUpload.length}
+                cancelText={translate('common.cancel')}
+            />
+            {children?.({
+                displayFilesInModal: validateAndDisplayMultipleFilesToUpload,
+                show: openModal,
+            })}
+            {ErrorModal}
+        </>
+    );
+}
+
+AttachmentComposerModal.displayName = 'AttachmentComposerModal';
+
+export default memo(AttachmentComposerModal);
+
+export type {FileObject, ImagePickerResponse};
diff --git a/src/components/AttachmentModal.tsx b/src/components/AttachmentModal.tsx
index f415ddb627f9..cb1590b0dffa 100644
--- a/src/components/AttachmentModal.tsx
+++ b/src/components/AttachmentModal.tsx
@@ -219,6 +219,8 @@ function AttachmentModal({
     const [currentAttachmentLink, setCurrentAttachmentLink] = useState(attachmentLink);
     const {setAttachmentError, isErrorInAttachment, clearAttachmentErrors} = useAttachmentErrors();
 
+    // TODO: Remove the logic for validating files, ideally in a follow-up to avoid breaking changes/regressions
+
     const [file, setFile] = useState<FileObject | undefined>(
         originalFileName
             ? {
diff --git a/src/hooks/useFilesValidation.tsx b/src/hooks/useFilesValidation.tsx
index a8f7d335559c..6e09bfacc389 100644
--- a/src/hooks/useFilesValidation.tsx
+++ b/src/hooks/useFilesValidation.tsx
@@ -8,7 +8,15 @@ import {useFullScreenLoader} from '@components/FullScreenLoaderContext';
 import PDFThumbnail from '@components/PDFThumbnail';
 import Text from '@components/Text';
 import TextLink from '@components/TextLink';
-import {getFileValidationErrorText, isHeicOrHeifImage, resizeImageIfNeeded, splitExtensionFromFileName, validateAttachment, validateImageForCorruption} from '@libs/fileDownload/FileUtils';
+import {
+    getFileValidationErrorText,
+    isHeicOrHeifImage,
+    normalizeFileObject,
+    resizeImageIfNeeded,
+    splitExtensionFromFileName,
+    validateAttachment,
+    validateImageForCorruption,
+} from '@libs/fileDownload/FileUtils';
 import convertHeicImage from '@libs/fileDownload/heicConverter';
 import CONST from '@src/CONST';
 import useLocalize from './useLocalize';
@@ -19,7 +27,7 @@ type ErrorObject = {
     fileExtension?: string;
 };
 
-function useFilesValidation(proceedWithFilesAction: (files: FileObject[]) => void) {
+function useFilesValidation(proceedWithFilesAction: (files: FileObject[]) => void, isValidatingReceipts = false) {
     const styles = useThemeStyles();
     const {translate} = useLocalize();
     const [isErrorModalVisible, setIsErrorModalVisible] = useState(false);
@@ -41,9 +49,9 @@ function useFilesValidation(proceedWithFilesAction: (files: FileObject[]) => voi
         setIsErrorModalVisible(false);
         setPdfFilesToRender([]);
         setIsLoaderVisible(false);
+        setValidFilesToUpload([]);
         setIsValidatingMultipleFiles(false);
         setFileError(null);
-        setValidFilesToUpload([]);
         setInvalidFileExtension('');
         setErrorQueue([]);
         setCurrentErrorIndex(0);
@@ -66,19 +74,21 @@ function useFilesValidation(proceedWithFilesAction: (files: FileObject[]) => voi
     };
 
     const isValidFile = (originalFile: FileObject, isCheckingMultipleFiles?: boolean) => {
-        return validateImageForCorruption(originalFile)
-            .then(() => {
-                const error = validateAttachment(originalFile, isCheckingMultipleFiles, true);
-                if (error) {
-                    const errorData = {
-                        error,
-                        fileExtension: error === CONST.FILE_VALIDATION_ERRORS.WRONG_FILE_TYPE_MULTIPLE ? splitExtensionFromFileName(originalFile.name ?? '').fileExtension : undefined,
-                    };
-                    collectedErrors.current.push(errorData);
-                    return false;
-                }
-                return true;
-            })
+        return normalizeFileObject(originalFile)
+            .then((normalizedFile) =>
+                validateImageForCorruption(normalizedFile).then(() => {
+                    const error = validateAttachment(normalizedFile, isCheckingMultipleFiles, isValidatingReceipts);
+                    if (error) {
+                        const errorData = {
+                            error,
+                            fileExtension: error === CONST.FILE_VALIDATION_ERRORS.WRONG_FILE_TYPE_MULTIPLE ? splitExtensionFromFileName(normalizedFile.name ?? '').fileExtension : undefined,
+                        };
+                        collectedErrors.current.push(errorData);
+                        return false;
+                    }
+                    return true;
+                }),
+            )
             .catch(() => {
                 collectedErrors.current.push({error: CONST.FILE_VALIDATION_ERRORS.FILE_CORRUPTED});
                 return false;
@@ -230,8 +240,18 @@ function useFilesValidation(proceedWithFilesAction: (files: FileObject[]) => voi
             }
         }
 
-        proceedWithFilesAction(validFilesToUpload);
-        hideModalAndReset();
+        // If we're validating attachments we need to use InteractionManager to ensure
+        // the error modal is dismissed before opening the attachment modal
+        if (!isValidatingReceipts && fileError) {
+            setIsErrorModalVisible(false);
+            InteractionManager.runAfterInteractions(() => {
+                proceedWithFilesAction(validFilesToUpload);
+                resetValidationState();
+            });
+        } else {
+            proceedWithFilesAction(validFilesToUpload);
+            hideModalAndReset();
+        }
     };
 
     const PDFValidationComponent = pdfFilesToRender.length
@@ -247,7 +267,11 @@ function useFilesValidation(proceedWithFilesAction: (files: FileObject[]) => voi
                   }}
                   onPassword={() => {
                       validatedPDFs.current = [...(validatedPDFs.current ?? []), file];
-                      collectedErrors.current.push({error: CONST.FILE_VALIDATION_ERRORS.PROTECTED_FILE});
+                      if (isValidatingReceipts) {
+                          collectedErrors.current.push({error: CONST.FILE_VALIDATION_ERRORS.PROTECTED_FILE});
+                      } else {
+                          validFiles.current = [...(validFiles.current ?? []), file];
+                      }
                       checkIfAllValidatedAndProceed();
                   }}
                   onLoadError={() => {
diff --git a/src/libs/fileDownload/FileUtils.ts b/src/libs/fileDownload/FileUtils.ts
index 52fda826f644..1172695163f2 100644
--- a/src/libs/fileDownload/FileUtils.ts
+++ b/src/libs/fileDownload/FileUtils.ts
@@ -378,16 +378,6 @@ const validateReceipt = (file: FileObject, setUploadReceiptError: (isInvalid: bo
         });
 };
 
-const getConfirmModalPrompt = (attachmentInvalidReason: TranslationPaths | undefined) => {
-    if (!attachmentInvalidReason) {
-        return '';
-    }
-    if (attachmentInvalidReason === 'attachmentPicker.sizeExceededWithLimit') {
-        return translateLocal(attachmentInvalidReason, {maxUploadSizeInMB: CONST.API_ATTACHMENT_VALIDATIONS.RECEIPT_MAX_SIZE / (1024 * 1024)});
-    }
-    return translateLocal(attachmentInvalidReason);
-};
-
 const isValidReceiptExtension = (file: FileObject) => {
     const {fileExtension} = splitExtensionFromFileName(file?.name ?? '');
     return CONST.API_ATTACHMENT_VALIDATIONS.ALLOWED_RECEIPT_EXTENSIONS.includes(
@@ -403,6 +393,41 @@ const isHeicOrHeifImage = (file: FileObject) => {
     );
 };
 
+/**
+ * Normalizes a file-like object specifically for Android clipboard image pasting,
+ * where limited file metadata is available (e.g., only a URI).
+ * If the object is already a File or contains a size, it is returned as-is.
+ * Otherwise, it attempts to fetch the file via its URI and reconstruct a File
+ * with full metadata (name, size, type).
+ */
+const normalizeFileObject = (file: FileObject): Promise<FileObject> => {
+    if (file instanceof File || file instanceof Blob) {
+        return Promise.resolve(file);
+    }
+
+    const isAndroidNative = getPlatform() === CONST.PLATFORM.ANDROID;
+
+    if (!isAndroidNative || 'size' in file) {
+        return Promise.resolve(file);
+    }
+
+    if (typeof file.uri !== 'string') {
+        return Promise.resolve(file);
+    }
+
+    return fetch(file.uri)
+        .then((response) => response.blob())
+        .then((blob) => {
+            const name = file.name ?? 'unknown';
+            const type = file.type ?? blob.type ?? 'application/octet-stream';
+            const normalizedFile = new File([blob], name, {type});
+            return normalizedFile;
+        })
+        .catch((error) => {
+            return Promise.reject(error);
+        });
+};
+
 const validateAttachment = (file: FileObject, isCheckingMultipleFiles?: boolean, isValidatingReceipt?: boolean) => {
     const maxFileSize = isValidatingReceipt ? CONST.API_ATTACHMENT_VALIDATIONS.RECEIPT_MAX_SIZE : CONST.API_ATTACHMENT_VALIDATIONS.MAX_SIZE;
     if (!Str.isImage(file.name ?? '') && !isHeicOrHeifImage(file) && (file?.size ?? 0) > maxFileSize) {
@@ -494,6 +519,16 @@ const getFileValidationErrorText = (
     }
 };
 
+const getConfirmModalPrompt = (attachmentInvalidReason: TranslationPaths | undefined) => {
+    if (!attachmentInvalidReason) {
+        return '';
+    }
+    if (attachmentInvalidReason === 'attachmentPicker.sizeExceededWithLimit') {
+        return translateLocal(attachmentInvalidReason, {maxUploadSizeInMB: CONST.API_ATTACHMENT_VALIDATIONS.RECEIPT_MAX_SIZE / (1024 * 1024)});
+    }
+    return translateLocal(attachmentInvalidReason);
+};
+
 export {
     showGeneralErrorAlert,
     showSuccessAlert,
@@ -517,6 +552,7 @@ export {
     createFile,
     validateReceipt,
     validateAttachment,
+    normalizeFileObject,
     isValidReceiptExtension,
     getFileValidationErrorText,
     isHeicOrHeifImage,
diff --git a/src/pages/home/report/ReportActionCompose/AttachmentPickerWithMenuItems.tsx b/src/pages/home/report/ReportActionCompose/AttachmentPickerWithMenuItems.tsx
index 2a28c92d8eba..7f01c0def28e 100644
--- a/src/pages/home/report/ReportActionCompose/AttachmentPickerWithMenuItems.tsx
+++ b/src/pages/home/report/ReportActionCompose/AttachmentPickerWithMenuItems.tsx
@@ -4,6 +4,7 @@ import {View} from 'react-native';
 import type {OnyxEntry} from 'react-native-onyx';
 import AttachmentPicker from '@components/AttachmentPicker';
 import {DelegateNoAccessContext} from '@components/DelegateNoAccessModalProvider';
+import {useFullScreenLoader} from '@components/FullScreenLoaderContext';
 import Icon from '@components/Icon';
 import * as Expensicons from '@components/Icon/Expensicons';
 import type {PopoverMenuItem} from '@components/PopoverMenu';
@@ -48,7 +49,7 @@ type AttachmentPickerWithMenuItemsProps = {
     currentUserPersonalDetails: OnyxTypes.PersonalDetails;
 
     /** Callback to open the file in the modal */
-    displayFileInModal: (url: FileObject) => void;
+    displayFilesInModal: (files: FileObject[]) => void;
 
     /** Whether or not the full size composer is available */
     isFullComposerAvailable: boolean;
@@ -106,7 +107,7 @@ function AttachmentPickerWithMenuItems({
     report,
     currentUserPersonalDetails,
     reportParticipantIDs,
-    displayFileInModal,
+    displayFilesInModal,
     isFullComposerAvailable,
     isComposerFullSize,
     reportID,
@@ -133,6 +134,7 @@ function AttachmentPickerWithMenuItems({
     const [policy] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY}${report?.policyID}`, {canBeMissing: true});
     const {isProduction} = useEnvironment();
     const {isBetaEnabled} = usePermissions();
+    const {setIsLoaderVisible} = useFullScreenLoader();
 
     const isManualDistanceTrackingEnabled = isBetaEnabled(CONST.BETAS.MANUAL_DISTANCE);
 
@@ -309,14 +311,30 @@ function AttachmentPickerWithMenuItems({
     // 4. And the Create button is at the bottom.
     const createButtonContainerStyles = [styles.flexGrow0, styles.flexShrink0];
 
+    const isMultipleDragAndDropEnabled = isBetaEnabled(CONST.BETAS.NEWDOT_MULTI_FILES_DRAG_AND_DROP);
+
     return (
-        <AttachmentPicker>
+        <AttachmentPicker
+            allowMultiple={isMultipleDragAndDropEnabled}
+            onOpenPicker={() => {
+                if (!isMultipleDragAndDropEnabled) {
+                    return;
+                }
+                setIsLoaderVisible(true);
+            }}
+            fileLimit={isMultipleDragAndDropEnabled ? CONST.API_ATTACHMENT_VALIDATIONS.MAX_FILE_LIMIT : 1}
+            shouldValidateImage={!isMultipleDragAndDropEnabled}
+        >
             {({openPicker}) => {
                 const triggerAttachmentPicker = () => {
                     onTriggerAttachmentPicker();
                     openPicker({
-                        onPicked: (data) => displayFileInModal(data.at(0) ?? {}),
-                        onCanceled: onCanceledAttachmentPicker,
+                        onPicked: (data) => displayFilesInModal(data),
+                        onCanceled: () => {
+                            onCanceledAttachmentPicker?.();
+                            setIsLoaderVisible(false);
+                        },
+                        onClosed: () => setIsLoaderVisible(false),
                     });
                 };
                 const menuItems = [
@@ -439,7 +457,10 @@ function AttachmentPickerWithMenuItems({
                                 }
                             }}
                             anchorPosition={styles.createMenuPositionReportActionCompose(shouldUseNarrowLayout, windowHeight, windowWidth)}
-                            anchorAlignment={{horizontal: CONST.MODAL.ANCHOR_ORIGIN_HORIZONTAL.LEFT, vertical: CONST.MODAL.ANCHOR_ORIGIN_VERTICAL.BOTTOM}}
+                            anchorAlignment={{
+                                horizontal: CONST.MODAL.ANCHOR_ORIGIN_HORIZONTAL.LEFT,
+                                vertical: CONST.MODAL.ANCHOR_ORIGIN_VERTICAL.BOTTOM,
+                            }}
                             menuItems={menuItems}
                             anchorRef={actionButtonRef}
                         />
diff --git a/src/pages/home/report/ReportActionCompose/ComposerWithSuggestions/ComposerWithSuggestions.tsx b/src/pages/home/report/ReportActionCompose/ComposerWithSuggestions/ComposerWithSuggestions.tsx
index e5ab34ef23e4..081e610b7907 100644
--- a/src/pages/home/report/ReportActionCompose/ComposerWithSuggestions/ComposerWithSuggestions.tsx
+++ b/src/pages/home/report/ReportActionCompose/ComposerWithSuggestions/ComposerWithSuggestions.tsx
@@ -99,7 +99,7 @@ type ComposerWithSuggestionsProps = Partial<ChildrenProps> & {
     inputPlaceholder: string;
 
     /** Function to display a file in a modal */
-    displayFileInModal: (file: FileObject) => void;
+    displayFilesInModal: (file: FileObject[]) => void;
 
     /** Whether the user is blocked from concierge */
     isBlockedFromConcierge: boolean;
@@ -214,7 +214,7 @@ function ComposerWithSuggestions(
         setIsFullComposerAvailable,
         isMenuVisible,
         inputPlaceholder,
-        displayFileInModal,
+        displayFilesInModal,
         isBlockedFromConcierge,
         disabled,
         setIsCommentEmpty,
@@ -812,7 +812,7 @@ function ComposerWithSuggestions(
                     onClick={setShouldBlockSuggestionCalcToFalse}
                     onPasteFile={(file) => {
                         textInputRef.current?.blur();
-                        displayFileInModal(file);
+                        displayFilesInModal([file]);
                     }}
                     onClear={onClear}
                     isDisabled={isBlockedFromConcierge || disabled}
diff --git a/src/pages/home/report/ReportActionCompose/ReportActionCompose.tsx b/src/pages/home/report/ReportActionCompose/ReportActionCompose.tsx
index d9952578f494..e4e3b2e037a0 100644
--- a/src/pages/home/report/ReportActionCompose/ReportActionCompose.tsx
+++ b/src/pages/home/report/ReportActionCompose/ReportActionCompose.tsx
@@ -7,7 +7,7 @@ import type {OnyxEntry} from 'react-native-onyx';
 import {runOnUI, useSharedValue} from 'react-native-reanimated';
 import type {Emoji} from '@assets/emojis/types';
 import * as ActionSheetAwareScrollView from '@components/ActionSheetAwareScrollView';
-import AttachmentModal from '@components/AttachmentModal';
+import AttachmentComposerModal from '@components/AttachmentComposerModal';
 import DragAndDropConsumer from '@components/DragAndDrop/Consumer';
 import DropZoneUI from '@components/DropZone/DropZoneUI';
 import DualDropZone from '@components/DropZone/DualDropZone';
@@ -291,8 +291,9 @@ function ReportActionCompose({
         suggestionsRef.current.updateShouldShowSuggestionMenuToFalse(false);
     }, []);
 
-    const attachmentFileRef = useRef<FileObject | null>(null);
-    const addAttachment = useCallback((file: FileObject) => {
+    const attachmentFileRef = useRef<FileObject | FileObject[] | null>(null);
+
+    const addAttachment = useCallback((file: FileObject | FileObject[]) => {
         attachmentFileRef.current = file;
         const clear = composerRef.current?.clear;
         if (!clear) {
@@ -318,7 +319,15 @@ function ReportActionCompose({
             const newCommentTrimmed = newComment.trim();
 
             if (attachmentFileRef.current) {
-                addAttachmentReportActions(reportID, attachmentFileRef.current, newCommentTrimmed, true);
+                if (Array.isArray(attachmentFileRef.current)) {
+                    // Handle multiple files
+                    attachmentFileRef.current.forEach((file) => {
+                        addAttachmentReportActions(reportID, file, newCommentTrimmed, true);
+                    });
+                } else {
+                    // Handle single file
+                    addAttachmentReportActions(reportID, attachmentFileRef.current, newCommentTrimmed, true);
+                }
                 attachmentFileRef.current = null;
             } else {
                 Performance.markStart(CONST.TIMING.SEND_MESSAGE, {message: newCommentTrimmed});
@@ -566,131 +575,132 @@ function ReportActionCompose({
                         ]}
                     >
                         {PDFValidationComponent}
-                        <AttachmentModal
+                        <AttachmentComposerModal
                             headerTitle={translate('reportActionCompose.sendAttachment')}
                             onConfirm={addAttachment}
                             onModalShow={() => setIsAttachmentPreviewActive(true)}
                             onModalHide={onAttachmentPreviewClose}
                             shouldDisableSendButton={!!exceededMaxLength}
-                            reportID={reportID}
-                            shouldHandleNavigationBack
                         >
-                            {({displayFileInModal}) => (
-                                <>
-                                    <AttachmentPickerWithMenuItems
-                                        displayFileInModal={displayFileInModal}
-                                        reportID={reportID}
-                                        report={report}
-                                        currentUserPersonalDetails={currentUserPersonalDetails}
-                                        reportParticipantIDs={reportParticipantIDs}
-                                        isFullComposerAvailable={isFullComposerAvailable}
-                                        isComposerFullSize={isComposerFullSize}
-                                        isBlockedFromConcierge={isBlockedFromConcierge}
-                                        disabled={disabled}
-                                        setMenuVisibility={setMenuVisibility}
-                                        isMenuVisible={isMenuVisible}
-                                        onTriggerAttachmentPicker={onTriggerAttachmentPicker}
-                                        raiseIsScrollLikelyLayoutTriggered={raiseIsScrollLikelyLayoutTriggered}
-                                        onAddActionPressed={onAddActionPressed}
-                                        onItemSelected={onItemSelected}
-                                        onCanceledAttachmentPicker={() => {
-                                            if (!shouldFocusInputOnScreenFocus) {
-                                                return;
-                                            }
-                                            focus();
-                                        }}
-                                        actionButtonRef={actionButtonRef}
-                                        shouldDisableAttachmentItem={!!exceededMaxLength}
-                                    />
-                                    <ComposerWithSuggestions
-                                        ref={(ref) => {
-                                            composerRef.current = ref ?? undefined;
-                                            composerRefShared.set({
-                                                clear: ref?.clear,
-                                            });
-                                        }}
-                                        suggestionsRef={suggestionsRef}
-                                        isNextModalWillOpenRef={isNextModalWillOpenRef}
-                                        isScrollLikelyLayoutTriggered={isScrollLikelyLayoutTriggered}
-                                        raiseIsScrollLikelyLayoutTriggered={raiseIsScrollLikelyLayoutTriggered}
-                                        reportID={reportID}
-                                        policyID={report?.policyID}
-                                        includeChronos={chatIncludesChronos(report)}
-                                        isGroupPolicyReport={isGroupPolicyReport}
-                                        lastReportAction={lastReportAction}
-                                        isMenuVisible={isMenuVisible}
-                                        inputPlaceholder={inputPlaceholder}
-                                        isComposerFullSize={isComposerFullSize}
-                                        setIsFullComposerAvailable={setIsFullComposerAvailable}
-                                        displayFileInModal={displayFileInModal}
-                                        onCleared={submitForm}
-                                        isBlockedFromConcierge={isBlockedFromConcierge}
-                                        disabled={disabled}
-                                        setIsCommentEmpty={setIsCommentEmpty}
-                                        handleSendMessage={handleSendMessage}
-                                        shouldShowComposeInput={shouldShowComposeInput}
-                                        onFocus={onFocus}
-                                        onBlur={onBlur}
-                                        measureParentContainer={measureContainer}
-                                        onValueChange={onValueChange}
-                                        didHideComposerInput={didHideComposerInput}
-                                    />
-                                    {/* TODO: remove beta check after the feature is enabled */}
-                                    {isBetaEnabled(CONST.BETAS.NEWDOT_MULTI_FILES_DRAG_AND_DROP) && shouldDisplayDualDropZone && (
-                                        <DualDropZone
-                                            isEditing={isTransactionThreadView && hasReceipt}
-                                            onAttachmentDrop={(event: DragEvent) => {
-                                                if (isAttachmentPreviewActive) {
+                            {({displayFilesInModal}) => {
+                                const handleAttachmentDrop = (event: DragEvent) => {
+                                    if (isAttachmentPreviewActive) {
+                                        return;
+                                    }
+                                    if (isBetaEnabled(CONST.BETAS.NEWDOT_MULTI_FILES_DRAG_AND_DROP) && event.dataTransfer?.files.length && event.dataTransfer?.files.length > 1) {
+                                        const files = Array.from(event.dataTransfer?.files).map((file) => {
+                                            // eslint-disable-next-line no-param-reassign
+                                            file.uri = URL.createObjectURL(file);
+                                            return file;
+                                        });
+                                        displayFilesInModal(files);
+                                        return;
+                                    }
+
+                                    const data = event.dataTransfer?.files[0];
+                                    if (data) {
+                                        data.uri = URL.createObjectURL(data);
+                                        displayFilesInModal([data]);
+                                    }
+                                };
+
+                                return (
+                                    <>
+                                        <AttachmentPickerWithMenuItems
+                                            displayFilesInModal={displayFilesInModal}
+                                            reportID={reportID}
+                                            report={report}
+                                            currentUserPersonalDetails={currentUserPersonalDetails}
+                                            reportParticipantIDs={reportParticipantIDs}
+                                            isFullComposerAvailable={isFullComposerAvailable}
+                                            isComposerFullSize={isComposerFullSize}
+                                            isBlockedFromConcierge={isBlockedFromConcierge}
+                                            disabled={disabled}
+                                            setMenuVisibility={setMenuVisibility}
+                                            isMenuVisible={isMenuVisible}
+                                            onTriggerAttachmentPicker={onTriggerAttachmentPicker}
+                                            raiseIsScrollLikelyLayoutTriggered={raiseIsScrollLikelyLayoutTriggered}
+                                            onAddActionPressed={onAddActionPressed}
+                                            onItemSelected={onItemSelected}
+                                            onCanceledAttachmentPicker={() => {
+                                                if (!shouldFocusInputOnScreenFocus) {
                                                     return;
                                                 }
-                                                const data = event.dataTransfer?.files[0];
-                                                if (data) {
-                                                    data.uri = URL.createObjectURL(data);
-                                                    displayFileInModal(data);
-                                                }
+                                                focus();
                                             }}
-                                            onReceiptDrop={handleAddingReceipt}
+                                            actionButtonRef={actionButtonRef}
+                                            shouldDisableAttachmentItem={!!exceededMaxLength}
                                         />
-                                    )}
-                                    {isBetaEnabled(CONST.BETAS.NEWDOT_MULTI_FILES_DRAG_AND_DROP) && !shouldDisplayDualDropZone && (
-                                        <DragAndDropConsumer
-                                            onDrop={(event: DragEvent) => {
-                                                if (isAttachmentPreviewActive) {
-                                                    return;
-                                                }
-                                                const data = event.dataTransfer?.files[0];
-                                                if (data) {
-                                                    data.uri = URL.createObjectURL(data);
-                                                    displayFileInModal(data);
-                                                }
-                                            }}
-                                        >
-                                            <DropZoneUI
-                                                icon={Expensicons.MessageInABottle}
-                                                dropTitle={translate('dropzone.addAttachments')}
-                                                dropStyles={styles.attachmentDropOverlay(true)}
-                                                dropTextStyles={styles.attachmentDropText}
-                                                dropInnerWrapperStyles={styles.attachmentDropInnerWrapper(true)}
-                                            />
-                                        </DragAndDropConsumer>
-                                    )}
-                                    {!isBetaEnabled(CONST.BETAS.NEWDOT_MULTI_FILES_DRAG_AND_DROP) && (
-                                        <ReportDropUI
-                                            onDrop={(event: DragEvent) => {
-                                                if (isAttachmentPreviewActive) {
-                                                    return;
-                                                }
-                                                const data = event.dataTransfer?.files[0];
-                                                if (data) {
-                                                    data.uri = URL.createObjectURL(data);
-                                                    displayFileInModal(data);
-                                                }
+                                        <ComposerWithSuggestions
+                                            ref={(ref) => {
+                                                composerRef.current = ref ?? undefined;
+                                                composerRefShared.set({
+                                                    clear: ref?.clear,
+                                                });
                                             }}
+                                            suggestionsRef={suggestionsRef}
+                                            isNextModalWillOpenRef={isNextModalWillOpenRef}
+                                            isScrollLikelyLayoutTriggered={isScrollLikelyLayoutTriggered}
+                                            raiseIsScrollLikelyLayoutTriggered={raiseIsScrollLikelyLayoutTriggered}
+                                            reportID={reportID}
+                                            policyID={report?.policyID}
+                                            includeChronos={chatIncludesChronos(report)}
+                                            isGroupPolicyReport={isGroupPolicyReport}
+                                            lastReportAction={lastReportAction}
+                                            isMenuVisible={isMenuVisible}
+                                            inputPlaceholder={inputPlaceholder}
+                                            isComposerFullSize={isComposerFullSize}
+                                            setIsFullComposerAvailable={setIsFullComposerAvailable}
+                                            displayFilesInModal={displayFilesInModal}
+                                            onCleared={submitForm}
+                                            isBlockedFromConcierge={isBlockedFromConcierge}
+                                            disabled={disabled}
+                                            setIsCommentEmpty={setIsCommentEmpty}
+                                            handleSendMessage={handleSendMessage}
+                                            shouldShowComposeInput={shouldShowComposeInput}
+                                            onFocus={onFocus}
+                                            onBlur={onBlur}
+                                            measureParentContainer={measureContainer}
+                                            onValueChange={onValueChange}
+                                            didHideComposerInput={didHideComposerInput}
                                         />
-                                    )}
-                                </>
-                            )}
-                        </AttachmentModal>
+                                        {/* TODO: remove beta check after the feature is enabled */}
+                                        {isBetaEnabled(CONST.BETAS.NEWDOT_MULTI_FILES_DRAG_AND_DROP) && shouldDisplayDualDropZone && (
+                                            <DualDropZone
+                                                isEditing={isTransactionThreadView && hasReceipt}
+                                                onAttachmentDrop={handleAttachmentDrop}
+                                                onReceiptDrop={handleAddingReceipt}
+                                            />
+                                        )}
+                                        {isBetaEnabled(CONST.BETAS.NEWDOT_MULTI_FILES_DRAG_AND_DROP) && !shouldDisplayDualDropZone && (
+                                            <DragAndDropConsumer onDrop={handleAttachmentDrop}>
+                                                <DropZoneUI
+                                                    icon={Expensicons.MessageInABottle}
+                                                    dropTitle={translate('dropzone.addAttachments')}
+                                                    dropStyles={styles.attachmentDropOverlay(true)}
+                                                    dropTextStyles={styles.attachmentDropText}
+                                                    dropInnerWrapperStyles={styles.attachmentDropInnerWrapper(true)}
+                                                />
+                                            </DragAndDropConsumer>
+                                        )}
+                                        {!isBetaEnabled(CONST.BETAS.NEWDOT_MULTI_FILES_DRAG_AND_DROP) && (
+                                            <ReportDropUI
+                                                onDrop={(event: DragEvent) => {
+                                                    if (isAttachmentPreviewActive) {
+                                                        return;
+                                                    }
+                                                    const data = event.dataTransfer?.files[0];
+                                                    if (data) {
+                                                        data.uri = URL.createObjectURL(data);
+                                                        displayFilesInModal([data]);
+                                                    }
+                                                }}
+                                            />
+                                        )}
+                                    </>
+                                );
+                            }}
+                        </AttachmentComposerModal>
                         {canUseTouchScreen() && isMediumScreenWidth ? null : (
                             <EmojiPickerButton
                                 isDisabled={isBlockedFromConcierge || disabled}
