diff --git a/src/CONST/index.ts b/src/CONST/index.ts
index df65c6ff5e6..cc17b6d0917 100644
--- a/src/CONST/index.ts
+++ b/src/CONST/index.ts
@@ -6300,7 +6300,6 @@ const CONST = {
         RECEIPT_TAB_ID: 'ReceiptTab',
         IOU_REQUEST_TYPE: 'iouRequestType',
         DISTANCE_REQUEST_TYPE: 'distanceRequestType',
-        DISTANCE_EDIT_TYPE: 'distanceEditType',
         SPLIT_EXPENSE_TAB_TYPE: 'splitExpenseTabType',
         SPLIT: {
             AMOUNT: 'amount',
diff --git a/src/components/ReportActionItem/ReportActionItemImage.tsx b/src/components/ReportActionItem/ReportActionItemImage.tsx
index fd11424ac00..400c0ab45e1 100644
--- a/src/components/ReportActionItem/ReportActionItemImage.tsx
+++ b/src/components/ReportActionItem/ReportActionItemImage.tsx
@@ -118,13 +118,7 @@ function ReportActionItemImage({
     const isMapDistanceRequest = !!transaction && isDistanceRequest(transaction) && !isManualDistanceRequest(transaction);
     const hasPendingWaypoints = transaction && isFetchingWaypointsFromServer(transaction);
     const hasErrors = !isEmptyObject(transaction?.errors) || !isEmptyObject(transaction?.errorFields?.route) || !isEmptyObject(transaction?.errorFields?.waypoints);
-    // After a distance/rate edit the BE regenerates the receipt and invalidates the prior URL, but
-    // the local `receipt.source` only refreshes when the Pusher push arrives. Render `ConfirmedRoute`
-    // (which draws the map from `routes.coordinates`, independent of the URL) while any of these
-    // edits are pending so the thumbnail doesn't briefly try to load the now-404'd URL.
-    const pf = transaction?.pendingFields as Record<string, unknown> | undefined;
-    const hasPendingReceiptRegeneration = !!pf && (!!pf.distance || !!pf.merchant || !!pf.customUnitRateID);
-    const showMapAsImage = isMapDistanceRequest && (hasErrors || !!hasPendingWaypoints || hasPendingReceiptRegeneration);
+    const showMapAsImage = isMapDistanceRequest && (hasErrors || hasPendingWaypoints);
 
     if (showMapAsImage) {
         return (
diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts
index c89843483ff..31350e1b53c 100644
--- a/src/libs/ReportUtils.ts
+++ b/src/libs/ReportUtils.ts
@@ -4589,6 +4589,7 @@ function getTransactionDetails(
     }
 
     const report = getReportOrDraftReport(transaction?.reportID, undefined, 'report' in transaction ? transaction.report : undefined);
+    const isManualDistanceRequest = isManualDistanceRequestTransactionUtils(transaction);
     const isFromExpenseReport = (!isEmptyObject(report) && isExpenseReport(report)) || isPaidGroupPolicyPolicyUtils(policy);
 
     return {
@@ -4615,7 +4616,7 @@ function getTransactionDetails(
         convertedAmount: getConvertedAmount(transaction, isFromExpenseReport, transaction?.reportID === CONST.REPORT.UNREPORTED_REPORT_ID, allowNegativeAmount, disableOppositeConversion),
         postedDate: getFormattedPostedDate(transaction),
         transactionID: transaction.transactionID,
-        ...(isDistanceRequest(transaction) && {distance: transaction.comment?.customUnit?.quantity ?? undefined}),
+        ...(isManualDistanceRequest && {distance: transaction.comment?.customUnit?.quantity ?? undefined}),
     };
 }
 
diff --git a/src/libs/TransactionUtils/getDistanceInMeters.ts b/src/libs/TransactionUtils/getDistanceInMeters.ts
index 3f4a611abe0..0efe72759d5 100644
--- a/src/libs/TransactionUtils/getDistanceInMeters.ts
+++ b/src/libs/TransactionUtils/getDistanceInMeters.ts
@@ -5,19 +5,16 @@ import type {Unit} from '@src/types/onyx/Policy';
 // Get the distance in meters from the transaction.
 // This function is placed in a separate file to avoid circular dependencies.
 function getDistanceInMeters(transaction: OnyxInputOrEntry<Transaction>, unit: Unit | undefined) {
-    // If the request is completed, transaction.routes is cleared and comment.customUnit.quantity holds the new distance in the selected unit.
-    // We need to convert it from the selected distance unit to meters.
-    // This check takes priority because after a manual distance edit, routes.route0.distance may still
-    // hold a stale route-calculated value while quantity reflects the user's intended distance.
-    if (transaction?.comment?.customUnit?.quantity && unit) {
-        return DistanceRequestUtils.convertToDistanceInMeters(transaction.comment.customUnit.quantity, unit);
-    }
-
     // If we are creating a new distance request, the distance is available in routes.route0.distance and it's already in meters.
     if (transaction?.routes?.route0?.distance) {
         return transaction.routes.route0.distance;
     }
 
+    // If the request is completed, transaction.routes is cleared and comment.customUnit.quantity holds the new distance in the selected unit.
+    // We need to convert it from the selected distance unit to meters.
+    if (transaction?.comment?.customUnit?.quantity && unit) {
+        return DistanceRequestUtils.convertToDistanceInMeters(transaction.comment.customUnit.quantity, unit);
+    }
     return 0;
 }
 
diff --git a/src/libs/TransactionUtils/index.ts b/src/libs/TransactionUtils/index.ts
index 9999947aa37..b22e0e377f4 100644
--- a/src/libs/TransactionUtils/index.ts
+++ b/src/libs/TransactionUtils/index.ts
@@ -191,17 +191,6 @@ function hasGPSWaypoints(transaction: OnyxEntry<Transaction>) {
     return !!waypoint?.keyForList?.startsWith('gps');
 }
 
-/**
- * Compare two waypoint collections by their addresses only (ignoring coordinates/names), which is
- * the meaningful signal for "did the user change the route?". Numeric fields like lat/lng can drift
- * due to rounding in transaction backups, so they're excluded.
- */
-function haveWaypointAddressesChanged(oldWaypoints: WaypointCollection | undefined, newWaypoints: WaypointCollection | undefined): boolean {
-    const toAddresses = (collection: WaypointCollection | undefined) =>
-        Object.fromEntries(Object.entries(collection ?? {}).map(([key, waypoint]) => [key, waypoint && 'address' in waypoint ? waypoint.address : undefined]));
-    return !deepEqual(toAddresses(oldWaypoints), toAddresses(newWaypoints));
-}
-
 function isMapDistanceRequest(transaction: OnyxEntry<Transaction>): boolean {
     // This is used during the expense creation flow before the transaction has been saved to the server
     if (transaction && Object.hasOwn(transaction, 'iouRequestType')) {
@@ -730,22 +719,16 @@ function getUpdatedTransaction({
         }
         shouldStopSmartscan = true;
 
-        // A manual-distance edit re-sends unchanged waypoints; when they truly didn't change, leave
-        // `amount`/`modifiedAmount` to the sibling `distance` branch instead of zeroing them here.
-        const waypointsActuallyChanged = !deepEqual(transactionChanges.waypoints, transaction?.comment?.waypoints);
-
-        if (waypointsActuallyChanged && !transactionChanges.routes?.route0?.geometry?.coordinates) {
+        if (!transactionChanges.routes?.route0?.geometry?.coordinates) {
             // The waypoints were changed, but there is no route – it is pending from the BE and we should mark the fields as pending
             updatedTransaction.amount = CONST.IOU.DEFAULT_AMOUNT;
             updatedTransaction.modifiedAmount = CONST.IOU.DEFAULT_AMOUNT;
             updatedTransaction.modifiedMerchant = translateLocal('iou.fieldPending');
-        } else if (transactionChanges.routes?.route0?.geometry?.coordinates) {
+        } else {
             const mileageRate = DistanceRequestUtils.getRate({transaction: updatedTransaction, policy});
             const {unit, rate} = mileageRate;
 
-            // Use route distance directly since waypoints changed and the route was recalculated.
-            // getDistanceInMeters prefers quantity which may hold a stale manually-edited value.
-            const distanceInMeters = transactionChanges.routes?.route0?.distance ?? getDistanceInMeters(transaction, unit);
+            const distanceInMeters = getDistanceInMeters(transaction, unit);
             const amount = DistanceRequestUtils.getDistanceRequestAmount(distanceInMeters, unit, rate ?? 0);
             const updatedAmount = isFromExpenseReport || isUnReportedExpense ? -amount : amount;
             const updatedMerchant = DistanceRequestUtils.getDistanceMerchant(
@@ -763,13 +746,6 @@ function getUpdatedTransaction({
             updatedTransaction.amount = updatedAmount;
             updatedTransaction.modifiedAmount = updatedAmount;
             updatedTransaction.modifiedMerchant = updatedMerchant;
-
-            // Sync `customUnit.quantity` to the new route distance. Without this the prior manual
-            // quantity (set when the user edited distance manually before changing waypoints) would
-            // linger and drive `getDistanceInMeters`, since that helper prefers quantity over routes.
-            if (unit) {
-                lodashSet(updatedTransaction, 'comment.customUnit.quantity', roundToTwoDecimalPlaces(DistanceRequestUtils.convertDistanceUnit(distanceInMeters, unit)));
-            }
         }
     }
 
@@ -885,11 +861,8 @@ function getUpdatedTransaction({
 
     if (Object.hasOwn(transactionChanges, 'distance') && typeof transactionChanges.distance === 'number') {
         const distance = roundToTwoDecimalPlaces(transactionChanges.distance ?? 0);
-        // Capture before mutating quantity below; needed by the fallback amount computation.
-        const previousDistanceInMeters = getDistanceInMeters(transaction, transaction?.comment?.customUnit?.distanceUnit);
 
         lodashSet(updatedTransaction, 'comment.customUnit.quantity', distance);
-        lodashSet(updatedTransaction, 'routes.route0.distance', null);
         shouldStopSmartscan = true;
 
         const updatedMileageRate = DistanceRequestUtils.getRate({transaction: updatedTransaction, policy, useTransactionDistanceUnit: false});
@@ -911,20 +884,9 @@ function getUpdatedTransaction({
             isManualDistanceRequest(transaction),
         );
 
-        // No locally resolvable rate (e.g. track expense without policy loaded) → scale the previous
-        // amount by the distance ratio so the optimistic value isn't 0. `modifiedAmount` is `""` for
-        // unedited transactions, so coerce via Number() and fall through to `amount`.
-        const previousAmount = Number(transaction?.modifiedAmount) || transaction?.amount || 0;
-        const useFallback = !rate && !!previousDistanceInMeters && !!previousAmount && !!distanceInMeters;
-        if (useFallback) {
-            updatedTransaction.modifiedAmount = Math.round(previousAmount * (distanceInMeters / previousDistanceInMeters));
-            updatedTransaction.modifiedMerchant = updatedMerchant;
-            // Leave currency alone — without a resolvable rate we don't know the target currency.
-        } else {
-            updatedTransaction.modifiedAmount = amount;
-            updatedTransaction.modifiedMerchant = updatedMerchant;
-            updatedTransaction.modifiedCurrency = updatedCurrency;
-        }
+        updatedTransaction.modifiedAmount = amount;
+        updatedTransaction.modifiedMerchant = updatedMerchant;
+        updatedTransaction.modifiedCurrency = updatedCurrency;
     }
 
     if (Object.hasOwn(transactionChanges, 'odometerStart') && typeof transactionChanges.odometerStart === 'number') {
@@ -2919,7 +2881,6 @@ export {
     isReceiptBeingScanned,
     didReceiptScanSucceed,
     getValidWaypoints,
-    haveWaypointAddressesChanged,
     isDistanceRequest,
     isMapDistanceRequest,
     isGPSDistanceRequest,
diff --git a/src/libs/actions/IOU/UpdateMoneyRequest.ts b/src/libs/actions/IOU/UpdateMoneyRequest.ts
index ee1b1b07712..8d2e095b19d 100644
--- a/src/libs/actions/IOU/UpdateMoneyRequest.ts
+++ b/src/libs/actions/IOU/UpdateMoneyRequest.ts
@@ -28,7 +28,6 @@ import {
     getClearedPendingFields,
     getMerchant,
     getUpdatedTransaction,
-    haveWaypointAddressesChanged,
     isDistanceRequest as isDistanceRequestTransactionUtils,
     isFetchingWaypointsFromServer,
     isOnHold,
@@ -523,10 +522,7 @@ function updateMoneyRequestDistance({
         // Don't sanitize waypoints here - keep all fields for Onyx optimistic data (e.g., keyForList)
         // Sanitization happens when building API params
         ...(waypoints && {waypoints}),
-        // Only include routes when the caller explicitly provided them. Including `routes: undefined`
-        // would make the optimistic merge wipe the existing route, briefly blanking the map thumbnail
-        // and report preview before the server response restores it.
-        ...(routes !== undefined && {routes}),
+        routes,
         ...(distance && {distance}),
         ...(odometerStart !== undefined && {odometerStart}),
         ...(odometerEnd !== undefined && {odometerEnd}),
@@ -971,46 +967,20 @@ function getUpdateMoneyRequestParams(params: GetUpdateMoneyRequestParamsType): U
         >
     > = [];
 
-    // Step 1: Get the transaction being updated
-    const transaction = getAllTransactions()?.[`${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`];
-
-    // The manual-distance submit path always sends waypoints to keep the BE in sync, even when the user
-    // only edited the distance number. Detect whether the addresses actually changed so we can skip the
-    // optimistic side effects (pending field, route clearing, render-path swap to interactive map) that
-    // would otherwise make the parent map briefly disappear on a pure distance edit.
-    const hasWaypointAddressesChanged = 'waypoints' in transactionChanges && haveWaypointAddressesChanged(transaction?.comment?.waypoints, transactionChanges.waypoints);
-    const shouldSuppressWaypointsAsPending = 'waypoints' in transactionChanges && !hasWaypointAddressesChanged;
-
-    // Step 2: Set any "pending fields" (ones updated while the user was offline) to have error messages in the failureData
-    const pendingFields: OnyxTypes.Transaction['pendingFields'] = Object.fromEntries(
-        Object.keys(transactionChanges)
-            .filter((key) => !(shouldSuppressWaypointsAsPending && key === 'waypoints'))
-            .map((key) => [key, CONST.RED_BRICK_ROAD_PENDING_ACTION.UPDATE]),
-    );
-    // Flag `merchant` as pending on any edit that causes the BE to regenerate the receipt
-    // (waypoints / distance / rate). `merchant` isn't in `transactionChanges`, so the success-data
-    // merge won't clear it via `clearedPendingFields` — it persists through the gap between API ack
-    // and the Pusher push that delivers the new `receipt.source`. The Pusher push then clears all
-    // pendingFields atomically together with the new URL, eliminating the broken-image flash.
-    // It also drives the Distance row's offline-feedback strikethrough for pure distance edits.
-    if ('waypoints' in transactionChanges || 'distance' in transactionChanges || 'customUnitRateID' in transactionChanges) {
-        pendingFields.merchant = CONST.RED_BRICK_ROAD_PENDING_ACTION.UPDATE;
-    }
+    // Step 1: Set any "pending fields" (ones updated while the user was offline) to have error messages in the failureData
+    const pendingFields: OnyxTypes.Transaction['pendingFields'] = Object.fromEntries(Object.keys(transactionChanges).map((key) => [key, CONST.RED_BRICK_ROAD_PENDING_ACTION.UPDATE]));
     const clearedPendingFields = getClearedPendingFields(transactionChanges);
     const errorFields = Object.fromEntries(Object.keys(pendingFields).map((key) => [key, getMicroSecondOnyxErrorWithTranslationKey('iou.error.genericEditFailureMessage')]));
 
+    // Step 2: Get all the collections being updated
+    const transaction = getAllTransactions()?.[`${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`];
+
     const isTransactionOnHold = isOnHold(transaction);
     const isFromExpenseReport = isExpenseReport(iouReport) || isInvoiceReportReportUtils(iouReport);
-    // Drop the waypoints from the changes fed to getUpdatedTransaction when they didn't actually change,
-    // so we skip the waypoints branch that flips isLoading and clobbers amount/merchant before being
-    // re-overridden by the distance branch.
-    const transactionChangesForOptimisticMerge: TransactionChanges = shouldSuppressWaypointsAsPending
-        ? Object.fromEntries(Object.entries(transactionChanges).filter(([key]) => key !== 'waypoints'))
-        : transactionChanges;
     const updatedTransaction: OnyxEntry<OnyxTypes.Transaction> = transaction
         ? getUpdatedTransaction({
               transaction,
-              transactionChanges: transactionChangesForOptimisticMerge,
+              transactionChanges,
               isFromExpenseReport,
               isSplitTransaction,
               policy,
@@ -1025,12 +995,6 @@ function getUpdateMoneyRequestParams(params: GetUpdateMoneyRequestParamsType): U
 
     const dataToIncludeInParams: Partial<TransactionDetails> = Object.fromEntries(Object.entries(transactionDetails ?? {}).filter(([key]) => key in transactionChanges));
 
-    // Preserve the caller's full-precision distance so the server doesn't fire `increasedDistance`
-    // when the rounded display value drifts above the exact route distance.
-    if ('distance' in transactionChanges && typeof transactionChanges.distance === 'number') {
-        dataToIncludeInParams.distance = transactionChanges.distance;
-    }
-
     const apiParams: UpdateMoneyRequestParams = {
         ...dataToIncludeInParams,
         reportID: iouReport?.reportID,
@@ -1045,9 +1009,6 @@ function getUpdateMoneyRequestParams(params: GetUpdateMoneyRequestParamsType): U
     // For split transactions, the merchant and amount are already computed in transactionChanges,
     // so we can build a valid optimistic MODIFIED_EXPENSE even when waypoints are pending.
     const hasSplitDistanceMessageFields = !!isSplitTransaction && hasModifiedMerchant && hasModifiedAmount;
-    // When distance is provided alongside waypoints (route was already calculated), we have valid
-    // merchant/amount data to build the optimistic report action instead of waiting for the server.
-    const hasDistanceWithWaypoints = hasPendingWaypoints && 'distance' in transactionChanges;
     if (transaction && updatedTransaction && (hasPendingWaypoints || hasModifiedDistanceRate)) {
         // Delete the draft transaction when editing waypoints when the server responds successfully and there are no errors
         successData.push({
@@ -1083,11 +1044,7 @@ function getUpdateMoneyRequestParams(params: GetUpdateMoneyRequestParamsType): U
     const updatedReportAction = shouldBuildOptimisticModifiedExpenseReportAction
         ? buildOptimisticModifiedExpenseReportAction(transactionThreadReport, transaction, transactionChanges, isFromExpenseReport, policy, updatedTransaction, allowNegative)
         : null;
-    if (
-        (!hasPendingWaypoints || hasSplitDistanceMessageFields || hasDistanceWithWaypoints) &&
-        !(hasModifiedDistanceRate && isFetchingWaypointsFromServer(transaction)) &&
-        updatedReportAction
-    ) {
+    if ((!hasPendingWaypoints || hasSplitDistanceMessageFields) && !(hasModifiedDistanceRate && isFetchingWaypointsFromServer(transaction)) && updatedReportAction) {
         apiParams.reportActionID = updatedReportAction.reportActionID;
 
         optimisticData.push({
@@ -1299,14 +1256,7 @@ function getUpdateMoneyRequestParams(params: GetUpdateMoneyRequestParamsType): U
         apiParams.attendees = JSON.stringify(apiParams?.attendees);
     }
 
-    // Clear out the error fields and loading states on success.
-    // Only clear `routes` when waypoints/rate changed (the server will push a fresh route via Pusher).
-    // For pure distance edits the route is unchanged, and clearing it would make the map briefly disappear.
-    // When the caller already supplied a valid optimistic route (waypoint edit with route pre-fetched
-    // locally), keep it so the receipt thumbnail and ConfirmedRoute don't flicker between success and
-    // the Pusher route push.
-    const hasValidOptimisticRoute = !!transactionChanges.routes?.route0?.geometry?.coordinates?.length;
-    const shouldClearRoutes = (hasWaypointAddressesChanged || hasModifiedDistanceRate) && !hasValidOptimisticRoute;
+    // Clear out the error fields and loading states on success
     successData.push({
         onyxMethod: Onyx.METHOD.MERGE,
         key: `${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`,
@@ -1314,7 +1264,7 @@ function getUpdateMoneyRequestParams(params: GetUpdateMoneyRequestParamsType): U
             pendingFields: clearedPendingFields,
             isLoading: false,
             errorFields: null,
-            ...(shouldClearRoutes && {routes: null}),
+            routes: null,
         },
     });
 
@@ -1383,13 +1333,9 @@ function getUpdateMoneyRequestParams(params: GetUpdateMoneyRequestParamsType): U
         if (hasPendingWaypoints) {
             optimisticViolations = optimisticViolations.filter((violation) => violation.name !== CONST.VIOLATIONS.NO_ROUTE);
         }
-        if (hasModifiedDistanceRate || hasModifiedDistance || hasPendingWaypoints) {
-            // Clear stale distance-related violations while the server reprocesses.
-            // The server will re-evaluate and re-add any that legitimately apply.
+        if (hasModifiedDistanceRate || hasModifiedDistance) {
             optimisticViolations = optimisticViolations.filter(
-                (violation) =>
-                    !(violation.name === CONST.VIOLATIONS.MODIFIED_AMOUNT && violation.data?.type === CONST.MODIFIED_AMOUNT_VIOLATION_DATA.DISTANCE) &&
-                    violation.name !== CONST.VIOLATIONS.INCREASED_DISTANCE,
+                (violation) => !(violation.name === CONST.VIOLATIONS.MODIFIED_AMOUNT && violation.data?.type === CONST.MODIFIED_AMOUNT_VIOLATION_DATA.DISTANCE),
             );
         }
 
diff --git a/src/libs/actions/TransactionEdit.ts b/src/libs/actions/TransactionEdit.ts
index 19dd5b73d73..5bab719698c 100644
--- a/src/libs/actions/TransactionEdit.ts
+++ b/src/libs/actions/TransactionEdit.ts
@@ -39,9 +39,7 @@ function createBackupTransaction(transaction: OnyxEntry<Transaction>, isDraft: b
         key: `${ONYXKEYS.COLLECTION.TRANSACTION_BACKUP}${transaction.transactionID}`,
         callback: (transactionBackup) => {
             Onyx.disconnect(conn);
-            // Treat a backup missing `transactionID` as corrupted (a partial route-fetch shape can
-            // leak in via Pusher) and overwrite it instead of restoring from it.
-            if (transactionBackup?.transactionID) {
+            if (transactionBackup) {
                 // If the transactionBackup exists it means we haven't properly restored original value on unmount
                 // such as on page refresh, so we will just restore the transaction from the transactionBackup here.
                 Onyx.set(`${isDraft ? ONYXKEYS.COLLECTION.TRANSACTION_DRAFT : ONYXKEYS.COLLECTION.TRANSACTION}${transaction.transactionID}`, transactionBackup);
diff --git a/src/pages/iou/request/step/DistanceManualTabContent.tsx b/src/pages/iou/request/step/DistanceManualTabContent.tsx
deleted file mode 100644
index 64c95c67bd4..00000000000
--- a/src/pages/iou/request/step/DistanceManualTabContent.tsx
+++ /dev/null
@@ -1,76 +0,0 @@
-import React from 'react';
-import type {TextInput} from 'react-native';
-import Button from '@components/Button';
-import NumberWithSymbolForm from '@components/NumberWithSymbolForm';
-import type {NumberWithSymbolFormRef} from '@components/NumberWithSymbolForm';
-import type {BaseTextInputRef} from '@components/TextInput/BaseTextInput/types';
-import useAutoFocusInput from '@hooks/useAutoFocusInput';
-import useLocalize from '@hooks/useLocalize';
-import useResponsiveLayout from '@hooks/useResponsiveLayout';
-import useThemeStyles from '@hooks/useThemeStyles';
-import {canUseTouchScreen} from '@libs/DeviceCapabilities';
-import variables from '@styles/variables';
-import CONST from '@src/CONST';
-import type {Unit} from '@src/types/onyx/Policy';
-
-type DistanceManualTabContentProps = {
-    currentDistance: number | undefined;
-    distanceUnit: Unit;
-    onSubmit: () => void;
-    manualFormError: string;
-    onInputChange: () => void;
-    manualTextInputRef: React.RefObject<BaseTextInputRef | null>;
-    manualNumberFormRef: React.RefObject<NumberWithSymbolFormRef | null>;
-};
-
-function DistanceManualTabContent({currentDistance, distanceUnit, onSubmit, manualFormError, onInputChange, manualTextInputRef, manualNumberFormRef}: DistanceManualTabContentProps) {
-    const styles = useThemeStyles();
-    const {translate} = useLocalize();
-    const {isExtraSmallScreenHeight} = useResponsiveLayout();
-    const {inputCallbackRef} = useAutoFocusInput();
-
-    const setInputRef = (ref: BaseTextInputRef | null) => {
-        // eslint-disable-next-line no-param-reassign
-        manualTextInputRef.current = ref;
-        inputCallbackRef(ref as unknown as TextInput | null);
-    };
-
-    return (
-        <NumberWithSymbolForm
-            ref={setInputRef}
-            numberFormRef={manualNumberFormRef}
-            value={currentDistance?.toString()}
-            shouldUseDynamicFontSize
-            onInputChange={onInputChange}
-            decimals={CONST.DISTANCE_DECIMAL_PLACES}
-            symbol={distanceUnit}
-            symbolPosition={CONST.TEXT_INPUT_SYMBOL_POSITION.SUFFIX}
-            isSymbolPressable={false}
-            symbolTextStyle={styles.textSupporting}
-            style={styles.iouAmountTextInput}
-            containerStyle={styles.iouAmountTextInputContainer}
-            autoGrowExtraSpace={variables.w80}
-            touchableInputWrapperStyle={styles.heightUndefined}
-            errorText={manualFormError}
-            accessibilityLabel={`${translate('common.distance')} (${translate(`common.${distanceUnit}`)})`}
-            footer={
-                <Button
-                    success
-                    allowBubble={false}
-                    pressOnEnter
-                    medium={isExtraSmallScreenHeight}
-                    large={!isExtraSmallScreenHeight}
-                    style={[styles.w100, canUseTouchScreen() ? styles.mt5 : styles.mt0]}
-                    onPress={onSubmit}
-                    text={translate('common.save')}
-                    testID="next-button"
-                    sentryLabel={CONST.SENTRY_LABEL.IOU_REQUEST_STEP.DISTANCE_MANUAL_NEXT_BUTTON}
-                />
-            }
-        />
-    );
-}
-
-DistanceManualTabContent.displayName = 'DistanceManualTabContent';
-
-export default DistanceManualTabContent;
diff --git a/src/pages/iou/request/step/DistanceMapTabContent.tsx b/src/pages/iou/request/step/DistanceMapTabContent.tsx
deleted file mode 100644
index 3a32c5861dc..00000000000
--- a/src/pages/iou/request/step/DistanceMapTabContent.tsx
+++ /dev/null
@@ -1,131 +0,0 @@
-import React from 'react';
-import {View} from 'react-native';
-// eslint-disable-next-line no-restricted-imports
-import type {ScrollView as RNScrollView} from 'react-native';
-import type {RenderItemParams} from 'react-native-draggable-flatlist/lib/typescript/types';
-import type {OnyxEntry} from 'react-native-onyx';
-import Button from '@components/Button';
-import DistanceRequestFooter from '@components/DistanceRequest/DistanceRequestFooter';
-import DotIndicatorMessage from '@components/DotIndicatorMessage';
-import DraggableList from '@components/DraggableList';
-import useIsInLandscapeMode from '@hooks/useIsInLandscapeMode';
-import useThemeStyles from '@hooks/useThemeStyles';
-import CONST from '@src/CONST';
-import type {Policy} from '@src/types/onyx';
-import type {Errors} from '@src/types/onyx/OnyxCommon';
-import type Transaction from '@src/types/onyx/Transaction';
-import type {WaypointCollection} from '@src/types/onyx/Transaction';
-
-type ErrorState = {
-    shouldShowAtLeastTwoDifferentWaypointsError: boolean;
-    atLeastTwoDifferentWaypointsError: boolean;
-    duplicateWaypointsError: boolean;
-    hasRouteError: boolean;
-    getError: () => Errors;
-};
-
-type LoadingState = {
-    isOffline: boolean;
-    isLoadingRoute: boolean;
-    shouldFetchRoute: boolean;
-    isLoading: boolean;
-};
-
-type DistanceMapTabContentProps = {
-    waypointItems: string[];
-    waypoints: WaypointCollection;
-    extractKey: (key: string) => string;
-    updateWaypoints: (data: {data: string[]}) => void;
-    scrollViewRef: React.RefObject<RNScrollView | null>;
-    renderItem: (params: RenderItemParams<string>) => React.JSX.Element;
-    navigateToWaypointEditPage: (index: number) => void;
-    transaction: OnyxEntry<Transaction>;
-    policy: OnyxEntry<Policy>;
-    submitWaypoints: () => void;
-    buttonText: string;
-    errorState: ErrorState;
-    loadingState: LoadingState;
-};
-
-function DistanceMapTabContent({
-    waypointItems,
-    waypoints,
-    extractKey,
-    updateWaypoints,
-    scrollViewRef,
-    renderItem,
-    navigateToWaypointEditPage,
-    transaction,
-    policy,
-    submitWaypoints,
-    buttonText,
-    errorState,
-    loadingState,
-}: DistanceMapTabContentProps) {
-    const styles = useThemeStyles();
-    const isInLandscapeMode = useIsInLandscapeMode();
-
-    const {shouldShowAtLeastTwoDifferentWaypointsError, atLeastTwoDifferentWaypointsError, duplicateWaypointsError, hasRouteError, getError} = errorState;
-    const {isOffline, isLoadingRoute, shouldFetchRoute, isLoading} = loadingState;
-    const hasError = (shouldShowAtLeastTwoDifferentWaypointsError && atLeastTwoDifferentWaypointsError) || duplicateWaypointsError || hasRouteError;
-
-    return (
-        <View style={[styles.flex1, isInLandscapeMode && styles.flexRow]}>
-            {isInLandscapeMode && (
-                <View style={styles.flex1}>
-                    <DistanceRequestFooter
-                        waypoints={waypoints}
-                        navigateToWaypointEditPage={navigateToWaypointEditPage}
-                        transaction={transaction}
-                        policy={policy}
-                        mapContainerStyle={{minHeight: undefined}}
-                    />
-                </View>
-            )}
-            <View style={[styles.flex1, isInLandscapeMode && styles.pl2]}>
-                <DraggableList
-                    data={waypointItems}
-                    keyExtractor={extractKey}
-                    onDragEnd={updateWaypoints}
-                    ref={scrollViewRef}
-                    renderItem={renderItem}
-                    ListFooterComponent={
-                        !isInLandscapeMode ? (
-                            <DistanceRequestFooter
-                                waypoints={waypoints}
-                                navigateToWaypointEditPage={navigateToWaypointEditPage}
-                                transaction={transaction}
-                                policy={policy}
-                            />
-                        ) : undefined
-                    }
-                />
-                <View style={[styles.w100, styles.pt2]}>
-                    {/* Show error message if there is route error or there are less than 2 routes and user has tried submitting */}
-                    {hasError && (
-                        <DotIndicatorMessage
-                            style={[styles.mh4, styles.mv3]}
-                            messages={getError()}
-                            type="error"
-                        />
-                    )}
-                    <Button
-                        success
-                        allowBubble
-                        pressOnEnter
-                        large
-                        style={[styles.w100, styles.mb5, styles.ph5, styles.flexShrink0]}
-                        onPress={submitWaypoints}
-                        text={buttonText}
-                        isLoading={!isOffline && (isLoadingRoute || shouldFetchRoute || isLoading)}
-                        sentryLabel={CONST.SENTRY_LABEL.IOU_REQUEST_STEP.DISTANCE_MAP_NEXT_BUTTON}
-                    />
-                </View>
-            </View>
-        </View>
-    );
-}
-
-DistanceMapTabContent.displayName = 'DistanceMapTabContent';
-
-export default DistanceMapTabContent;
diff --git a/src/pages/iou/request/step/IOURequestStepDistance.tsx b/src/pages/iou/request/step/IOURequestStepDistance.tsx
index 4f4fdf3d30d..8c37a0f0cac 100644
--- a/src/pages/iou/request/step/IOURequestStepDistance.tsx
+++ b/src/pages/iou/request/step/IOURequestStepDistance.tsx
@@ -1,18 +1,21 @@
 import {deepEqual} from 'fast-equals';
 import isEmpty from 'lodash/isEmpty';
 import React, {useCallback, useEffect, useMemo, useRef, useState} from 'react';
+import {View} from 'react-native';
 // eslint-disable-next-line no-restricted-imports
 import type {ScrollView as RNScrollView} from 'react-native';
 import type {RenderItemParams} from 'react-native-draggable-flatlist/lib/typescript/types';
 import type {OnyxEntry} from 'react-native-onyx';
+import Button from '@components/Button';
+import DistanceRequestFooter from '@components/DistanceRequest/DistanceRequestFooter';
 import DistanceRequestRenderItem from '@components/DistanceRequest/DistanceRequestRenderItem';
-import type {NumberWithSymbolFormRef} from '@components/NumberWithSymbolForm';
-import TabSelector from '@components/TabSelector/TabSelector';
-import type {BaseTextInputRef} from '@components/TextInput/BaseTextInput/types';
+import DotIndicatorMessage from '@components/DotIndicatorMessage';
+import DraggableList from '@components/DraggableList';
 import withCurrentUserPersonalDetails from '@components/withCurrentUserPersonalDetails';
 import type {WithCurrentUserPersonalDetailsProps} from '@components/withCurrentUserPersonalDetails';
 import useDefaultExpensePolicy from '@hooks/useDefaultExpensePolicy';
 import useFetchRoute from '@hooks/useFetchRoute';
+import useIsInLandscapeMode from '@hooks/useIsInLandscapeMode';
 import useLocalize from '@hooks/useLocalize';
 import useNetwork from '@hooks/useNetwork';
 import useOnyx from '@hooks/useOnyx';
@@ -25,8 +28,9 @@ import useReportAttributes from '@hooks/useReportAttributes';
 import useReportIsArchived from '@hooks/useReportIsArchived';
 import useSelfDMReport from '@hooks/useSelfDMReport';
 import useShowNotFoundPageInIOUStep from '@hooks/useShowNotFoundPageInIOUStep';
+import useThemeStyles from '@hooks/useThemeStyles';
 import useWaypointItems from '@hooks/useWaypointItems';
-import {setMoneyRequestAmount, setMoneyRequestDistance} from '@libs/actions/IOU';
+import {setMoneyRequestAmount} from '@libs/actions/IOU';
 import {handleMoneyRequestStepDistanceNavigation} from '@libs/actions/IOU/MoneyRequest';
 import {setDraftSplitTransaction, setSplitShares} from '@libs/actions/IOU/Split';
 import {updateMoneyRequestDistance} from '@libs/actions/IOU/UpdateMoneyRequest';
@@ -40,10 +44,8 @@ import {getLatestErrorField} from '@libs/ErrorUtils';
 import getNonEmptyStringOnyxID from '@libs/getNonEmptyStringOnyxID';
 import {shouldUseTransactionDraft} from '@libs/IOUUtils';
 import Navigation from '@libs/Navigation/Navigation';
-import OnyxTabNavigator, {TabScreenWithFocusTrapWrapper, TopTab} from '@libs/Navigation/OnyxTabNavigator';
-import {roundToTwoDecimalPlaces} from '@libs/NumberUtils';
 import {isPolicyExpenseChat as isPolicyExpenseChatUtil} from '@libs/ReportUtils';
-import {getDistanceInMeters, getRateID, getRequestType, hasRoute, haveWaypointAddressesChanged, isCustomUnitRateIDForP2P, isWaypointNullIsland} from '@libs/TransactionUtils';
+import {getDistanceInMeters, getRateID, getRequestType, hasRoute, isCustomUnitRateIDForP2P, isWaypointNullIsland} from '@libs/TransactionUtils';
 import CONST from '@src/CONST';
 import type {IOUType} from '@src/CONST';
 import ONYXKEYS from '@src/ONYXKEYS';
@@ -57,8 +59,6 @@ import type {Waypoint, WaypointCollection} from '@src/types/onyx/Transaction';
 import type Transaction from '@src/types/onyx/Transaction';
 import {isEmptyObject} from '@src/types/utils/EmptyObject';
 import type TransactionStateType from '@src/types/utils/TransactionStateType';
-import DistanceManualTabContent from './DistanceManualTabContent';
-import DistanceMapTabContent from './DistanceMapTabContent';
 import StepScreenWrapper from './StepScreenWrapper';
 import withFullTransactionOrNotFound from './withFullTransactionOrNotFound';
 import type {WithWritableReportOrNotFoundProps} from './withWritableReportOrNotFound';
@@ -78,6 +78,8 @@ function IOURequestStepDistance({
     transaction,
     currentUserPersonalDetails,
 }: IOURequestStepDistanceProps) {
+    const styles = useThemeStyles();
+    const isInLandscapeMode = useIsInLandscapeMode();
     const {isOffline} = useNetwork();
     const {translate} = useLocalize();
     const {isBetaEnabled} = usePermissions();
@@ -179,48 +181,6 @@ function IOURequestStepDistance({
 
     const isASAPSubmitBetaEnabled = isBetaEnabled(CONST.BETAS.ASAP_SUBMIT);
 
-    // Manual distance editing state
-    const manualNumberFormRef = useRef<NumberWithSymbolFormRef | null>(null);
-    const manualTextInputRef = useRef<BaseTextInputRef | null>(null);
-    const [manualFormError, setManualFormError] = useState<string>('');
-
-    const mileageRate = DistanceRequestUtils.getRate({
-        transaction: currentTransaction,
-        policy,
-        useTransactionDistanceUnit: false,
-    });
-    const distanceUnit = mileageRate.unit;
-    const distanceRate = mileageRate.rate ?? 0;
-    const currentTransactionDistanceUnit = currentTransaction?.comment?.customUnit?.distanceUnit;
-    const distanceInMeters = getDistanceInMeters(currentTransaction, currentTransactionDistanceUnit ?? distanceUnit);
-    const currentDistance = useMemo(
-        () => (distanceInMeters > 0 ? roundToTwoDecimalPlaces(DistanceRequestUtils.convertDistanceUnit(distanceInMeters, distanceUnit)) : undefined),
-        [distanceInMeters, distanceUnit],
-    );
-
-    // Track whether the user has started editing on the manual tab to prevent route updates
-    // from overwriting in-progress manual input.
-    const isManuallyEditing = useRef(false);
-
-    // Push the route distance into the manual tab input only on a real waypoint-driven recalculation
-    // (a non-null → different non-null transition). Skip the initial null → value transition, which
-    // is the post-save re-fetch, so we don't overwrite a saved manual quantity with the route distance.
-    const routeDistance = currentTransaction?.routes?.route0?.distance;
-    const lastSyncedRouteDistance = useRef<number | null | undefined>(routeDistance);
-    useEffect(() => {
-        if (routeDistance == null || !distanceUnit || isManuallyEditing.current) {
-            lastSyncedRouteDistance.current = routeDistance;
-            return;
-        }
-        if (lastSyncedRouteDistance.current == null || lastSyncedRouteDistance.current === routeDistance) {
-            lastSyncedRouteDistance.current = routeDistance;
-            return;
-        }
-        const routeDistanceInUnit = roundToTwoDecimalPlaces(DistanceRequestUtils.convertDistanceUnit(routeDistance, distanceUnit));
-        manualNumberFormRef.current?.updateNumber(routeDistanceInUnit.toString());
-        lastSyncedRouteDistance.current = routeDistance;
-    }, [routeDistance, distanceUnit]);
-
     // Sets `amount` and `split` share data before moving to the next step to avoid briefly showing `0.00` as the split share for participants
     const setDistanceRequestData = useCallback(
         (participants: Participant[]) => {
@@ -228,15 +188,15 @@ function IOURequestStepDistance({
             const isPolicyExpenseChat = participants?.some((participant) => participant.isPolicyExpenseChat);
             const policyCurrency = policy?.outputCurrency ?? personalPolicy?.outputCurrency ?? CONST.CURRENCY.USD;
 
-            const policyMileageRates = DistanceRequestUtils.getMileageRates(policy);
+            const mileageRates = DistanceRequestUtils.getMileageRates(policy);
             const defaultMileageRate = DistanceRequestUtils.getDefaultMileageRate(policy);
-            const selectedMileageRate: MileageRate | undefined = isCustomUnitRateIDForP2P(transaction)
+            const mileageRate: MileageRate | undefined = isCustomUnitRateIDForP2P(transaction)
                 ? DistanceRequestUtils.getRateForP2P(policyCurrency, transaction)
-                : (customUnitRateID && policyMileageRates?.[customUnitRateID]) || defaultMileageRate;
+                : (customUnitRateID && mileageRates?.[customUnitRateID]) || defaultMileageRate;
 
-            const {unit, rate} = selectedMileageRate ?? {};
+            const {unit, rate} = mileageRate ?? {};
             const distance = getDistanceInMeters(transaction, unit);
-            const currency = selectedMileageRate?.currency ?? policyCurrency;
+            const currency = mileageRate?.currency ?? policyCurrency;
             const amount = DistanceRequestUtils.getDistanceRequestAmount(distance, unit ?? CONST.CUSTOM_UNITS.DISTANCE_UNIT_MILES, rate ?? 0);
             setMoneyRequestAmount(transactionID, amount, currency);
 
@@ -329,10 +289,6 @@ function IOURequestStepDistance({
         Navigation.goBack(backTo);
     }, [backTo]);
 
-    const navigateBackAfterSave = useCallback(() => {
-        Navigation.closeRHPFlow();
-    }, []);
-
     /**
      * Takes the user to the page for editing a specific waypoint
      * @param index of the waypoint to edit
@@ -343,15 +299,11 @@ function IOURequestStepDistance({
             if (isEditingSplit) {
                 iouWaypointType = CONST.IOU.TYPE.SPLIT_EXPENSE;
             }
-            // Construct the backTo URL explicitly to match the stack entry created when we navigated
-            // to this distance edit page. Using Navigation.getActiveRoute() would return a URL with
-            // the OnyxTabNavigator's tab suffix (e.g. "/distance-map") which doesn't match the stack
-            // entry — causing Navigation.goBack() to REPLACE instead of POP and creating a duplicate
-            // distance page entry in the stack.
-            const waypointBackTo = ROUTES.MONEY_REQUEST_STEP_DISTANCE.getRoute(action, iouType, transactionID, report?.reportID ?? reportID, backTo);
-            Navigation.navigate(ROUTES.MONEY_REQUEST_STEP_WAYPOINT.getRoute(action, iouWaypointType, transactionID, report?.reportID ?? reportID, index.toString(), waypointBackTo));
+            Navigation.navigate(
+                ROUTES.MONEY_REQUEST_STEP_WAYPOINT.getRoute(action, iouWaypointType, transactionID, report?.reportID ?? reportID, index.toString(), Navigation.getActiveRoute()),
+            );
         },
-        [action, iouType, transactionID, report?.reportID, reportID, backTo, isEditingSplit],
+        [action, transactionID, report?.reportID, reportID, isEditingSplit],
     );
 
     const navigateToNextStep = useCallback(() => {
@@ -431,7 +383,7 @@ function IOURequestStepDistance({
         conciergeReportID,
     ]);
 
-    const getError = useCallback(() => {
+    const getError = () => {
         // Get route error if available else show the invalid number of waypoints error.
         if (hasRouteError) {
             return getLatestErrorField(currentTransaction, 'route');
@@ -446,7 +398,7 @@ function IOURequestStepDistance({
             return {atLeastTwoDifferentWaypointsError: translate('iou.error.atLeastTwoDifferentWaypoints')} as Errors;
         }
         return {};
-    }, [hasRouteError, currentTransaction, isWaypointsNullIslandError, translate, duplicateWaypointsError, atLeastTwoDifferentWaypointsError]);
+    };
 
     type DataParams = {
         data: string[];
@@ -501,16 +453,18 @@ function IOURequestStepDistance({
                     {waypoints: currentTransaction?.comment?.waypoints, routes: currentTransaction?.routes},
                     policy,
                 );
-                navigateBackAfterSave();
+                navigateBack();
                 return;
             }
 
             // If nothing was changed, simply go to transaction thread
             // We compare only addresses because numbers are rounded while backup
+            const oldWaypoints = transactionBackup?.comment?.waypoints ?? {};
+            const oldAddresses = Object.fromEntries(Object.entries(oldWaypoints).map(([key, waypoint]) => [key, 'address' in waypoint ? waypoint.address : {}]));
+            const addresses = Object.fromEntries(Object.entries(waypoints).map(([key, waypoint]) => [key, 'address' in waypoint ? waypoint.address : {}]));
             const hasRouteChanged = !deepEqual(transactionBackup?.routes, transaction?.routes);
-            if (!haveWaypointAddressesChanged(transactionBackup?.comment?.waypoints, waypoints)) {
-                transactionWasSaved.current = true;
-                navigateBackAfterSave();
+            if (deepEqual(oldAddresses, addresses)) {
+                navigateBack();
                 return;
             }
             if (transaction?.transactionID && report?.reportID) {
@@ -532,10 +486,7 @@ function IOURequestStepDistance({
                 });
             }
             transactionWasSaved.current = true;
-            // Remove the backup eagerly so the parent report view reads the optimistic transaction
-            // immediately, instead of the stale backup, while the API request is still in flight.
-            removeBackupTransaction(transaction?.transactionID);
-            navigateBackAfterSave();
+            navigateBack();
             return;
         }
 
@@ -549,13 +500,13 @@ function IOURequestStepDistance({
         isLoading,
         isCreatingNewRequest,
         navigateToNextStep,
-        navigateBackAfterSave,
         isEditingSplit,
         originalSplitTransactionDraft,
         transactionBackup,
         waypoints,
         transaction,
         report,
+        navigateBack,
         currentTransaction?.comment?.waypoints,
         currentTransaction?.routes,
         policy,
@@ -569,91 +520,6 @@ function IOURequestStepDistance({
         parentReportNextStep,
     ]);
 
-    const submitManualDistance = useCallback(() => {
-        isManuallyEditing.current = false;
-        const value = manualNumberFormRef.current?.getNumber() ?? '';
-        if (!value.length || parseFloat(value) <= 0) {
-            setManualFormError(translate('iou.error.invalidDistance'));
-            return;
-        }
-        if (!DistanceRequestUtils.isDistanceAmountWithinLimit(parseFloat(value), distanceRate)) {
-            setManualFormError(translate('iou.error.distanceAmountTooLargeReduceDistance'));
-            return;
-        }
-
-        const distanceAsFloat = roundToTwoDecimalPlaces(parseFloat(value));
-
-        if (isEditingSplit && transaction) {
-            setMoneyRequestDistance(transactionID, distanceAsFloat, shouldUseTransactionDraft(action, iouType), distanceUnit);
-            setDraftSplitTransaction(CONST.IOU.OPTIMISTIC_TRANSACTION_ID, splitDraftTransaction, {distance: distanceAsFloat}, policy);
-            navigateBackAfterSave();
-            return;
-        }
-
-        const transactionDistanceUnit = currentTransaction?.comment?.customUnit?.distanceUnit;
-        const isDistanceChanged = currentDistance !== distanceAsFloat;
-        const isDistanceUnitChanged = transactionDistanceUnit && transactionDistanceUnit !== distanceUnit;
-
-        // Check if waypoints were edited on the map tab before the user switched to manual.
-        // If so, we must still send the update even if the distance value itself didn't change.
-        const haveWaypointsChanged = haveWaypointAddressesChanged(transactionBackup?.comment?.waypoints, waypoints);
-
-        if (!isDistanceChanged && !isDistanceUnitChanged && !haveWaypointsChanged) {
-            transactionWasSaved.current = true;
-            navigateBackAfterSave();
-            return;
-        }
-
-        const hasRouteChanged = haveWaypointsChanged && !deepEqual(transactionBackup?.routes, transaction?.routes);
-        updateMoneyRequestDistance({
-            transaction,
-            transactionThreadReport: report,
-            parentReport,
-            waypoints,
-            distance: distanceAsFloat,
-            ...(hasRouteChanged ? {routes: transaction?.routes} : {}),
-            transactionBackup,
-            policy,
-            policyTagList: policyTags,
-            policyCategories,
-            currentUserAccountIDParam,
-            currentUserEmailParam,
-            isASAPSubmitBetaEnabled,
-            parentReportNextStep,
-            recentWaypoints,
-        });
-        transactionWasSaved.current = true;
-        // Remove the backup eagerly so the parent report view reads the optimistic transaction
-        // immediately, instead of the stale backup, while the API request is still in flight.
-        removeBackupTransaction(transaction?.transactionID);
-        navigateBackAfterSave();
-    }, [
-        translate,
-        distanceRate,
-        transactionID,
-        action,
-        iouType,
-        distanceUnit,
-        isEditingSplit,
-        transaction,
-        currentTransaction?.comment?.customUnit?.distanceUnit,
-        splitDraftTransaction,
-        policy,
-        navigateBackAfterSave,
-        currentDistance,
-        waypoints,
-        transactionBackup,
-        report,
-        parentReport,
-        policyTags,
-        policyCategories,
-        currentUserAccountIDParam,
-        currentUserEmailParam,
-        isASAPSubmitBetaEnabled,
-        parentReportNextStep,
-        recentWaypoints,
-    ]);
-
     const renderItem = useCallback(
         ({item, drag, isActive, getIndex}: RenderItemParams<string>) => (
             <DistanceRequestRenderItem
@@ -669,105 +535,67 @@ function IOURequestStepDistance({
         [isLoadingRoute, navigateToWaypointEditPage, waypoints, getWaypointKey],
     );
 
-    const handleManualInputChange = useCallback(() => {
-        isManuallyEditing.current = true;
-        if (!manualFormError) {
-            return;
-        }
-        setManualFormError('');
-    }, [manualFormError]);
-
-    const errorState = useMemo(
-        () => ({shouldShowAtLeastTwoDifferentWaypointsError, atLeastTwoDifferentWaypointsError, duplicateWaypointsError, hasRouteError, getError}),
-        [shouldShowAtLeastTwoDifferentWaypointsError, atLeastTwoDifferentWaypointsError, duplicateWaypointsError, hasRouteError, getError],
-    );
-
-    const loadingState = useMemo(() => ({isOffline, isLoadingRoute, shouldFetchRoute, isLoading}), [isOffline, isLoadingRoute, shouldFetchRoute, isLoading]);
-
-    const renderMapTab = useCallback(
-        () => (
-            <TabScreenWithFocusTrapWrapper>
-                <DistanceMapTabContent
-                    waypointItems={waypointItems}
-                    waypoints={waypoints}
-                    extractKey={extractKey}
-                    updateWaypoints={updateWaypoints}
-                    scrollViewRef={scrollViewRef}
-                    renderItem={renderItem}
-                    navigateToWaypointEditPage={navigateToWaypointEditPage}
-                    transaction={transaction}
-                    policy={policy}
-                    submitWaypoints={submitWaypoints}
-                    buttonText={buttonText}
-                    errorState={errorState}
-                    loadingState={loadingState}
-                />
-            </TabScreenWithFocusTrapWrapper>
-        ),
-        [waypointItems, waypoints, extractKey, updateWaypoints, renderItem, navigateToWaypointEditPage, transaction, policy, submitWaypoints, buttonText, errorState, loadingState],
-    );
-
-    const renderManualTab = useCallback(
-        () => (
-            <TabScreenWithFocusTrapWrapper>
-                <DistanceManualTabContent
-                    currentDistance={currentDistance}
-                    distanceUnit={distanceUnit}
-                    onSubmit={submitManualDistance}
-                    manualFormError={manualFormError}
-                    onInputChange={handleManualInputChange}
-                    manualTextInputRef={manualTextInputRef}
-                    manualNumberFormRef={manualNumberFormRef}
-                />
-            </TabScreenWithFocusTrapWrapper>
-        ),
-        [currentDistance, distanceUnit, submitManualDistance, manualFormError, handleManualInputChange],
-    );
-
-    if (isEditing) {
-        return (
-            <StepScreenWrapper
-                headerTitle={translate('common.distance')}
-                onBackButtonPress={navigateBack}
-                testID="IOURequestStepDistance"
-                shouldShowNotFoundPage={!currentTransaction?.comment?.waypoints || shouldShowNotFoundPage}
-                shouldShowWrapper
-            >
-                <OnyxTabNavigator
-                    id={CONST.TAB.DISTANCE_EDIT_TYPE}
-                    defaultSelectedTab={CONST.TAB_REQUEST.DISTANCE_MAP}
-                    tabBar={TabSelector}
-                >
-                    <TopTab.Screen name={CONST.TAB_REQUEST.DISTANCE_MAP}>{renderMapTab}</TopTab.Screen>
-                    <TopTab.Screen name={CONST.TAB_REQUEST.DISTANCE_MANUAL}>{renderManualTab}</TopTab.Screen>
-                </OnyxTabNavigator>
-            </StepScreenWrapper>
-        );
-    }
-
     return (
         <StepScreenWrapper
             headerTitle={translate('common.distance')}
             onBackButtonPress={navigateBack}
             testID="IOURequestStepDistance"
-            shouldShowNotFoundPage={shouldShowNotFoundPage}
+            shouldShowNotFoundPage={(isEditing && !currentTransaction?.comment?.waypoints) || shouldShowNotFoundPage}
             shouldShowWrapper={!isCreatingNewRequest}
         >
-            <DistanceMapTabContent
-                waypointItems={waypointItems}
-                waypoints={waypoints}
-                extractKey={extractKey}
-                updateWaypoints={updateWaypoints}
-                scrollViewRef={scrollViewRef}
-                renderItem={renderItem}
-                navigateToWaypointEditPage={navigateToWaypointEditPage}
-                transaction={transaction}
-                policy={policy}
-                submitWaypoints={submitWaypoints}
-                buttonText={buttonText}
-                errorState={errorState}
-                loadingState={loadingState}
-            />
+            <View style={[styles.flex1, isInLandscapeMode && styles.flexRow]}>
+                {isInLandscapeMode && (
+                    <View style={styles.flex1}>
+                        <DistanceRequestFooter
+                            waypoints={waypoints}
+                            navigateToWaypointEditPage={navigateToWaypointEditPage}
+                            transaction={transaction}
+                            policy={policy}
+                            mapContainerStyle={{minHeight: undefined}}
+                        />
+                    </View>
+                )}
+                <View style={[styles.flex1, isInLandscapeMode && styles.pl2]}>
+                    <DraggableList
+                        data={waypointItems}
+                        keyExtractor={extractKey}
+                        onDragEnd={updateWaypoints}
+                        ref={scrollViewRef}
+                        renderItem={renderItem}
+                        ListFooterComponent={
+                            !isInLandscapeMode ? (
+                                <DistanceRequestFooter
+                                    waypoints={waypoints}
+                                    navigateToWaypointEditPage={navigateToWaypointEditPage}
+                                    transaction={transaction}
+                                    policy={policy}
+                                />
+                            ) : undefined
+                        }
+                    />
+                    <View style={[styles.w100, styles.pt2]}>
+                        {/* Show error message if there is route error or there are less than 2 routes and user has tried submitting, */}
+                        {((shouldShowAtLeastTwoDifferentWaypointsError && atLeastTwoDifferentWaypointsError) || duplicateWaypointsError || hasRouteError) && (
+                            <DotIndicatorMessage
+                                style={[styles.mh4, styles.mv3]}
+                                messages={getError()}
+                                type="error"
+                            />
+                        )}
+                        <Button
+                            success
+                            allowBubble
+                            pressOnEnter
+                            large
+                            style={[styles.w100, styles.mb5, styles.ph5, styles.flexShrink0]}
+                            onPress={submitWaypoints}
+                            text={buttonText}
+                            isLoading={!isOffline && (isLoadingRoute || shouldFetchRoute || isLoading)}
+                            sentryLabel={CONST.SENTRY_LABEL.IOU_REQUEST_STEP.DISTANCE_NEXT_BUTTON}
+                        />
+                    </View>
+                </View>
+            </View>
         </StepScreenWrapper>
     );
 }
diff --git a/src/pages/iou/request/step/IOURequestStepDistanceMap.tsx b/src/pages/iou/request/step/IOURequestStepDistanceMap.tsx
index 8315c7fd4bb..15d0d9e83bd 100644
--- a/src/pages/iou/request/step/IOURequestStepDistanceMap.tsx
+++ b/src/pages/iou/request/step/IOURequestStepDistanceMap.tsx
@@ -1,15 +1,21 @@
 import {deepEqual} from 'fast-equals';
 import isEmpty from 'lodash/isEmpty';
 import React, {useCallback, useEffect, useMemo, useRef, useState} from 'react';
+import {View} from 'react-native';
 // eslint-disable-next-line no-restricted-imports
 import type {ScrollView as RNScrollView} from 'react-native';
 import type {RenderItemParams} from 'react-native-draggable-flatlist/lib/typescript/types';
 import type {OnyxEntry} from 'react-native-onyx';
+import Button from '@components/Button';
+import DistanceRequestFooter from '@components/DistanceRequest/DistanceRequestFooter';
 import DistanceRequestRenderItem from '@components/DistanceRequest/DistanceRequestRenderItem';
+import DotIndicatorMessage from '@components/DotIndicatorMessage';
+import DraggableList from '@components/DraggableList';
 import withCurrentUserPersonalDetails from '@components/withCurrentUserPersonalDetails';
 import type {WithCurrentUserPersonalDetailsProps} from '@components/withCurrentUserPersonalDetails';
 import useDefaultExpensePolicy from '@hooks/useDefaultExpensePolicy';
 import useFetchRoute from '@hooks/useFetchRoute';
+import useIsInLandscapeMode from '@hooks/useIsInLandscapeMode';
 import useLocalize from '@hooks/useLocalize';
 import useNetwork from '@hooks/useNetwork';
 import useOnyx from '@hooks/useOnyx';
@@ -22,6 +28,7 @@ import useReportAttributes from '@hooks/useReportAttributes';
 import useReportIsArchived from '@hooks/useReportIsArchived';
 import useSelfDMReport from '@hooks/useSelfDMReport';
 import useShowNotFoundPageInIOUStep from '@hooks/useShowNotFoundPageInIOUStep';
+import useThemeStyles from '@hooks/useThemeStyles';
 import useWaypointItems from '@hooks/useWaypointItems';
 import {setMoneyRequestAmount} from '@libs/actions/IOU';
 import {handleMoneyRequestStepDistanceNavigation} from '@libs/actions/IOU/MoneyRequest';
@@ -38,7 +45,7 @@ import getNonEmptyStringOnyxID from '@libs/getNonEmptyStringOnyxID';
 import {shouldUseTransactionDraft} from '@libs/IOUUtils';
 import Navigation from '@libs/Navigation/Navigation';
 import {isPolicyExpenseChat as isPolicyExpenseChatUtil} from '@libs/ReportUtils';
-import {getDistanceInMeters, getRateID, getRequestType, hasRoute, haveWaypointAddressesChanged, isCustomUnitRateIDForP2P, isWaypointNullIsland} from '@libs/TransactionUtils';
+import {getDistanceInMeters, getRateID, getRequestType, hasRoute, isCustomUnitRateIDForP2P, isWaypointNullIsland} from '@libs/TransactionUtils';
 import CONST from '@src/CONST';
 import ONYXKEYS from '@src/ONYXKEYS';
 import ROUTES from '@src/ROUTES';
@@ -51,7 +58,6 @@ import type {Waypoint, WaypointCollection} from '@src/types/onyx/Transaction';
 import type Transaction from '@src/types/onyx/Transaction';
 import {isEmptyObject} from '@src/types/utils/EmptyObject';
 import type TransactionStateType from '@src/types/utils/TransactionStateType';
-import DistanceMapTabContent from './DistanceMapTabContent';
 import StepScreenWrapper from './StepScreenWrapper';
 import withFullTransactionOrNotFound from './withFullTransactionOrNotFound';
 import type {WithWritableReportOrNotFoundProps} from './withWritableReportOrNotFound';
@@ -71,6 +77,8 @@ function IOURequestStepDistanceMap({
     transaction,
     currentUserPersonalDetails,
 }: IOURequestStepDistanceMapProps) {
+    const styles = useThemeStyles();
+    const isInLandscapeMode = useIsInLandscapeMode();
     const {isOffline} = useNetwork();
     const {translate} = useLocalize();
     const {isBetaEnabled} = usePermissions();
@@ -367,7 +375,7 @@ function IOURequestStepDistanceMap({
         conciergeReportID,
     ]);
 
-    const getError = useCallback(() => {
+    const getError = () => {
         // Get route error if available else show the invalid number of waypoints error.
         if (hasRouteError) {
             return getLatestErrorField(currentTransaction, 'route');
@@ -382,7 +390,7 @@ function IOURequestStepDistanceMap({
             return {atLeastTwoDifferentWaypointsError: translate('iou.error.atLeastTwoDifferentWaypoints')} as Errors;
         }
         return {};
-    }, [hasRouteError, isWaypointsNullIslandError, duplicateWaypointsError, atLeastTwoDifferentWaypointsError, currentTransaction, translate]);
+    };
 
     type DataParams = {
         data: string[];
@@ -438,8 +446,11 @@ function IOURequestStepDistanceMap({
 
             // If nothing was changed, simply go to transaction thread
             // We compare only addresses because numbers are rounded while backup
+            const oldWaypoints = transactionBackup?.comment?.waypoints ?? {};
+            const oldAddresses = Object.fromEntries(Object.entries(oldWaypoints).map(([key, waypoint]) => [key, 'address' in waypoint ? waypoint.address : {}]));
+            const addresses = Object.fromEntries(Object.entries(waypoints).map(([key, waypoint]) => [key, 'address' in waypoint ? waypoint.address : {}]));
             const hasRouteChanged = !deepEqual(transactionBackup?.routes, transaction?.routes);
-            if (!haveWaypointAddressesChanged(transactionBackup?.comment?.waypoints, waypoints)) {
+            if (deepEqual(oldAddresses, addresses)) {
                 navigateBack();
                 return;
             }
@@ -514,13 +525,6 @@ function IOURequestStepDistanceMap({
         [isLoadingRoute, navigateToWaypointEditPage, waypoints, getWaypointKey],
     );
 
-    const errorState = useMemo(
-        () => ({shouldShowAtLeastTwoDifferentWaypointsError, atLeastTwoDifferentWaypointsError, duplicateWaypointsError, hasRouteError, getError}),
-        [shouldShowAtLeastTwoDifferentWaypointsError, atLeastTwoDifferentWaypointsError, duplicateWaypointsError, hasRouteError, getError],
-    );
-
-    const loadingState = useMemo(() => ({isOffline, isLoadingRoute, shouldFetchRoute, isLoading}), [isOffline, isLoadingRoute, shouldFetchRoute, isLoading]);
-
     return (
         <StepScreenWrapper
             headerTitle={translate('common.distance')}
@@ -529,21 +533,59 @@ function IOURequestStepDistanceMap({
             shouldShowNotFoundPage={(isEditing && !currentTransaction?.comment?.waypoints) || shouldShowNotFoundPage}
             shouldShowWrapper={!isCreatingNewRequest}
         >
-            <DistanceMapTabContent
-                waypointItems={waypointItems}
-                waypoints={waypoints}
-                extractKey={extractKey}
-                updateWaypoints={updateWaypoints}
-                scrollViewRef={scrollViewRef}
-                renderItem={renderItem}
-                navigateToWaypointEditPage={navigateToWaypointEditPage}
-                transaction={transaction}
-                policy={policy}
-                submitWaypoints={submitWaypoints}
-                buttonText={buttonText}
-                errorState={errorState}
-                loadingState={loadingState}
-            />
+            <View style={[styles.flex1, isInLandscapeMode && styles.flexRow]}>
+                {isInLandscapeMode && (
+                    <View style={styles.flex1}>
+                        <DistanceRequestFooter
+                            waypoints={waypoints}
+                            navigateToWaypointEditPage={navigateToWaypointEditPage}
+                            transaction={transaction}
+                            policy={policy}
+                            mapContainerStyle={{minHeight: undefined}}
+                        />
+                    </View>
+                )}
+                <View style={[styles.flex1, isInLandscapeMode && styles.pl2]}>
+                    <DraggableList
+                        data={waypointItems}
+                        keyExtractor={extractKey}
+                        onDragEnd={updateWaypoints}
+                        ref={scrollViewRef}
+                        renderItem={renderItem}
+                        ListFooterComponent={
+                            !isInLandscapeMode ? (
+                                <DistanceRequestFooter
+                                    waypoints={waypoints}
+                                    navigateToWaypointEditPage={navigateToWaypointEditPage}
+                                    transaction={transaction}
+                                    policy={policy}
+                                />
+                            ) : undefined
+                        }
+                    />
+                    <View style={[styles.w100, styles.pt2]}>
+                        {/* Show error message if there is route error or there are less than 2 routes and user has tried submitting, */}
+                        {((shouldShowAtLeastTwoDifferentWaypointsError && atLeastTwoDifferentWaypointsError) || duplicateWaypointsError || hasRouteError) && (
+                            <DotIndicatorMessage
+                                style={[styles.mh4, styles.mv3]}
+                                messages={getError()}
+                                type="error"
+                            />
+                        )}
+                        <Button
+                            success
+                            allowBubble
+                            pressOnEnter
+                            large
+                            style={[styles.w100, styles.mb5, styles.ph5, styles.flexShrink0]}
+                            onPress={submitWaypoints}
+                            text={buttonText}
+                            isLoading={!isOffline && (isLoadingRoute || shouldFetchRoute || isLoading)}
+                            sentryLabel={CONST.SENTRY_LABEL.IOU_REQUEST_STEP.DISTANCE_MAP_NEXT_BUTTON}
+                        />
+                    </View>
+                </View>
+            </View>
         </StepScreenWrapper>
     );
 }
diff --git a/tests/ui/IOURequestStepDistanceTest.tsx b/tests/ui/IOURequestStepDistanceTest.tsx
index 1b0a985be13..c1813804454 100644
--- a/tests/ui/IOURequestStepDistanceTest.tsx
+++ b/tests/ui/IOURequestStepDistanceTest.tsx
@@ -2,8 +2,7 @@
 /* eslint-disable @typescript-eslint/no-unsafe-member-access */
 /* eslint-disable @typescript-eslint/no-unsafe-call */
 /* eslint-disable @typescript-eslint/no-unsafe-return */
-/* eslint-disable @typescript-eslint/no-non-null-assertion */
-import {act, fireEvent, render, screen} from '@testing-library/react-native';
+import {act, render, screen} from '@testing-library/react-native';
 import React from 'react';
 import Onyx from 'react-native-onyx';
 import {CurrentUserPersonalDetailsProvider} from '@components/CurrentUserPersonalDetailsProvider';
@@ -61,10 +60,6 @@ jest.mock('@libs/actions/IOU', () => {
     };
 });
 
-jest.mock('@libs/actions/IOU/UpdateMoneyRequest', () => ({
-    updateMoneyRequestDistance: jest.fn(),
-}));
-
 jest.mock('@libs/actions/IOU/MoneyRequest', () => ({
     handleMoneyRequestStepDistanceNavigation: jest.fn(),
 }));
@@ -90,22 +85,6 @@ jest.mock('@libs/actions/TransactionEdit', () => ({
 jest.mock('@components/ProductTrainingContext', () => ({
     useProductTrainingContext: () => [false],
 }));
-
-jest.mock('@libs/Navigation/OnyxTabNavigator', () => {
-    const React2 = require('react');
-    const OnyxTabNavigator = ({children}: {children: React.ReactNode}) => React2.createElement(React2.Fragment, null, children);
-    const TopTab = {
-        Screen: ({children}: {children: () => React.ReactNode}) => React2.createElement(React2.Fragment, null, typeof children === 'function' ? children() : children),
-    };
-    const TabScreenWithFocusTrapWrapper = ({children}: {children: React.ReactNode}) => React2.createElement(React2.Fragment, null, children);
-    return {
-        __esModule: true,
-        default: OnyxTabNavigator,
-        TopTab,
-        TabScreenWithFocusTrapWrapper,
-    };
-});
-jest.mock('@hooks/useShowNotFoundPageInIOUStep', () => () => false);
 jest.mock('@src/hooks/useResponsiveLayout');
 
 jest.mock('@libs/Navigation/navigationRef', () => ({
@@ -188,7 +167,7 @@ function createTestReport(): Report {
     };
 }
 
-function createDistanceTransaction(overrides?: Partial<Transaction>): Transaction {
+function createDistanceTransaction(): Transaction {
     const transaction = createRandomTransaction(1);
     return {
         ...transaction,
@@ -201,43 +180,10 @@ function createDistanceTransaction(overrides?: Partial<Transaction>): Transactio
                 waypoint0: {address: '123 Main St', lat: 40.7128, lng: -74.006, keyForList: 'start_waypoint'},
                 waypoint1: {address: '456 Oak Ave', lat: 40.7589, lng: -73.9851, keyForList: 'stop_waypoint'},
             },
-            customUnit: {
-                customUnitID: 'test-unit-id',
-                customUnitRateID: 'test-rate-id',
-                name: 'Distance',
-                distanceUnit: CONST.CUSTOM_UNITS.DISTANCE_UNIT_MILES,
-                quantity: 100,
-            },
-            ...overrides?.comment,
         },
-        ...overrides,
     };
 }
 
-function renderEditMode() {
-    return render(
-        <OnyxListItemProvider>
-            <CurrentUserPersonalDetailsProvider>
-                <IOURequestStepDistance
-                    route={{
-                        key: 'Money_Request_Step_Distance-test',
-                        name: SCREENS.MONEY_REQUEST.STEP_DISTANCE,
-                        params: {
-                            action: CONST.IOU.ACTION.EDIT as never,
-                            iouType: CONST.IOU.TYPE.SUBMIT,
-                            reportID: REPORT_ID,
-                            transactionID: TRANSACTION_ID,
-                            backTo: undefined as never,
-                        },
-                    }}
-                    // @ts-expect-error minimal navigation for test
-                    navigation={undefined}
-                />
-            </CurrentUserPersonalDetailsProvider>
-        </OnyxListItemProvider>,
-    );
-}
-
 describe('IOURequestStepDistance - draft transactions coverage', () => {
     beforeAll(() => {
         Onyx.init({
@@ -334,123 +280,3 @@ describe('IOURequestStepDistance - draft transactions coverage', () => {
         expect(screen.getByAccessibilityHint(/123 Main St/)).toBeTruthy();
     });
 });
-
-describe('IOURequestStepDistance - submitManualDistance', () => {
-    const {updateMoneyRequestDistance} = jest.requireMock<{updateMoneyRequestDistance: jest.Mock}>('@libs/actions/IOU/UpdateMoneyRequest');
-
-    beforeAll(() => {
-        Onyx.init({
-            keys: ONYXKEYS,
-            evictableKeys: [ONYXKEYS.COLLECTION.REPORT_ACTIONS],
-        });
-    });
-
-    beforeEach(async () => {
-        jest.clearAllMocks();
-        await Onyx.clear();
-        await waitForBatchedUpdates();
-    });
-
-    it('should show validation error for empty distance input', async () => {
-        await signInWithTestUser(ACCOUNT_ID, ACCOUNT_LOGIN);
-        const transaction = createDistanceTransaction();
-        const report = createTestReport();
-
-        await act(async () => {
-            await Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT}${REPORT_ID}`, report);
-            await Onyx.merge(`${ONYXKEYS.COLLECTION.TRANSACTION}${TRANSACTION_ID}`, transaction);
-            await Onyx.merge(`${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${TRANSACTION_ID}`, null);
-            await Onyx.merge(ONYXKEYS.IS_LOADING_APP, false);
-        });
-
-        renderEditMode();
-        await waitForBatchedUpdatesWithAct();
-
-        // The Save button from the manual tab should be visible (mock renders both tabs)
-        const saveButtons = screen.getAllByText('common.save');
-        expect(saveButtons.length).toBeGreaterThan(0);
-
-        // Press Save without changing the value — the form starts with the current distance
-        // so we need to clear it first to test empty validation
-        const distanceInput = screen.getAllByLabelText(/common\.distance/).at(0)!;
-        fireEvent.changeText(distanceInput, '');
-
-        fireEvent.press(saveButtons.at(0)!);
-
-        // updateMoneyRequestDistance should NOT have been called
-        expect(updateMoneyRequestDistance).not.toHaveBeenCalled();
-    });
-
-    it('should render manual distance input with current distance in edit mode', async () => {
-        await signInWithTestUser(ACCOUNT_ID, ACCOUNT_LOGIN);
-        const transaction = createDistanceTransaction();
-        const report = createTestReport();
-
-        await act(async () => {
-            await Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT}${REPORT_ID}`, report);
-            await Onyx.merge(`${ONYXKEYS.COLLECTION.TRANSACTION}${TRANSACTION_ID}`, transaction);
-            await Onyx.merge(`${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${TRANSACTION_ID}`, null);
-            await Onyx.merge(ONYXKEYS.IS_LOADING_APP, false);
-        });
-
-        renderEditMode();
-        await waitForBatchedUpdatesWithAct();
-
-        // The manual distance input should display the current quantity value
-        const distanceInputs = screen.getAllByLabelText(/common\.distance/);
-        expect(distanceInputs.length).toBeGreaterThan(0);
-
-        // Save button should be visible
-        const saveButtons = screen.getAllByText('common.save');
-        expect(saveButtons.length).toBeGreaterThan(0);
-    });
-
-    it('should not call updateMoneyRequestDistance when Save is pressed without valid changes', async () => {
-        await signInWithTestUser(ACCOUNT_ID, ACCOUNT_LOGIN);
-        const transaction = createDistanceTransaction();
-        const report = createTestReport();
-
-        await act(async () => {
-            await Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT}${REPORT_ID}`, report);
-            await Onyx.merge(`${ONYXKEYS.COLLECTION.TRANSACTION}${TRANSACTION_ID}`, transaction);
-            await Onyx.merge(`${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${TRANSACTION_ID}`, null);
-            await Onyx.merge(ONYXKEYS.IS_LOADING_APP, false);
-        });
-
-        renderEditMode();
-        await waitForBatchedUpdatesWithAct();
-
-        // Press Save — the distance value has not been changed via the number pad
-        const saveButtons = screen.getAllByText('common.save');
-        fireEvent.press(saveButtons.at(0)!);
-
-        // updateMoneyRequestDistance should not be called (either validation blocks or no-change early return)
-        expect(updateMoneyRequestDistance).not.toHaveBeenCalled();
-    });
-
-    it('should render both Map and Manual tabs with correct content in edit mode', async () => {
-        await signInWithTestUser(ACCOUNT_ID, ACCOUNT_LOGIN);
-        const transaction = createDistanceTransaction();
-        const report = createTestReport();
-
-        await act(async () => {
-            await Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT}${REPORT_ID}`, report);
-            await Onyx.merge(`${ONYXKEYS.COLLECTION.TRANSACTION}${TRANSACTION_ID}`, transaction);
-            await Onyx.merge(`${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${TRANSACTION_ID}`, null);
-            await Onyx.merge(ONYXKEYS.IS_LOADING_APP, false);
-        });
-
-        renderEditMode();
-        await waitForBatchedUpdatesWithAct();
-
-        // Map tab content: waypoint addresses should be visible
-        expect(screen.getByAccessibilityHint(/123 Main St/)).toBeTruthy();
-        expect(screen.getByAccessibilityHint(/456 Oak Ave/)).toBeTruthy();
-
-        // Manual tab content: distance input and Save button should be present
-        const distanceInputs = screen.getAllByLabelText(/common\.distance/);
-        expect(distanceInputs.length).toBeGreaterThan(0);
-        const saveButtons = screen.getAllByText('common.save');
-        expect(saveButtons.length).toBeGreaterThan(0);
-    });
-});
diff --git a/tests/ui/components/IOURequestStepDistanceTest.tsx b/tests/ui/components/IOURequestStepDistanceTest.tsx
index 3b5716c1519..27bf4ad685d 100644
--- a/tests/ui/components/IOURequestStepDistanceTest.tsx
+++ b/tests/ui/components/IOURequestStepDistanceTest.tsx
@@ -56,20 +56,6 @@ jest.mock('@libs/EmojiTrie', () => ({
 jest.mock('@components/ProductTrainingContext', () => ({
     useProductTrainingContext: () => [false],
 }));
-
-/* eslint-disable @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-return */
-jest.mock('@libs/Navigation/OnyxTabNavigator', () => {
-    const ReactMock = require('react');
-    return {
-        __esModule: true,
-        default: ({children}: {children: React.ReactNode}) => ReactMock.createElement(ReactMock.Fragment, null, children),
-        TopTab: {
-            Screen: ({children}: {children: () => React.ReactNode}) => ReactMock.createElement(ReactMock.Fragment, null, typeof children === 'function' ? children() : children),
-        },
-        TabScreenWithFocusTrapWrapper: ({children}: {children: React.ReactNode}) => ReactMock.createElement(ReactMock.Fragment, null, children),
-    };
-});
-
 jest.mock('@src/hooks/useResponsiveLayout');
 
 jest.mock('@libs/Navigation/navigationRef', () => ({
