diff --git a/src/ROUTES.ts b/src/ROUTES.ts
index d7da1da78f50..34e890ddd727 100644
--- a/src/ROUTES.ts
+++ b/src/ROUTES.ts
@@ -1093,12 +1093,6 @@ const ROUTES = {
             // eslint-disable-next-line no-restricted-syntax -- Legacy route generation
             getUrlWithBackToParam(`settings/${policyID}/category/${encodeURIComponent(categoryName)}/gl-code` as const, backTo),
     },
-    MONEY_REQUEST_STEP_CURRENCY: {
-        route: ':action/:iouType/currency/:transactionID/:reportID/:pageIndex?',
-        getRoute: (action: IOUAction, iouType: IOUType, transactionID: string, reportID: string, pageIndex = '', currency = '', backTo = '') =>
-            // eslint-disable-next-line no-restricted-syntax -- Legacy route generation
-            getUrlWithBackToParam(`${action as string}/${iouType as string}/currency/${transactionID}/${reportID}/${pageIndex}?currency=${currency}`, backTo),
-    },
     MONEY_REQUEST_STEP_DATE: {
         route: ':action/:iouType/date/:transactionID/:reportID/:reportActionID?',
         getRoute: (action: IOUAction, iouType: IOUType, transactionID: string | undefined, reportID: string | undefined, backTo = '', reportActionID?: string) => {
diff --git a/src/SCREENS.ts b/src/SCREENS.ts
index 199e49428551..f4e96d59e6aa 100644
--- a/src/SCREENS.ts
+++ b/src/SCREENS.ts
@@ -292,7 +292,6 @@ const SCREENS = {
         STEP_UPGRADE: 'Money_Request_Step_Upgrade',
         STEP_AMOUNT: 'Money_Request_Step_Amount',
         STEP_CATEGORY: 'Money_Request_Step_Category',
-        STEP_CURRENCY: 'Money_Request_Step_Currency',
         STEP_DATE: 'Money_Request_Step_Date',
         STEP_DESCRIPTION: 'Money_Request_Step_Description',
         STEP_DISTANCE: 'Money_Request_Step_Distance',
diff --git a/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx b/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx
index 85642f25d618..733c93fa7b27 100644
--- a/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx
+++ b/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx
@@ -202,7 +202,6 @@ const MoneyRequestModalStackNavigator = createModalStackNavigator<MoneyRequestNa
     [SCREENS.MONEY_REQUEST.STEP_TAX_AMOUNT]: () => require<ReactComponentModule>('../../../../pages/iou/request/step/IOURequestStepTaxAmountPage').default,
     [SCREENS.MONEY_REQUEST.STEP_TAX_RATE]: () => require<ReactComponentModule>('../../../../pages/iou/request/step/IOURequestStepTaxRatePage').default,
     [SCREENS.MONEY_REQUEST.STEP_CATEGORY]: () => require<ReactComponentModule>('../../../../pages/iou/request/step/IOURequestStepCategory').default,
-    [SCREENS.MONEY_REQUEST.STEP_CURRENCY]: () => require<ReactComponentModule>('../../../../pages/iou/request/step/IOURequestStepCurrency').default,
     [SCREENS.MONEY_REQUEST.STEP_DATE]: () => require<ReactComponentModule>('../../../../pages/iou/request/step/IOURequestStepDate').default,
     [SCREENS.MONEY_REQUEST.STEP_DESCRIPTION]: () => require<ReactComponentModule>('../../../../pages/iou/request/step/IOURequestStepDescription').default,
     [SCREENS.MONEY_REQUEST.STEP_DISTANCE]: () => require<ReactComponentModule>('../../../../pages/iou/request/step/IOURequestStepDistance').default,
diff --git a/src/libs/Navigation/linkingConfig/config.ts b/src/libs/Navigation/linkingConfig/config.ts
index 55ed3cb8603b..73041d63fc85 100644
--- a/src/libs/Navigation/linkingConfig/config.ts
+++ b/src/libs/Navigation/linkingConfig/config.ts
@@ -1442,7 +1442,6 @@ const config: LinkingOptions<RootNavigatorParamList>['config'] = {
                         [SCREENS.MONEY_REQUEST.STEP_CATEGORY]: ROUTES.MONEY_REQUEST_STEP_CATEGORY.route,
                         [SCREENS.MONEY_REQUEST.STEP_CONFIRMATION]: ROUTES.MONEY_REQUEST_STEP_CONFIRMATION.route,
                         [SCREENS.MONEY_REQUEST.STEP_CONFIRMATION_VERIFY_ACCOUNT]: ROUTES.MONEY_REQUEST_STEP_CONFIRMATION_VERIFY_ACCOUNT.route,
-                        [SCREENS.MONEY_REQUEST.STEP_CURRENCY]: ROUTES.MONEY_REQUEST_STEP_CURRENCY.route,
                         [SCREENS.MONEY_REQUEST.STEP_DATE]: ROUTES.MONEY_REQUEST_STEP_DATE.route,
                         [SCREENS.MONEY_REQUEST.STEP_DESCRIPTION]: ROUTES.MONEY_REQUEST_STEP_DESCRIPTION.route,
                         [SCREENS.MONEY_REQUEST.STEP_DISTANCE]: ROUTES.MONEY_REQUEST_STEP_DISTANCE.route,
diff --git a/src/libs/Navigation/types.ts b/src/libs/Navigation/types.ts
index 2974734b708c..8769b0ad3a04 100644
--- a/src/libs/Navigation/types.ts
+++ b/src/libs/Navigation/types.ts
@@ -1606,7 +1606,6 @@ type MoneyRequestNavigatorParamList = {
         reportID: string;
         // eslint-disable-next-line no-restricted-syntax -- `backTo` usages in this file are legacy. Do not add new `backTo` params to screens. See contributingGuides/NAVIGATION.md
         backTo: Routes;
-        currency?: string;
     };
     [SCREENS.MONEY_REQUEST.STEP_TAG]: {
         action: IOUAction;
@@ -1696,7 +1695,6 @@ type MoneyRequestNavigatorParamList = {
         // eslint-disable-next-line no-restricted-syntax -- `backTo` usages in this file are legacy. Do not add new `backTo` params to screens. See contributingGuides/NAVIGATION.md
         backTo: never;
         action: never;
-        currency: never;
         pageIndex?: string;
         backToReport?: string;
         reportActionID?: string;
@@ -1715,7 +1713,6 @@ type MoneyRequestNavigatorParamList = {
         backTo: Routes;
         action: IOUAction;
         pageIndex?: string;
-        currency?: string;
         backToReport?: string;
         reportActionID?: string;
     };
@@ -1760,16 +1757,6 @@ type MoneyRequestNavigatorParamList = {
         // eslint-disable-next-line no-restricted-syntax -- `backTo` usages in this file are legacy. Do not add new `backTo` params to screens. See contributingGuides/NAVIGATION.md
         backTo: Routes;
     };
-    [SCREENS.MONEY_REQUEST.STEP_CURRENCY]: {
-        action: IOUAction;
-        iouType: IOUType;
-        transactionID: string;
-        reportID: string;
-        pageIndex?: string;
-        // eslint-disable-next-line no-restricted-syntax -- `backTo` usages in this file are legacy. Do not add new `backTo` params to screens. See contributingGuides/NAVIGATION.md
-        backTo?: Routes;
-        currency?: string;
-    };
     [SCREENS.MONEY_REQUEST.HOLD]: {
         /** ID of the transaction the page was opened for */
         transactionID: string;
@@ -1881,7 +1868,6 @@ type MoneyRequestNavigatorParamList = {
         // eslint-disable-next-line no-restricted-syntax -- `backTo` usages in this file are legacy. Do not add new `backTo` params to screens. See contributingGuides/NAVIGATION.md
         backTo: never;
         action: never;
-        currency: never;
         pageIndex?: string;
         backToReport?: string;
         reportActionID?: string;
diff --git a/src/pages/iou/request/DistanceRequestStartPage.tsx b/src/pages/iou/request/DistanceRequestStartPage.tsx
index 06a03d4a28d1..2113214a1e02 100644
--- a/src/pages/iou/request/DistanceRequestStartPage.tsx
+++ b/src/pages/iou/request/DistanceRequestStartPage.tsx
@@ -98,27 +98,6 @@ function DistanceRequestStartPage({
         Navigation.closeRHPFlow();
     };
 
-    // This useEffect is used to initialize the money request, so that currency will be reset to default currency on page reload.
-    useEffect(() => {
-        if (transaction?.amount !== 0) {
-            return;
-        }
-        initMoneyRequest({
-            reportID,
-            policy,
-            isFromGlobalCreate,
-            currentIouRequestType: transaction?.iouRequestType,
-            newIouRequestType: transaction?.iouRequestType,
-            report,
-            parentReport,
-            currentDate,
-            lastSelectedDistanceRates,
-            currentUserPersonalDetails,
-            hasOnlyPersonalPolicies,
-        });
-        // eslint-disable-next-line
-    }, []);
-
     const resetIOUTypeIfChanged = useCallback(
         (newIOUType: IOURequestType) => {
             Keyboard.dismiss();
diff --git a/src/pages/iou/request/IOURequestStartPage.tsx b/src/pages/iou/request/IOURequestStartPage.tsx
index 0872252edc02..d99932260d11 100644
--- a/src/pages/iou/request/IOURequestStartPage.tsx
+++ b/src/pages/iou/request/IOURequestStartPage.tsx
@@ -137,27 +137,6 @@ function IOURequestStartPage({
         Navigation.closeRHPFlow();
     };
 
-    // This useEffect is used to initialize the money request, so that currency will be reset to default currency on page reload.
-    useEffect(() => {
-        if (transaction?.amount !== 0) {
-            return;
-        }
-        initMoneyRequest({
-            reportID,
-            policy,
-            isFromGlobalCreate,
-            currentIouRequestType: transaction?.iouRequestType,
-            newIouRequestType: transaction?.iouRequestType,
-            report,
-            parentReport,
-            currentDate,
-            lastSelectedDistanceRates,
-            currentUserPersonalDetails,
-            hasOnlyPersonalPolicies,
-        });
-        // eslint-disable-next-line
-    }, []);
-
     const resetIOUTypeIfChanged = useCallback(
         (newIOUType: IOURequestType) => {
             Keyboard.dismiss();
diff --git a/src/pages/iou/request/step/IOURequestStepAmount.tsx b/src/pages/iou/request/step/IOURequestStepAmount.tsx
index 3441507e0cfd..4b1fd086da5a 100644
--- a/src/pages/iou/request/step/IOURequestStepAmount.tsx
+++ b/src/pages/iou/request/step/IOURequestStepAmount.tsx
@@ -1,10 +1,10 @@
 import {useFocusEffect} from '@react-navigation/native';
 import reportsSelector from '@selectors/Attributes';
-import React, {useCallback, useEffect, useMemo, useRef} from 'react';
+import React, {useCallback, useEffect, useMemo, useRef, useState} from 'react';
 import type {OnyxEntry} from 'react-native-onyx';
+import isTextInputFocused from '@components/TextInput/BaseTextInput/isTextInputFocused';
 import type {BaseTextInputRef} from '@components/TextInput/BaseTextInput/types';
-import withCurrentUserPersonalDetails from '@components/withCurrentUserPersonalDetails';
-import type {WithCurrentUserPersonalDetailsProps} from '@components/withCurrentUserPersonalDetails';
+import useCurrentUserPersonalDetails from '@hooks/useCurrentUserPersonalDetails';
 import useDefaultExpensePolicy from '@hooks/useDefaultExpensePolicy';
 import useDuplicateTransactionsAndViolations from '@hooks/useDuplicateTransactionsAndViolations';
 import useLocalize from '@hooks/useLocalize';
@@ -14,8 +14,7 @@ import usePersonalPolicy from '@hooks/usePersonalPolicy';
 import useReportIsArchived from '@hooks/useReportIsArchived';
 import useShowNotFoundPageInIOUStep from '@hooks/useShowNotFoundPageInIOUStep';
 import {setTransactionReport} from '@libs/actions/Transaction';
-import {createDraftTransaction, removeDraftTransaction} from '@libs/actions/TransactionEdit';
-import {convertToBackendAmount, isValidCurrencyCode} from '@libs/CurrencyUtils';
+import {convertToBackendAmount} from '@libs/CurrencyUtils';
 import {navigateToParticipantPage} from '@libs/IOUUtils';
 import Navigation from '@libs/Navigation/Navigation';
 import {getParticipantsOption, getReportOption} from '@libs/OptionsListUtils';
@@ -45,6 +44,7 @@ import type {SelectedTabRequest} from '@src/types/onyx';
 import type {PaymentMethodType} from '@src/types/onyx/OriginalMessage';
 import type Transaction from '@src/types/onyx/Transaction';
 import {isEmptyObject} from '@src/types/utils/EmptyObject';
+import IOURequestStepCurrencyModal from './IOURequestStepCurrencyModal';
 import StepScreenWrapper from './StepScreenWrapper';
 import withFullTransactionOrNotFound from './withFullTransactionOrNotFound';
 import type {WithWritableReportOrNotFoundProps} from './withWritableReportOrNotFound';
@@ -55,26 +55,26 @@ type AmountParams = {
     paymentMethod?: PaymentMethodType;
 };
 
-type IOURequestStepAmountProps = WithCurrentUserPersonalDetailsProps &
-    WithWritableReportOrNotFoundProps<typeof SCREENS.MONEY_REQUEST.STEP_AMOUNT | typeof SCREENS.MONEY_REQUEST.CREATE> & {
-        /** The transaction object being modified in Onyx */
-        transaction: OnyxEntry<Transaction>;
+type IOURequestStepAmountProps = WithWritableReportOrNotFoundProps<typeof SCREENS.MONEY_REQUEST.STEP_AMOUNT | typeof SCREENS.MONEY_REQUEST.CREATE> & {
+    /** The transaction object being modified in Onyx */
+    transaction: OnyxEntry<Transaction>;
 
-        /** Whether the user input should be kept or not */
-        shouldKeepUserInput?: boolean;
-    };
+    /** Whether the user input should be kept or not */
+    shouldKeepUserInput?: boolean;
+};
 
 function IOURequestStepAmount({
     report,
     route: {
-        params: {iouType, reportID, transactionID = '-1', backTo, pageIndex, action, currency: selectedCurrency = '', backToReport, reportActionID},
+        params: {iouType, reportID, transactionID = '-1', backTo, action, backToReport, reportActionID},
     },
     transaction,
-    currentUserPersonalDetails,
     shouldKeepUserInput = false,
 }: IOURequestStepAmountProps) {
     const {translate} = useLocalize();
     const {isBetaEnabled} = usePermissions();
+    const currentUserPersonalDetails = useCurrentUserPersonalDetails();
+    const [isCurrencyPickerVisible, setIsCurrencyPickerVisible] = useState(false);
     const textInput = useRef<BaseTextInputRef | null>(null);
     const focusTimeoutRef = useRef<NodeJS.Timeout | null>(null);
     const isSaveButtonPressed = useRef(false);
@@ -104,7 +104,7 @@ function IOURequestStepAmount({
     const disableOppositeConversion = isCreateAction || (isSubmitType && isSubmitAction);
     const {amount: transactionAmount} = getTransactionDetails(currentTransaction, undefined, undefined, allowNegative, disableOppositeConversion) ?? {amount: 0};
     const {currency: originalCurrency} = getTransactionDetails(isEditing && !isEmptyObject(draftTransaction) ? draftTransaction : transaction) ?? {currency: CONST.CURRENCY.USD};
-    const currency = isValidCurrencyCode(selectedCurrency) ? selectedCurrency : originalCurrency;
+    const [selectedCurrency, setSelectedCurrency] = useState(originalCurrency);
     // eslint-disable-next-line rulesdir/no-negated-variables
     const shouldShowNotFoundPage = useShowNotFoundPageInIOUStep(action, iouType, reportActionID, report, transaction);
     const shouldGenerateTransactionThreadReport = !isBetaEnabled(CONST.BETAS.NO_OPTIMISTIC_TRANSACTION_THREADS);
@@ -127,42 +127,28 @@ function IOURequestStepAmount({
 
     useFocusEffect(
         useCallback(() => {
-            focusTimeoutRef.current = setTimeout(() => textInput.current?.focus(), CONST.ANIMATED_TRANSITION);
+            if (isCurrencyPickerVisible) {
+                return;
+            }
+            focusTimeoutRef.current = setTimeout(() => textInput.current?.focus(), CONST.ANIMATED_TRANSITION + 100);
             return () => {
                 if (!focusTimeoutRef.current) {
                     return;
                 }
                 clearTimeout(focusTimeoutRef.current);
             };
-        }, []),
+        }, [isCurrencyPickerVisible]),
     );
 
+    // This useEffect is to update the selected currency when the we came back from confirmation page
     useEffect(() => {
-        if (!isEditing) {
-            return;
-        }
-        // A temporary solution to not prevent users from editing the currency
-        // We create a backup transaction and use it to save the currency and remove this transaction backup if we don't save the amount
-        // It should be removed after this issue https://github.com/Expensify/App/issues/34607 is fixed
-        createDraftTransaction(isEditingSplitBill && !isEmptyObject(splitDraftTransaction) ? splitDraftTransaction : transaction);
-
-        return () => {
-            if (isSaveButtonPressed.current) {
-                return;
-            }
-            removeDraftTransaction(transaction?.transactionID);
-        };
-        // eslint-disable-next-line react-compiler/react-compiler, react-hooks/exhaustive-deps
-    }, []);
+        setSelectedCurrency(originalCurrency);
+    }, [originalCurrency]);
 
     const navigateBack = () => {
         Navigation.goBack(backTo);
     };
 
-    const navigateToCurrencySelectionPage = () => {
-        Navigation.navigate(ROUTES.MONEY_REQUEST_STEP_CURRENCY.getRoute(action, iouType, transactionID, reportID, pageIndex, currency, Navigation.getActiveRoute()));
-    };
-
     const navigateToConfirmationPage = () => {
         switch (iouType) {
             case CONST.IOU.TYPE.REQUEST:
@@ -181,7 +167,7 @@ function IOURequestStepAmount({
         const amountInSmallestCurrencyUnits = convertToBackendAmount(Number.parseFloat(amount));
 
         // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
-        setMoneyRequestAmount(transactionID, amountInSmallestCurrencyUnits, currency || CONST.CURRENCY.USD, shouldKeepUserInput);
+        setMoneyRequestAmount(transactionID, amountInSmallestCurrencyUnits, selectedCurrency || CONST.CURRENCY.USD, shouldKeepUserInput);
 
         if (backTo) {
             Navigation.goBack(backTo);
@@ -205,10 +191,10 @@ function IOURequestStepAmount({
             if (shouldSkipConfirmation) {
                 if (iouType === CONST.IOU.TYPE.PAY || iouType === CONST.IOU.TYPE.SEND) {
                     if (paymentMethod && paymentMethod === CONST.IOU.PAYMENT_TYPE.EXPENSIFY) {
-                        sendMoneyWithWallet(report, quickAction, backendAmount, currency, '', currentUserAccountIDParam, participants.at(0) ?? {});
+                        sendMoneyWithWallet(report, quickAction, backendAmount, selectedCurrency, '', currentUserAccountIDParam, participants.at(0) ?? {});
                         return;
                     }
-                    sendMoneyElsewhere(report, quickAction, backendAmount, currency, '', currentUserAccountIDParam, participants.at(0) ?? {});
+                    sendMoneyElsewhere(report, quickAction, backendAmount, selectedCurrency, '', currentUserAccountIDParam, participants.at(0) ?? {});
                     return;
                 }
                 if (iouType === CONST.IOU.TYPE.SUBMIT || iouType === CONST.IOU.TYPE.REQUEST) {
@@ -221,7 +207,7 @@ function IOURequestStepAmount({
                         },
                         transactionParams: {
                             amount: backendAmount,
-                            currency,
+                            currency: selectedCurrency,
                             created: transaction?.created ?? '',
                             merchant: CONST.TRANSACTION.PARTIAL_TRANSACTION_MERCHANT,
                             attendees: transaction?.comment?.attendees,
@@ -246,7 +232,7 @@ function IOURequestStepAmount({
                         },
                         transactionParams: {
                             amount: backendAmount,
-                            currency: currency ?? 'USD',
+                            currency: selectedCurrency ?? CONST.CURRENCY.USD,
                             created: transaction?.created,
                             merchant: CONST.TRANSACTION.PARTIAL_TRANSACTION_MERCHANT,
                         },
@@ -257,7 +243,7 @@ function IOURequestStepAmount({
             }
             if (isSplitBill && !report.isOwnPolicyExpenseChat && report.participants) {
                 const participantAccountIDs = Object.keys(report.participants).map((accountID) => Number(accountID));
-                setSplitShares(transaction, amountInSmallestCurrencyUnits, currency || CONST.CURRENCY.USD, participantAccountIDs);
+                setSplitShares(transaction, amountInSmallestCurrencyUnits, selectedCurrency || CONST.CURRENCY.USD, participantAccountIDs);
             }
             setMoneyRequestParticipantsFromReport(transactionID, report, currentUserPersonalDetails.accountID).then(() => {
                 navigateToConfirmationPage();
@@ -320,7 +306,7 @@ function IOURequestStepAmount({
 
         // Edits to the amount from the splits page should reset the split shares.
         if (transaction?.splitShares) {
-            resetSplitShares(transaction, newAmount, currency);
+            resetSplitShares(transaction, newAmount, selectedCurrency);
         }
 
         if (!isEditing) {
@@ -330,20 +316,20 @@ function IOURequestStepAmount({
 
         // If the value hasn't changed, don't request to save changes on the server and just close the modal
         const transactionCurrency = getCurrency(currentTransaction);
-        if (newAmount === getAmount(currentTransaction, false, false, allowNegative, disableOppositeConversion) && currency === transactionCurrency) {
+        if (newAmount === getAmount(currentTransaction, false, false, allowNegative, disableOppositeConversion) && selectedCurrency === transactionCurrency) {
             navigateBack();
             return;
         }
 
         // If currency has changed, then we get the default tax rate based on currency, otherwise we use the current tax rate selected in transaction, if we have it.
         const transactionTaxCode = getTransactionDetails(currentTransaction)?.taxCode;
-        const defaultTaxCode = getDefaultTaxCode(policy, currentTransaction, currency) ?? '';
-        const taxCode = (currency !== transactionCurrency ? defaultTaxCode : transactionTaxCode) ?? defaultTaxCode;
+        const defaultTaxCode = getDefaultTaxCode(policy, currentTransaction, selectedCurrency) ?? '';
+        const taxCode = (selectedCurrency !== transactionCurrency ? defaultTaxCode : transactionTaxCode) ?? defaultTaxCode;
         const taxPercentage = getTaxValue(policy, currentTransaction, taxCode) ?? '';
-        const taxAmount = convertToBackendAmount(calculateTaxAmount(taxPercentage, newAmount, currency ?? CONST.CURRENCY.USD));
+        const taxAmount = convertToBackendAmount(calculateTaxAmount(taxPercentage, newAmount, selectedCurrency ?? CONST.CURRENCY.USD));
 
         if (isSplitBill) {
-            setDraftSplitTransaction(transactionID, splitDraftTransaction, {amount: newAmount, currency, taxCode, taxAmount});
+            setDraftSplitTransaction(transactionID, splitDraftTransaction, {amount: newAmount, currency: selectedCurrency, taxCode, taxAmount});
             navigateBack();
             return;
         }
@@ -353,7 +339,7 @@ function IOURequestStepAmount({
             transactionThreadReportID: reportID,
             transactions: duplicateTransactions,
             transactionViolations: duplicateTransactionViolations,
-            currency,
+            currency: selectedCurrency,
             amount: newAmount,
             taxAmount,
             policy,
@@ -366,6 +352,21 @@ function IOURequestStepAmount({
         navigateBack();
     };
 
+    const hideCurrencyPicker = () => {
+        setIsCurrencyPickerVisible(false);
+    };
+
+    const updateSelectedCurrency = (value: string) => {
+        setSelectedCurrency(value);
+    };
+
+    const showCurrencyPicker = () => {
+        if (isTextInputFocused(textInput)) {
+            textInput.current?.blur();
+        }
+        setIsCurrencyPickerVisible(true);
+    };
+
     return (
         <StepScreenWrapper
             headerTitle={translate('iou.amount')}
@@ -375,9 +376,16 @@ function IOURequestStepAmount({
             includeSafeAreaPaddingBottom
             shouldShowNotFoundPage={shouldShowNotFoundPage}
         >
+            <IOURequestStepCurrencyModal
+                isPickerVisible={isCurrencyPickerVisible}
+                hidePickerModal={hideCurrencyPicker}
+                headerText={translate('common.selectCurrency')}
+                value={selectedCurrency}
+                onInputChange={updateSelectedCurrency}
+            />
             <MoneyRequestAmountForm
                 isEditing={!!backTo || isEditing}
-                currency={currency}
+                currency={selectedCurrency}
                 amount={transactionAmount}
                 skipConfirmation={shouldSkipConfirmation ?? false}
                 iouType={iouType}
@@ -386,7 +394,7 @@ function IOURequestStepAmount({
                     textInput.current = e;
                 }}
                 shouldKeepUserInput={transaction?.shouldShowOriginalAmount}
-                onCurrencyButtonPress={navigateToCurrencySelectionPage}
+                onCurrencyButtonPress={showCurrencyPicker}
                 onSubmitButtonPress={saveAmountAndCurrency}
                 allowFlippingAmount={!isSplitBill && allowNegative}
                 selectedTab={iouRequestType as SelectedTabRequest}
@@ -404,11 +412,10 @@ function isParticipantP2P(participant: {accountID?: number; isPolicyExpenseChat?
     return !!(participant?.accountID && !participant.isPolicyExpenseChat);
 }
 
-const IOURequestStepAmountWithCurrentUserPersonalDetails = withCurrentUserPersonalDetails(IOURequestStepAmount);
 // eslint-disable-next-line rulesdir/no-negated-variables
-const IOURequestStepAmountWithWritableReportOrNotFound = withWritableReportOrNotFound(IOURequestStepAmountWithCurrentUserPersonalDetails, true);
+const IOURequestStepAmountWithWritableReportOrNotFound = withWritableReportOrNotFound(IOURequestStepAmount, true);
 // eslint-disable-next-line rulesdir/no-negated-variables
-const IOURequestStepAmountWithFullTransactionOrNotFound = withFullTransactionOrNotFound(IOURequestStepAmountWithWritableReportOrNotFound);
+const IOURequestStepAmountWithFullTransactionOrNotFound = withFullTransactionOrNotFound(IOURequestStepAmountWithWritableReportOrNotFound, true);
 
 export default IOURequestStepAmountWithFullTransactionOrNotFound;
 export {isParticipantP2P};
diff --git a/src/pages/iou/request/step/IOURequestStepCurrency.tsx b/src/pages/iou/request/step/IOURequestStepCurrency.tsx
deleted file mode 100644
index 62202938e0ed..000000000000
--- a/src/pages/iou/request/step/IOURequestStepCurrency.tsx
+++ /dev/null
@@ -1,86 +0,0 @@
-import React from 'react';
-import {Keyboard} from 'react-native';
-import CurrencySelectionList from '@components/CurrencySelectionList';
-import type {CurrencyListItem} from '@components/CurrencySelectionList/types';
-import useLocalize from '@hooks/useLocalize';
-import useOnyx from '@hooks/useOnyx';
-import {isValidCurrencyCode} from '@libs/CurrencyUtils';
-import Navigation from '@libs/Navigation/Navigation';
-import {getTransactionDetails} from '@libs/ReportUtils';
-import {appendParam} from '@libs/Url';
-import {setMoneyRequestCurrency} from '@userActions/IOU';
-import CONST from '@src/CONST';
-import ONYXKEYS from '@src/ONYXKEYS';
-import type SCREENS from '@src/SCREENS';
-import StepScreenWrapper from './StepScreenWrapper';
-import withFullTransactionOrNotFound from './withFullTransactionOrNotFound';
-import type {WithFullTransactionOrNotFoundProps} from './withFullTransactionOrNotFound';
-
-type IOURequestStepCurrencyProps = WithFullTransactionOrNotFoundProps<typeof SCREENS.MONEY_REQUEST.STEP_CURRENCY>;
-
-function IOURequestStepCurrency({
-    route: {
-        params: {backTo, pageIndex, transactionID, action, currency: selectedCurrency = ''},
-    },
-}: IOURequestStepCurrencyProps) {
-    const {translate} = useLocalize();
-    const [draftTransaction] = useOnyx(`${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${transactionID}`, {canBeMissing: true});
-    const [recentlyUsedCurrencies] = useOnyx(ONYXKEYS.RECENTLY_USED_CURRENCIES, {canBeMissing: true});
-    const {currency: originalCurrency = ''} = getTransactionDetails(draftTransaction) ?? {};
-    const currency = isValidCurrencyCode(selectedCurrency) ? selectedCurrency : originalCurrency;
-
-    const navigateBack = (selectedCurrencyValue = '') => {
-        // If the currency selection was done from the confirmation step (eg. + > submit expense > manual > confirm > amount > currency)
-        // then the user needs taken back to the confirmation page instead of the initial amount page. This is because the route params
-        // are only able to handle one backTo param at a time and the user needs to go back to the amount page before going back
-        // to the confirmation page
-        if (pageIndex === CONST.IOU.PAGE_INDEX.CONFIRM) {
-            if (selectedCurrencyValue) {
-                Navigation.goBack(appendParam(backTo as string, 'currency', selectedCurrencyValue), {compareParams: false});
-            } else {
-                Navigation.goBack(backTo);
-            }
-            return;
-        }
-        Navigation.goBack(backTo);
-    };
-
-    const confirmCurrencySelection = (option: CurrencyListItem) => {
-        Keyboard.dismiss();
-        if (pageIndex !== CONST.IOU.PAGE_INDEX.CONFIRM) {
-            setMoneyRequestCurrency(transactionID, option.currencyCode, action === CONST.IOU.ACTION.EDIT);
-        }
-
-        Navigation.setNavigationActionToMicrotaskQueue(() => navigateBack(option.currencyCode));
-    };
-
-    return (
-        <StepScreenWrapper
-            shouldEnableKeyboardAvoidingView={false}
-            headerTitle={translate('common.selectCurrency')}
-            onBackButtonPress={() => navigateBack()}
-            shouldShowWrapper
-            testID="IOURequestStepCurrency"
-            includeSafeAreaPaddingBottom
-        >
-            {({didScreenTransitionEnd}) => (
-                <CurrencySelectionList
-                    recentlyUsedCurrencies={recentlyUsedCurrencies ?? []}
-                    searchInputLabel={translate('common.search')}
-                    onSelect={(option: CurrencyListItem) => {
-                        if (!didScreenTransitionEnd) {
-                            return;
-                        }
-                        confirmCurrencySelection(option);
-                    }}
-                    initiallySelectedCurrencyCode={currency.toUpperCase()}
-                />
-            )}
-        </StepScreenWrapper>
-    );
-}
-
-/* eslint-disable rulesdir/no-negated-variables */
-const IOURequestStepCurrencyWithFullTransactionOrNotFound = withFullTransactionOrNotFound(IOURequestStepCurrency);
-
-export default IOURequestStepCurrencyWithFullTransactionOrNotFound;
diff --git a/src/pages/iou/request/step/IOURequestStepCurrencyModal.tsx b/src/pages/iou/request/step/IOURequestStepCurrencyModal.tsx
new file mode 100644
index 000000000000..0c3c1a309080
--- /dev/null
+++ b/src/pages/iou/request/step/IOURequestStepCurrencyModal.tsx
@@ -0,0 +1,81 @@
+import React from 'react';
+import CurrencySelectionList from '@components/CurrencySelectionList';
+import type {CurrencyListItem} from '@components/CurrencySelectionList/types';
+import HeaderWithBackButton from '@components/HeaderWithBackButton';
+import Modal from '@components/Modal';
+import ScreenWrapper from '@components/ScreenWrapper';
+import useLocalize from '@hooks/useLocalize';
+import useOnyx from '@hooks/useOnyx';
+import useThemeStyles from '@hooks/useThemeStyles';
+import Navigation from '@libs/Navigation/Navigation';
+import CONST from '@src/CONST';
+import ONYXKEYS from '@src/ONYXKEYS';
+
+type CurrencyPickerProps = {
+    /** Whether the picker modal is visible */
+    isPickerVisible: boolean;
+
+    /** Function to hide the picker modal */
+    hidePickerModal: () => void;
+
+    /** Header text for the modal */
+    headerText: string;
+
+    /** Current value of the selected item */
+    value?: string;
+
+    /** Callback when the list item is selected */
+    onInputChange?: (value: string, key?: string) => void;
+
+    /** List of currencies to exclude from the list */
+    excludeCurrencies?: string[];
+};
+
+function IOURequestStepCurrencyModal({isPickerVisible, hidePickerModal, headerText, value, excludeCurrencies, onInputChange = () => {}}: CurrencyPickerProps) {
+    const {translate} = useLocalize();
+    const [recentlyUsedCurrencies] = useOnyx(ONYXKEYS.RECENTLY_USED_CURRENCIES, {canBeMissing: true});
+    const styles = useThemeStyles();
+
+    const updateInput = (item: CurrencyListItem) => {
+        onInputChange?.(item.currencyCode);
+        hidePickerModal();
+    };
+
+    return (
+        <Modal
+            type={CONST.MODAL.MODAL_TYPE.RIGHT_DOCKED}
+            isVisible={isPickerVisible}
+            onClose={hidePickerModal}
+            onModalHide={hidePickerModal}
+            shouldEnableNewFocusManagement
+            onBackdropPress={Navigation.dismissModal}
+            shouldUseModalPaddingStyle={false}
+            shouldHandleNavigationBack
+            enableEdgeToEdgeBottomSafeAreaPadding
+        >
+            <ScreenWrapper
+                style={[styles.pb0]}
+                testID={IOURequestStepCurrencyModal.displayName}
+                shouldEnableMaxHeight
+                enableEdgeToEdgeBottomSafeAreaPadding
+            >
+                <HeaderWithBackButton
+                    title={headerText}
+                    shouldShowBackButton
+                    onBackButtonPress={hidePickerModal}
+                />
+                <CurrencySelectionList
+                    recentlyUsedCurrencies={recentlyUsedCurrencies ?? []}
+                    initiallySelectedCurrencyCode={value}
+                    onSelect={updateInput}
+                    searchInputLabel={translate('common.search')}
+                    excludedCurrencies={excludeCurrencies}
+                    addBottomSafeAreaPadding
+                />
+            </ScreenWrapper>
+        </Modal>
+    );
+}
+
+IOURequestStepCurrencyModal.displayName = 'IOURequestStepCurrencyModal';
+export default IOURequestStepCurrencyModal;
diff --git a/src/pages/iou/request/step/IOURequestStepTaxAmountPage.tsx b/src/pages/iou/request/step/IOURequestStepTaxAmountPage.tsx
index fb08838265f7..e6b79ce31170 100644
--- a/src/pages/iou/request/step/IOURequestStepTaxAmountPage.tsx
+++ b/src/pages/iou/request/step/IOURequestStepTaxAmountPage.tsx
@@ -8,7 +8,7 @@ import useOnyx from '@hooks/useOnyx';
 import usePermissions from '@hooks/usePermissions';
 import useRestartOnReceiptFailure from '@hooks/useRestartOnReceiptFailure';
 import {setDraftSplitTransaction, setMoneyRequestCurrency, setMoneyRequestParticipantsFromReport, setMoneyRequestTaxAmount, updateMoneyRequestTaxAmount} from '@libs/actions/IOU';
-import {convertToBackendAmount, isValidCurrencyCode} from '@libs/CurrencyUtils';
+import {convertToBackendAmount} from '@libs/CurrencyUtils';
 import Navigation from '@libs/Navigation/Navigation';
 import {getTransactionDetails} from '@libs/ReportUtils';
 import {calculateTaxAmount, getAmount, getDefaultTaxCode, getTaxValue, getTaxAmount as getTransactionTaxAmount} from '@libs/TransactionUtils';
@@ -46,7 +46,7 @@ function getTaxAmount(transaction: OnyxEntry<Transaction>, policy: OnyxEntry<Pol
 
 function IOURequestStepTaxAmountPage({
     route: {
-        params: {action, iouType, reportID, transactionID, backTo, currency: selectedCurrency = ''},
+        params: {action, iouType, reportID, transactionID, backTo},
     },
     transaction,
     report,
@@ -69,7 +69,7 @@ function IOURequestStepTaxAmountPage({
 
     const currentTransaction = isEditingSplitBill && !isEmptyObject(splitDraftTransaction) ? splitDraftTransaction : transaction;
     const transactionDetails = getTransactionDetails(currentTransaction);
-    const currency = isValidCurrencyCode(selectedCurrency) ? selectedCurrency : transactionDetails?.currency;
+    const currency = transactionDetails?.currency;
 
     useFocusEffect(
         useCallback(() => {
@@ -87,23 +87,6 @@ function IOURequestStepTaxAmountPage({
         Navigation.goBack(backTo);
     };
 
-    const navigateToCurrencySelectionPage = () => {
-        // If the expense being created is a distance expense, don't allow the user to choose the currency.
-        // Only USD is allowed for distance expenses.
-        // Remove query from the route and encode it.
-        Navigation.navigate(
-            ROUTES.MONEY_REQUEST_STEP_CURRENCY.getRoute(
-                CONST.IOU.ACTION.CREATE,
-                iouType,
-                transactionID,
-                reportID,
-                backTo ? 'confirm' : '',
-                currency,
-                Navigation.getActiveRouteWithoutParams(),
-            ),
-        );
-    };
-
     const updateTaxAmount = (currentAmount: CurrentMoney) => {
         const taxAmountInSmallestCurrencyUnits = convertToBackendAmount(Number.parseFloat(currentAmount.amount));
 
@@ -174,7 +157,8 @@ function IOURequestStepTaxAmountPage({
                 ref={(e) => {
                     textInput.current = e;
                 }}
-                onCurrencyButtonPress={navigateToCurrencySelectionPage}
+                // onCurrencyButtonPress is intentionally left empty as currency selection is not allowed on this page
+                onCurrencyButtonPress={() => {}}
                 onSubmitButtonPress={updateTaxAmount}
                 isCurrencyPressable={false}
                 chatReportID={reportID}
diff --git a/src/pages/iou/request/step/withFullTransactionOrNotFound.tsx b/src/pages/iou/request/step/withFullTransactionOrNotFound.tsx
index 23ed79a0900d..07a081ade89a 100644
--- a/src/pages/iou/request/step/withFullTransactionOrNotFound.tsx
+++ b/src/pages/iou/request/step/withFullTransactionOrNotFound.tsx
@@ -3,6 +3,7 @@ import type {ComponentType} from 'react';
 import React from 'react';
 import type {OnyxEntry} from 'react-native-onyx';
 import FullPageNotFoundView from '@components/BlockingViews/FullPageNotFoundView';
+import FullScreenLoadingIndicator from '@components/FullscreenLoadingIndicator';
 import useOnyx from '@hooks/useOnyx';
 import getComponentDisplayName from '@libs/getComponentDisplayName';
 import getNonEmptyStringOnyxID from '@libs/getNonEmptyStringOnyxID';
@@ -39,7 +40,6 @@ type MoneyRequestRouteName =
     | typeof SCREENS.MONEY_REQUEST.STEP_CATEGORY
     | typeof SCREENS.MONEY_REQUEST.STEP_TAX_RATE
     | typeof SCREENS.MONEY_REQUEST.STEP_SCAN
-    | typeof SCREENS.MONEY_REQUEST.STEP_CURRENCY
     | typeof SCREENS.MONEY_REQUEST.STEP_SEND_FROM
     | typeof SCREENS.MONEY_REQUEST.STEP_REPORT
     | typeof SCREENS.MONEY_REQUEST.STEP_COMPANY_INFO
@@ -57,6 +57,7 @@ type WithFullTransactionOrNotFoundProps<RouteName extends MoneyRequestRouteName>
 
 export default function <TProps extends WithFullTransactionOrNotFoundProps<MoneyRequestRouteName>>(
     WrappedComponent: ComponentType<TProps>,
+    shouldShowLoadingIndicator = false,
 ): React.ComponentType<Omit<TProps, keyof WithFullTransactionOrNotFoundOnyxProps>> {
     // eslint-disable-next-line rulesdir/no-negated-variables
     function WithFullTransactionOrNotFound(props: Omit<TProps, keyof WithFullTransactionOrNotFoundOnyxProps>) {
@@ -82,6 +83,10 @@ export default function <TProps extends WithFullTransactionOrNotFoundProps<Money
         if (!transactionID) {
             return <FullPageNotFoundView shouldShow={isFocused} />;
         }
+
+        if (isLoadingTransaction && shouldShowLoadingIndicator) {
+            return <FullScreenLoadingIndicator />;
+        }
         return (
             <WrappedComponent
                 // eslint-disable-next-line react/jsx-props-no-spreading
