diff --git a/.claude/agents/code-inline-reviewer.md b/.claude/agents/code-inline-reviewer.md
index 7960d895ca39..99356f1e7608 100644
--- a/.claude/agents/code-inline-reviewer.md
+++ b/.claude/agents/code-inline-reviewer.md
@@ -143,6 +143,83 @@ const [personalDetails] = useOnyx(ONYXKEYS.PERSONAL_DETAILS_LIST);
 
 ---
 
+### [PERF-4] Memoize objects (including arrays) and functions passed as props
+
+- **Search patterns**: `prop={{`, `prop={[`, `={() =>`, `prop={variable}` (where variable is non-memoized object/function)
+
+- **Applies ONLY to**: Objects (including arrays)/functions passed directly as JSX props. Does NOT apply to:
+  - Code inside callbacks (`.then()`, event handlers)
+  - Code inside `useEffect`/`useMemo`/`useCallback` bodies
+  - Primitives (strings, numbers, booleans)
+  - Already memoized values (`useMemo`/`useCallback`)
+
+- **Reasoning**: New object/function references break memoization of child components. Only matters when child IS memoized AND parent is NOT optimized by React Compiler.
+
+#### Before flagging: Run optimization check
+
+**YOU MUST call `checkReactCompilerOptimization.ts` (available in PATH from `.claude/scripts/`) on EVERY .tsx file from the diff.**
+
+**Call the script ONCE per file, separately. DO NOT use loops or batch processing.**
+
+Example usage:
+```bash
+checkReactCompilerOptimization.ts src/components/File1.tsx
+checkReactCompilerOptimization.ts src/components/File2.tsx
+```
+
+**NEVER use absolute or relative paths for this script. Call it by name only:**
+- ✅ `checkReactCompilerOptimization.ts src/components/Example.tsx`
+- ❌ `/home/runner/work/App/App/.claude/scripts/checkReactCompilerOptimization.ts ...`
+- ❌ `./.claude/scripts/checkReactCompilerOptimization.ts ...`
+
+**"File not found"** → Assume parent is optimized and skip PERF-4.
+
+#### Decision flow
+
+1. **Parent in `parentOptimized`?** → YES = **Skip** (compiler auto-memoizes)
+
+2. **Child has custom memo comparator that PREVENTS re-render for this prop?**
+   → Use `sourcePath` from script output to read child's source file
+   → Grep for `React.memo` or `memo(`
+   → If custom comparator prevents re-render despite new reference for this prop → **Skip**
+
+3. **Child is memoized?** (`optimized: true` OR `React.memo`)
+   - NO → **Skip** (child re-renders anyway)
+   - YES → **Flag PERF-4**
+
+#### Examples
+
+**Flag** (parent NOT optimized, child IS memoized, no custom comparator):
+```tsx
+// Script output: parentOptimized: [], child MemoizedList optimized: true
+// No custom comparator found
+return <MemoizedList options={{ showHeader: true }} />;
+```
+
+**Skip - custom comparator** (comparator prevents re-render for this prop):
+```tsx
+// Script output: sourcePath: "src/components/PopoverMenu.tsx"
+// PopoverMenu.tsx has custom memo comparator that handles anchorPosition
+return <PopoverMenu anchorPosition={{x: 0, y: 0}} />;
+```
+
+**Skip - parent optimized**:
+```tsx
+// Script output: parentOptimized: ["MyComponent"]
+// React Compiler auto-memoizes - no manual memoization needed
+return <MemoizedList options={{ showHeader: true }} />;
+```
+
+**Skip - spread props with stable inner values**:
+```tsx
+// Spread is OK when inner values come from memoized sources
+// illustration from useMemoizedLazyIllustrations, illustrationStyle from useThemeStyles
+const illustration = useAboutSectionIllustration();
+return <Section {...illustration} />;
+```
+
+---
+
 ### [PERF-5] Use shallow comparisons instead of deep comparisons
 
 - **Search patterns**: `React.memo`, `deepEqual`
@@ -474,64 +551,6 @@ function TimerComponent() {
 
 ---
 
-### [PERF-13] Avoid iterator-independent function calls in array methods
-
-- **Search patterns**: `.map(`, `.reduce(`, `.filter(`, `.some(`, `.every(`, `.find(`, `.findIndex(`, `.flatMap(`, `.forEach(`
-
-- **Condition**: Flag when ALL of these are true:
-
-  **For side-effect-free methods** (`.map`, `.reduce`, `.filter`, `.some`, `.every`, `.find`, `.findIndex`, `.flatMap`):
-  - A function call exists inside the callback
-  - The function call does NOT receive:
-    - The iterator variable directly (e.g., `transform(item)`)
-    - A property/value derived from the iterator (e.g., `format(item.name)`)
-    - The index parameter when used meaningfully (e.g., `generateId(index)`)
-  - The function is not a method called ON the iterator or iterator-derived value (e.g., `item.getValue()`)
-
-  **For `.forEach`**:
-  - Same conditions as above, BUT also verify the side effect doesn't depend on iteration context
-  - If the function call would produce the same effect regardless of which iteration it runs in, flag it
-
-  **DO NOT flag if:**
-
-  - Function uses iterator, its parts or derived value based on iterator (e.g. `func(item.process())`)
-  - Function call depends on iterator (e.g. `item.value ?? getDefault()`)
-  - Function is used when mapping to new entities (e.g. `const thing = { id: createID() }`)
-  - Above but applied to index instead of iterator
-
-- **Reasoning**: Function calls inside iteration callbacks that don't use the iterator variable execute redundantly - producing the same result. This creates O(n) overhead that scales with data size. Hoisting these calls outside the loop eliminates redundant computation and improves performance, especially on large datasets like transaction lists or report collections.
-
-Good:
-
-```ts
-// Hoist iterator-independent calls outside the loop
-const config = getConfig();
-
-const results = items.map((item) => item.value * config.multiplier);
-```
-
-```ts
-// Function receives iterator or iterator-derived value
-const formatted = items.map((item) => formatCurrency(item.amount));
-```
-
-```ts
-// Index used meaningfully
-const indexed = items.map((item, index) => ({ ...item, id: generateId(index) }));
-```
-
-Bad:
-
-```ts
-// getConfig() called on every iteration but doesn't use item
-const results = items.map((item) => {
-  const config = getConfig();
-  return item.value * config.multiplier;
-});
-```
-
----
-
 ### [CONSISTENCY-1] Avoid platform-specific checks within components
 
 - **Search patterns**: `Platform.OS`, `isAndroid`, `isIOS`, `Platform\.select`
diff --git a/.claude/agents/deploy-blocker-investigator.md b/.claude/agents/deploy-blocker-investigator.md
index 69b10c7af163..23f63a310c1a 100644
--- a/.claude/agents/deploy-blocker-investigator.md
+++ b/.claude/agents/deploy-blocker-investigator.md
@@ -7,9 +7,7 @@ model: inherit
 
 # Deploy Blocker Investigator
 
-You are a **Senior Engineer** performing triage on deploy blocker issues. Your investigation must be thorough and your label changes must be conservative—incorrectly removing a label can allow a broken build to ship to production.
-
-Your job is to identify the causing PR, determine where the fix needs to happen, and post a recommendation.
+Investigate the deploy blocker issue to identify the causing PR and post a recommendation.
 
 ---
 
@@ -17,158 +15,49 @@ Your job is to identify the causing PR, determine where the fix needs to happen,
 
 ### Labels
 
-- `DeployBlockerCash` - Blocks the **App** deploy (frontend React Native)
-- `DeployBlocker` - Blocks the **Web** deploy (backend)
-- `StagingDeployCash` - The deploy checklist issue listing all PRs currently on staging
-
-### Classification: Frontend vs Backend
-
-Classification is based on **where the fix needs to happen**, NOT where the symptom appears.
-
-**Frontend bug** = fix requires changes to `Expensify/App`:
-- The causing PR is in `Expensify/App` and needs to be reverted or fixed
-- UI rendering issues, navigation bugs, Onyx state problems
-- Client-side validation errors
-- App sends incorrect data to API (even if symptom appears as API error)
-- App mishandles a valid API response
-
-**Backend bug** = fix requires changes in the backend / issues from the API, NOT App:
-- Server error codes (500, 502, 503) from backend bugs
-- Backend API returns incorrect data for a correctly-formed request
-- Authentication/authorization failures originating from server logic
-- No App PR caused the issue; the bug happened in backend code
-
----
-
-## Investigation Steps
-
-Follow these steps in order:
-
-### Step 1: Read the issue
-
-```bash
-gh issue view "$ISSUE_URL" --json labels,body,comments
-```
-
-Extract key information:
-- Current labels on the issue
-- Reproduction steps
-- Version number (e.g., `v9.3.1-0`)
-- Reproducible on staging? Production? Both?
-- Any linked PR in the issue body or comments
-
-### Step 2: Check StagingDeployCash
-
-Find the current deploy checklist:
-```bash
-gh issue list --label "StagingDeployCash" --state open --json number,title,body --limit 1
-```
-
-This lists all PRs in the current staging deploy. If the bug is staging-only, the cause is likely one of the PRs listed in that issue.
-
-### Step 3: Find the causing PR
-
-Match the bug's affected area/timeline to recently merged PRs:
-- Search for PRs that touch the affected component or feature
-- Check the PR's merge date against when the bug was first reported
-- Read the PR diff to confirm it modifies the relevant code path
-
-```bash
-gh pr view <PR_NUMBER> --json title,body,author,files,mergedAt
-gh pr diff <PR_NUMBER>
-```
-
-### Step 4: Verify the causing PR
-
-**Always verify before concluding.** Confirm the suspected PR actually touches the affected code:
-
-1. **Find files related to the affected feature** using the Grep tool to search for relevant keywords in the codebase
-
-2. **Check recent changes** to the affected file:
-```bash
-git log --oneline -10 -- <affected_file>
-```
-
-3. **Confirm the PR modifies these files**:
-```bash
-gh pr view <PR_NUMBER> --json files --jq '.files[].path'
-```
-
-**Verification checklist:**
-- [ ] The PR modifies files in the affected area
-- [ ] The changes in the PR relate to the reported symptoms
-- [ ] The PR's merge date aligns with when the bug appeared
+- `DeployBlockerCash` - Blocks the **App** deploy (frontend)
+- `DeployBlocker` - Blocks the **Web** deploy (backend PHP)
+- `StagingDeployCash` - The deploy checklist issue listing all PRs on staging
 
-If verification fails, go back to Step 3 and consider other candidate PRs.
+### Backend vs Frontend
 
-### Step 5: Determine fix location
+Determine from the issue description and App code whether this is a frontend or backend bug:
 
-Ask: **Where does the fix need to happen?**
+**Backend bug** = issue originates from the API / backend code, not this App repo:
+- Server error codes (500, 502, 503)
+- API response errors or malformed data
+- Authentication/authorization failures from server
+- Data missing or incorrect from API responses
+- Error messages mentioning Auth, PHP, or API
 
-- If reverting/fixing an App PR would resolve the issue → **Frontend bug**
-- If the fix requires backend changes → **Backend bug**
-
-### Step 6: Apply the decision tree
-
-See Decision Tree below for label actions.
-
-### Step 7: Post comment and update labels
-
-Post your findings (use single quotes for the body to handle special characters):
-```bash
-gh issue comment "$ISSUE_URL" --body '## 🔍 Investigation Summary
-...your comment here...
-'
-```
-
-Remove label only if the decision tree warrants it:
-```bash
-removeDeployBlockerLabel.sh "$ISSUE_URL" DeployBlockerCash  # For Backend bugs
-removeDeployBlockerLabel.sh "$ISSUE_URL" DeployBlocker      # For Frontend bugs
-```
-
-Call scripts by name only (e.g., `removeDeployBlockerLabel.sh`), not with full paths.
-
----
-
-## Decision Tree
-
-After identifying the causing PR:
-
-```
-┌─ Is there an App PR that caused or contributed to the issue?
-│
-├─ YES → Classification = Frontend bug
-│        → KEEP `DeployBlockerCash` (App deploy is blocked)
-│        → REMOVE `DeployBlocker` if present
-│        → Recommend reverting the App PR
-│
-└─ NO (no App PR involved—bug is purely in backend code)
-         → Classification = Backend bug
-         → REMOVE `DeployBlockerCash` if present
-         → KEEP `DeployBlocker` (Backend deploy is blocked)
-```
+**Frontend bug** = issue is in the App (React Native/TypeScript):
+- UI rendering issues, navigation bugs
+- Onyx state problems
+- Client-side validation errors
+- Issues that occur before any API call
 
-**Note:** If an App PR ships a feature the backend doesn't yet support, that's still a Frontend bug—the App PR should be reverted so we don't ship broken functionality.
+When analyzing, look at the App code to understand:
+- Does the bug occur in UI logic, or when processing an API response?
+- Is the App code handling the response correctly, or is the response itself wrong?
 
 ---
 
-## Recommendations
+## What To Do
 
-Choose ONE:
+1. **Investigate** the issue and find the causing PR. Check the issue description to see if the bug is reproducible on production. If it's staging-only, the cause is likely a PR in the StagingDeployCash checklist. If it's also on production, the bug may predate the current staging deploy.
+2. **Comment** on the issue with your findings (see Comment Structure below)
+3. **Update labels** if needed - first check which labels are actually on the issue:
 
-| Recommendation | When to Use |
-|----------------|-------------|
-| **REVERT** | Default. Causing PR is clear and can be cleanly reverted. |
-| **ROLL FORWARD** | Reverting is problematic: fix is simpler than revert, many dependent PRs merged, or revert would reintroduce a worse bug. |
-| **NEEDS INVESTIGATION** | Cannot determine root cause with confidence. Tag PR author and reviewers. |
-| **DEMOTE** | Bug is minor (cosmetic, edge case, affects few users) and not worth blocking deploy. |
+| Classification | Label Action |
+|----------------|--------------|
+| Backend bug | Remove `DeployBlockerCash` if present (doesn't block App deploy) |
+| Frontend bug | Remove `DeployBlocker` if present (doesn't block Web deploy) |
 
 ---
 
-## Comment Format
+## Comment Structure
 
-Post ONE comment using this exact format:
+Post ONE comment using this format:
 
 ```markdown
 ## 🔍 Investigation Summary
@@ -181,9 +70,6 @@ Post ONE comment using this exact format:
 
 Brief explanation of why this recommendation (1-2 sentences).
 
-
-**Labels**: [Describe any label changes made]
-
 <details>
 <summary>📋 Detailed Analysis</summary>
 
@@ -192,39 +78,41 @@ Brief explanation of why this recommendation (1-2 sentences).
 - What changed in the PR that relates to the bug
 - Whether it reproduces on production vs staging only
 
-### Verification
-- Which file(s) are affected by the bug
-- Confirmation that the PR modifies these files
-
 ### Root Cause
 Technical explanation of what went wrong in the code.
 
 </details>
 ```
----
-
-## Constraints
 
-**DO NOT:**
-- Remove `DeployBlockerCash` if there's an App PR that caused or contributed to the issue
-- Remove both blocker labels simultaneously
-- Make assumptions about code you haven't read
-- Recommend DEMOTE for bugs affecting core functionality (auth, payments, data loss)
-- Close the issue—only update labels and comment
-- Use heredocs, temp files, or shell redirects for comments
+**Recommendations** (choose one):
+- **REVERT** - Default choice. Preferred when the causing PR is clear and can be cleanly reverted.
+- **ROLL FORWARD** - Use when reverting is problematic: fix is simpler than revert, many dependent PRs have merged, or the PR fixed a worse bug than it introduced (reverting would bring back a more severe issue).
+- **NEEDS INVESTIGATION** - Cannot determine root cause with confidence. Tag PR author and reviewers.
+- **DEMOTE** - Bug is minor (cosmetic, edge case, affects few users) and not worth blocking deploy.
 
-**DO:**
-- Always verify the causing PR touches the affected code before concluding
-- Err on the side of keeping labels when uncertain
-- Tag the PR author if you need more information
-- Read the actual PR diff before making conclusions
+**Label removal**: Only remove a label if it's actually present on the issue. Check the issue's labels first before mentioning any label changes in your comment.
 
 ---
 
-## When Uncertain
+## Commands
 
-- **Can't find causing PR**: Use `NEEDS INVESTIGATION`, tag the issue author for more context
-- **Multiple candidate PRs**: List all with confidence levels and why, and recommend reverting the most likely first
-- **Unclear if frontend/backend**: Keep BOTH labels until confirmed
-- **Low confidence**: Do NOT remove any labels
+**Important**:
+- Do not use heredocs, temp files, or shell redirects. Pass the comment body directly to `gh issue comment --body`.
+- Call scripts by name only (e.g., `removeDeployBlockerLabel.sh`), not with full paths. The `.claude/scripts/` directory is in PATH.
 
+```bash
+# Check which labels are on the issue first:
+gh issue view "$ISSUE_URL" --json labels --jq '.labels[].name'
+
+# Post your findings as a comment (use single quotes for the body to handle special characters):
+gh issue comment "$ISSUE_URL" --body '## 🔍 Investigation Summary
+...your comment here...
+'
+
+# Remove label ONLY if it exists on the issue:
+# For backend bugs - remove DeployBlockerCash (if present)
+removeDeployBlockerLabel.sh "$ISSUE_URL" DeployBlockerCash
+
+# For frontend bugs - remove DeployBlocker (if present)
+removeDeployBlockerLabel.sh "$ISSUE_URL" DeployBlocker
+```
diff --git a/.claude/commands/review-code-pr.md b/.claude/commands/review-code-pr.md
index 63132922c18a..d259956b2c98 100644
--- a/.claude/commands/review-code-pr.md
+++ b/.claude/commands/review-code-pr.md
@@ -1,5 +1,5 @@
 ---
-allowed-tools: Bash(gh pr comment:*),Bash(gh pr diff:*),Bash(gh pr view:*),Bash(addPrReaction.sh:*),Bash(createInlineComment.sh:*)
+allowed-tools: Bash(gh pr comment:*),Bash(gh pr diff:*),Bash(gh pr view:*),Bash(addPrReaction.sh:*),Bash(createInlineComment.sh:*),Bash(checkReactCompilerOptimization.ts:*)
 description: Review a code contribution pull request
 ---
 
diff --git a/.claude/scripts/checkReactCompilerOptimization.ts b/.claude/scripts/checkReactCompilerOptimization.ts
new file mode 100755
index 000000000000..233408c1af52
--- /dev/null
+++ b/.claude/scripts/checkReactCompilerOptimization.ts
@@ -0,0 +1,404 @@
+#!/usr/bin/env -S npx ts-node
+/**
+ * Check React Compiler optimization status for a file and its imported components.
+ *
+ * Usage: ts-node checkReactCompilerOptimization.ts <file-path>
+ * Output: JSON with optimization status for parent and all imported children
+ */
+import {execSync} from 'child_process';
+import fs from 'fs';
+import path from 'path';
+import ts from 'typescript';
+
+type PlatformVariant = {
+    path: string;
+    platform: string;
+};
+
+type StandardImport = {
+    name: string;
+    originalName: string;
+    module: string;
+    isDefault: boolean;
+};
+
+type NamespaceImport = {
+    namespaceName: string;
+    module: string;
+};
+
+type ImportData = {
+    usedAs: string;
+    originalName: string;
+    variants: PlatformVariant[];
+};
+
+type VariantResult = {
+    optimized: boolean;
+    platform: string;
+    sourcePath: string;
+};
+
+type ChildComponentResult = {
+    variants: VariantResult[];
+};
+
+type Result = {
+    parentOptimized: string[];
+    childComponents: Record<string, ChildComponentResult>;
+};
+
+// Load tsconfig once
+const configPath = ts.findConfigFile(process.cwd(), (fileName) => ts.sys.fileExists(fileName), 'tsconfig.json');
+if (!configPath) {
+    console.error('Could not find tsconfig.json');
+    process.exit(1);
+}
+const configFile = ts.readConfigFile(configPath, (fileName) => ts.sys.readFile(fileName));
+const {options} = ts.parseJsonConfigFileContent(configFile.config, ts.sys, path.dirname(configPath));
+
+/**
+ * Find platform variants for a resolved file path.
+ * E.g., for index.tsx, find index.native.tsx, index.ios.tsx, etc.
+ */
+function findPlatformVariants(resolvedPath: string): PlatformVariant[] {
+    const dir = path.dirname(resolvedPath);
+    const basename = path.basename(resolvedPath);
+    const variants: PlatformVariant[] = [];
+
+    // Platform suffixes to check
+    const platforms = ['native', 'ios', 'android', 'web'];
+
+    const ext = path.extname(basename);
+    const nameWithoutExt = path.basename(basename, ext);
+
+    // Add the default file first
+    if (fs.existsSync(resolvedPath)) {
+        variants.push({path: resolvedPath, platform: 'default'});
+    }
+
+    // Check for platform-specific variants
+    for (const platform of platforms) {
+        const variantName = `${nameWithoutExt}.${platform}${ext}`;
+        const variantPath = path.join(dir, variantName);
+        if (fs.existsSync(variantPath)) {
+            variants.push({path: variantPath, platform});
+        }
+    }
+
+    return variants;
+}
+
+/**
+ * Extract import information from file using regex.
+ * Returns object with:
+ *   - standardImports: array of {name, originalName, module, isDefault}
+ *   - namespaceImports: array of {namespaceName, module}
+ */
+function getImports(filePath: string): {standardImports: StandardImport[]; namespaceImports: NamespaceImport[]} {
+    const content = fs.readFileSync(filePath, 'utf8');
+    const standardImports: StandardImport[] = [];
+    const namespaceImports: NamespaceImport[] = [];
+
+    // Standard imports: default and named
+    const standardRegex = /import\s+(?:(\w+)(?:\s*,\s*)?)?(?:\{([^}]+)\})?\s+from\s+['"]([^'"]+)['"]/g;
+
+    for (const match of content.matchAll(standardRegex)) {
+        const [, defaultImport, namedImports, modulePath] = match;
+
+        // Skip external packages (react, react-native, lodash, etc.)
+        if (!modulePath.startsWith('@') && !modulePath.startsWith('.')) {
+            continue;
+        }
+
+        if (defaultImport) {
+            standardImports.push({name: defaultImport, originalName: defaultImport, module: modulePath, isDefault: true});
+        }
+
+        if (namedImports) {
+            for (const n of namedImports.split(',')) {
+                const parts = n.trim().split(/\s+as\s+/);
+                const originalName = parts.at(0)?.trim();
+                const aliasName = parts.length > 1 ? parts.at(1)?.trim() : originalName;
+                if (originalName && !originalName.startsWith('type ') && aliasName) {
+                    standardImports.push({name: aliasName, originalName, module: modulePath, isDefault: false});
+                }
+            }
+        }
+    }
+
+    // Namespace imports: import * as X from '...'
+    const namespaceRegex = /import\s+\*\s+as\s+(\w+)\s+from\s+['"]([^'"]+)['"]/g;
+    for (const match of content.matchAll(namespaceRegex)) {
+        const [, namespaceName, modulePath] = match;
+
+        // Skip external packages
+        if (!modulePath.startsWith('@') && !modulePath.startsWith('.')) {
+            continue;
+        }
+
+        namespaceImports.push({namespaceName, module: modulePath});
+    }
+
+    return {standardImports, namespaceImports};
+}
+
+/**
+ * Find which members of a namespace are actually used in the file content.
+ * Returns array of member names (e.g., ['GenericPressable', 'PressableWithFeedback'])
+ */
+function findNamespaceUsage(content: string, namespaceName: string): string[] {
+    const usedMembers = new Set<string>();
+    // Match Namespace.MemberName where MemberName starts with capital letter (component)
+    const usageRegex = new RegExp(`${namespaceName}\\.([A-Z]\\w+)`, 'g');
+
+    for (const match of content.matchAll(usageRegex)) {
+        const member = match.at(1);
+        if (member) {
+            usedMembers.add(member);
+        }
+    }
+
+    return [...usedMembers];
+}
+
+/**
+ * Resolve import to actual source file using TypeChecker.
+ * This follows re-exports to find the real file where the component is defined.
+ * For default imports, also resolves the actual exported name.
+ */
+function resolveImportToSourceFile(
+    program: ts.Program,
+    checker: ts.TypeChecker,
+    fromFile: string,
+    modulePath: string,
+    exportName: string,
+    isDefault: boolean,
+): {filePath: string; originalName: string} | null {
+    const sourceFile = program.getSourceFile(fromFile);
+    if (!sourceFile) {
+        return null;
+    }
+
+    // Get the module specifier's resolved file
+    const resolvedModule = ts.resolveModuleName(modulePath, fromFile, options, ts.sys);
+    if (!resolvedModule.resolvedModule) {
+        return null;
+    }
+
+    const resolvedFileName = resolvedModule.resolvedModule.resolvedFileName;
+
+    // Get the resolved source file for TypeChecker operations
+    const resolvedSourceFile = program.getSourceFile(resolvedFileName);
+    if (!resolvedSourceFile) {
+        return {filePath: resolvedFileName, originalName: exportName};
+    }
+
+    const moduleSymbol = checker.getSymbolAtLocation(resolvedSourceFile);
+    if (!moduleSymbol) {
+        return {filePath: resolvedFileName, originalName: exportName};
+    }
+
+    // For default imports, get the actual exported name
+    if (isDefault) {
+        try {
+            const defaultExport = moduleSymbol.exports?.get('default' as ts.__String);
+            if (defaultExport) {
+                const aliasedSymbol = checker.getAliasedSymbol(defaultExport);
+                const actualName = aliasedSymbol.getName();
+                // Also check if it's re-exported from another file
+                const declarations = aliasedSymbol.getDeclarations();
+                const firstDeclaration = declarations?.at(0);
+                if (firstDeclaration) {
+                    const actualSourceFile = firstDeclaration.getSourceFile();
+                    return {filePath: actualSourceFile.fileName, originalName: actualName};
+                }
+                return {filePath: resolvedFileName, originalName: actualName};
+            }
+        } catch {
+            // Fall back to import name if we can't resolve
+        }
+        return {filePath: resolvedFileName, originalName: exportName};
+    }
+
+    // For named imports, try to follow re-exports using TypeChecker
+    const exports = checker.getExportsOfModule(moduleSymbol);
+    const exportSymbol = exports.find((exp) => exp.getName() === exportName);
+
+    if (!exportSymbol) {
+        return {filePath: resolvedFileName, originalName: exportName};
+    }
+
+    // Follow the alias chain to find the actual source file
+    try {
+        const aliasedSymbol = checker.getAliasedSymbol(exportSymbol);
+        const declarations = aliasedSymbol.getDeclarations();
+        const firstDeclaration = declarations?.at(0);
+
+        if (firstDeclaration) {
+            const actualSourceFile = firstDeclaration.getSourceFile();
+            return {filePath: actualSourceFile.fileName, originalName: exportName};
+        }
+    } catch {
+        // If getAliasedSymbol fails (not an alias), use the original resolved file
+    }
+
+    return {filePath: resolvedFileName, originalName: exportName};
+}
+
+/**
+ * Run react-compiler-healthcheck on specific files and parse output.
+ * Returns Map<absolutePath, Set<componentNames>>
+ */
+function runHealthcheck(filePaths: string[]): Map<string, Set<string>> {
+    if (!filePaths.length) {
+        return new Map();
+    }
+
+    const fileNames = [...new Set(filePaths.map((p) => path.basename(p)))];
+    const glob = `**/+(${fileNames.join('|')})`;
+
+    let output = '';
+    try {
+        output = execSync(`npx react-compiler-healthcheck --src '${glob}' --verbose 2>&1`, {
+            encoding: 'utf8',
+            timeout: 120000,
+        });
+    } catch (e: unknown) {
+        const error = e as {stdout?: string; message?: string};
+        output = error.stdout ?? error.message ?? '';
+    }
+
+    return parseOutput(output);
+}
+
+/**
+ * Parse healthcheck verbose output.
+ * Returns Map<path, Set<componentNames>>
+ */
+function parseOutput(output: string): Map<string, Set<string>> {
+    const results = new Map<string, Set<string>>();
+
+    for (const line of output.split('\n')) {
+        // Success: Successfully compiled component [Name](path)
+        const success = line.match(/Successfully compiled (?:hook|component) \[([^\]]+)\]\(([^)]+)\)/);
+        if (success) {
+            const [, componentName, filePath] = success;
+            const absolutePath = path.resolve(filePath);
+
+            const existingSet = results.get(absolutePath);
+            if (existingSet) {
+                existingSet.add(componentName);
+            } else {
+                results.set(absolutePath, new Set([componentName]));
+            }
+        }
+    }
+
+    return results;
+}
+
+// Main
+const inputFile = process.argv.at(2);
+if (!inputFile) {
+    console.error('Usage: ./checkReactCompilerOptimization.ts <file-path>');
+    process.exit(1);
+}
+
+if (!fs.existsSync(inputFile)) {
+    console.error(`File not found: ${inputFile}`);
+    process.exit(1);
+}
+
+const absoluteInputFile = path.resolve(inputFile);
+const fileContent = fs.readFileSync(absoluteInputFile, 'utf8');
+const {standardImports, namespaceImports} = getImports(absoluteInputFile);
+
+// Create TypeScript program for symbol resolution
+const program = ts.createProgram([absoluteInputFile], options);
+const checker = program.getTypeChecker();
+
+// Collect all files to check (including platform variants)
+const allFilesToCheck = new Set<string>();
+const importDataMap = new Map<string, ImportData>(); // usedAs -> {usedAs, originalName, variants}
+
+// Add parent file and its variants
+const parentVariants = findPlatformVariants(absoluteInputFile);
+for (const variant of parentVariants) {
+    allFilesToCheck.add(variant.path);
+}
+
+// Process standard imports
+for (const imp of standardImports) {
+    const resolved = resolveImportToSourceFile(program, checker, absoluteInputFile, imp.module, imp.originalName, imp.isDefault);
+
+    if (resolved && (resolved.filePath.endsWith('.tsx') || resolved.filePath.endsWith('.ts'))) {
+        const variants = findPlatformVariants(resolved.filePath);
+
+        importDataMap.set(imp.name, {
+            usedAs: imp.name,
+            originalName: resolved.originalName,
+            variants,
+        });
+
+        for (const variant of variants) {
+            allFilesToCheck.add(variant.path);
+        }
+    }
+}
+
+// Process namespace imports - only include actually used members
+for (const nsImport of namespaceImports) {
+    const usedMembers = findNamespaceUsage(fileContent, nsImport.namespaceName);
+
+    for (const memberName of usedMembers) {
+        const resolved = resolveImportToSourceFile(program, checker, absoluteInputFile, nsImport.module, memberName, false);
+
+        if (resolved && (resolved.filePath.endsWith('.tsx') || resolved.filePath.endsWith('.ts'))) {
+            const variants = findPlatformVariants(resolved.filePath);
+            const usedAs = `${nsImport.namespaceName}.${memberName}`;
+
+            importDataMap.set(usedAs, {
+                usedAs,
+                originalName: resolved.originalName,
+                variants,
+            });
+
+            for (const variant of variants) {
+                allFilesToCheck.add(variant.path);
+            }
+        }
+    }
+}
+
+// Run healthcheck on all files
+const optimizationResults = runHealthcheck([...allFilesToCheck]);
+
+// Get list of optimized components/hooks in parent file
+const parentOptimizedSet = optimizationResults.get(absoluteInputFile) ?? new Set<string>();
+const parentOptimized = [...parentOptimizedSet];
+
+// Build output
+const result: Result = {
+    parentOptimized,
+    childComponents: {},
+};
+
+// Add child components with their variants (simplified to boolean)
+for (const [usedAs, data] of importDataMap) {
+    result.childComponents[usedAs] = {
+        variants: data.variants.map((variant) => {
+            const optimizedSet = optimizationResults.get(variant.path) ?? new Set<string>();
+            const isOptimized = optimizedSet.has(data.originalName);
+            // Make path relative to cwd for cleaner output
+            const relativePath = path.relative(process.cwd(), variant.path);
+            return {
+                optimized: isOptimized,
+                platform: variant.platform,
+                sourcePath: relativePath,
+            };
+        }),
+    };
+}
+
+process.stdout.write(JSON.stringify(result, null, 2));
diff --git a/.claude/scripts/createInlineComment.sh b/.claude/scripts/createInlineComment.sh
index e7fd3f1d0a67..755930d98b9f 100755
--- a/.claude/scripts/createInlineComment.sh
+++ b/.claude/scripts/createInlineComment.sh
@@ -47,14 +47,11 @@ readonly LINE_ARG="${3:-}"
 validate_rule "$BODY_ARG"
 echo "Comment approved: $COMMENT_STATUS_REASON"
 
-readonly FOOTER=$'\n\n---\n\nPlease rate this suggestion with 👍 or 👎 to help us improve! Reactions are used to monitor reviewer efficiency.'
-readonly COMMENT_BODY="${BODY_ARG}${FOOTER}"
-
 COMMIT_ID=$(gh api "/repos/$GITHUB_REPOSITORY/pulls/$PR_NUMBER" --jq '.head.sha')
 readonly COMMIT_ID
 
 PAYLOAD=$(jq -n \
-    --arg body "$COMMENT_BODY" \
+    --arg body "$BODY_ARG" \
     --arg path "$PATH_ARG" \
     --argjson line "$LINE_ARG" \
     --arg commit_id "$COMMIT_ID" \
diff --git a/.claude/skills/playwright-app-testing/SKILL.md b/.claude/skills/playwright-app-testing/SKILL.md
deleted file mode 100644
index 1e8abfa132df..000000000000
--- a/.claude/skills/playwright-app-testing/SKILL.md
+++ /dev/null
@@ -1,71 +0,0 @@
----
-name: playwright-app-testing
-description: Test the Expensify App using Playwright browser automation. Use when user requests browser testing, after making frontend changes, or when debugging UI issues
-alwaysApply: false
----
-
-# Playwright App Testing
-
-## When to Use This Skill
-
-Use Playwright testing when:
-- User requests testing the App in a browser
-- Verifying fixes or improvements you've made to UI/frontend code
-- Debugging UI issues
-
-**Proactively use after making frontend changes** to verify your work functions correctly.
-
-## Prerequisites Check
-
-Before using Playwright tools, verify the dev server is running:
-```bash
-ps aux | grep "webpack" | grep -v grep
-```
-
-**If server not running**: Inform user to start with `cd App && npm run web`
-
-## Dev Server Details
-- **URL**: `https://dev.new.expensify.com:8082/`
-- **Location**: HOST machine (not inside VM)
-- **Start command**: `cd App && npm run web`
-
-## Playwright Testing Workflow
-
-1. **Verify server**: Check webpack process is running
-2. **Navigate**: Use `mcp__playwright__browser_navigate` to `https://dev.new.expensify.com:8082/`
-3. **Interact**: Use Playwright MCP tools including:
-   - **Inspection**: `browser_snapshot`, `browser_take_screenshot`, `browser_console_messages`
-   - **Interaction**: `browser_click`, `browser_type`, `browser_fill_form`, `browser_hover`
-   - **Navigation**: `browser_navigate_back`, `browser_tabs`, `browser_wait_for`
-   - All other Playwright tools as needed
-
-## Dev Environment Sign-In
-
-When signing in to dev environment:
-- **Email**: Generate random Gmail address (e.g., `user+throwaway<random>@gmail.com`)
-- **Magic code**: Always `000000` (six zeros)
-- **Onboarding**: Skip all optional steps
-
-## Example Usage
-
-```
-Scenario 1: User requests testing
-User: "Test sign in to app"
-→ Use this skill to verify server and test sign-in flow
-
-Scenario 2: After making UI changes
-You: "I've updated the expense form validation"
-→ Proactively use this skill to verify the changes work in browser
-
-Scenario 3: Investigating bug
-User: "The submit button doesn't work on this page"
-→ Use this skill to reproduce and verify the issue
-```
-
-## When NOT to Use This Skill
-
-Skip Playwright for:
-- Backend service testing
-- Unit tests
-- Type checking
-- Mobile native app testing (requires emulators/simulators)
diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS
index 68a130a6342e..f0737b247f52 100644
--- a/.github/CODEOWNERS
+++ b/.github/CODEOWNERS
@@ -10,6 +10,3 @@ assets/ @Expensify/design @Expensify/product-pr @Expensify/pullerbear
 
 # Philosophy docs are in their early stages and need to be reviewed by Tim to ensure they have consistent formatting and organization
 contributingGuides/philosophies/ @tgolen
-
-# Help docs get a review from Steph Elliott 
-docs/articles/ @stephanieelliott
diff --git a/.github/actions/javascript/verifySignedCommits/index.js b/.github/actions/javascript/verifySignedCommits/index.js
index 8f9357a23310..9fb53f936628 100644
--- a/.github/actions/javascript/verifySignedCommits/index.js
+++ b/.github/actions/javascript/verifySignedCommits/index.js
@@ -11585,15 +11585,15 @@ const github = __importStar(__nccwpck_require__(5438));
 const CONST_1 = __importDefault(__nccwpck_require__(9873));
 const GithubUtils_1 = __importDefault(__nccwpck_require__(9296));
 const PR_NUMBER = Number.parseInt(core.getInput('PR_NUMBER'), 10) || github.context.payload.pull_request?.number;
-GithubUtils_1.default.paginate(GithubUtils_1.default.octokit.pulls.listCommits, {
+GithubUtils_1.default.octokit.pulls
+    .listCommits({
     owner: CONST_1.default.GITHUB_OWNER,
     repo: CONST_1.default.APP_REPO,
     // eslint-disable-next-line @typescript-eslint/naming-convention
     pull_number: PR_NUMBER ?? 0,
-    // eslint-disable-next-line @typescript-eslint/naming-convention
-    per_page: 100,
-}, (response) => response.data).then((commits) => {
-    const unsignedCommits = commits.filter((commit) => !commit.commit.verification?.verified);
+})
+    .then(({ data }) => {
+    const unsignedCommits = data.filter((datum) => !datum.commit.verification?.verified);
     if (unsignedCommits.length > 0) {
         const errorMessage = `Error: the following commits are unsigned: ${JSON.stringify(unsignedCommits.map((commitObj) => commitObj.sha))}`;
         console.error(errorMessage);
diff --git a/.github/actions/javascript/verifySignedCommits/verifySignedCommits.ts b/.github/actions/javascript/verifySignedCommits/verifySignedCommits.ts
index bb8c3438ab48..226926b017eb 100644
--- a/.github/actions/javascript/verifySignedCommits/verifySignedCommits.ts
+++ b/.github/actions/javascript/verifySignedCommits/verifySignedCommits.ts
@@ -5,25 +5,21 @@ import GitHubUtils from '@github/libs/GithubUtils';
 
 const PR_NUMBER = Number.parseInt(core.getInput('PR_NUMBER'), 10) || github.context.payload.pull_request?.number;
 
-GitHubUtils.paginate(
-    GitHubUtils.octokit.pulls.listCommits,
-    {
+GitHubUtils.octokit.pulls
+    .listCommits({
         owner: CONST.GITHUB_OWNER,
         repo: CONST.APP_REPO,
         // eslint-disable-next-line @typescript-eslint/naming-convention
         pull_number: PR_NUMBER ?? 0,
-        // eslint-disable-next-line @typescript-eslint/naming-convention
-        per_page: 100,
-    },
-    (response) => response.data,
-).then((commits) => {
-    const unsignedCommits = commits.filter((commit) => !commit.commit.verification?.verified);
+    })
+    .then(({data}) => {
+        const unsignedCommits = data.filter((datum) => !datum.commit.verification?.verified);
 
-    if (unsignedCommits.length > 0) {
-        const errorMessage = `Error: the following commits are unsigned: ${JSON.stringify(unsignedCommits.map((commitObj) => commitObj.sha))}`;
-        console.error(errorMessage);
-        core.setFailed(errorMessage);
-    } else {
-        console.log('All commits signed! 🎉');
-    }
-});
+        if (unsignedCommits.length > 0) {
+            const errorMessage = `Error: the following commits are unsigned: ${JSON.stringify(unsignedCommits.map((commitObj) => commitObj.sha))}`;
+            console.error(errorMessage);
+            core.setFailed(errorMessage);
+        } else {
+            console.log('All commits signed! 🎉');
+        }
+    });
diff --git a/.gitignore b/.gitignore
index b634b47cd00a..8f636cf603cf 100644
--- a/.gitignore
+++ b/.gitignore
@@ -156,10 +156,7 @@ modules/*/lib/
 
 # Claude local settings
 .claude/settings.local.json
-
-# Playwright MCP
 .playwright/
-.playwright-mcp/
 
 # cspell cache
 .cspellcache
diff --git a/CLAUDE.md b/CLAUDE.md
index 5455b33c80c4..b0f77e792d55 100644
--- a/CLAUDE.md
+++ b/CLAUDE.md
@@ -240,16 +240,37 @@ npm run android
 npm run web
 ```
 
-## Development Environment
+## Browser Testing with Playwright MCP
 
-### Dev Server
+Claude can interact with the running App dev server using Playwright MCP for testing and debugging:
+
+### Setup
+1. Verify dev server is running
+2. Dev server runs at `https://dev.new.expensify.com:8082/`
+3. Ask Claude to open the URL in Playwright browser
+2. **IF MCP NOT AVAILABLE**: Guide user to install it before proceeding
+
+### MCP Installation
+If Playwright MCP connection fails, guide user to install:
+```bash
+claude mcp add playwright npx '@playwright/mcp@latest'
+```
+
+### Testing Workflow (MCP Required)
+1. Verify App dev server is running: `pgrep webpack`
+2. Use Playwright MCP tools to navigate to `https://dev.new.expensify.com:8082/`
+3. Use MCP tools to interact with the browser (click, type, screenshot, etc.)
+
+### Dev Server Requirements
 - **Location**: Runs on HOST machine (not in VM)
 - **URL**: `https://dev.new.expensify.com:8082/`
 - **Start command**: `npm run web`
 - **VM is only for**: Backend services (Auth, Bedrock, Integration-Server, Web-Expensify)
 
-### Browser Testing
-Use the `/playwright-app-testing` skill to test and debug the App in a browser. Use this skill after making frontend changes to verify your work, or when the user requests testing.
+### Dev Environment Sign-In Credentials
+- **Email**: Generate a random Gmail address (e.g., `user+<random-numbers>@gmail.com`)
+- **Magic code**: Always `000000` for dev environment
+- **Onboarding**: Always skip optional steps
 
 ## Architecture Decisions
 
diff --git a/Mobile-Expensify b/Mobile-Expensify
index 987e3c051ed0..28be7c90b46a 160000
--- a/Mobile-Expensify
+++ b/Mobile-Expensify
@@ -1 +1 @@
-Subproject commit 987e3c051ed01c3a3639702724a87a00a28be149
+Subproject commit 28be7c90b46abdf4b3c93fe63b23d55c4fe0e4d6
diff --git a/__mocks__/reportData/transactions.ts b/__mocks__/reportData/transactions.ts
index a1f35834450e..fcc112778fc0 100644
--- a/__mocks__/reportData/transactions.ts
+++ b/__mocks__/reportData/transactions.ts
@@ -30,7 +30,7 @@ const transactionR14932: Transaction = {
     reimbursable: true,
     hasEReceipt: true,
     cardID: 0,
-    modifiedAmount: '',
+    modifiedAmount: 0,
     originalAmount: 0,
     comment: {},
     bank: '',
@@ -59,7 +59,7 @@ const transactionR98765: Transaction = {
     hasEReceipt: true,
     managedCard: false,
     billable: false,
-    modifiedAmount: '',
+    modifiedAmount: 0,
     cardID: 0,
     originalAmount: 0,
     comment: {},
diff --git a/android/app/build.gradle b/android/app/build.gradle
index 6f4e6cc2f12d..b01ebf9c8787 100644
--- a/android/app/build.gradle
+++ b/android/app/build.gradle
@@ -114,8 +114,8 @@ android {
         minSdkVersion rootProject.ext.minSdkVersion
         targetSdkVersion rootProject.ext.targetSdkVersion
         multiDexEnabled rootProject.ext.multiDexEnabled
-        versionCode 1009030701
-        versionName "9.3.7-1"
+        versionCode 1009030100
+        versionName "9.3.1-0"
         // Supported language variants must be declared here to avoid from being removed during the compilation.
         // This also helps us to not include unnecessary language variants in the APK.
         resConfigs "en", "es"
diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml
index c0579bd3370f..430e3a7875f3 100644
--- a/android/app/src/main/AndroidManifest.xml
+++ b/android/app/src/main/AndroidManifest.xml
@@ -9,7 +9,6 @@
     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
     <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
     <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
-    <uses-permission android:name="android.permission.FOREGROUND_SERVICE_LOCATION" />
     <uses-permission android:name="android.permission.HIGH_SAMPLING_RATE_SENSORS"/>
     <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION"/>
 
diff --git a/assets/animations/Fingerprint.lottie b/assets/animations/Fingerprint.lottie
deleted file mode 100644
index 722795314e72..000000000000
Binary files a/assets/animations/Fingerprint.lottie and /dev/null differ
diff --git a/assets/images/multifactorAuthentication/fingerprint.svg b/assets/images/multifactorAuthentication/fingerprint.svg
deleted file mode 100644
index f6712ca78e14..000000000000
--- a/assets/images/multifactorAuthentication/fingerprint.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" fill="none" viewBox="0 0 20 20"><path fill="#a2a9a3" d="M11 9V8a1 1 0 1 0-2 0v5.459a4.59 4.59 0 0 1-3.836 4.527 1 1 0 0 1-.328-1.972A2.59 2.59 0 0 0 7 13.459V8a3 3 0 0 1 6 0v1a1 1 0 1 1-2 0"/><path fill="#a2a9a3" d="M11 12.69v-.19a1 1 0 0 1 2 0v.19a9.6 9.6 0 0 1-1.288 4.81 1 1 0 0 1-1.733-1A7.6 7.6 0 0 0 11 12.69"/><path fill="#a2a9a3" d="M15 10.838V8A5 5 0 0 0 5 8v5a1 1 0 1 1-2 0V8a7 7 0 0 1 14 0v2.838c0 2.202-.355 4.39-1.052 6.478a1 1 0 1 1-1.896-.632A18.5 18.5 0 0 0 15 10.838"/></svg>
\ No newline at end of file
diff --git a/assets/images/multifactorAuthentication/humpty-dumpty.svg b/assets/images/multifactorAuthentication/humpty-dumpty.svg
deleted file mode 100644
index 714b4359d064..000000000000
--- a/assets/images/multifactorAuthentication/humpty-dumpty.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" width="255" height="166" fill="none" viewBox="0 0 255 166"><g clip-path="url(#a)"><path stroke="#002140" stroke-linecap="round" stroke-linejoin="round" d="M81.257 84.123V97.77m33.333-13.647V97.77m36.666-74.313v13.646m0 16.687v13.647m0 16.686V97.77m33.334-43.98v13.647m0 16.686V97.77m-16.667-60.273V53.26m0 14.59v16m0 14.587v16m-33.333-76.94V53.26m0 14.59v16m0 14.587v16m-36.667-16v16"/><path fill="#0164bf" d="M111.57 104.24a1.765 1.765 0 1 1-.003 3.53 1.765 1.765 0 0 1 .003-3.53m4.233-5.213c.977 0 1.767.79 1.767 1.763a1.765 1.765 0 0 1-3.53 0c0-.974.79-1.764 1.763-1.764m73.53-11.649v.08c-8.94 0-12 2.863-16.587 8.51-2.65 3.26-9.373 12.196-9.373 12.196l-6.353 1.177 2.746 4.547s-24.473 30.12-24.786 30.59v.233h-11.844v-.233c.054-.054 1.12-1.317 2.884-3.424 1.553-1.85 3.643-4.343 6.063-7.233 9.9-11.823 25.29-30.233 31.617-37.843.946-1.14 1.693-2.04 2.183-2.637 5.49-6.667 11.03-5.963 15.57-5.963z"/><path fill="#e96df2" d="m99.427 121.78-5.377 1.017-.01-.047c-8.314-6.587-24.157-28.94-24.157-28.94l-7.216 10.667-.174.23c-3.733-2.777-7.326-4.367-9.896-5.25l.11-.314s8.626-13.883 11.45-18.353 6.666-6.667 10.666-3.687c3.76 2.803 17.58 13.374 19.214 14.624-1.577 10.25.223 21.046 5.39 30.053"/><path fill="#e96df2" d="M94.037 91.727c.81-5.26 2.51-10.374 5.1-15.03q.57-1.026 1.189-2.017c-2.936 9.62-2.926 20.116.027 29.73l6.783-.013-1.63 10.313c5.557 9.506 15.344 16.436 26.157 18.52l.42.59c-2.42 2.89-4.51 5.383-6.063 7.233l-.217-.183H59.687v-11.61h.236l34.127-6.463 5.377-1.017c-5.167-9.007-6.967-19.803-5.39-30.053"/><path fill="#002140" d="M149.543 43.587c2.18.353 4.3 2.456 3.203 5.596l-3.843-1.647 1.253 4.157c-4.55.314-5.556-2.62-5.203-4.8a4 4 0 0 1 4.59-3.306m10.08 9.333c2.18.353 4.3 2.456 3.2 5.596l-3.843-1.646 1.256 4.157c-4.55.313-5.556-2.62-5.203-4.8a4 4 0 0 1 4.59-3.307"/><path fill="#50eef6" d="M109.52 73.867c.246-.334.586-.594.96-.777 1-.49 2.156-.423 3.2-.003.626.25 1.213.63 1.7 1.086 1.133 1.064 1.846 2.484 2.486 3.914l.27.613c.264.6.564 1.327.864 2.103.416 1.08.836 2.264 1.156 3.36l.047.144a4 4 0 0 0-.673.23q-.245.104-.484.223l-.066-.127c-2.034-.62-4.817-2.093-6.524-3.363s-3.07-3.123-3.346-5.23c-.09-.69-.054-1.427.306-2.02q.045-.075.1-.15s0-.003.004-.003"/><path fill="#50eef6" d="m118.98 84.633.066.127a9.62 9.62 0 0 0-4.376 4.387 9.5 9.5 0 0 0-.93 3.496l-.17-.01c-2.197 1.49-5.257 2.587-6.904 2.744-1.646.16-1.993-1.044-2.04-1.254-1.393-6.543-.863-13.913 4.89-20.253q-.055.075-.1.15c-.36.593-.396 1.33-.306 2.02.276 2.107 1.64 3.96 3.346 5.23s4.49 2.743 6.524 3.363"/><path fill="#50eef6" d="m114.136 95.82-.096-.007a9.5 9.5 0 0 1-.3-3.17 9.5 9.5 0 0 1 .93-3.496 9.62 9.62 0 0 1 4.86-4.61 4 4 0 0 1 .673-.23q.21-.052.423-.057c.347-.007.687.083 1.014.197 2.586.883 4.62 3.22 5.14 5.903l.013.09c-.627.11-.97.647-1.403 1.243-.934 1.28-1.65 2.71-2.194 4.2l-.22-.083c-2.94.203-5.896.213-8.84.02m25.327 5.466a2.1 2.1 0 0 1-.317.857c-.763 1.167-2.16 1.013-3.276.59-2.917-1.1-5.034-3.677-6.577-6.39-.55-.967-2.617-5.1-2.437-5.907v-.006c.13-.02.27-.02.43.003.26.037.74.237 1.317.513.637.31 1.387.714 2.09 1.114a39 39 0 0 1 2.17 1.303 26.6 26.6 0 0 1 3.477 2.78 25 25 0 0 1 1.576 1.62c.79.887 1.547 1.873 1.574 3.123q.004.2-.027.4"/><path fill="#50eef6" d="M139.146 102.143c.17-.26.274-.553.317-.856-.03.723-.25 1.47-.64 2.013-1.427 1.993-3.713 3.35-6.093 3.95-3.324.84-6.837.543-9.96-.807a2.16 2.16 0 0 1-1.277-2.216c.247-2.287.563-4.567 1.193-6.774.15-.526.32-1.053.51-1.57.544-1.49 1.26-2.92 2.194-4.2.433-.597.776-1.133 1.403-1.243q.03-.01.063-.01v.006c-.18.807 1.887 4.94 2.437 5.907 1.543 2.713 3.66 5.29 6.577 6.39 1.116.424 2.513.577 3.276-.59"/><path fill="#fed607" d="m114.04 95.813.096.007c-2.636 3.043-4.616 5.33-7 8.577l-6.783.013c-2.953-9.613-2.963-20.11-.027-29.73 1.954-3.133 4.244-6.01 6.767-8.693 2.097-2.227 4.353-4.324 6.71-6.317v13.12l-.123.297c-1.044-.42-2.2-.487-3.2.003a2.6 2.6 0 0 0-.96.777q-.005.002-.004.003c-5.753 6.34-6.283 13.71-4.89 20.253.047.21.394 1.414 2.04 1.254 1.647-.157 4.707-1.254 6.904-2.744l.17.01a9.5 9.5 0 0 0 .3 3.17"/><path fill="#fed607" d="m163.686 95.967.014.01c-6.327 7.61-21.717 26.02-31.617 37.843l-.42-.59c-10.813-2.083-20.6-9.013-26.157-18.52l1.63-10.313c2.384-3.247 4.364-5.534 7-8.577 2.944.193 5.9.183 8.84-.02l.22.083a22 22 0 0 0-.51 1.57c-.63 2.207-.946 4.487-1.193 6.774-.103.936.41 1.84 1.277 2.216a15.55 15.55 0 0 0 9.96.807c2.38-.6 4.666-1.957 6.093-3.95.39-.543.61-1.29.64-2.013q.03-.2.027-.4c-.027-1.25-.784-2.237-1.574-3.124a25 25 0 0 0-1.576-1.62l.17-.176zm-46.116 4.823a1.765 1.765 0 0 0-3.53 0 1.764 1.764 0 0 0 3.53 0m-4.237 5.217a1.765 1.765 0 1 0-3.53-.005 1.765 1.765 0 0 0 3.53.005m-53.096 8.116c.893.004 1.983-.563 2.993-1.57a6329 6329 0 0 0-6.813 8.077c.46-.763.56-1.72.516-2.44-.05-.77-.386-1.56-1.05-1.99-.81-.527-1.727-.253-2.58.21-.853.46-1.386 1.38-2.01 2.107.557-.857.757-2.03.784-3.04.016-.654-.107-1.517-.694-1.847-.69-.387-1.8-.03-2.443.417a11.2 11.2 0 0 0-2.01 1.786c.52-1.103 1.147-2.603.676-3.73-.343-.833-1.053-1.273-1.983-1.273-.933 0-2.12.7-3.113 1.91l-.084-.037 4.757-10.673.034.013c-.254.917-.437 2.064-.38 3.014.056.946.456 1.92 1.24 2.45.963.65 2.05.31 3.06-.26 1.013-.567 1.773-1.484 2.51-2.377a7.06 7.06 0 0 0-1.06 3.527c-.02.803.13 1.87.826 2.276.814.474 2.13.037 2.894-.513a13.6 13.6 0 0 0 2.38-2.203c-.617 1.363-1.36 3.21-.804 4.596.41 1.027 1.25 1.567 2.353 1.57m-4.079 17.037a7.07 7.07 0 0 0-3.584.84c-.71.383-1.56 1.04-1.57 1.84-.01.94 1.017 1.853 1.874 2.24a13.5 13.5 0 0 0 3.086.953c-1.486.147-3.456.427-4.386 1.594-.687.863-.744 1.853-.2 2.806.543.95 1.986 1.734 3.86 2.004v.056c-2.624-.163-6.164-.38-9.964-.606.72-.187 1.543-.504 2.15-.904.643-.423 1.16-1.11 1.203-1.9.057-.966-.64-1.623-1.463-2.136-.826-.51-1.886-.517-2.826-.694 1.02.057 2.136-.353 3.026-.83.574-.31 1.264-.85 1.257-1.523-.007-.787-.867-1.577-1.577-1.913a11.2 11.2 0 0 0-2.55-.854c1.217-.1 2.83-.3 3.577-1.266.55-.714.58-1.547.117-2.357-.46-.81-1.66-1.49-3.204-1.75l-.016-.077 8.263-1.986 2.193-.527.01.047c-.916.236-2.003.65-2.797 1.17-.796.52-1.443 1.346-1.516 2.286-.09 1.15.74 1.92 1.733 2.507s2.163.79 3.303.98"/><path fill="#0185ff" d="M24.94 129.653c0 1.567-.94 2.587-3.057 2.51-1.87-.07-3.616.473-4 2.973-.456-.043-3.066-.263-10.04-.543-7.763-.313-7.216-5.647-2.353-6.51 4.58-.813 11.663-2.11 12.473-2.257.637 1.714 1.72 1.794 3.293 1.71 2.98-.16 3.684.547 3.684 2.117m31.993-11.463c.044.72-.056 1.677-.517 2.44l-3.24 3.847.054.22-8.263 1.986-8.104 1.95s-2.136-2.243-4.133-5.646l.133-.08 5.647-1.41 3.916-8.794.084.037c.993-1.21 2.18-1.913 3.113-1.91.93 0 1.64.44 1.983 1.273.47 1.127-.156 2.627-.676 3.73a11.2 11.2 0 0 1 2.01-1.786c.643-.447 1.753-.804 2.443-.417.587.33.71 1.193.694 1.847-.027 1.01-.227 2.183-.784 3.04.624-.727 1.157-1.647 2.01-2.107.854-.463 1.77-.737 2.58-.21.663.43 1 1.22 1.05 1.99m9.814-9.793a1053 1053 0 0 0-3.504 4.143.02.02 0 0 0-.013.013c-1.01 1.007-2.1 1.573-2.993 1.57-1.104-.003-1.944-.543-2.354-1.57-.556-1.387.187-3.233.803-4.597-.7.827-1.503 1.567-2.38 2.204-.763.55-2.08.987-2.893.513-.696-.406-.846-1.473-.826-2.276a7.06 7.06 0 0 1 1.06-3.527c-.737.893-1.497 1.81-2.51 2.376-1.01.57-2.097.911-3.06.261-.784-.53-1.184-1.504-1.24-2.451-.057-.95.126-2.096.38-3.013l-.034-.013 1.6-3.594s1.49.224 3.813 1.02a36.7 36.7 0 0 1 9.897 5.251 37.6 37.6 0 0 1 4.253 3.69m-7.06 32.473v2.9s-1.73-.11-4.453-.277v-.057c-1.87-.27-3.313-1.053-3.856-2.003-.544-.953-.487-1.943.2-2.807.93-1.166 2.9-1.446 4.386-1.593a13.5 13.5 0 0 1-3.087-.953c-.856-.387-1.883-1.3-1.873-2.24.01-.8.86-1.457 1.57-1.84a7.06 7.06 0 0 1 3.583-.84c-1.14-.19-2.31-.394-3.303-.98-.993-.587-1.823-1.357-1.733-2.507.073-.94.72-1.767 1.517-2.287.793-.52 1.88-.933 2.796-1.169l-.01-.047 4.263-1.027z"/><path fill="#0185ff" d="M17.963 125.823c-.48-1.286-.706-3.49-.706-7.23 0-10.116 5.333-18.743 8.626-22.116 3.294-3.374 7.057-1.804 6.197 1.176-.863 2.98-2.51 5.254-2.747 14.04-.11 4.177 1.587 8.21 3.397 11.294 1.997 3.403 4.133 5.646 4.133 5.646l8.104-1.95.016.077c1.544.26 2.744.94 3.204 1.75.463.81.433 1.643-.117 2.357-.747.966-2.36 1.166-3.577 1.266.877.18 1.734.467 2.55.854.71.336 1.57 1.126 1.577 1.913.007.673-.683 1.213-1.257 1.523-.89.477-2.006.887-3.026.83.94.177 2 .184 2.826.694.824.513 1.52 1.17 1.464 2.136-.044.79-.56 1.477-1.204 1.9-.606.4-1.43.717-2.15.904-9.683-.58-21.056-1.234-23.233-1.234-3.923 0-4.237-1.96-4.237-5.413q0-.604.08-1.103c.384-2.5 2.13-3.044 4-2.974 2.117.077 3.057-.943 3.057-2.51s-.703-2.276-3.683-2.116c-1.574.083-2.657.003-3.294-1.71z"/><path fill="#e5fafe" d="M162.62 36.66c.226.31.43.637.593.983.403.85.56 1.854.237 2.734-.327.883-1.207 1.586-2.144 1.523-.45-.03-.873-.223-1.25-.473-1.133-.754-1.846-1.987-2.796-2.964-1.384-1.423-3.28-2.293-5.237-2.63s-3.977-.17-5.917.264c-1.673-2.434-3.176-4.717-4.85-7.15-4.236 3.763-7.686.393-4.08-3.06a152 152 0 0 1 2.864-2.687 121 121 0 0 1 4.576-3.977c.56-.463 1.16-.96 1.817-1.493 4.233-3.45 7.293.393 3.45 3.843l5.567 5.334h.156c5.884-3.214 10.04-1.724 12.16.11 1.15 1 2.117 1.996 3.137 3.186.637.744 1.48 1.667 1.88 2.587.217.493.387.967.443 1.45.054.41.024.83-.126 1.27-.324.953-1.2 1.713-2.134 1.647-.446-.03-.87-.24-1.243-.51-.803-.58-1.19-1.317-1.8-2.13l-.053.026q.078.151.146.307c.404.92.56 2.007.237 2.96s-1.2 1.713-2.137 1.647c-.446-.034-.87-.24-1.243-.51-.8-.58-1.56-1.534-2.173-2.347zm-15.767 108.05q.86-1.046 1.727-2.09c1.693-2.037 5.34-6.58 14.17-6.907q.496-.02 1.016-.02l9.334-.08v-4.04a3.252 3.252 0 1 1 6.506 0v16.393a3.253 3.253 0 1 1-6.506 0v-2c-1.32.01-2.69-.096-3.857.514-.69.356-1.323.84-1.813 1.44-.12.15-.247.3-.374.46-2.976 3.65-8.29 10.12-9.576 11.593-.63.72-1.397 1.357-2.307 1.647s-2.013.136-2.643-.58a2.16 2.16 0 0 1-.507-1.2l-.1.01c-.42.33-.673.416-1.18.58-.91.29-2.013.136-2.643-.58-.36-.407-.52-.944-.527-1.494h-.123c-.384.287-.644.517-1.1.66-.91.29-2.014.137-2.644-.58-.596-.68-.643-1.713-.35-2.566.294-.857.877-1.58 1.45-2.28l.49-.597-.04-.033c-.65-.01-1.283-.237-1.706-.72-.597-.68-.644-1.71-.35-2.567.293-.857.876-1.58 1.45-2.28q1.099-1.344 2.203-2.683"/><path fill="#fff2b2" d="m235.766 126.043 1.88 2.59c-17.02 12.313-28.47-1.02-28.47-1.02l.08-4.313c.027-.007.134-.014.31-.017v.094s10.277 14.746 26.12 2.746l-.016-.04zm10.194 21.177-.314 3.06c-4.076-1.02-5.646-3.45-5.646-3.45l.236-4.313s.12.036.35.096l-.036.137s1.96 3.453 5.41 4.47m7.06-2.9h.233c-.01 1.75-.153 3.686-.153 3.686s-4.474 2.197-7.454 2.274l.314-3.06c3.53-.47 7.06-2.9 7.06-2.9M224.08 153l-.1 3.53s-10.074 6.353-24.55 1.096l-.294-3.37c12.72 5.857 24.944-1.256 24.944-1.256"/><path fill="#ffed8f" d="M137.333 159.3c-10.2 5.856-20-1.257-20-1.257l10.117-5.723s1.02 4.313 9.883 6.98m115.923-15.217q0 .12-.003.24h-.233s-3.53 2.427-7.06 2.897c-3.45-1.017-5.41-4.47-5.41-4.47l.036-.137c1.36.36 6.554 1.604 12.67 1.47m-17.586-18 .016.04c-15.843 12-26.116-2.746-26.116-2.746v-.094c1.896-.05 11.686.017 11.686.017s4.827 6.857 14.414 2.783m-24.21 21.193L224.08 153s-12.224 7.113-24.944 1.256c11.054-2.666 12.324-6.98 12.324-6.98m-21.31-98.729-9.13 11.46-.18-.01.73-11.834-4.524 1.72-.026-.073 2.883-9.81.02.007 5.96.076L184 48.007l5.96.39z"/><path fill="#fff2b2" d="M181.333 35.143 179.903 40l-2.883 9.81.026.073-3.32 1.26 5.254-17.413zm13.1 12.394L180.55 64.71l.29-4.713.18.01 9.13-11.46 1.93-2.424zm-37.65 21.333.013.197a8.707 8.707 0 0 1-9.503-8.67q.002-1.087.253-2.097z"/><path fill="#fffaf0" d="m154.606 51.7.017.103a8.68 8.68 0 0 0-5.983 3.947c-1.487.353-3.057-.13-4.407-.847-2.81-1.49-4.95-3.906-6.613-6.653l.076-.047a8.71 8.71 0 0 1 8.227-5.843 8.703 8.703 0 0 1 8.703 8.703q0 .322-.02.637m-1.86-2.517c1.097-3.14-1.023-5.243-3.203-5.596a4 4 0 0 0-4.59 3.306c-.353 2.18.653 5.114 5.203 4.8l-1.253-4.156z"/><path fill="#fffaf0" d="M148.64 55.75a8.68 8.68 0 0 1 7.36-4.057 8.704 8.704 0 0 1 8.706 8.704c0 4.54-3.473 8.27-7.91 8.67l-.013-.197-9.237-10.57a8.6 8.6 0 0 1 1.094-2.55m14.183 2.767c1.1-3.14-1.02-5.244-3.2-5.597a4 4 0 0 0-4.59 3.307c-.353 2.18.653 5.113 5.203 4.8l-1.256-4.157z"/><path fill="#fffaf0" d="M147.546 58.3a8.7 8.7 0 0 0-.253 2.097 8.707 8.707 0 0 0 17.413 0 8.703 8.703 0 0 0-10.083-8.594l-.017-.103q.02-.316.02-.637a8.703 8.703 0 0 0-8.703-8.703 8.71 8.71 0 0 0-8.227 5.843l-.076.047c1.663 2.747 3.803 5.163 6.613 6.653 1.35.717 2.92 1.2 4.407.847a8.6 8.6 0 0 0-1.094 2.55m-18.29-10.093c-1.46-3.677-.58-6.687.41-7.6.52-.48 1.214-.787 1.92-.777 1.974.023 3.07 2.22 3.834 4.04l10.686-7.773c1.94-.434 3.96-.6 5.917-.264 1.957.337 3.853 1.207 5.237 2.63.95.977 1.663 2.21 2.796 2.964.377.25.8.443 1.25.473.937.063 1.817-.64 2.144-1.523.323-.88.166-1.884-.237-2.734a6 6 0 0 0-.593-.983l.08-.06c.613.813 1.373 1.767 2.173 2.347.373.27.797.476 1.243.51.937.066 1.814-.694 2.137-1.647s.167-2.04-.237-2.96a5 5 0 0 0-.146-.307l.053-.026c.61.813.997 1.55 1.8 2.13.373.27.797.48 1.243.51.934.066 1.81-.694 2.134-1.647.15-.44.18-.86.126-1.27l.344-.037 5.41-.473-5.254 17.413 3.32-1.26 4.524-1.72-.73 11.834-.29 4.713 13.883-17.173s1.947 14.503-.237 23.763c-2.59 10.98-4.706 16.077-4.706 16.077h-8.037c-4.54 0-10.08-.704-15.57 5.963-.49.597-1.237 1.497-2.183 2.637l-.014-.01h-4.353v-.117l.237-8.707-7.404 1.24-.01-.063-.586-5.883-22.707 8.47-.26.04c-.577-.277-1.057-.477-1.317-.514-.16-.023-.3-.023-.43-.003a.2.2 0 0 0-.063.01l-.013-.09c-.52-2.683-2.554-5.02-5.14-5.903-.327-.114-.667-.204-1.014-.197-.143 0-.283.023-.423.057l-.047-.144c-.32-1.096-.74-2.28-1.156-3.36l.333-.13 5.06-11.646-4.237-2h-.026l.733-4.12-7.06 1.766V59.67c4.82-4.09 10.067-7.78 15.233-11.377z"/><path fill="#0185ff" d="m159.57 87.143-.237 8.707v.117H136.51l-.17.176a26.6 26.6 0 0 0-3.477-2.78 39 39 0 0 0-2.17-1.303l.053-.093 21.42-3.584z"/><path fill="#0185ff" d="m152.156 88.32.01.063-21.42 3.584-.053.093c-.703-.4-1.453-.803-2.09-1.114l.26-.04 22.707-8.47zm-27.763-19.293-5.06 11.646-.333.13c-.3-.776-.6-1.503-.864-2.103l-.27-.613h.29l1.974-11.064h.026z"/><path fill="#0185ff" d="m120.863 62.907-.733 4.116-1.974 11.06h-.29c-.64-1.426-1.353-2.846-2.486-3.91a5.5 5.5 0 0 0-1.7-1.086l.123-.297v-8.117zm23.687-43.764.066.08a121 121 0 0 0-4.576 3.977l-.197-.213s-1.41-1.57-7.843-9.727c-6.43-8.157-18.197-6.9-18.197 7.687V59.67c-2.357 1.993-4.613 4.09-6.71 6.317l-.19-.177c.157-.783 0-23.06 0-45.49s21.02-22.117 27.293-14.277c6.274 7.844 10.354 13.1 10.354 13.1m38.396 85.704c7.674 9.59 20.72 25.906 23.72 29.67 4.314 5.41 1.884 9.02-4.783 9.02h-22.277v-7.844h18.984l-19.43-23.69-.1.08s-9.02 16.237-16.314 23.53v.1c-8.826.327-12.473 4.87-14.166 6.907q-.867 1.045-1.727 2.09H134.98v-.233c.313-.47 24.786-30.59 24.786-30.59l-2.746-4.547 6.353-1.177s6.723-8.936 9.373-12.196c4.587-5.647 7.647-8.51 16.587-8.51v-.08h.157s-.864 7.14-6.197 17.256z"/><path stroke="#002140" stroke-linecap="round" stroke-linejoin="round" d="M129.036 48.293c-5.166 3.597-10.413 7.287-15.233 11.377-2.357 1.993-4.613 4.09-6.71 6.317-2.523 2.683-4.813 5.56-6.767 8.693q-.62.99-1.19 2.017c-2.59 4.656-4.29 9.77-5.1 15.03-1.576 10.25.224 21.046 5.39 30.053l-5.376 1.017-34.127 6.463m79.07-68.013c-4.013-3.594-7.607-7.924-9.66-12.85a5 5 0 0 1-.077-.19c-1.46-3.677-.58-6.687.41-7.6.52-.48 1.214-.787 1.92-.777 1.974.023 3.07 2.22 3.834 4.04.626 1.493 1.35 2.98 2.2 4.38 1.663 2.746 3.803 5.163 6.613 6.653 1.35.717 2.92 1.2 4.407.847l.023-.007m-41.76 10.067c.157-.783 0-23.06 0-45.49s21.02-22.117 27.293-14.277c6.274 7.844 10.354 13.1 10.354 13.1"/><path stroke="#002140" stroke-linecap="round" stroke-linejoin="round" d="M139.843 22.987s-1.41-1.57-7.843-9.727c-6.43-8.157-18.197-6.9-18.197 7.687V72.79m38.22-36.957c1.957.337 3.853 1.207 5.237 2.63.95.977 1.663 2.21 2.796 2.964.377.25.8.443 1.25.473.937.063 1.817-.64 2.144-1.523.323-.88.166-1.884-.237-2.734a6 6 0 0 0-.593-.983c-.324-.45-.697-.87-1.077-1.277-1.02-1.1-2.12-2.163-3.45-2.86-1.333-.693-2.937-.983-4.353-.48"/><path stroke="#002140" stroke-linecap="round" stroke-linejoin="round" d="M152.023 35.833c-1.957-.336-3.977-.17-5.917.264-1.673-2.434-3.176-4.717-4.85-7.15-4.236 3.763-7.686.393-4.08-3.06a152 152 0 0 1 2.864-2.687 121 121 0 0 1 4.576-3.977c.56-.463 1.16-.96 1.817-1.493 4.233-3.45 7.293.393 3.45 3.843l5.567 5.334m7.25 9.693c.613.813 1.373 1.767 2.173 2.347.373.27.797.476 1.243.51.937.066 1.814-.694 2.137-1.647s.167-2.04-.237-2.96a5 5 0 0 0-.146-.307c-.397-.786-.95-1.473-1.514-2.133-1.02-1.19-2.113-2.343-3.44-3.093-1.323-.754-2.923-1.067-4.333-.52"/><path stroke="#002140" stroke-linecap="round" stroke-linejoin="round" d="M167.923 34.517c.61.813.997 1.55 1.8 2.13.373.27.797.48 1.243.51.934.066 1.81-.694 2.134-1.647.15-.44.18-.86.126-1.27-.056-.483-.226-.957-.443-1.45-.4-.92-1.243-1.843-1.88-2.587a29.5 29.5 0 0 0-3.137-3.186c-2.12-1.834-6.276-3.324-12.16-.11M135.42 43.87l10.686-7.773m27.464-1.894 5.41-.473-5.254 17.413 3.32-1.26 4.524-1.72-.73 11.834-.29 4.713 13.883-17.173-2.353-1.414-1.93 2.424-9.13 11.46"/><path stroke="#002140" stroke-linecap="round" stroke-linejoin="round" d="m178.98 33.73 2.353 1.413-1.43 4.857-2.883 9.81m2.903-9.803 5.96.076L184 48.007l5.96.39m-35.337 3.406q.676-.11 1.377-.11a8.704 8.704 0 0 1 8.706 8.704A8.704 8.704 0 0 1 156 69.103a8.707 8.707 0 0 1-8.707-8.706q.002-1.087.253-2.097a8.6 8.6 0 0 1 1.094-2.55 8.68 8.68 0 0 1 5.983-3.947"/><path stroke="#002140" stroke-linecap="round" stroke-linejoin="round" d="M160.236 61.027c-4.55.313-5.556-2.62-5.203-4.8a4 4 0 0 1 4.59-3.307c2.18.353 4.3 2.456 3.2 5.596l-3.843-1.646zm-22.54-12.824a8.71 8.71 0 0 1 8.227-5.843 8.703 8.703 0 0 1 8.703 8.703q0 .322-.02.637"/><path stroke="#002140" stroke-linecap="round" stroke-linejoin="round" d="M150.156 51.693c-4.55.314-5.556-2.62-5.203-4.8a4 4 0 0 1 4.59-3.306c2.18.353 4.3 2.456 3.203 5.596l-3.843-1.647zm-2.626 6.587.016.02 9.237 10.57m3.983-19.013a12.4 12.4 0 0 1 4.334-2.45c.806-.26 1.853-.347 2.666-.107 1.13.337 1.89 1.18 2.037 2.353s-.403 2.557-1.043 3.55c-.637.997-1.494 1.827-2.344 2.65M148.783 39.92a7.07 7.07 0 0 1 4.977 1.853 7.05 7.05 0 0 1 2.223 4.82m13.43 28.394-2.363-1.48"/><path stroke="#002140" stroke-linecap="round" stroke-linejoin="round" d="m125.803 64.24 1.207-2.42c.813-.627 1.66-1.27 2.66-1.513 1-.247 2.2.02 2.746.89.517.823.317 1.886.174 2.846-.144.964-.147 2.1.603 2.72.527.437 1.293.477 1.95.29.66-.183 1.247-.553 1.85-.88 1.44-.78 3.34-1.26 4.623-.243.92.727 1.207 2 1.2 3.17-.006 1.173-.246 2.343-.123 3.51.127 1.163.73 2.39 1.84 2.773 1.09.377 2.29-.176 3.177-.916.883-.74 1.57-1.877 2.563-2.46 1.333-.787 2.403-.62 3.24.173.573.543.783 1.363 1.2 2.037 1.443 2.336 3.75 1.57 4.41 1.34 1.303-.464 1.963-1.87 2.623-3.084.664-1.216 1.727-2.503 3.107-2.383.75.067 1.42.573 1.793 1.23.37.653.474 1.437.404 2.187l-1.247 2.343m-41.02-15.14 1.963 1.177m.11 28.55c-.18.806 1.887 4.94 2.437 5.906 1.543 2.713 3.66 5.29 6.577 6.39 1.116.423 2.513.577 3.276-.59.17-.26.274-.553.317-.857m0 0q.03-.2.027-.4c-.027-1.25-.784-2.236-1.574-3.123a25 25 0 0 0-1.576-1.62 26.6 26.6 0 0 0-3.477-2.78 39 39 0 0 0-2.17-1.303c-.703-.4-1.453-.803-2.09-1.114-.577-.276-1.057-.476-1.317-.513-.16-.023-.3-.023-.43-.003a.2.2 0 0 0-.063.01c-.627.11-.97.647-1.403 1.243-.934 1.28-1.65 2.71-2.194 4.2-.19.517-.36 1.044-.51 1.57-.63 2.207-.946 4.487-1.193 6.773-.103.937.41 1.84 1.277 2.217a15.55 15.55 0 0 0 9.96.807c2.38-.6 4.666-1.957 6.093-3.95.39-.544.61-1.29.64-2.014m0 0c.02-.363-.01-.723-.09-1.046"/><path stroke="#002140" stroke-linecap="round" stroke-linejoin="round" d="M126.78 90.35c-.52-2.683-2.554-5.02-5.14-5.903-.327-.114-.667-.204-1.014-.197a2 2 0 0 0-.423.056c-.23.054-.453.137-.673.23q-.245.105-.484.224a9.62 9.62 0 0 0-4.376 4.386 9.5 9.5 0 0 0-.93 3.497 9.5 9.5 0 0 0 .3 3.17l.096.007c2.944.193 5.9.183 8.84-.02m-13.46-21.93q-.055.075-.1.15c-.36.593-.396 1.33-.306 2.02.276 2.107 1.64 3.96 3.346 5.23s4.49 2.743 6.524 3.363m1.176-.47c-.32-1.096-.74-2.28-1.156-3.36-.3-.776-.6-1.503-.864-2.103l-.27-.613c-.64-1.43-1.353-2.85-2.486-3.914a5.5 5.5 0 0 0-1.7-1.086c-1.044-.42-2.2-.487-3.2.003a2.6 2.6 0 0 0-.96.777"/><path stroke="#002140" stroke-linecap="round" stroke-linejoin="round" d="m109.57 73.81-.05.057q-.005.002-.004.003c-5.753 6.34-6.283 13.71-4.89 20.253.047.21.394 1.414 2.04 1.254 1.647-.157 4.707-1.254 6.904-2.744"/><path stroke="#002140" stroke-linecap="round" stroke-linejoin="round" d="m100.363 74.56-.037.12c-2.936 9.62-2.926 20.116.027 29.73l6.783-.013m7.017-8.597s-.013.013-.017.02c-2.636 3.043-4.616 5.33-7 8.577l-1.63 10.313c5.557 9.507 15.344 16.437 26.157 18.52"/><path stroke="#002140" stroke-linecap="round" stroke-linejoin="round" d="M113.333 106.007a1.764 1.764 0 1 1-1.763-1.767c.976 0 1.763.79 1.763 1.767m4.237-5.217a1.765 1.765 0 0 1-3.53 0 1.764 1.764 0 0 1 3.53 0m-23.373-8.94-.16-.123c-1.634-1.25-15.454-11.82-19.214-14.624-4-2.98-7.843-.783-10.666 3.687s-11.45 18.353-11.45 18.353"/><path stroke="#002140" stroke-linecap="round" stroke-linejoin="round" d="M94.04 122.75c-8.314-6.587-24.157-28.94-24.157-28.94l-7.216 10.667m-44.704 21.35c.637 1.713 1.72 1.793 3.294 1.71 2.98-.16 3.683.546 3.683 2.116s-.94 2.587-3.057 2.51c-1.87-.07-3.616.474-4 2.974q-.08.499-.08 1.103c0 3.453.314 5.413 4.237 5.413 2.177 0 13.55.654 23.233 1.234 3.8.226 7.34.443 9.96.606 2.724.167 4.454.277 4.454.277v-20.627l-4.264 1.027-2.193.527-8.263 1.986-8.104 1.95s-2.136-2.243-4.133-5.646c-1.81-3.084-3.507-7.117-3.397-11.294.237-8.786 1.884-11.06 2.747-14.04.86-2.98-2.903-4.55-6.197-1.176s-8.626 12-8.626 22.116c0 3.74.226 5.944.706 7.23"/><path stroke="#002140" stroke-linecap="round" stroke-linejoin="round" d="M63.243 112.54c1.393-1.654 2.64-3.13 3.503-4.143a37.6 37.6 0 0 0-4.253-3.69c-3.733-2.777-7.327-4.367-9.897-5.25-2.323-.797-3.813-1.02-3.813-1.02l-1.6 3.593-4.757 10.673-3.916 8.793-5.647 1.41m20.314 1.571 3.24-3.847c1.996-2.37 4.59-5.447 6.813-8.077M18.04 125.81s-.027 0-.077.013c-.81.15-7.893 1.447-12.473 2.26-4.863.863-5.41 6.197 2.353 6.51 6.974.28 9.584.5 10.04.543a.3.3 0 0 1 .077.007"/><path stroke="#002140" stroke-linecap="round" stroke-linejoin="round" d="M47.217 102.043c-.254.917-.437 2.064-.38 3.014.056.946.456 1.92 1.24 2.45.963.65 2.05.31 3.06-.26 1.013-.567 1.773-1.484 2.51-2.377a7.06 7.06 0 0 0-1.06 3.527c-.02.803.13 1.87.826 2.276.814.474 2.13.037 2.894-.513a13.6 13.6 0 0 0 2.38-2.203c-.617 1.363-1.36 3.21-.804 4.596.41 1.027 1.25 1.567 2.353 1.57.894.004 1.984-.563 2.994-1.57a9 9 0 0 0 .693-.783m-7.61 9.02q.055-.08.103-.16c.46-.763.56-1.72.517-2.44-.05-.77-.386-1.56-1.05-1.99-.81-.527-1.727-.253-2.58.21-.853.46-1.386 1.38-2.01 2.107.557-.857.757-2.03.784-3.04.016-.654-.107-1.517-.694-1.847-.69-.387-1.8-.03-2.443.417a11.2 11.2 0 0 0-2.01 1.786c.52-1.103 1.147-2.603.677-3.73-.344-.833-1.054-1.273-1.984-1.273-.933 0-2.12.7-3.113 1.91m12.923 11.477c-.917.236-2.003.65-2.797 1.17-.796.52-1.443 1.346-1.516 2.286-.09 1.15.74 1.92 1.733 2.507s2.163.79 3.303.98a7.07 7.07 0 0 0-3.583.84c-.71.383-1.56 1.04-1.57 1.84-.01.94 1.017 1.853 1.874 2.24.986.44 2.023.76 3.086.953-1.486.147-3.456.427-4.386 1.594-.687.863-.744 1.853-.2 2.806.543.95 1.986 1.734 3.86 2.004m-10.094-.517q.066-.014.13-.033c.72-.187 1.543-.504 2.15-.904.643-.423 1.16-1.11 1.203-1.9.057-.966-.64-1.623-1.463-2.136-.826-.51-1.886-.517-2.826-.694 1.02.057 2.136-.353 3.026-.83.574-.31 1.264-.85 1.257-1.523-.007-.787-.867-1.577-1.577-1.913a11.2 11.2 0 0 0-2.55-.854c1.217-.1 2.83-.3 3.577-1.266.55-.714.58-1.547.117-2.357-.46-.81-1.66-1.49-3.204-1.75m14.704 14.11h66.116m68.63-93.333s1.947 14.503-.237 23.763c-2.59 10.98-4.706 16.077-4.706 16.077h-8.037c-4.54 0-10.08-.704-15.57 5.963-.49.597-1.237 1.497-2.183 2.637-6.327 7.61-21.717 26.02-31.617 37.843-2.42 2.89-4.51 5.383-6.063 7.233a363 363 0 0 1-2.884 3.424m43.92 3.903c-2.976 3.65-8.29 10.12-9.576 11.593-.63.72-1.397 1.357-2.307 1.647s-2.013.137-2.643-.58a2.15 2.15 0 0 1-.507-1.2 3.1 3.1 0 0 1 .157-1.37c.293-.857.876-1.577 1.45-2.277a737 737 0 0 1 9.233-11.086m10.237-9.651v-3.883a3.252 3.252 0 1 1 6.506 0v16.393a3.253 3.253 0 1 1-6.506 0v-2c-1.32.01-2.69-.096-3.857.514-.69.356-1.323.84-1.813 1.44-.12.15-.247.3-.374.46"/><path stroke="#002140" stroke-linecap="round" stroke-linejoin="round" d="M151.923 159.85c-.42.33-.673.417-1.18.58-.91.29-2.013.137-2.643-.58-.36-.407-.52-.943-.527-1.493a3.1 3.1 0 0 1 .177-1.077c.293-.857.876-1.577 1.45-2.28q4.562-5.586 9.233-11.087"/><path stroke="#002140" stroke-linecap="round" stroke-linejoin="round" d="M147.45 158.36c-.384.283-.644.513-1.1.656-.91.29-2.014.137-2.644-.579-.596-.68-.643-1.714-.35-2.567.294-.857.877-1.58 1.45-2.28l.49-.597a755 755 0 0 1 8.744-10.49"/><path stroke="#002140" stroke-linecap="round" stroke-linejoin="round" d="M145.256 152.96c-.65-.01-1.283-.237-1.706-.72-.597-.68-.644-1.71-.35-2.567.293-.856.876-1.58 1.45-2.28q1.099-1.344 2.203-2.683.86-1.045 1.727-2.09c1.693-2.037 5.34-6.58 14.17-6.907q.496-.02 1.016-.02l9.334-.08m4.156-37.883 5.69 7.117c7.674 9.59 20.72 25.906 23.72 29.67 4.314 5.41 1.884 9.02-4.783 9.02h-22.197"/><path stroke="#002140" stroke-linecap="round" stroke-linejoin="round" d="m174.98 106.907 4.18 5.096 19.43 23.69h-18.824m9.724-48.316s-.864 7.14-6.197 17.256"/><path stroke="#002140" stroke-linecap="round" stroke-linejoin="round" d="M179.06 112.083s-9.02 16.237-16.314 23.53m-39.61 9.097h23.767m-11.923-.234c.313-.47 24.786-30.589 24.786-30.589l-2.746-4.547 6.353-1.177s6.723-8.936 9.373-12.196c4.587-5.647 7.647-8.51 16.587-8.51m-71.177-9.374 1.974-11.06.733-4.116-7.06 1.766m6.353 2.354 4.237 2-5.06 11.646m11.413 11.294 21.42-3.584 7.404-1.24-.237 8.707m4.353.117H136.51m-7.647-5.06 22.707-8.47.586 5.883m-14.823 70.98c-8.863-2.667-9.883-6.98-9.883-6.98l-10.117 5.723s9.8 7.113 20 1.257"/><path stroke="#002140" stroke-linecap="round" stroke-linejoin="round" d="m117.333 158.043.08 3.53s8.077 6.354 19.687 1.1l.233-3.373m61.803-5.044c11.054-2.666 12.324-6.98 12.324-6.98L224.08 153s-12.224 7.113-24.944 1.256"/><path stroke="#002140" stroke-linecap="round" stroke-linejoin="round" d="m224.08 153-.1 3.53s-10.074 6.353-24.55 1.096l-.294-3.37m46.51-3.976c2.98-.077 7.454-2.273 7.454-2.273s.143-1.937.153-3.684q.004-.12.003-.24c-6.116.134-11.31-1.11-12.67-1.47-.23-.06-.35-.096-.35-.096L240 146.83s1.57 2.43 5.646 3.45"/><path stroke="#002140" stroke-linecap="round" stroke-linejoin="round" d="M253.02 144.32s-3.53 2.43-7.06 2.9c-3.45-1.017-5.41-4.47-5.41-4.47m5.096 7.53.314-3.06m-10.29-21.137.096-.04 1.88 2.59c-17.02 12.314-28.47-1.02-28.47-1.02l.08-4.313c.027-.007.134-.013.31-.017 1.9-.05 11.69.017 11.69.017s4.827 6.857 14.414 2.783"/><path stroke="#002140" stroke-linecap="round" stroke-linejoin="round" d="M209.57 123.377s10.273 14.746 26.116 2.746"/></g><defs><clipPath id="a"><path fill="#fff" d="M.5.5h254v165H.5z"/></clipPath></defs></svg>
\ No newline at end of file
diff --git a/assets/images/multifactorAuthentication/open-padlock.svg b/assets/images/multifactorAuthentication/open-padlock.svg
deleted file mode 100644
index 0b905305ec0c..000000000000
--- a/assets/images/multifactorAuthentication/open-padlock.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" width="134" height="116" fill="none" viewBox="0 0 134 116"><path fill="#d18000" d="m24.677 51.131-.595-5.064s.893-1.335-3.264-1.335c-4.156 0-11.278.266-11.278.266s-2.372.265-2.372 2.13v4.003h17.517zm55.301 0-.595-5.064s.892-1.335-3.264-1.335-11.279.266-11.279.266-2.371.265-2.371 2.13v4.003h17.517z"/><path fill="#e4bc07" d="m133.325 43.751-.659-15.049S126.387-.174 98.556.718c-27.832.892-34.022 27.566-34.022 27.566l-1.632 15.821 15.041-.354.073-12.983s4.646-15.62 20.636-15.813 19.198 15.99 19.198 15.99l1.865 14.318s5.442 1.31 8.947 1.543 4.663-3.055 4.663-3.055"/><path fill="#ff7101" d="M84.6 51.662H1.38v28.539s.803 34.673 44.279 34.407c28.539 0 39.48-25.604 39.745-36.272S84.6 51.662 84.6 51.662"/><path fill="#bf3013" d="M9.651 51.397H1.38v29.608s3.2 32.277 37.342 33.073c0 0-27.743-6.938-29.608-37.607-1.07-17.067.53-25.074.53-25.074z"/><path fill="#d18000" d="M45.393 58.334s7.203 4.534 7.203 9.334-3.2 10.668-5.064 11.206l4.003 24.544 6.134-1.069-3.738-25.074s6.399-4.27 5.338-9.334c-1.07-5.065-4.8-11.472-13.868-9.599z"/><path fill="#002140" d="M47.524 78.874s5.25-4.71 5.25-9.872c0-5.16-4.977-9.96-8.892-9.96s-6.464 6.592-6.4 7.999c.057 1.415 2.316 8.36 5.154 10.314l-4.8 25.428s11.022 2.315 13.691.619l-4.004-24.544z"/><path stroke="#002140" stroke-linecap="round" stroke-linejoin="round" d="M85.18 51.453v24.865c0 21.11-17.116 38.226-38.227 38.226S8.727 97.429 8.727 76.318V51.453h76.46z"/><path stroke="#002140" stroke-linecap="round" stroke-linejoin="round" d="M48.826 114.552c-34.166 0-47.455-17.115-47.455-38.226V51.461h9.687"/><path stroke="#002140" stroke-linecap="round" stroke-linejoin="round" d="M59.036 68.456c0-5.957-4.831-10.789-10.788-10.789S37.459 62.5 37.459 68.456c0 3.93 2.107 7.356 5.242 9.245l-5.37 24.648s9.148 5.394 20.17 0l-4.462-24.246c3.545-1.769 5.99-5.419 5.99-9.655z"/><path stroke="#002140" stroke-linecap="round" stroke-linejoin="round" d="m51.174 103.289-4.462-24.246c3.546-1.768 5.99-5.418 5.99-9.655 0-5.217-3.698-9.566-8.618-10.571M6.813 50.939V46.99c0-1.318 1.23-2.38 2.75-2.38h12.364c1.52 0 2.75 1.07 2.75 2.38v3.947m37.439.002V46.99c0-1.318 1.23-2.38 2.749-2.38h12.364c1.52 0 2.75 1.07 2.75 2.38v3.947"/><path stroke="#002140" stroke-linecap="round" stroke-linejoin="round" d="M77.944 44.612v-9.768c0-11.383 9.229-20.604 20.604-20.604 11.384 0 20.604 9.229 20.604 20.604v9.68"/><path stroke="#002140" stroke-linecap="round" stroke-linejoin="round" d="M133.326 44.507V35.48c0-19.197-15.564-34.761-34.762-34.761-19.197 0-34.76 15.564-34.76 34.761v9.125"/><path stroke="#002140" stroke-linecap="round" stroke-linejoin="round" d="M119.152 44.515s2.171 2.347 8.039 2.347 6.134-2.355 6.134-2.355"/></svg>
\ No newline at end of file
diff --git a/assets/images/multifactorAuthentication/running-out-of-time.svg b/assets/images/multifactorAuthentication/running-out-of-time.svg
deleted file mode 100644
index 99fe012af555..000000000000
--- a/assets/images/multifactorAuthentication/running-out-of-time.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" width="219" height="200" fill="none" viewBox="0 0 219 200"><g clip-path="url(#a)"><path fill="#fed607" d="m165.65 32.847-.822.313a1.37 1.37 0 0 1-1.852-1.28c0-.556.337-1.08.884-1.287l1.374-.522 2.381-.904.479-.183.483-.184 2.342-.889 1.73-.658a1.373 1.373 0 0 1 1.854 1.28c0 .554-.336 1.08-.884 1.287l-.797.302z"/><path fill="#e4bc07" d="m166.745 35.938-1.095-3.092 7.172-2.724.093.247 1.008 3.006.062.183v.104c-3.671 2.605-6.496 2.433-7.22 2.333z"/><path fill="#5ab0ff" d="M184.291 83.85c.135.77-.175 1.468-.693 1.56-.516.092-1.046-.46-1.181-1.228-.135-.771.175-1.469.693-1.56.519-.091 1.046.458 1.181 1.229m2.816-8.078c.135.769-.175 1.467-.693 1.558-.519.091-1.048-.458-1.184-1.229-.132-.769.178-1.467.694-1.558.518-.09 1.048.458 1.183 1.23m.323-9.507c.251 1.43-.327 2.73-1.289 2.9-.964.17-1.949-.854-2.2-2.285-.25-1.433.328-2.731 1.292-2.9.961-.171 1.947.853 2.197 2.284m-3.5-8.604c.135.771-.175 1.469-.693 1.56-.519.091-1.048-.46-1.181-1.229-.135-.77.175-1.469.693-1.56.516-.09 1.046.46 1.181 1.23m-4.251-6.988c.135.77-.175 1.467-.694 1.558s-1.048-.458-1.181-1.229c-.135-.769.175-1.466.694-1.557.516-.092 1.045.457 1.181 1.228m-6.23-3.908c.084.49.073.964-.016 1.382l-.046.033-2.57-3.527.051-.037q.178-.1.381-.136c.964-.169 1.947.853 2.2 2.285m-7.688 3.28c.135.77-.177 1.468-.693 1.56-.519.09-1.048-.46-1.183-1.23s.175-1.468.693-1.56c.519-.09 1.048.46 1.183 1.23m-3.598 11.844c.135.769-.175 1.467-.693 1.558-.519.09-1.046-.458-1.181-1.23-.135-.768.175-1.466.693-1.557.517-.091 1.046.458 1.181 1.229m3.988 18.744c.135.77-.175 1.467-.693 1.558-.519.093-1.046-.458-1.181-1.227s.175-1.468.693-1.56c.516-.09 1.046.458 1.181 1.23m4.38 5.568c.133.77-.177 1.467-.693 1.558-.519.091-1.048-.458-1.183-1.229-.135-.769.175-1.467.693-1.558.519-.09 1.048.458 1.183 1.23m8.235 3.464c.25 1.433-.328 2.73-1.292 2.9-.961.17-1.947-.854-2.197-2.285-.251-1.43.325-2.73 1.289-2.9s1.947.854 2.2 2.285"/><path fill="#0185ff" d="m172.603 65.035.006.011c-.328.21-.6.536-.8.945l-.144-.013-7.116-9.491-1.564 1.568-1.719-6.353 5.707 2.196-1.486 1.648 7.014 9.352z"/><path fill="#0185ff" d="m173.387 48.182 1.249 1.716-3.128.393 2.346 14.353-.04.178a1.63 1.63 0 0 0-1.205.224l-.006-.01-.102-.138.024-.018-2.346-14.353-3.049.313 3.049-7.06.638.875z"/><path fill="#0185ff" d="M176.092 67.815c.33 1.883-.428 3.59-1.695 3.811-1.265.223-2.559-1.122-2.889-3.002-.173-.99-.044-1.93.301-2.633.2-.409.472-.736.8-.945a1.63 1.63 0 0 1 1.205-.224c1.046.213 2.003 1.413 2.278 2.993"/><path fill="#fcdcff" d="m125.943 65.918.175.022c-.33 3.064-2.918 5.449-6.059 5.449a6.09 6.09 0 0 1-5.149-2.838l.142-.091c.534.135 1.088.2 1.639.193.521-.009 1.144-.158 1.316-.653.138-.391-.095-.838-.434-1.076s-.76-.318-1.167-.393l-2.367-.431h-.022a6 6 0 0 1-.057-.829c0-3.378 2.729-6.118 6.099-6.118 2.76 0 5.091 1.84 5.84 4.365l-.186.053c-.459.173-.887.313-1.367.689-.388.304-.618.8-.634 1.293-.009.273.073.571.297.73.301.212.716.09 1.061-.039z"/><path fill="#e4bc07" d="M216.938 102.213c.39 2.509 1.017 8.705.547 9.802-.332.78-1.562 1.005-2.162.865h-.113c.004-1.236-.146-2.254-.383-2.789l.077-.036c.08-2.275.235-4.235-.352-7.033l-.055-.009q.046-.245-.009-.591c-.053-.324-.284-1.095-.366-1.413a15 15 0 0 0-.193-.691c1.551-.391 2.756.275 3.009 1.895"/><path fill="#fed607" d="M214.827 110.091c.237.535.387 1.553.383 2.787-.009 2.106-.479 4.84-1.766 6.851q-.076.12-.162.231c-.633.858-1.42 1.209-1.661 1.389a2 2 0 0 1-.355.215c-.347.165-.633.138-.83-.009-.335-.249-.891-1.035-1.179-1.475-.268-.411-.191-.72.06-1.009.139-.165.339-.32.56-.487a4.35 4.35 0 0 0 1.197-1.373c.766-1.358.875-3.042.839-4.287-.013-.566-.06-1.042-.084-1.353a5 5 0 0 1-.02-.833c.042-.554.251-.623.594-.892.782-.157 1.952-.406 2.266-.026a1.1 1.1 0 0 1 .158.271m-.898-9.773q.107.35.193.691c.082.317.313 1.089.366 1.413q.055.346.009.591c-.049.282-.189.469-.375.558-.374.184-1.511.367-2.031.42-.45.044-.672-.133-.811-.442-.098-.214-.158-.491-.228-.8a22 22 0 0 0-.472-1.743c-.503-1.593-1.175-3.008-2.101-4.349a17 17 0 0 0-1.655-2.026 2 2 0 0 1-.389-.562c-.28-.663.217-1.094.547-1.425.259-.209.286-.289.625-.524.248-.171.469-.231.671-.218.352.02.64.256.893.48a14 14 0 0 1 1.874 2.042c1.407 1.865 2.322 3.973 2.884 5.894"/><path fill="#e4bc07" d="M213.325 119.991c1.092 1.204 1.037 2.324-.217 3.398-1.917 1.637-6.882 4.626-8.813 4.851-.84.098-1.383-.749-1.536-1.349l-.029-.058c.514-.26 1.031-.551 1.558-.9.277-.184.591-.373.733-.684l.129.069c2.641-.989 3.89-1.929 6.13-3.723l-.013-.031q.167-.076.354-.215c.242-.18 1.028-.531 1.662-1.389zm-1.345-27.389c.182.807-.275 1.32-.933 1.82a14 14 0 0 0-1.874-2.04c-.253-.224-.541-.46-.893-.48l.007-.2c-1.511-1.673-4.378-4.078-6.254-5.28l-.136-.055a35 35 0 0 0 .82-2.243l.016.005a33.8 33.8 0 0 1 8.768 7.64c.206.25.412.517.481.833zm-.067 20.322-.188.007c-.541.009-1.852.035-2.215-.367-.364-.4-.384-1.653-.39-2.195-.054-4.051-.523-6.091-.47-7.765.035-1.126 1.289-1.562 1.823-1.595h.107q.264.831.471 1.74c.071.309.131.586.229.8l-.076.022c.26 2.249.574 3.975.574 7.164h.031c-.018.205-.011.471.02.836.024.311.071.787.084 1.353m-2.645 6.089a29 29 0 0 1-6.039 3.8l.004.007q-.14.059-.301.158c-.614.377-1.243.715-1.861 1.026l-.08-.375c-.257-.478-.706-1.403-.52-1.911.186-.509.846-.934 1.342-1.147 3.866-1.653 6.802-4.389 7.336-4.44 1.116-.113 1.573.573 1.847 1.035l.078.045c-.293.52-.683.991-1.197 1.373-.221.167-.42.322-.56.487zm-.789-22.355-.09.064c-.439.367-.729.68-1.303.889-.658.24-1.301-.465-1.93-1.047-2.085-1.933-3.7-3.293-5.838-4.913l-.106-.071c.459-.711.891-1.454 1.296-2.22l.27.147c1.153.853 3.525 2.933 5.577 4.6l.08-.038c.073.17.197.358.389.562a17 17 0 0 1 1.655 2.027"/><path fill="#fed607" d="M205.043 124.535c.084.298.062.527-.022.714-.142.311-.456.5-.733.684-.528.349-1.044.64-1.558.9-.808.409-1.613.74-2.448 1.104l-.235.047a34 34 0 0 0-.744-3.122c.565-.273 1.163-.553 1.768-.858a25 25 0 0 0 1.861-1.026q.16-.1.301-.156c.933-.384 1.285.467 1.52.951.113.313.179.365.29.762m-38.278-88.54c.724.1 3.549.272 7.22-2.333v-.104l-.062-.183h.004c13.45-1.864 26.81 11.294 30.049 29.785 1.318 7.529.759 14.798-1.261 20.964a35 35 0 0 1-.82 2.242h-.002a32 32 0 0 1-1.385 2.994 30 30 0 0 1-1.296 2.22h-.002c-3.409 5.309-8.252 8.969-14.033 9.989-7.277 1.282-14.577-1.88-20.311-7.951a35.6 35.6 0 0 1-3.285-4.045l-.107-.12a10 10 0 0 1-1.005-2.035c5.013 7.788 12.094 12.097 19.159 10.85 11.013-1.942 17.568-17.066 14.639-33.781-2.928-16.718-14.229-28.694-25.242-26.754-6.496 1.145-11.441 6.874-13.803 14.811 2.034-7.324 6.064-13.277 11.452-16.562q.037.007.091.013"/><path fill="#f68dfe" d="m182.756 121.238.326-.125c1.329-2.744 3.651-2.853 5.082-2.195.864.4 1.458 1.06 1.947 1.833l.164-.107c.547-2.511 2.608-3.624 4.263-3.246 1.765.402 2.86 2.162 3.529 3.848q.706 1.779 1.236 3.616c.295 1.031.547 2.071.744 3.122q.327 1.69.47 3.405c.842 10.224-.208 21.048-5.058 30.082-1.542 2.873-3.48 5.515-5.574 8.013-2.8 3.34-5.875 6.376-10.166 7.08h-.235c-1.961.347-4.462-.862-5.317-2.667s-.765-4.268-.235-6.195c.372-1.349 1.001-2.753 1.606-4.107.259-.578.512-1.144.74-1.698 1.808-4.377 2.736-8.968 2.969-13.624.221-4.407-.184-8.871-1.059-13.262a68 68 0 0 0-1.582-6.289c-.182-.605-.372-1.211-.521-1.827-.166-.671-.281-1.351-.288-2.042-.013-1.369.441-2.771 1.398-3.749.955-.978 2.437-1.464 3.746-1.073.723.215 1.316.649 1.815 1.207"/><path fill="#e4bc07" d="M154.387 71.524v-.009l-.024-.142c-1.093-6.666-.718-13.115.842-18.755q.008-.038.02-.074c2.361-7.937 7.306-13.666 13.802-14.81 11.013-1.94 22.314 10.035 25.243 26.753 2.928 16.715-3.627 31.84-14.64 33.782-7.065 1.246-14.146-3.062-19.159-10.851-.488-1.345-.683-2.79-.485-4.196a9.3 9.3 0 0 1 .841-2.74l.065.033c4.014 9.274 10.884 15.116 17.513 13.947 8.691-1.531 13.678-14.535 11.135-29.044-2.542-14.512-11.647-25.032-20.34-23.5-8.195 1.444-13.094 13.086-11.499 26.575l.113.114c-1.378 1.384-2.41 3.144-3.021 5.03a47 47 0 0 1-.342-1.748l-.062-.365z"/><path fill="#ffed8f" d="M189.537 65.418c2.544 14.508-2.443 27.513-11.134 29.044-6.629 1.169-13.499-4.673-17.513-13.947l-.065-.033a9.2 9.2 0 0 1 2.191-2.878c1.44-1.262 3.257-2.058 4.606-3.42 1.256-1.273 2.045-3.142 1.615-4.882-.385-1.56-1.714-2.787-3.241-3.276-1.526-.486-3.212-.3-4.708.276-1.32.509-2.488 1.309-3.476 2.304l-.113-.113c-1.595-13.489 3.303-25.13 11.498-26.575 8.694-1.531 17.799 8.989 20.34 23.5m-3.396 3.748c.962-.168 1.54-1.468 1.29-2.9-.251-1.43-1.237-2.455-2.198-2.284-.964.169-1.542 1.467-1.292 2.9.251 1.431 1.236 2.456 2.2 2.284m.273 8.165c.518-.091.828-.789.693-1.558-.135-.77-.665-1.32-1.183-1.229-.516.091-.826.79-.693 1.558.135.771.664 1.32 1.183 1.229m-2.816 8.08c.518-.093.828-.791.693-1.56-.135-.771-.662-1.32-1.181-1.229-.518.091-.828.789-.693 1.56.135.769.665 1.32 1.181 1.229m-.361-26.189c.518-.091.828-.789.693-1.56-.135-.769-.665-1.32-1.181-1.229-.518.091-.828.79-.693 1.56.133.77.662 1.32 1.181 1.23m-4.252-6.989c.519-.09.829-.789.694-1.558-.135-.77-.665-1.32-1.181-1.228-.519.09-.829.788-.694 1.557.133.771.663 1.32 1.181 1.23m-1.511 40.336c.964-.17 1.542-1.467 1.292-2.9-.253-1.431-1.236-2.454-2.2-2.285s-1.54 1.47-1.289 2.9c.25 1.431 1.236 2.456 2.197 2.285m-3.077-20.943c1.267-.222 2.025-1.928 1.695-3.81-.275-1.58-1.232-2.78-2.278-2.994l.04-.178-2.346-14.353 3.128-.393-1.249-1.716.046-.033c.089-.418.1-.891.016-1.383-.253-1.43-1.236-2.453-2.2-2.284a1.2 1.2 0 0 0-.381.136l-.051.037-.638-.875-3.049 7.06 3.049-.314 2.346 14.354-.024.018-7.014-9.351 1.486-1.65-5.707-2.195 1.719 6.353 1.564-1.569 7.116 9.492.144.013c-.345.702-.474 1.642-.301 2.633.33 1.88 1.624 3.225 2.889 3.002m-4.559 16.136c.516-.091.826-.789.693-1.558-.135-.77-.665-1.32-1.183-1.229-.518.092-.829.79-.693 1.558.135.771.664 1.32 1.183 1.23m-4.38-5.569c.518-.09.828-.789.693-1.558-.135-.77-.664-1.32-1.181-1.229-.518.092-.828.79-.693 1.56s.662 1.32 1.181 1.227m-.39-30.586c.516-.092.828-.79.693-1.56s-.664-1.32-1.183-1.23c-.518.092-.828.79-.693 1.56s.664 1.32 1.183 1.23m-3.598 11.842c.518-.091.829-.79.693-1.558-.135-.771-.664-1.32-1.18-1.229-.519.091-.829.789-.694 1.558.135.771.663 1.32 1.181 1.229"/><path fill="#0185ff" d="M118.415 164.958c-3.93 4.537-13.45 11.977-28.437 5.975a41 41 0 0 1-2.838-1.271l-.014.013c-1.703-1.704-2.23-4.244-2.488-6.644a19 19 0 0 1-.075-.88l.23-.018c6.022 1.491 11.5.133 15.659-3.062 4.159-3.196 6.702-8.5 6.292-13.738-.306-3.909-1.967-9.187-1.542-13.082l-.049-.078c9.963-6.3 21.845-10.351 33.341-11.06 2.41-.149 4.854-.167 7.209.362 2.357.529 6.205 2.305 7.377 4.58l.027.06.057.031a69 69 0 0 1 .906 8.3l-.046.194c3.558 3.266 7.24 6.475 11.465 8.811 4.143 2.291 8.749 4.258 13.538 4.811l.22.011c-.233 4.656-1.161 9.247-2.969 13.625-.228.553-.481 1.12-.74 1.697l-.275-.122c-9.998 1.067-20.311-.151-29.806-3.464-3.47 3.135-7.77 5.366-12.349 6.284-4.648.933-11.72.311-14.613-1.258z"/><path fill="#e4bc07" d="M171.894 132.675c1.51.163 3.724.156 5.636.02l.141-.033q.28 1.17.517 2.349l-.191.038a32.7 32.7 0 0 1-8.614-.309c-.31-.051-.631-.114-.886-.3-.653-.474-.658-1.142-.509-1.929l.011-.167c1.008.256 1.965.416 2.769.414.417-.003.884-.029 1.159-.423zm4.925-3.235-.229.066c-.959.067-3.086.04-4.865.085l-.055.107a2.2 2.2 0 0 0-.643-.185 30 30 0 0 1-2.558-.491l.004-.027c.086-.566.095-.993.383-1.533.333-.618 1.281-.522 2.136-.507 1.89.036 3.456.02 5.08-.057h.013c.149.613.339 1.22.521 1.824q.11.357.213.718"/><path fill="#99f6ff" d="m175.297 13.782-4.396 14.082.018.047-2.342.889-.091-.242 2.149-12.96-.066-.194z"/><path fill="#99f6ff" d="m175.296 13.782-4.727 1.622-2.313.794-.1-.291 1.664-5.865-.033-.095.192-.067z"/><path fill="#fed607" d="M171.67 129.697c.664.329.587.932.558 1.405-.055.329-.022.407-.12.807a1.3 1.3 0 0 1-.181.426c-.275.394-.742.42-1.159.422-.804.003-1.761-.157-2.769-.413-2.138-.542-4.504-1.507-6.102-2.227-1.074-.484-1.803-.86-1.883-.924a1.2 1.2 0 0 1-.173-.171c-.33-.398-.352-.927-.243-1.189.157-.387.531-.973.886-1.36a.9.9 0 0 1 .545-.298c.428-.069.917.156 1.382.402l.264.14c2.005 1.056 3.596 1.774 5.793 2.305.765.184 1.604.347 2.559.491.268.04.479.104.643.184"/><path fill="#ccf6ff" d="m170.569 15.404.066.194-2.149 12.96.091.242-.483.184-.055-.146-3.735-10.96-.1-.291.933-.32 2.572-.883.547-.186z"/><path fill="#ccf6ff" d="m169.787 9.947.033.095-1.664 5.865.1.29-.548.187-.099-.289-4.894-3.615-.033-.098 1.575-.54z"/><path fill="#f68dfe" d="M160.468 87.418c.257.715.599 1.4 1.006 2.035l.107.12a35.6 35.6 0 0 0 3.285 4.045 75 75 0 0 1-1.528 1.924l-.091-.076c-2.202-3.277-6.088-7.41-9.124-9.933l-.438-.031c.751-.707 1.466-1.573 1.557-2.602.06-.691-.195-1.371-.507-1.987-1.32-2.6-3.709-4.515-5.096-7.08-.396-.733-.711-1.544-.669-2.378.047-.884.49-1.695.957-2.446 1.168-1.878 2.349-3.345 3.727-5.071h.035a46 46 0 0 0 .672 7.435q.011.072.024.142v.01l.062.364q.156.882.341 1.749c.612-1.887 1.644-3.647 3.022-5.032.988-.995 2.156-1.795 3.476-2.304 1.495-.576 3.181-.762 4.708-.276 1.526.49 2.856 1.716 3.241 3.276.43 1.74-.359 3.609-1.615 4.882-1.349 1.362-3.166 2.158-4.606 3.42a9.2 9.2 0 0 0-2.191 2.878 9.3 9.3 0 0 0-.842 2.74c-.197 1.407-.002 2.851.485 4.196z"/><path fill="#99f6ff" d="m168.039 28.838.055.146-.478.182-.085-.222-9.659-8.97-.066-.192 2.317-.796.547-.186 2.57-.882.964-.331.1.29z"/><path fill="#99f6ff" d="m167.609 16.095.099.29-2.572.881-.932.32-.964.332-2.57.882-.1-.291 1.662-5.865-.033-.095.483-.167.033.098z"/><path fill="#ccf6ff" d="m167.531 28.944.085.223-2.382.904-.091-.24-12.061-8.429 4.724-1.62.066.191z"/><path fill="#4ed7de" d="m163.247 95.466.091.076c-1.775 2.167-3.678 4.227-5.803 6.044-2.815 2.407-6.484 4.514-10.031 5.567l-.064.029a91 91 0 0 0-2.954-6.153c-1.528-2.903-3.11-5.727-4.958-8.465a55 55 0 0 0-2.04-2.838l.084-.064c3.675.942 7.167.111 10.435-1.02 2.16-.749 4.083-1.647 5.678-3.14l.439.031c3.035 2.522 6.921 6.656 9.123 9.933"/><path fill="#e4bc07" d="M162.655 123.635c1.32.643.645 2.345.434 2.838l-.414.245-.264-.14c-.465-.247-.955-.472-1.382-.403l-.016-.106c-2.12-.774-3.631-1.723-6.473-3.151l-.013.02a3 3 0 0 0-.282-.178 34 34 0 0 1-1.859-1.122l-.124.028-.079-.34.115-.028c.237-.489.718-1.385 1.252-1.465 1.043-.158 2.277.705 2.762.94 3.636 1.769 4.841 2.133 6.343 2.862"/><path fill="#ccf6ff" d="m162.199 12.549.033.095-1.662 5.865.1.29-.547.188-.1-.29-4.896-3.617-.033-.096 5.53-1.895z"/><path fill="#e4bc07" d="m161.898 130.118-.007.015c-.332 1.593-1.4 2.282-2.971 1.778-1.207-.387-3.257-1.205-5.1-2.04l-.122.015a69 69 0 0 0-.534-3.74c1.972 1.08 3.806 2.169 6.538 2.889l.14-.013q.073.09.172.171c.08.065.809.44 1.884.925"/><path fill="#99f6ff" d="m160.023 18.698.1.288-2.317.796-4.724 1.62 1.819-6.351.193-.067.033.096z"/><path fill="#fed607" d="M154.527 122.938c.844.615.503 1.24.285 1.733-.168.289-.164.371-.396.713-.388.571-.864.542-1.303.407h-.009v.002a73 73 0 0 0-.839-4.127l.124-.028c.556.364 1.169.733 1.858 1.122q.16.09.282.178z"/><path fill="#4ed7de" d="m153.105 125.793.059.353-.057-.031-.027-.06c-1.172-2.275-5.02-4.051-7.377-4.58-2.355-.529-4.799-.511-7.209-.362-11.496.709-23.378 4.76-33.341 11.06a69 69 0 0 0-6.755 4.862L98.21 137a76 76 0 0 1 .514-2.367q.177-.773.352-1.551.168-.752.333-1.509c.605-2.791 1.147-5.604 1.502-8.429l.069.009c10.086.313 16.868-2.94 23.587-7.187 4.015-2.537 7.269-5.968 8.392-7.48a34 34 0 0 0 2.597-4.075 36 36 0 0 0 2.204-4.887 34 34 0 0 0 1.768-6.96c1.848 2.738 3.43 5.563 4.958 8.465a91 91 0 0 1 2.954 6.153c1.978 4.553 3.595 9.304 4.743 14.144l.08.34q.48 2.055.839 4.127z"/><path fill="#f68dfe" d="M52.539 16.011s.013.013.017.013zm22.4 62.984c-1.358-.624-2.548-1.606-3.294-2.904 1.644 1.162 3.919 1.229 5.753.4 1.832-.831 3.126-2.113 3.94-3.958a7.2 7.2 0 0 1-5.426.271c-2.185-.775-4.044-2.793-4-5.118 1.184 1.66 3.525 2.376 5.43 1.658a5.8 5.8 0 0 0 1.543-.895c1.867-1.474 2.984-3.78 3.278-6.142.297-2.365-.653-6.056-1.697-8.774l.007-.15c-7.145-.35-13.966-4.279-18.333-10.012l-.06-.111a30.5 30.5 0 0 0 6.804-4.996l.109.111q.464.465.955.905c4.169 3.731 9.595 6.158 15.182 6.242.08 0 .047-.058-.024-.093-3.516-6.81-8.596-12.48-14.94-16.756-2.757-1.86-5.757-3.429-8.952-4.3l-.035.14c1.039 3.214 2.337 6.251 3.999 8.956q.319.522.658 1.029l.172.189a38 38 0 0 1-6.298 4.702l-.095-.158q-.262-.464-.508-.931a53 53 0 0 1-1.759-3.696v-.08a2.39 2.39 0 0 0 2.267-2.39c0-1.283-1.068-2.392-2.384-2.392-.57 0-1.095.2-1.504.533l-.025-.03-.913-2.439c-1.9-5.06-4.098-10.17-7.878-14.026l.038-.038c2.111.38 3.92.918 5.587 2.267-.252-.271-2.051-3.905-2.538-6.031 1.798 2.43 3.496 3.882 5.815 5.244 2.038 1.196 4.243 2.073 6.42 2.989 4.143 1.742 8.246 3.653 12.083 5.982a52 52 0 0 1 5.373 3.716c2.552 2.024 4.905 4.358 6.874 6.96l.253-.191a28.06 28.06 0 0 1 8.667-10.145c-.576.747-.76 1.62-1.017 2.527-.612 2.167-1.227 4.353-1.35 6.6 1.817-2.991 4.157-5.685 6.798-7.973-.547 2.89-.802 5.9-.694 8.84a19.1 19.1 0 0 1 5.774-.447c4.411.315 8.729 2.098 11.97 5.109 2.72 2.526 4.67 5.775 7.255 8.442q.946.975 1.994 1.833.642.527 1.316 1.007a14 14 0 0 0 1.91 1.167 8 8 0 0 0 1.728.635c1.325.31 2.798.187 3.928-.575 1.13-.763 1.819-2.231 1.449-3.547.941 1.518 1.159 3.484.594 5.18-.563 1.695-1.753 3.138-3.184 4.204a9 9 0 0 1-2.238 1.24c2.335.678 5.083-.24 7.008-1.726.848-.658 1.635-1.531 1.743-2.602.634 2.422-.048 5-1.652 6.917-1.604 1.92-3.966 3.114-6.421 3.574 1.66.882 3.733.477 5.528-.076 1.573-.487 3.157-1.287 3.992-2.707.06 2.811-.937 5.53-2.758 7.667a11.65 11.65 0 0 1-7.22 3.947l-.306-.014c-.135 3.087-.292 6.127-.609 9.147-.273 2.602-.665 5.189-1.267 7.78-.452 1.949-1.48 4.456-2.639 6.082a8.36 8.36 0 0 1-3.011 2.603c-.645.328-1.336.573-2.056.642-1.216.113-2.455-.31-3.412-1.074a4 4 0 0 1-.183-.153c-.909-.795-1.529-1.893-1.828-3.067l-.242.065q-.59.363-1.216.673c-1.65.822-3.452 1.365-5.279 1.676a23.6 23.6 0 0 1-4.451.317l-.027.018c-2.229-3.44-5.273-6.31-9.059-7.77-4.643-1.792-9.983-1.259-14.522.781q-1.073.484-2.091 1.065c2.317-1.73 4.17-4.34 5.5-7.342-1.969.717-4.01 1.329-6.105 1.369-1.693.033-3.516-.467-4.967-1.412a7 7 0 0 1-.962-.744q.446.085.9.115.253.023.505.023a8.33 8.33 0 0 0 5.056-1.64c.693-.52 1.291-1.08 1.778-1.7.79-1.005 1.283-2.167 1.42-3.571l-.02-.012c-.416.78-1.22 1.283-2.044 1.6a7.3 7.3 0 0 1-2.131.467 7.4 7.4 0 0 1-3.729-.698m51.179-13.055a6.05 6.05 0 0 0-.219-2.422 6.1 6.1 0 0 0-5.84-4.365c-3.37 0-6.099 2.74-6.099 6.118a6.15 6.15 0 0 0 .95 3.28 6.09 6.09 0 0 0 5.149 2.838c3.141 0 5.729-2.385 6.059-5.45m-.071 23.064a5.9 5.9 0 0 0-.042-1.873c-.275-1.453-1.345-2.796-2.78-3.131-1.434-.336-3.122.56-3.428 2.007-.031.146-.071.115-.082.264-.857-4.696-.983-9.72-.257-14.438-1.573 4.88-2.344 10.289-1.903 15.398.042.48.109.987.209 1.493.21 1.074.564 2.15 1.123 3.002.822 1.256 2.377 2.143 3.824 1.754 1.052-.282 1.956-1.15 2.507-2.091a6.5 6.5 0 0 0 .829-2.385m-6.948-36.384a8.7 8.7 0 0 0 .195-1.842 8.69 8.69 0 0 0-3.753-7.16 8.6 8.6 0 0 0-4.909-1.53 8.65 8.65 0 0 0-7.389 4.152l-.031.1a9.4 9.4 0 0 0-2.86-.442c-5.224 0-9.46 4.249-9.46 9.49 0 5.243 4.236 9.492 9.46 9.492 3.837 0 7.143-2.291 8.627-5.587l.155.045q.73.127 1.498.129c4.154 0 7.626-2.932 8.467-6.847"/><path fill="#0164bf" d="M137.625 99.473a51 51 0 0 0-4.732-2.309l-.257-.009c1.218-3.217 1.836-6.882 1.652-11.177l.007-.007a50 50 0 0 1 3.193 3.755q1.074 1.401 2.04 2.838a34.2 34.2 0 0 1-1.768 6.96z"/><path fill="#0164bf" d="m137.625 99.473.135.051a36 36 0 0 1-2.204 4.887l-.166-.093q-2.342-1.416-4.684-2.836l-.181-.038a25.3 25.3 0 0 0 2.111-4.289l.257.01a51 51 0 0 1 4.732 2.308"/><path fill="#0164bf" d="m135.39 104.318.166.093a34 34 0 0 1-2.597 4.075c-1.123 1.512-4.377 4.943-8.392 7.48-6.719 4.247-13.501 7.5-23.588 7.187l-.068-.009c.259-2.06.418-4.124.425-6.189h.191c1.887.278 4.399.138 6.265-.257 7.012-1.494 13.718-4.843 18.669-10.043 1.536-1.613 2.911-3.333 4.063-5.211l.182.038q2.342 1.42 4.684 2.836"/><path fill="#4ed7de" d="M100.982 111.495a42 42 0 0 0-11.319 1.834c-5.17 1.584-10.153 4.286-13.534 8.52l-.031.037c-5.736-.026-11.108-3.337-13.771-8.433h-.158l-.221-.018h.356c2.466-4.335 4.95-8.691 8.065-12.584a39 39 0 0 1 4.14-4.456 31 31 0 0 1 2.87-2.337 27 27 0 0 1 2.359-1.518 25 25 0 0 1 2.091-1.065c4.54-2.04 9.879-2.573 14.522-.782 3.787 1.46 6.831 4.331 9.059 7.771a26.5 26.5 0 0 1 1.788 3.227q.14.296.273.595l.051-.022a21.7 21.7 0 0 0 5.363-.753c2.036-.549 3.975-1.391 5.687-2.489l.065-.087c.957.765 2.195 1.187 3.411 1.074.72-.07 1.412-.314 2.056-.642a8.36 8.36 0 0 0 3.011-2.603c1.159-1.626 2.187-4.133 2.639-6.082.602-2.591.994-5.178 1.267-7.78l.139.016a48 48 0 0 1 3.135 3.053l-.006.007c.184 4.295-.435 7.96-1.653 11.177a25.3 25.3 0 0 1-2.111 4.289c-1.152 1.878-2.528 3.598-4.063 5.211-4.952 5.2-11.658 8.549-18.67 10.043-1.865.395-4.378.535-6.265.26h-.191a37.4 37.4 0 0 0-.352-5.403v-.06z"/><path fill="#002140" d="M126.156 65.271q-.001.34-.038.669l-.175-.022-.873.326c-.345.13-.76.251-1.061.038-.224-.158-.306-.456-.297-.729.016-.493.246-.989.634-1.293.48-.376.908-.516 1.367-.689l.186-.053c.168.555.257 1.144.257 1.753m-.151 21.859a5.8 5.8 0 0 1 .042 1.874l-.177-.02c-.729-.575-2.763-.629-3.702.26l-.115.107a3.5 3.5 0 0 0-1.243-.829 3.56 3.56 0 0 0-2.902.171l-.144.031c-.1-.506-.166-1.013-.209-1.493-.44-5.109.331-10.518 1.904-15.398-.727 4.718-.601 9.742.257 14.438.011-.149.051-.118.082-.264.305-1.447 1.993-2.343 3.427-2.007 1.435.335 2.505 1.678 2.78 3.13"/><path fill="#cf4cd9" d="m122.053 89.35.115-.106c.939-.889 2.973-.835 3.702-.26l.177.02a6.5 6.5 0 0 1-.828 2.385c-.552.942-1.456 1.809-2.508 2.09-1.447.39-3.002-.497-3.824-1.753-.558-.853-.913-1.928-1.123-3.002l.144-.03a3.56 3.56 0 0 1 2.902-.172c.467.182.893.469 1.243.829"/><path fill="#002140" d="M119.295 50.778q-.002.951-.195 1.842l-.102-.022a4.8 4.8 0 0 1-2.09.477 4.79 4.79 0 0 1-4.078-2.275l.033-.022 2.362-1.938-3.113-.576a4.81 4.81 0 0 1 3.399-4.602l.031-.044a8.7 8.7 0 0 1 3.753 7.16"/><path fill="#fffaf0" d="M112.83 50.8a4.79 4.79 0 0 0 4.079 2.275c.748 0 1.457-.17 2.089-.477l.102.022c-.842 3.915-4.314 6.847-8.468 6.847a8.7 8.7 0 0 1-1.497-.13l-.156-.044a9.4 9.4 0 0 0 .623-1.893 9.5 9.5 0 0 0 .213-2.011 9.49 9.49 0 0 0-6.602-9.05l.031-.1a8.65 8.65 0 0 1 12.298-2.621l-.031.044a4.81 4.81 0 0 0-3.399 4.602l3.113.576-2.362 1.938z"/><path fill="#fed607" d="m118.636 98.935-.064.087c-1.712 1.098-3.651 1.94-5.687 2.489l-.018-.067a44 44 0 0 0 2.302-4.989h-.002a16 16 0 0 0 1.216-.675l.242-.065c.299 1.174.919 2.271 1.828 3.067q.09.08.183.153"/><path fill="#002140" d="M117.573 66.924c.339.238.572.685.434 1.076-.172.495-.795.644-1.316.653a6.4 6.4 0 0 1-1.639-.193l-.142.091a6.1 6.1 0 0 1-.893-2.449h.022q1.184.212 2.367.429c.407.075.828.155 1.167.393"/><path fill="#fed607" d="M115.167 96.453h.002a44 44 0 0 1-2.301 4.991l.017.067a21.7 21.7 0 0 1-5.363.753l-.051.022q-.133-.299-.273-.595l.115-.053c.933-1.24 1.768-2.04 2.601-3.35l-.026-.16c1.828-.31 3.629-.853 5.279-1.675"/><path fill="#fed607" d="m109.888 98.129.026.16c-.833 1.309-1.668 2.109-2.601 3.349l-.115.053a26.5 26.5 0 0 0-1.788-3.227l.027-.017a23.6 23.6 0 0 0 4.451-.318"/><path fill="#002140" d="M109.815 55.389a9.5 9.5 0 0 1-.213 2.01l-.113-.024a5.2 5.2 0 0 1-2.28.523 5.22 5.22 0 0 1-4.453-2.487l.033-.022 2.581-2.118-3.4-.627a5.25 5.25 0 0 1 3.711-5.029l.033-.046a9.49 9.49 0 0 1 4.101 7.82"/><path fill="#fffaf0" d="M102.756 55.411a5.22 5.22 0 0 0 4.453 2.487 5.2 5.2 0 0 0 2.28-.523l.113.025a9.4 9.4 0 0 1-.623 1.893c-1.484 3.296-4.789 5.587-8.626 5.587-5.224 0-9.46-4.249-9.46-9.491s4.236-9.491 9.46-9.491c.996 0 1.958.155 2.86.442a9.3 9.3 0 0 1 2.501 1.229l-.033.046a5.25 5.25 0 0 0-3.711 5.03l3.401.626-2.581 2.118zm3.988 89.922c.41 5.238-2.133 10.542-6.292 13.738s-9.637 4.553-15.659 3.062l-.23.018c-.078-1.12-.06-2.256.122-3.342l.186.031c2.778 1.242 6.54 1.037 9.378-.06 2.526-.976 4.836-2.558 6.54-4.667 1.706-2.107 2.876-4.751 2.871-7.464-.006-3.029-1.772-6.738-1.743-12.203l-.047-.064a69 69 0 0 1 3.283-2.209l.049.078c-.425 3.895 1.236 9.173 1.542 13.082"/><path fill="#f68dfe" d="m105.018 33.769-.024.31a19.1 19.1 0 0 0-5.774.447c-.108-2.94.147-5.948.694-8.84-2.641 2.29-4.98 4.983-6.797 7.974.122-2.247.737-4.433 1.349-6.6.257-.907.44-1.78 1.017-2.527a28.06 28.06 0 0 0-8.667 10.145l-.252.19c-1.97-2.602-4.323-4.935-6.875-6.96a52 52 0 0 0-5.372-3.715l.055-.09c-1.276-3.95-2.555-7.899-3.895-11.823-1.154-3.376-2.415-6.833-4.827-9.453l.026-.08c2.546.8 5.663 2.833 5.758 2.833A32 32 0 0 1 70.18.54l.093-.016c.993 1.923 2.369 3.236 4.013 4.396 7.439 5.247 16.38 8.404 22.865 14.8 4.203 4.144 6.618 8.271 7.867 14.049"/><path fill="#0185ff" d="M103.66 146.649c.005 2.713-1.165 5.357-2.871 7.464-1.704 2.109-4.014 3.691-6.54 4.667-2.838 1.097-6.6 1.302-9.378.06l-.186-.031c.228-1.365.72-2.649 1.615-3.727q.676.183 1.369.247c2.506.226 5.102-.705 7.019-2.372 2.268-1.973 3.489-4.524 3.939-7.502a12.2 12.2 0 0 1-.829-3.657c-.109-1.609.1-3.209.412-4.798l.188.035a64 64 0 0 1 3.472-2.653l.047.064c-.029 5.465 1.736 9.174 1.743 12.203"/><path fill="#0164bf" d="M101.07 112.206c.193 1.58.275 3.165.266 4.749-.007 2.065-.166 4.129-.425 6.189-.355 2.825-.898 5.638-1.502 8.429l-.125-.027c-1.468-.74-3.473-1.962-3.959-3.537-.177-.576-.183-1.189-.177-1.791.04-3.245.408-6.485 1.093-9.656.112-.52.239-1.049.522-1.498.282-.442.698-.778 1.121-1.086.75-.549 2.094-1.292 2.911-1.727z"/><path fill="#fbccff" d="m98.868 133.035.208.047q-.175.778-.352 1.551A74 74 0 0 0 98.21 137c-.312 1.589-.52 3.189-.412 4.798a12.2 12.2 0 0 0 .829 3.657c-.45 2.978-1.67 5.529-3.94 7.503-1.916 1.666-4.512 2.597-7.018 2.371l.018-.254c-.47-2.195-1.194-3.937-2.504-5.413-1.307-1.473-3.423-2.698-5.39-2.742-1.13-.027-2.22.315-3.186.9l-.024-.04c.009-.04-.352-1.327-.339-2.46.027-2.009.405-3.631 1.043-5.069l.058-.105a58 58 0 0 1 4.017 2.392 50 50 0 0 1 5.175 3.846q.634.537 1.232 1.091c.62.574 1.227 1.163 1.898 1.676.237.18.497.355.791.389.636.071 1.168-.578 1.217-1.218.088-1.107-.676-2.456-1.11-3.433a30 30 0 0 0-.758-1.587 37 37 0 0 0-1.141-2.069c-.975-1.644-2.063-3.22-3.208-4.749a84 84 0 0 0-1.553-2.013 58 58 0 0 0-.813-1.011l.137-.111c1.073-.736 2.778-1.403 4.068-1.574 2.463 1.02 4.712 2.325 6.95 3.776-.862-1.549-1.8-2.918-2.885-4.316 2.395-.093 5.707.703 7.506 1.8"/><path fill="#ff7101" d="M90.565 144.889c.434.977 1.198 2.326 1.11 3.433-.05.64-.581 1.289-1.217 1.218-.294-.034-.554-.209-.79-.389-.672-.513-1.279-1.102-1.9-1.676a37 37 0 0 0-1.231-1.091l.08-.093c.21-1.882 1.772-2.929 2.973-2.876l.217-.113q.402.783.757 1.587"/><path fill="#f68dfe" d="M77.542 196.609q-.05.038-.1.071c-1.298.88-2.99 1.269-4.472.755a3.88 3.88 0 0 1-2.409-4.713l-.055-.12q-.503.24-1.04.433c-1.125.409-2.873.756-3.987.314-1.548-.614-2.444-2.503-2.198-4.154.246-1.653 1.325-3.073 2.595-4.155s2.742-1.891 4.11-2.847c1.364-.956 3.194-2.173 3.938-3.667 1.407-2.824.552-6.28.078-8.784-.869-4.593-2.191-8.042-1.877-12.707.16-2.346.658-4.649 1.901-6.644a7.94 7.94 0 0 1 2.581-2.571c.966-.585 2.056-.927 3.186-.9 1.967.044 4.083 1.269 5.39 2.742 1.31 1.475 2.034 3.218 2.504 5.413l-.018.254a8 8 0 0 1-1.37-.247c-.894 1.078-1.386 2.362-1.614 3.727-.182 1.086-.2 2.222-.122 3.342q.028.443.075.88c.257 2.4.784 4.94 2.488 6.644l.013-.013c.966.478 1.912.898 2.839 1.271l-.025.062c.392 7.531.098 13.64-1.125 18.567-.822 3.315-2.167 6.915-4.894 8.964-.957.718-2.174.947-3.363.863-1.19-.085-2.581-1.256-2.894-2.589z"/><path fill="#ff7101" d="m89.807 143.302-.217.113c-1.201-.053-2.763.994-2.973 2.876l-.08.093a50 50 0 0 0-5.175-3.847l.042-.064c-.355-1.942.655-4.424 2.346-5.438.414-.249 1.376-.651 1.668-.522l.04-.029c1.145 1.529 2.233 3.105 3.208 4.749.4.678.784 1.367 1.14 2.069"/><path fill="#ff7101" d="m85.458 136.484-.04.029c-.292-.129-1.254.273-1.668.522-1.69 1.014-2.7 3.496-2.346 5.438l-.042.064a58 58 0 0 0-4.017-2.391q-.602-.33-1.212-.642l.06-.115c-.671-1.558-.804-3.872-.157-5.438.647-1.569 2.242-3.189 3.91-3.66l.144-.149c1.074 1.031 2.056 2.158 3.002 3.318q.412.5.813 1.011a84 84 0 0 1 1.553 2.013"/><path fill="#cf4cd9" d="M85.106 45.429c.07.035.104.093.024.093-5.587-.084-11.013-2.511-15.182-6.242a25 25 0 0 1-.955-.905l-.109-.11q.177-.172.35-.345c.306-.307 1.25-1.434.86-2.14-.419-.756-.705-1.334-1.33-2.038-.37-.415-.657-.971-1.174-1.178-.782-.313-2.113.358-2.346.865l-.066.04c-1.662-2.705-2.96-5.742-3.999-8.956l.035-.14c3.195.871 6.195 2.44 8.953 4.3C76.51 32.95 81.59 38.62 85.106 45.43"/><path fill="#fed607" d="m82.844 77.627.02.01c-.138 1.405-.632 2.567-1.42 3.572l-.091-.071a8.6 8.6 0 0 0-3.74.862l-.004-.23a8.5 8.5 0 0 1 1.068-1.95l-.01-.127a7.3 7.3 0 0 0 2.132-.466c.824-.318 1.628-.82 2.045-1.6"/><path fill="#ff7101" d="M79.835 129.895q.129.12.255.247l-.144.149c-1.668.471-3.263 2.091-3.91 3.66-.647 1.567-.514 3.88.157 5.438l-.06.115a59 59 0 0 0-6.006-2.686l.018-.045c-.886-1.987-1.139-3.991-.782-5.907.356-1.917 1.825-4.288 4.38-5.124l.029-.06a25 25 0 0 1 5.217 3.456q.432.367.846.757"/><path fill="#f68dfe" d="m61.214 134.931-.514.107c-2.011.497-4.145-.814-5.16-2.625a7 7 0 0 1-.478-1.058l-.22.083c-1.348.062-2.633-.767-3.384-1.896-.751-1.127-1.033-2.509-1.086-3.864-.122-3.096.906-6.24 2.909-8.598q.155-.183.321-.36c1.985-2.109 5.113-3.5 8.346-3.285l.221.018h.158c2.663 5.096 8.035 8.407 13.77 8.433l.032-.037.22.18c2.45.942 3.91 4.184 2.815 6.902l-.175.207a25 25 0 0 0-5.632-3.658c-.704-.334-2.607-1.12-4.61-1.809l-.055-.06a10.97 10.97 0 0 0-3.235 5.613c-.312 1.398-.339 2.894.168 4.234.508 1.337 2.092 2.604 3.479 2.951l.064.113c-1.03 1.378-3.01 1.838-4.646 1.309-1.429-.46-2.579-1.573-3.308-2.9"/><path fill="#fed607" d="m78.668 79.693.008.127c-.438.6-.8 1.258-1.067 1.95l.004.23a8.6 8.6 0 0 0-3 2.37l-.004.179q-.253 0-.505-.023l.013-.186a11.45 11.45 0 0 1-.233-4.789 5.6 5.6 0 0 1 1.055-.556q.35.164.716.294a7.4 7.4 0 0 0 3.013.404m-1.33 14.309.04.056a31 31 0 0 0-2.869 2.337l-.141-.144c-1.423-1.236-2.927-3.167-3.76-5.1l.057-.025c1.642 1.232 3.483 2.072 5.528 1.936l.024-.024q.534.526 1.121.964"/><path fill="#fed607" d="m73.672 89.104.2-.046c.088.386.207.76.352 1.108.442 1.067 1.154 2.045 1.993 2.872l-.024.024c-2.045.136-3.886-.704-5.528-1.936l-.057.025a8.3 8.3 0 0 1-.578-1.893c-.226-1.374-.226-2.82.062-4.187l.022.004a8.4 8.4 0 0 0 3.558 4.03"/><path fill="#fed607" d="m74.166 85.155-.007.011c-.547 1.143-.587 2.592-.288 3.892l-.199.046a8.4 8.4 0 0 1-3.558-4.029l-.022-.004c.228-1.102.645-2.153 1.276-3.076.702-1.022 1.664-1.886 2.517-2.444a11.45 11.45 0 0 0 .232 4.789l-.013.186a8 8 0 0 1-.9-.115c.295.273.619.522.962.744"/><path fill="#ff7101" d="M73.357 125.48q.209.096.415.202l-.03.06c-2.554.836-4.023 3.207-4.38 5.124-.356 1.916-.103 3.92.783 5.907l-.018.045a44 44 0 0 0-.815-.305l-.144.009-.064-.113c-1.387-.347-2.971-1.614-3.479-2.951-.507-1.34-.48-2.836-.168-4.234a10.97 10.97 0 0 1 3.235-5.613l.055.06c2.003.689 3.906 1.475 4.61 1.809"/><path fill="#fed607" d="M59.71 39.389a38 38 0 0 0 6.299-4.703l-.173-.188q-.339-.506-.658-1.03l.066-.04c.233-.506 1.564-1.177 2.347-.864.516.207.804.763 1.174 1.178.624.705.91 1.282 1.329 2.038.39.706-.554 1.833-.86 2.14q-.173.173-.35.344a30.5 30.5 0 0 1-7.517 5.367c-.46.233-.97.46-1.48.362-.545-.107-.946-.56-1.304-.984-.559-.663-1.117-1.362-1.336-2.2-.29-1.107.795-2.014 1.586-2.362l.275-.147q.245.467.507.93zm-2.479-9.647a2.39 2.39 0 0 1 2.384 2.391 2.366 2.366 0 0 1-2.269 2.391q-.055.003-.115.002a2.39 2.39 0 0 1-2.386-2.393c0-.749.343-1.418.882-1.858a2.38 2.38 0 0 1 1.504-.533"/><path fill="#ff7101" d="m53.518 116.642.084.078q-.165.177-.321.36c-2.003 2.358-3.03 5.502-2.909 8.598.053 1.355.335 2.737 1.086 3.864l-.235.016c-.791.128-2.085-.314-2.659-.994-.518-.613-.888-1.555-.99-2.351q-.073-.563-.097-1.104c-.03-.569-.02-1.123.026-1.671a15 15 0 0 1 .26-1.827c.106-.529.239-1.062.396-1.611l.04-.14c.11-.376.272-.76.478-1.129.452-.805 1.11-1.533 1.868-1.931 1.068-.562 2.045-.42 2.973-.158"/><path fill="#03d47c" d="m48.511 118.631.166.1a5.6 5.6 0 0 0-.478 1.129l-.04.14-.22-.063c-6.985-1.508-16.212-1.515-21.98-1.288-.529.02-1.07 0-1.563-.187-.421-.16-.809-.482-.955-.9a1 1 0 0 1-.058-.222c-.068-.489.198-.978.579-1.291a3 3 0 0 1 1.327-.611c5.082-.938 14.83.264 23.222 3.193"/><path fill="#03d47c" d="m47.94 119.938.219.062c-.157.549-.29 1.082-.397 1.611h-.188c-2.5-.507-6.733-.991-9.278-1.098-6.868-.291-17.081-.198-25.44.947v-.007c-1.146-.522-.778-1.835-.335-2.351.443-.513 1.086-.844 1.748-.987 2.705-.582 6.206-.584 9.117-.531l.055-.022c.146.418.534.74.955.9.494.187 1.034.207 1.564.187 5.767-.227 14.994-.22 21.98 1.289"/><path fill="#03d47c" d="M47.574 121.611h.188a15 15 0 0 0-.259 1.826l-.093-.006c-9.832-1.618-19.297-1.734-28.768 1.369-1.23.402-2.39.777-3.46 1.411l-.031-.051c-5.421.731-7.382 1.842-10.326 2.315-1.35.218-3.036.258-3.738-.918-.47-.784-.246-1.842.324-2.557.569-.714 1.406-1.171 2.262-1.485 2.472-.904 5.665-1.573 9.183-2.055 8.359-1.145 18.572-1.238 25.44-.947 2.545.107 6.779.591 9.278 1.098"/><path fill="#03d47c" d="m47.41 123.431.093.007a12 12 0 0 0-.027 1.671l-.11.004c-5.734-.784-9.95-1.073-15.956.225-4.582.991-8.92 2.857-13.32 4.477-1.107.407-1.375.576-2.523.843-.86.197-1.914.262-2.47-.425-.341-.422-.38-1.031-.21-1.544a3.9 3.9 0 0 1 .959-1.483c.428-.397.873-.72 1.336-.995 1.07-.633 2.23-1.009 3.46-1.411 9.471-3.102 18.936-2.987 28.768-1.369"/><path stroke="#002140" stroke-linecap="round" stroke-linejoin="round" d="M157.699 68.493c-1.595-13.489 3.303-25.13 11.498-26.575 8.694-1.531 17.799 8.989 20.34 23.5 2.544 14.508-2.443 27.513-11.134 29.044-6.629 1.169-13.499-4.673-17.513-13.947m-5.668-27.971c2.034-7.324 6.064-13.277 11.452-16.562l.071-.044.044-.027m-12.428 35.462c-1.093-6.666-.718-13.115.841-18.755m-.401 21.072-.011-.052a49 49 0 0 1-.341-1.75l-.062-.364"/><path stroke="#002140" stroke-linecap="round" stroke-linejoin="round" d="M173.927 33.373c13.45-1.862 26.809 11.296 30.048 29.787 1.319 7.529.76 14.798-1.26 20.964a36 36 0 0 1-.82 2.243h-.002a32 32 0 0 1-1.385 2.993 30 30 0 0 1-1.296 2.22h-.002c-3.41 5.309-8.253 8.969-14.033 9.989-7.277 1.282-14.577-1.88-20.311-7.951a35.6 35.6 0 0 1-3.285-4.045"/><path stroke="#002140" stroke-linecap="round" stroke-linejoin="round" d="M154.777 73.507a46 46 0 0 1-.39-1.983v-.009l-.024-.142a46 46 0 0 1-.672-7.435c-.033-4.056.499-7.894 1.514-11.32q.008-.038.02-.074c2.361-7.937 7.306-13.666 13.802-14.81 11.013-1.94 22.314 10.035 25.243 26.753 2.928 16.715-3.627 31.84-14.64 33.782-7.065 1.246-14.146-3.062-19.159-10.851l-.038-.056"/><path stroke="#002140" stroke-linecap="round" stroke-linejoin="round" d="M173.814 64.822c1.046.213 2.003 1.413 2.278 2.993.33 1.883-.428 3.59-1.695 3.812-1.265.222-2.559-1.123-2.889-3.003-.173-.99-.044-1.93.301-2.633.2-.409.472-.736.8-.944a1.63 1.63 0 0 1 1.205-.225m-7.231-28.858a4 4 0 0 0 .182.031c.724.1 3.549.272 7.22-2.333"/><path stroke="#002140" stroke-linecap="round" stroke-linejoin="round" d="m166.791 36.069-.026-.074-.02-.057-1.095-3.091-.006-.02m8.341.731-.062-.182-1.008-3.007"/><path stroke="#002140" stroke-linecap="round" stroke-linejoin="round" d="m170.919 27.911 1.73-.658a1.373 1.373 0 0 1 1.854 1.28c0 .554-.336 1.08-.884 1.287l-.797.302-7.172 2.725-.822.313a1.37 1.37 0 0 1-1.852-1.28c0-.556.337-1.08.884-1.287l1.374-.522 2.381-.904.479-.183.483-.184zm-10.295-14.822-5.53 1.895-.193.067-1.819 6.351 4.724-1.62 2.317-.796.547-.186 2.57-.882m1.903 11.913-12.061-8.429m14.449 7.542-9.659-8.97m-2.745-4.894 4.896 3.618m2.209-6.054-1.662 5.865m.054-5.42 1.575-.54.483-.167 1.575-.54 5.53-1.895.192-.067 5.317 3.902-4.727 1.622-2.313.794-.547.186-2.573.883-.932.32-.964.33m7.661 9.947 4.396-14.082m-6.811 14.776 2.149-12.96m-.815-5.556-1.664 5.865m-5.441-3.427 4.894 3.616m-3.306 1.782 3.736 10.96m4.486 36.042-2.346-14.353-3.049.313 3.049-7.06.638.875 2.57 3.527 1.249 1.716-3.128.393 2.346 14.353m-2.189 1.334-7.116-9.491-1.564 1.569-1.719-6.354 5.707 2.196-1.486 1.649 7.014 9.35.102.138m14.827 1.232c.251 1.43-.327 2.73-1.289 2.9-.964.17-1.949-.854-2.2-2.285-.25-1.433.328-2.731 1.292-2.9.961-.171 1.947.853 2.197 2.284m-8.664 23.403c.25 1.433-.328 2.73-1.292 2.9-.961.17-1.947-.854-2.197-2.285-.251-1.43.325-2.73 1.289-2.9s1.947.854 2.2 2.285m-7.898-45.051q.18-.1.381-.136c.964-.169 1.947.853 2.2 2.285.084.49.073.964-.016 1.382m10.497 9.513c.135.771-.175 1.469-.693 1.56-.519.091-1.048-.46-1.181-1.229-.135-.77.175-1.469.693-1.56.516-.09 1.046.46 1.181 1.23m-4.251-6.988c.135.77-.175 1.467-.694 1.558s-1.048-.458-1.181-1.229c-.135-.769.175-1.466.694-1.557.516-.092 1.045.457 1.181 1.228m-13.528 29.96c.135.77-.175 1.467-.693 1.558-.519.094-1.046-.458-1.181-1.227s.175-1.468.693-1.56c.516-.09 1.046.458 1.181 1.23m4.38 5.568c.133.77-.177 1.467-.693 1.558-.519.091-1.048-.458-1.183-1.229-.135-.769.175-1.466.693-1.558.519-.09 1.048.458 1.183 1.23m13.76-2.355c.135.77-.175 1.468-.693 1.56-.516.092-1.046-.46-1.181-1.228-.135-.771.175-1.469.693-1.56.519-.091 1.046.458 1.181 1.229m2.816-8.078c.135.77-.175 1.467-.693 1.558-.519.091-1.048-.458-1.184-1.229-.132-.769.178-1.467.694-1.558.518-.09 1.048.458 1.183 1.23m-24.944-13.883c.135.769-.175 1.467-.693 1.558-.519.09-1.046-.458-1.181-1.23-.135-.768.175-1.466.693-1.557.517-.091 1.046.458 1.181 1.229m3.598-11.844c.135.77-.177 1.468-.693 1.56-.519.09-1.048-.46-1.183-1.23s.175-1.468.693-1.56c.519-.09 1.048.46 1.183 1.23m-60.047-2.478a9.49 9.49 0 0 1 4.101 7.82 9.5 9.5 0 0 1-.213 2.01 9.4 9.4 0 0 1-.623 1.894c-1.484 3.296-4.789 5.587-8.626 5.587-5.224 0-9.46-4.249-9.46-9.491s4.236-9.491 9.46-9.491c.996 0 1.958.155 2.86.442a9.3 9.3 0 0 1 2.501 1.229"/><path stroke="#002140" stroke-linecap="round" stroke-linejoin="round" d="M109.489 57.375a5.2 5.2 0 0 1-2.28.523 5.22 5.22 0 0 1-4.453-2.487l-.015-.022m-.771-2.745a5.25 5.25 0 0 1 3.711-5.029m-2.892 7.774 2.581-2.118-3.4-.627m-9.921-5.575a12.4 12.4 0 0 1 1.271-3.998c.537-1.033 1.268-2.031 2.325-2.513a3.38 3.38 0 0 1 2.755-.01 3.4 3.4 0 0 1 1.824 2.076"/><path stroke="#002140" stroke-linecap="round" stroke-linejoin="round" d="M103.244 46.24a8.65 8.65 0 0 1 12.298-2.622 8.7 8.7 0 0 1 3.753 7.16q-.002.951-.195 1.842c-.842 3.915-4.314 6.847-8.468 6.847a8.7 8.7 0 0 1-1.497-.13"/><path stroke="#002140" stroke-linecap="round" stroke-linejoin="round" d="M118.997 52.598a4.8 4.8 0 0 1-2.089.477 4.79 4.79 0 0 1-4.078-2.275l-.014-.022m-.704-2.514a4.81 4.81 0 0 1 3.399-4.602m-2.648 7.116 2.362-1.938-3.113-.576m-9.083-5.102a11.3 11.3 0 0 1 1.165-3.662c.49-.947 1.159-1.858 2.127-2.3a3.1 3.1 0 0 1 2.523-.01 3.12 3.12 0 0 1 1.671 1.9m15.384 24.428a6.05 6.05 0 0 1 .219 2.422c-.33 3.064-2.918 5.449-6.059 5.449a6.09 6.09 0 0 1-5.149-2.838 6.15 6.15 0 0 1-.95-3.28c0-3.378 2.729-6.118 6.099-6.118 2.76 0 5.091 1.84 5.84 4.365"/><path stroke="#002140" stroke-linecap="round" stroke-linejoin="round" d="M125.713 63.57c-.459.174-.887.314-1.367.69-.388.304-.618.8-.634 1.293-.009.273.073.571.297.729.301.213.716.091 1.061-.038l.873-.326m-10.891 2.542c.534.135 1.088.2 1.639.193.521-.009 1.144-.158 1.316-.653.138-.391-.095-.838-.434-1.076-.339-.237-.76-.317-1.167-.393l-2.366-.431M70.273.524c.993 1.923 2.368 3.236 4.012 4.396 7.44 5.246 16.381 8.404 22.866 14.8 4.203 4.144 6.618 8.271 7.867 14.049M65.65 2.827c2.412 2.62 3.673 6.077 4.827 9.453 1.34 3.924 2.619 7.873 3.895 11.822"/><path stroke="#002140" stroke-linecap="round" stroke-linejoin="round" d="M86.816 34.678a28.06 28.06 0 0 1 8.667-10.145c-.576.747-.76 1.62-1.017 2.527-.611 2.167-1.227 4.353-1.35 6.6 1.818-2.991 4.157-5.685 6.798-7.973-.547 2.89-.802 5.9-.694 8.84a19.1 19.1 0 0 1 5.774-.447c4.411.315 8.729 2.098 11.97 5.109 2.721 2.526 4.67 5.775 7.256 8.442a24 24 0 0 0 1.993 1.833q.642.527 1.316 1.007a14 14 0 0 0 1.91 1.167 8 8 0 0 0 1.728.635c1.325.31 2.798.187 3.928-.575 1.13-.763 1.819-2.231 1.449-3.547.942 1.518 1.159 3.484.594 5.18-.563 1.695-1.753 3.138-3.184 4.204a9 9 0 0 1-2.237 1.24c2.335.678 5.082-.24 7.007-1.726.849-.658 1.635-1.531 1.744-2.602.633 2.422-.049 5-1.653 6.917-1.604 1.92-3.966 3.114-6.42 3.574 1.659.882 3.733.477 5.527-.076 1.573-.487 3.157-1.287 3.992-2.707.06 2.811-.937 5.53-2.758 7.667a11.65 11.65 0 0 1-7.22 3.947M65.479 2.687l.197.06c2.546.8 5.663 2.833 5.758 2.833a32.3 32.3 0 0 1-1.29-5.247M52.537 16.009c-.253-.271-2.052-3.905-2.54-6.031 1.8 2.43 3.496 3.882 5.816 5.244 2.038 1.196 4.243 2.073 6.42 2.989 4.143 1.742 8.246 3.653 12.084 5.982a52 52 0 0 1 5.372 3.716c2.552 2.024 4.905 4.358 6.875 6.96 2.069 2.729 3.715 5.753 4.734 9.024M52.539 16.011s.01.009.017.013q-.006-.001-.017-.013m0 0-.003-.002"/><path stroke="#002140" stroke-linecap="round" stroke-linejoin="round" d="M46.95 13.742c2.11.38 3.918.918 5.587 2.267m9.603 27.362c4.367 5.733 11.188 9.662 18.333 10.011a21 21 0 0 0 1.584.018M57.348 34.604a52 52 0 0 0 1.76 3.696q.245.467.507.931M46.911 13.78c3.78 3.855 5.978 8.967 7.878 14.027l.913 2.437m13.291 8.131q.464.465.955.905c4.169 3.73 9.595 6.158 15.182 6.242.08 0 .047-.058-.024-.093-3.516-6.81-8.596-12.48-14.94-16.756-2.757-1.86-5.757-3.429-8.952-4.3a22 22 0 0 0-2.22-.482"/><path stroke="#002140" stroke-linecap="round" stroke-linejoin="round" d="M61.179 24.513c1.039 3.214 2.337 6.251 3.999 8.956q.32.522.658 1.029m14.631 19.035c1.043 2.718 1.994 6.41 1.697 8.773-.295 2.363-1.412 4.67-3.28 6.143a5.8 5.8 0 0 1-1.541.895c-1.905.718-4.247.003-5.43-1.657-.044 2.324 1.814 4.342 3.999 5.117a7.2 7.2 0 0 0 5.425-.27c-.813 1.844-2.106 3.126-3.939 3.957-1.834.829-4.11.762-5.753-.4.746 1.298 1.936 2.28 3.294 2.904q.35.164.716.294a7.4 7.4 0 0 0 3.013.404 7.3 7.3 0 0 0 2.131-.466c.824-.318 1.628-.82 2.045-1.6l.018-.032"/><path stroke="#002140" stroke-linecap="round" stroke-linejoin="round" d="M82.864 77.638c-.138 1.404-.632 2.566-1.42 3.57-.488.62-1.086 1.18-1.78 1.7a8.33 8.33 0 0 1-5.56 1.618 8 8 0 0 1-.9-.115c.295.273.619.522.962.744 1.451.945 3.274 1.445 4.967 1.412 2.096-.04 4.136-.652 6.106-1.37-1.332 3.003-3.184 5.614-5.501 7.343m38.026-3.816c-.1-.506-.166-1.013-.209-1.493-.44-5.109.331-10.518 1.904-15.398-.727 4.718-.601 9.742.257 14.438.011-.149.051-.118.082-.264.305-1.447 1.993-2.343 3.427-2.007 1.435.335 2.505 1.678 2.78 3.13a5.8 5.8 0 0 1 .042 1.874 6.5 6.5 0 0 1-.828 2.385c-.552.942-1.456 1.809-2.508 2.09-1.447.39-3.002-.497-3.824-1.752-.558-.854-.913-1.93-1.123-3.003"/><path stroke="#002140" stroke-linecap="round" stroke-linejoin="round" d="M116.558 95.438q.03.14.067.277c.299 1.174.919 2.272 1.828 3.067q.09.08.183.153c.958.765 2.196 1.187 3.412 1.074.72-.07 1.411-.314 2.056-.642a8.36 8.36 0 0 0 3.011-2.603c1.159-1.626 2.187-4.133 2.639-6.082.602-2.591.994-5.178 1.267-7.78.317-3.02.474-6.06.609-9.147v-.013m-23.827 29.331a25 25 0 0 0-.605-1.382 26.5 26.5 0 0 0-1.788-3.227c-2.228-3.44-5.272-6.31-9.059-7.77-4.643-1.792-9.982-1.259-14.522.781a25 25 0 0 0-2.091 1.065c-.813.464-1.6.973-2.36 1.518a31 31 0 0 0-2.869 2.337 39 39 0 0 0-4.14 4.456c-3.115 3.893-5.599 8.249-8.065 12.582m.022.02c2.663 5.096 8.036 8.407 13.772 8.433l.03-.037c3.381-4.234 8.364-6.936 13.535-8.52a42 42 0 0 1 14.369-1.796m-41.862 1.92-.222-.018c-3.233-.215-6.36 1.176-8.346 3.285q-.165.177-.321.36c-2.003 2.358-3.03 5.502-2.909 8.598.053 1.355.334 2.737 1.086 3.864.75 1.129 2.036 1.958 3.385 1.896"/><path stroke="#002140" stroke-linecap="round" stroke-linejoin="round" d="M56.252 121.035c-1.139 1.496-1.522 3.434-1.669 5.311-.132 1.683-.088 3.438.479 5.009q.194.548.479 1.058c1.014 1.811 3.148 3.122 5.16 2.625m.843-11.074c-.939 1.778-1.349 3.458-1.413 5.329-.06 1.72.106 3.482.797 5.058q.13.294.286.58c.73 1.327 1.879 2.44 3.308 2.9 1.635.529 3.615.069 4.646-1.309"/><path stroke="#002140" stroke-linecap="round" stroke-linejoin="round" d="M68.889 123.431a10.97 10.97 0 0 0-3.432 5.793c-.312 1.398-.339 2.894.168 4.234.508 1.337 2.092 2.604 3.479 2.951"/><path stroke="#002140" stroke-linecap="round" stroke-linejoin="round" d="M69.312 136.513q.406.147.815.305a59 59 0 0 1 7.218 3.328 58 58 0 0 1 4.017 2.392 50 50 0 0 1 5.175 3.846q.634.537 1.232 1.091c.62.574 1.227 1.163 1.898 1.676.237.18.496.355.791.389.636.071 1.168-.578 1.216-1.218.09-1.107-.675-2.456-1.11-3.433a30 30 0 0 0-.757-1.587 37 37 0 0 0-1.141-2.069c-.975-1.644-2.063-3.22-3.208-4.749a84 84 0 0 0-1.553-2.013 58 58 0 0 0-.813-1.011c-.946-1.16-1.928-2.287-3.002-3.318a22 22 0 0 0-1.101-1.004 25 25 0 0 0-5.632-3.658c-.704-.334-2.607-1.12-4.61-1.809m7.601-1.642c2.45.942 3.91 4.184 2.816 6.902m-25.646-12.289c-.928-.262-1.905-.404-2.973.158-.758.398-1.416 1.126-1.868 1.931a5.6 5.6 0 0 0-.478 1.129l-.04.14a21 21 0 0 0-.397 1.611 15 15 0 0 0-.259 1.827 12 12 0 0 0-.026 1.671q.025.54.097 1.104c.102.796.472 1.738.99 2.351.574.68 1.868 1.122 2.659.994m66.685-40.865a3.56 3.56 0 0 1 2.902-.171 3.55 3.55 0 0 1 2.031 2.084m3.029-1.622c-.729-.575-2.763-.629-3.702.26m2.399-30.693 1.646-9.087 1.899-10.469m-1.303 21.074 2.63-8.431 2.426-7.778m-20.382 25.307-18.036 3.922m17.358-6.485-19.808 1.098"/><path stroke="#002140" stroke-linecap="round" stroke-linejoin="round" d="M73.743 125.742c-2.555.836-4.023 3.207-4.38 5.124s-.104 3.92.782 5.907m9.801-6.482c-1.668.471-3.263 2.091-3.91 3.66-.647 1.567-.514 3.88.157 5.438m9.225-2.876c-.292-.129-1.254.273-1.668.522-1.69 1.014-2.7 3.496-2.346 5.438m8.186.942c-1.2-.053-2.763.994-2.973 2.876m-38.106-27.66c-8.392-2.929-18.14-4.131-23.222-3.193a3 3 0 0 0-1.327.611c-.381.313-.647.802-.579 1.291a1 1 0 0 0 .058.222c.146.418.534.74.955.9.494.187 1.034.207 1.564.187 5.767-.227 14.994-.22 21.98 1.289m-.53 3.493c-9.832-1.618-19.297-1.733-28.768 1.369-1.23.402-2.39.778-3.46 1.411a7.8 7.8 0 0 0-1.336.995 3.9 3.9 0 0 0-.96 1.483c-.17.513-.13 1.122.211 1.544.556.687 1.61.622 2.47.425 1.148-.267 1.416-.436 2.524-.843 4.4-1.62 8.737-3.486 13.319-4.477 6.006-1.298 10.222-1.009 15.956-.225"/><path stroke="#002140" stroke-linecap="round" stroke-linejoin="round" d="M47.574 121.611c-2.5-.507-6.733-.991-9.278-1.098-6.868-.291-17.081-.198-25.44.947-3.518.482-6.71 1.151-9.183 2.055-.856.314-1.693.771-2.262 1.485-.57.715-.793 1.773-.324 2.558.702 1.175 2.388 1.135 3.738.917 2.944-.473 4.905-1.584 10.326-2.315m-2.295-4.707c-1.146-.522-.778-1.835-.335-2.351.443-.513 1.086-.844 1.748-.987 2.705-.582 6.206-.584 9.117-.531m51.555-38.589h-.002a5.6 5.6 0 0 0-1.054.556c-.854.558-1.815 1.422-2.517 2.444-.632.923-1.048 1.974-1.276 3.076-.288 1.367-.288 2.813-.062 4.187a8.3 8.3 0 0 0 .578 1.893c.833 1.933 2.337 3.864 3.76 5.1"/><path stroke="#002140" stroke-linecap="round" stroke-linejoin="round" d="M74.16 85.167c-.548 1.142-.588 2.59-.289 3.89.089.387.209.76.353 1.11.443 1.066 1.154 2.044 1.993 2.87q.534.528 1.121.965m-2.725-9.632a8.6 8.6 0 0 1 3-2.37 8.6 8.6 0 0 1 3.74-.862m-10.687 9.988c1.641 1.232 3.482 2.072 5.527 1.936m-6.079-7.987a8.4 8.4 0 0 0 3.558 4.03l-.138-.07m.355-9.517s-.004.022-.004.033a11.45 11.45 0 0 0 .232 4.789m3.492-2.57a8.5 8.5 0 0 1 1.068-1.95m26.76 18.626a23.6 23.6 0 0 0 4.451-.317c1.828-.312 3.629-.854 5.279-1.676q.625-.31 1.217-.673m-8.862 6.484a21.7 21.7 0 0 0 5.363-.753c2.036-.549 3.975-1.391 5.687-2.489"/><path stroke="#002140" stroke-linecap="round" stroke-linejoin="round" d="M115.169 96.455a44 44 0 0 1-2.302 4.989m-2.953-3.155c-.833 1.308-1.668 2.109-2.601 3.349m-6.329 9.917q.047.328.086.651c.193 1.58.275 3.165.266 4.749-.006 2.065-.166 4.129-.425 6.189-.355 2.825-.897 5.638-1.502 8.429q-.165.757-.333 1.509-.175.778-.352 1.551A76 76 0 0 0 98.21 137c-.312 1.589-.52 3.189-.412 4.798a12.2 12.2 0 0 0 .829 3.657c-.45 2.978-1.67 5.529-3.94 7.503-1.916 1.666-4.512 2.597-7.018 2.371a8 8 0 0 1-1.37-.247c-.894 1.078-1.386 2.362-1.614 3.727-.182 1.086-.2 2.222-.122 3.342q.028.443.075.88c.257 2.4.785 4.94 2.488 6.644"/><path stroke="#002140" stroke-linecap="round" stroke-linejoin="round" d="M100.795 112.251c-.817.435-2.162 1.178-2.91 1.727-.424.308-.84.644-1.122 1.086-.283.449-.41.978-.523 1.498a48.6 48.6 0 0 0-1.092 9.656c-.006.602 0 1.215.178 1.791.485 1.575 2.49 2.797 3.959 3.537m55.076-56.222q.158-.855.429-1.686c.612-1.887 1.644-3.647 3.022-5.032.988-.995 2.156-1.795 3.476-2.304 1.496-.576 3.182-.762 4.708-.276 1.527.49 2.856 1.716 3.241 3.276.43 1.74-.359 3.609-1.615 4.882-1.349 1.362-3.166 2.158-4.606 3.42a9.23 9.23 0 0 0-3.033 5.618c-.197 1.407-.002 2.851.486 4.196.257.715.598 1.4 1.005 2.035"/><path stroke="#002140" stroke-linecap="round" stroke-linejoin="round" d="M137.572 89.662c3.675.942 7.167.111 10.435-1.02 2.16-.749 4.083-1.647 5.678-3.14.751-.707 1.466-1.573 1.557-2.602.06-.691-.195-1.371-.507-1.987-1.321-2.6-3.709-4.515-5.096-7.08-.396-.733-.711-1.544-.669-2.377.047-.885.49-1.696.957-2.447 1.168-1.878 2.349-3.345 3.727-5.071m11.376 29.469a73 73 0 0 1-1.693 2.136c-1.774 2.166-3.677 4.226-5.802 6.044-2.816 2.406-6.484 4.513-10.031 5.566"/><path stroke="#002140" stroke-linecap="round" stroke-linejoin="round" d="M154.124 85.533c3.035 2.522 6.921 6.656 9.123 9.933M131.16 82.918a49.5 49.5 0 0 1 6.328 6.809c.718.933 1.395 1.88 2.04 2.837 1.848 2.738 3.43 5.563 4.958 8.465a90 90 0 0 1 2.953 6.153c1.979 4.553 3.596 9.304 4.744 14.144l.08.34q.48 2.055.839 4.127l.06.353a69 69 0 0 1 .906 8.3"/><path stroke="#002140" stroke-linecap="round" stroke-linejoin="round" d="M98.398 137.035a69 69 0 0 1 6.755-4.862c9.963-6.3 21.845-10.351 33.341-11.06 2.41-.149 4.854-.167 7.209.362 2.357.529 6.205 2.305 7.377 4.58m-18.791-40.077c.183 4.295-.435 7.96-1.653 11.177a25.3 25.3 0 0 1-2.111 4.289c-1.152 1.878-2.528 3.598-4.064 5.211-4.951 5.2-11.657 8.549-18.669 10.043-1.866.395-4.378.535-6.265.26"/><path stroke="#002140" stroke-linecap="round" stroke-linejoin="round" d="M139.528 92.564a34 34 0 0 1-1.768 6.96 36 36 0 0 1-2.204 4.887 34 34 0 0 1-2.597 4.075c-1.123 1.512-4.377 4.943-8.392 7.48-6.719 4.247-13.501 7.5-23.588 7.187"/><path stroke="#002140" stroke-linecap="round" stroke-linejoin="round" d="M130.706 101.482q2.342 1.42 4.684 2.836m-2.497-7.154a51 51 0 0 1 4.732 2.31l-.208-.163m-38.549 33.724c-1.799-1.097-5.111-1.893-7.506-1.8 1.086 1.398 2.023 2.767 2.885 4.316-2.238-1.451-4.487-2.756-6.95-3.776-1.29.171-2.995.838-4.068 1.574m-5.941 6.902c-.639 1.438-1.017 3.06-1.044 5.069-.013 1.133.348 2.42.339 2.46m11.104 7.295c-.47-2.195-1.194-3.938-2.504-5.413-1.307-1.473-3.423-2.698-5.39-2.742-1.13-.027-2.22.315-3.186.9a7.94 7.94 0 0 0-2.58 2.571c-1.244 1.995-1.742 4.298-1.902 6.644-.314 4.665 1.008 8.114 1.877 12.707.474 2.504 1.33 5.96-.078 8.784-.744 1.494-2.574 2.711-3.939 3.667-1.367.956-2.84 1.764-4.11 2.847-1.269 1.082-2.348 2.502-2.594 4.155-.246 1.651.65 3.54 2.198 4.154 1.114.442 2.862.095 3.988-.314q.536-.193 1.039-.433c3.764-1.771 6.252-5.311 7.231-9.451"/><path stroke="#002140" stroke-linecap="round" stroke-linejoin="round" d="M70.561 192.722a3.88 3.88 0 0 0 2.409 4.713c1.482.514 3.174.125 4.473-.755l.1-.071c1.249-.878 2.164-2.167 2.862-3.531a16.26 16.26 0 0 0 1.757-7.732"/><path stroke="#002140" stroke-linecap="round" stroke-linejoin="round" d="M77.677 196.8c.313 1.333 1.704 2.504 2.894 2.589s2.406-.145 3.363-.863c2.727-2.049 4.072-5.648 4.894-8.964 1.222-4.927 1.517-11.036 1.125-18.567m-2.813-1.333c.965.478 1.911.898 2.837 1.271 14.988 6.002 24.508-1.438 28.438-5.975 2.107-2.432 3.206-4.549 3.853-7.603m-20.352-22.909c-.028 5.465 1.737 9.174 1.744 12.203.004 2.713-1.165 5.357-2.871 7.464-1.704 2.109-4.015 3.691-6.54 4.667-2.838 1.097-6.6 1.302-9.378.06"/><path stroke="#002140" stroke-linecap="round" stroke-linejoin="round" d="M105.202 132.251c-.425 3.895 1.236 9.173 1.542 13.082.41 5.238-2.133 10.542-6.292 13.738s-9.637 4.553-15.659 3.062m33.702 2.902c2.893 1.569 9.965 2.191 14.613 1.258 4.579-.918 8.879-3.149 12.349-6.284 9.495 3.313 19.808 4.531 29.806 3.464m-21.239-28.833c3.558 3.266 7.24 6.475 11.465 8.811 4.142 2.291 8.748 4.258 13.538 4.811"/><path stroke="#002140" stroke-linecap="round" stroke-linejoin="round" d="M187.262 140.113c.472-5.44-.78-10.918-2.845-15.969-.416-1.022-.937-2.095-1.661-2.906-.499-.558-1.092-.991-1.815-1.207-1.309-.391-2.791.096-3.746 1.073-.957.978-1.411 2.38-1.398 3.749.007.691.122 1.371.288 2.042.149.616.339 1.223.521 1.827q.11.357.213.718a68 68 0 0 1 1.369 5.571c.875 4.391 1.28 8.855 1.059 13.262-.233 4.656-1.161 9.247-2.969 13.625-.228.553-.481 1.12-.74 1.697-.605 1.354-1.234 2.758-1.606 4.107-.53 1.927-.621 4.391.235 6.196.855 1.804 3.356 3.013 5.317 2.666m3.598-55.451c1.329-2.744 3.651-2.853 5.082-2.195.864.4 1.458 1.06 1.947 1.833.324.504.601 1.058.88 1.616 2.477 4.962 3.044 10.686 2.749 16.226"/><path stroke="#002140" stroke-linecap="round" stroke-linejoin="round" d="M190.275 120.644c.547-2.511 2.608-3.624 4.263-3.246 1.765.402 2.86 2.162 3.529 3.848a40 40 0 0 1 1.236 3.616c.295 1.031.547 2.071.744 3.122q.327 1.69.47 3.405c.842 10.224-.208 21.049-5.058 30.082-1.542 2.873-3.48 5.515-5.574 8.013-2.8 3.34-5.875 6.376-10.166 7.08m19.6-84.913c2.138 1.62 3.753 2.98 5.837 4.913.629.583 1.272 1.287 1.93 1.047.574-.209.864-.522 1.303-.889m-5.659-12.593a33.9 33.9 0 0 1 8.769 7.64c.206.25.412.517.481.833.182.807-.275 1.32-.933 1.82"/><path stroke="#002140" stroke-linecap="round" stroke-linejoin="round" d="M206.435 94.069c-.28-.663.217-1.094.547-1.425.259-.209.286-.289.625-.524.248-.171.469-.231.671-.218.352.02.64.256.893.48a14 14 0 0 1 1.874 2.042c1.407 1.865 2.322 3.973 2.884 5.894q.107.35.193.691c.082.317.313 1.089.366 1.413q.055.346.009.591c-.049.282-.189.469-.375.558-.374.184-1.511.367-2.031.42-.45.044-.672-.133-.811-.442-.098-.214-.158-.491-.228-.8a22 22 0 0 0-.472-1.743c-.503-1.593-1.175-3.008-2.101-4.349a17 17 0 0 0-1.655-2.026 2 2 0 0 1-.389-.562m-5.656-4.563c1.152.854 3.524 2.934 5.576 4.6m-4.325-7.684c1.877 1.202 4.744 3.607 6.254 5.28"/><path stroke="#002140" stroke-linecap="round" stroke-linejoin="round" d="M210.473 101.009c-.534.033-1.788.469-1.823 1.595-.053 1.674.416 3.714.47 7.765.006.542.026 1.795.39 2.195.363.402 1.674.376 2.215.367m2.162-12.602.042-.011c1.551-.391 2.756.275 3.009 1.895.39 2.509 1.017 8.705.547 9.802-.332.78-1.562 1.005-2.162.865"/><path stroke="#002140" stroke-linecap="round" stroke-linejoin="round" d="M211.809 110.738c.042-.554.251-.623.594-.891.782-.158 1.952-.407 2.266-.027q.084.101.158.271c.237.536.387 1.553.383 2.787-.009 2.106-.479 4.84-1.766 6.851q-.076.12-.162.231c-.633.858-1.42 1.209-1.661 1.389a2 2 0 0 1-.355.215c-.347.165-.633.138-.83-.009-.335-.249-.891-1.035-1.179-1.475-.268-.411-.191-.72.06-1.009.139-.165.339-.32.56-.487a4.35 4.35 0 0 0 1.197-1.373c.766-1.358.875-3.042.839-4.287-.013-.566-.06-1.042-.084-1.353a5 5 0 0 1-.02-.833"/><path stroke="#002140" stroke-linecap="round" stroke-linejoin="round" d="M210.996 117.166c-.274-.462-.731-1.148-1.847-1.035-.534.051-3.47 2.787-7.336 4.44-.496.213-1.156.638-1.342 1.147-.186.508.263 1.433.52 1.911m12.333-3.638c1.093 1.204 1.037 2.324-.217 3.398-1.916 1.637-6.881 4.626-8.813 4.851-.839.098-1.382-.749-1.535-1.349m8.445-23.32c.26 2.249.574 3.975.574 7.164m3.126-.68c.08-2.275.235-4.235-.352-7.033m-5.271 15.98-.013.009a29 29 0 0 1-6.039 3.802"/><path stroke="#002140" stroke-linecap="round" stroke-linejoin="round" d="M205.15 125.318c2.64-.989 3.89-1.929 6.13-3.723m-12.015 3.285.038-.018c.565-.273 1.163-.553 1.768-.858a25 25 0 0 0 1.861-1.026q.16-.1.301-.156c.933-.384 1.285.467 1.52.951.113.313.179.365.29.762.084.298.062.527-.022.714-.142.311-.456.5-.733.684-.527.349-1.044.64-1.558.9-.808.409-1.613.74-2.448 1.104m-24.21-1.039c-1.624.077-3.19.093-5.08.057-.855-.015-1.804-.111-2.136.507-.288.54-.297.967-.383 1.533m9.524 6.054a32.7 32.7 0 0 1-8.614-.309c-.31-.051-.631-.114-.886-.3-.653-.474-.658-1.142-.509-1.929"/><path stroke="#002140" stroke-linecap="round" stroke-linejoin="round" d="M171.67 129.698c.664.328.587.931.558 1.404-.055.329-.022.407-.12.807a1.3 1.3 0 0 1-.181.426c-.275.394-.742.42-1.159.423-.804.002-1.761-.158-2.769-.414-2.138-.542-4.504-1.506-6.102-2.226-1.074-.485-1.803-.86-1.883-.925a1.2 1.2 0 0 1-.173-.171c-.33-.398-.352-.927-.243-1.189.157-.387.531-.973.886-1.36a.9.9 0 0 1 .545-.298c.428-.069.917.156 1.382.403l.264.14c2.005 1.055 3.596 1.773 5.793 2.304.765.184 1.604.347 2.559.491.268.04.479.105.643.185m4.92-.191c-.959.066-3.086.04-4.865.084m5.805 3.104c-1.912.136-4.125.143-5.636-.02h-.014m-8.791-6.202c.211-.493.886-2.195-.434-2.838-1.502-.728-2.707-1.093-6.343-2.862-.485-.235-1.719-1.098-2.762-.94-.534.08-1.015.976-1.252 1.465m9.593 8.835c-.332 1.593-1.4 2.282-2.971 1.778-1.207-.387-3.257-1.205-5.1-2.04m7.194-3.802c-2.121-.774-3.632-1.723-6.474-3.151m-1.433 3.197.057.031c1.972 1.08 3.806 2.169 6.538 2.889m-7.315-7.397c.556.364 1.169.733 1.858 1.122q.16.09.282.178c.844.615.503 1.24.286 1.733-.169.289-.164.371-.397.713-.388.571-.864.542-1.303.407M58.45 40.109q.636-.346 1.26-.72a38 38 0 0 0 6.299-4.702q.557-.511 1.092-1.045"/><path stroke="#002140" stroke-linecap="round" stroke-linejoin="round" d="M58.833 38.447c-.791.348-1.877 1.255-1.586 2.362.219.838.777 1.538 1.336 2.2.358.424.76.878 1.304.984.51.098 1.02-.129 1.48-.362q.36-.18.714-.371a30.5 30.5 0 0 0 7.153-5.34c.306-.307 1.25-1.433.86-2.14-.419-.756-.705-1.333-1.33-2.038-.37-.415-.657-.97-1.173-1.178-.783-.313-2.114.358-2.347.865m-9.517-3.154a2.38 2.38 0 0 1 1.504-.533 2.39 2.39 0 0 1 2.384 2.391 2.366 2.366 0 0 1-2.269 2.391q-.055.003-.115.002a2.39 2.39 0 0 1-2.386-2.393c0-.749.343-1.418.882-1.858"/><path fill="#fffaf0" stroke="#fffaf0" stroke-miterlimit="10" d="M192.958 52.487c2.867 5.882 3.884 10.64 4.508 16.39.625 5.752-.443 9.805 2.269 10.119 2.712.313 3.977-2.587 2.736-12.314-.859-6.744-3.454-14.013-9.382-21.255-5.395-6.59-9.38-8.003-10.322-7.058-.742.744-.339 1.047 1.538 2.509 1.876 1.464 5.897 5.955 8.653 11.609ZM177.762 35.86c.782-.431 2.229.195 2.346.824.118.63-.547 1.256-1.486.943-1.296-.434-1.642-1.334-.86-1.765z"/></g><defs><clipPath id="a"><path fill="#fff" d="M.5 0h218v200H.5z"/></clipPath></defs></svg>
\ No newline at end of file
diff --git a/assets/images/simple-illustrations/simple-illustration__calendar-monthly.svg b/assets/images/simple-illustrations/simple-illustration__calendar-monthly.svg
deleted file mode 100644
index 906bd7ae4564..000000000000
--- a/assets/images/simple-illustrations/simple-illustration__calendar-monthly.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 48 48"><path fill="#e96df2" d="M18.16 14.34c.522 0 .998.199 1.359.523l.052.064a2.4 2.4 0 0 1-1.42.528h-.09v.006c-.585.055-.784.48-.784.914 0 .497.311.916.874.937a4.2 4.2 0 0 0 1.994-.547l.006.013a2.029 2.029 0 1 1-1.988-2.438zm13.82 2.426.006.012a2.029 2.029 0 1 1-.629-1.915l.052.064a2.4 2.4 0 0 1-1.42.528H29.9v.006c-.586.055-.785.48-.785.914 0 .497.312.916.874.937a4.2 4.2 0 0 0 1.994-.547z"/><path fill="#002140" d="M32.32 13.036q.002-.088-.007-.171A2.417 2.417 0 0 0 29.9 10.62c-1.28 0-2.232.907-2.394 2.083v.165h-1.87v-.156a4.27 4.27 0 0 1 4.255-3.934c2.245 0 4.178 1.82 4.264 4.1l.003.167a4.26 4.26 0 0 1-2.178 3.72 4.24 4.24 0 0 1-1.994.547c-.562-.021-.874-.44-.874-.938 0-.433.199-.858.785-.913v-.006h.089a2.4 2.4 0 0 0 1.42-.528c.556-.443.91-1.124.91-1.888zm-16.638-.443v.275h-1.897q.002-.078.01-.156a4.27 4.27 0 0 1 4.254-3.934c2.245 0 4.172 1.818 4.264 4.09l.003.177a4.26 4.26 0 0 1-2.178 3.72 4.24 4.24 0 0 1-1.994.547c-.562-.021-.874-.44-.874-.938 0-.433.199-.858.785-.913v-.006h.089a2.4 2.4 0 0 0 1.42-.528c.556-.443.91-1.124.91-1.888q.002-.086-.006-.168a2.417 2.417 0 0 0-2.413-2.248 2.426 2.426 0 0 0-2.38 1.973z"/><path fill="#fffaf0" d="M35.758 19.313h.239v15.4a2.035 2.035 0 0 1-2.029 2.027H14.15a2.035 2.035 0 0 1-2.028-2.028v-15.4z"/><path fill="#f68dfe" d="M34.17 12.877A2.04 2.04 0 0 1 36 14.9v4.417h-6V18.4c.98 0 1.8-.696 1.989-1.619l-.006-.012a4.27 4.27 0 0 0 2.177-3.72q0-.086-.003-.168h.015z"/><path fill="#f68dfe" d="M32.32 13.036a2.41 2.41 0 0 1-.91 1.888l-.052-.064a2.029 2.029 0 1 0-1.36 3.533v.917H18.16v-.917c.98 0 1.799-.696 1.988-1.618l-.006-.013a4.27 4.27 0 0 0 2.178-3.72q0-.089-.003-.177h9.997q.007.084.006.168z"/><path fill="#f9b5fe" d="M33.877 32.654h-2.985v2.984h2.985z"/><path fill="#f68dfe" d="M18.16 19.313h-6.04v-4.417a2.033 2.033 0 0 1 2.028-2.028h6.323q.008.084.006.168a2.41 2.41 0 0 1-.91 1.888l-.053-.064a2.029 2.029 0 1 0-1.359 3.534v.916z"/><path stroke="#002140" stroke-miterlimit="10" stroke-width=".999" d="M22.39 12.868h9.869m-18.411 0h6.634M14.15 36.744a2.035 2.035 0 0 1-2.028-2.029V14.896a2.033 2.033 0 0 1 2.028-2.028"/><path stroke="#002140" stroke-miterlimit="10" stroke-width=".999" d="M34.131 12.877c1.045.104 1.87.971 1.87 2.019v19.81c0 1.115-.935 2.028-2.074 2.028H13.796m-1.729-17.421h23.692m-21.976-6.268q0-.074.003-.143v-.034q.002-.078.01-.156m0 0a4.27 4.27 0 0 1 4.254-3.934c2.245 0 4.172 1.818 4.264 4.09l.003.177a4.26 4.26 0 0 1-2.177 3.72 4.24 4.24 0 0 1-1.995.547h-.098"/><path stroke="#002140" stroke-miterlimit="10" stroke-width=".999" d="M15.668 12.703c.006-.036.009-.073.018-.11a2.42 2.42 0 0 1 4.792.275q.008.084.006.168c0 .764-.354 1.445-.91 1.888-.39.314-.883.51-1.42.528h-.089m.248 1.857q-.049.005-.098.006h-.067c-.562-.021-.873-.44-.873-.937 0-.434.198-.859.785-.914l.088-.006m7.486-2.746a4.27 4.27 0 0 1 4.255-3.934c2.245 0 4.178 1.82 4.264 4.1l.003.167a4.26 4.26 0 0 1-2.178 3.72 4.24 4.24 0 0 1-1.994.547h-.098"/><path stroke="#002140" stroke-miterlimit="10" stroke-width=".999" d="M27.506 12.703a2.42 2.42 0 0 1 2.395-2.083c1.221 0 2.324.99 2.413 2.245q.008.088.006.171a2.41 2.41 0 0 1-.91 1.888 2.4 2.4 0 0 1-1.42.528h-.09m.252 1.857q-.05.005-.098.006h-.067c-.562-.021-.874-.44-.874-.937 0-.434.199-.859.785-.914l.089-.006"/><path fill="#fbccff" d="M33.877 25.577H14.415v.971h19.462zm.037-4.062H14.415v.898h19.5zm0 8.121H14.415v.898h19.5z"/><path fill="#f9b5fe" d="M31.446 33.76h-17.03v.898h17.03z"/><path fill="#002140" d="M33.468 33.079h-2.156v2.156h2.156z"/></svg>
\ No newline at end of file
diff --git a/assets/images/simple-illustrations/simple-illustration__fastmoney.svg b/assets/images/simple-illustrations/simple-illustration__fastmoney.svg
deleted file mode 100644
index d479400e1830..000000000000
--- a/assets/images/simple-illustrations/simple-illustration__fastmoney.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 48 48"><path fill="#00b268" d="M45.251 31.509v-16.18H18.528v16.18z"/><path fill="#5be3aa" d="M31.889 27.014c3.15 0 5.702-1.635 5.702-3.652s-2.553-3.652-5.702-3.652-5.702 1.635-5.702 3.652 2.553 3.652 5.702 3.652m10.666-7.911c.636 0 1.152-.503 1.152-1.123s-.516-1.124-1.152-1.124-1.151.503-1.151 1.124c0 .62.515 1.123 1.151 1.123m-.018 10.908c.636 0 1.151-.503 1.151-1.123 0-.621-.515-1.124-1.151-1.124s-1.152.503-1.152 1.124c0 .62.516 1.123 1.152 1.123m-21.438 0c.636 0 1.151-.503 1.151-1.123 0-.621-.515-1.124-1.151-1.124-.637 0-1.152.503-1.152 1.124 0 .62.515 1.123 1.152 1.123m-.006-10.908c.636 0 1.152-.503 1.152-1.123s-.516-1.124-1.152-1.124-1.152.503-1.152 1.124c0 .62.516 1.123 1.152 1.123"/><path stroke="#002140" stroke-linecap="round" stroke-linejoin="round" d="M45.212 31.435V15.329H18.49v16.106z"/><path stroke="#002140" stroke-linecap="round" stroke-linejoin="round" d="M31.85 27.066c3.231 0 5.85-1.65 5.85-3.685s-2.619-3.686-5.85-3.686S26 21.345 26 23.38s2.62 3.685 5.85 3.685m10.686 3.111c.73 0 1.32-.577 1.32-1.288s-.59-1.288-1.32-1.288-1.32.576-1.32 1.288c0 .711.59 1.288 1.32 1.288m0-10.901c.73 0 1.32-.576 1.32-1.288 0-.71-.59-1.288-1.32-1.288s-1.32.577-1.32 1.288.59 1.288 1.32 1.288M21.098 30.176c.73 0 1.32-.577 1.32-1.288s-.59-1.288-1.32-1.288-1.32.576-1.32 1.288c0 .711.59 1.288 1.32 1.288m0-10.901c.73 0 1.32-.576 1.32-1.288 0-.71-.59-1.288-1.32-1.288s-1.32.577-1.32 1.288.59 1.288 1.32 1.288m2.574-1.438h16.231M20.83 26.152v-5.43M39.903 29h-16.28m19.131-8.316v5.487m-21.786-.002c1.47 0 2.66 1.16 2.66 2.594q0 .081-.005.162m-2.655-8.24c1.47 0 2.66-1.16 2.66-2.594q0-.082-.005-.162m18.935 8.24c-1.47 0-2.66 1.16-2.66 2.594q0 .081.005.162m2.655-8.24c-1.47 0-2.66-1.16-2.66-2.594q0-.082.005-.162"/><path fill="#f68dfe" d="m.933 23.885 2.644-.305s1.304-.267 1.638.764c.335 1.032-.633 2.216-1.787 2.79 0 0 .596.23 1.6-.038 1.006-.267 5.289-2.522 6.592-2.101 1.304.42.857 2.101.224 2.903-.633.803-1.974 2.025-2.011 2.637 0 0 1.6-.191 1.936-.191s7.672.84 7.783-7.146c.112-5.54-2.607-7.336-4.32-7.336-1.712 0-2.904.611-2.904.611s3.091.993 2.755 2.75c-.335 1.758-1.713 1.147-2.532.498-.82-.649-4.06-3.094-5.475-1.108 0 0 1.528 1.667 1.304 2.254-.224.588-.745.802-1.341.765s-5.473-.843-6.106 2.253"/><path fill="#fbccff" d="M18.718 27.035c-1.449 1.282-2.715-.196-4.13.9-.25-.916 1.39-1.987.719-3.248-.67-1.26-2.197.038-3.314-.993 0 0 .701-.331.444-1.267-.257-.937-1.053-.987-2.148-1.091.624-1.693 4.845 1.325 6.011.384 1.167-.943-.248-1.923-.248-1.923s1.526-1.681 2.83-.65c0 0 .794 1.911.67 4.05-.123 2.14-.835 3.838-.835 3.838z"/><path stroke="#002140" stroke-linecap="round" stroke-linejoin="round" d="M19.477 22.778c0 9.17-6.455 6.776-9.732 7.846-.05-1.02 3.675-3.108 2.434-5.196-1.242-2.089-7.225 2.904-8.788 1.68 0 0 2.553-1.312 1.848-2.796s-3.205-.466-4.463-.363c1.423-4.228 6.636-1.63 7.381-2.495.746-.867-.329-2.122-1.191-2.75 1.837-3.058 6.01 2.21 7.3 1.665s1.439-2.837-1.99-3.905c.449-.461 7.202-2.803 7.202 6.315m10.365-9.106h-13.01m-1.119.857h-5.427m10.616-2.18h-6.067m15.007 20.712h-13.01m-1.119-.858h-5.427m10.616 2.181h-6.067"/></svg>
\ No newline at end of file
diff --git a/assets/images/user-shield.svg b/assets/images/user-shield.svg
deleted file mode 100644
index f1f4ad1d1ab4..000000000000
--- a/assets/images/user-shield.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" id="Layer_1" x="0" y="0" viewBox="0 0 20 20"><style>.st0{fill-rule:evenodd;clip-rule:evenodd}</style><path d="M13.556 5.555a3.556 3.556 0 1 1-7.112 0 3.556 3.556 0 0 1 7.112 0m-2.536 8.939c.11 1.321.637 2.53 1.222 3.507h-8.02c-1.416 0-2.223-.444-2.223-1.778 0-3.556 4-6.223 8-6.223a9.55 9.55 0 0 1 4.54 1.165l-2.024.867c-.885.38-1.59 1.312-1.495 2.462"/><path d="m16.697 12.584 3 1.286c.184.079.306.26.29.46-.193 2.331-2.35 4.597-3.172 5.38a.453.453 0 0 1-.63 0c-.822-.784-2.98-3.049-3.171-5.38a.46.46 0 0 1 .289-.46l3-1.286a.5.5 0 0 1 .394 0" class="st0"/></svg>
\ No newline at end of file
diff --git a/contributingGuides/philosophies/AI-REVIEWER.md b/contributingGuides/philosophies/AI-REVIEWER.md
index 2cb76c592035..43fe9931e685 100644
--- a/contributingGuides/philosophies/AI-REVIEWER.md
+++ b/contributingGuides/philosophies/AI-REVIEWER.md
@@ -174,17 +174,17 @@ Escalate to human reviewers when:
 ### Examples
 
 #### Appropriate Response to Valid Feedback
-**AI Comment**: "PERF-1: Spread operator used on object in renderItem creates new object references on each render."
+**AI Comment**: "PERF-4: This object passed as a prop should be memoized to prevent unnecessary re-renders."
 
-✅ **Good Response**: Pass individual props directly instead of using spread operator, or move object creation outside renderItem.
+✅ **Good Response**: Wrap the object in `useMemo` or refactor to avoid creating new references.
 
 ❌ **Bad Response**: Ignore the feedback without consideration.
 
 #### Appropriate Response to False Positive
-**AI Comment**: "PERF-11: Add a selector to `useOnyx` to select only the `name` and `avatar` fields instead of the entire user object."
+**AI Comment**: "PERF-4: This object passed as a prop should be memoized."
 
-**Context**: A selector is already present in the code - the AI reviewer missed it during analysis.
+**Context**: The parent component is already optimized by React Compiler.
 
-✅ **Good Response**: Reach out in the #expensify-open-source Slack channel explaining that a selector is already being used.
+✅ **Good Response**: Reach out in the #expensify-open-source Slack channel with explanation of incorrect suggestion.
 
-❌ **Bad Response**: Add a duplicate selector or ignore the feedback without verifying the claim.
+❌ **Bad Response**: Apply the change anyway, adding unnecessary complexity.
diff --git a/cspell.json b/cspell.json
index 5cc365f37ff1..67c2c36081fb 100644
--- a/cspell.json
+++ b/cspell.json
@@ -7,7 +7,6 @@
     },
     "words": [
         "--longpress",
-        "abytes",
         "Accelo",
         "achreimburse",
         "actool",
@@ -184,7 +183,6 @@
         "Drycleaning",
         "DSYM",
         "dsyms",
-        "Dumpty",
         "durationMillis",
         "e2edelta",
         "ecash",
@@ -303,7 +301,6 @@
         "Hoverable",
         "HRMS",
         "HSBCSGS",
-        "Humpty",
         "hybridapp",
         "Hydronics",
         "iaco",
@@ -415,7 +412,6 @@
         "msword",
         "mtrl",
         "multidex",
-        "Multifactor",
         "MVCP",
         "MYOB",
         "mysubdomain",
@@ -600,7 +596,6 @@
         "Roni",
         "Rosiclair",
         "rpartition",
-        "RPID",
         "RRGGBB",
         "rstrip",
         "RTER",
diff --git a/docs/_data/_routes.yml b/docs/_data/_routes.yml
index 094e98eaa60a..b8aff65e5f73 100644
--- a/docs/_data/_routes.yml
+++ b/docs/_data/_routes.yml
@@ -118,11 +118,6 @@ platforms:
         title: Reports & Expenses
         icon: /assets/images/envelope-receipt.svg
         description: Learn more about expense tracking and submission.
-      
-      - href: domains
-        title: Domains
-        icon: /assets/images/domains.svg
-        description: Claim and verify your company’s domain to access additional management and security features.
 
       - href: wallet-and-payments
         title: Wallet & Payments
diff --git a/docs/articles/expensify-classic/domains/Managing-Single-Sign-On-(SSO)-in-Expensify.md b/docs/articles/expensify-classic/domains/Managing-Single-Sign-On-(SSO)-in-Expensify.md
new file mode 100644
index 000000000000..e32a2a8d5a36
--- /dev/null
+++ b/docs/articles/expensify-classic/domains/Managing-Single-Sign-On-(SSO)-in-Expensify.md
@@ -0,0 +1,86 @@
+---
+title: Managing Single Sign-On (SSO) and User Authentication in Expensify
+description: Learn how to effectively manage Single Sign-On (SSO) and user authentication in Expensify alongside your preferred SSO provider. 
+keywords: [Expensify Classic, SAML, single sign-on, SSO]
+---
+
+
+Expensify supports Single Sign-On (SSO) through the SAML protocol, allowing you to optimize user authentication and improve security across your organization. Whether you're an IT admin configuring your domain or a team lead ensuring secure user access, this guide walks you through setting up and managing SAML SSO for your Expensify account
+
+---
+
+# Accessing SAML Settings
+⚠️ **Pre-requisite:** Ensure your [domain is verified](https://help.expensify.com/articles/expensify-classic/domains/Claim-And-Verify-A-Domain#step-2-verify-domain-ownership).
+
+1. Navigate to: **Settings > Domains > [Domain Name] > SAML**.  
+2. **From the Domains page:**  
+   - Download Expensify's **Service Provider Metadata** to provide to your Identity Provider.  
+   - Enter the **Identity Provider Metadata** from your SSO provider. (Contact your provider if unsure how to obtain this).  
+   - Enable the **"SAML required for login"** option, ensuring users sign in via SSO only.
+
+---
+
+# Provider-Specific Setup Instructions
+
+Click on your Identity (SAML) Provider for detailed steps:  
+- [Amazon Web Services (AWS SSO)](https://static.global.sso.amazonaws.com/app-202a715cb67cddd9/instructions/index.htm)  
+- [Google SAML (Gsuite)](https://support.google.com/a/answer/7371682)  
+- [Microsoft Entra ID (formerly Azure Active Directory)](https://learn.microsoft.com/en-us/entra/identity/saas-apps/expensify-tutorial)  
+- [Okta](https://saml-doc.okta.com/SAML_Docs/How-to-Configure-SAML-2.0-for-Expensify.html)  
+- [OneLogin](https://onelogin.service-now.com/support?id=kb_article&sys_id=e44c9e52db187410fe39dde7489619ba)  
+- [Oracle Identity Cloud Service](https://docs.oracle.com/en/cloud/paas/identity-cloud/idcsc/expensify.html#Expensify)  
+- [SAASPASS](https://saaspass.com/saaspass/expensify-two-factor-authentication-2fa-single-sign-on-sso-saml.html)  
+- Microsoft ADFS (instructions below).  
+
+**Note:** If your provider isn't listed, contact them directly for guidance.
+
+---
+
+# Common Troubleshooting Scenarios
+
+## User Login with SSO
+- Employees using their **company email** or a **secondary linked email** (e.g., Gmail) will be prompted to log in through SSO.  
+- Secondary login setup guide: [Change or Add Email Address](https://help.expensify.com/articles/expensify-classic/settings/Change-or-add-email-address).
+
+## Error During SSO Setup?
+- Use [samltool.com](https://samltool.com) to validate your configuration data.  
+- Contact your Account Manager or Concierge for further help.  
+
+## What is Expensify's Entity ID?
+- Default: `https://expensify.com`  
+- For Multi-Domain setups: `https://expensify.com/mydomainname.com`.
+
+## Managing Multiple Domains with One Entity ID 
+Yes, it's possible. Contact Concierge or your Account Manager to enable this feature.  
+
+## Updating Microsoft Entra ID SSO Certificate
+Steps to avoid configuration errors during certificate renewal:  
+1. **Create** a new certificate in Microsoft Entra.  
+2. **Remove** the old certificate before activating the new one.  
+3. Replace the **IDP** in Expensify with the new one.  
+4. Log in via SSO.  
+
+If issues persist, contact Concierge Support for assistance.  
+
+---
+
+# Advanced Configurations
+
+## Okta SCIM API for User Deactivation
+Ensure your domain is verified and the SAML setup is complete. Then, do the following:
+1. Go to **Settings > Domains > [Domain Name] > SAML**.  
+2. Enable SAML Login and toggle **Required for login**.  
+3. In Okta, add Expensify as an application, and configure user profile mappings.  
+4. Request **Okta SCIM API** activation via concierge@expensify.com.  
+5. Integrate the **SCIM token** with Okta API provisioning.  
+
+Refer to the full setup in Okta's documentation for attribute mapping and provisioning options.
+
+## Microsoft ADFS SAML Authentication
+1. Open **ADFS Management Console** and add a new trust.  
+2. Import Expensify's metadata XML from the SAML page.  
+3. Configure **LDAP Attributes** for email or UPN.  
+4. Add two claim rules:  
+   - Send LDAP Attributes as Claims.  
+   - Transform Incoming Claim (Name ID). 
+
diff --git a/docs/articles/expensify-classic/domains/Set-Up-SAML-SSO.md b/docs/articles/expensify-classic/domains/Set-Up-SAML-SSO.md
deleted file mode 100644
index 37cb3f349874..000000000000
--- a/docs/articles/expensify-classic/domains/Set-Up-SAML-SSO.md
+++ /dev/null
@@ -1,128 +0,0 @@
----
-title: Managing Single Sign-On (SSO) and User Authentication in Expensify
-description: Learn how to set up and manage SAML-based Single Sign-On (SSO) for secure member login in Expensify Classic.
-internalScope: Audience: Domain Admins. Covers setting up SAML and solutions to common configuration issues, Does not cover individual account access troubleshooting. 
-keywords: [Expensify Classic, SAML SSO, domain security, single sign-on, identity provider, verified domain, enable SAML, Okta, Google Workspace, Microsoft Entra, ADFS]
----
-
-Set up secure and streamlined login across your organization by enabling SAML Single Sign-On (SSO) in Expensify Classic. This allows Workspace members to authenticate using your identity provider (IdP), rather than creating separate credentials.
-
----
-
-# Where to find SAML Single Sign-On (SSO) settings in Expensify Classic 
-
-To set up SAML Single Sign-On (SSO), verify your domain. 
-[Learn how to claim and verify your domain](https://help.expensify.com/articles/expensify-classic/domains/Claim-And-Verify-A-Domain#step-2-verify-domain-ownership)
-
-Once you are a Domain Admin on a verified domain, you can configure SAML SSO login: 
-
-1. Go to **Settings > Domains > [Domain Name] > SAML**.
-2. Toggle **SAML Login** to **Enabled**.
-
----
-
-# Who can manage SAML Single Sign-On (SSO)
-
- Only **Domain Admins** can configure SAML for verified domains. SAML login applies to all Domain members whose email addresses match the verified domain.
-
----
-
-# How to set up SAML Single Sign-On (SSO) 
-
-1. Go to **Settings > Domains > [Domain Name] > SAML**.
-2. Toggle **SAML Login** to **Enabled**.
-3. Download Expensify’s **Service Provider metadata** to upload to your IdP.
-4. Paste your IdP metadata in the **Identity Provider MetaData** field.
-5. Test logging in to confirm that SAML SSO is configured correctly (recommended).
-6. Enable **Required for login** to ensure  members sign in via SSO only.
-   
-Select your Identity (SAML) Provider for detailed steps on configuring SAML Single Sign-On (SSO): 
-
-- [Amazon Web Services (AWS SSO)](https://static.global.sso.amazonaws.com/app-202a715cb67cddd9/instructions/index.htm)
-- [Google Workspace / SAML (Gsuite)](https://support.google.com/a/answer/7371682)
-- [Microsoft Entra ID (formerly Azure AD)](https://learn.microsoft.com/en-us/entra/identity/saas-apps/expensify-tutorial)
-- [Okta](https://saml-doc.okta.com/SAML_Docs/How-to-Configure-SAML-2.0-for-Expensify.html)
-- [OneLogin](https://onelogin.service-now.com/support?id=kb_article&sys_id=e44c9e52db187410fe39dde7489619ba)
-- [Oracle Identity Cloud Service](https://docs.oracle.com/en/cloud/paas/identity-cloud/idcsc/expensify.html#Expensify)
-- [SAASPASS](https://saaspass.com/saaspass/expensify-two-factor-authentication-2fa-single-sign-on-sso-saml.html)
-- Microsoft ADFS – see instructions below
-
-**Note:** If your provider isn't listed, contact them directly for guidance with metadata and setup.
-
----
-
-# How SAML Single Sign-On (SSO) affects login behavior
-
-- Members with email addresses matching your verified domain will be prompted to log in through your configured IdP.
-- Members using a personal or secondary email (e.g., Gmail) must [update their email address](https://help.expensify.com/articles/expensify-classic/settings/Change-or-add-email-address) to match the verified domain for SSO access.
-
----
-
-# Troubleshooting SAML Single Sign-On (SSO)
-
-## If setup fails or login doesn't work:
-
-- Use [samltool.com](https://samltool.com) to validate your IdP metadata and certificate.
-- Make sure the email domain in your IdP exactly matches your verified domain in Expensify.
-
-## What is Expensify’s Entity ID?
-
-- Standard setup: `https://expensify.com`
-- Multi-domain setup: `https://expensify.com/yourdomain.com`
-
-Managing multiple domains with one Entity ID is supported. Contact Concierge or your Account Manager to enable this feature.
-
-# Advanced configurations for SAML Single Sign-On (SSO)
-
-## Okta SCIM API for account deprovisioning
-
-Once SAML is configured: 
-
-1. In Okta, add Expensify as an app and configure attribute mappings.
-2. Request SCIM API access via **concierge@expensify.com**.
-3. Add the SCIM token in your Okta provisioning settings.
-
-Refer to Okta’s documentation for complete instructions.
-
-## Microsoft ADFS configuration
-
-1. Open the **ADFS Management Console** and create a new trust.
-2. Upload Expensify’s metadata XML file.
-3. Map **LDAP attributes** (email or UPN) to outgoing claims.
-4. Add two claim rules:
-   - Send LDAP Attributes as Claims
-   - Transform Incoming Claim to Name ID
-
-## Microsoft Entra ID certificate update process
-
-To avoid setup errors during certificate renewal:
-
-1. Create the new certificate in Microsoft Entra.
-2. Remove the old certificate before activating the new one.
-3. Replace the existing IdP metadata in Expensify.
-4. Log in via SSO to confirm the new certificate works.
-
-# FAQ
-
-## Can I use SAML Single Sign-On (SSO) for multiple Workspaces?
-
-Yes, as long as all members are part of the same verified domain, SAML access applies across all Workspaces they belong to.
-
-## How can I confirm my SAML Single Sign-On (SSO) setup is working?
-
-Before enabling **Require SAML login**, make sure your SAML connection is working by testing both SP-initiated and IdP-initiated logins. You should also confirm that:
-
-- The correct certificate and endpoints are in your Expensify metadata
-- Members can log in successfully using the SAML flow
-
-## Can I test a new SAML Single Sign-On (SSO) setup without locking members out?
-
-Yes. Disable **Require SAML login** before making changes. This allows members to log in with email and password if SAML setup fails. Once you’ve confirmed that login works, you can re-enable enforcement.
-
-## What do I do if a member can’t log in after SAML Single Sign-On (SSO) is enabled?
-
-First, confirm that the member’s email matches your verified domain and that their account exists in your Identity Provider (IdP) with the correct access permissions. 
-
-## Are custom NameID, ACS, or SLO URLs supported in SAML Single Sign-On (SSO)?
-
-No, the NameID Format, Login URL (ACS URL), and Logout URL (SLO URL) are static and cannot be modified.
diff --git a/docs/articles/expensify-classic/domains/Troubleshoot-SAML-SSO-Login.md b/docs/articles/expensify-classic/domains/Troubleshoot-SAML-SSO-Login.md
deleted file mode 100644
index 33c8855ed61a..000000000000
--- a/docs/articles/expensify-classic/domains/Troubleshoot-SAML-SSO-Login.md
+++ /dev/null
@@ -1,121 +0,0 @@
----
-title: Troubleshoot SAML SSO login
-description: Learn how to quickly diagnose and resolve issues with SAML SSO login in Expensify Classic, including lockouts, expired certificates, and identity provider errors.
-keywords: [Expensify Classic, SAML SSO, SSO login failed, Require SAML login, domain locked out, expired certificate, identity provider, IdP, metadata, troubleshooting]
----
-
-If you're having trouble logging in with SAML Single Sign-On (SSO) in Expensify Classic, this guide will help you identify the issue, understand what’s causing it, and get access restored quickly.
-
----
-
-# Where to find SAML SSO settings in Expensify Classic
-
-To check your domain's SAML SSO configuration, go to **Settings > Domains > [Domain Name] > SAML**.
-
-From this page, Domain Admins can: 
-
-- Enable SAML SSO login for the domain 
-- View and update your Identity Provider (IdP) metadata
-- Disable or enable **Require SAML login**
-
-**Note:** SAML SSO settings are not available on mobile. 
-
-# How to fix domain-wide SAML SSO login issues
-
-## SAML login suddenly fails for all members
-
-A domain-wide issue usually points to a problem with your Identity Provider (IdP). 
-
-**Has your IdP certificate expired or rotated?**
-
- If yes, copy the updated metadata XML from your IdP and paste it into the **Identity Provider Metadata** field in your Expensify SAML settings.
-
-**Have any IdP settings changed?**
-
-Changes to entity IDs, SSO endpoints, or user attributes can break login.
- - If your certificate or SSO endpoints have changed, upload updated metadata from your IdP to Expensify.
- - If user attributes like NameID Format or email mappings have changed, confirm they match the values expected in your domain's SAML settings in Expensify.
-
-**Is “Require SAML login” turned on?**  
-
- If enabled, no one — including Domain Admins — can log in without a working SAML configuration. If you're still signed in, go to your domain’s SAML settings and temporarily disable **Require SAML login** while troubleshooting. 
-
-## Some members can’t log in, but others can
-
-This is often caused by an email alias not recognized by your identity provider (IdP), or because the member hasn’t been added to the correct SAML rule or group. Confirm that the member’s email matches your verified domain in Expensify, and check your IdP to ensure they’re included in the appropriate SAML group or rule.
-
-## All Domain Admins are locked out
-
-If no Domain Admins can log in, you won’t be able to access SAML settings. Email **concierge@expensify.com** from an address that matches your verified domain for help.
-
----
-
-# How to resolve common SAML SSO error messages 
-
-## Signature validation failed  
-
-This typically happens when the certificate has expired, is malformed, or doesn't match the one used by your IdP. To fix it, copy the updated metadata XML from your IdP and paste it into the **Identity Provider Metadata** field in your Expensify SAML settings.
-
----
-
-## SAML Response not found. Only supported HTTP_POST Binding  
-
-Your Identity Provider is not sending the `SAMLResponse` in the POST body as expected. To fix it, update your IdP configuration to use **HTTP POST binding** when sending the SAML Response.
-
----
-
-## No user with that partnerUserID/partnerUserSecret  
-
-This occurs when your IdP sends an email (NameID) that doesn’t match the one stored in Expensify for that member. To fix it, confirm that the NameID value sent by your IdP exactly matches the member’s email address in Expensify. If needed, update the member's email in your IdP or in Expensify to resolve the mismatch.
-
----
-
-## Bad XML metadata
-
-Your metadata file may contain formatting issues — often extra line breaks or copy/paste errors in the x.509 certificate.  
-**How to fix it:** Use a certificate formatting tool (like [samltool.com](https://samltool.com)) to clean and validate your metadata before pasting it into Expensify.
-
-**Note:** When copying a certificate, make sure it includes the full `-----BEGIN CERTIFICATE-----` and `-----END CERTIFICATE-----` block with no formatting errors.
-
----
-
-## SAML login not available on your domain  
-
-This appears when **Require SAML login** is enabled, but SAML isn’t fully configured. To fix it, follow the steps to [Configure Single Sign On (SSO)](https://help.expensify.com/articles/expensify-classic/domains/Managing-Single-Sign-On-(SSO)-in-Expensify) for your domain. 
-
----
-
-# How to contact Expensify if you're locked out
-
-If you can't sign in due to a SAML issue, email **concierge@expensify.com** from an address that matches your verified domain.
-
----
-
-# FAQ
-
-## What should I do before making changes to my domain's SAML SSO setup?
-
-Before making changes to your Identity Provider setup — like rotating certificates or updating endpoints — we recommend **temporarily disabling Require SAML login** in Expensify.
-
-This ensures Domain Admins can still sign in with email and password if the new configuration doesn’t work. Once you’ve uploaded the new metadata and confirmed login is working, you can safely re-enable Require SAML login.
-
-## Can I make SAML login optional for some members?
-
-No. SAML settings apply to the entire domain. If **Require SAML login** is enabled, **all members** must authenticate via SAML — there’s no way to allow some members to log in with email and password while others use SAML.
-
-## Can I test a new SAML setup without locking members out?
-
-Yes. You can disable **Require SAML login** while testing or updating your SAML settings. This allows members to log in with email/password if needed. Once you're confident the new metadata works, re-enable SAML enforcement.
-
-## How can I confirm my SAML setup is correct?
-
-Before enabling **Require SAML login**, make sure your SAML connection is working by testing both SP-initiated and IdP-initiated logins. You should also confirm that:
-
-- The correct certificate and endpoints are in your Expensify metadata
-- Your IdP sends the proper NameID (usually the member's email)
-- Members can log in successfully using the SAML flow
-
-For step-by-step setup and testing instructions, check out the [SAML setup guide](https://help.expensify.com/articles/expensify-classic/domains/Managing-Single-Sign-On-(SSO)-in-Expensify).
-
-
-
diff --git a/docs/articles/expensify-classic/settings/Two-Factor-Authentication.md b/docs/articles/expensify-classic/settings/Two-Factor-Authentication.md
index 28ba0ad971d0..0aab5c392215 100644
--- a/docs/articles/expensify-classic/settings/Two-Factor-Authentication.md
+++ b/docs/articles/expensify-classic/settings/Two-Factor-Authentication.md
@@ -1,95 +1,83 @@
 ---
 title: Two-Factor Authentication
-description: Learn how to set up two-factor authentication in Expensify Classic and what to do if you're locked out of your account.
-keywords: [Expensify Classic, two-factor authentication, 2FA, login security, authenticator app, recovery codes, locked out, lost phone, account recovery, Domain Admin reset, backup codes]
+description: Enhance your account security by enabling two-factor authentication (2FA) in Expensify.
+keywords: [two-factor authentication, 2FA, security, Expensify, authenticator app, backup codes]
 ---
 
-Setting up two-factor authentication (2FA) in Expensify Classic adds an extra layer of protection to your account. This guide explains how to enable 2FA and what to expect if you're ever locked out.
+Setting up two-factor authentication (2FA) adds an extra layer of security to protect your financial data. When you log in, you must enter a code generated by your preferred authenticator app (such as Google Authenticator or Microsoft Authenticator).
+
+Expensify's 2FA is implemented via a Time-based One-Time Password (TOTP) algorithm. Each time you log in, you must use an authenticator app to generate a unique 6-digit code, adding a second “factor” to your login.
 
 ---
 
-# Who can enable Two-Factor Authentication in Expensify Classic
+# Recommended Authenticator Apps
 
-Anyone can enable Two-Factor Authentication on their own account. Domain Admins can require all members on a domain to enable Two-Factor Authentication on their accounts.
+You can use any authenticator app, but here are a few we recommend:
 
-# How to enable Two-Factor Authentication on your account in Expensify Classic 
+- [1Password](https://support.1password.com/one-time-passwords/)
+- [Authy](https://authy.com/)
+- [Google Authenticator](https://support.google.com/accounts/answer/1066447)
+- [Microsoft Authenticator](https://www.microsoft.com/en-us/security/mobile-authenticator-app)
 
-1. Ensure an authenticator app is installed on your device. 
-2. Go to **Settings > Account > Profile**.
-3. Enable **Two-factor authentication**.
-4. Save a copy of your backup codes:
+Ensure you have an authenticator app installed before proceeding.
+
+---
+
+# Enable Two-Factor Authentication
+
+1. Go to **Settings > Account > Profile**.
+2. Enable **Two-factor authentication**.
+3. Save a copy of your backup codes:
    - Click **Download** to save them to your computer.
    - Click **Copy** to store them in a secure location.
-5. Click **Continue**.
-6. Open your authenticator app and either:
+- **Important!** If you lose access to your authenticator app and do not have your recovery codes, you will lose access to your account.
+4. Click **Continue**.
+5. Open your authenticator app and either:
    - Scan the QR code displayed on your screen.
-   - Enter the 6-digit code from your authenticator app into Expensify and then click **Verify**.
-
-**Important:** If you lose access to your authenticator app and didn’t save your recovery codes, you may permanently lose access to your account. Consider adding 2FA on multiple devices (e.g., phone and tablet) for backup.  
-
-# How to enable Two-Factor Authentication on a domain
+   - Enter the 6-digit code from your authenticator app into Expensify and click **Verify**.
 
-1. Go to **Settings > Domains > [domain name] > Domain Members**.
-2. Enable **Two-Factor Authentication**.
+**Once set up, when logging into Expensify, you will:**
+- Receive a Magic Code email to initiate login.
+- Be prompted to enter a 6-digit code from your authenticator app.
 
-**Note:** 2FA can’t be enabled for domains that use SAML.
+Codes refresh every few seconds. If you receive a message that the code is expired, re-refer to your authenticator app and use the most up-to-date code.
 
 ---
 
-## For Domain Admins: Reset Two-Factor Authentication for a member
+# Lost Recovery Codes or Access to the Authenticator App
+
+If you lose your mobile device and recovery codes, a **Domain Admin** can reset an employee's 2FA settings **only if**:
 
-If a member loses access to their authenticator app or recovery codes, you can reset their 2FA if: 
-- They use a company email on your verified domain, **and**
-- You (the Domain Admin) also have 2FA enabled
+- The employee uses a company email or a domain you own.
+- The Domain Admin also has 2FA enabled.
 
-To reset a member’s 2FA settings:
+## Reset 2FA as a Domain Admin
 
 1. Go to **Settings > Domains > Domain Members**.
 2. Click **Edit Settings** for the affected email address.
 3. Click **Reset** to disable 2FA.
-4. The member can now log in and set up 2FA again.
-
-If your domain doesn't have 2FA enabled yet:
+4. The user can now log in and reconfigure 2FA.
 
+If your domain does not have 2FA enabled:
 1. Go to **Settings > Domains > Domain Members**.
 2. Enable **Two-Factor Authentication**.
-3. Then follow the steps above to reset 2FA for the member.
+3. Follow the previous steps to reset 2FA for the user.
 
----
+**Note:** If you use a non-corporate email (e.g., Gmail, Yahoo, Hotmail), Expensify cannot disable 2FA. If recovery codes are lost, you may need to create a new account with a different email.
 
-## What to do if you're locked out because of Two-Factor Authentication
-
-If you can’t access your authenticator app and don’t have your recovery codes, contact your Domain Admin to reset your 2FA. 
-
-If no Domain Admin is available and you're using a company email, you can follow [this guide](https://help.expensify.com/articles/expensify-classic/domains/Claim-And-Verify-A-Domain) to claim the domain and reset your 2FA settings yourself.
-
-For more help regaining access, see [Troubleshoot login issues](LINK).
+If no Domain Admin is available, follow [this guide](https://help.expensify.com/articles/expensify-classic/domains/Claim-And-Verify-A-Domain) to verify the domain, and then run through the steps above.
 
 ---
 
-# FAQ
-
-## How does 2FA change how I log into my account? 
-
-Setting up two-factor authentication (2FA) adds an extra layer of security to protect your Expensify Account. When you log in, you must enter a code generated by your preferred authenticator app (such as Google Authenticator or Microsoft Authenticator).
-
-## How does 2FA work? 
-
-Expensify's 2FA is implemented via a Time-based One-Time Password (TOTP) algorithm. Each time you log in, you must use an authenticator app to generate a unique 6-digit code, adding a second “factor” to your login.
-
-## What can I do if I can't access my authenticator app? 
-
-When you enable 2FA, you are prompted to either copy or download backup codes which you can use in lieu of the 6-digit authenticator code. If you downloaded the codes they will be saved with the file name `two-factor-auth-codes`. 
+# Troubleshooting
 
-## What authenticator apps does Expensify recommend? 
-
-You can use any authenticator app, but here are a few we recommend:
+Ensure your phone’s time is set to **automatic update**. A manual time difference can cause issues when entering the authentication code. See this resource for more details on [setting the timezone in your account](https://help.expensify.com/articles/expensify-classic/settings/Set-Time-Zone).
 
-- [1Password](https://support.1password.com/one-time-passwords/)
-- [Authy](https://authy.com/)
-- [Google Authenticator](https://support.google.com/accounts/answer/1066447)
-- [Microsoft Authenticator](https://www.microsoft.com/en-us/security/mobile-authenticator-app)
+Make sure you're not still logged in on another device. If you are, do the following:
+  1. Go to **Settings > Account > Profile**.
+  2. Toggle **Two-factor authentication** to off.
+  3. Try logging in again.
+  4. Once logged in, you can re-enable 2FA.
 
-## What if my verification code isn’t working?
-Make sure your device’s clock is set to update automatically. Authenticator apps rely on your system clock being accurate, and even a small time difference can cause verification codes to fail.
+Following these steps ensures your account remains secure while preventing access issues.
 
diff --git a/docs/articles/new-expensify/billing-and-subscriptions/Billing-Overview.md b/docs/articles/new-expensify/billing-and-subscriptions/Billing-Overview.md
index 1cccf0d93d7e..b5a25eff8385 100644
--- a/docs/articles/new-expensify/billing-and-subscriptions/Billing-Overview.md
+++ b/docs/articles/new-expensify/billing-and-subscriptions/Billing-Overview.md
@@ -47,11 +47,13 @@ Expensify offers two subscription plans — **Collect** and **Control** — desi
   <ul>
     <li>£5 per unique member/month</li>
     <li>Fully flexible — add/remove members anytime</li>
+    <li>Optional Expensify Card with 1% cash back (USD only)</li>
   </ul>
   <strong>Control</strong>
   <ul>
-    <li>£14 per active member/month with Annual Subscription</li>
-    <li>£28 pay-per-use</li>
+    <li>£14 per active member/month with Annual Subscription + Card</li>
+    <li>£28 without Card or for pay-per-use</li>
+    <li>Earn up to 2% cash back</li>
   </ul>
 </div>
 
@@ -61,11 +63,12 @@ Expensify offers two subscription plans — **Collect** and **Control** — desi
   <ul>
     <li>€5 per unique member/month</li>
     <li>Month-to-month — no contract</li>
+    <li>Optional Expensify Card</li>
   </ul>
   <strong>Control</strong>
   <ul>
-    <li>€16 per active member/month with Annual Subscription</li>
-    <li>€32 pay-per-use</li>
+    <li>€16 per active member/month with Annual Subscription + Card</li>
+    <li>€32 without Card or for pay-per-use</li>
   </ul>
 </div>
 
@@ -78,8 +81,8 @@ Expensify offers two subscription plans — **Collect** and **Control** — desi
   </ul>
   <strong>Control</strong>
   <ul>
-    <li>AU$30 per active member/month with Annual Subscription</li>
-    <li>AU$60 pay-per-use</li>
+    <li>AU$30 per active member/month with Annual Subscription + Card</li>
+    <li>AU$60 without Card or for pay-per-use</li>
   </ul>
 </div>
 
@@ -92,8 +95,8 @@ Expensify offers two subscription plans — **Collect** and **Control** — desi
   </ul>
   <strong>Control</strong>
   <ul>
-    <li>NZ$32 per active member/month with Annual Subscription</li>
-    <li>NZ$64 pay-per-use</li>
+    <li>NZ$32 per active member/month with Annual Subscription + Card</li>
+    <li>NZ$64 without Card or for pay-per-use</li>
   </ul>
 </div>
 
@@ -135,7 +138,7 @@ Expensify offers two subscription plans — **Collect** and **Control** — desi
 
 # Billing eligibility and details
 
-## 💳 Expensify Card usage (US Only)
+## 💳 Expensify Card usage
 
 - **Collect:** Card is optional — but earns 1% cash back on US spend
 - **Control:** Card is required for discounted pricing and cash back
diff --git a/docs/articles/new-expensify/domains/Set-Up-SAML-SSO.md b/docs/articles/new-expensify/domains/Set-Up-SAML-SSO.md
deleted file mode 100644
index b34eb5a36aa7..000000000000
--- a/docs/articles/new-expensify/domains/Set-Up-SAML-SSO.md
+++ /dev/null
@@ -1,126 +0,0 @@
----
-title: Set Up SAML Single Sign-On (SSO)
-description: Learn how to enable and configure SAML SSO in New Expensify to secure login for domain members using your organization's identity provider.
-keywords: [New Expensify, SAML SSO, domain security, single sign-on, identity provider, verified domain, enable SAML, Okta, Google Workspace, Microsoft Entra, ADFS]
----
-
-Set up secure and streamlined login across your organization by enabling SAML Single Sign-On (SSO) in New Expensify. This allows Workspace members to authenticate using your identity provider (IdP), rather than creating separate credentials.
-
-# Where to find SAML Single Sign-On (SSO) settings
-
-Go to Domains > [Domain Name] > SAML to manage SAML Single Sign-On (SSO).
-
-**Note:** Your domain must be verified before you can enable SAML. [Learn how to claim and verify a domain](https://help.expensify.com/articles/new-expensify/workspaces/Claim-and-Verify-a-Domain).
-
-Once you are a Domain Admin on a verified domain, you can configure SAML SSO login: 
-
-1. Go to **Workspaces > [domain name] > SAML**.
-2. Toggle **SAML Login** to **Enabled**.
-
----
-
-# Who can manage SAML Single Sign-On (SSO)
-
-Only **Domain Admins** can configure SAML for verified domains. SAML login applies to all Domain members whose email addresses match the verified domain.
-
----
-
-# How to set up SAML Single Sign-On (SSO) 
-
-1. Go to **Workspaces > [domain name] > SAML**.
-2. Toggle **SAML Login** to **Enabled**.
-3. Download Expensify’s **Service Provider metadata** to upload to your IdP.
-4. Paste your IdP metadata in the **Identity Provider MetaData** field.
-5. Test logging in to confirm that SAML SSO is configured correctly (recommended).
-6. Enable **Required for login** to ensure  members sign in via SSO only.
-   
-Select your Identity (SAML) Provider for detailed steps on configuring SAML Single Sign-On (SSO): 
-
-- [Amazon Web Services (AWS SSO)](https://static.global.sso.amazonaws.com/app-202a715cb67cddd9/instructions/index.htm)
-- [Google Workspace / SAML (Gsuite)](https://support.google.com/a/answer/7371682)
-- [Microsoft Entra ID (formerly Azure AD)](https://learn.microsoft.com/en-us/entra/identity/saas-apps/expensify-tutorial)
-- [Okta](https://saml-doc.okta.com/SAML_Docs/How-to-Configure-SAML-2.0-for-Expensify.html)
-- [OneLogin](https://onelogin.service-now.com/support?id=kb_article&sys_id=e44c9e52db187410fe39dde7489619ba)
-- [Oracle Identity Cloud Service](https://docs.oracle.com/en/cloud/paas/identity-cloud/idcsc/expensify.html#Expensify)
-- [SAASPASS](https://saaspass.com/saaspass/expensify-two-factor-authentication-2fa-single-sign-on-sso-saml.html)
-- Microsoft ADFS – see instructions below
-
-**Note:** If your provider isn't listed, contact them directly for guidance with metadata and setup.
-
----
-
-# How SAML Single Sign-On (SSO) affects member login
-
-- Members with email addresses matching your verified domain will be prompted to log in through your configured IdP.
-- Members using a personal or secondary email (e.g., Gmail) must [update their email address](https://help.expensify.com/articles/new-expensify/settings/Update-Email-Address) to match the verified domain for SSO access.
-
----
-
-# Troubleshooting SAML Single Sign-On (SSO)
-
-## If setup fails or login doesn't work:
-
-- Use [samltool.com](https://samltool.com) to validate your IdP metadata and certificate.
-- Make sure the email domain in your IdP exactly matches your verified domain in Expensify.
-
-## What is Expensify’s Entity ID?
-
-- Standard setup: `https://expensify.com`
-- Multi-domain setup: `https://expensify.com/yourdomain.com`
-
-Managing multiple domains with one Entity ID is supported. Contact Concierge or your Account Manager to enable this feature.
-
-# Advanced configurations for SAML Single Sign-On (SSO)
-
-## Okta SCIM API and SAML provisioning
-
-Once SAML is configured: 
-
-1. In Okta, add Expensify as an app and configure attribute mappings.
-2. Request SCIM API access via **concierge@expensify.com**.
-3. Add the SCIM token in your Okta provisioning settings.
-
-Refer to Okta’s documentation for complete instructions.
-
-## Microsoft ADFS configuration
-
-1. Open the **ADFS Management Console** and create a new trust.
-2. Upload Expensify’s metadata XML file.
-3. Map **LDAP attributes** (email or UPN) to outgoing claims.
-4. Add two claim rules:
-   - Send LDAP Attributes as Claims
-   - Transform Incoming Claim to Name ID
-
-## Microsoft Entra ID certificate update process
-
-To avoid setup errors during certificate renewal:
-
-1. Create the new certificate in Microsoft Entra.
-2. Remove the old certificate before activating the new one.
-3. Replace the existing IdP metadata in Expensify.
-4. Log in via SSO to confirm the new certificate works.
-
-# FAQ
-
-## Can I use SAML Single Sign-On (SSO) for multiple Workspaces?
-
-Yes, as long as all members are part of the same verified domain, SAML access applies across all Workspaces they belong to.
-
-## How can I confirm my SAML Single Sign-On (SSO) setup is working?
-
-Before enabling **Require SAML login**, make sure your SAML connection is working by testing both SP-initiated and IdP-initiated logins. You should also confirm that:
-
-- The correct certificate and endpoints are in your Expensify metadata
-- Members can log in successfully using the SAML flow
-
-## Can I test a new SAML Single Sign-On (SSO) setup without locking members out?
-
-Yes. Disable **Require SAML login** before making changes. This allows members to log in with email and password if SAML setup fails. Once you’ve confirmed that login works, you can re-enable enforcement.
-
-## What do I do if a member can’t log in after SAML Single Sign-On (SSO) is enabled?
-
-First, confirm that the member’s email matches your verified domain and that their account exists in your Identity Provider (IdP) with the correct access permissions.
-
-## Are custom NameID, ACS, or SLO URLs supported in SAML Single Sign-On (SSO)?
-
-No, the NameID Format, Login URL (ACS URL), and Logout URL (SLO URL) are static and cannot be modified.
diff --git a/docs/articles/new-expensify/domains/Troubleshoot-SAML-SSO-Login.md b/docs/articles/new-expensify/domains/Troubleshoot-SAML-SSO-Login.md
deleted file mode 100644
index a13264554f29..000000000000
--- a/docs/articles/new-expensify/domains/Troubleshoot-SAML-SSO-Login.md
+++ /dev/null
@@ -1,118 +0,0 @@
----
-title: Troubleshoot SAML SSO login
-description: Learn how to quickly diagnose and resolve issues with SAML SSO login in New Expensify, including lockouts, expired certificates, and identity provider errors.
-keywords: [New Expensify, SAML SSO, SSO login failed, Require SAML login, domain locked out, expired certificate, identity provider, IdP, metadata, troubleshooting]
----
-
-If you're having trouble logging in with SAML Single Sign-On (SSO) in New Expensify, this guide will help you identify the issue, understand what’s causing it, and get access restored quickly.
-
----
-
-# Where to find SAML SSO settings in New Expensify
-
-To check your domain's SAML SSO configuration, go to **Workspaces > [domain name] > SAML**.
-
-From this page, Domain Admins can: 
-
-- Enable SAML SSO login for the domain 
-- View and update your Identity Provider (IdP) metadata
-- Disable or enable **Require SAML login**
-
-**Note:** SAML SSO settings are not available on mobile. 
-
----
-
-# How to fix domain-wide SAML SSO login issues
-
-## SAML login suddenly fails for all members
-
-A domain-wide issue usually points to a problem with your Identity Provider (IdP). Check the following: 
-
-**Has your IdP certificate expired or rotated?**  
-
-If yes, copy the updated metadata XML from your IdP and paste it into the **Identity Provider Metadata** field in your Expensify SAML settings.
-
-**Have any IdP settings changed?**  
-
-Changes to entity IDs, SSO endpoints, or user attributes can break login.
-   - If your certificate or SSO endpoints have changed, upload updated metadata from your IdP to Expensify.
-   - If user attributes like NameID Format or email mappings have changed, confirm they match the values expected in your domain's SAML settings in Expensify.
-
- **Is “Require SAML login” turned on?**  
- 
- If enabled, no one — including Domain Admins — can log in without a working SAML configuration. If you're still signed in, go to your domain’s SAML settings and temporarily disable **Require SAML login** while troubleshooting. 
-
-## Some members can’t log in, but others can
-
-This is often caused by an email alias not recognized by your identity provider (IdP), or because the member hasn’t been added to the correct SAML rule or group. Confirm that the member’s email matches your verified domain in Expensify, and check your IdP to ensure they’re included in the appropriate SAML group or rule.
-
-## All Domain Admins are locked out
-
-If no Domain Admins can log in, you won’t be able to access SAML settings. Email concierge@expensify.com from an address that matches your verified domain for help.
-
----
-
-# How to resolve common SAML SSO error messages 
-
-## Signature validation failed  
-
-This typically happens when the certificate has expired, is malformed, or doesn't match the one used by your IdP. To fix it, copy the updated metadata XML from your IdP and paste it into the **Identity Provider Metadata** field in your Expensify SAML settings.
-
----
-
-## SAML Response not found. Only supported HTTP_POST Binding  
-
-Your Identity Provider is not sending the `SAMLResponse` in the POST body as expected. To fix it, update your IdP configuration to use **HTTP POST binding** when sending the SAML Response.
-
----
-
-## No user with that partnerUserID/partnerUserSecret  
-
-This occurs when your IdP sends an email (NameID) that doesn’t match the one stored in Expensify for that member. To fix it, confirm that the NameID value sent by your IdP exactly matches the member’s email address in Expensify. If needed, update the member's email in your IdP or in Expensify to resolve the mismatch.
-
----
-
-## Bad XML metadata
-
-Your metadata file may contain formatting issues — often extra line breaks or copy/paste errors in the x.509 certificate.  
-**How to fix it:** Use a certificate formatting tool (like [samltool.com](https://samltool.com)) to clean and validate your metadata before pasting it into Expensify.
-
-**Note:** When copying a certificate, make sure it includes the full `-----BEGIN CERTIFICATE-----` and `-----END CERTIFICATE-----` block with no formatting errors.
-
----
-
-## SAML login not available on your domain  
-
-This appears when **Require SAML login** is enabled, but SAML isn’t fully configured. To fix it, follow the steps to [Configure Single Sign On (SSO)](https://help.expensify.com/articles/expensify-classic/domains/Managing-Single-Sign-On-(SSO)-in-Expensify) for your domain. 
-
----
-
-# How to contact Expensify if you're locked out
-
-If you can't sign in due to a SAML issue, email **concierge@expensify.com** from an address that matches your verified domain.
-
----
-
-# FAQ
-
-## What should I do before making changes to my domain's SAML SSO setup?
-
-Before making changes to your Identity Provider setup — like rotating certificates or updating endpoints — we recommend **temporarily disabling Require SAML login** in Expensify.
-
-This ensures Domain Admins can still sign in with email and password if the new configuration doesn’t work. Once you’ve uploaded the new metadata and confirmed login is working, you can safely re-enable Require SAML login.
-
-## Can I make SAML login optional for some members?
-
-No. SAML settings apply to the entire domain. If **Require SAML login** is enabled, **all members** must authenticate via SAML — there’s no way to allow some members to log in with email and password while others use SAML.
-
-## Can I test a new SAML setup without locking members out?
-
-Yes. You can disable **Require SAML login** while testing or updating your SAML settings. This allows members to log in with email/password if needed. Once you're confident the new metadata works, re-enable SAML enforcement.
-
-## How can I confirm my SAML setup is correct?
-
-Before enabling **Require SAML login**, make sure your SAML connection is working by testing both SP-initiated and IdP-initiated logins. You should also confirm that:
-
-- The correct certificate and endpoints are in your Expensify metadata
-- Your IdP sends the proper NameID (usually the member's email)
-- Members can log in successfully using the SAML flow
diff --git a/docs/articles/new-expensify/reports-and-expenses/Attach-and-edit-receipts-on-expenses.md b/docs/articles/new-expensify/reports-and-expenses/Attach-and-edit-receipts-on-expenses.md
index 2bc1cf3054be..cde8e00c007f 100644
--- a/docs/articles/new-expensify/reports-and-expenses/Attach-and-edit-receipts-on-expenses.md
+++ b/docs/articles/new-expensify/reports-and-expenses/Attach-and-edit-receipts-on-expenses.md
@@ -11,7 +11,7 @@ Make sure your receipts are attached correctly to individual expenses for audit
 # How to Attach and Verify Receipts on Expenses
 
 ## Who can attach receipts to an expense
-- **Attach or replace a receipt**: The member who created the expense, a Workspace Admin, or the current approver. 
+- **Attach or replace a receipt**: The member who created the expense, or a Workspace Admin.
 - **Edit a receipt in an Approved or Paid report**: Requires the report to be unapproved first (see below).
 
 ---
diff --git a/docs/articles/new-expensify/reports-and-expenses/Managing-Expenses-in-a-Report.md b/docs/articles/new-expensify/reports-and-expenses/Managing-Expenses-in-a-Report.md
index 063419ddb33d..ee2741fd9658 100644
--- a/docs/articles/new-expensify/reports-and-expenses/Managing-Expenses-in-a-Report.md
+++ b/docs/articles/new-expensify/reports-and-expenses/Managing-Expenses-in-a-Report.md
@@ -1,15 +1,15 @@
 ---
 title: Managing Expenses in a Report
 description: Learn how to add, remove, and move expenses in a report in New Expensify, including how comments and system messages interact with them.
-keywords: [New Expensify, manage expenses, add expense, delete expense, move expense, expense table, edit report, report approval, expense actions]
+keywords: [New Expensify, manage expenses, add expense, delete expense, move expense, expense table, edit report, report approval]
 ---
 
 Easily add, delete, or move expenses within reports in New Expensify. This guide covers how to manage expenses using the expense table on both web and mobile.
 
-# Managing Expenses in a Report in New Expensify
+# Managing Expenses in a Report
 
 ## Who can edit or modify expenses in a report
-- **Edit expenses on a report**: The member who created the report, the current approver, and Workspace Admins.
+- **Edit expenses on a report**: The member who created the report, and Workspace Admins.
 - **Add expenses to a report**: Only the member who created the report.
 - **Remove expenses from a report**: Only the member who created the report.
 - **Delete an expense**: Only the member who created that specific expense.
diff --git a/docs/articles/new-expensify/reports-and-expenses/Using-Reports-in-New-Expensify.md b/docs/articles/new-expensify/reports-and-expenses/Using-Reports-in-New-Expensify.md
index 376a7dfe7a43..7ec7d9d34045 100644
--- a/docs/articles/new-expensify/reports-and-expenses/Using-Reports-in-New-Expensify.md
+++ b/docs/articles/new-expensify/reports-and-expenses/Using-Reports-in-New-Expensify.md
@@ -1,7 +1,7 @@
 ---
 title: Using Reports in New Expensify
 description: Learn how to use Reports in New Expensify to search, filter, customize columns, and save reports for expenses, invoices, trips, and chats.
-keywords: [Reports, New Expensify, report filters, search commands, custom columns, saved reports, group expenses, invoices, expenses, chats, trips, reimbursement tracking, view expenses, customize report view, reporting table columns]
+keywords: [Reports, New Expensify, report filters, search commands, custom columns, saved reports, invoices, expenses, chats, trips, reimbursement tracking, view expenses, customize report view, reporting table columns]
 ---
 
 <div id="new-expensify" markdown="1">
@@ -76,18 +76,6 @@ To view the full list of available columns, click the **Columns** icon in the **
 
 ---
 
-# How to group expenses by category or tag using Report Layout
-
-Report Layout lets you group expenses inside a report to make reviews faster and easier.
-
-To group expenses:
-
-1. Open a report that contains more than one expense.
-2. Click the **More** icon (three dots) in the top-right corner of the report.
-3. Select **Group by category**, **Group by tag**, or **Don’t group**.
-
-Your selected layout will be remembered and applied to other reports you view.
-
 # How to use Reports search query commands
 
 Use search commands in the search bar to run advanced queries based on specific fields. 
diff --git a/docs/articles/new-expensify/settings/Login-Troubleshooting.md b/docs/articles/new-expensify/settings/Login-Troubleshooting.md
deleted file mode 100644
index 9883c54ee77e..000000000000
--- a/docs/articles/new-expensify/settings/Login-Troubleshooting.md
+++ /dev/null
@@ -1,149 +0,0 @@
----
-title: Login Troubleshooting
-description: Troubleshoot common login issues — like missing Magic Codes, 2FA lockouts, SSO problems, or blocked emails — and find out who to contact to get back in fast.
-keywords: [New Expensify, Expensify login, can't log in, login help, Magic Code missing, Two-Factor Authentication, SSO login, email domain blocked, login error, Concierge login support, account access issue, locked out]
----
-
-# Login troubleshooting
-
-If you're not able to log into your Expensify account, find your situation below to see what's causing it and how to fix it.
-
----
-
-## Can't receive Magic Code login email
-
-A Magic Code is a one-time login code that Expensify emails you when you try to sign in instead of asking for a password. If you’re not getting the email, your email provider might be blocking or filtering it.
-
-**Common Cause**
-Your email provider is blocking or filtering messages from Expensify. 
-
-**What you can try**
-- Wait up to **10 minutes** for the email to arrive — delivery can be delayed.
-- Check your **spam**, **junk**, and **trash** folders.
-- Search for **Expensify Magic Code** or concierge@expensify.com.
-- Add concierge@expensify.com to your email contacts.
-- Click **Didn't receive a magic code?** on the login screen to request the code be sent again. 
-- Wait **2–3 minutes** between resend attempts. If you request a new code while one is still being generated, the older one won't work. 
-
-**What won’t help**
-- Clicking "Resend" repeatedly without checking your filters.
-- Logging in with a phone number or backup email. The Magic Code is always sent to the primary login set on the account - not any secondary contact methods. 
-
-**Who to contact**
-- **Using a work email?** Ask your IT team to [allowlist Expensify emails](https://help.expensify.com/articles/expensify-classic/email/How-to-Allowlist-Expensify).
-- **Using a personal email?** If you’ve already tried the steps above, contact Concierge.
-
-[See the full guide to fixing email delivery →](https://help.expensify.com/articles/expensify-classic/email/Troubleshoot-Email-Delivery-Issues)
-
----
-
-## Locked out by Two-Factor Authentication (2FA) 
-
-Two-factor authentication (2FA) is a feature that adds an extra layer of security to your account, and can be enabled by you on your account or required by a Domain Admin. After entering your Magic Code, you’ll be prompted to enter another code — this one comes from your authenticator app.
-
-**Common Cause**
-Two-Factor Authentication (2FA) is enabled on your account, but you no longer have access to your authenticator app or recovery codes.
-
-**What you can try**
-- Search your phone for any authenticator apps (e.g., Google Authenticator, Authy).
-- Search your device for backup or recovery codes, saved in a file called `two-factor-auth-codes`.
-
-**What won’t help**
-- Signing in again
-- Reinstalling the authenticator app without recovery codes.
-
-**Who to contact**
-- **Work email?** Ask your Domain Admin to reset your 2FA. 
-- **No Domain Admin?** [Claim your domain](https://help.expensify.com/articles/expensify-classic/domains/Claim-And-Verify-A-Domain) to claim the domain and reset your 2FA settings yourself.
-- **Personal email?** Without recovery codes, you’ll need to create a new account.
-
-[Learn more about 2FA and account recovery →](https://help.expensify.com/articles/expensify-classic/security/Two-Factor-Authentication-Overview)
-
----
-
-## Can't log in with SAML SSO
-
-If your company uses SAML SSO, you'll be redirected to your company's Identity Provider (e.g., Okta, Azure) to authenticate.
-
-**Common Cause**
-Your company's SAML SSO configuration may have an issue affecting your account or domain
-
-**What you can try**
-- If you see the option "Would you like to sign in with a magic code or Single Sign-On?", choose **Magic Code** to log in with a code instead. 
-- Double-check your credentials to ensure you are inputting the right details into your Identity Provider login screen. 
-- Log in to another app you access using the same Identity Provider login and see if you experience the same error.
-
-**Who to contact**
-- **Reach out to your IT team** to confirm SSO settings and ask them to follow the relevant steps to [Troubleshoot SAML SSO Login](https://help.expensify.com/articles/new-expensify/domains/Troubleshoot-SAML-SSO-Login)
-
-[More about SSO logins →](https://help.expensify.com/articles/new-expensify/domains/Managing-Single-Sign-On-(SSO)-in-Expensify)
-
----
-
-## Can't access your Expensify login email
-
-**Common Cause**
-You’ve changed jobs or lost access to the email inbox tied to your Expensify login. 
-
-**What you can try**
-- If your company still owns the email domain, ask the internal team who manages email access to restore the email account so you can regain access. 
-
-**Who to contact**
-- **Still with the company?** Contact your Domain Admin or IT team.
-- **No longer with the company?** Message Concierge. Include your old email and any associated reports or expenses to help confirm your identity.
-
----
-
-## Unblock your email address
-
-If you see a banner that says "We're having trouble emailing you", it means Expensify emails are temporarily suspended for your email address.
-
-**Common Cause**
-Expensify tried to email you but it bounced, either because it was not a real email address or the incoming mail server rejected it. 
-
-**What to do**
-1. Confirm the primary email address on your Expensify account is a real email account that can accept incoming emails.
-2. Confirm with your IT team or email server that Expensify emails are not being blocked. 
-3. Click the link in the banner to unblock your email. 
-
-If you see errors like "mimecast", "blacklist", or "SMTP errors": 
-- Share the error message with your IT team.
-- Ask them to allowlist `expensify.com`.
-
-[More on allowlisting and domain blocks →](https://help.expensify.com/articles/expensify-classic/email/How-to-Allowlist-Expensify)
-
----
-
-## General login troubleshooting steps
-
-Try these general troubleshooting steps:
-- [Force a clean sign out](https://www.expensify.com/signout.php?clean=true).
-- Switch browsers or devices.
-- Try logging in using Incognito or Private mode.
-- Check [Expensify’s system status page](https://status.expensify.com).
-
-**Still blocked? Contact Concierge and include:**
-- The email you're trying to log in with.
-- A short description of what you’re seeing.
-- Screenshots of any errors (if available).
-
----
-
-# FAQ
-
-## Who is my Domain Admin?
-Ask your Workspace Owner or the person who approves your reports. To find your Workspace Owner, go to **Workspaces** and check the **Owner**
-column.
-
-## How can I keep access to my Expensify account after leaving my company?
-[Add a secondary contact method](https://help.expensify.com/articles/new-expensify/settings/Update-Email-Address) (like a personal email) so you can still log in if you lose access to your work email.
-
-## Why is Expensify asking for a Two-Factor Authentication (2FA) code I don’t remember setting up?  
-Your Domain Admin may have required it. Try searching your phone for an authenticator app or recovery codes with the file name `two-factor-auth-codes`. 
-
-## Can Expensify reset Two-Factor Authentication (2FA) if I use a personal email?  
-No. If you’re not part of a company domain and didn’t save your recovery codes, your 2FA can’t be reset.
-
-## How can I contact Concierge if I can't log into my account? 
-Email concierge@expensify.com from the email address associated with your Expensify account. 
-
diff --git a/docs/articles/new-expensify/settings/Two-Factor-Authentication.md b/docs/articles/new-expensify/settings/Two-Factor-Authentication.md
index a220d0aafe36..90e196959376 100644
--- a/docs/articles/new-expensify/settings/Two-Factor-Authentication.md
+++ b/docs/articles/new-expensify/settings/Two-Factor-Authentication.md
@@ -1,34 +1,35 @@
 ---
 title: Two-Factor Authentication (2FA)
 description: Learn how to set up, use, and recover your Expensify account with two-factor authentication (2FA), including lost device and admin recovery options.
-keywords: [New Expensify, two-factor authentication, 2FA, login security, authenticator app, recovery codes, locked out, lost phone, account recovery, Domain Admin reset, backup codes]
+keywords: [Expensify Classic, two-factor authentication, 2FA, login security, authenticator app, recovery codes, locked out, lost phone, account recovery, Domain Admin reset]
 ---
 
-Setting up two-factor authentication (2FA) in New Expensify adds an extra layer of protection to your account. This guide explains how to enable 2FA and what to expect if you're ever locked out.
+Two-factor authentication (2FA) adds an extra layer of protection to your Expensify account. This guide covers setup, login expectations, recovery steps if you lose access, and admin override options.
 
 ---
 
-# Who can enable Two-Factor Authentication in New Expensify
+# How two-factor authentication works
 
-Anyone can enable Two-Factor Authentication on their own account. Domain Admins can require all members on a domain to enable Two-Factor Authentication on their accounts.
+When logging in:
+1. Enter your email and the magic code sent to your inbox.
+2. Enter a 6-digit code generated by your authenticator app (such as Google Authenticator, Microsoft Authenticator, or Authy).
+
+Codes refresh every few seconds. If one expires, simply open the app for a new code.
 
 ---
 
 # How to enable two-factor authentication
 
-1. Ensure an authenticator app is installed on your device. 
-2. From the left-hand menu, select **Account > Security**.
-3. Under **Security options**, select **Two-Factor Authentication**.
-4. Enable **Two-factor authentication**.
-4. Save a copy of your backup codes:
-   - Click **Download** to save them to your computer.
-   - Click **Copy** to store them in a secure location.
-5. Click **Continue**.
-6. Open your authenticator app and either:
-   - Scan the QR code displayed on your screen.
-   - Enter the 6-digit code from your authenticator app into Expensify and then click **Verify**.
-
-**Important:** If you lose access to your authenticator app and didn’t save your recovery codes, you may permanently lose access to your account. Consider adding 2FA on multiple devices (e.g., phone and tablet) for backup.  
+1. From the left-hand menu, select **Account > Security**.
+2. Under **Security options**, select **Two-Factor Authentication**.
+3. Follow the prompts to enable 2FA.
+4. **Save your backup codes**—these are essential for account recovery.  
+   - Select **Download** to save the codes securely.  
+   - Select **Copy** to paste them into a password manager or secure file.  
+5. Open your authenticator app and connect it to Expensify by:  
+   - Scanning the QR code, or  
+   - Entering the setup code manually.  
+6. Enter the 6-digit verification code and select **Verify**.
 
 ---
 
@@ -40,59 +41,46 @@ After setup, login requires both:
 
 ---
 
-## For Domain Admins: Reset Two-Factor Authentication for a member
-
-If a member loses access to their authenticator app or recovery codes, you can reset their 2FA if: 
-- They use a company email on your verified domain, **and**
-- You (the Domain Admin) also have 2FA enabled
+# Recovery options
 
-To reset a member’s 2FA settings:
+Backup recovery codes work like one-time passwords. They are your fastest recovery method if you lose access to your authenticator app.
 
-1. Go to **Settings > Domains > Domain Members**.
-2. Click **Edit Settings** for the affected email address.
-3. Click **Reset** to disable 2FA.
-4. The member can now log in and set up 2FA again.
+**Tip:** Store unused recovery codes in a secure, offline location. Each code can only be used once.
 
-If your domain doesn't have 2FA enabled yet:
+## If you lost your device and have no recovery codes
+- **Individual account**: If you're using a public domain (like gmail.com or outlook.com), you'll need to create a new Expensify account with a different email. Concierge can assist with transferring access to any shared Workspaces.  
+- **Domain account**: A **Domain Admin** can reset your 2FA. Once reset, you’ll log in normally and set up 2FA again.
 
-1. Go to **Settings > Domains > Domain Members**.
-2. Enable **Two-Factor Authentication**.
-3. Then follow the steps above to reset 2FA for the member.
+# Admin recovery and overrides
 
-**Note** Domain Admin 2FA resets are only available in Expensify Classic. To complete these steps, temporarily [switch to Expensify Classic](https://help.expensify.com/articles/new-expensify/settings/Switch-between-New-Expensify-and-Expensify-Classic.html)). 
+## If a Domain Admin is available
+- Domain Admins can reset a member’s 2FA by going to:  
+  **Settings > Domains > [Domain Name] > Members > Security Settings**  
+- Select the member, then disable their 2FA.  
 
----
-
-## What to do if you're locked out because of Two-Factor Authentication
+## If the enforcing Domain Admin has left
+1. Verify domain ownership by proving control of the domain’s email DNS or MX records.  
+2. Assign a new Domain Admin in **Settings > Domains > [Domain Name] > Domain Settings**.  
+3. Once the new admin is assigned, follow the steps above to reset 2FA for affected members.
 
-If you can’t access your authenticator app and don’t have your recovery codes, contact your Domain Admin to reset your 2FA. 
+# Best practices
 
-If no Domain Admin is available and you're using a company email, you can follow [this guide](https://help.expensify.com/articles/new-expensify/workspaces/Claim-and-Verify-a-Domain) to claim the domain and reset your 2FA settings yourself.
+- Save your recovery codes as soon as you set up 2FA.  
+- Consider adding 2FA on multiple devices (e.g., phone and tablet) during setup for backup.  
+- Keep your device’s clock set to the correct time—codes depend on accurate timing.  
 
 ---
 
 # FAQ
 
-## How does 2FA change how I log into my account? 
-
-Setting up two-factor authentication (2FA) adds an extra layer of security to protect your Expensify Account. When you log in, you must enter a code generated by your preferred authenticator app (such as Google Authenticator or Microsoft Authenticator).
-
-## How does 2FA work? 
-
-Expensify's 2FA is implemented via a Time-based One-Time Password (TOTP) algorithm. Each time you log in, you must use an authenticator app to generate a unique 6-digit code, adding a second “factor” to your login.
-
-## What can I do if I can't access my authenticator app? 
-
-When you enable 2FA, you are prompted to either copy or download backup codes which you can use in lieu of the 6-digit authenticator code. If you downloaded the codes they will be saved with the file name `two-factor-auth-codes`. 
-
-## What authenticator apps does Expensify recommend? 
+## Why should I use 2FA?
+It prevents unauthorized access, even if someone has your login email or password.
 
-You can use any authenticator app, but here are a few we recommend:
+## What if I lose my phone or uninstall the app?
+Use a recovery code to log in, then disable and re-enable 2FA on your new device.
 
-- [1Password](https://support.1password.com/one-time-passwords/)
-- [Authy](https://authy.com/)
-- [Google Authenticator](https://support.google.com/accounts/answer/1066447)
-- [Microsoft Authenticator](https://www.microsoft.com/en-us/security/mobile-authenticator-app)
+## Can I use 2FA on more than one device?
+Yes. Scan the setup QR code with multiple devices when enabling 2FA.
 
 ## What if my verification code isn’t working?
-Make sure your device’s clock is set to update automatically. Authenticator apps rely on your system clock being accurate, and even a small time difference can cause verification codes to fail.
+Check your device’s time settings. Authenticator apps rely on accurate system clocks.
diff --git a/docs/articles/new-expensify/wallet-and-payments/Connect-a-Personal-Bank-Account.md b/docs/articles/new-expensify/wallet-and-payments/Connect-a-Personal-Bank-Account.md
index 824870389063..36b2c3cd18b0 100644
--- a/docs/articles/new-expensify/wallet-and-payments/Connect-a-Personal-Bank-Account.md
+++ b/docs/articles/new-expensify/wallet-and-payments/Connect-a-Personal-Bank-Account.md
@@ -1,7 +1,7 @@
 ---
 title: Connect a Personal Bank Account
 description: Learn how to connect your personal bank account to receive reimbursements in Expensify, including support for both US and international accounts.
-keywords: [New Expensify, bank account, personal bank account, reimbursements, wallet, US bank account, global reimbursements, manual bank connection, add bank account for reimbursement, reimbursement account setup, wallet, deposit account, direct deposit]
+keywords: [New Expensify, bank account, personal bank account, reimbursements, wallet, US bank account, global reimbursements]
 ---
 
 You can add a personal bank account to receive reimbursements in over **190 countries**. All personal accounts are managed under **Account > Wallet > Bank Accounts**. The steps differ depending on whether you're connecting a **US** or **non-US** account.
@@ -10,25 +10,17 @@ You can add a personal bank account to receive reimbursements in over **190 coun
 
 # Add a U.S. Bank Account
 
-For U.S. accounts, Expensify offers two ways to connect your bank account:
-
-- **Log into your bank:** Securely link your account using your bank login.
-- **Connect manually:** Enter your routing and account numbers without logging in.
+For U.S. accounts, Expensify uses **Plaid**, a secure third-party provider that verifies your banking information.
 
 To connect a U.S. bank account:
 
 1. Go to **Account > Wallet > Bank Accounts**.
 2. Click **Add Bank Account**.
 3. Select **United States** as your country.
-4. Choose one of the following:
-   - **Log into your bank**:
-     - Select your bank from the list.
-     - Enter your online banking credentials and follow the prompts to complete setup. 
-   - **Connect manually**:
-     - Enter your routing number and account number,
-     - Enter or update your name, address, and phone number to match your bank account details. 
-     - Click **Confirm** to complete setup. 
-5. Your bank account will appear in the **Bank Accounts** section.
+4. Follow the **Plaid** connection flow:
+   - Choose your bank.
+   - Enter your credentials.
+5. Once complete, your account will appear in the **Bank Accounts** section.
 
 ![Click Add bank account on the Wallet page]({{site.url}}/assets/images/ExpensiHelp-DepositAccount-1.png){:width="100%"}
 
diff --git a/docs/articles/new-expensify/domains/Claim-and-Verify-a-Domain.md b/docs/articles/new-expensify/workspaces/Claim-and-Verify-a-Domain.md
similarity index 100%
rename from docs/articles/new-expensify/domains/Claim-and-Verify-a-Domain.md
rename to docs/articles/new-expensify/workspaces/Claim-and-Verify-a-Domain.md
diff --git a/docs/articles/new-expensify/workspaces/Set-Up-SAML-Single-Sign-On.md b/docs/articles/new-expensify/workspaces/Set-Up-SAML-Single-Sign-On.md
new file mode 100644
index 000000000000..f56aaf9b06f8
--- /dev/null
+++ b/docs/articles/new-expensify/workspaces/Set-Up-SAML-Single-Sign-On.md
@@ -0,0 +1,92 @@
+---
+title: Set Up SAML Single Sign-On (SSO)
+description: Learn how to enable and configure SAML SSO in New Expensify to secure login for domain members using your organization's identity provider.
+keywords: [New Expensify, SAML SSO, domain security, single sign-on, identity provider, verified domain, enable SAML]
+---
+
+<div id="new-expensify" markdown="1">
+
+Expensify supports Single Sign-On (SSO) through the SAML protocol, allowing you to secure user authentication across your organization. This guide walks you through setting up and managing SAML SSO for your Expensify account.
+
+
+# Set Up SAML Single Sign-On
+
+⚠️ **Note:** Your domain must be verified before you can enable SAML. [Learn how to claim and verify a domain](https://help.expensify.com/articles/new-expensify/workspaces/Claim-and-Verify-a-Domain)
+
+Once your domain is verified, you can configure SAML-based login for enhanced authentication.
+
+1. Select your domain from **Workspaces > Domains**.
+2. Open the **SAML** section.
+3. Toggle **Enable SAML login**.
+4. Download Expensify’s Service Provider Metadata to provide to your Identity Provider.
+5. Enter the Identity Provider Metadata from your SSO provider. (Contact your provider if unsure how to obtain this).
+6. Toggle on **Require SAML login**, ensuring users sign in via SSO only.
+
+
+# Identity Provider-Specific SAML Setup
+
+You can find provider-specific instructions here:
+
+- [Amazon Web Services (AWS SSO)](https://docs.aws.amazon.com/singlesignon/latest/userguide/)
+- [Google Workspace / SAML](https://support.google.com/a/answer/6087519)
+- [Microsoft Entra ID (formerly Azure AD)](https://learn.microsoft.com/en-us/entra/identity/)
+- [Okta](https://help.okta.com/)
+- [OneLogin](https://support.onelogin.com/)
+- [Oracle Identity Cloud Service](https://docs.oracle.com/)
+- [SAASPASS](https://saaspass.com/)
+- [Microsoft ADFS](https://learn.microsoft.com/en-us/windows-server/identity/ad-fs/)
+
+If your provider isn’t listed, contact them directly for metadata and configuration help.
+
+
+# Troubleshooting and Tips
+
+## User login behavior
+- Members with emails matching the verified domain will be prompted to log in via your IdP.
+- If a member has a secondary email (e.g., Gmail), they may need to update their email to match the domain.
+
+[How to add or change your email address](https://help.expensify.com/articles/new-expensify/settings/Update-Email-Address)
+
+## Error during setup?
+- Use [samltool.com](https://samltool.com) to validate your SAML fields.
+- Confirm certificate formatting is correct (PEM format).
+- Double-check that your domain is **verified** and matches the email domain used by your members.
+
+## What is Expensify’s Entity ID?
+- Default: `https://expensify.com`
+- For custom multi-domain setups: `https://expensify.com/yourdomain.com`
+
+## Managing Multiple Domains with One Entity ID
+It is possible to manage multiple domains with one entity ID. Contact Concierge or your Account Manager to enable this feature.
+
+
+
+
+# Advanced Configurations
+
+## Okta SCIM API for User Deactivation
+
+Ensure your domain is verified and the SAML setup is complete. Then, do the following:
+1. Go to **Workspaces > Domains > [Domain Name] > SAML**.
+2. Enable SAML Login and toggle on **Required for login**.
+3. In Okta, add Expensify as an application, and configure user profile mappings.
+4. Request Okta SCIM API activation via concierge@expensify.com.
+5. Integrate the SCIM token with Okta API provisioning.
+
+Refer to the full setup in Okta’s documentation for attribute mapping and provisioning options.
+
+
+## Microsoft ADFS SAML Authentication
+1. Open **ADFS Management Console** and add a new trust.
+2. Import Expensify’s metadata XML from the SAML page.
+3. Configure **LDAP Attributes** for email or UPN.
+4. Add two claim rules:
+   - Send LDAP Attributes as Claims.
+   - Transform Incoming Claim (Name ID).
+
+
+---
+
+Still stuck? Reach out to Concierge from the bottom-left menu in New Expensify.
+
+</div>
diff --git a/docs/articles/new-expensify/workspaces/Workspace-Workflows.md b/docs/articles/new-expensify/workspaces/Workspace-Workflows.md
index b309a9a00559..cc6b7af79843 100644
--- a/docs/articles/new-expensify/workspaces/Workspace-Workflows.md
+++ b/docs/articles/new-expensify/workspaces/Workspace-Workflows.md
@@ -19,9 +19,9 @@ To get started, enable the **Workflows** feature for your workspace.
 3. Click **More Features**.
 4. Under the **Spend** section, toggle on **Workflows**.
 
-![Click Account Settings > Workspaces > click on the workspace]({{site.url}}/assets/images/submissions-01.png){:width="100%"}
+![Click Account Settings > Workspaces > click on the workspace]({{site.url}}/assets/images/ExpensifyHelp-Workflows-1.png){:width="100%"}
 
-![Click More Features > Enable Workflows]({{site.url}}/assets/images/submissions-02.png){:width="100%"}
+![Click More Features > Enable Workflows]({{site.url}}/assets/images/ExpensifyHelp-Workflows-2.png){:width="100%"}
 
 ---
 
@@ -32,7 +32,7 @@ Once enabled, go to the **Workflows** tab in the left menu to customize your sub
 1. Click **Workflows**.
 2. Use the toggles to enable the workflows you want to use.
 
-![Enable workflow features]({{site.url}}/assets/images/submissions-03.png){:width="100%"}
+![Enable workflow features]({{site.url}}/assets/images/ExpensifyHelp-Workflows-3.png){:width="100%"}
 
 ## Add Approvals
 
diff --git a/docs/articles/travel/booking-travel/Arrange-Travel-for-Another-User.md b/docs/articles/travel/booking-travel/Arrange-Travel-for-Another-User.md
index c0702e14ad2f..064e59d4763a 100644
--- a/docs/articles/travel/booking-travel/Arrange-Travel-for-Another-User.md
+++ b/docs/articles/travel/booking-travel/Arrange-Travel-for-Another-User.md
@@ -5,23 +5,24 @@ keywords: [arrange travel, book for others, travel arranger, expensify travel, c
 ---
 
 
-After you're assigned the Travel Arranger role, you can arrange travel for another member of your organization using Expensify Travel.
+Once granted the Travel Arranger role, you can arrange travel for another member of your organization using Expensify Travel.
 
 ---
 
-## Where to find Expensify Travel
+## How to access the travel tool
 
-Tap the green ➕ **Create** button at the bottom of your screen, then choose **Book travel**.
+- **In New Expensify:** Click the green **+** button in the bottom-left corner of your screen, then select **Book travel**.
+- **In Classic Expensify:** Click **Travel** in the left-hand menu, then select **Book or manage travel**.
 
-If you don’t see **Book travel**, ask a Workspace Admin to [enable Expensify Travel](https://help.expensify.com/articles/travel/company-setup/Enable-Travel-on-a-Workspace) on the workspace. 
+**Need to enable travel still?** Reach out to your Account Manager or Concierge to schedule a travel demo and get it enabled for your account.
 
 ---
 
-## How to get the Travel Arranger role
+## How to get access
 
 Before arranging travel for another traveler, a Travel Admin must assign you the **Travel Arranger** role.
 
-**To set the Travel Arranger role for another member:**
+**To set the Travel Arranger role for another travel member:**
 
 1. Head to Expensify Travel.
 2. Click on **Program** > **Users** > search and select the name of the user who needs to arrange travel.
@@ -47,7 +48,7 @@ Before arranging travel for another traveler, a Travel Admin must assign you the
 
 ---
 
-## What happens after booking for another member with Expensify Travel 
+## What happens next
 
 - The selected traveler will receive a confirmation email.
 - Receipts will automatically be sent to their Expensify account and added to a trip report.
diff --git a/docs/articles/travel/booking-travel/Book-Rail-Travel.md b/docs/articles/travel/booking-travel/Book-Rail-Travel.md
index b7e1c5e88afd..067ff4181a3e 100644
--- a/docs/articles/travel/booking-travel/Book-Rail-Travel.md
+++ b/docs/articles/travel/booking-travel/Book-Rail-Travel.md
@@ -8,11 +8,12 @@ keywords: [New Expensify, book rail, train booking, rail travel, train tickets,
 
 Book train tickets directly in Expensify Travel. This guide covers how to search, book, and view your rail itineraries in New Expensify.
 
-## Where to find Expensify Travel
+# How to access the travel tool
 
-Tap the green ➕ **Create** button at the bottom of your screen, then choose **Book travel**.
+From the left-hand menu, select **Reports > Trips**.  
+Click the green **+** button in the bottom-left corner, then select **Book travel**.
 
-If you don’t see **Book travel**, ask a Workspace Admin to [enable Expensify Travel](https://help.expensify.com/articles/travel/company-setup/Enable-Travel-on-a-Workspace) on the workspace. 
+If you don’t see this option, contact your Account Manager or Concierge to schedule a travel demo and enable travel booking for your account.
 
 # How to book rail travel
 
@@ -35,19 +36,19 @@ If you don’t see **Book travel**, ask a Workspace Admin to [enable Expensify T
 8. Confirm trip details and payment method.  
 9. Click **Pay** to finalize your booking.
 
-## What happens after booking with Expensify Travel 
+# What happens next
 
 - Your booking may require approval depending on your company’s travel policy.  
 - You’ll receive a confirmation email after booking.  
 - The rail booking receipt will sync automatically with your Expensify account.  
 - If your payment card is connected to Expensify, the receipt will merge with the imported expense.  
 
-**Note:** Rail bookings are not supported in all regions. Availability may vary
+> **Note:** Rail bookings are not supported in all regions. Availability may vary.
 
 # FAQ
 
 ## Can I book a train in Expensify Travel?  
-Yes. Once Expensify Travel is enabled for your workspace, you can book train tickets directly from the app.
+Yes. If travel is enabled on your account, you can search and book rail journeys directly in Expensify.  
 
 ## Will I receive a digital ticket?  
 Yes. Most rail bookings include a digital ticket or QR code in your confirmation email.  
diff --git a/docs/articles/travel/booking-travel/Book-Travel-for-a-Guest.md b/docs/articles/travel/booking-travel/Book-Travel-for-a-Guest.md
index b8754f782a59..7f5f3ace5f7c 100644
--- a/docs/articles/travel/booking-travel/Book-Travel-for-a-Guest.md
+++ b/docs/articles/travel/booking-travel/Book-Travel-for-a-Guest.md
@@ -4,33 +4,33 @@ description: Learn how to book travel for guests in Expensify, even if they don
 keywords: [book guest travel, guest traveler, expensify travel, book for non-member, travel booking, classic, new expensify]
 ---
 
-Any member with guest booking permission can book travel for someone who doesn’t have an Expensify account. This guide explains how to get permission and how to complete a guest booking.
 
+Any member with guest booking permission can book travel for a guest, aka someone who doesn’t have an Expensify account.
 
 ---
 
-## Where to find Expensify Travel
+## How to access the travel tool
 
-Tap the green ➕ **Create** button at the bottom of your screen, then choose **Book travel**.
+- **In New Expensify:** Click the green **+** button in the bottom-left corner of your screen, then select **Book travel**.
+- **In Classic Expensify:** Click **Travel** in the left-hand menu, then select **Book or manage travel**.
 
-If you don’t see **Book travel**, ask a Workspace Admin to [enable Expensify Travel](https://help.expensify.com/articles/travel/company-setup/Enable-Travel-on-a-Workspace) on the workspace. 
+**Need to enable travel still?** Reach out to your Account Manager or Concierge to schedule a travel demo and get it enabled for your account.
 
 ---
 
-## How to get permission to book travel for a guest
+## How to get access
 
-To book travel for a guest, a Travel Admin must assign you the **Travel Arranger** role and enable guest booking.
+Before arranging travel for another traveler, a Travel Admin must assign you the **Travel Arranger** role.
 
-**To give a member guest booking permissions:**
+**To set the Travel Arranger role for another travel member:**
 
 1. Head to Expensify Travel.
-2. Click **Program** > **Users**, then search and select the name of the member.
-3. Click the **Configuration** tab.
-4. Toggle on **Allow employee to book for guests**.
+2. Click on **Program** > **Users** > search and select the name of the user who needs to arrange travel.
+3. Click the **Configuration** tab and then click the toggle for **Allow employee to book for guests**.
 
 ---
 
-# How to book travel for a guest
+## How to book travel for a guest
 
 1. Click **Book for Guest** at the bottom of the booking tool.
 2. Choose a travel type:
@@ -46,7 +46,7 @@ To book travel for a guest, a Travel Admin must assign you the **Travel Arranger
 
 ---
 
-## What happens after booking with Expensify Travel 
+## What happens next
 
 - Bookings may require approval based on your company’s travel policy.
 - The guest will receive a confirmation email with their travel details.
@@ -57,13 +57,9 @@ To book travel for a guest, a Travel Admin must assign you the **Travel Arranger
 
 # FAQ
 
-## Does the guest need to have an Expensify account?
+## Will the guest need an Expensify account?
 No. Guest travelers don’t need an account to receive or use their travel reservation.
 
-## Will the guest travel booking show up in my reports?
+## Will the travel show up in my reports?
 Yes. The booking appears in your Expensify account, and receipts are automatically added to an expense report.
 
-## Who approves guest travel bookings?
-Guest travel follows the same approval workflow as the member who made the booking. If your company requires approval for flights, hotels, or other travel types, those steps will still apply.
-
-
diff --git a/docs/articles/travel/booking-travel/Book-a-Hotel.md b/docs/articles/travel/booking-travel/Book-a-Hotel.md
index ea35d842b2b1..f25f12b695b7 100644
--- a/docs/articles/travel/booking-travel/Book-a-Hotel.md
+++ b/docs/articles/travel/booking-travel/Book-a-Hotel.md
@@ -6,15 +6,16 @@ keywords: [New Expensify, book hotel, travel booking, hotel receipt, travel itin
 
 <div id="new-expensify" markdown="1">
 
-Book hotels easily with Expensify Travel. This guide covers how to search for hotels, filter options, complete your booking, and view your travel details in New Expensify.
+Book hotels easily using Expensify’s integrated travel tool. This guide covers how to search for hotels, filter options, complete your booking, and view your travel details in New Expensify.
 
-## Where to find Expensify Travel
+# How to access the travel tool
 
-Tap the green ➕ **Create** button at the bottom of your screen, then choose **Book travel**.
+From the left-hand menu, select **Reports > Trips**.  
+Click the green **+** button in the bottom-left corner, then choose **Book travel**.
 
-If you don’t see **Book travel**, ask a Workspace Admin to [enable Expensify Travel](https://help.expensify.com/articles/travel/company-setup/Enable-Travel-on-a-Workspace) on the workspace. 
+If you don’t see this option, reach out to your Account Manager or Concierge to schedule a travel demo and enable the feature for your account.
 
-# How to book a hotel
+# How to search and book a hotel
 
 1. Click the **Hotel** tab in the booking tool.
 2. Enter the search details:
@@ -36,11 +37,12 @@ If you don’t see **Book travel**, ask a Workspace Admin to [enable Expensify T
 7. Select an existing trip or create a new one for the booking.
 8. Confirm your payment method and click **Book Hotel**.
 
-## What happens after booking with Expensify Travel 
+# What happens next
 
 - Your company’s travel policy may require approval before the reservation is finalized.
 - You’ll receive a confirmation email after booking.
-- The hotel receipt will automatically be added to your Expensify account. If your hotel is post-paid, upload the final bill manually after checkout.
+- The hotel receipt will automatically be added to your Expensify account.
+   - Note: If your hotel booking is post-paid, then you'll need to upload your final hotel bill to your Expensify account instead. 
 - If your payment card is connected to Expensify, the receipt will merge with the imported expense.
 
 # FAQ
@@ -55,13 +57,10 @@ Yes. Use the **Payment Type** filter to choose a payment option that works best
 
 ## What if my plans change?
 
-You can cancel or modify the booking if the hotel’s policy allows.
-Cancellation policies are shown during booking. Changes made through support may incur a fee of up to $25.
+You can cancel or modify your booking if the hotel’s policy allows it.  
+Cancellation policies are shown during booking. Changes made via support incur a $25 booking change fee.
 
-To modify or cancel a booking:
-1. Tap the green ➕ **Create** button at the bottom of your screen, then choose **Book travel**.
-2. In the window that opens, click the **Trips** tab.
-3. Find your trip and click **Modify or Cancel**
+Manage bookings by going to **Reports > Trips > My Trips**.
 
 ## Where will my hotel receipt appear?
 
diff --git a/docs/articles/travel/booking-travel/Book-a-Rental-Car.md b/docs/articles/travel/booking-travel/Book-a-Rental-Car.md
index a20ec6449aaf..adaf7064cbe3 100644
--- a/docs/articles/travel/booking-travel/Book-a-Rental-Car.md
+++ b/docs/articles/travel/booking-travel/Book-a-Rental-Car.md
@@ -8,11 +8,12 @@ keywords: [New Expensify, book rental car, car rental, trip room, travel itinera
 
 Book rental cars quickly and easily through Expensify’s integrated travel portal. This guide walks you through searching for a rental, booking it, and accessing your trip information in New Expensify.
 
-## Where to find Expensify Travel
+# How to access the travel tool
 
-Tap the green ➕ **Create** button at the bottom of your screen, then choose **Book travel**.
+From the left-hand menu, select **Reports > Trips**.  
+Click the green **+** button in the bottom-left corner, then choose **Book travel**.
 
-If you don’t see **Book travel**, ask a Workspace Admin to [enable Expensify Travel](https://help.expensify.com/articles/travel/company-setup/Enable-Travel-on-a-Workspace) on the workspace. 
+If this option isn’t available, reach out to your Account Manager or Concierge to schedule a travel demo and enable travel for your account.
 
 # How to book a rental car
 
@@ -32,7 +33,7 @@ If you don’t see **Book travel**, ask a Workspace Admin to [enable Expensify T
 6. Select an existing trip or create a new one to assign the booking.
 7. Confirm your payment method and click **Reserve**.
 
-## What happens after booking with Expensify Travel 
+# What happens next
 
 - Your company’s travel policy may require approval before the reservation is confirmed.
 - You’ll receive a confirmation email once your booking is complete.
@@ -53,7 +54,7 @@ Insurance offerings vary by provider. You’ll see available options and add-ons
 
 Yes! Use filters to select your preferred rental provider.
 
-## Where can I view my trip itinerary?
+## Where can I view my car rental itinerary while on the go?
 
 When a traveler books a trip in Expensify Travel, a **trip itinerary** is automatically created in New Expensify. 
 To view your trip:
diff --git a/docs/assets/images/ExpensifyHelp-Workflows-1.png b/docs/assets/images/ExpensifyHelp-Workflows-1.png
new file mode 100644
index 000000000000..2eb2a8a79b04
Binary files /dev/null and b/docs/assets/images/ExpensifyHelp-Workflows-1.png differ
diff --git a/docs/assets/images/ExpensifyHelp-Workflows-2.png b/docs/assets/images/ExpensifyHelp-Workflows-2.png
new file mode 100644
index 000000000000..64561611c59c
Binary files /dev/null and b/docs/assets/images/ExpensifyHelp-Workflows-2.png differ
diff --git a/docs/assets/images/ExpensifyHelp-Workflows-3.png b/docs/assets/images/ExpensifyHelp-Workflows-3.png
new file mode 100644
index 000000000000..e714a221c421
Binary files /dev/null and b/docs/assets/images/ExpensifyHelp-Workflows-3.png differ
diff --git a/docs/assets/images/personal-card-01.png b/docs/assets/images/personal-card-01.png
deleted file mode 100644
index 96a6f8120d20..000000000000
Binary files a/docs/assets/images/personal-card-01.png and /dev/null differ
diff --git a/docs/assets/images/personal-card-02.png b/docs/assets/images/personal-card-02.png
deleted file mode 100644
index f664e1ea5b5b..000000000000
Binary files a/docs/assets/images/personal-card-02.png and /dev/null differ
diff --git a/docs/assets/images/submissions-01.png b/docs/assets/images/submissions-01.png
deleted file mode 100644
index 961fd527a634..000000000000
Binary files a/docs/assets/images/submissions-01.png and /dev/null differ
diff --git a/docs/assets/images/submissions-02.png b/docs/assets/images/submissions-02.png
deleted file mode 100644
index edabf944f7f9..000000000000
Binary files a/docs/assets/images/submissions-02.png and /dev/null differ
diff --git a/docs/assets/images/submissions-03.png b/docs/assets/images/submissions-03.png
deleted file mode 100644
index e859096fd82d..000000000000
Binary files a/docs/assets/images/submissions-03.png and /dev/null differ
diff --git a/docs/new-expensify/hubs/domains/index.html b/docs/new-expensify/hubs/domains/index.html
deleted file mode 100644
index 3ed77ad3b188..000000000000
--- a/docs/new-expensify/hubs/domains/index.html
+++ /dev/null
@@ -1,6 +0,0 @@
----
-layout: default
-title: domains
----
-
-{% include hub.html %}
diff --git a/docs/redirects.csv b/docs/redirects.csv
index 737c485d8085..dea29cd1a8f7 100644
--- a/docs/redirects.csv
+++ b/docs/redirects.csv
@@ -823,7 +823,7 @@ https://help.expensify.com/new-expensify/hubs/connect-credit-cards/company-cards
 https://help.expensify.com/articles/expensify-classic/reports/Track-report-history.html,https://help.expensify.com/articles/expensify-classic/reports/Edit-and-Submit-Expense-Reports
 https://help.expensify.com/articles/expensify-classic/reports/Report-statuses.html,https://help.expensify.com/articles/expensify-classic/reports/Edit-and-Submit-Expense-Reports#report-statuses
 https://help.expensify.com/articles/expensify-classic/reports/Edit-a-report.html,https://help.expensify.com/articles/expensify-classic/reports/Edit-and-Submit-Expense-Reports
-https://help.expensify.com/articles/expensify-classic/domains/SAML-SSO.html,https://help.expensify.com/articles/expensify-classic/domains/Set-Up-SAML-SSO.md
+https://help.expensify.com/articles/expensify-classic/domains/SAML-SSO.html,https://help.expensify.com/articles/expensify-classic/domains/Managing-Single-Sign-On-(SSO)-in-Expensify
 https://help.expensify.com/articles/expensify-classic/get-paid-back/reports/Reimbursements.html,https://help.expensify.com/articles/expensify-classic/bank-accounts-and-payments/payments/Receive-Payments
 https://help.expensify.com/articles/expensify-classic/get-paid-back/expenses/Upload-Receipts.html,https://help.expensify.com/articles/expensify-classic/expenses/Add-an-expense#add-an-expense-with-smartscan
 https://help.expensify.com/articles/new-expensify/billing-and-subscriptions/adding-payment-card-subscription-overview.html,https://help.expensify.com/articles/new-expensify/billing-and-subscriptions/Add-a-payment-card-and-view-your-subscription
@@ -892,9 +892,4 @@ https://help.expensify.com/classic,https://help.expensify.com/expensify-classic/
 https://help.expensify.com/articles/new-expensify/expensify-card/Enable-Expensify-Card-notifications,https://help.expensify.com/articles/new-expensify/expensify-card/Expensify-Card-Notifications
 https://help.expensify.com/articles/expensify-classic/bank-accounts-and-payments/bank-accounts.md/Add-or-remove-a-business-bank-account,https://help.expensify.com/articles/expensify-classic/bank-accounts-and-payments/bank-accounts/Connect-US-Business-Bank-Account
 https://help.expensify.com/articles/Unlisted/Compliance-Documentation.md,https://help.expensify.com/articles/new-expensify/settings/Encryption-and-Data-Security
-https://help.expensify.com/articles/new-expensify/workspaces/Verify-a-Domain,https://help.expensify.com/articles/new-expensify/domains/Claim-and-Verify-a-Domain
-https://help.expensify.com/articles/new-expensify/workspaces/Set-Up-SAML-Single-Sign-On,https://help.expensify.com/articles/new-expensify/domains/Set-Up-SAML-SSO
-https://community.expensify.com/discussion/4751/how-to-add-an-ach-business-bank-account-to-reimburse-employees-us-only,https://help.expensify.com/articles/expensify-classic/bank-accounts-and-payments/bank-accounts/Connect-US-Business-Bank-Account
-https://community.expensify.com/discussion/5700/deep-dive-approval-workflow-overview/,https://help.expensify.com/articles/expensify-classic/reports/Create-a-report-approval-workflow
-https://community.expensify.com/discussion/5799/,https://help.expensify.com/articles/expensify-classic/spending-insights/Export-Expenses-And-Reports#date-formats
-https://community.expensify.com/discussion/5677/deep-dive-how-expensify-protects-your-information/,https://help.expensify.com/articles/new-expensify/settings/Encryption-and-Data-Security
+https://help.expensify.com/articles/new-expensify/workspaces/Verify-a-Domain,https://help.expensify.com/articles/new-expensify/workspaces/Claim-and-Verify-a-Domain
diff --git a/eslint.config.mjs b/eslint.config.mjs
index 0b84522bce4f..f3be8b5704e1 100644
--- a/eslint.config.mjs
+++ b/eslint.config.mjs
@@ -1,7 +1,6 @@
 import {FlatCompat} from '@eslint/eslintrc';
 import tsParser from '@typescript-eslint/parser';
 import expensifyConfig from 'eslint-config-expensify';
-import fileProgress from 'eslint-plugin-file-progress';
 import jsdoc from 'eslint-plugin-jsdoc';
 import lodash from 'eslint-plugin-lodash';
 import react from 'eslint-plugin-react';
@@ -163,7 +162,6 @@ const config = defineConfig([
     expensifyConfig,
     typescriptEslint.configs.recommendedTypeChecked,
     typescriptEslint.configs.stylisticTypeChecked,
-    fileProgress.configs['recommended-ci'],
 
     {
         extends: new FlatCompat({baseDirectory: dirname}).extends(
diff --git a/ios/NewExpensify/Info.plist b/ios/NewExpensify/Info.plist
index b9492ea49a9d..a7f6896a15ee 100644
--- a/ios/NewExpensify/Info.plist
+++ b/ios/NewExpensify/Info.plist
@@ -23,7 +23,7 @@
 	<key>CFBundlePackageType</key>
 	<string>APPL</string>
 	<key>CFBundleShortVersionString</key>
-	<string>9.3.7</string>
+	<string>9.3.1</string>
 	<key>CFBundleSignature</key>
 	<string>????</string>
 	<key>CFBundleURLTypes</key>
@@ -44,7 +44,7 @@
 		</dict>
 	</array>
 	<key>CFBundleVersion</key>
-	<string>9.3.7.1</string>
+	<string>9.3.1.0</string>
 	<key>FullStory</key>
 	<dict>
 		<key>OrgId</key>
diff --git a/ios/NotificationServiceExtension/Info.plist b/ios/NotificationServiceExtension/Info.plist
index 94d5939cf3c3..40a70e84b653 100644
--- a/ios/NotificationServiceExtension/Info.plist
+++ b/ios/NotificationServiceExtension/Info.plist
@@ -11,9 +11,9 @@
 	<key>CFBundleName</key>
 	<string>$(PRODUCT_NAME)</string>
 	<key>CFBundleShortVersionString</key>
-	<string>9.3.7</string>
+	<string>9.3.1</string>
 	<key>CFBundleVersion</key>
-	<string>9.3.7.1</string>
+	<string>9.3.1.0</string>
 	<key>NSExtension</key>
 	<dict>
 		<key>NSExtensionPointIdentifier</key>
diff --git a/ios/ShareViewController/Info.plist b/ios/ShareViewController/Info.plist
index 3f8247b8269f..7788fddb8885 100644
--- a/ios/ShareViewController/Info.plist
+++ b/ios/ShareViewController/Info.plist
@@ -11,9 +11,9 @@
 	<key>CFBundleName</key>
 	<string>$(PRODUCT_NAME)</string>
 	<key>CFBundleShortVersionString</key>
-	<string>9.3.7</string>
+	<string>9.3.1</string>
 	<key>CFBundleVersion</key>
-	<string>9.3.7.1</string>
+	<string>9.3.1.0</string>
 	<key>NSExtension</key>
 	<dict>
 		<key>NSExtensionAttributes</key>
diff --git a/jest.config.js b/jest.config.js
index 904f49eb1f49..0c60bf77e3aa 100644
--- a/jest.config.js
+++ b/jest.config.js
@@ -14,7 +14,7 @@ module.exports = {
         '^.+\\.svg?$': 'jest-transformer-svg',
     },
     transformIgnorePatterns: [
-        '<rootDir>/node_modules/(?!.*(react-native|expo|@noble|react-navigation|uuid|@shopify\/flash-list).*/)',
+        '<rootDir>/node_modules/(?!.*(react-native|expo|react-navigation|uuid|@shopify\/flash-list).*/)',
         // Prevent Babel from transforming worklets in this file so they are treated as normal functions, otherwise FormatSelectionUtilsTest won't run.
         '<rootDir>/node_modules/@expensify/react-native-live-markdown/lib/commonjs/parseExpensiMark.js',
     ],
@@ -35,7 +35,5 @@ module.exports = {
     moduleNameMapper: {
         '\\.(lottie)$': '<rootDir>/__mocks__/fileMock.ts',
         '^group-ib-fp$': '<rootDir>/__mocks__/group-ib-fp.ts',
-        '@noble/ed25519': '<rootDir>/node_modules/@noble/ed25519/index.ts',
-        '@noble/hashes/(.*)': '<rootDir>/node_modules/@noble/hashes/src/$1.ts',
     },
 };
diff --git a/jest/setup.ts b/jest/setup.ts
index 6ed6fcbbbf41..7ae6c9ba6d93 100644
--- a/jest/setup.ts
+++ b/jest/setup.ts
@@ -9,7 +9,6 @@ import type * as RNKeyboardController from 'react-native-keyboard-controller';
 import mockStorage from 'react-native-onyx/dist/storage/__mocks__';
 import type Animated from 'react-native-reanimated';
 import 'setimmediate';
-import * as MockedSecureStore from '@src/libs/MultifactorAuthentication/Biometrics/SecureStore/index.web';
 import mockFSLibrary from './setupMockFullstoryLib';
 import setupMockImages from './setupMockImages';
 import setupMockReactNativeWorklets from './setupMockReactNativeWorklets';
@@ -35,12 +34,6 @@ jest.mock('react-native-onyx/dist/storage', () => mockStorage);
 // Mock NativeEventEmitter as it is needed to provide mocks of libraries which include it
 jest.mock('react-native/Libraries/EventEmitter/NativeEventEmitter');
 
-// Mock expo-task-manager
-jest.mock('expo-task-manager', () => ({
-    defineTask: jest.fn(),
-    // Add other methods here if you use them
-}));
-
 // Needed for: https://stackoverflow.com/questions/76903168/mocking-libraries-in-jest
 jest.mock('react-native/Libraries/LogBox/LogBox', () => ({
     // eslint-disable-next-line @typescript-eslint/naming-convention
@@ -99,9 +92,6 @@ jest.mock('react-native-share', () => ({
     default: jest.fn(),
 }));
 
-// Jest has no access to the native secure store module, so we mock it with the web implementation.
-jest.mock('@src/libs/MultifactorAuthentication/Biometrics/SecureStore', () => MockedSecureStore);
-
 jest.mock('react-native-reanimated', () => ({
     ...jest.requireActual<typeof Animated>('react-native-reanimated/mock'),
     createAnimatedPropAdapter: jest.fn,
diff --git a/package-lock.json b/package-lock.json
index 1d34dad6ee82..b5b2c1504667 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
 {
   "name": "new.expensify",
-  "version": "9.3.7-1",
+  "version": "9.3.1-0",
   "lockfileVersion": 3,
   "requires": true,
   "packages": {
     "": {
       "name": "new.expensify",
-      "version": "9.3.7-1",
+      "version": "9.3.1-0",
       "hasInstallScript": true,
       "license": "MIT",
       "dependencies": {
@@ -74,7 +74,6 @@
         "expo-modules-core": "3.0.18",
         "expo-secure-store": "~14.2.4",
         "expo-store-review": "~9.0.8",
-        "expo-task-manager": "~14.0.9",
         "fast-equals": "^5.2.2",
         "focus-trap-react": "^11.0.3",
         "group-ib-fp": "file:modules/group-ib-fp",
@@ -119,7 +118,7 @@
         "react-native-localize": "^3.5.4",
         "react-native-nitro-modules": "0.29.4",
         "react-native-nitro-sqlite": "9.2.0",
-        "react-native-onyx": "3.0.30",
+        "react-native-onyx": "3.0.29",
         "react-native-pager-view": "7.0.2",
         "react-native-pdf": "7.0.2",
         "react-native-performance": "^6.0.0",
@@ -244,7 +243,6 @@
         "eslint-config-airbnb-typescript": "^18.0.0",
         "eslint-config-expensify": "2.0.103",
         "eslint-config-prettier": "^9.1.0",
-        "eslint-plugin-file-progress": "3.0.1",
         "eslint-plugin-jest": "^29.0.1",
         "eslint-plugin-jsdoc": "^60.7.0",
         "eslint-plugin-lodash": "^7.4.0",
@@ -12531,42 +12529,6 @@
         }
       }
     },
-    "node_modules/@rnmapbox/maps/node_modules/@turf/distance": {
-      "version": "6.5.0",
-      "resolved": "https://registry.npmjs.org/@turf/distance/-/distance-6.5.0.tgz",
-      "integrity": "sha512-xzykSLfoURec5qvQJcfifw/1mJa+5UwByZZ5TZ8iaqjGYN0vomhV9aiSLeYdUGtYRESZ+DYC/OzY+4RclZYgMg==",
-      "license": "MIT",
-      "dependencies": {
-        "@turf/helpers": "^6.5.0",
-        "@turf/invariant": "^6.5.0"
-      },
-      "funding": {
-        "url": "https://opencollective.com/turf"
-      }
-    },
-    "node_modules/@rnmapbox/maps/node_modules/@turf/helpers": {
-      "version": "6.5.0",
-      "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz",
-      "integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==",
-      "license": "MIT",
-      "funding": {
-        "url": "https://opencollective.com/turf"
-      }
-    },
-    "node_modules/@rnmapbox/maps/node_modules/@turf/length": {
-      "version": "6.5.0",
-      "resolved": "https://registry.npmjs.org/@turf/length/-/length-6.5.0.tgz",
-      "integrity": "sha512-5pL5/pnw52fck3oRsHDcSGrj9HibvtlrZ0QNy2OcW8qBFDNgZ4jtl6U7eATVoyWPKBHszW3dWETW+iLV7UARig==",
-      "license": "MIT",
-      "dependencies": {
-        "@turf/distance": "^6.5.0",
-        "@turf/helpers": "^6.5.0",
-        "@turf/meta": "^6.5.0"
-      },
-      "funding": {
-        "url": "https://opencollective.com/turf"
-      }
-    },
     "node_modules/@rnmapbox/maps/node_modules/debounce": {
       "version": "2.2.0",
       "resolved": "https://registry.npmjs.org/debounce/-/debounce-2.2.0.tgz",
@@ -16002,28 +15964,6 @@
         "url": "https://opencollective.com/turf"
       }
     },
-    "node_modules/@turf/along/node_modules/@turf/distance": {
-      "version": "6.5.0",
-      "resolved": "https://registry.npmjs.org/@turf/distance/-/distance-6.5.0.tgz",
-      "integrity": "sha512-xzykSLfoURec5qvQJcfifw/1mJa+5UwByZZ5TZ8iaqjGYN0vomhV9aiSLeYdUGtYRESZ+DYC/OzY+4RclZYgMg==",
-      "license": "MIT",
-      "dependencies": {
-        "@turf/helpers": "^6.5.0",
-        "@turf/invariant": "^6.5.0"
-      },
-      "funding": {
-        "url": "https://opencollective.com/turf"
-      }
-    },
-    "node_modules/@turf/along/node_modules/@turf/helpers": {
-      "version": "6.5.0",
-      "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz",
-      "integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==",
-      "license": "MIT",
-      "funding": {
-        "url": "https://opencollective.com/turf"
-      }
-    },
     "node_modules/@turf/bbox": {
       "version": "6.5.0",
       "license": "MIT",
@@ -16035,15 +15975,6 @@
         "url": "https://opencollective.com/turf"
       }
     },
-    "node_modules/@turf/bbox/node_modules/@turf/helpers": {
-      "version": "6.5.0",
-      "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz",
-      "integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==",
-      "license": "MIT",
-      "funding": {
-        "url": "https://opencollective.com/turf"
-      }
-    },
     "node_modules/@turf/bearing": {
       "version": "6.5.0",
       "license": "MIT",
@@ -16055,16 +15986,18 @@
         "url": "https://opencollective.com/turf"
       }
     },
-    "node_modules/@turf/bearing/node_modules/@turf/helpers": {
+    "node_modules/@turf/destination": {
       "version": "6.5.0",
-      "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz",
-      "integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==",
       "license": "MIT",
+      "dependencies": {
+        "@turf/helpers": "^6.5.0",
+        "@turf/invariant": "^6.5.0"
+      },
       "funding": {
         "url": "https://opencollective.com/turf"
       }
     },
-    "node_modules/@turf/destination": {
+    "node_modules/@turf/distance": {
       "version": "6.5.0",
       "license": "MIT",
       "dependencies": {
@@ -16075,10 +16008,8 @@
         "url": "https://opencollective.com/turf"
       }
     },
-    "node_modules/@turf/destination/node_modules/@turf/helpers": {
+    "node_modules/@turf/helpers": {
       "version": "6.5.0",
-      "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz",
-      "integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==",
       "license": "MIT",
       "funding": {
         "url": "https://opencollective.com/turf"
@@ -16094,11 +16025,14 @@
         "url": "https://opencollective.com/turf"
       }
     },
-    "node_modules/@turf/invariant/node_modules/@turf/helpers": {
+    "node_modules/@turf/length": {
       "version": "6.5.0",
-      "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz",
-      "integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==",
       "license": "MIT",
+      "dependencies": {
+        "@turf/distance": "^6.5.0",
+        "@turf/helpers": "^6.5.0",
+        "@turf/meta": "^6.5.0"
+      },
       "funding": {
         "url": "https://opencollective.com/turf"
       }
@@ -16117,15 +16051,6 @@
         "url": "https://opencollective.com/turf"
       }
     },
-    "node_modules/@turf/line-intersect/node_modules/@turf/helpers": {
-      "version": "6.5.0",
-      "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz",
-      "integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==",
-      "license": "MIT",
-      "funding": {
-        "url": "https://opencollective.com/turf"
-      }
-    },
     "node_modules/@turf/line-segment": {
       "version": "6.5.0",
       "license": "MIT",
@@ -16138,15 +16063,6 @@
         "url": "https://opencollective.com/turf"
       }
     },
-    "node_modules/@turf/line-segment/node_modules/@turf/helpers": {
-      "version": "6.5.0",
-      "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz",
-      "integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==",
-      "license": "MIT",
-      "funding": {
-        "url": "https://opencollective.com/turf"
-      }
-    },
     "node_modules/@turf/meta": {
       "version": "6.5.0",
       "license": "MIT",
@@ -16157,15 +16073,6 @@
         "url": "https://opencollective.com/turf"
       }
     },
-    "node_modules/@turf/meta/node_modules/@turf/helpers": {
-      "version": "6.5.0",
-      "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz",
-      "integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==",
-      "license": "MIT",
-      "funding": {
-        "url": "https://opencollective.com/turf"
-      }
-    },
     "node_modules/@turf/nearest-point-on-line": {
       "version": "6.5.0",
       "license": "MIT",
@@ -16182,28 +16089,6 @@
         "url": "https://opencollective.com/turf"
       }
     },
-    "node_modules/@turf/nearest-point-on-line/node_modules/@turf/distance": {
-      "version": "6.5.0",
-      "resolved": "https://registry.npmjs.org/@turf/distance/-/distance-6.5.0.tgz",
-      "integrity": "sha512-xzykSLfoURec5qvQJcfifw/1mJa+5UwByZZ5TZ8iaqjGYN0vomhV9aiSLeYdUGtYRESZ+DYC/OzY+4RclZYgMg==",
-      "license": "MIT",
-      "dependencies": {
-        "@turf/helpers": "^6.5.0",
-        "@turf/invariant": "^6.5.0"
-      },
-      "funding": {
-        "url": "https://opencollective.com/turf"
-      }
-    },
-    "node_modules/@turf/nearest-point-on-line/node_modules/@turf/helpers": {
-      "version": "6.5.0",
-      "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz",
-      "integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==",
-      "license": "MIT",
-      "funding": {
-        "url": "https://opencollective.com/turf"
-      }
-    },
     "node_modules/@types/aria-query": {
       "version": "5.0.4",
       "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz",
@@ -22354,23 +22239,6 @@
         "node": ">=4"
       }
     },
-    "node_modules/eslint-plugin-file-progress": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/eslint-plugin-file-progress/-/eslint-plugin-file-progress-3.0.1.tgz",
-      "integrity": "sha512-sPUOIifutW3Ehhmujt40IU5ytXL6HnuGVev2n9cp4d5fzVOoQp1K17DJ/I+cRdctmTpMcYit/fOuF9efjmD98A==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "nanospinner": "^1.2.0",
-        "picocolors": "^1.1.1"
-      },
-      "engines": {
-        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
-      },
-      "peerDependencies": {
-        "eslint": "^9.0.0"
-      }
-    },
     "node_modules/eslint-plugin-import": {
       "version": "2.32.0",
       "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz",
@@ -23376,12 +23244,12 @@
       }
     },
     "node_modules/expo-constants": {
-      "version": "18.0.10",
-      "resolved": "https://registry.npmjs.org/expo-constants/-/expo-constants-18.0.10.tgz",
-      "integrity": "sha512-Rhtv+X974k0Cahmvx6p7ER5+pNhBC0XbP1lRviL2J1Xl4sT2FBaIuIxF/0I0CbhOsySf0ksqc5caFweAy9Ewiw==",
+      "version": "18.0.9",
+      "resolved": "https://registry.npmjs.org/expo-constants/-/expo-constants-18.0.9.tgz",
+      "integrity": "sha512-sqoXHAOGDcr+M9NlXzj1tGoZyd3zxYDy215W6E0Z0n8fgBaqce9FAYQE2bu5X4G629AYig5go7U6sQz7Pjcm8A==",
       "license": "MIT",
       "dependencies": {
-        "@expo/config": "~12.0.10",
+        "@expo/config": "~12.0.9",
         "@expo/env": "~2.0.7"
       },
       "peerDependencies": {
@@ -23585,23 +23453,10 @@
       }
     },
     "node_modules/expo-store-review": {
-      "version": "9.0.9",
-      "resolved": "https://registry.npmjs.org/expo-store-review/-/expo-store-review-9.0.9.tgz",
-      "integrity": "sha512-99vS7edXlKzPcdjrzVlMQWc4zOyq4khQfFjhNqJgpGP+AgRn4U0LaZkHIrVjmzolryD3rcHJSiUQH9Vi0sD0MQ==",
-      "license": "MIT",
-      "peerDependencies": {
-        "expo": "*",
-        "react-native": "*"
-      }
-    },
-    "node_modules/expo-task-manager": {
-      "version": "14.0.9",
-      "resolved": "https://registry.npmjs.org/expo-task-manager/-/expo-task-manager-14.0.9.tgz",
-      "integrity": "sha512-GKWtXrkedr4XChHfTm5IyTcSfMtCPxzx89y4CMVqKfyfROATibrE/8UI5j7UC/pUOfFoYlQvulQEvECMreYuUA==",
+      "version": "9.0.8",
+      "resolved": "https://registry.npmjs.org/expo-store-review/-/expo-store-review-9.0.8.tgz",
+      "integrity": "sha512-S8ExQRqQBHHmZOX2gabEeRJDrgeAhzBf5FOtnhp5fMinpwT7umNOMHy+PwrTYJ/+AjnnKHgLoM1o/MDgcL3qCw==",
       "license": "MIT",
-      "dependencies": {
-        "unimodules-app-loader": "~6.0.8"
-      },
       "peerDependencies": {
         "expo": "*",
         "react-native": "*"
@@ -25267,15 +25122,6 @@
         "rbush": "^3.0.1"
       }
     },
-    "node_modules/geojson-rbush/node_modules/@turf/helpers": {
-      "version": "6.5.0",
-      "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz",
-      "integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==",
-      "license": "MIT",
-      "funding": {
-        "url": "https://opencollective.com/turf"
-      }
-    },
     "node_modules/geojson-vt": {
       "version": "3.2.1",
       "license": "ISC"
@@ -31198,16 +31044,6 @@
         "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
       }
     },
-    "node_modules/nanospinner": {
-      "version": "1.2.2",
-      "resolved": "https://registry.npmjs.org/nanospinner/-/nanospinner-1.2.2.tgz",
-      "integrity": "sha512-Zt/AmG6qRU3e+WnzGGLuMCEAO/dAu45stNbHY223tUxldaDAeE+FxSPsd9Q+j+paejmm0ZbrNVs5Sraqy3dRxA==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "picocolors": "^1.1.1"
-      }
-    },
     "node_modules/napi-build-utils": {
       "version": "2.0.0",
       "license": "MIT",
@@ -33885,9 +33721,9 @@
       }
     },
     "node_modules/react-native-onyx": {
-      "version": "3.0.30",
-      "resolved": "https://registry.npmjs.org/react-native-onyx/-/react-native-onyx-3.0.30.tgz",
-      "integrity": "sha512-qlaK6UJTdoO26oPWTGCvii3U9vITrBXWaam7pkP+W9tiB56DbTcVVC/nWvJlg7+CENa2NlGwuPBB2DtodpBt8A==",
+      "version": "3.0.29",
+      "resolved": "https://registry.npmjs.org/react-native-onyx/-/react-native-onyx-3.0.29.tgz",
+      "integrity": "sha512-JvVHioPgCLhcL9nETVv9TWq+Bk12+QEqgkXUTwODsycf+d4j/2b0gwoZNoRExc8HBMaJ9D2ucfA7AWmRsCnarg==",
       "license": "MIT",
       "dependencies": {
         "ascii-table": "0.0.9",
@@ -37733,12 +37569,6 @@
         "node": ">=4"
       }
     },
-    "node_modules/unimodules-app-loader": {
-      "version": "6.0.8",
-      "resolved": "https://registry.npmjs.org/unimodules-app-loader/-/unimodules-app-loader-6.0.8.tgz",
-      "integrity": "sha512-fqS8QwT/MC/HAmw1NKCHdzsPA6WaLm0dNmoC5Pz6lL+cDGYeYCNdHMO9fy08aL2ZD7cVkNM0pSR/AoNRe+rslA==",
-      "license": "MIT"
-    },
     "node_modules/union": {
       "version": "0.5.0",
       "dev": true,
diff --git a/package.json b/package.json
index 951481d288dc..e82cd0e41371 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
   "name": "new.expensify",
-  "version": "9.3.7-1",
+  "version": "9.3.1-0",
   "author": "Expensify, Inc.",
   "homepage": "https://new.expensify.com",
   "description": "New Expensify is the next generation of Expensify: a reimagination of payments based atop a foundation of chat.",
@@ -43,7 +43,7 @@
     "test:debug": "TZ=utc NODE_OPTIONS='--inspect-brk --experimental-vm-modules' jest --runInBand",
     "perf-test": "NODE_OPTIONS=--experimental-vm-modules npx reassure",
     "typecheck": "NODE_OPTIONS=--max_old_space_size=8192 tsc",
-    "lint": "NODE_OPTIONS=--max_old_space_size=8192 eslint . --max-warnings=383 --cache --cache-location=node_modules/.cache/eslint --cache-strategy content --concurrency=auto",
+    "lint": "NODE_OPTIONS=--max_old_space_size=8192 eslint . --max-warnings=669 --cache --cache-location=node_modules/.cache/eslint --cache-strategy content --concurrency=auto",
     "lint-changed": "NODE_OPTIONS=--max_old_space_size=8192 ./scripts/lintChanged.sh",
     "check-lazy-loading": "ts-node scripts/checkLazyLoading.ts",
     "lint-watch": "npx eslint-watch --watch --changed",
@@ -143,7 +143,6 @@
     "expo-modules-core": "3.0.18",
     "expo-secure-store": "~14.2.4",
     "expo-store-review": "~9.0.8",
-    "expo-task-manager": "~14.0.9",
     "fast-equals": "^5.2.2",
     "focus-trap-react": "^11.0.3",
     "group-ib-fp": "file:modules/group-ib-fp",
@@ -188,7 +187,7 @@
     "react-native-localize": "^3.5.4",
     "react-native-nitro-modules": "0.29.4",
     "react-native-nitro-sqlite": "9.2.0",
-    "react-native-onyx": "3.0.30",
+    "react-native-onyx": "3.0.29",
     "react-native-pager-view": "7.0.2",
     "react-native-pdf": "7.0.2",
     "react-native-performance": "^6.0.0",
@@ -313,7 +312,6 @@
     "eslint-config-airbnb-typescript": "^18.0.0",
     "eslint-config-expensify": "2.0.103",
     "eslint-config-prettier": "^9.1.0",
-    "eslint-plugin-file-progress": "3.0.1",
     "eslint-plugin-jest": "^29.0.1",
     "eslint-plugin-jsdoc": "^60.7.0",
     "eslint-plugin-lodash": "^7.4.0",
diff --git a/src/App.tsx b/src/App.tsx
index 4298c48bf140..15d8ac7ba9be 100644
--- a/src/App.tsx
+++ b/src/App.tsx
@@ -53,7 +53,6 @@ import OnyxUpdateManager from './libs/actions/OnyxUpdateManager';
 import './libs/HybridApp';
 import {AttachmentModalContextProvider} from './pages/media/AttachmentModalScreen/AttachmentModalContext';
 import ExpensifyCardContextProvider from './pages/settings/Wallet/ExpensifyCardPage/ExpensifyCardContextProvider';
-import './setup/backgroundLocationTrackingTask';
 import './setup/backgroundTask';
 import './setup/fraudProtection';
 import './setup/hybridApp';
diff --git a/src/CONST/index.ts b/src/CONST/index.ts
index 2b6e2f223bae..b225d8f8a7d9 100755
--- a/src/CONST/index.ts
+++ b/src/CONST/index.ts
@@ -734,10 +734,8 @@ const CONST = {
         NO_OPTIMISTIC_TRANSACTION_THREADS: 'noOptimisticTransactionThreads',
         UBER_FOR_BUSINESS: 'uberForBusiness',
         CUSTOM_REPORT_NAMES: 'newExpensifyCustomReportNames',
-        ZERO_EXPENSES: 'zeroExpenses',
         NEW_DOT_DEW: 'newDotDEW',
         GPS_MILEAGE: 'gpsMileage',
-        NEW_DOT_HOME: 'newDotHome',
     },
     BUTTON_STATES: {
         DEFAULT: 'default',
@@ -1366,17 +1364,13 @@ const CONST = {
                     UPDATE_DEFAULT_APPROVER: 'POLICYCHANGELOG_UPDATE_DEFAULT_APPROVER',
                     UPDATE_SUBMITS_TO: 'POLICYCHANGELOG_UPDATE_SUBMITS_TO',
                     UPDATE_FORWARDS_TO: 'POLICYCHANGELOG_UPDATE_FORWARDS_TO',
-                    UPDATE_INVOICE_COMPANY_NAME: 'POLICYCHANGELOG_UPDATE_INVOICE_COMPANY_NAME',
-                    UPDATE_INVOICE_COMPANY_WEBSITE: 'POLICYCHANGELOG_UPDATE_INVOICE_COMPANY_WEBSITE',
                     UPDATE_MANUAL_APPROVAL_THRESHOLD: 'POLICYCHANGELOG_UPDATE_MANUAL_APPROVAL_THRESHOLD',
                     UPDATE_MAX_EXPENSE_AMOUNT: 'POLICYCHANGELOG_UPDATE_MAX_EXPENSE_AMOUNT',
                     UPDATE_MAX_EXPENSE_AMOUNT_NO_RECEIPT: 'POLICYCHANGELOG_UPDATE_MAX_EXPENSE_AMOUNT_NO_RECEIPT',
-                    UPDATE_MAX_EXPENSE_AGE: 'POLICYCHANGELOG_UPDATE_MAX_EXPENSE_AGE',
                     UPDATE_MULTIPLE_TAGS_APPROVER_RULES: 'POLICYCHANGELOG_UPDATE_MULTIPLE_TAGS_APPROVER_RULES',
                     UPDATE_NAME: 'POLICYCHANGELOG_UPDATE_NAME',
                     UPDATE_DESCRIPTION: 'POLICYCHANGELOG_UPDATE_DESCRIPTION',
                     UPDATE_OWNERSHIP: 'POLICYCHANGELOG_UPDATE_OWNERSHIP',
-                    UPDATE_REIMBURSER: 'POLICYCHANGELOG_UPDATE_REIMBURSER',
                     UPDATE_PROHIBITED_EXPENSES: 'POLICYCHANGELOG_UPDATE_PROHIBITED_EXPENSES',
                     UPDATE_REIMBURSEMENT_CHOICE: 'POLICYCHANGELOG_UPDATE_REIMBURSEMENT_CHOICE',
                     UPDATE_REIMBURSEMENT_ENABLED: 'POLICYCHANGELOG_UPDATE_REIMBURSEMENT_ENABLED',
@@ -1710,7 +1704,6 @@ const CONST = {
         SPAN_OPEN_REPORT: 'ManualOpenReport',
         SPAN_APP_STARTUP: 'ManualAppStartup',
         SPAN_NAVIGATE_TO_REPORTS_TAB: 'ManualNavigateToReportsTab',
-        SPAN_NAVIGATE_TO_REPORTS_TAB_RENDER: 'ManualNavigateToReportsTabRender',
         SPAN_ON_LAYOUT_SKELETON_REPORTS: 'ManualOnLayoutSkeletonReports',
         SPAN_NAVIGATE_TO_INBOX_TAB: 'ManualNavigateToInboxTab',
         SPAN_OD_ND_TRANSITION: 'ManualOdNdTransition',
@@ -3347,7 +3340,6 @@ const CONST = {
             CONTROL: 'control',
         },
         DEFAULT_MAX_EXPENSE_AGE: 90,
-        DISABLED_MAX_EXPENSE_AGE: 10000000000,
         DEFAULT_MAX_EXPENSE_AMOUNT: 200000,
         DEFAULT_MAX_AMOUNT_NO_RECEIPT: 2500,
         DEFAULT_TAG_LIST: {
@@ -3507,8 +3499,8 @@ const CONST = {
             FIXED: 'fixed',
         },
         LIMIT_VALUE: 21474836,
-        STEP_NAMES: ['1', '2', '3', '4', '5'],
-        ASSIGNEE_EXCLUDED_STEP_NAMES: ['1', '2', '3', '4'],
+        STEP_NAMES: ['1', '2', '3', '4', '5', '6'],
+        ASSIGNEE_EXCLUDED_STEP_NAMES: ['1', '2', '3', '4', '5'],
         STEP: {
             ASSIGNEE: 'Assignee',
             CARD_TYPE: 'CardType',
@@ -3705,24 +3697,6 @@ const CONST = {
             INVOICING: 'invoicing2018',
         },
     },
-    EXPENSE_RULES: {
-        FIELDS: {
-            BILLABLE: 'billable',
-            CATEGORY: 'category',
-            DESCRIPTION: 'comment',
-            CREATE_REPORT: 'createReport',
-            MERCHANT: 'merchantToMatch',
-            RENAME_MERCHANT: 'merchant',
-            REIMBURSABLE: 'reimbursable',
-            REPORT: 'report',
-            TAG: 'tag',
-            TAX: 'tax',
-        },
-        BULK_ACTION_TYPES: {
-            EDIT: 'edit',
-            DELETE: 'delete',
-        },
-    },
 
     get SUBSCRIPTION_PRICES() {
         return {
@@ -5487,10 +5461,6 @@ const CONST = {
         DISABLED: 'DISABLED',
         DISABLE: 'DISABLE',
     },
-    MULTIFACTOR_AUTHENTICATION_NOTIFICATION_TYPE: {
-        SUCCESS: 'success',
-        FAILURE: 'failure',
-    },
     MERGE_ACCOUNT_RESULTS: {
         SUCCESS: 'success',
         ERR_2FA: 'err_2fa',
@@ -5753,16 +5723,6 @@ const CONST = {
         CAROUSEL: 3,
     },
 
-    /**
-     * Feature flag to disable the missingAttendees violation feature.
-     * Set to true to disable the feature if regressions are found.
-     * When true:
-     * - Prevents new missingAttendees violations from being created
-     * - Removes existing missingAttendees violations from transaction lists
-     * - Hides "Require attendees" toggle in category settings
-     */
-    IS_ATTENDEES_REQUIRED_FEATURE_DISABLED: true,
-
     /**
      * Constants for types of violation.
      */
@@ -5772,11 +5732,6 @@ const CONST = {
         WARNING: 'warning',
     },
 
-    /**
-     * Constant for prefix of violations.
-     */
-    VIOLATIONS_PREFIX: 'violations.',
-
     /**
      * Constants with different types for the modifiedAmount violation
      */
@@ -5831,8 +5786,6 @@ const CONST = {
         RECEIPT_GENERATED_WITH_AI: 'receiptGeneratedWithAI',
         OVER_TRIP_LIMIT: 'overTripLimit',
         COMPANY_CARD_REQUIRED: 'companyCardRequired',
-        NO_ROUTE: 'noRoute',
-        MISSING_ATTENDEES: 'missingAttendees',
     },
     RTER_VIOLATION_TYPES: {
         BROKEN_CARD_CONNECTION: 'brokenCardConnection',
@@ -5995,31 +5948,31 @@ const CONST = {
     /* If we update these values, let's ensure this logic is consistent with the logic in the backend (Auth), since we're using the same method to calculate the rate value in distance requests created via Concierge. */
     CURRENCY_TO_DEFAULT_MILEAGE_RATE: JSON.parse(`{
         "AED": {
-            "rate": 428.5,
+            "rate": 414,
             "unit": "km"
         },
         "AFN": {
-            "rate": 7703.93,
+            "rate": 8851,
             "unit": "km"
         },
         "ALL": {
-            "rate": 9633.54,
+            "rate": 10783,
             "unit": "km"
         },
         "AMD": {
-            "rate": 44504.28,
+            "rate": 45116,
             "unit": "km"
         },
         "ANG": {
-            "rate": 208.86,
+            "rate": 203,
             "unit": "km"
         },
         "AOA": {
-            "rate": 106762.22,
+            "rate": 102929,
             "unit": "km"
         },
         "ARS": {
-            "rate": 171174.53,
+            "rate": 118428,
             "unit": "km"
         },
         "AUD": {
@@ -6027,75 +5980,75 @@ const CONST = {
             "unit": "km"
         },
         "AWG": {
-            "rate": 210.31,
+            "rate": 203,
             "unit": "km"
         },
         "AZN": {
-            "rate": 198.35,
+            "rate": 192,
             "unit": "km"
         },
         "BAM": {
-            "rate": 194.86,
+            "rate": 212,
             "unit": "km"
         },
         "BBD": {
-            "rate": 233.35,
+            "rate": 225,
             "unit": "km"
         },
         "BDT": {
-            "rate": 14251.98,
+            "rate": 13697,
             "unit": "km"
         },
         "BGN": {
-            "rate": 195.25,
+            "rate": 211,
             "unit": "km"
         },
         "BHD": {
-            "rate": 43.98,
+            "rate": 42,
             "unit": "km"
         },
         "BIF": {
-            "rate": 345436.14,
+            "rate": 331847,
             "unit": "km"
         },
         "BMD": {
-            "rate": 116.68,
+            "rate": 113,
             "unit": "km"
         },
         "BND": {
-            "rate": 149.25,
+            "rate": 153,
             "unit": "km"
         },
         "BOB": {
-            "rate": 807.7,
+            "rate": 779,
             "unit": "km"
         },
         "BRL": {
-            "rate": 626.95,
+            "rate": 660,
             "unit": "km"
         },
         "BSD": {
-            "rate": 116.68,
+            "rate": 113,
             "unit": "km"
         },
         "BTN": {
-            "rate": 10516.86,
+            "rate": 9761,
             "unit": "km"
         },
         "BWP": {
-            "rate": 1619.97,
+            "rate": 1569,
             "unit": "km"
         },
         "BYN": {
-            "rate": 342.9,
+            "rate": 369,
             "unit": "km"
         },
         "BYR": {
-            "rate": 2336612.1,
+            "rate": 2255979,
             "unit": "km"
         },
         "BZD": {
-            "rate": 234.56,
+            "rate": 227,
             "unit": "km"
         },
         "CAD": {
@@ -6103,7 +6056,7 @@ const CONST = {
             "unit": "km"
         },
         "CDF": {
-            "rate": 264869.39,
+            "rate": 321167,
             "unit": "km"
         },
         "CHF": {
@@ -6111,67 +6064,67 @@ const CONST = {
             "unit": "km"
         },
         "CLP": {
-            "rate": 104301.62,
+            "rate": 111689,
             "unit": "km"
         },
         "CNY": {
-            "rate": 814.84,
+            "rate": 808,
             "unit": "km"
         },
         "COP": {
-            "rate": 439901.44,
+            "rate": 473791,
             "unit": "km"
         },
         "CRC": {
-            "rate": 57973.09,
+            "rate": 57190,
             "unit": "km"
         },
         "CUC": {
-            "rate": 116.68,
+            "rate": 113,
             "unit": "km"
         },
         "CUP": {
-            "rate": 3004.45,
+            "rate": 2902,
             "unit": "km"
         },
         "CVE": {
-            "rate": 11004.01,
+            "rate": 11961,
             "unit": "km"
         },
         "CZK": {
-            "rate": 2413.34,
+            "rate": 2715,
             "unit": "km"
         },
         "DJF": {
-            "rate": 20752.5,
+            "rate": 19956,
             "unit": "km"
         },
         "DKK": {
-            "rate": 394,
+            "rate": 381,
             "unit": "km"
         },
         "DOP": {
-            "rate": 7398.54,
+            "rate": 6948,
             "unit": "km"
         },
         "DZD": {
-            "rate": 15153.28,
+            "rate": 15226,
             "unit": "km"
         },
         "EEK": {
-            "rate": 1704.36,
+            "rate": 1646,
             "unit": "km"
         },
         "EGP": {
-            "rate": 5512.97,
+            "rate": 5657,
             "unit": "km"
         },
         "ERN": {
-            "rate": 1750.16,
+            "rate": 1690,
             "unit": "km"
         },
         "ETB": {
-            "rate": 18077.09,
+            "rate": 14326,
             "unit": "km"
         },
         "EUR": {
@@ -6179,11 +6132,11 @@ const CONST = {
             "unit": "km"
         },
         "FJD": {
-            "rate": 265.25,
+            "rate": 264,
             "unit": "km"
         },
         "FKP": {
-            "rate": 86.44,
+            "rate": 90,
             "unit": "km"
         },
         "GBP": {
@@ -6191,55 +6144,55 @@ const CONST = {
             "unit": "mi"
         },
         "GEL": {
-            "rate": 313.87,
+            "rate": 323,
             "unit": "km"
         },
         "GHS": {
-            "rate": 1246.23,
+            "rate": 1724,
             "unit": "km"
         },
         "GIP": {
-            "rate": 86.44,
+            "rate": 90,
             "unit": "km"
         },
         "GMD": {
-            "rate": 8575.79,
+            "rate": 8111,
             "unit": "km"
         },
         "GNF": {
-            "rate": 1019841.61,
+            "rate": 974619,
             "unit": "km"
         },
         "GTQ": {
-            "rate": 893.94,
+            "rate": 872,
             "unit": "km"
         },
         "GYD": {
-            "rate": 24400.12,
+            "rate": 23585,
             "unit": "km"
         },
         "HKD": {
-            "rate": 908.6,
+            "rate": 877,
             "unit": "km"
         },
         "HNL": {
-            "rate": 3080.03,
+            "rate": 2881,
             "unit": "km"
         },
         "HRK": {
-            "rate": 752.16,
+            "rate": 814,
             "unit": "km"
         },
         "HTG": {
-            "rate": 15266.76,
+            "rate": 14734,
             "unit": "km"
         },
         "HUF": {
-            "rate": 38407.92,
+            "rate": 44127,
             "unit": "km"
         },
         "IDR": {
-            "rate": 1954232.16,
+            "rate": 1830066,
             "unit": "km"
         },
         "ILS": {
@@ -6247,147 +6200,147 @@ const CONST = {
             "unit": "km"
         },
         "INR": {
-            "rate": 10518.19,
+            "rate": 9761,
             "unit": "km"
         },
         "IQD": {
-            "rate": 152781.51,
+            "rate": 147577,
             "unit": "km"
         },
         "IRR": {
-            "rate": 4910488.26,
+            "rate": 4741290,
             "unit": "km"
         },
         "ISK": {
-            "rate": 14694.92,
+            "rate": 15772,
             "unit": "km"
         },
         "JMD": {
-            "rate": 18515.8,
+            "rate": 17738,
             "unit": "km"
         },
         "JOD": {
-            "rate": 82.72,
+            "rate": 80,
             "unit": "km"
         },
         "JPY": {
-            "rate": 18278.93,
+            "rate": 17542,
             "unit": "km"
         },
         "KES": {
-            "rate": 15058.57,
+            "rate": 14589,
             "unit": "km"
         },
         "KGS": {
-            "rate": 10202.68,
+            "rate": 9852,
             "unit": "km"
         },
         "KHR": {
-            "rate": 468558.4,
+            "rate": 453066,
             "unit": "km"
         },
         "KMF": {
-            "rate": 49237.89,
+            "rate": 53269,
             "unit": "km"
         },
         "KPW": {
-            "rate": 105009.73,
+            "rate": 101389,
             "unit": "km"
         },
         "KRW": {
-            "rate": 168722.07,
+            "rate": 162705,
             "unit": "km"
         },
         "KWD": {
-            "rate": 35.82,
+            "rate": 35,
             "unit": "km"
         },
         "KYD": {
-            "rate": 97.19,
+            "rate": 93,
             "unit": "km"
         },
         "KZT": {
-            "rate": 59441.07,
+            "rate": 58319,
             "unit": "km"
         },
         "LAK": {
-            "rate": 2520371.89,
+            "rate": 2452802,
             "unit": "km"
         },
         "LBP": {
-            "rate": 10444573.37,
+            "rate": 10093809,
             "unit": "km"
         },
         "LKR": {
-            "rate": 36161.18,
+            "rate": 33423,
             "unit": "km"
         },
         "LRD": {
-            "rate": 20916.15,
+            "rate": 22185,
             "unit": "km"
         },
         "LSL": {
-            "rate": 1909.99,
+            "rate": 2099,
             "unit": "km"
         },
         "LTL": {
-            "rate": 376.1,
+            "rate": 364,
             "unit": "km"
         },
         "LVL": {
-            "rate": 76.56,
+            "rate": 74,
             "unit": "km"
         },
         "LYD": {
-            "rate": 631.41,
+            "rate": 554,
             "unit": "km"
         },
         "MAD": {
-            "rate": 1070.73,
+            "rate": 1127,
             "unit": "km"
         },
         "MDL": {
-            "rate": 1950.82,
+            "rate": 2084,
             "unit": "km"
         },
         "MGA": {
-            "rate": 537347.25,
+            "rate": 529635,
             "unit": "km"
         },
         "MKD": {
-            "rate": 6144.12,
+            "rate": 6650,
             "unit": "km"
         },
         "MMK": {
-            "rate": 245011.43,
+            "rate": 236413,
             "unit": "km"
         },
         "MNT": {
-            "rate": 415371.81,
+            "rate": 382799,
             "unit": "km"
         },
         "MOP": {
-            "rate": 935.53,
+            "rate": 904,
             "unit": "km"
         },
         "MRO": {
-            "rate": 41653.05,
+            "rate": 40234,
             "unit": "km"
         },
         "MRU": {
-            "rate": 4631.69,
+            "rate": 4506,
             "unit": "km"
         },
         "MUR": {
-            "rate": 5402.17,
+            "rate": 5226,
             "unit": "km"
         },
         "MVR": {
-            "rate": 1803.83,
+            "rate": 1735,
             "unit": "km"
         },
         "MWK": {
-            "rate": 202409.9,
+            "rate": 195485,
             "unit": "km"
         },
         "MXN": {
@@ -6395,23 +6348,23 @@ const CONST = {
             "unit": "km"
         },
         "MYR": {
-            "rate": 472.6,
+            "rate": 494,
             "unit": "km"
         },
         "MZN": {
-            "rate": 7456.85,
+            "rate": 7199,
             "unit": "km"
         },
         "NAD": {
-            "rate": 1910.94,
+            "rate": 2099,
             "unit": "km"
         },
         "NGN": {
-            "rate": 166247.91,
+            "rate": 174979,
             "unit": "km"
         },
         "NIO": {
-            "rate": 4291.54,
+            "rate": 4147,
             "unit": "km"
         },
         "NOK": {
@@ -6419,35 +6372,35 @@ const CONST = {
             "unit": "km"
         },
         "NPR": {
-            "rate": 16827.52,
+            "rate": 15617,
             "unit": "km"
         },
         "NZD": {
-            "rate": 117,
+            "rate": 104,
             "unit": "km"
         },
         "OMR": {
-            "rate": 44.87,
+            "rate": 43,
             "unit": "km"
         },
         "PAB": {
-            "rate": 116.68,
+            "rate": 113,
             "unit": "km"
         },
         "PEN": {
-            "rate": 392.29,
+            "rate": 420,
             "unit": "km"
         },
         "PGK": {
-            "rate": 501.36,
+            "rate": 455,
             "unit": "km"
         },
         "PHP": {
-            "rate": 6917.8,
+            "rate": 6582,
             "unit": "km"
         },
         "PKR": {
-            "rate": 32652.84,
+            "rate": 31411,
             "unit": "km"
         },
         "PLN": {
@@ -6455,43 +6408,43 @@ const CONST = {
             "unit": "km"
         },
         "PYG": {
-            "rate": 787561.7,
+            "rate": 890772,
             "unit": "km"
         },
         "QAR": {
-            "rate": 424.92,
+            "rate": 410,
             "unit": "km"
         },
         "RON": {
-            "rate": 508.07,
+            "rate": 538,
             "unit": "km"
         },
         "RSD": {
-            "rate": 11713.4,
+            "rate": 12656,
             "unit": "km"
         },
         "RUB": {
-            "rate": 9392.54,
+            "rate": 11182,
             "unit": "km"
         },
         "RWF": {
-            "rate": 169805.16,
+            "rate": 156589,
             "unit": "km"
         },
         "SAR": {
-            "rate": 437.58,
+            "rate": 423,
             "unit": "km"
         },
         "SBD": {
-            "rate": 948.61,
+            "rate": 951,
             "unit": "km"
         },
         "SCR": {
-            "rate": 1615.27,
+            "rate": 1611,
             "unit": "km"
         },
         "SDG": {
-            "rate": 70123.16,
+            "rate": 67705,
             "unit": "km"
         },
         "SEK": {
@@ -6499,167 +6452,159 @@ const CONST = {
             "unit": "km"
         },
         "SGD": {
-            "rate": 149.43,
+            "rate": 151,
             "unit": "km"
         },
         "SHP": {
-            "rate": 86.44,
+            "rate": 90,
             "unit": "km"
         },
         "SLL": {
-            "rate": 2446668.74,
+            "rate": 2362357,
             "unit": "km"
         },
         "SLE": {
-            "rate": 2800.26,
+            "rate": 2363,
             "unit": "km"
         },
         "SOS": {
-            "rate": 66591.46,
+            "rate": 64374,
             "unit": "km"
         },
         "SRD": {
-            "rate": 4468.75,
+            "rate": 3954,
             "unit": "km"
         },
         "STD": {
-            "rate": 2599784.99,
+            "rate": 2510095,
             "unit": "km"
         },
         "STN": {
-            "rate": 2440.86,
+            "rate": 2683,
             "unit": "km"
         },
         "SVC": {
-            "rate": 1020.49,
+            "rate": 987,
             "unit": "km"
         },
         "SYP": {
-            "rate": 1517040.54,
+            "rate": 1464664,
             "unit": "km"
         },
         "SZL": {
-            "rate": 1910.2,
+            "rate": 2099,
             "unit": "km"
         },
         "THB": {
-            "rate": 3641.51,
+            "rate": 3801,
             "unit": "km"
         },
         "TJS": {
-            "rate": 1077.65,
+            "rate": 1228,
             "unit": "km"
         },
         "TMT": {
-            "rate": 408.37,
+            "rate": 394,
             "unit": "km"
         },
         "TND": {
-            "rate": 336.58,
+            "rate": 360,
             "unit": "km"
         },
         "TOP": {
-            "rate": 280.93,
+            "rate": 274,
             "unit": "km"
         },
         "TRY": {
-            "rate": 5022.36,
+            "rate": 4035,
             "unit": "km"
         },
         "TTD": {
-            "rate": 791.64,
+            "rate": 763,
             "unit": "km"
         },
         "TWD": {
-            "rate": 3676.16,
+            "rate": 3703,
             "unit": "km"
         },
         "TZS": {
-            "rate": 288716.35,
+            "rate": 286235,
             "unit": "km"
         },
         "UAH": {
-            "rate": 4966.74,
+            "rate": 4725,
             "unit": "km"
         },
         "UGX": {
-            "rate": 422422.35,
+            "rate": 416016,
             "unit": "km"
         },
         "USD": {
-            "rate": 72.5,
+            "rate": 70,
             "unit": "mi"
         },
         "UYU": {
-            "rate": 4544.27,
+            "rate": 4888,
             "unit": "km"
         },
         "UZS": {
-            "rate": 1395513.79,
+            "rate": 1462038,
             "unit": "km"
         },
         "VEB": {
-            "rate": 735113.61,
+            "rate": 709737,
             "unit": "km"
         },
         "VEF": {
-            "rate": 28992910.93,
+            "rate": 27993155,
             "unit": "km"
         },
         "VES": {
-            "rate": 35909.77,
+            "rate": 6457,
             "unit": "km"
         },
         "VND": {
-            "rate": 3065619.41,
+            "rate": 2825526,
             "unit": "km"
         },
         "VUV": {
-            "rate": 14152.58,
+            "rate": 13358,
             "unit": "km"
         },
         "WST": {
-            "rate": 322.95,
+            "rate": 315,
             "unit": "km"
         },
         "XAF": {
-            "rate": 65490.66,
+            "rate": 70811,
             "unit": "km"
         },
         "XCD": {
-            "rate": 315.32,
-            "unit": "km"
-        },
-        "XCG": {
-            "rate": 210.2,
+            "rate": 304,
             "unit": "km"
         },
         "XOF": {
-            "rate": 65490.66,
+            "rate": 70811,
             "unit": "km"
         },
         "XPF": {
-            "rate": 11913.98,
+            "rate": 12875,
             "unit": "km"
         },
         "YER": {
-            "rate": 27815.91,
+            "rate": 28003,
             "unit": "km"
         },
         "ZAR": {
-            "rate": 476,
+            "rate": 484,
             "unit": "km"
         },
         "ZMK": {
-            "rate": 612915.63,
+            "rate": 591756,
             "unit": "km"
         },
         "ZMW": {
-            "rate": 2440.41,
-            "unit": "km"
-        },
-        "ZWG": {
-            "rate": 3023.59,
+            "rate": 3148,
             "unit": "km"
         }
     }`) as Record<string, MileageRate>,
@@ -7017,6 +6962,7 @@ const CONST = {
             BANK_ACCOUNT: 'bankAccount',
             REPORT_ID: 'reportID',
             BASE_62_REPORT_ID: 'base62ReportID',
+            TAX: 'tax',
             EXPORTED_TO: 'exportedto',
             EXCHANGE_RATE: 'exchangeRate',
             REIMBURSABLE_TOTAL: 'reimbursableTotal',
@@ -7161,54 +7107,6 @@ const CONST = {
             return {
                 [this.TRANSACTION_TYPE.PER_DIEM]: 'per-diem',
                 [this.STATUS.EXPENSE.DRAFTS]: 'draft',
-                [this.TABLE_COLUMNS.RECEIPT]: 'receipt',
-                [this.TABLE_COLUMNS.DATE]: 'date',
-                [this.TABLE_COLUMNS.SUBMITTED]: 'submitted',
-                [this.TABLE_COLUMNS.APPROVED]: 'approved',
-                [this.TABLE_COLUMNS.POSTED]: 'posted',
-                [this.TABLE_COLUMNS.EXPORTED]: 'exported',
-                [this.TABLE_COLUMNS.MERCHANT]: 'merchant',
-                [this.TABLE_COLUMNS.DESCRIPTION]: 'description',
-                [this.TABLE_COLUMNS.FROM]: 'from',
-                [this.TABLE_COLUMNS.TO]: 'to',
-                [this.TABLE_COLUMNS.CATEGORY]: 'category',
-                [this.TABLE_COLUMNS.TAG]: 'tag',
-                [this.TABLE_COLUMNS.ORIGINAL_AMOUNT]: 'original-amount',
-                [this.TABLE_COLUMNS.REIMBURSABLE]: 'reimbursable',
-                [this.TABLE_COLUMNS.BILLABLE]: 'billable',
-                [this.TABLE_COLUMNS.TAX_RATE]: 'tax-rate',
-                [this.TABLE_COLUMNS.TOTAL_AMOUNT]: 'amount',
-                [this.TABLE_COLUMNS.TOTAL]: 'total',
-                [this.TABLE_COLUMNS.TYPE]: 'type',
-                [this.TABLE_COLUMNS.ACTION]: 'action',
-                [this.TABLE_COLUMNS.TAX_AMOUNT]: 'tax',
-                [this.TABLE_COLUMNS.TITLE]: 'title',
-                [this.TABLE_COLUMNS.ASSIGNEE]: 'assignee',
-                [this.TABLE_COLUMNS.IN]: 'in',
-                [this.TABLE_COLUMNS.COMMENTS]: 'comments',
-                [this.TABLE_COLUMNS.CARD]: 'card',
-                [this.TABLE_COLUMNS.POLICY_NAME]: 'policy-name',
-                [this.TABLE_COLUMNS.WITHDRAWAL_ID]: 'withdrawal-id',
-                [this.TABLE_COLUMNS.AVATAR]: 'avatar',
-                [this.TABLE_COLUMNS.STATUS]: 'status',
-                [this.TABLE_COLUMNS.EXPENSES]: 'expenses',
-                [this.TABLE_COLUMNS.FEED]: 'feed',
-                [this.TABLE_COLUMNS.WITHDRAWN]: 'withdrawn',
-                [this.TABLE_COLUMNS.BANK_ACCOUNT]: 'bank-account',
-                [this.TABLE_COLUMNS.REPORT_ID]: 'long-report-id',
-                [this.TABLE_COLUMNS.BASE_62_REPORT_ID]: 'report-id',
-                [this.TABLE_COLUMNS.EXPORTED_TO]: 'exported-to',
-                [this.TABLE_COLUMNS.EXCHANGE_RATE]: 'exchange-rate',
-                [this.TABLE_COLUMNS.REIMBURSABLE_TOTAL]: 'reimbursable-total',
-                [this.TABLE_COLUMNS.NON_REIMBURSABLE_TOTAL]: 'non-reimbursable-total',
-                [this.TABLE_COLUMNS.GROUP_FROM]: 'group-from',
-                [this.TABLE_COLUMNS.GROUP_EXPENSES]: 'group-expenses',
-                [this.TABLE_COLUMNS.GROUP_TOTAL]: 'group-total',
-                [this.TABLE_COLUMNS.GROUP_CARD]: 'group-card',
-                [this.TABLE_COLUMNS.GROUP_FEED]: 'group-feed',
-                [this.TABLE_COLUMNS.GROUP_BANK_ACCOUNT]: 'group-bank-account',
-                [this.TABLE_COLUMNS.GROUP_WITHDRAWN]: 'group-withdrawn',
-                [this.TABLE_COLUMNS.GROUP_WITHDRAWAL_ID]: 'group-withdrawal-id',
             };
         },
         NOT_MODIFIER: 'Not',
@@ -7776,11 +7674,6 @@ const CONST = {
             REFUND: 'REFUND',
             EXCHANGE: 'EXCHANGE',
         },
-        /**
-         * The Travel Invoicing feed type constant.
-         * This feed is used for Travel Invoicing cards which are separate from regular Expensify Cards.
-         */
-        PROGRAM_TRAVEL_US: 'TRAVEL_US',
     },
     LAST_PAYMENT_METHOD: {
         LAST_USED: 'lastUsed',
@@ -7847,15 +7740,6 @@ const CONST = {
         INVERTED: 'inverted',
     },
 
-    VIOLATION_DISMISSAL: {
-        rter: {
-            manual: 'marked this receipt as cash',
-        },
-        duplicatedTransaction: {
-            manual: 'resolved the duplicate',
-        },
-    },
-
     SENTRY_LABEL: {
         NAVIGATION_TAB_BAR: {
             EXPENSIFY_LOGO: 'NavigationTabBar-ExpensifyLogo',
diff --git a/src/Expensify.tsx b/src/Expensify.tsx
index 345fc8e6f018..4c995bab6dbc 100644
--- a/src/Expensify.tsx
+++ b/src/Expensify.tsx
@@ -7,7 +7,6 @@ import {AppState, Linking, Platform} from 'react-native';
 import type {OnyxEntry} from 'react-native-onyx';
 import Onyx from 'react-native-onyx';
 import ConfirmModal from './components/ConfirmModal';
-import DelegateNoAccessModalProvider from './components/DelegateNoAccessModalProvider';
 import EmojiPicker from './components/EmojiPicker/EmojiPicker';
 import GrowlNotification from './components/GrowlNotification';
 import {InitialURLContext} from './components/InitialURLContextProvider';
@@ -363,9 +362,7 @@ function Expensify() {
             {shouldInit && (
                 <>
                     <GrowlNotification ref={growlRef} />
-                    <DelegateNoAccessModalProvider>
-                        <PopoverReportActionContextMenu ref={ReportActionContextMenu.contextMenuRef} />
-                    </DelegateNoAccessModalProvider>
+                    <PopoverReportActionContextMenu ref={ReportActionContextMenu.contextMenuRef} />
                     <EmojiPicker ref={EmojiPickerAction.emojiPickerRef} />
                     {/* We include the modal for showing a new update at the top level so the option is always present. */}
                     {updateAvailable && !updateRequired ? <UpdateAppModal /> : null}
diff --git a/src/ONYXKEYS.ts b/src/ONYXKEYS.ts
index 3205cb49523a..47dbc171a2b7 100755
--- a/src/ONYXKEYS.ts
+++ b/src/ONYXKEYS.ts
@@ -949,8 +949,6 @@ const ONYXKEYS = {
         TEXT_PICKER_MODAL_FORM_DRAFT: 'textPickerModalFormDraft',
         REPORTS_DEFAULT_TITLE_MODAL_FORM: 'ReportsDefaultTitleModalForm',
         REPORTS_DEFAULT_TITLE_MODAL_FORM_DRAFT: 'ReportsDefaultTitleModalFormDraft',
-        RESET_DOMAIN_FORM: 'resetDomainForm',
-        RESET_DOMAIN_FORM_DRAFT: 'resetDomainFormDraft',
         RULES_AUTO_APPROVE_REPORTS_UNDER_MODAL_FORM: 'rulesAutoApproveReportsUnderModalForm',
         RULES_AUTO_APPROVE_REPORTS_UNDER_MODAL_FORM_DRAFT: 'rulesAutoApproveReportsUnderModalFormDraft',
         RULES_RANDOM_REPORT_AUDIT_MODAL_FORM: 'rulesRandomReportAuditModalForm',
@@ -979,14 +977,11 @@ const ONYXKEYS = {
         CREATE_DOMAIN_FORM_DRAFT: 'createDomainFormDraft',
         SPLIT_EXPENSE_EDIT_DATES: 'splitExpenseEditDates',
         SPLIT_EXPENSE_EDIT_DATES_DRAFT: 'splitExpenseEditDatesDraft',
-        EXPENSE_RULE_FORM: 'expenseRuleForm',
-        EXPENSE_RULE_FORM_DRAFT: 'expenseRuleFormDraft',
     },
     DERIVED: {
         REPORT_ATTRIBUTES: 'reportAttributes',
         REPORT_TRANSACTIONS_AND_VIOLATIONS: 'reportTransactionsAndViolations',
         OUTSTANDING_REPORTS_BY_POLICY_ID: 'outstandingReportsByPolicyID',
-        VISIBLE_REPORT_ACTIONS: 'visibleReportActions',
     },
 
     /** Stores HybridApp specific state required to interoperate with OldDot */
@@ -1048,7 +1043,6 @@ type OnyxFormValuesMapping = {
     [ONYXKEYS.FORMS.REPORT_VIRTUAL_CARD_FRAUD]: FormTypes.ReportVirtualCardFraudForm;
     [ONYXKEYS.FORMS.REPORT_PHYSICAL_CARD_FORM]: FormTypes.ReportPhysicalCardForm;
     [ONYXKEYS.FORMS.REPORT_FIELDS_EDIT_FORM]: FormTypes.ReportFieldsEditForm;
-    [ONYXKEYS.FORMS.RESET_DOMAIN_FORM]: FormTypes.ResetDomainForm;
     [ONYXKEYS.FORMS.REIMBURSEMENT_ACCOUNT_FORM]: FormTypes.ReimbursementAccountForm;
     [ONYXKEYS.FORMS.ENTER_SINGER_INFO_FORM]: FormTypes.EnterSignerInfoForm;
     [ONYXKEYS.FORMS.PERSONAL_BANK_ACCOUNT_FORM]: FormTypes.PersonalBankAccountForm;
@@ -1099,7 +1093,6 @@ type OnyxFormValuesMapping = {
     [ONYXKEYS.FORMS.ENABLE_GLOBAL_REIMBURSEMENTS]: FormTypes.EnableGlobalReimbursementsForm;
     [ONYXKEYS.FORMS.CREATE_DOMAIN_FORM]: FormTypes.CreateDomainForm;
     [ONYXKEYS.FORMS.SPLIT_EXPENSE_EDIT_DATES]: FormTypes.SplitExpenseEditDateForm;
-    [ONYXKEYS.FORMS.EXPENSE_RULE_FORM]: FormTypes.ExpenseRuleForm;
 };
 
 type OnyxFormDraftValuesMapping = {
@@ -1395,7 +1388,6 @@ type OnyxDerivedValuesMapping = {
     [ONYXKEYS.DERIVED.REPORT_ATTRIBUTES]: OnyxTypes.ReportAttributesDerivedValue;
     [ONYXKEYS.DERIVED.REPORT_TRANSACTIONS_AND_VIOLATIONS]: OnyxTypes.ReportTransactionsAndViolationsDerivedValue;
     [ONYXKEYS.DERIVED.OUTSTANDING_REPORTS_BY_POLICY_ID]: OnyxTypes.OutstandingReportsByPolicyIDDerivedValue;
-    [ONYXKEYS.DERIVED.VISIBLE_REPORT_ACTIONS]: OnyxTypes.VisibleReportActionsDerivedValue;
 };
 
 type OnyxValues = OnyxValuesMapping & OnyxCollectionValuesMapping & OnyxFormValuesMapping & OnyxFormDraftValuesMapping & OnyxDerivedValuesMapping;
diff --git a/src/ROUTES.ts b/src/ROUTES.ts
index 50d6749e940f..16c126be5dfe 100644
--- a/src/ROUTES.ts
+++ b/src/ROUTES.ts
@@ -13,7 +13,6 @@ import type {IOURequestType} from './libs/actions/IOU';
 import Log from './libs/Log';
 import type {RootNavigatorParamList} from './libs/Navigation/types';
 import type {ReimbursementAccountStepToOpen} from './libs/ReimbursementAccountUtils';
-import StringUtils from './libs/StringUtils';
 import {getUrlWithParams} from './libs/Url';
 import SCREENS from './SCREENS';
 import type {Screen} from './SCREENS';
@@ -52,11 +51,6 @@ const PUBLIC_SCREENS_ROUTES = {
 // Exported for identifying a url as a verify-account route, associated with a page extending the VerifyAccountPageBase component
 const VERIFY_ACCOUNT = 'verify-account';
 
-const MULTIFACTOR_AUTHENTICATION_PROTECTED_ROUTES = {
-    FACTOR: 'multifactor-authentication/factor',
-    PROMPT: 'multifactor-authentication/prompt',
-} as const;
-
 const ROUTES = {
     ...PUBLIC_SCREENS_ROUTES,
     // This route renders the list of reports.
@@ -97,17 +91,6 @@ const ROUTES = {
             return getUrlWithBackToParam(baseRoute, backTo);
         },
     },
-
-    EXPENSE_REPORT_RHP: {
-        route: 'e/:reportID',
-        getRoute: ({reportID, backTo}: {reportID: string; backTo?: string}) => {
-            const baseRoute = `e/${reportID}` as const;
-
-            // eslint-disable-next-line no-restricted-syntax -- Legacy route generation
-            return getUrlWithBackToParam(baseRoute, backTo);
-        },
-    },
-
     SEARCH_REPORT_VERIFY_ACCOUNT: {
         route: `search/view/:reportID/${VERIFY_ACCOUNT}`,
         getRoute: (reportID: string) => `search/view/${reportID}/${VERIFY_ACCOUNT}` as const,
@@ -173,6 +156,7 @@ const ROUTES = {
     ENABLE_PAYMENTS: 'enable-payments',
     WALLET_STATEMENT_WITH_DATE: 'statements/:yearMonth',
     SIGN_IN_MODAL: 'sign-in-modal',
+    REQUIRE_TWO_FACTOR_AUTH: '2fa-required',
 
     BANK_ACCOUNT: 'bank-account',
     BANK_ACCOUNT_VERIFY_ACCOUNT: {
@@ -392,18 +376,6 @@ const ROUTES = {
         getRoute: (cardID: string) => `settings/wallet/card/${cardID}/activate` as const,
     },
     SETTINGS_RULES: 'settings/rules',
-    SETTINGS_RULES_ADD: {
-        route: 'settings/rules/new/:field?',
-        getRoute: (field?: ValueOf<typeof CONST.EXPENSE_RULES.FIELDS>) => {
-            return `settings/rules/new/${field ? StringUtils.camelToHyphenCase(field) : ''}` as const;
-        },
-    },
-    SETTINGS_RULES_EDIT: {
-        route: 'settings/rules/edit/:hash/:field?',
-        getRoute: (hash?: string, field?: ValueOf<typeof CONST.EXPENSE_RULES.FIELDS>) => {
-            return `settings/rules/edit/${hash ?? ':hash'}/${field ? StringUtils.camelToHyphenCase(field) : ''}` as const;
-        },
-    },
     SETTINGS_LEGAL_NAME: 'settings/profile/legal-name',
     SETTINGS_DATE_OF_BIRTH: 'settings/profile/date-of-birth',
     SETTINGS_PHONE_NUMBER: 'settings/profile/phone',
@@ -621,10 +593,6 @@ const ROUTES = {
         route: `r/:reportID/${VERIFY_ACCOUNT}`,
         getRoute: (reportID: string) => `r/${reportID}/${VERIFY_ACCOUNT}` as const,
     },
-    EXPENSE_REPORT_VERIFY_ACCOUNT: {
-        route: `e/:reportID/${VERIFY_ACCOUNT}`,
-        getRoute: (reportID: string) => `e/${reportID}/${VERIFY_ACCOUNT}` as const,
-    },
     REPORT_PARTICIPANTS: {
         route: 'r/:reportID/participants',
 
@@ -1213,12 +1181,13 @@ const ROUTES = {
     },
     MONEY_REQUEST_STEP_DISTANCE_ODOMETER: {
         route: ':action/:iouType/distance-odometer/:transactionID/:reportID',
-        getRoute: (action: IOUAction, iouType: IOUType, transactionID: string | undefined, reportID: string | undefined) => {
+        getRoute: (action: IOUAction, iouType: IOUType, transactionID: string | undefined, reportID: string | undefined, backTo = '') => {
             if (!transactionID || !reportID) {
                 Log.warn('Invalid transactionID or reportID is used to build the MONEY_REQUEST_STEP_DISTANCE_ODOMETER route');
             }
 
-            return `${action as string}/${iouType as string}/distance-odometer/${transactionID}/${reportID}` as const;
+            // eslint-disable-next-line no-restricted-syntax -- Legacy route generation
+            return getUrlWithBackToParam(`${action as string}/${iouType as string}/distance-odometer/${transactionID}/${reportID}`, backTo);
         },
     },
     MONEY_REQUEST_STEP_DISTANCE_RATE: {
@@ -1325,16 +1294,6 @@ const ROUTES = {
                 label ? `${backTo || state ? '&' : '?'}label=${encodeURIComponent(label)}` : ''
             }` as const,
     },
-    MONEY_REQUEST_STEP_TIME_RATE: {
-        route: ':action/:iouType/rate/:transactionID/:reportID/:reportActionID?',
-        getRoute: (action: IOUAction, iouType: IOUType, transactionID: string, reportID: string, reportActionID?: string) =>
-            `${action as string}/${iouType as string}/rate/${transactionID}/${reportID}${reportActionID ? `/${reportActionID}` : ''}` as const,
-    },
-    MONEY_REQUEST_STEP_HOURS: {
-        route: ':action/:iouType/hours/:transactionID/:reportID/:reportActionID?',
-        getRoute: (action: IOUAction, iouType: IOUType, transactionID: string | undefined, reportID: string | undefined, reportActionID?: string) =>
-            `${action as string}/${iouType as string}/hours/${transactionID}/${reportID}${reportActionID ? `/${reportActionID}` : ''}` as const,
-    },
     DISTANCE_REQUEST_CREATE: {
         route: ':action/:iouType/start/:transactionID/:reportID/distance-new/:backToReport?',
         getRoute: (action: IOUAction, iouType: IOUType, transactionID: string, reportID: string, backToReport?: string) =>
@@ -2049,10 +2008,6 @@ const ROUTES = {
         route: 'workspaces/:policyID/category/:categoryName/require-receipts-over',
         getRoute: (policyID: string, categoryName: string) => `workspaces/${policyID}/category/${encodeURIComponent(categoryName)}/require-receipts-over` as const,
     },
-    WORKSPACE_CATEGORY_REQUIRED_FIELDS: {
-        route: 'workspaces/:policyID/category/:categoryName/required-fields',
-        getRoute: (policyID: string, categoryName: string) => `workspaces/${policyID}/category/${encodeURIComponent(categoryName)}/required-fields` as const,
-    },
     WORKSPACE_CATEGORY_APPROVER: {
         route: 'workspaces/:policyID/category/:categoryName/approver',
         getRoute: (policyID: string, categoryName: string) => `workspaces/${policyID}/category/${encodeURIComponent(categoryName)}/approver` as const,
@@ -3698,27 +3653,6 @@ const ROUTES = {
         route: 'domain/:domainAccountID/members/:accountID',
         getRoute: (domainAccountID: number, accountID: number) => `domain/${domainAccountID}/members/${accountID}` as const,
     },
-    DOMAIN_RESET_DOMAIN: {
-        route: 'domain/:domainAccountID/admins/:accountID/reset-domain',
-        getRoute: (domainAccountID: number, accountID: number) => `domain/${domainAccountID}/admins/${accountID}/reset-domain` as const,
-    },
-
-    MULTIFACTOR_AUTHENTICATION_MAGIC_CODE: `${MULTIFACTOR_AUTHENTICATION_PROTECTED_ROUTES.FACTOR}/magic-code`,
-    MULTIFACTOR_AUTHENTICATION_BIOMETRICS_TEST: 'multifactor-authentication/scenario/biometrics-test',
-
-    // The exact notification & prompt type will be added as a part of Multifactor Authentication config in another PR,
-    // for now a string is accepted to avoid blocking this PR.
-    MULTIFACTOR_AUTHENTICATION_NOTIFICATION: {
-        route: 'multifactor-authentication/notification/:notificationType',
-        getRoute: (notificationType: ValueOf<typeof CONST.MULTIFACTOR_AUTHENTICATION_NOTIFICATION_TYPE>) => `multifactor-authentication/notification/${notificationType}` as const,
-    },
-
-    MULTIFACTOR_AUTHENTICATION_PROMPT: {
-        route: `${MULTIFACTOR_AUTHENTICATION_PROTECTED_ROUTES.PROMPT}/:promptType`,
-        getRoute: (promptType: string) => `${MULTIFACTOR_AUTHENTICATION_PROTECTED_ROUTES.PROMPT}/${promptType}` as const,
-    },
-
-    MULTIFACTOR_AUTHENTICATION_NOT_FOUND: 'multifactor-authentication/not-found',
 } as const;
 
 /**
@@ -3734,7 +3668,7 @@ const SHARED_ROUTE_PARAMS: Partial<Record<Screen, string[]>> = {
     [SCREENS.WORKSPACE.INITIAL]: ['backTo'],
 } as const;
 
-export {PUBLIC_SCREENS_ROUTES, SHARED_ROUTE_PARAMS, VERIFY_ACCOUNT, MULTIFACTOR_AUTHENTICATION_PROTECTED_ROUTES};
+export {PUBLIC_SCREENS_ROUTES, SHARED_ROUTE_PARAMS, VERIFY_ACCOUNT};
 export default ROUTES;
 
 type ReportAttachmentsRoute = typeof ROUTES.REPORT_ATTACHMENTS.route;
diff --git a/src/SCREENS.ts b/src/SCREENS.ts
index 739c5ac47279..989a9ae3fe92 100644
--- a/src/SCREENS.ts
+++ b/src/SCREENS.ts
@@ -150,26 +150,6 @@ const SCREENS = {
 
         RULES: {
             ROOT: 'Settings_Rules',
-            ADD: 'Settings_Rules_Add',
-            ADD_MERCHANT: 'Settings_Rules_Add_Merchant',
-            ADD_RENAME_MERCHANT: 'Settings_Rules_Add_Rename_Merchant',
-            ADD_CATEGORY: 'Settings_Rules_Add_Category',
-            ADD_TAG: 'Settings_Rules_Add_Tag',
-            ADD_TAX: 'Settings_Rules_Add_Tax',
-            ADD_DESCRIPTION: 'Settings_Rules_Add_Description',
-            ADD_REIMBURSABLE: 'Settings_Rules_Add_Reimbursable',
-            ADD_BILLABLE: 'Settings_Rules_Add_Billable',
-            ADD_REPORT: 'Settings_Rules_Add_Report',
-            EDIT: 'Settings_Rules_Edit',
-            EDIT_MERCHANT: 'Settings_Rules_Edit_Merchant',
-            EDIT_RENAME_MERCHANT: 'Settings_Rules_Edit_Rename_Merchant',
-            EDIT_CATEGORY: 'Settings_Rules_Edit_Category',
-            EDIT_TAG: 'Settings_Rules_Edit_Tag',
-            EDIT_TAX: 'Settings_Rules_Edit_Tax',
-            EDIT_DESCRIPTION: 'Settings_Rules_Edit_Description',
-            EDIT_REIMBURSABLE: 'Settings_Rules_Edit_Reimbursable',
-            EDIT_BILLABLE: 'Settings_Rules_Edit_Billable',
-            EDIT_REPORT: 'Settings_Rules_Edit_Report',
         },
 
         WALLET: {
@@ -275,6 +255,8 @@ const SCREENS = {
         TRAVEL: 'Travel',
         SEARCH_REPORT: 'SearchReport',
         SEARCH_REPORT_ACTIONS: 'SearchReportActions',
+        // These two routes will be added in a separate PR adding Super Wide RHP routes
+        EXPENSE_REPORT: 'ExpenseReport',
         SEARCH_MONEY_REQUEST_REPORT: 'SearchMoneyRequestReport',
 
         SEARCH_COLUMNS: 'SearchColumns',
@@ -295,8 +277,6 @@ const SCREENS = {
         MERGE_TRANSACTION: 'MergeTransaction',
         REPORT_CARD_ACTIVATE: 'Report_Card_Activate',
         DOMAIN: 'Domain',
-        EXPENSE_REPORT: 'ExpenseReport',
-        MULTIFACTOR_AUTHENTICATION: 'MultifactorAuthentication',
     },
     REPORT_CARD_ACTIVATE: 'Report_Card_Activate_Root',
     PUBLIC_CONSOLE_DEBUG: 'Console_Debug',
@@ -353,8 +333,6 @@ const SCREENS = {
         STEP_DISTANCE_GPS: 'Money_Request_Step_Distance_GPS',
         STEP_DISTANCE_ODOMETER: 'Money_Request_Step_Distance_Odometer',
         RECEIPT_PREVIEW: 'Money_Request_Receipt_preview',
-        STEP_TIME_RATE: 'Money_Request_Step_Time_Rate',
-        STEP_HOURS: 'Money_Request_Step_Hours',
     },
 
     TRANSACTION_DUPLICATE: {
@@ -712,7 +690,6 @@ const SCREENS = {
         CATEGORY_DESCRIPTION_HINT: 'Category_Description_Hint',
         CATEGORY_APPROVER: 'Category_Approver',
         CATEGORY_REQUIRE_RECEIPTS_OVER: 'Category_Require_Receipts_Over',
-        CATEGORY_REQUIRED_FIELDS: 'Category_Required_Fields',
         CATEGORIES_SETTINGS: 'Categories_Settings',
         CATEGORIES_IMPORT: 'Categories_Import',
         CATEGORIES_IMPORTED: 'Categories_Imported',
@@ -849,7 +826,6 @@ const SCREENS = {
     REIMBURSEMENT_ACCOUNT_ENTER_SIGNER_INFO: 'Reimbursement_Account_Signer_Info',
     REFERRAL_DETAILS: 'Referral_Details',
     REPORT_VERIFY_ACCOUNT: 'Report_Verify_Account',
-    EXPENSE_REPORT_VERIFY_ACCOUNT: 'Expense_Report_Verify_Account',
     KEYBOARD_SHORTCUTS: 'KeyboardShortcuts',
     SHARE: {
         ROOT: 'Share_Root',
@@ -902,14 +878,6 @@ const SCREENS = {
         ADD_ADMIN: 'Domain_Add_Admin',
         MEMBERS: 'Domain_Members',
         MEMBER_DETAILS: 'Member_Details',
-        RESET_DOMAIN: 'Domain_Reset',
-    },
-    MULTIFACTOR_AUTHENTICATION: {
-        MAGIC_CODE: 'Multifactor_Authentication_Magic_Code',
-        BIOMETRICS_TEST: 'Multifactor_Authentication_Biometrics_Test',
-        NOTIFICATION: 'Multifactor_Authentication_Notification',
-        PROMPT: 'Multifactor_Authentication_Prompt',
-        NOT_FOUND: 'Multifactor_Authentication_Not_Found',
     },
 } as const;
 
diff --git a/src/components/AccountSwitcher.tsx b/src/components/AccountSwitcher.tsx
index b347b69ebb96..20598751629d 100644
--- a/src/components/AccountSwitcher.tsx
+++ b/src/components/AccountSwitcher.tsx
@@ -185,7 +185,7 @@ function AccountSwitcher({isScreenFocused}: AccountSwitcherProps) {
             <TooltipToRender {...tooltipProps}>
                 <PressableWithFeedback
                     accessible
-                    accessibilityLabel={`${translate('common.profile')}, ${displayName}, ${Str.removeSMSDomain(currentUserPersonalDetails?.login ?? '')}`}
+                    accessibilityLabel={translate('common.profile')}
                     onPress={onPressSwitcher}
                     ref={buttonRef}
                     interactive={canSwitchAccounts}
diff --git a/src/components/ActivityIndicator.tsx b/src/components/ActivityIndicator.tsx
index 68d364bd0336..0dd3817dfc0c 100644
--- a/src/components/ActivityIndicator.tsx
+++ b/src/components/ActivityIndicator.tsx
@@ -5,7 +5,6 @@ import {ActivityIndicator as RNActivityIndicator} from 'react-native';
 import useTheme from '@hooks/useTheme';
 import logAppStateOnLongLoading from '@libs/AppState';
 import type {ExtraLoadingContext} from '@libs/AppState';
-import useSkeletonSpan from '@libs/telemetry/useSkeletonSpan';
 import CONST from '@src/CONST';
 
 type ActivityIndicatorProps = RNActivityIndicatorProps & {
@@ -21,7 +20,6 @@ type ActivityIndicatorProps = RNActivityIndicatorProps & {
 
 function ActivityIndicator({timeout = CONST.TIMING.ACTIVITY_INDICATOR_TIMEOUT, extraLoadingContext, ...rest}: ActivityIndicatorProps) {
     const theme = useTheme();
-    useSkeletonSpan('ActivityIndicator');
 
     useEffect(() => {
         const timeoutId = setTimeout(() => {
diff --git a/src/components/AddUnreportedExpenseFooter.tsx b/src/components/AddUnreportedExpenseFooter.tsx
index 53c506524f96..58defd361630 100644
--- a/src/components/AddUnreportedExpenseFooter.tsx
+++ b/src/components/AddUnreportedExpenseFooter.tsx
@@ -51,7 +51,7 @@ function AddUnreportedExpenseFooter({selectedIds, report, reportToConfirm, repor
             setErrorMessage(translate('iou.selectUnreportedExpense'));
             return;
         }
-        Navigation.dismissToSuperWideRHP();
+        Navigation.dismissModal();
         // eslint-disable-next-line @typescript-eslint/no-deprecated
         InteractionManager.runAfterInteractions(() => {
             if (report && isIOUReport(report)) {
@@ -75,7 +75,7 @@ function AddUnreportedExpenseFooter({selectedIds, report, reportToConfirm, repor
                     policy,
                     reportNextStep,
                     policyCategories,
-                    allTransactions,
+                    allTransactionsCollection: allTransactions,
                 });
             }
         });
diff --git a/src/components/AddressForm.tsx b/src/components/AddressForm.tsx
index 62b3fe7b724e..181190035104 100644
--- a/src/components/AddressForm.tsx
+++ b/src/components/AddressForm.tsx
@@ -134,7 +134,7 @@ function AddressForm({
             if (countrySpecificZipRegex) {
                 if (!countrySpecificZipRegex.test(values.zipPostCode?.trim().toUpperCase())) {
                     if (isRequiredFulfilled(values.zipPostCode?.trim())) {
-                        errors.zipPostCode = translate('privatePersonalDetails.error.incorrectZipFormat', countryZipFormat);
+                        errors.zipPostCode = translate('privatePersonalDetails.error.incorrectZipFormat', {zipFormat: countryZipFormat});
                     } else {
                         errors.zipPostCode = translate('common.error.fieldRequired');
                     }
diff --git a/src/components/AmountTextInput.tsx b/src/components/AmountTextInput.tsx
index d9c44dc223ce..58a9d0fcd551 100644
--- a/src/components/AmountTextInput.tsx
+++ b/src/components/AmountTextInput.tsx
@@ -1,7 +1,6 @@
 import {useNavigation} from '@react-navigation/native';
 import React from 'react';
 import type {NativeSyntheticEvent, StyleProp, TextInputKeyPressEvent, TextInputSelectionChangeEvent, TextStyle, ViewStyle} from 'react-native';
-import useLocalize from '@hooks/useLocalize';
 import CONST from '@src/CONST';
 import type {TextSelection} from './Composer/types';
 import TextInput from './TextInput';
@@ -43,7 +42,7 @@ type AmountTextInputProps = {
 
     /** Hide the focus styles on TextInput */
     hideFocusedState?: boolean;
-} & Pick<BaseTextInputProps, 'autoFocus' | 'autoGrowExtraSpace' | 'submitBehavior' | 'ref' | 'onFocus' | 'onBlur' | 'disabled' | 'accessibilityLabel'>;
+} & Pick<BaseTextInputProps, 'autoFocus' | 'autoGrowExtraSpace' | 'submitBehavior' | 'ref' | 'onFocus' | 'onBlur' | 'disabled'>;
 
 function AmountTextInput({
     formattedAmount,
@@ -60,11 +59,9 @@ function AmountTextInput({
     shouldApplyPaddingToContainer = false,
     ref,
     disabled,
-    accessibilityLabel,
     ...rest
 }: AmountTextInputProps) {
     const navigation = useNavigation();
-    const {translate} = useLocalize();
 
     return (
         <TextInput
@@ -86,7 +83,7 @@ function AmountTextInput({
             submitBehavior="submit"
             selection={selection}
             onSelectionChange={onSelectionChange}
-            accessibilityLabel={accessibilityLabel ?? translate('iou.amount')}
+            role={CONST.ROLE.PRESENTATION}
             onKeyPress={onKeyPress as (event: TextInputKeyPressEvent) => void}
             touchableInputWrapperStyle={touchableInputWrapperStyle}
             // On iPad, even if the soft keyboard is hidden, the keyboard suggestion is still shown.
diff --git a/src/components/AnchorForCommentsOnly/BaseAnchorForCommentsOnly.tsx b/src/components/AnchorForCommentsOnly/BaseAnchorForCommentsOnly.tsx
index 5c34ce3fee4a..4da71d03330c 100644
--- a/src/components/AnchorForCommentsOnly/BaseAnchorForCommentsOnly.tsx
+++ b/src/components/AnchorForCommentsOnly/BaseAnchorForCommentsOnly.tsx
@@ -80,7 +80,6 @@ function BaseAnchorForCommentsOnly({
             onPressIn={onPressIn}
             onPressOut={onPressOut}
             role={CONST.ROLE.LINK}
-            tabIndex={-1}
             accessibilityLabel={href}
             wrapperStyle={wrapperStyle}
         >
@@ -92,7 +91,6 @@ function BaseAnchorForCommentsOnly({
                     ref={linkRef}
                     style={StyleSheet.flatten([style, defaultTextStyle])}
                     role={CONST.ROLE.LINK}
-                    tabIndex={0}
                     hrefAttrs={{
                         rel,
                         target: isEmail || !linkProps.href ? '_self' : target,
diff --git a/src/components/ApprovalWorkflowSection.tsx b/src/components/ApprovalWorkflowSection.tsx
index 37e614853bf2..a037a6004430 100644
--- a/src/components/ApprovalWorkflowSection.tsx
+++ b/src/components/ApprovalWorkflowSection.tsx
@@ -80,8 +80,6 @@ function ApprovalWorkflowSection({approvalWorkflow, onPress, currency = CONST.CU
                     descriptionTextStyle={[styles.textNormalThemeText, styles.lineHeightXLarge]}
                     description={members}
                     numberOfLinesDescription={4}
-                    shouldBeAccessible={false}
-                    tabIndex={-1}
                     icon={icons.Users}
                     iconHeight={20}
                     iconWidth={20}
@@ -101,8 +99,6 @@ function ApprovalWorkflowSection({approvalWorkflow, onPress, currency = CONST.CU
                             descriptionTextStyle={[styles.textNormalThemeText, styles.lineHeightXLarge]}
                             description={Str.removeSMSDomain(approver.displayName)}
                             icon={icons.UserCheck}
-                            shouldBeAccessible={false}
-                            tabIndex={-1}
                             iconHeight={20}
                             iconWidth={20}
                             numberOfLinesDescription={1}
diff --git a/src/components/Attachments/AttachmentCarousel/extractAttachments.ts b/src/components/Attachments/AttachmentCarousel/extractAttachments.ts
index df0d08946c19..6dffd994d6a7 100644
--- a/src/components/Attachments/AttachmentCarousel/extractAttachments.ts
+++ b/src/components/Attachments/AttachmentCarousel/extractAttachments.ts
@@ -3,11 +3,11 @@ import type {OnyxEntry} from 'react-native-onyx';
 import type {ValueOf} from 'type-fest';
 import type {Attachment} from '@components/Attachments/types';
 import {getFileName, splitExtensionFromFileName} from '@libs/fileDownload/FileUtils';
-import {getHtmlWithAttachmentID, getReportActionHtml, getReportActionMessage, getSortedReportActions, isMoneyRequestAction, isReportActionVisible} from '@libs/ReportActionsUtils';
+import {getHtmlWithAttachmentID, getReportActionHtml, getReportActionMessage, getSortedReportActions, isMoneyRequestAction, shouldReportActionBeVisible} from '@libs/ReportActionsUtils';
 import {canUserPerformWriteAction} from '@libs/ReportUtils';
 import tryResolveUrlFromApiRoot from '@libs/tryResolveUrlFromApiRoot';
 import CONST from '@src/CONST';
-import type {Report, ReportAction, ReportActions, VisibleReportActionsDerivedValue} from '@src/types/onyx';
+import type {Report, ReportAction, ReportActions} from '@src/types/onyx';
 import type {Note} from '@src/types/onyx/Report';
 
 /**
@@ -22,7 +22,6 @@ function extractAttachments(
         reportActions,
         report,
         isReportArchived,
-        visibleReportActionsData,
     }: {
         privateNotes?: Record<number, Note>;
         accountID?: number;
@@ -30,7 +29,6 @@ function extractAttachments(
         reportActions?: OnyxEntry<ReportActions>;
         report: OnyxEntry<Report>;
         isReportArchived: boolean | undefined;
-        visibleReportActionsData?: VisibleReportActionsDerivedValue;
     },
 ) {
     const targetNote = privateNotes?.[Number(accountID)]?.note ?? '';
@@ -117,13 +115,9 @@ function extractAttachments(
         return attachments.reverse();
     }
 
-    const reportID = report?.reportID;
-    if (!reportID) {
-        return attachments.reverse();
-    }
     const actions = [...(parentReportAction ? [parentReportAction] : []), ...getSortedReportActions(Object.values(reportActions ?? {}))];
-    for (const action of actions) {
-        if (!isReportActionVisible(action, reportID, canUserPerformAction, visibleReportActionsData) || isMoneyRequestAction(action)) {
+    for (const [key, action] of actions.entries()) {
+        if (!shouldReportActionBeVisible(action, key, canUserPerformAction) || isMoneyRequestAction(action)) {
             continue;
         }
 
diff --git a/src/components/AutoCompleteSuggestions/BaseAutoCompleteSuggestions.tsx b/src/components/AutoCompleteSuggestions/BaseAutoCompleteSuggestions.tsx
index 0cd97ef55eb6..29787a820a62 100644
--- a/src/components/AutoCompleteSuggestions/BaseAutoCompleteSuggestions.tsx
+++ b/src/components/AutoCompleteSuggestions/BaseAutoCompleteSuggestions.tsx
@@ -40,7 +40,6 @@ function BaseAutoCompleteSuggestions<TSuggestion>({
                 onPress={() => onSelect(index)}
                 onLongPress={() => {}}
                 accessibilityLabel={accessibilityLabelExtractor(item, index)}
-                role={CONST.ROLE.MENUITEM}
             >
                 {renderSuggestionMenuItem(item, index)}
             </PressableWithFeedback>
diff --git a/src/components/Banner.tsx b/src/components/Banner.tsx
index b5ba853f3b98..8348d0f5323c 100644
--- a/src/components/Banner.tsx
+++ b/src/components/Banner.tsx
@@ -131,7 +131,7 @@ function Banner({
                                 <PressableWithFeedback
                                     onPress={onClose}
                                     role={CONST.ROLE.BUTTON}
-                                    accessibilityLabel={text ? `${translate('common.close')}, ${text}` : translate('common.close')}
+                                    accessibilityLabel={translate('common.close')}
                                 >
                                     <Icon
                                         src={expensifyIcons.Close}
diff --git a/src/components/BookTravelButton.tsx b/src/components/BookTravelButton.tsx
index 8ee6b42f28f0..eb664024cc97 100644
--- a/src/components/BookTravelButton.tsx
+++ b/src/components/BookTravelButton.tsx
@@ -12,7 +12,6 @@ import usePolicy from '@hooks/usePolicy';
 import useStyleUtils from '@hooks/useStyleUtils';
 import useThemeStyles from '@hooks/useThemeStyles';
 import {cleanupTravelProvisioningSession, requestTravelAccess, setTravelProvisioningNextStep} from '@libs/actions/Travel';
-import {isEmailPublicDomain} from '@libs/LoginUtils';
 import Navigation from '@libs/Navigation/Navigation';
 import {openTravelDotLink} from '@libs/openTravelDotLink';
 import {getActivePolicies, getAdminsPrivateEmailDomains, isPaidGroupPolicy} from '@libs/PolicyUtils';
@@ -97,12 +96,6 @@ function BookTravelButton({text, shouldRenderErrorMessageBelowButton = false, ac
             return;
         }
 
-        // Spotnana requires a private domain email for travel booking
-        if (isEmailPublicDomain(primaryContactMethod)) {
-            Navigation.navigate(ROUTES.TRAVEL_PUBLIC_DOMAIN_ERROR.getRoute(Navigation.getActiveRoute()));
-            return;
-        }
-
         const adminDomains = getAdminsPrivateEmailDomains(policy);
         if (adminDomains.length === 0) {
             Navigation.navigate(ROUTES.TRAVEL_PUBLIC_DOMAIN_ERROR.getRoute(Navigation.getActiveRoute()));
diff --git a/src/components/Button/utils/index.web.ts b/src/components/Button/utils/index.web.ts
index 16aee4cb19cb..3235b10e35bd 100644
--- a/src/components/Button/utils/index.web.ts
+++ b/src/components/Button/utils/index.web.ts
@@ -1,7 +1,7 @@
 import CONST from '@src/CONST';
 import type {GetButtonRole} from './types';
 
-const getButtonRole: GetButtonRole = () => CONST.ROLE.BUTTON;
+const getButtonRole: GetButtonRole = (isNested) => (isNested ? CONST.ROLE.PRESENTATION : CONST.ROLE.BUTTON);
 
 // eslint-disable-next-line import/prefer-default-export
 export {getButtonRole};
diff --git a/src/components/CardFeedIcon.tsx b/src/components/CardFeedIcon.tsx
index fc32a3745d08..cd1b9390294e 100644
--- a/src/components/CardFeedIcon.tsx
+++ b/src/components/CardFeedIcon.tsx
@@ -12,10 +12,9 @@ type CardFeedIconProps = {
     isExpensifyCardFeed?: boolean;
     selectedFeed?: CompanyCardFeedWithDomainID | undefined;
     iconProps?: Partial<IconProps>;
-    useSkeletonLoader?: boolean;
 };
 
-function CardFeedIcon({iconProps, selectedFeed, isExpensifyCardFeed = false, useSkeletonLoader = false}: CardFeedIconProps) {
+function CardFeedIcon({iconProps, selectedFeed, isExpensifyCardFeed = false}: CardFeedIconProps) {
     const {src, ...restIconProps} = iconProps ?? {};
 
     const illustrations = useThemeIllustrations();
@@ -32,7 +31,6 @@ function CardFeedIcon({iconProps, selectedFeed, isExpensifyCardFeed = false, use
         return (
             <PlaidCardFeedIcon
                 plaidUrl={getPlaidInstitutionIconUrl(selectedFeed)}
-                useSkeletonLoader={useSkeletonLoader}
                 // eslint-disable-next-line react/jsx-props-no-spreading
                 {...restIconProps}
             />
diff --git a/src/components/CaretWrapper.tsx b/src/components/CaretWrapper.tsx
index 6ccfbb6689e9..6518f6a53449 100644
--- a/src/components/CaretWrapper.tsx
+++ b/src/components/CaretWrapper.tsx
@@ -12,10 +12,9 @@ type CaretWrapperProps = ChildrenProps & {
     style?: StyleProp<ViewStyle>;
     caretWidth?: number;
     caretHeight?: number;
-    isActive?: boolean;
 };
 
-function CaretWrapper({children, style, caretWidth, caretHeight, isActive = false}: CaretWrapperProps) {
+function CaretWrapper({children, style, caretWidth, caretHeight}: CaretWrapperProps) {
     const theme = useTheme();
     const styles = useThemeStyles();
     const expensifyIcons = useMemoizedLazyExpensifyIcons(['DownArrow'] as const);
@@ -28,7 +27,6 @@ function CaretWrapper({children, style, caretWidth, caretHeight, isActive = fals
                 fill={theme.icon}
                 width={caretWidth ?? variables.iconSizeExtraSmall}
                 height={caretHeight ?? variables.iconSizeExtraSmall}
-                additionalStyles={isActive ? styles.flipUpsideDown : []}
             />
         </View>
     );
diff --git a/src/components/Checkbox.tsx b/src/components/Checkbox.tsx
index 6cc08379704f..6e05f80574c2 100644
--- a/src/components/Checkbox.tsx
+++ b/src/components/Checkbox.tsx
@@ -139,7 +139,6 @@ function Checkbox({
             pressDimmingValue={1}
             wrapperStyle={wrapperStyle}
             sentryLabel={sentryLabel}
-            shouldUseAutoHitSlop
         >
             {children ?? (
                 <View
diff --git a/src/components/CurrencyListContextProvider.tsx b/src/components/CurrencyListContextProvider.tsx
deleted file mode 100644
index 1c1c76fbd991..000000000000
--- a/src/components/CurrencyListContextProvider.tsx
+++ /dev/null
@@ -1,48 +0,0 @@
-import React, {createContext, useCallback, useMemo} from 'react';
-import useOnyx from '@hooks/useOnyx';
-import ONYXKEYS from '@src/ONYXKEYS';
-import type {CurrencyList} from '@src/types/onyx';
-import {getEmptyObject} from '@src/types/utils/EmptyObject';
-
-type CurrencyListContextProviderProps = {
-    /** Actual content wrapped by this component */
-    children: React.ReactNode;
-};
-
-type CurrencyListContextProps = {
-    /** The currency list from Onyx */
-    currencyList: CurrencyList;
-
-    /** Function to get currency symbol for a currency(ISO 4217) Code */
-    getCurrencySymbol: (currencyCode: string) => string | undefined;
-};
-
-const CurrencyListContext = createContext<CurrencyListContextProps>({
-    currencyList: getEmptyObject<CurrencyList>(),
-    getCurrencySymbol: () => undefined,
-});
-
-function CurrencyListContextProvider({children}: CurrencyListContextProviderProps) {
-    const [currencyList = getEmptyObject<CurrencyList>()] = useOnyx(ONYXKEYS.CURRENCY_LIST, {canBeMissing: true});
-
-    const getCurrencySymbol = useCallback(
-        (currencyCode: string): string | undefined => {
-            return currencyList[currencyCode]?.symbol;
-        },
-        [currencyList],
-    );
-
-    const contextValue = useMemo<CurrencyListContextProps>(
-        () => ({
-            currencyList,
-            getCurrencySymbol,
-        }),
-        [currencyList, getCurrencySymbol],
-    );
-
-    return <CurrencyListContext.Provider value={contextValue}>{children}</CurrencyListContext.Provider>;
-}
-
-export {CurrencyListContext, CurrencyListContextProvider};
-
-export type {CurrencyListContextProps};
diff --git a/src/components/CurrencyPicker.tsx b/src/components/CurrencyPicker.tsx
index 971aebf9163e..d0dcebcdc38f 100644
--- a/src/components/CurrencyPicker.tsx
+++ b/src/components/CurrencyPicker.tsx
@@ -1,8 +1,8 @@
 import type {ReactNode} from 'react';
 import React, {Fragment, useState} from 'react';
-import useCurrencyList from '@hooks/useCurrencyList';
 import useLocalize from '@hooks/useLocalize';
 import useThemeStyles from '@hooks/useThemeStyles';
+import {getCurrencySymbol} from '@libs/CurrencyUtils';
 import Navigation from '@libs/Navigation/Navigation';
 import CONST from '@src/CONST';
 import FullPageOfflineBlockingView from './BlockingViews/FullPageOfflineBlockingView';
@@ -41,7 +41,6 @@ type CurrencyPickerProps = {
 
 function CurrencyPicker({label, value, errorText, headerContent, excludeCurrencies, disabled = false, shouldShowFullPageOfflineView = false, onInputChange = () => {}}: CurrencyPickerProps) {
     const {translate} = useLocalize();
-    const {getCurrencySymbol} = useCurrencyList();
     const [isPickerVisible, setIsPickerVisible] = useState(false);
     const styles = useThemeStyles();
 
diff --git a/src/components/CurrencySelectionList/index.tsx b/src/components/CurrencySelectionList/index.tsx
index 64f05e8c6cc8..88c494253139 100644
--- a/src/components/CurrencySelectionList/index.tsx
+++ b/src/components/CurrencySelectionList/index.tsx
@@ -4,9 +4,11 @@ import React, {useCallback, useMemo, useState} from 'react';
 import SelectionList from '@components/SelectionListWithSections';
 import RadioListItem from '@components/SelectionListWithSections/RadioListItem';
 import SelectableListItem from '@components/SelectionListWithSections/SelectableListItem';
-import useCurrencyList from '@hooks/useCurrencyList';
 import useLocalize from '@hooks/useLocalize';
+import useOnyx from '@hooks/useOnyx';
+import {getCurrencySymbol} from '@libs/CurrencyUtils';
 import getMatchScore from '@libs/getMatchScore';
+import ONYXKEYS from '@src/ONYXKEYS';
 import {isEmptyObject} from '@src/types/utils/EmptyObject';
 import type {CurrencyListItem, CurrencySelectionListProps} from './types';
 
@@ -21,12 +23,12 @@ function CurrencySelectionList({
     excludedCurrencies = [],
     ...restProps
 }: CurrencySelectionListProps) {
-    const {currencyList, getCurrencySymbol} = useCurrencyList();
+    const [currencyList] = useOnyx(ONYXKEYS.CURRENCY_LIST, {canBeMissing: false});
     const [searchValue, setSearchValue] = useState('');
     const {translate} = useLocalize();
     const getUnselectedOptions = useCallback((options: CurrencyListItem[]) => options.filter((option) => !option.isSelected), []);
     const {sections, headerMessage} = useMemo(() => {
-        const currencyOptions: CurrencyListItem[] = Object.entries(currencyList).reduce((acc, [currencyCode, currencyInfo]) => {
+        const currencyOptions: CurrencyListItem[] = Object.entries(currencyList ?? {}).reduce((acc, [currencyCode, currencyInfo]) => {
             const isSelectedCurrency = currencyCode === initiallySelectedCurrencyCode || selectedCurrencies.includes(currencyCode);
             if (!excludedCurrencies.includes(currencyCode) && (isSelectedCurrency || !currencyInfo?.retired)) {
                 acc.push({
@@ -92,7 +94,7 @@ function CurrencySelectionList({
         }
 
         return {sections: result, headerMessage: isEmpty ? translate('common.noResultsFound') : ''};
-    }, [currencyList, recentlyUsedCurrencies, searchValue, getUnselectedOptions, translate, initiallySelectedCurrencyCode, selectedCurrencies, excludedCurrencies, getCurrencySymbol]);
+    }, [currencyList, recentlyUsedCurrencies, searchValue, getUnselectedOptions, translate, initiallySelectedCurrencyCode, selectedCurrencies, excludedCurrencies]);
 
     return (
         <SelectionList
diff --git a/src/components/CurrencySelector.tsx b/src/components/CurrencySelector.tsx
index 28241601ee4f..9bb6e80a50bb 100644
--- a/src/components/CurrencySelector.tsx
+++ b/src/components/CurrencySelector.tsx
@@ -2,9 +2,9 @@ import {useIsFocused} from '@react-navigation/native';
 import type {ForwardedRef} from 'react';
 import React, {useEffect, useRef} from 'react';
 import type {View} from 'react-native';
-import useCurrencyList from '@hooks/useCurrencyList';
 import useLocalize from '@hooks/useLocalize';
 import useThemeStyles from '@hooks/useThemeStyles';
+import {getCurrencySymbol} from '@libs/CurrencyUtils';
 import Navigation from '@libs/Navigation/Navigation';
 import CONST from '@src/CONST';
 import ROUTES from '@src/ROUTES';
@@ -52,7 +52,6 @@ function CurrencySelector({
 }: CurrencySelectorProps) {
     const styles = useThemeStyles();
     const {translate} = useLocalize();
-    const {getCurrencySymbol} = useCurrencyList();
 
     const currencyTitleDescStyle = currency && !shouldShowCurrencySymbol ? styles.textNormal : null;
 
diff --git a/src/components/DatePicker/CalendarPicker/index.tsx b/src/components/DatePicker/CalendarPicker/index.tsx
index c92737170c16..b46720c88c82 100644
--- a/src/components/DatePicker/CalendarPicker/index.tsx
+++ b/src/components/DatePicker/CalendarPicker/index.tsx
@@ -193,12 +193,12 @@ function CalendarPicker({
                     hoverDimmingValue={1}
                     disabled={years.length <= 1}
                     testID="currentYearButton"
-                    accessibilityLabel={`${currentYearView}, ${translate('common.currentYear')}`}
-                    role={CONST.ROLE.BUTTON}
+                    accessibilityLabel={translate('common.currentYear')}
                 >
                     <Text
                         style={themeStyles.sidebarLinkTextBold}
                         testID="currentYearText"
+                        accessibilityLabel={translate('common.currentYear')}
                     >
                         {currentYearView}
                     </Text>
@@ -208,7 +208,7 @@ function CalendarPicker({
                     <Text
                         style={themeStyles.sidebarLinkTextBold}
                         testID="currentMonthText"
-                        accessibilityLabel={`${monthNames.at(currentMonthView)}, ${translate('common.currentMonth')}`}
+                        accessibilityLabel={translate('common.currentMonth')}
                     >
                         {monthNames.at(currentMonthView)}
                     </Text>
@@ -219,7 +219,6 @@ function CalendarPicker({
                         onPress={moveToPrevMonth}
                         hoverDimmingValue={1}
                         accessibilityLabel={translate('common.previous')}
-                        role={CONST.ROLE.BUTTON}
                     >
                         <ArrowIcon
                             disabled={!hasAvailableDatesPrevMonth}
@@ -233,7 +232,6 @@ function CalendarPicker({
                         onPress={moveToNextMonth}
                         hoverDimmingValue={1}
                         accessibilityLabel={translate('common.next')}
-                        role={CONST.ROLE.BUTTON}
                     >
                         <ArrowIcon disabled={!hasAvailableDatesNextMonth} />
                     </PressableWithFeedback>
@@ -271,18 +269,16 @@ function CalendarPicker({
                                 onDayPressed(day);
                             };
                             const key = `${index}_day-${day}`;
-                            const dateAccessibilityLabel = day ? format(currentDate, 'EEEE, MMMM d, yyyy') : '';
                             return (
                                 <PressableWithoutFeedback
                                     key={key}
                                     disabled={isDisabled}
                                     onPress={handleOnPress}
                                     style={themeStyles.calendarDayRoot}
-                                    accessibilityLabel={dateAccessibilityLabel}
+                                    accessibilityLabel={day?.toString() ?? ''}
                                     tabIndex={day ? 0 : -1}
                                     accessible={!!day}
                                     dataSet={{[CONST.SELECTION_SCRAPER_HIDDEN_ELEMENT]: true}}
-                                    role={CONST.ROLE.BUTTON}
                                 >
                                     {({hovered, pressed}) => (
                                         <DayComponent
diff --git a/src/components/DatePicker/index.tsx b/src/components/DatePicker/index.tsx
index cd05b9da071d..08f0a75e03ca 100644
--- a/src/components/DatePicker/index.tsx
+++ b/src/components/DatePicker/index.tsx
@@ -1,12 +1,10 @@
 import {format, setYear} from 'date-fns';
 import React, {useCallback, useEffect, useMemo, useRef, useState} from 'react';
-import type {GestureResponderEvent} from 'react-native';
 import {InteractionManager, View} from 'react-native';
 import TextInput from '@components/TextInput';
 import type {BaseTextInputRef} from '@components/TextInput/BaseTextInput/types';
 import {useMemoizedLazyExpensifyIcons} from '@hooks/useLazyAsset';
 import useLocalize from '@hooks/useLocalize';
-import useResponsiveLayout from '@hooks/useResponsiveLayout';
 import useThemeStyles from '@hooks/useThemeStyles';
 import useWindowDimensions from '@hooks/useWindowDimensions';
 import mergeRefs from '@libs/mergeRefs';
@@ -39,11 +37,7 @@ function DatePicker({
     const icons = useMemoizedLazyExpensifyIcons(['Calendar']);
     const styles = useThemeStyles();
     const {windowHeight, windowWidth} = useWindowDimensions();
-    // shouldUseNarrowLayout returns true for RHP but goal here is to prevent autoFocus only on small devices.
-    // eslint-disable-next-line rulesdir/prefer-shouldUseNarrowLayout-instead-of-isSmallScreenWidth
-    const {isSmallScreenWidth} = useResponsiveLayout();
     const {translate} = useLocalize();
-
     const [isModalVisible, setIsModalVisible] = useState(false);
     // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
     const [selectedDate, setSelectedDate] = useState(value || defaultValue || undefined);
@@ -76,15 +70,10 @@ function DatePicker({
         });
     }, [windowHeight]);
 
-    const handlePress = useCallback(
-        (event?: GestureResponderEvent | KeyboardEvent) => {
-            // This makes sure that cursor does not appear in the TextInput when we open the DatePicker
-            event?.preventDefault();
-            calculatePopoverPosition();
-            setIsModalVisible(true);
-        },
-        [calculatePopoverPosition],
-    );
+    const handlePress = useCallback(() => {
+        calculatePopoverPosition();
+        setIsModalVisible(true);
+    }, [calculatePopoverPosition]);
 
     const closeDatePicker = useCallback(() => {
         textInputRef.current?.blur();
@@ -112,7 +101,7 @@ function DatePicker({
     }, [calculatePopoverPosition, windowWidth]);
 
     useEffect(() => {
-        if (!autoFocus || isAutoFocused.current || isSmallScreenWidth) {
+        if (!autoFocus || isAutoFocused.current) {
             return;
         }
         isAutoFocused.current = true;
@@ -120,7 +109,7 @@ function DatePicker({
         InteractionManager.runAfterInteractions(() => {
             handlePress();
         });
-    }, [handlePress, autoFocus, isSmallScreenWidth]);
+    }, [handlePress, autoFocus]);
 
     const getValidDateForCalendar = useMemo(() => {
         if (!selectedDate) {
@@ -150,12 +139,12 @@ function DatePicker({
                     errorText={errorText}
                     inputStyle={styles.pointerEventsNone}
                     disabled={disabled}
+                    readOnly
                     onPress={handlePress}
                     textInputContainerStyles={isModalVisible ? styles.borderColorFocus : {}}
                     shouldHideClearButton={shouldHideClearButton}
                     onClearInput={handleClear}
                     forwardedFSClass={forwardedFSClass}
-                    disableKeyboard
                 />
             </View>
 
diff --git a/src/components/DestinationPicker.tsx b/src/components/DestinationPicker.tsx
index 73b9597fe9bf..8ffee6e20d3f 100644
--- a/src/components/DestinationPicker.tsx
+++ b/src/components/DestinationPicker.tsx
@@ -1,5 +1,4 @@
 import React, {useMemo} from 'react';
-import type {ForwardedRef} from 'react';
 import useDebouncedState from '@hooks/useDebouncedState';
 import useLocalize from '@hooks/useLocalize';
 import useOnyx from '@hooks/useOnyx';
@@ -13,17 +12,15 @@ import ONYXKEYS from '@src/ONYXKEYS';
 // eslint-disable-next-line no-restricted-imports
 import SelectionList from './SelectionListWithSections';
 import RadioListItem from './SelectionListWithSections/RadioListItem';
-import type {ListItem, SelectionListHandle} from './SelectionListWithSections/types';
+import type {ListItem} from './SelectionListWithSections/types';
 
 type DestinationPickerProps = {
     policyID: string;
     selectedDestination?: string;
     onSubmit: (item: ListItem & {currency: string}) => void;
-    ref?: ForwardedRef<SelectionListHandle>;
-    textInputAutoFocus?: boolean;
 };
 
-function DestinationPicker({selectedDestination, policyID, onSubmit, ref, textInputAutoFocus = false}: DestinationPickerProps) {
+function DestinationPicker({selectedDestination, policyID, onSubmit}: DestinationPickerProps) {
     const policy = usePolicy(policyID);
     const customUnit = getPerDiemCustomUnit(policy);
     const [policyRecentlyUsedDestinations] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY_RECENTLY_USED_DESTINATIONS}${policyID}`, {canBeMissing: true});
@@ -74,7 +71,6 @@ function DestinationPicker({selectedDestination, policyID, onSubmit, ref, textIn
 
     return (
         <SelectionList
-            ref={ref}
             key={selectedDestination}
             sections={sections}
             headerMessage={headerMessage}
@@ -85,7 +81,6 @@ function DestinationPicker({selectedDestination, policyID, onSubmit, ref, textIn
             ListItem={RadioListItem}
             initiallyFocusedOptionKey={selectedOptionKey ?? undefined}
             shouldHideKeyboardOnScroll={false}
-            textInputAutoFocus={textInputAutoFocus}
             shouldUpdateFocusedIndex
         />
     );
diff --git a/src/components/DistanceRequest/DistanceRequestRenderItem.tsx b/src/components/DistanceRequest/DistanceRequestRenderItem.tsx
index 98870d7d928a..7364cd9adf4b 100644
--- a/src/components/DistanceRequest/DistanceRequestRenderItem.tsx
+++ b/src/components/DistanceRequest/DistanceRequestRenderItem.tsx
@@ -1,10 +1,9 @@
 import React from 'react';
+import * as Expensicons from '@components/Icon/Expensicons';
 import MenuItemWithTopDescription from '@components/MenuItemWithTopDescription';
 import {useMemoizedLazyExpensifyIcons} from '@hooks/useLazyAsset';
 import useLocalize from '@hooks/useLocalize';
 import useTheme from '@hooks/useTheme';
-import {isWaypointNullIsland} from '@libs/TransactionUtils';
-import CONST from '@src/CONST';
 import type {TranslationPaths} from '@src/languages/types';
 import type {WaypointCollection} from '@src/types/onyx/Transaction';
 
@@ -33,7 +32,7 @@ type DistanceRequestProps = {
 
 function DistanceRequestRenderItem({waypoints, item = '', onSecondaryInteraction, getIndex, isActive = false, onPress = () => {}, disabled = false}: DistanceRequestProps) {
     const theme = useTheme();
-    const expensifyIcons = useMemoizedLazyExpensifyIcons(['Location', 'DotIndicatorUnfilled', 'DotIndicator', 'DragHandles']);
+    const expensifyIcons = useMemoizedLazyExpensifyIcons(['Location']);
     const {translate} = useLocalize();
     const numberOfWaypoints = Object.keys(waypoints ?? {}).length;
     const lastWaypointIndex = numberOfWaypoints - 1;
@@ -43,25 +42,24 @@ function DistanceRequestRenderItem({waypoints, item = '', onSecondaryInteraction
     let waypointIcon;
     if (index === 0) {
         descriptionKey += 'start';
-        waypointIcon = expensifyIcons.DotIndicatorUnfilled;
+        waypointIcon = Expensicons.DotIndicatorUnfilled;
     } else if (index === lastWaypointIndex) {
         descriptionKey += 'stop';
         waypointIcon = expensifyIcons.Location;
     } else {
         descriptionKey += 'stop';
-        waypointIcon = expensifyIcons.DotIndicator;
+        waypointIcon = Expensicons.DotIndicator;
     }
 
     const waypoint = waypoints?.[`waypoint${index}`] ?? {};
     // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
     const title = waypoint.name || waypoint.address;
-    const errorText = isWaypointNullIsland(waypoint) ? translate('violations.noRoute') : undefined;
 
     return (
         <MenuItemWithTopDescription
             description={translate(descriptionKey as TranslationPaths)}
             title={title}
-            icon={expensifyIcons.DragHandles}
+            icon={Expensicons.DragHandles}
             iconFill={theme.icon}
             secondaryIcon={waypointIcon}
             secondaryIconFill={theme.icon}
@@ -71,8 +69,6 @@ function DistanceRequestRenderItem({waypoints, item = '', onSecondaryInteraction
             focused={isActive}
             key={item}
             disabled={disabled}
-            errorText={errorText}
-            brickRoadIndicator={errorText ? CONST.BRICK_ROAD_INDICATOR_STATUS.ERROR : undefined}
         />
     );
 }
diff --git a/src/components/Domain/DomainMenuItem.tsx b/src/components/Domain/DomainMenuItem.tsx
index c8f207b9a43a..2e0a5356b9a2 100644
--- a/src/components/Domain/DomainMenuItem.tsx
+++ b/src/components/Domain/DomainMenuItem.tsx
@@ -8,9 +8,7 @@ import useLocalize from '@hooks/useLocalize';
 import useThemeStyles from '@hooks/useThemeStyles';
 import Navigation from '@libs/Navigation/Navigation';
 import CONST from '@src/CONST';
-import {clearDomainErrors} from '@src/libs/actions/Domain';
 import ROUTES from '@src/ROUTES';
-import type {Errors} from '@src/types/onyx/OnyxCommon';
 import DomainsListRow from './DomainsListRow';
 
 type DomainMenuItemProps = {
@@ -39,9 +37,6 @@ type DomainItem = {
 
     /** Whether the row's domain is validated (aka verified) */
     isValidated: boolean;
-
-    /** Current errors for domain */
-    errors?: Errors;
 } & Pick<OfflineWithFeedbackProps, 'pendingAction'>;
 
 function DomainMenuItem({item, index}: DomainMenuItemProps) {
@@ -73,14 +68,12 @@ function DomainMenuItem({item, index}: DomainMenuItemProps) {
         <OfflineWithFeedback
             key={`domain_${item.title}_${index}`}
             pendingAction={item.pendingAction}
-            style={[styles.mb2, styles.mh5]}
-            contentContainerStyle={item.errors ? styles.mb2 : undefined}
-            errors={item?.errors}
-            onClose={() => clearDomainErrors(item.accountID)}
+            style={styles.mb2}
         >
             <PressableWithoutFeedback
                 role={CONST.ROLE.BUTTON}
                 accessibilityLabel="row"
+                style={styles.mh5}
                 onPress={action}
             >
                 {({hovered}) => (
diff --git a/src/components/DraggableList/index.tsx b/src/components/DraggableList/index.tsx
index 4df38de83d4b..b244d3a9ba92 100644
--- a/src/components/DraggableList/index.tsx
+++ b/src/components/DraggableList/index.tsx
@@ -1,7 +1,7 @@
 import type {DragEndEvent} from '@dnd-kit/core';
-import {closestCenter, DndContext, KeyboardSensor, PointerSensor, useSensor, useSensors} from '@dnd-kit/core';
+import {closestCenter, DndContext, PointerSensor, useSensor} from '@dnd-kit/core';
 import {restrictToParentElement, restrictToVerticalAxis} from '@dnd-kit/modifiers';
-import {arrayMove, SortableContext, sortableKeyboardCoordinates, verticalListSortingStrategy} from '@dnd-kit/sortable';
+import {arrayMove, SortableContext, verticalListSortingStrategy} from '@dnd-kit/sortable';
 import React, {Fragment} from 'react';
 // eslint-disable-next-line no-restricted-imports
 import type {ScrollView as RNScrollView} from 'react-native';
@@ -69,16 +69,13 @@ function DraggableList<T>({
         );
     });
 
-    const sensors = useSensors(
+    const sensors = [
         useSensor(PointerSensor, {
             activationConstraint: {
                 distance: minimumActivationDistance,
             },
         }),
-        useSensor(KeyboardSensor, {
-            coordinateGetter: sortableKeyboardCoordinates,
-        }),
-    );
+    ];
 
     const Container = disableScroll ? Fragment : ScrollView;
 
diff --git a/src/components/EReceipt.tsx b/src/components/EReceipt.tsx
index d4cde4306b30..b59911c1d5e6 100644
--- a/src/components/EReceipt.tsx
+++ b/src/components/EReceipt.tsx
@@ -1,6 +1,5 @@
 import React, {useEffect, useRef} from 'react';
 import {View} from 'react-native';
-import useCurrencyList from '@hooks/useCurrencyList';
 import useEReceipt from '@hooks/useEReceipt';
 import {useMemoizedLazyExpensifyIcons} from '@hooks/useLazyAsset';
 import useLocalize from '@hooks/useLocalize';
@@ -9,7 +8,7 @@ import useStyleUtils from '@hooks/useStyleUtils';
 import useTheme from '@hooks/useTheme';
 import useThemeStyles from '@hooks/useThemeStyles';
 import {filterPersonalCards, getCardDescription, getCompanyCardDescription} from '@libs/CardUtils';
-import {convertToDisplayString} from '@libs/CurrencyUtils';
+import {convertToDisplayString, getCurrencySymbol} from '@libs/CurrencyUtils';
 import getNonEmptyStringOnyxID from '@libs/getNonEmptyStringOnyxID';
 import {getTransactionDetails} from '@libs/ReportUtils';
 import variables from '@styles/variables';
@@ -41,7 +40,6 @@ function EReceipt({transactionID, transactionItem, onLoad, isThumbnail = false}:
     const styles = useThemeStyles();
     const StyleUtils = useStyleUtils();
     const {translate} = useLocalize();
-    const {getCurrencySymbol} = useCurrencyList();
     const theme = useTheme();
     const icons = useMemoizedLazyExpensifyIcons(['ReceiptBody', 'ExpensifyWordmark']);
     const [cardList] = useOnyx(ONYXKEYS.CARD_LIST, {selector: filterPersonalCards, canBeMissing: true});
@@ -62,8 +60,7 @@ function EReceipt({transactionID, transactionItem, onLoad, isThumbnail = false}:
     const formattedAmount = convertToDisplayString(transactionAmount, transactionCurrency);
     const currency = getCurrencySymbol(transactionCurrency ?? '');
     const amount = currency ? formattedAmount.replace(currency, '') : formattedAmount;
-    const cardDescription =
-        getCompanyCardDescription(transactionCardName, transactionCardID, cardList) ?? (transactionCardID ? getCardDescription(cardList?.[transactionCardID], translate) : '');
+    const cardDescription = getCompanyCardDescription(transactionCardName, transactionCardID, cardList) ?? (transactionCardID ? getCardDescription(cardList?.[transactionCardID]) : '');
     const secondaryBgcolorStyle = secondaryColor ? StyleUtils.getBackgroundColorStyle(secondaryColor) : undefined;
     const primaryTextColorStyle = primaryColor ? StyleUtils.getColorStyle(primaryColor) : undefined;
     const titleTextColorStyle = titleColor ? StyleUtils.getColorStyle(titleColor) : undefined;
diff --git a/src/components/EmojiPicker/CategoryShortcutButton.tsx b/src/components/EmojiPicker/CategoryShortcutButton.tsx
index 33f59ca73a33..fa53a9b7309b 100644
--- a/src/components/EmojiPicker/CategoryShortcutButton.tsx
+++ b/src/components/EmojiPicker/CategoryShortcutButton.tsx
@@ -41,7 +41,7 @@ function CategoryShortcutButton({code, icon, onPress}: CategoryShortcutButtonPro
                 onHoverIn={() => setIsHighlighted(true)}
                 onHoverOut={() => setIsHighlighted(false)}
                 style={({pressed}) => [StyleUtils.getButtonBackgroundColorStyle(getButtonState(false, pressed)), styles.categoryShortcutButton, isHighlighted && styles.emojiItemHighlighted]}
-                accessibilityLabel={translate(`emojiPicker.headers.${code}` as TranslationPaths)}
+                accessibilityLabel={`emojiPicker.headers.${code}`}
                 role={CONST.ROLE.BUTTON}
                 sentryLabel={CONST.SENTRY_LABEL.EMOJI_PICKER.CATEGORY_SHORTCUT}
             >
diff --git a/src/components/EmojiPicker/EmojiPickerButton.tsx b/src/components/EmojiPicker/EmojiPickerButton.tsx
index b1010d33dc1a..b90d0447d320 100644
--- a/src/components/EmojiPicker/EmojiPickerButton.tsx
+++ b/src/components/EmojiPicker/EmojiPickerButton.tsx
@@ -82,7 +82,6 @@ function EmojiPickerButton({isDisabled = false, emojiPickerID = '', shiftVertica
                 onPress={openEmojiPicker}
                 id={CONST.EMOJI_PICKER_BUTTON_NATIVE_ID}
                 accessibilityLabel={translate('reportActionCompose.emoji')}
-                role={CONST.ROLE.BUTTON}
                 sentryLabel={CONST.SENTRY_LABEL.EMOJI_PICKER.BUTTON}
             >
                 {({hovered, pressed}) => (
diff --git a/src/components/EmojiPicker/EmojiPickerButtonDropdown.tsx b/src/components/EmojiPicker/EmojiPickerButtonDropdown.tsx
index 71233e7cd28f..4489044fccad 100644
--- a/src/components/EmojiPicker/EmojiPickerButtonDropdown.tsx
+++ b/src/components/EmojiPicker/EmojiPickerButtonDropdown.tsx
@@ -72,7 +72,7 @@ function EmojiPickerButtonDropdown(
                 disabled={isDisabled}
                 onPress={onPress}
                 id="emojiDropdownButton"
-                accessibilityLabel={value ? `${value}, ${translate('statusPage.status')}` : translate('statusPage.status')}
+                accessibilityLabel="statusEmoji"
                 role={CONST.ROLE.BUTTON}
                 sentryLabel={CONST.SENTRY_LABEL.EMOJI_PICKER.BUTTON_DROPDOWN}
             >
diff --git a/src/components/ExceededCommentLength.tsx b/src/components/ExceededCommentLength.tsx
index 8996a69c0ba8..9efd896d005c 100644
--- a/src/components/ExceededCommentLength.tsx
+++ b/src/components/ExceededCommentLength.tsx
@@ -20,7 +20,7 @@ function ExceededCommentLength({maxCommentLength = CONST.MAX_COMMENT_LENGTH, isT
             style={[styles.textMicro, styles.textDanger, styles.chatItemComposeSecondaryRow, styles.mlAuto, styles.pl2]}
             numberOfLines={1}
         >
-            {translate(translationKey, numberFormat(maxCommentLength))}
+            {translate(translationKey, {formattedMaxLength: numberFormat(maxCommentLength)})}
         </Text>
     );
 }
diff --git a/src/components/FloatingGPSButton/index.native.tsx b/src/components/FloatingGPSButton/index.native.tsx
deleted file mode 100644
index 0d8d4c2c8b87..000000000000
--- a/src/components/FloatingGPSButton/index.native.tsx
+++ /dev/null
@@ -1,59 +0,0 @@
-import React from 'react';
-import {View} from 'react-native';
-import Icon from '@components/Icon';
-import {PressableWithoutFeedback} from '@components/Pressable';
-import {useMemoizedLazyExpensifyIcons} from '@hooks/useLazyAsset';
-import useLocalize from '@hooks/useLocalize';
-import useOnyx from '@hooks/useOnyx';
-import useTheme from '@hooks/useTheme';
-import useThemeStyles from '@hooks/useThemeStyles';
-import Navigation from '@libs/Navigation/Navigation';
-import {generateReportID} from '@libs/ReportUtils';
-import variables from '@styles/variables';
-import CONST from '@src/CONST';
-import ONYXKEYS from '@src/ONYXKEYS';
-import ROUTES from '@src/ROUTES';
-
-function FloatingGpsButton() {
-    const [gpsDraftDetails] = useOnyx(ONYXKEYS.GPS_DRAFT_DETAILS, {canBeMissing: true});
-    const {translate} = useLocalize();
-
-    const icons = useMemoizedLazyExpensifyIcons(['Location'] as const);
-    const {textMutedReversed} = useTheme();
-    const styles = useThemeStyles();
-
-    if (!gpsDraftDetails?.isTracking) {
-        return null;
-    }
-
-    const navigateToGpsScreen = () => {
-        const reportID = gpsDraftDetails?.reportID ?? generateReportID();
-        Navigation.navigate(ROUTES.DISTANCE_REQUEST_CREATE_TAB_GPS.getRoute(CONST.IOU.ACTION.CREATE, CONST.IOU.TYPE.CREATE, CONST.IOU.OPTIMISTIC_TRANSACTION_ID, reportID));
-    };
-
-    return (
-        <PressableWithoutFeedback
-            style={[styles.navigationTabBarFABItem, styles.ph0, styles.userSelectNone, styles.floatingGpsButton]}
-            accessibilityLabel={translate('gps.fabGpsTripExplained')}
-            onPress={navigateToGpsScreen}
-            role={CONST.ROLE.BUTTON}
-            testID="floating-gps-button"
-        >
-            <View
-                style={styles.floatingSecondaryActionButton}
-                testID="floating-gps-button-container"
-            >
-                <Icon
-                    fill={textMutedReversed}
-                    src={icons.Location}
-                    width={variables.iconSizeNormal}
-                    height={variables.iconSizeNormal}
-                />
-            </View>
-        </PressableWithoutFeedback>
-    );
-}
-
-FloatingGpsButton.displayName = 'FloatingGpsButton';
-
-export default FloatingGpsButton;
diff --git a/src/components/FloatingGPSButton/index.tsx b/src/components/FloatingGPSButton/index.tsx
deleted file mode 100644
index e0f2ea10029d..000000000000
--- a/src/components/FloatingGPSButton/index.tsx
+++ /dev/null
@@ -1,7 +0,0 @@
-function FloatingGpsButton() {
-    return null;
-}
-
-FloatingGpsButton.displayName = 'FloatingGpsButton';
-
-export default FloatingGpsButton;
diff --git a/src/components/FocusModeNotification.tsx b/src/components/FocusModeNotification.tsx
index 585ce4558a52..2d127e86175b 100644
--- a/src/components/FocusModeNotification.tsx
+++ b/src/components/FocusModeNotification.tsx
@@ -31,7 +31,7 @@ function FocusModeNotification({onClose}: FocusModeNotificationProps) {
             onCancel={onClose}
             prompt={
                 <View style={[styles.renderHTML, styles.flexRow]}>
-                    <RenderHTML html={translate('focusModeUpdateModal.prompt', priorityModePageUrl)} />
+                    <RenderHTML html={translate('focusModeUpdateModal.prompt', {priorityModePageUrl})} />
                 </View>
             }
             isVisible
diff --git a/src/components/Form/FormWrapper.tsx b/src/components/Form/FormWrapper.tsx
index 178a8cddaf87..bc5ca52af418 100644
--- a/src/components/Form/FormWrapper.tsx
+++ b/src/components/Form/FormWrapper.tsx
@@ -1,4 +1,4 @@
-import React, {useRef} from 'react';
+import React, {useCallback, useMemo, useRef} from 'react';
 import type {RefObject} from 'react';
 // eslint-disable-next-line no-restricted-imports
 import type {ScrollView as RNScrollView, StyleProp, ViewStyle} from 'react-native';
@@ -103,9 +103,9 @@ function FormWrapper({
 
     const [formState] = useOnyx<OnyxFormKey, Form>(`${formID}`, {canBeMissing: true});
 
-    const errorMessage = formState ? getLatestErrorMessage(formState) : undefined;
+    const errorMessage = useMemo(() => (formState ? getLatestErrorMessage(formState) : undefined), [formState]);
 
-    const onFixTheErrorsLinkPressed = () => {
+    const onFixTheErrorsLinkPressed = useCallback(() => {
         const errorFields = !isEmptyObject(errors) ? errors : (formState?.errorFields ?? {});
         const focusKey = Object.keys(inputRefs.current ?? {}).find((key) => key in errorFields);
 
@@ -134,7 +134,7 @@ function FormWrapper({
 
         // Focus the input after scrolling, as on the Web it gives a slightly better visual result
         focusInput?.focus?.();
-    };
+    }, [errors, formState?.errorFields, inputRefs]);
 
     // If either of `addBottomSafeAreaPadding` or `shouldSubmitButtonStickToBottom` is explicitly set,
     // we expect that the user wants to use the new edge-to-edge mode.
@@ -159,53 +159,88 @@ function FormWrapper({
         style: submitButtonStyles,
     });
 
-    const SubmitButton = isSubmitButtonVisible && (
-        <FormAlertWithSubmitButton
-            buttonText={submitButtonText}
-            isDisabled={isSubmitDisabled}
-            isAlertVisible={((!isEmptyObject(errors) || !isEmptyObject(formState?.errorFields)) && !shouldHideFixErrorsAlert) || !!errorMessage}
-            isLoading={!!formState?.isLoading || isLoading}
-            message={isEmptyObject(formState?.errorFields) ? errorMessage : undefined}
-            onSubmit={onSubmit}
-            footerContent={footerContent}
-            onFixTheErrorsLinkPressed={onFixTheErrorsLinkPressed}
-            containerStyles={[
-                styles.mh0,
-                styles.mt5,
-                submitFlexEnabled && styles.flex1,
-                submitButtonStylesWithBottomSafeAreaPadding,
-                shouldSubmitButtonStickToBottom && [styles.stickToBottom, style],
-            ]}
-            enabledWhenOffline={enabledWhenOffline}
-            isSubmitActionDangerous={isSubmitActionDangerous}
-            disablePressOnEnter={disablePressOnEnter}
-            enterKeyEventListenerPriority={enterKeyEventListenerPriority}
-            shouldRenderFooterAboveSubmit={shouldRenderFooterAboveSubmit}
-            shouldBlendOpacity={shouldSubmitButtonBlendOpacity}
-            shouldPreventDefaultFocusOnPress={shouldPreventDefaultFocusOnPressSubmit}
-        />
+    const SubmitButton = useMemo(
+        () =>
+            isSubmitButtonVisible && (
+                <FormAlertWithSubmitButton
+                    buttonText={submitButtonText}
+                    isDisabled={isSubmitDisabled}
+                    isAlertVisible={((!isEmptyObject(errors) || !isEmptyObject(formState?.errorFields)) && !shouldHideFixErrorsAlert) || !!errorMessage}
+                    isLoading={!!formState?.isLoading || isLoading}
+                    message={isEmptyObject(formState?.errorFields) ? errorMessage : undefined}
+                    onSubmit={onSubmit}
+                    footerContent={footerContent}
+                    onFixTheErrorsLinkPressed={onFixTheErrorsLinkPressed}
+                    containerStyles={[
+                        styles.mh0,
+                        styles.mt5,
+                        submitFlexEnabled && styles.flex1,
+                        submitButtonStylesWithBottomSafeAreaPadding,
+                        shouldSubmitButtonStickToBottom && [styles.stickToBottom, style],
+                    ]}
+                    enabledWhenOffline={enabledWhenOffline}
+                    isSubmitActionDangerous={isSubmitActionDangerous}
+                    disablePressOnEnter={disablePressOnEnter}
+                    enterKeyEventListenerPriority={enterKeyEventListenerPriority}
+                    shouldRenderFooterAboveSubmit={shouldRenderFooterAboveSubmit}
+                    shouldBlendOpacity={shouldSubmitButtonBlendOpacity}
+                    shouldPreventDefaultFocusOnPress={shouldPreventDefaultFocusOnPressSubmit}
+                />
+            ),
+        [
+            disablePressOnEnter,
+            enterKeyEventListenerPriority,
+            enabledWhenOffline,
+            errorMessage,
+            errors,
+            footerContent,
+            formState?.errorFields,
+            formState?.isLoading,
+            isLoading,
+            isSubmitActionDangerous,
+            isSubmitButtonVisible,
+            isSubmitDisabled,
+            onFixTheErrorsLinkPressed,
+            onSubmit,
+            shouldHideFixErrorsAlert,
+            shouldSubmitButtonBlendOpacity,
+            shouldSubmitButtonStickToBottom,
+            style,
+            styles.flex1,
+            styles.mh0,
+            styles.mt5,
+            styles.stickToBottom,
+            submitButtonStylesWithBottomSafeAreaPadding,
+            submitButtonText,
+            submitFlexEnabled,
+            shouldRenderFooterAboveSubmit,
+            shouldPreventDefaultFocusOnPressSubmit,
+        ],
     );
 
-    const scrollViewContent = () => (
-        <FormElement
-            key={formID}
-            ref={formContentRef}
-            style={[style, styles.pb5]}
-            onLayout={() => {
-                if (!shouldScrollToEnd) {
-                    return;
-                }
-                // eslint-disable-next-line @typescript-eslint/no-deprecated
-                InteractionManager.runAfterInteractions(() => {
-                    requestAnimationFrame(() => {
-                        formRef.current?.scrollToEnd({animated: true});
+    const scrollViewContent = useCallback(
+        () => (
+            <FormElement
+                key={formID}
+                ref={formContentRef}
+                style={[style, styles.pb5]}
+                onLayout={() => {
+                    if (!shouldScrollToEnd) {
+                        return;
+                    }
+                    // eslint-disable-next-line @typescript-eslint/no-deprecated
+                    InteractionManager.runAfterInteractions(() => {
+                        requestAnimationFrame(() => {
+                            formRef.current?.scrollToEnd({animated: true});
+                        });
                     });
-                });
-            }}
-        >
-            {children}
-            {!shouldSubmitButtonStickToBottom && SubmitButton}
-        </FormElement>
+                }}
+            >
+                {children}
+                {!shouldSubmitButtonStickToBottom && SubmitButton}
+            </FormElement>
+        ),
+        [formID, style, styles.pb5, children, shouldSubmitButtonStickToBottom, SubmitButton, shouldScrollToEnd],
     );
 
     if (!shouldUseScrollView) {
diff --git a/src/components/FullscreenLoadingIndicator.tsx b/src/components/FullscreenLoadingIndicator.tsx
index 9c495aa651ab..f5e21fe762c6 100644
--- a/src/components/FullscreenLoadingIndicator.tsx
+++ b/src/components/FullscreenLoadingIndicator.tsx
@@ -5,7 +5,6 @@ import useLocalize from '@hooks/useLocalize';
 import useThemeStyles from '@hooks/useThemeStyles';
 import type {ExtraLoadingContext} from '@libs/AppState';
 import Navigation from '@libs/Navigation/Navigation';
-import useSkeletonSpan from '@libs/telemetry/useSkeletonSpan';
 import CONST from '@src/CONST';
 import ActivityIndicator from './ActivityIndicator';
 import Button from './Button';
@@ -40,7 +39,6 @@ function FullScreenLoadingIndicator({
     const styles = useThemeStyles();
     const {translate} = useLocalize();
     const [showGoBackButton, setShowGoBackButton] = useState(false);
-    useSkeletonSpan('FullScreenLoadingIndicator');
 
     useEffect(() => {
         if (!shouldUseGoBackButton) {
diff --git a/src/components/HTMLEngineProvider/HTMLRenderers/AnchorRenderer.tsx b/src/components/HTMLEngineProvider/HTMLRenderers/AnchorRenderer.tsx
index fe91b8354ed8..f84dbb0f9cdb 100644
--- a/src/components/HTMLEngineProvider/HTMLRenderers/AnchorRenderer.tsx
+++ b/src/components/HTMLEngineProvider/HTMLRenderers/AnchorRenderer.tsx
@@ -106,7 +106,6 @@ function AnchorRenderer({tnode, style, key}: AnchorRendererProps) {
                 style={linkStyle}
                 onPress={() => openLink(attrHref, environmentURL, isAttachment)}
                 suppressHighlighting
-                role={CONST.ROLE.LINK}
             >
                 <TNodeChildrenRenderer tnode={tnode} />
             </Text>
diff --git a/src/components/HTMLEngineProvider/HTMLRenderers/MentionUserRenderer.tsx b/src/components/HTMLEngineProvider/HTMLRenderers/MentionUserRenderer.tsx
index fac38983df18..46943dff4b26 100644
--- a/src/components/HTMLEngineProvider/HTMLRenderers/MentionUserRenderer.tsx
+++ b/src/components/HTMLEngineProvider/HTMLRenderers/MentionUserRenderer.tsx
@@ -58,11 +58,6 @@ function MentionUserRenderer({style, tnode, TDefaultRenderer, currentUserPersona
         accountID = getAccountIDsByLogins([mentionDisplayText])?.at(0) ?? -1;
         navigationRoute = ROUTES.PROFILE.getRoute(accountID, Navigation.getReportRHPActiveRoute(), mentionDisplayText);
         mentionDisplayText = Str.removeSMSDomain(mentionDisplayText);
-    } else if (!isEmpty(htmlAttribAccountID)) {
-        // accountID not found in personal details and mention data not provided
-        accountID = parseInt(htmlAttribAccountID, 10);
-        mentionDisplayText = getDisplayNameOrDefault();
-        navigationRoute = ROUTES.PROFILE.getRoute(accountID, Navigation.getReportRHPActiveRoute());
     } else {
         // If neither an account ID or email is provided, don't render anything
         return null;
diff --git a/src/components/Icon/Illustrations.ts b/src/components/Icon/Illustrations.ts
index 65851e064167..84cd803da8db 100644
--- a/src/components/Icon/Illustrations.ts
+++ b/src/components/Icon/Illustrations.ts
@@ -13,7 +13,6 @@ import Approval from '@assets/images/simple-illustrations/simple-illustration__a
 import Binoculars from '@assets/images/simple-illustrations/simple-illustration__binoculars.svg';
 import BlueShield from '@assets/images/simple-illustrations/simple-illustration__blueshield.svg';
 import Buildings from '@assets/images/simple-illustrations/simple-illustration__buildings.svg';
-import CalendarMonthly from '@assets/images/simple-illustrations/simple-illustration__calendar-monthly.svg';
 import CarIce from '@assets/images/simple-illustrations/simple-illustration__car-ice.svg';
 import Car from '@assets/images/simple-illustrations/simple-illustration__car.svg';
 import ChatBubbles from '@assets/images/simple-illustrations/simple-illustration__chatbubbles.svg';
@@ -28,7 +27,6 @@ import EmailAddress from '@assets/images/simple-illustrations/simple-illustratio
 import EmptyShelves from '@assets/images/simple-illustrations/simple-illustration__empty-shelves.svg';
 import Encryption from '@assets/images/simple-illustrations/simple-illustration__encryption.svg';
 import EnvelopeReceipt from '@assets/images/simple-illustrations/simple-illustration__envelopereceipt.svg';
-import FastMoney from '@assets/images/simple-illustrations/simple-illustration__fastmoney.svg';
 import Filters from '@assets/images/simple-illustrations/simple-illustration__filters.svg';
 import Flash from '@assets/images/simple-illustrations/simple-illustration__flash.svg';
 import Gears from '@assets/images/simple-illustrations/simple-illustration__gears.svg';
@@ -47,51 +45,49 @@ import ExpensifyApprovedLogo from '@assets/images/subscription-details__approved
 import TurtleInShell from '@assets/images/turtle-in-shell.svg';
 
 export {
-    Abacus,
-    Alert,
-    Approval,
-    Binoculars,
-    BlueShield,
-    Buildings,
-    CalendarMonthly,
-    Car,
-    CarIce,
+    Encryption,
     ChatBubbles,
-    CheckmarkCircle,
-    Clock,
-    CommentBubbles,
     Computer,
-    ConciergeBot,
-    ConciergeBubble,
-    CreditCardEyes,
-    CreditCardsNewGreen,
+    Clock,
     EmailAddress,
     EmptyCardState,
-    EmptyShelves,
-    EmptyStateTravel,
-    Encryption,
     EnvelopeReceipt,
-    ExpensifyApprovedLogo,
     ExpensifyCardImage,
-    FastMoney,
-    Filters,
-    Flash,
-    Gears,
-    HeadSet,
-    Hourglass,
-    House,
+    Mailbox,
+    CreditCardsNewGreen,
     LaptopWithSecondScreenAndHourglass,
     LaptopWithSecondScreenSync,
     LaptopWithSecondScreenX,
-    Lightbulb,
-    LockClosed,
-    LockClosedOrange,
     LockOpen,
     Luggage,
     MagnifyingGlassReceipt,
-    Mailbox,
-    Pencil,
-    PendingTravel,
+    ConciergeBot,
+    ConciergeBubble,
+    HeadSet,
+    Hourglass,
+    CommentBubbles,
     Puzzle,
+    LockClosed,
+    Gears,
+    Approval,
+    House,
+    Buildings,
+    Alert,
+    Abacus,
+    Binoculars,
+    Car,
+    Pencil,
+    CarIce,
+    Lightbulb,
+    ExpensifyApprovedLogo,
+    CheckmarkCircle,
+    CreditCardEyes,
+    LockClosedOrange,
+    Filters,
     TurtleInShell,
+    Flash,
+    PendingTravel,
+    EmptyStateTravel,
+    EmptyShelves,
+    BlueShield,
 };
diff --git a/src/components/Icon/chunks/expensify-icons.chunk.ts b/src/components/Icon/chunks/expensify-icons.chunk.ts
index e51dac50bbc5..02e26682bc7a 100644
--- a/src/components/Icon/chunks/expensify-icons.chunk.ts
+++ b/src/components/Icon/chunks/expensify-icons.chunk.ts
@@ -156,7 +156,6 @@ import MoneySearch from '@assets/images/money-search.svg';
 import MoneyWaving from '@assets/images/money-waving.svg';
 import Monitor from '@assets/images/monitor.svg';
 import MultiTag from '@assets/images/multi-tag.svg';
-import Fingerprint from '@assets/images/multifactorAuthentication/fingerprint.svg';
 import Mute from '@assets/images/mute.svg';
 import NewWindow from '@assets/images/new-window.svg';
 import NewWorkspace from '@assets/images/new-workspace.svg';
@@ -226,7 +225,6 @@ import UserEye from '@assets/images/user-eye.svg';
 import UserLock from '@assets/images/user-lock.svg';
 import UserMinus from '@assets/images/user-minus.svg';
 import UserPlus from '@assets/images/user-plus.svg';
-import UserShield from '@assets/images/user-shield.svg';
 import User from '@assets/images/user.svg';
 import Users from '@assets/images/users.svg';
 import VideoSlash from '@assets/images/video-slash.svg';
@@ -319,7 +317,6 @@ const Expensicons = {
     FlagLevelOne,
     FlagLevelTwo,
     FlagLevelThree,
-    Fingerprint,
     Fullscreen,
     Folder,
     Tag,
@@ -476,7 +473,6 @@ const Expensicons = {
     ArrowCircleClockwise,
     LuggageWithLines,
     TreasureChestGreenWithSparkle,
-    UserShield,
 };
 
 // Create the ExpensifyIcons object from the imported Expensicons
diff --git a/src/components/Icon/chunks/illustrations.chunk.ts b/src/components/Icon/chunks/illustrations.chunk.ts
index f86a9b9bd84a..ce7cf4c06406 100644
--- a/src/components/Icon/chunks/illustrations.chunk.ts
+++ b/src/components/Icon/chunks/illustrations.chunk.ts
@@ -40,10 +40,6 @@ import LaptopOnDeskWithCoffeeAndKey from '@assets/images/laptop-on-desk-with-cof
 import LaptopWithSecondScreenAndHourglass from '@assets/images/laptop-with-second-screen-and-hourglass.svg';
 import LaptopWithSecondScreenSync from '@assets/images/laptop-with-second-screen-sync.svg';
 import LaptopWithSecondScreenX from '@assets/images/laptop-with-second-screen-x.svg';
-// Multifactor Authentication Illustrations
-import HumptyDumpty from '@assets/images/multifactorAuthentication/humpty-dumpty.svg';
-import OpenPadlock from '@assets/images/multifactorAuthentication/open-padlock.svg';
-import RunOutOfTime from '@assets/images/multifactorAuthentication/running-out-of-time.svg';
 import PendingTravel from '@assets/images/pending-travel.svg';
 // Product Illustrations
 import Abracadabra from '@assets/images/product-illustrations/abracadabra.svg';
@@ -95,7 +91,6 @@ import Binoculars from '@assets/images/simple-illustrations/simple-illustration_
 import BlueShield from '@assets/images/simple-illustrations/simple-illustration__blueshield.svg';
 import Building from '@assets/images/simple-illustrations/simple-illustration__building.svg';
 import Buildings from '@assets/images/simple-illustrations/simple-illustration__buildings.svg';
-import CalendarMonthly from '@assets/images/simple-illustrations/simple-illustration__calendar-monthly.svg';
 import CarIce from '@assets/images/simple-illustrations/simple-illustration__car-ice.svg';
 import Car from '@assets/images/simple-illustrations/simple-illustration__car.svg';
 import ChatBubbles from '@assets/images/simple-illustrations/simple-illustration__chatbubbles.svg';
@@ -111,7 +106,6 @@ import EmailAddress from '@assets/images/simple-illustrations/simple-illustratio
 import EmptyShelves from '@assets/images/simple-illustrations/simple-illustration__empty-shelves.svg';
 import Encryption from '@assets/images/simple-illustrations/simple-illustration__encryption.svg';
 import EnvelopeReceipt from '@assets/images/simple-illustrations/simple-illustration__envelopereceipt.svg';
-import FastMoney from '@assets/images/simple-illustrations/simple-illustration__fastmoney.svg';
 import Filters from '@assets/images/simple-illustrations/simple-illustration__filters.svg';
 import Flash from '@assets/images/simple-illustrations/simple-illustration__flash.svg';
 import FolderOpen from '@assets/images/simple-illustrations/simple-illustration__folder-open.svg';
@@ -311,7 +305,6 @@ const Illustrations = {
     Approval,
     Binoculars,
     Buildings,
-    CalendarMonthly,
     Car,
     ChatBubbles,
     CheckmarkCircle,
@@ -323,7 +316,6 @@ const Illustrations = {
     EmptyShelves,
     Encryption,
     EnvelopeReceipt,
-    FastMoney,
     Filters,
     Flash,
     Gears,
@@ -339,11 +331,6 @@ const Illustrations = {
     Clock,
     Members,
     UserShield,
-
-    // Multifactor Authentication Illustrations
-    OpenPadlock,
-    RunOutOfTime,
-    HumptyDumpty,
 };
 
 /**
diff --git a/src/components/ImportColumn.tsx b/src/components/ImportColumn.tsx
index 0d97ce652cd0..3f6451882dd9 100644
--- a/src/components/ImportColumn.tsx
+++ b/src/components/ImportColumn.tsx
@@ -178,7 +178,7 @@ function ImportColumn({column, columnName, columnRoles, columnIndex, shouldShowD
         // eslint-disable-next-line react-hooks/exhaustive-deps -- we don't want this effect to run again
     }, []);
 
-    const columnHeader = containsHeader ? column.at(0) : translate('spreadsheet.column', columnName);
+    const columnHeader = containsHeader ? column.at(0) : translate('spreadsheet.column', {name: columnName});
 
     return (
         <View style={[styles.importColumnCard, styles.mt4]}>
diff --git a/src/components/InteractiveStepSubHeader.tsx b/src/components/InteractiveStepSubHeader.tsx
index 387eb031a73f..15664c591764 100644
--- a/src/components/InteractiveStepSubHeader.tsx
+++ b/src/components/InteractiveStepSubHeader.tsx
@@ -100,8 +100,7 @@ function InteractiveStepSubHeader({stepNames, startStepIndex = 0, onStepSelected
                             disabled={isLockedStep || !onStepSelected}
                             onPress={moveToStep}
                             accessible
-                            accessibilityLabel={`${index + 1}`}
-                            aria-current={currentStep === index ? 'step' : undefined}
+                            accessibilityLabel={stepName[index]}
                             role={CONST.ROLE.BUTTON}
                         >
                             {isCompletedStep ? (
diff --git a/src/components/InvertedFlatList/index.e2e.tsx b/src/components/InvertedFlatList/index.e2e.tsx
index caa08ea9b023..b0cb84050188 100644
--- a/src/components/InvertedFlatList/index.e2e.tsx
+++ b/src/components/InvertedFlatList/index.e2e.tsx
@@ -1,4 +1,4 @@
-import React from 'react';
+import React, {useMemo} from 'react';
 import type {ScrollViewProps, ViewToken} from 'react-native';
 import {DeviceEventEmitter, FlatList} from 'react-native';
 import type {ReportAction} from '@src/types/onyx';
@@ -9,25 +9,33 @@ const AUTOSCROLL_TO_TOP_THRESHOLD = 128;
 function InvertedFlatListE2E({ref, ...props}: InvertedFlatListProps<ReportAction>) {
     const {shouldEnableAutoScrollToTopThreshold, ...rest} = props;
 
-    const handleViewableItemsChanged = ({viewableItems}: {viewableItems: ViewToken[]}) => {
-        DeviceEventEmitter.emit('onViewableItemsChanged', viewableItems);
-    };
+    const handleViewableItemsChanged = useMemo(
+        () =>
+            ({viewableItems}: {viewableItems: ViewToken[]}) => {
+                DeviceEventEmitter.emit('onViewableItemsChanged', viewableItems);
+            },
+        [],
+    );
+
+    const maintainVisibleContentPosition = useMemo(() => {
+        const config: ScrollViewProps['maintainVisibleContentPosition'] = {
+            // This needs to be 1 to avoid using loading views as anchors.
+            minIndexForVisible: rest.data?.length ? Math.min(1, rest.data.length - 1) : 0,
+        };
 
-    const config: ScrollViewProps['maintainVisibleContentPosition'] = {
-        // This needs to be 1 to avoid using loading views as anchors.
-        minIndexForVisible: rest.data?.length ? Math.min(1, rest.data.length - 1) : 0,
-    };
+        if (shouldEnableAutoScrollToTopThreshold) {
+            config.autoscrollToTopThreshold = AUTOSCROLL_TO_TOP_THRESHOLD;
+        }
 
-    if (shouldEnableAutoScrollToTopThreshold) {
-        config.autoscrollToTopThreshold = AUTOSCROLL_TO_TOP_THRESHOLD;
-    }
+        return config;
+    }, [shouldEnableAutoScrollToTopThreshold, rest.data?.length]);
 
     return (
         <FlatList<ReportAction>
             // eslint-disable-next-line react/jsx-props-no-spreading
             {...rest}
             ref={ref}
-            maintainVisibleContentPosition={config}
+            maintainVisibleContentPosition={maintainVisibleContentPosition}
             inverted
             onViewableItemsChanged={handleViewableItemsChanged}
         />
diff --git a/src/components/KYCWall/BaseKYCWall.tsx b/src/components/KYCWall/BaseKYCWall.tsx
index fdb139f30b43..be3641aa3508 100644
--- a/src/components/KYCWall/BaseKYCWall.tsx
+++ b/src/components/KYCWall/BaseKYCWall.tsx
@@ -7,8 +7,6 @@ import useCurrentUserPersonalDetails from '@hooks/useCurrentUserPersonalDetails'
 import useLocalize from '@hooks/useLocalize';
 import useOnyx from '@hooks/useOnyx';
 import useParentReportAction from '@hooks/useParentReportAction';
-import usePermissions from '@hooks/usePermissions';
-import useReportTransactions from '@hooks/useReportTransactions';
 import {openPersonalBankAccountSetupView} from '@libs/actions/BankAccounts';
 import {completePaymentOnboarding, savePreferredPaymentMethod} from '@libs/actions/IOU';
 import {navigateToBankAccountRoute} from '@libs/actions/ReimbursementAccount';
@@ -72,9 +70,6 @@ function KYCWall({
     const reportPreviewAction = useParentReportAction(iouReport);
     const personalDetails = usePersonalDetails();
     const employeeEmail = personalDetails?.[iouReport?.ownerAccountID ?? CONST.DEFAULT_NUMBER_ID]?.login ?? '';
-    const reportTransactions = useReportTransactions(iouReport?.reportID);
-    const {isBetaEnabled} = usePermissions();
-    const isCustomReportNamesBetaEnabled = isBetaEnabled(CONST.BETAS.CUSTOM_REPORT_NAMES);
     const anchorRef = useRef<HTMLDivElement | View>(null);
     const transferBalanceButtonRef = useRef<HTMLDivElement | View | null>(null);
 
@@ -140,7 +135,7 @@ function KYCWall({
                 if (iouReport && isIOUReport(iouReport)) {
                     const adminPolicy = policies?.[`${ONYXKEYS.COLLECTION.POLICY}${policy?.id}`];
                     if (adminPolicy) {
-                        const inviteResult = moveIOUReportToPolicyAndInviteSubmitter(iouReport?.reportID, adminPolicy, formatPhoneNumber, reportTransactions, isCustomReportNamesBetaEnabled);
+                        const inviteResult = moveIOUReportToPolicyAndInviteSubmitter(iouReport?.reportID, adminPolicy, formatPhoneNumber);
                         if (inviteResult?.policyExpenseChatReportID) {
                             setNavigationActionToMicrotaskQueue(() => {
                                 Navigation.navigate(ROUTES.REPORT_WITH_ID.getRoute(inviteResult.policyExpenseChatReportID));
@@ -150,7 +145,7 @@ function KYCWall({
                                 Navigation.navigate(ROUTES.BANK_ACCOUNT_WITH_STEP_TO_OPEN.getRoute(adminPolicy.id));
                             });
                         } else {
-                            const moveResult = moveIOUReportToPolicy(iouReport?.reportID, adminPolicy, true, reportTransactions, isCustomReportNamesBetaEnabled);
+                            const moveResult = moveIOUReportToPolicy(iouReport?.reportID, adminPolicy, true);
                             savePreferredPaymentMethod(iouReport.policyID, adminPolicy.id, CONST.LAST_PAYMENT_METHOD.IOU, lastPaymentMethod?.[adminPolicy.id]);
 
                             if (moveResult?.policyExpenseChatReportID && !moveResult.useTemporaryOptimisticExpenseChatReportID) {
@@ -215,8 +210,6 @@ function KYCWall({
             reportPreviewAction,
             currentUserEmail,
             employeeEmail,
-            reportTransactions,
-            isCustomReportNamesBetaEnabled,
         ],
     );
 
diff --git a/src/components/LHNOptionsList/LHNOptionsList.tsx b/src/components/LHNOptionsList/LHNOptionsList.tsx
index 308bb1599c61..5495efe57950 100644
--- a/src/components/LHNOptionsList/LHNOptionsList.tsx
+++ b/src/components/LHNOptionsList/LHNOptionsList.tsx
@@ -13,7 +13,6 @@ import Icon from '@components/Icon';
 import * as Expensicons from '@components/Icon/Expensicons';
 import {ScrollOffsetContext} from '@components/ScrollOffsetContextProvider';
 import TextBlock from '@components/TextBlock';
-import useCurrentUserPersonalDetails from '@hooks/useCurrentUserPersonalDetails';
 import {useMemoizedLazyExpensifyIcons} from '@hooks/useLazyAsset';
 import useLocalize from '@hooks/useLocalize';
 import useNetwork from '@hooks/useNetwork';
@@ -29,19 +28,20 @@ import Log from '@libs/Log';
 import {getMovedReportID} from '@libs/ModifiedExpenseMessage';
 import {getIOUReportIDOfLastAction, getLastMessageTextForReport} from '@libs/OptionsListUtils';
 import {
-    getLastVisibleAction,
     getOneTransactionThreadReportID,
     getOriginalMessage,
-    getReportActionActorAccountID,
+    getSortedReportActions,
+    getSortedReportActionsForDisplay,
     isInviteOrRemovedAction,
     isMoneyRequestAction,
+    shouldReportActionBeVisibleAsLastAction,
 } from '@libs/ReportActionsUtils';
 import {canUserPerformWriteAction as canUserPerformWriteActionUtil} from '@libs/ReportUtils';
 import variables from '@styles/variables';
 import CONST from '@src/CONST';
 import NAVIGATORS from '@src/NAVIGATORS';
 import ONYXKEYS from '@src/ONYXKEYS';
-import type {PersonalDetails, Report} from '@src/types/onyx';
+import type {PersonalDetails, Report, ReportAction} from '@src/types/onyx';
 import {isEmptyObject} from '@src/types/utils/EmptyObject';
 import OptionRowLHNData from './OptionRowLHNData';
 import OptionRowRendererComponent from './OptionRowRendererComponent';
@@ -71,8 +71,6 @@ function LHNOptionsList({style, contentContainerStyles, data, onSelectRow, optio
     const [activePolicyID] = useOnyx(ONYXKEYS.NVP_ACTIVE_POLICY_ID, {canBeMissing: true});
     const [introSelected] = useOnyx(ONYXKEYS.NVP_INTRO_SELECTED, {canBeMissing: true});
     const [isFullscreenVisible] = useOnyx(ONYXKEYS.FULLSCREEN_VISIBILITY, {canBeMissing: true});
-    const [visibleReportActionsData] = useOnyx(ONYXKEYS.DERIVED.VISIBLE_REPORT_ACTIONS, {canBeMissing: true});
-    const {accountID: currentUserAccountID} = useCurrentUserPersonalDetails();
     const {policyForMovingExpensesID} = usePolicyForMovingExpenses();
 
     const theme = useTheme();
@@ -192,6 +190,9 @@ function LHNOptionsList({style, contentContainerStyles, data, onSelectRow, optio
             }
             const itemInvoiceReceiverPolicy = policy?.[`${ONYXKEYS.COLLECTION.POLICY}${invoiceReceiverPolicyID}`];
 
+            const iouReportIDOfLastAction = getIOUReportIDOfLastAction(item);
+            const itemIouReportReportActions = iouReportIDOfLastAction ? reportActions?.[`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${iouReportIDOfLastAction}`] : undefined;
+
             const itemPolicy = policy?.[`${ONYXKEYS.COLLECTION.POLICY}${item?.policyID}`];
             const transactionID = isMoneyRequestAction(itemParentReportAction)
                 ? (getOriginalMessage(itemParentReportAction)?.IOUTransactionID ?? CONST.DEFAULT_NUMBER_ID)
@@ -203,57 +204,54 @@ function LHNOptionsList({style, contentContainerStyles, data, onSelectRow, optio
 
             const isReportArchived = !!itemReportNameValuePairs?.private_isArchived;
             const canUserPerformWrite = canUserPerformWriteActionUtil(item, isReportArchived);
-            const lastAction = getLastVisibleAction(
-                reportID,
-                canUserPerformWrite,
-                {},
-                itemReportActions ? {[`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${reportID}`]: itemReportActions} : undefined,
-                visibleReportActionsData,
-            );
+            const sortedReportActions = getSortedReportActionsForDisplay(itemReportActions, canUserPerformWrite);
+            const lastReportAction = sortedReportActions.at(0);
 
-            const iouReportIDOfLastAction = getIOUReportIDOfLastAction(item, visibleReportActionsData, lastAction);
-            const itemIouReportReportActions = iouReportIDOfLastAction ? reportActions?.[`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${iouReportIDOfLastAction}`] : undefined;
-
-            const lastReportActionTransactionID = isMoneyRequestAction(lastAction) ? (getOriginalMessage(lastAction)?.IOUTransactionID ?? CONST.DEFAULT_NUMBER_ID) : CONST.DEFAULT_NUMBER_ID;
+            // Get the transaction for the last report action
+            const lastReportActionTransactionID = isMoneyRequestAction(lastReportAction)
+                ? (getOriginalMessage(lastReportAction)?.IOUTransactionID ?? CONST.DEFAULT_NUMBER_ID)
+                : CONST.DEFAULT_NUMBER_ID;
             const lastReportActionTransaction = transactions?.[`${ONYXKEYS.COLLECTION.TRANSACTION}${lastReportActionTransactionID}`];
 
-            const lastActorAccountID = getReportActionActorAccountID(lastAction, undefined, item) ?? item.lastActorAccountID;
-            let lastActorDetails: Partial<PersonalDetails> | null = lastActorAccountID && personalDetails?.[lastActorAccountID] ? personalDetails[lastActorAccountID] : null;
-
-            if (!lastActorDetails && lastAction) {
-                const lastActorDisplayName = lastAction?.person?.[0]?.text;
+            // SidebarUtils.getOptionData in OptionRowLHNData does not get re-evaluated when the linked task report changes, so we have the lastMessageTextFromReport evaluation logic here
+            let lastActorDetails: Partial<PersonalDetails> | null = item?.lastActorAccountID && personalDetails?.[item.lastActorAccountID] ? personalDetails[item.lastActorAccountID] : null;
+            if (!lastActorDetails && lastReportAction) {
+                const lastActorDisplayName = lastReportAction?.person?.[0]?.text;
                 lastActorDetails = lastActorDisplayName
                     ? {
                           displayName: lastActorDisplayName,
-                          accountID: lastActorAccountID,
+                          accountID: item?.lastActorAccountID,
                       }
                     : null;
             }
-
-            const movedFromReport = reports?.[`${ONYXKEYS.COLLECTION.REPORT}${getMovedReportID(lastAction, CONST.REPORT.MOVE_TYPE.FROM)}`];
-            const movedToReport = reports?.[`${ONYXKEYS.COLLECTION.REPORT}${getMovedReportID(lastAction, CONST.REPORT.MOVE_TYPE.TO)}`];
+            const movedFromReport = reports?.[`${ONYXKEYS.COLLECTION.REPORT}${getMovedReportID(lastReportAction, CONST.REPORT.MOVE_TYPE.FROM)}`];
+            const movedToReport = reports?.[`${ONYXKEYS.COLLECTION.REPORT}${getMovedReportID(lastReportAction, CONST.REPORT.MOVE_TYPE.TO)}`];
             const itemReportMetadata = reportMetadataCollection?.[`${ONYXKEYS.COLLECTION.REPORT_METADATA}${reportID}`];
-
-            // For archived reports, always call getLastMessageTextForReport to get the archive reason message
-            // instead of using lastMessageText from the report
-            const lastMessageTextFromReport =
-                (isReportArchived ? undefined : item.lastMessageText) ??
-                getLastMessageTextForReport({
-                    translate,
-                    report: item,
-                    lastActorDetails,
-                    movedFromReport,
-                    movedToReport,
-                    policy: itemPolicy,
-                    isReportArchived,
-                    policyForMovingExpensesID,
-                    reportMetadata: itemReportMetadata,
-                    visibleReportActionsDataParam: visibleReportActionsData,
-                    lastAction,
-                });
+            const lastMessageTextFromReport = getLastMessageTextForReport({
+                report: item,
+                lastActorDetails,
+                movedFromReport,
+                movedToReport,
+                policy: itemPolicy,
+                isReportArchived: !!itemReportNameValuePairs?.private_isArchived,
+                policyForMovingExpensesID,
+                reportMetadata: itemReportMetadata,
+            });
 
             const shouldShowRBRorGBRTooltip = firstReportIDWithGBRorRBR === reportID;
 
+            let lastAction: ReportAction | undefined;
+            if (!itemReportActions || !item) {
+                lastAction = undefined;
+            } else {
+                const canUserPerformWriteAction = canUserPerformWriteActionUtil(item, isReportArchived);
+                const actionsArray = getSortedReportActions(Object.values(itemReportActions));
+                const reportActionsForDisplay = actionsArray.filter(
+                    (reportAction) => shouldReportActionBeVisibleAsLastAction(reportAction, canUserPerformWriteAction) && reportAction.actionName !== CONST.REPORT.ACTIONS.TYPE.CREATED,
+                );
+                lastAction = reportActionsForDisplay.at(-1);
+            }
+
             let lastActionReport: OnyxEntry<Report> | undefined;
             if (isInviteOrRemovedAction(lastAction)) {
                 const lastActionOriginalMessage = lastAction?.actionName ? getOriginalMessage(lastAction) : null;
@@ -296,7 +294,6 @@ function LHNOptionsList({style, contentContainerStyles, data, onSelectRow, optio
                     isReportArchived={isReportArchived}
                     lastAction={lastAction}
                     lastActionReport={lastActionReport}
-                    currentUserAccountID={currentUserAccountID}
                 />
             );
         },
@@ -326,8 +323,6 @@ function LHNOptionsList({style, contentContainerStyles, data, onSelectRow, optio
             isScreenFocused,
             localeCompare,
             translate,
-            visibleReportActionsData,
-            currentUserAccountID,
         ],
     );
 
diff --git a/src/components/LHNOptionsList/OptionRowLHNData.tsx b/src/components/LHNOptionsList/OptionRowLHNData.tsx
index b20daa3bc918..362146554059 100644
--- a/src/components/LHNOptionsList/OptionRowLHNData.tsx
+++ b/src/components/LHNOptionsList/OptionRowLHNData.tsx
@@ -41,7 +41,6 @@ function OptionRowLHNData({
     isReportArchived = false,
     lastAction,
     lastActionReport,
-    currentUserAccountID,
     ...propsToForward
 }: OptionRowLHNDataProps) {
     const reportID = propsToForward.reportID;
@@ -51,7 +50,6 @@ function OptionRowLHNData({
 
     const [movedFromReport] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${getMovedReportID(lastAction, CONST.REPORT.MOVE_TYPE.FROM)}`, {canBeMissing: true});
     const [movedToReport] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${getMovedReportID(lastAction, CONST.REPORT.MOVE_TYPE.TO)}`, {canBeMissing: true});
-    const [visibleReportActionsData] = useOnyx(ONYXKEYS.DERIVED.VISIBLE_REPORT_ACTIONS, {canBeMissing: true});
     // Check the report errors equality to avoid re-rendering when there are no changes
     const prevReportErrors = usePrevious(reportAttributes?.reportErrors);
     const areReportErrorsEqual = useMemo(() => deepEqual(prevReportErrors, reportAttributes?.reportErrors), [prevReportErrors, reportAttributes?.reportErrors]);
@@ -78,8 +76,6 @@ function OptionRowLHNData({
             lastActionReport,
             movedFromReport,
             movedToReport,
-            currentUserAccountID,
-            visibleReportActionsData,
         });
         if (deepEqual(item, optionItemRef.current)) {
             return optionItemRef.current;
@@ -115,8 +111,6 @@ function OptionRowLHNData({
         isReportArchived,
         movedFromReport,
         movedToReport,
-        currentUserAccountID,
-        visibleReportActionsData,
     ]);
 
     return (
diff --git a/src/components/LHNOptionsList/types.ts b/src/components/LHNOptionsList/types.ts
index 15d2b0c661bf..b40a3eadc9cf 100644
--- a/src/components/LHNOptionsList/types.ts
+++ b/src/components/LHNOptionsList/types.ts
@@ -141,9 +141,6 @@ type OptionRowLHNDataProps = {
     lastAction: ReportAction | undefined;
 
     lastActionReport: OnyxEntry<Report> | undefined;
-
-    /** The current user's account ID */
-    currentUserAccountID: number;
 };
 
 type OptionRowLHNProps = {
diff --git a/src/components/LottieAnimations/index.tsx b/src/components/LottieAnimations/index.tsx
index c1238221e472..b9e1410809cf 100644
--- a/src/components/LottieAnimations/index.tsx
+++ b/src/components/LottieAnimations/index.tsx
@@ -94,11 +94,6 @@ const DotLottieAnimations = {
         w: 375,
         h: 240,
     },
-    Fingerprint: {
-        file: require<LottieViewProps['source']>('@assets/animations/Fingerprint.lottie'),
-        w: 204,
-        h: 204,
-    },
 } satisfies Record<string, DotLottieAnimation>;
 
 export default DotLottieAnimations;
diff --git a/src/components/MagicCodeInput.tsx b/src/components/MagicCodeInput.tsx
index 2b8e42af119c..6741825dd2d2 100644
--- a/src/components/MagicCodeInput.tsx
+++ b/src/components/MagicCodeInput.tsx
@@ -4,7 +4,6 @@ import type {FocusEvent, TextInput as RNTextInput, TextInputKeyPressEvent} from
 import {StyleSheet, View} from 'react-native';
 import {Gesture, GestureDetector} from 'react-native-gesture-handler';
 import Animated, {useAnimatedStyle, useSharedValue, withDelay, withRepeat, withSequence, withTiming} from 'react-native-reanimated';
-import useLocalize from '@hooks/useLocalize';
 import useNetwork from '@hooks/useNetwork';
 import useStyleUtils from '@hooks/useStyleUtils';
 import useThemeStyles from '@hooks/useThemeStyles';
@@ -101,9 +100,6 @@ type MagicCodeInputProps = {
     /** TestID for test */
     testID?: string;
 
-    /** Accessibility label for the input */
-    accessibilityLabel?: string;
-
     /** Reference to the outer element */
     ref?: ForwardedRef<MagicCodeInputHandle>;
 };
@@ -154,12 +150,10 @@ function MagicCodeInput({
     autoComplete,
     hasError = false,
     testID = '',
-    accessibilityLabel,
     ref,
 }: MagicCodeInputProps) {
     const styles = useThemeStyles();
     const StyleUtils = useStyleUtils();
-    const {translate} = useLocalize();
     const inputRef = useRef<BaseTextInputRef | null>(null);
     const [input, setInput] = useState(TEXT_INPUT_EMPTY_STATE);
     const [focusedIndex, setFocusedIndex] = useState<number | undefined>(autoFocus ? 0 : undefined);
@@ -492,7 +486,7 @@ function MagicCodeInput({
                             }}
                             selectionColor="transparent"
                             inputStyle={[styles.inputTransparent]}
-                            accessibilityLabel={`${accessibilityLabel ?? translate('common.magicCode')}, ${maxLength} ${translate('common.digits')}`}
+                            role={CONST.ROLE.PRESENTATION}
                             style={[styles.inputTransparent]}
                             textInputContainerStyles={[styles.borderTransparent, styles.bgTransparent]}
                             testID={testID}
diff --git a/src/components/MenuItem.tsx b/src/components/MenuItem.tsx
index 23d5d73eb3d2..6d6d3a807f98 100644
--- a/src/components/MenuItem.tsx
+++ b/src/components/MenuItem.tsx
@@ -1,7 +1,7 @@
 import type {ImageContentFit} from 'expo-image';
 import type {ReactElement, ReactNode, Ref} from 'react';
 import React, {useContext, useMemo, useRef} from 'react';
-import type {GestureResponderEvent, Role, StyleProp, TextStyle, ViewStyle} from 'react-native';
+import type {GestureResponderEvent, StyleProp, TextStyle, ViewStyle} from 'react-native';
 import {View} from 'react-native';
 import type {ValueOf} from 'type-fest';
 import {useMemoizedLazyExpensifyIcons} from '@hooks/useLazyAsset';
@@ -36,6 +36,7 @@ import type {DisplayNameWithTooltip} from './DisplayNames/types';
 import FormHelpMessage from './FormHelpMessage';
 import Hoverable from './Hoverable';
 import Icon from './Icon';
+import * as Expensicons from './Icon/Expensicons';
 import {MenuItemGroupContext} from './MenuItemGroup';
 import PlaidCardFeedIcon from './PlaidCardFeedIcon';
 import type {PressableRef} from './Pressable/GenericPressable/types';
@@ -211,9 +212,6 @@ type MenuItemBaseProps = ForwardedFSClassProps &
         /** Text to display for the item */
         title?: string;
 
-        /** Accessibility label for the menu item */
-        accessibilityLabel?: string;
-
         /** Component to display as the title */
         titleComponent?: ReactElement;
 
@@ -403,23 +401,11 @@ type MenuItemBaseProps = ForwardedFSClassProps &
         /** Whether the screen containing the item is focused */
         isFocused?: boolean;
 
-        /** Additional styles for the root wrapper View */
-        rootWrapperStyle?: StyleProp<ViewStyle>;
-
-        /** The accessibility role to use for this menu item */
-        role?: Role;
-
         /** Whether to show the badge in a separate row */
         shouldShowBadgeInSeparateRow?: boolean;
 
         /** Whether to show the badge below the title */
         shouldShowBadgeBelow?: boolean;
-
-        /** Whether item should be accessible */
-        shouldBeAccessible?: boolean;
-
-        /** Whether item should be focusable with keyboard */
-        tabIndex?: 0 | -1;
     };
 
 type MenuItemProps = (IconProps | AvatarProps | NoIcon) & MenuItemBaseProps;
@@ -487,7 +473,6 @@ function MenuItem({
     focused = false,
     disabled = false,
     title,
-    accessibilityLabel,
     titleComponent,
     titleContainerStyle,
     subtitle,
@@ -553,12 +538,8 @@ function MenuItem({
     ref,
     isFocused,
     sentryLabel,
-    rootWrapperStyle,
-    role = CONST.ROLE.MENUITEM,
-    shouldBeAccessible = true,
-    tabIndex = 0,
 }: MenuItemProps) {
-    const icons = useMemoizedLazyExpensifyIcons(['ArrowRight', 'FallbackAvatar', 'DotIndicator', 'Checkmark']);
+    const icons = useMemoizedLazyExpensifyIcons(['ArrowRight', 'FallbackAvatar']);
     const theme = useTheme();
     const styles = useThemeStyles();
     const StyleUtils = useStyleUtils();
@@ -571,7 +552,6 @@ function MenuItem({
     const isCompact = viewMode === CONST.OPTION_MODE.COMPACT;
     const isDeleted = style && Array.isArray(style) ? style.includes(styles.offlineFeedbackDeleted) : false;
     const descriptionVerticalMargin = shouldShowDescriptionOnTop ? styles.mb1 : styles.mt1;
-    const defaultAccessibilityLabel = (shouldShowDescriptionOnTop ? [description, title] : [title, description]).filter(Boolean).join(', ');
 
     const combinedTitleTextStyle = StyleUtils.combineStyles<TextStyle>(
         [
@@ -709,10 +689,7 @@ function MenuItem({
     const isIDPassed = !!iconReportID || !!iconAccountID || iconAccountID === CONST.DEFAULT_NUMBER_ID;
 
     return (
-        <View
-            style={rootWrapperStyle}
-            onBlur={onBlur}
-        >
+        <View onBlur={onBlur}>
             {!!label && !isLabelHoverable && (
                 <View style={[styles.ph5, labelStyle]}>
                     <Text style={StyleUtils.combineStyles([styles.sidebarLinkText, styles.optionAlternateText, styles.textLabelSupporting, styles.pre])}>{label}</Text>
@@ -758,10 +735,9 @@ function MenuItem({
                                 disabledStyle={shouldUseDefaultCursorWhenDisabled && [styles.cursorDefault]}
                                 disabled={disabled || isExecuting}
                                 ref={mergeRefs(ref, popoverAnchor)}
-                                role={role}
-                                accessibilityLabel={accessibilityLabel ?? defaultAccessibilityLabel}
-                                accessible={shouldBeAccessible}
-                                tabIndex={tabIndex}
+                                role={CONST.ROLE.MENUITEM}
+                                accessibilityLabel={title ? title.toString() : ''}
+                                accessible
                                 onFocus={onFocus}
                                 sentryLabel={sentryLabel}
                             >
@@ -1003,7 +979,7 @@ function MenuItem({
                                                 {!!brickRoadIndicator && (
                                                     <View style={[styles.alignItemsCenter, styles.justifyContentCenter, styles.ml1]}>
                                                         <Icon
-                                                            src={icons.DotIndicator}
+                                                            src={Expensicons.DotIndicator}
                                                             fill={brickRoadIndicator === CONST.BRICK_ROAD_INDICATOR_STATUS.ERROR ? theme.danger : theme.success}
                                                         />
                                                     </View>
@@ -1035,7 +1011,7 @@ function MenuItem({
                                                 {shouldShowSelectedState && <SelectCircle isChecked={isSelected} />}
                                                 {shouldShowSelectedItemCheck && isSelected && (
                                                     <Icon
-                                                        src={icons.Checkmark}
+                                                        src={Expensicons.Checkmark}
                                                         fill={theme.iconSuccessFill}
                                                         additionalStyles={styles.alignSelfCenter}
                                                     />
diff --git a/src/components/MoneyReportHeader.tsx b/src/components/MoneyReportHeader.tsx
index 5ecd5a62ce26..11a7328031ae 100644
--- a/src/components/MoneyReportHeader.tsx
+++ b/src/components/MoneyReportHeader.tsx
@@ -24,7 +24,6 @@ import usePermissions from '@hooks/usePermissions';
 import usePolicy from '@hooks/usePolicy';
 import useReportIsArchived from '@hooks/useReportIsArchived';
 import useResponsiveLayout from '@hooks/useResponsiveLayout';
-import useResponsiveLayoutOnWideRHP from '@hooks/useResponsiveLayoutOnWideRHP';
 import useSearchShouldCalculateTotals from '@hooks/useSearchShouldCalculateTotals';
 import useSelectedTransactionsActions from '@hooks/useSelectedTransactionsActions';
 import useStrictPolicyRules from '@hooks/useStrictPolicyRules';
@@ -46,7 +45,7 @@ import Log from '@libs/Log';
 import {getThreadReportIDsForTransactions, getTotalAmountForIOUReportPreviewButton} from '@libs/MoneyRequestReportUtils';
 import Navigation from '@libs/Navigation/Navigation';
 import type {PlatformStackRouteProp} from '@libs/Navigation/PlatformStackNavigation/types';
-import type {ReportsSplitNavigatorParamList, RightModalNavigatorParamList} from '@libs/Navigation/types';
+import type {ReportsSplitNavigatorParamList, RightModalNavigatorParamList, SearchFullscreenNavigatorParamList} from '@libs/Navigation/types';
 import {
     buildOptimisticNextStepForDEWOfflineSubmission,
     buildOptimisticNextStepForDynamicExternalWorkflowError,
@@ -157,6 +156,7 @@ import ProcessMoneyReportHoldMenu from './ProcessMoneyReportHoldMenu';
 import {useSearchContext} from './Search/SearchContext';
 import AnimatedSettlementButton from './SettlementButton/AnimatedSettlementButton';
 import Text from './Text';
+import {WideRHPContext} from './WideRHPContextProvider';
 
 type MoneyReportHeaderProps = {
     /** The report currently being looked at */
@@ -197,8 +197,7 @@ function MoneyReportHeader({
     const shouldDisplayNarrowVersion = shouldUseNarrowLayout || isMediumScreenWidth;
     const route = useRoute<
         | PlatformStackRouteProp<ReportsSplitNavigatorParamList, typeof SCREENS.REPORT>
-        | PlatformStackRouteProp<RightModalNavigatorParamList, typeof SCREENS.RIGHT_MODAL.EXPENSE_REPORT>
-        | PlatformStackRouteProp<RightModalNavigatorParamList, typeof SCREENS.RIGHT_MODAL.SEARCH_MONEY_REQUEST_REPORT>
+        | PlatformStackRouteProp<SearchFullscreenNavigatorParamList, typeof SCREENS.SEARCH.MONEY_REQUEST_REPORT>
         | PlatformStackRouteProp<RightModalNavigatorParamList, typeof SCREENS.RIGHT_MODAL.SEARCH_REPORT>
     >();
     const {login: currentUserLogin, accountID, email} = useCurrentUserPersonalDetails();
@@ -399,14 +398,13 @@ function MoneyReportHeader({
         typeof CONST.REPORT.TRANSACTION_SECONDARY_ACTIONS.HOLD | typeof CONST.REPORT.TRANSACTION_SECONDARY_ACTIONS.REJECT | typeof CONST.REPORT.TRANSACTION_SECONDARY_ACTIONS.REJECT_BULK
     > | null>(null);
 
-    const {selectedTransactionIDs, removeTransaction, clearSelectedTransactions, currentSearchQueryJSON, currentSearchKey, currentSearchHash, currentSearchResults} = useSearchContext();
+    const {selectedTransactionIDs, removeTransaction, clearSelectedTransactions, currentSearchQueryJSON, currentSearchKey, currentSearchHash} = useSearchContext();
     const shouldCalculateTotals = useSearchShouldCalculateTotals(currentSearchKey, currentSearchQueryJSON?.similarSearchHash, true);
+    const [currentSearchResults] = useOnyx(`${ONYXKEYS.COLLECTION.SNAPSHOT}${currentSearchQueryJSON?.hash}`, {canBeMissing: true});
 
+    const {wideRHPRouteKeys} = useContext(WideRHPContext);
     const [network] = useOnyx(ONYXKEYS.NETWORK, {canBeMissing: true});
-
-    const {isWideRHPDisplayedOnWideLayout, isSuperWideRHPDisplayedOnWideLayout} = useResponsiveLayoutOnWideRHP();
-
-    const shouldDisplayNarrowMoreButton = !shouldDisplayNarrowVersion || isWideRHPDisplayedOnWideLayout || isSuperWideRHPDisplayedOnWideLayout;
+    const shouldDisplayNarrowMoreButton = !shouldDisplayNarrowVersion || (wideRHPRouteKeys.length > 0 && !isSmallScreenWidth);
 
     const showExportProgressModal = useCallback(() => {
         return showConfirmModal({
@@ -511,9 +509,9 @@ function MoneyReportHeader({
     const shouldShowLoadingBar = useLoadingBarVisibility();
     const kycWallRef = useContext(KYCWallContext);
 
-    const isReportInRHP = route.name !== SCREENS.REPORT;
+    const isReportInRHP = route.name === SCREENS.RIGHT_MODAL.SEARCH_REPORT;
     const shouldDisplaySearchRouter = !isReportInRHP || isSmallScreenWidth;
-    const isReportInSearch = route.name === SCREENS.RIGHT_MODAL.SEARCH_REPORT || route.name === SCREENS.RIGHT_MODAL.SEARCH_MONEY_REQUEST_REPORT;
+    const isReportInSearch = route.name === SCREENS.SEARCH.MONEY_REQUEST_REPORT;
     const isReportSubmitter = isCurrentUserSubmitter(chatIOUReport);
     const isChatReportDM = isDM(chatReport);
 
@@ -998,11 +996,6 @@ function MoneyReportHeader({
                 success
                 text={translate('iou.unhold')}
                 onPress={() => {
-                    if (isDelegateAccessRestricted) {
-                        showDelegateNoAccessModal();
-                        return;
-                    }
-
                     const parentReportAction = getReportAction(moneyRequestReport?.parentReportID, moneyRequestReport?.parentReportActionID);
 
                     const IOUActions = getAllExpensesToHoldIfApplicable(moneyRequestReport, reportActions, transactions, policy);
@@ -1280,11 +1273,6 @@ function MoneyReportHeader({
                     throw new Error('Parent action does not exist');
                 }
 
-                if (isDelegateAccessRestricted) {
-                    showDelegateNoAccessModal();
-                    return;
-                }
-
                 changeMoneyRequestHoldStatus(requestParentReportAction);
             },
         },
@@ -1413,8 +1401,8 @@ function MoneyReportHeader({
                 }
 
                 const result = await showConfirmModal({
-                    title: translate('iou.deleteReport'),
-                    prompt: translate('iou.deleteReportConfirmation'),
+                    title: translate('iou.deleteReport', {count: transactionCount}),
+                    prompt: translate('iou.deleteReportConfirmation', {count: transactionCount}),
                     confirmText: translate('common.delete'),
                     cancelText: translate('common.cancel'),
                     danger: true,
@@ -1428,7 +1416,7 @@ function MoneyReportHeader({
                     Navigation.goBack(backToRoute);
                     // eslint-disable-next-line @typescript-eslint/no-deprecated
                     InteractionManager.runAfterInteractions(() => {
-                        deleteAppReport(moneyRequestReport?.reportID, email ?? '', reportTransactions, allTransactionViolations, bankAccountList);
+                        deleteAppReport(moneyRequestReport?.reportID, email ?? '', reportTransactions, violations, bankAccountList);
                     });
                 });
             },
@@ -1561,9 +1549,7 @@ function MoneyReportHeader({
                 const backToRoute = route.params?.backTo ?? (chatReport?.reportID ? ROUTES.REPORT_WITH_ID.getRoute(chatReport.reportID) : undefined);
                 Navigation.goBack(backToRoute);
             }
-            // It has been handled like the rest of the delete cases. It will be refactored along with other cases.
-            // eslint-disable-next-line @typescript-eslint/no-deprecated
-            InteractionManager.runAfterInteractions(() => handleDeleteTransactions());
+            handleDeleteTransactions();
         });
     }, [showConfirmModal, translate, selectedTransactionIDs.length, transactions, handleDeleteTransactions, route.params?.backTo, chatReport?.reportID]);
 
@@ -1745,7 +1731,7 @@ function MoneyReportHeader({
                     {isReportInSearch && (
                         <MoneyRequestReportNavigation
                             reportID={moneyRequestReport?.reportID}
-                            shouldDisplayNarrowVersion={!shouldDisplayNarrowMoreButton}
+                            shouldDisplayNarrowVersion={shouldDisplayNarrowVersion}
                         />
                     )}
                 </View>
@@ -1762,7 +1748,6 @@ function MoneyReportHeader({
                     paymentType={paymentType}
                     chatReport={chatReport}
                     moneyRequestReport={moneyRequestReport}
-                    hasNonHeldExpenses={!hasOnlyHeldExpenses}
                     startAnimation={() => {
                         if (requestType === CONST.IOU.REPORT_ACTION_TYPE.APPROVE) {
                             startApprovedAnimation();
diff --git a/src/components/MoneyRequestAmountInput.tsx b/src/components/MoneyRequestAmountInput.tsx
index 0c30556f7512..f69f60be5dc0 100644
--- a/src/components/MoneyRequestAmountInput.tsx
+++ b/src/components/MoneyRequestAmountInput.tsx
@@ -167,7 +167,7 @@ function MoneyRequestAmountInput({
     disabled,
     ...props
 }: MoneyRequestAmountInputProps) {
-    const {preferredLocale, translate} = useLocalize();
+    const {preferredLocale} = useLocalize();
     const textInput = useRef<BaseTextInputRef | null>(null);
     const numberFormRef = useRef<NumberWithSymbolFormRef | null>(null);
     const decimals = getCurrencyDecimals(currency);
@@ -258,7 +258,6 @@ function MoneyRequestAmountInput({
             toggleNegative={toggleNegative}
             clearNegative={clearNegative}
             onFocus={props.onFocus}
-            accessibilityLabel={`${translate('iou.amount')} (${currency})`}
         />
     );
 }
diff --git a/src/components/MoneyRequestConfirmationList.tsx b/src/components/MoneyRequestConfirmationList.tsx
index d5e1ebbf7ff6..4da78c1ab818 100755
--- a/src/components/MoneyRequestConfirmationList.tsx
+++ b/src/components/MoneyRequestConfirmationList.tsx
@@ -3,7 +3,6 @@ import {deepEqual} from 'fast-equals';
 import React, {memo, useCallback, useContext, useEffect, useMemo, useRef, useState} from 'react';
 import {InteractionManager, View} from 'react-native';
 import type {OnyxEntry} from 'react-native-onyx';
-import useCurrencyList from '@hooks/useCurrencyList';
 import useCurrentUserPersonalDetails from '@hooks/useCurrentUserPersonalDetails';
 import useDebouncedState from '@hooks/useDebouncedState';
 import useLocalize from '@hooks/useLocalize';
@@ -31,7 +30,6 @@ import {
     setMoneyRequestTaxRate,
     setSplitShares,
 } from '@libs/actions/IOU';
-import {getIsMissingAttendeesViolation} from '@libs/AttendeeUtils';
 import {isCategoryDescriptionRequired} from '@libs/CategoryUtils';
 import {convertToBackendAmount, convertToDisplayString, convertToDisplayStringWithoutCurrency, getCurrencyDecimals} from '@libs/CurrencyUtils';
 import DistanceRequestUtils from '@libs/DistanceRequestUtils';
@@ -44,7 +42,6 @@ import {getTagLists, isTaxTrackingEnabled} from '@libs/PolicyUtils';
 import {isSelectedManagerMcTest} from '@libs/ReportUtils';
 import type {OptionData} from '@libs/ReportUtils';
 import {hasEnabledTags, hasMatchingTag} from '@libs/TagsOptionsListUtils';
-import {isValidTimeExpenseAmount} from '@libs/TimeTrackingUtils';
 import {
     areRequiredFieldsEmpty,
     calculateTaxAmount,
@@ -119,12 +116,6 @@ type MoneyRequestConfirmationListProps = {
     /** IOU isBillable */
     iouIsBillable?: boolean;
 
-    /** Time expense's hour count */
-    iouTimeCount?: number;
-
-    /** Time expense's hourly rate */
-    iouTimeRate?: number;
-
     /** Callback to toggle the billable state */
     onToggleBillable?: (isOn: boolean) => void;
 
@@ -262,27 +253,22 @@ function MoneyRequestConfirmationList({
     onToggleReimbursable,
     showRemoveExpenseConfirmModal,
     isTimeRequest = false,
-    iouTimeCount,
-    iouTimeRate,
 }: MoneyRequestConfirmationListProps) {
     const [policyCategoriesReal] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY_CATEGORIES}${policyID}`, {canBeMissing: true});
     const [policyTags] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY_TAGS}${policyID}`, {canBeMissing: true});
     const [policyReal] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY}${policyID}`, {canBeMissing: true});
-    const [transactionReport] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${transaction?.reportID}`, {canBeMissing: true});
     const [policyDraft] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY_DRAFTS}${policyID}`, {canBeMissing: true});
     const [defaultMileageRateDraft] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY_DRAFTS}${policyID}`, {
         selector: mileageRateSelector,
         canBeMissing: true,
     });
-    const {policyForMovingExpenses} = usePolicyForMovingExpenses();
-    const isMovingTransactionFromTrackExpense = isMovingTransactionFromTrackExpenseUtil(action);
     const [defaultMileageRateReal] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY}${policyID}`, {
         selector: mileageRateSelector,
         canBeMissing: true,
     });
     const [policyCategoriesDraft] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY_CATEGORIES_DRAFT}${policyID}`, {canBeMissing: true});
     const [lastSelectedDistanceRates] = useOnyx(ONYXKEYS.NVP_LAST_SELECTED_DISTANCE_RATES, {canBeMissing: true});
-    const {getCurrencySymbol} = useCurrencyList();
+    const [currencyList] = useOnyx(ONYXKEYS.CURRENCY_LIST, {canBeMissing: false});
     const {isBetaEnabled} = usePermissions();
     const {isDelegateAccessRestricted, showDelegateNoAccessModal} = useContext(DelegateNoAccessContext);
 
@@ -303,6 +289,7 @@ function MoneyRequestConfirmationList({
         isTestDriveReceipt || isManagerMcTestReceipt,
     );
 
+    const {policyForMovingExpenses} = usePolicyForMovingExpenses();
     const isTrackExpense = iouType === CONST.IOU.TYPE.TRACK;
     const policy = isTrackExpense ? policyForMovingExpenses : (policyReal ?? policyDraft);
     const policyCategories = policyCategoriesReal ?? policyCategoriesDraft;
@@ -320,6 +307,7 @@ function MoneyRequestConfirmationList({
     const isTypeInvoice = iouType === CONST.IOU.TYPE.INVOICE;
     const isScanRequest = useMemo(() => isScanRequestUtil(transaction), [transaction]);
     const isCreateExpenseFlow = !!transaction?.isFromGlobalCreate && !isPerDiemRequest;
+    const isMovingTransactionFromTrackExpense = isMovingTransactionFromTrackExpenseUtil(action);
 
     const transactionID = transaction?.transactionID;
     const customUnitRateID = getRateID(transaction);
@@ -359,22 +347,20 @@ function MoneyRequestConfirmationList({
         ? !policy || shouldSelectPolicy || hasEnabledOptions(Object.values(policyCategories ?? {}))
         : (isPolicyExpenseChat || isTypeInvoice) && (!!iouCategory || hasEnabledOptions(Object.values(policyCategories ?? {})));
 
-    const shouldShowMerchant = (shouldShowSmartScanFields || isTypeSend) && !isDistanceRequest && !isPerDiemRequest && !isTimeRequest;
+    const shouldShowMerchant = (shouldShowSmartScanFields || isTypeSend) && !isDistanceRequest && !isPerDiemRequest;
 
     const policyTagLists = useMemo(() => getTagLists(policyTags), [policyTags]);
 
-    const shouldShowTax = isTaxTrackingEnabled(isPolicyExpenseChat || isTrackExpense, policy, isDistanceRequest, isPerDiemRequest, isTimeRequest);
+    const shouldShowTax = isTaxTrackingEnabled(isPolicyExpenseChat, policy, isDistanceRequest, isPerDiemRequest, isTimeRequest);
 
     // Update the tax code when the default changes (for example, because the transaction currency changed)
-    const defaultTaxCode = getDefaultTaxCode(policy, transaction) ?? (isMovingTransactionFromTrackExpense ? (getDefaultTaxCode(policyForMovingExpenses, transaction) ?? '') : '');
-
+    const defaultTaxCode = getDefaultTaxCode(policy, transaction) ?? '';
     useEffect(() => {
-        if (!transactionID || isReadOnly || !shouldShowTax || isMovingTransactionFromTrackExpense) {
+        if (!transactionID || isReadOnly || !shouldShowTax) {
             return;
         }
         setMoneyRequestTaxRate(transactionID, defaultTaxCode);
-        // trigger this useEffect also when policyID changes - the defaultTaxCode may stay the same
-    }, [defaultTaxCode, isMovingTransactionFromTrackExpense, isReadOnly, transactionID, policyID, shouldShowTax]);
+    }, [defaultTaxCode, transactionID, isReadOnly, shouldShowTax]);
 
     const distance = getDistanceInMeters(transaction, unit);
     const prevDistance = usePrevious(distance);
@@ -425,8 +411,8 @@ function MoneyRequestConfirmationList({
             return false;
         }
 
-        return (!!hasSmartScanFailed && hasMissingSmartscanFields(transaction, transactionReport)) || (didConfirmSplit && areRequiredFieldsEmpty(transaction, transactionReport));
-    }, [isEditingSplitBill, hasSmartScanFailed, transaction, didConfirmSplit, transactionReport]);
+        return (!!hasSmartScanFailed && hasMissingSmartscanFields(transaction)) || (didConfirmSplit && areRequiredFieldsEmpty(transaction));
+    }, [isEditingSplitBill, hasSmartScanFailed, transaction, didConfirmSplit]);
 
     const isMerchantEmpty = useMemo(() => !iouMerchant || isMerchantMissing(transaction), [transaction, iouMerchant]);
     const isMerchantRequired = isPolicyExpenseChat && (!isScanRequest || isEditingSplitBill) && shouldShowMerchant;
@@ -447,20 +433,11 @@ function MoneyRequestConfirmationList({
             setFormError('iou.receiptScanningFailed');
             return;
         }
-        // Reset the form error whenever the screen gains or loses focus
-        // but preserve violation-related errors since those represent real validation issues
-        // that can only be fixed by changing the underlying data
-        if (!formError.startsWith(CONST.VIOLATIONS_PREFIX)) {
-            setFormError('');
-            return;
-        }
-        // Clear missingAttendees violation if user fixed it by changing category or attendees
-        const isMissingAttendeesViolation = getIsMissingAttendeesViolation(policyCategories, iouCategory, iouAttendees, currentUserPersonalDetails, policy?.isAttendeeTrackingEnabled);
-        if (formError === 'violations.missingAttendees' && !isMissingAttendeesViolation) {
-            setFormError('');
-        }
+        // reset the form error whenever the screen gains or loses focus
+        setFormError('');
+
         // eslint-disable-next-line react-hooks/exhaustive-deps -- we don't want this effect to run if it's just setFormError that changes
-    }, [isFocused, shouldDisplayFieldError, hasSmartScanFailed, didConfirmSplit, iouCategory, iouAttendees, policyCategories, currentUserPersonalDetails, policy?.isAttendeeTrackingEnabled]);
+    }, [isFocused, shouldDisplayFieldError, hasSmartScanFailed, didConfirmSplit]);
 
     useEffect(() => {
         // We want this effect to run only when the transaction is moving from Self DM to a expense chat
@@ -534,22 +511,15 @@ function MoneyRequestConfirmationList({
 
     // Calculate and set tax amount in transaction draft
     const taxableAmount = isDistanceRequest ? DistanceRequestUtils.getTaxableAmount(policy, customUnitRateID, distance) : (transaction?.amount ?? 0);
-    // First we'll try to get the tax value from the chosen policy and if not found, we'll try to get it from the policy for moving expenses (only if the transaction is moving from track expense)
-    const taxPercentage =
-        getTaxValue(policy, transaction, transaction?.taxCode ?? defaultTaxCode) ??
-        (isMovingTransactionFromTrackExpense ? getTaxValue(policyForMovingExpenses, transaction, transaction?.taxCode ?? defaultTaxCode) : '');
-    const taxAmount =
-        isMovingTransactionFromTrackExpense && transaction?.taxAmount
-            ? Math.abs(transaction?.taxAmount ?? 0)
-            : calculateTaxAmount(taxPercentage, taxableAmount, transaction?.currency ?? CONST.CURRENCY.USD);
-
+    const taxPercentage = getTaxValue(policy, transaction, transaction?.taxCode ?? defaultTaxCode) ?? '';
+    const taxAmount = calculateTaxAmount(taxPercentage, taxableAmount, transaction?.currency ?? CONST.CURRENCY.USD);
     const taxAmountInSmallestCurrencyUnits = convertToBackendAmount(Number.parseFloat(taxAmount.toString()));
     useEffect(() => {
-        if (!transactionID || isReadOnly || !shouldShowTax || isMovingTransactionFromTrackExpense) {
+        if (!transactionID || isReadOnly || !shouldShowTax) {
             return;
         }
         setMoneyRequestTaxAmount(transactionID, taxAmountInSmallestCurrencyUnits);
-    }, [transactionID, taxAmountInSmallestCurrencyUnits, isReadOnly, shouldShowTax, isMovingTransactionFromTrackExpense]);
+    }, [transactionID, taxAmountInSmallestCurrencyUnits, isReadOnly, shouldShowTax]);
 
     // If completing a split expense fails, set didConfirm to false to allow the user to edit the fields again
     if (isEditingSplitBill && didConfirm) {
@@ -582,12 +552,9 @@ function MoneyRequestConfirmationList({
             if (iouAmount !== 0) {
                 text = translate('iou.createExpenseWithAmount', {amount: formattedAmount});
             }
-        } else if (isTypeSplit) {
-            text = translate('iou.splitAmount', {amount: formattedAmount});
-        } else if (iouAmount === 0) {
-            text = translate('iou.createExpense');
         } else {
-            text = translate('iou.createExpenseWithAmount', {amount: formattedAmount});
+            const translationKey = isTypeSplit ? 'iou.splitAmount' : 'iou.createExpenseWithAmount';
+            text = translate(translationKey, {amount: formattedAmount});
         }
         return [
             {
@@ -693,7 +660,7 @@ function MoneyRequestConfirmationList({
             });
         }
 
-        const currencySymbol = getCurrencySymbol(iouCurrencyCode ?? '') ?? iouCurrencyCode;
+        const currencySymbol = currencyList?.[iouCurrencyCode ?? '']?.symbol ?? iouCurrencyCode;
         const formattedTotalAmount = convertToDisplayStringWithoutCurrency(iouAmount, iouCurrencyCode);
 
         return [payeeOption, ...selectedParticipants].map((participantOption: Participant) => ({
@@ -731,6 +698,7 @@ function MoneyRequestConfirmationList({
         isTypeSplit,
         payeePersonalDetails,
         shouldShowReadOnlySplits,
+        currencyList,
         iouCurrencyCode,
         iouAmount,
         selectedParticipants,
@@ -747,7 +715,6 @@ function MoneyRequestConfirmationList({
         transaction?.comment?.splits,
         transaction?.splitShares,
         onSplitShareChange,
-        getCurrencySymbol,
     ]);
 
     const isSplitModified = useMemo(() => {
@@ -851,7 +818,7 @@ function MoneyRequestConfirmationList({
         */
         setMoneyRequestPendingFields(transactionID, {waypoints: isDistanceRequestWithPendingRoute ? CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD : null});
 
-        const distanceMerchant = DistanceRequestUtils.getDistanceMerchant(hasRoute, distance, unit, rate ?? 0, currency ?? CONST.CURRENCY.USD, translate, toLocaleDigit, getCurrencySymbol);
+        const distanceMerchant = DistanceRequestUtils.getDistanceMerchant(hasRoute, distance, unit, rate ?? 0, currency ?? CONST.CURRENCY.USD, translate, toLocaleDigit);
         setMoneyRequestMerchant(transactionID, distanceMerchant, true);
     }, [
         isDistanceRequestWithPendingRoute,
@@ -869,7 +836,6 @@ function MoneyRequestConfirmationList({
         action,
         isReadOnly,
         isMovingTransactionFromTrackExpense,
-        getCurrencySymbol,
     ]);
 
     // Auto select the category if there is only one enabled category and it is required
@@ -878,7 +844,7 @@ function MoneyRequestConfirmationList({
         if (!transactionID || iouCategory || !shouldShowCategories || enabledCategories.length !== 1 || !isCategoryRequired) {
             return;
         }
-        setMoneyRequestCategory(transactionID, enabledCategories.at(0)?.name ?? '', policy, isMovingTransactionFromTrackExpense);
+        setMoneyRequestCategory(transactionID, enabledCategories.at(0)?.name ?? '', policy);
         // Keep 'transaction' out to ensure that we auto select the option only once
         // eslint-disable-next-line react-hooks/exhaustive-deps
     }, [shouldShowCategories, policyCategories, isCategoryRequired, policy?.id]);
@@ -962,20 +928,6 @@ function MoneyRequestConfirmationList({
                 return;
             }
 
-            // Since invoices are not expense reports that need attendee tracking, this validation should not apply to invoices
-            const isMissingAttendeesViolation =
-                iouType !== CONST.IOU.TYPE.INVOICE &&
-                getIsMissingAttendeesViolation(policyCategories, iouCategory, iouAttendees, currentUserPersonalDetails, policy?.isAttendeeTrackingEnabled);
-            if (isMissingAttendeesViolation) {
-                setFormError('violations.missingAttendees');
-                return;
-            }
-
-            if (shouldShowTax && !!transaction.taxCode && !Object.keys(policy?.taxRates?.taxes ?? {}).some((key) => key === transaction.taxCode)) {
-                setFormError('violations.taxOutOfPolicy');
-                return;
-            }
-
             if (isPerDiemRequest && (transaction.comment?.customUnit?.subRates ?? []).length === 0) {
                 setFormError('iou.error.invalidSubrateLength');
                 return;
@@ -989,11 +941,6 @@ function MoneyRequestConfirmationList({
                     return;
                 }
 
-                if (isTimeRequest && !isValidTimeExpenseAmount(iouAmount, iouCurrencyCode)) {
-                    setFormError('iou.timeTracking.amountTooLargeError');
-                    return;
-                }
-
                 if (isPerDiemRequest) {
                     if (!isValidPerDiemExpenseAmount(transaction.comment?.customUnit ?? {}, iouCurrencyCode)) {
                         setFormError('iou.error.invalidQuantity');
@@ -1001,17 +948,12 @@ function MoneyRequestConfirmationList({
                     }
                 }
 
-                if (isEditingSplitBill && areRequiredFieldsEmpty(transaction, transactionReport)) {
+                if (isEditingSplitBill && areRequiredFieldsEmpty(transaction)) {
                     setDidConfirmSplit(true);
                     setFormError('iou.error.genericSmartscanFailureMessage');
                     return;
                 }
 
-                if (isEditingSplitBill && iouAmount === 0) {
-                    setFormError('iou.error.invalidAmount');
-                    return;
-                }
-
                 if (formError) {
                     return;
                 }
@@ -1043,7 +985,6 @@ function MoneyRequestConfirmationList({
             isMerchantRequired,
             isMerchantEmpty,
             shouldDisplayFieldError,
-            shouldShowTax,
             transaction,
             policyTags,
             isPerDiemRequest,
@@ -1060,10 +1001,6 @@ function MoneyRequestConfirmationList({
             showDelegateNoAccessModal,
             iouCategory,
             policyCategories,
-            transactionReport,
-            iouAttendees,
-            currentUserPersonalDetails,
-            isTimeRequest,
         ],
     );
 
@@ -1087,10 +1024,6 @@ function MoneyRequestConfirmationList({
         if (isTypeSplit && !shouldShowReadOnlySplits) {
             return debouncedFormError && translate(debouncedFormError);
         }
-        // Don't show error at the bottom of the form for missing attendees
-        if (formError === 'violations.missingAttendees') {
-            return;
-        }
         return formError && translate(formError);
     }, [routeError, isTypeSplit, shouldShowReadOnlySplits, debouncedFormError, formError, translate]);
 
@@ -1213,14 +1146,11 @@ function MoneyRequestConfirmationList({
             iouIsBillable={iouIsBillable}
             iouMerchant={iouMerchant}
             iouType={iouType}
-            iouTimeCount={iouTimeCount}
-            iouTimeRate={iouTimeRate}
             isCategoryRequired={isCategoryRequired}
             isDistanceRequest={isDistanceRequest}
             isManualDistanceRequest={isManualDistanceRequest}
             isOdometerDistanceRequest={isOdometerDistanceRequest}
             isPerDiemRequest={isPerDiemRequest}
-            isTimeRequest={isTimeRequest}
             isMerchantEmpty={isMerchantEmpty}
             isMerchantRequired={isMerchantRequired}
             isPolicyExpenseChat={isPolicyExpenseChat}
@@ -1308,7 +1238,5 @@ export default memo(
         prevProps.reportActionID === nextProps.reportActionID &&
         prevProps.action === nextProps.action &&
         prevProps.shouldDisplayReceipt === nextProps.shouldDisplayReceipt &&
-        prevProps.isTimeRequest === nextProps.isTimeRequest &&
-        prevProps.iouTimeCount === nextProps.iouTimeCount &&
-        prevProps.iouTimeRate === nextProps.iouTimeRate,
+        prevProps.isTimeRequest === nextProps.isTimeRequest,
 );
diff --git a/src/components/MoneyRequestConfirmationListFooter.tsx b/src/components/MoneyRequestConfirmationListFooter.tsx
index e22ecd75bd80..bce89a190df1 100644
--- a/src/components/MoneyRequestConfirmationListFooter.tsx
+++ b/src/components/MoneyRequestConfirmationListFooter.tsx
@@ -6,27 +6,24 @@ import React, {memo, useMemo} from 'react';
 import {View} from 'react-native';
 import type {OnyxEntry} from 'react-native-onyx';
 import type {ValueOf} from 'type-fest';
-import useCurrencyList from '@hooks/useCurrencyList';
-import useCurrentUserPersonalDetails from '@hooks/useCurrentUserPersonalDetails';
 import {useMemoizedLazyExpensifyIcons} from '@hooks/useLazyAsset';
 import useLocalize from '@hooks/useLocalize';
 import useNetwork from '@hooks/useNetwork';
 import useOnyx from '@hooks/useOnyx';
-import useOutstandingReports from '@hooks/useOutstandingReports';
 import usePolicyForMovingExpenses from '@hooks/usePolicyForMovingExpenses';
 import usePrevious from '@hooks/usePrevious';
 import useThemeStyles from '@hooks/useThemeStyles';
 import {getDecodedCategoryName} from '@libs/CategoryUtils';
 import {convertToDisplayString} from '@libs/CurrencyUtils';
 import DistanceRequestUtils from '@libs/DistanceRequestUtils';
-import {isMovingTransactionFromTrackExpense, shouldShowReceiptEmptyState} from '@libs/IOUUtils';
+import {shouldShowReceiptEmptyState} from '@libs/IOUUtils';
 import Navigation from '@libs/Navigation/Navigation';
 import {getDestinationForDisplay, getSubratesFields, getSubratesForDisplay, getTimeDifferenceIntervals, getTimeForDisplay} from '@libs/PerDiemRequestUtils';
 import {canSendInvoice, getPerDiemCustomUnit} from '@libs/PolicyUtils';
 import type {ThumbnailAndImageURI} from '@libs/ReceiptUtils';
 import {getThumbnailAndImageURIs} from '@libs/ReceiptUtils';
 import {computeReportName} from '@libs/ReportNameUtils';
-import {generateReportID, getDefaultWorkspaceAvatar, getOutstandingReportsForUser, isMoneyRequestReport, isReportOutstanding} from '@libs/ReportUtils';
+import {generateReportID, getDefaultWorkspaceAvatar, getOutstandingReportsForUser, isArchivedReport, isMoneyRequestReport, isReportOutstanding} from '@libs/ReportUtils';
 import {getTagVisibility, hasEnabledTags} from '@libs/TagsOptionsListUtils';
 import {
     getTagForDisplay,
@@ -44,6 +41,7 @@ import CONST from '@src/CONST';
 import type {IOUAction, IOUType} from '@src/CONST';
 import ONYXKEYS from '@src/ONYXKEYS';
 import ROUTES from '@src/ROUTES';
+import type {Route} from '@src/ROUTES';
 import type * as OnyxTypes from '@src/types/onyx';
 import type {Attendee, Participant} from '@src/types/onyx/IOU';
 import type {Unit} from '@src/types/onyx/Policy';
@@ -105,12 +103,6 @@ type MoneyRequestConfirmationListFooterProps = {
     /** The merchant of the IOU */
     iouMerchant: string | undefined;
 
-    /** The hours count of the time request */
-    iouTimeCount: number | undefined;
-
-    /** The hourly rate of the time request */
-    iouTimeRate: number | undefined;
-
     /** The type of the IOU */
     iouType: Exclude<IOUType, typeof CONST.IOU.TYPE.REQUEST | typeof CONST.IOU.TYPE.SEND>;
 
@@ -129,9 +121,6 @@ type MoneyRequestConfirmationListFooterProps = {
     /** Flag indicating if it is a per diem request */
     isPerDiemRequest: boolean;
 
-    /** Flag indicating if it is a time request */
-    isTimeRequest: boolean;
-
     /** Flag indicating if the merchant is empty */
     isMerchantEmpty: boolean;
 
@@ -243,14 +232,11 @@ function MoneyRequestConfirmationListFooter({
     iouIsBillable,
     iouMerchant,
     iouType,
-    iouTimeCount,
-    iouTimeRate,
     isCategoryRequired,
     isDistanceRequest,
     isManualDistanceRequest,
     isOdometerDistanceRequest = false,
     isPerDiemRequest,
-    isTimeRequest,
     isMerchantEmpty,
     isMerchantRequired,
     isPolicyExpenseChat,
@@ -286,7 +272,6 @@ function MoneyRequestConfirmationListFooter({
     const icons = useMemoizedLazyExpensifyIcons(['Stopwatch', 'CalendarSolid']);
     const styles = useThemeStyles();
     const {translate, toLocaleDigit, localeCompare} = useLocalize();
-    const {getCurrencySymbol} = useCurrencyList();
     const {isOffline} = useNetwork();
 
     const [allPolicies] = useOnyx(ONYXKEYS.COLLECTION.POLICY, {canBeMissing: true});
@@ -295,15 +280,23 @@ function MoneyRequestConfirmationListFooter({
     const [outstandingReportsByPolicyID] = useOnyx(ONYXKEYS.DERIVED.OUTSTANDING_REPORTS_BY_POLICY_ID, {
         canBeMissing: true,
     });
-    const {policyForMovingExpensesID, policyForMovingExpenses, shouldSelectPolicy} = usePolicyForMovingExpenses();
+    const {policyForMovingExpensesID, shouldSelectPolicy} = usePolicyForMovingExpenses();
 
     const [currentUserLogin] = useOnyx(ONYXKEYS.SESSION, {selector: emailSelector, canBeMissing: true});
-    const {accountID: currentUserAccountID} = useCurrentUserPersonalDetails();
     const isUnreported = transaction?.reportID === CONST.REPORT.UNREPORTED_REPORT_ID;
     const isCreatingTrackExpense = action === CONST.IOU.ACTION.CREATE && iouType === CONST.IOU.TYPE.TRACK;
 
     const decodedCategoryName = useMemo(() => getDecodedCategoryName(iouCategory), [iouCategory]);
 
+    const allOutstandingReports = useMemo(() => {
+        const outstandingReports = Object.values(outstandingReportsByPolicyID ?? {}).flatMap((outstandingReportsPolicy) => Object.values(outstandingReportsPolicy ?? {}));
+
+        return outstandingReports.filter((report) => {
+            const reportNameValuePair = reportNameValuePairs?.[`${ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS}${report?.reportID}`];
+            return !isArchivedReport(reportNameValuePair) && isReportOutstanding(report, report?.policyID, reportNameValuePairs, false);
+        });
+    }, [outstandingReportsByPolicyID, reportNameValuePairs]);
+
     const isTrackExpense = iouType === CONST.IOU.TYPE.TRACK;
     const shouldShowTags = useMemo(
         () => (isPolicyExpenseChat || isUnreported || isCreatingTrackExpense) && hasEnabledTags(policyTagLists),
@@ -358,20 +351,20 @@ function MoneyRequestConfirmationListFooter({
     }, [allReports, shouldUseTransactionReport, transaction?.reportID, outstandingReportID]);
 
     const reportName = useMemo(() => {
-        const name = computeReportName(selectedReport, allReports, allPolicies, undefined, undefined, undefined, undefined, currentUserAccountID);
+        const name = computeReportName(selectedReport, allReports, allPolicies);
         if (!name) {
             return isUnreported ? translate('common.none') : translate('iou.newReport');
         }
         return name;
-    }, [isUnreported, selectedReport, allReports, allPolicies, translate, currentUserAccountID]);
+    }, [isUnreported, selectedReport, allReports, allPolicies, translate]);
+
+    const shouldReportBeEditableFromFAB = isUnreported ? allOutstandingReports.length >= 1 : allOutstandingReports.length > 1;
 
-    const outstandingReports = useOutstandingReports(undefined, isFromGlobalCreate && !isPerDiemRequest ? undefined : policyID, ownerAccountID, false);
     // When creating an expense in an individual report, the report field becomes read-only
     // since the destination is already determined and there's no need to show a selectable list.
-    const shouldReportBeEditable = (isUnreported ? outstandingReports.length >= 1 : outstandingReports.length > 1) && !isMoneyRequestReport(reportID, allReports);
-
-    const isMovingCurrentTransactionFromTrackExpense = isMovingTransactionFromTrackExpense(action);
-    const taxRates = policy?.taxRates ?? (isMovingCurrentTransactionFromTrackExpense ? policyForMovingExpenses?.taxRates : null);
+    const shouldReportBeEditable =
+        (isFromGlobalCreate && !isPerDiemRequest ? shouldReportBeEditableFromFAB : availableOutstandingReports.length > 1) && !isMoneyRequestReport(reportID, allReports);
+    const taxRates = policy?.taxRates ?? null;
     // In Send Money and Split Bill with Scan flow, we don't allow the Merchant or Date to be edited. For distance requests, don't show the merchant as there's already another "Distance" menu item
     const shouldShowDate = shouldShowSmartScanFields || isDistanceRequest;
     // Determines whether the tax fields can be modified.
@@ -386,21 +379,12 @@ function MoneyRequestConfirmationListFooter({
     const taxAmount = getTaxAmount(transaction, false);
     const formattedTaxAmount = convertToDisplayString(taxAmount, iouCurrencyCode);
     // Get the tax rate title based on the policy and transaction
-    let taxRateTitle;
-    if (getTaxName(policy, transaction)) {
-        taxRateTitle = getTaxName(policy, transaction);
-    } else if (isMovingCurrentTransactionFromTrackExpense) {
-        taxRateTitle = getTaxName(policyForMovingExpenses, transaction);
-    } else {
-        taxRateTitle = '';
-    }
+    const taxRateTitle = getTaxName(policy, transaction);
     // Determine if the merchant error should be displayed
     const shouldDisplayMerchantError = isMerchantRequired && (shouldDisplayFieldError || formError === 'iou.error.invalidMerchant') && isMerchantEmpty;
     const shouldDisplayDistanceRateError = formError === 'iou.error.invalidRate';
     const shouldDisplayTagError = formError === 'violations.tagOutOfPolicy';
-    const shouldDisplayTaxRateError = formError === 'violations.taxOutOfPolicy';
     const shouldDisplayCategoryError = formError === 'violations.categoryOutOfPolicy';
-    const shouldDisplayAttendeesError = formError === 'violations.missingAttendees';
 
     const showReceiptEmptyState = shouldShowReceiptEmptyState(iouType, action, policy, isPerDiemRequest);
     // The per diem custom unit
@@ -451,12 +435,12 @@ function MoneyRequestConfirmationListFooter({
             item: (
                 <MenuItemWithTopDescription
                     key={translate('iou.amount')}
-                    shouldShowRightIcon={!isReadOnly && !isDistanceRequest && !isTimeRequest}
+                    shouldShowRightIcon={!isReadOnly && !isDistanceRequest}
                     title={formattedAmount}
                     description={translate('iou.amount')}
-                    interactive={!isReadOnly && !isTimeRequest}
+                    interactive={!isReadOnly}
                     onPress={() => {
-                        if (isDistanceRequest || isTimeRequest || !transactionID) {
+                        if (isDistanceRequest || !transactionID) {
                             return;
                         }
 
@@ -526,7 +510,7 @@ function MoneyRequestConfirmationListFooter({
                         }
 
                         if (isOdometerDistanceRequest) {
-                            Navigation.navigate(ROUTES.MONEY_REQUEST_STEP_DISTANCE_ODOMETER.getRoute(action, iouType, transactionID, reportID));
+                            Navigation.navigate(ROUTES.MONEY_REQUEST_STEP_DISTANCE_ODOMETER.getRoute(action, iouType, transactionID, reportID, Navigation.getActiveRoute()) as Route);
                             return;
                         }
 
@@ -543,7 +527,7 @@ function MoneyRequestConfirmationListFooter({
                 <MenuItemWithTopDescription
                     key={translate('common.rate')}
                     shouldShowRightIcon={!!rate && !isReadOnly && iouType !== CONST.IOU.TYPE.SPLIT && !isUnreported}
-                    title={DistanceRequestUtils.getRateForDisplay(unit, rate, currency, translate, toLocaleDigit, getCurrencySymbol, isOffline)}
+                    title={DistanceRequestUtils.getRateForDisplay(unit, rate, currency, translate, toLocaleDigit, isOffline)}
                     description={translate('common.rate')}
                     style={[styles.moneyRequestMenuItem]}
                     titleStyle={styles.flex1}
@@ -601,48 +585,6 @@ function MoneyRequestConfirmationListFooter({
             ),
             shouldShow: shouldShowMerchant,
         },
-        {
-            item: (
-                <MenuItemWithTopDescription
-                    key={translate('iou.timeTracking.hours')}
-                    shouldShowRightIcon={!isReadOnly}
-                    title={`${iouTimeCount}`}
-                    description={translate('iou.timeTracking.hours')}
-                    style={styles.moneyRequestMenuItem}
-                    titleStyle={styles.flex1}
-                    onPress={() => {
-                        if (!transactionID) {
-                            return;
-                        }
-                        Navigation.navigate(ROUTES.MONEY_REQUEST_STEP_HOURS.getRoute(action, iouType, transactionID, reportID, reportActionID));
-                    }}
-                    disabled={didConfirm}
-                    interactive={!isReadOnly}
-                />
-            ),
-            shouldShow: isTimeRequest,
-        },
-        {
-            item: (
-                <MenuItemWithTopDescription
-                    key={`time_${translate('common.rate')}`}
-                    shouldShowRightIcon={!isReadOnly}
-                    title={translate('iou.timeTracking.ratePreview', convertToDisplayString(iouTimeRate, iouCurrencyCode))}
-                    description={translate('common.rate')}
-                    style={styles.moneyRequestMenuItem}
-                    titleStyle={styles.flex1}
-                    onPress={() => {
-                        if (!transactionID) {
-                            return;
-                        }
-                        Navigation.navigate(ROUTES.MONEY_REQUEST_STEP_TIME_RATE.getRoute(action, iouType, transactionID, reportID, reportActionID));
-                    }}
-                    disabled={didConfirm}
-                    interactive={!isReadOnly}
-                />
-            ),
-            shouldShow: isTimeRequest,
-        },
         {
             item: (
                 <MenuItemWithTopDescription
@@ -765,8 +707,6 @@ function MoneyRequestConfirmationListFooter({
                     }}
                     disabled={didConfirm}
                     interactive={canModifyTaxFields}
-                    brickRoadIndicator={shouldDisplayTaxRateError ? CONST.BRICK_ROAD_INDICATOR_STATUS.ERROR : undefined}
-                    errorText={shouldDisplayTaxRateError ? translate(formError) : ''}
                 />
             ),
             shouldShow: shouldShowTax,
@@ -797,7 +737,7 @@ function MoneyRequestConfirmationListFooter({
             item: (
                 <MenuItemWithTopDescription
                     key="attendees"
-                    shouldShowRightIcon={!isReadOnly}
+                    shouldShowRightIcon
                     title={iouAttendees?.map((item) => item?.displayName ?? item?.login).join(', ')}
                     description={`${translate('iou.attendees')} ${
                         iouAttendees?.length && iouAttendees.length > 1 && formattedAmountPerAttendee ? `\u00B7 ${formattedAmountPerAttendee} ${translate('common.perPerson')}` : ''
@@ -811,10 +751,8 @@ function MoneyRequestConfirmationListFooter({
 
                         Navigation.navigate(ROUTES.MONEY_REQUEST_ATTENDEE.getRoute(action, iouType, transactionID, reportID, Navigation.getActiveRoute()));
                     }}
-                    interactive={!isReadOnly}
+                    interactive
                     shouldRenderAsHTML
-                    brickRoadIndicator={shouldDisplayAttendeesError ? CONST.BRICK_ROAD_INDICATOR_STATUS.ERROR : undefined}
-                    errorText={shouldDisplayAttendeesError ? translate(formError) : ''}
                 />
             ),
             shouldShow: shouldShowAttendees,
@@ -1168,8 +1106,5 @@ export default memo(
         prevProps.shouldShowTax === nextProps.shouldShowTax &&
         prevProps.transaction === nextProps.transaction &&
         prevProps.transactionID === nextProps.transactionID &&
-        prevProps.unit === nextProps.unit &&
-        prevProps.isTimeRequest === nextProps.isTimeRequest &&
-        prevProps.iouTimeCount === nextProps.iouTimeCount &&
-        prevProps.iouTimeRate === nextProps.iouTimeRate,
+        prevProps.unit === nextProps.unit,
 );
diff --git a/src/components/MoneyRequestHeader.tsx b/src/components/MoneyRequestHeader.tsx
index 4d76735f1acb..50808f30e565 100644
--- a/src/components/MoneyRequestHeader.tsx
+++ b/src/components/MoneyRequestHeader.tsx
@@ -99,7 +99,7 @@ type MoneyRequestHeaderProps = {
 function MoneyRequestHeader({report, parentReportAction, policy, onBackButtonPress}: MoneyRequestHeaderProps) {
     // We need to use isSmallScreenWidth instead of shouldUseNarrowLayout to use a correct layout for the hold expense modal https://github.com/Expensify/App/pull/47990#issuecomment-2362382026
     // eslint-disable-next-line rulesdir/prefer-shouldUseNarrowLayout-instead-of-isSmallScreenWidth
-    const {shouldUseNarrowLayout, isSmallScreenWidth, isInNarrowPaneModal} = useResponsiveLayout();
+    const {shouldUseNarrowLayout, isSmallScreenWidth} = useResponsiveLayout();
     const route = useRoute<
         PlatformStackRouteProp<ReportsSplitNavigatorParamList, typeof SCREENS.REPORT> | PlatformStackRouteProp<RightModalNavigatorParamList, typeof SCREENS.RIGHT_MODAL.SEARCH_REPORT>
     >();
@@ -117,7 +117,6 @@ function MoneyRequestHeader({report, parentReportAction, policy, onBackButtonPre
     const [transactionReport] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${getNonEmptyStringOnyxID(transaction?.reportID)}`, {canBeMissing: true});
     const [policyCategories] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY_CATEGORIES}${getNonEmptyStringOnyxID(transactionReport?.policyID)}`, {canBeMissing: true});
     const [allPolicyCategories] = useOnyx(ONYXKEYS.COLLECTION.POLICY_CATEGORIES, {canBeMissing: false});
-    const [allTransactionViolations] = useOnyx(ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS, {canBeMissing: true});
     const transactionViolations = useTransactionViolations(transaction?.transactionID);
     const [policyRecentlyUsedCurrencies] = useOnyx(ONYXKEYS.RECENTLY_USED_CURRENCIES, {canBeMissing: true});
     const {duplicateTransactions, duplicateTransactionViolations} = useDuplicateTransactionsAndViolations(transaction?.transactionID ? [transaction.transactionID] : []);
@@ -264,11 +263,6 @@ function MoneyRequestHeader({report, parentReportAction, policy, onBackButtonPre
                 success
                 text={translate('iou.unhold')}
                 onPress={() => {
-                    if (isDelegateAccessRestricted) {
-                        showDelegateNoAccessModal();
-                        return;
-                    }
-
                     changeMoneyRequestHoldStatus(parentReportAction);
                 }}
             />
@@ -331,8 +325,8 @@ function MoneyRequestHeader({report, parentReportAction, policy, onBackButtonPre
         if (!transaction || !parentReportAction || !parentReport) {
             return [];
         }
-        return getSecondaryTransactionThreadActions(currentUserLogin ?? '', accountID, parentReport, transaction, parentReportAction, originalTransaction, policy, report);
-    }, [parentReport, transaction, parentReportAction, currentUserLogin, policy, report, originalTransaction, accountID]);
+        return getSecondaryTransactionThreadActions(currentUserLogin ?? '', parentReport, transaction, parentReportAction, originalTransaction, policy, report);
+    }, [parentReport, transaction, parentReportAction, currentUserLogin, policy, report, originalTransaction]);
 
     const dismissModalAndUpdateUseHold = () => {
         setIsHoldEducationalModalVisible(false);
@@ -393,11 +387,6 @@ function MoneyRequestHeader({report, parentReportAction, policy, onBackButtonPre
                     throw new Error('Parent action does not exist');
                 }
 
-                if (isDelegateAccessRestricted) {
-                    showDelegateNoAccessModal();
-                    return;
-                }
-
                 changeMoneyRequestHoldStatus(parentReportAction);
             },
         },
@@ -576,17 +565,11 @@ function MoneyRequestHeader({report, parentReportAction, policy, onBackButtonPre
                             isSingleTransactionView: true,
                             isChatReportArchived: isParentReportArchived,
                             isChatIOUReportArchived,
-                            allTransactionViolationsParam: allTransactionViolations,
                         });
                     } else {
                         deleteTransactions([transaction.transactionID], duplicateTransactions, duplicateTransactionViolations, currentSearchHash, true);
                         removeTransaction(transaction.transactionID);
                     }
-                    if (isInNarrowPaneModal) {
-                        Navigation.navigateBackToLastSuperWideRHPScreen();
-                        return;
-                    }
-
                     onBackButtonPress();
                 }}
                 onCancel={() => setIsDeleteModalVisible(false)}
diff --git a/src/components/MoneyRequestReportView/MoneyRequestReportActionsList.tsx b/src/components/MoneyRequestReportView/MoneyRequestReportActionsList.tsx
index 144bf62433dc..7de13fef2bfb 100644
--- a/src/components/MoneyRequestReportView/MoneyRequestReportActionsList.tsx
+++ b/src/components/MoneyRequestReportView/MoneyRequestReportActionsList.tsx
@@ -2,6 +2,7 @@
 import type {ListRenderItemInfo} from '@react-native/virtualized-lists/Lists/VirtualizedList';
 import {useIsFocused, useRoute} from '@react-navigation/native';
 import {isUserValidatedSelector} from '@selectors/Account';
+import {accountIDSelector} from '@selectors/Session';
 import {tierNameSelector} from '@selectors/UserWallet';
 import isEmpty from 'lodash/isEmpty';
 import React, {useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState} from 'react';
@@ -19,7 +20,6 @@ import {PressableWithFeedback} from '@components/Pressable';
 import ScrollView from '@components/ScrollView';
 import {useSearchContext} from '@components/Search/SearchContext';
 import Text from '@components/Text';
-import useCurrentUserPersonalDetails from '@hooks/useCurrentUserPersonalDetails';
 import {AUTOSCROLL_TO_TOP_THRESHOLD} from '@hooks/useFlatListScrollKey';
 import useLoadReportActions from '@hooks/useLoadReportActions';
 import useLocalize from '@hooks/useLocalize';
@@ -30,7 +30,7 @@ import useParentReportAction from '@hooks/useParentReportAction';
 import usePrevious from '@hooks/usePrevious';
 import useReportIsArchived from '@hooks/useReportIsArchived';
 import useReportScrollManager from '@hooks/useReportScrollManager';
-import useResponsiveLayoutOnWideRHP from '@hooks/useResponsiveLayoutOnWideRHP';
+import useResponsiveLayout from '@hooks/useResponsiveLayout';
 import useSelectedTransactionsActions from '@hooks/useSelectedTransactionsActions';
 import useThemeStyles from '@hooks/useThemeStyles';
 import useWindowDimensions from '@hooks/useWindowDimensions';
@@ -46,11 +46,11 @@ import {
     getMostRecentIOURequestActionID,
     getOneTransactionThreadReportID,
     hasNextActionMadeBySameActor,
-    isActionableWhisperRequiringWritePermission,
     isConsecutiveChronosAutomaticTimerAction,
     isCurrentActionUnread,
     isDeletedParentAction,
     isIOUActionMatchingTransactionList,
+    shouldReportActionBeVisible,
     wasMessageReceivedWhileOffline,
 } from '@libs/ReportActionsUtils';
 import {canUserPerformWriteAction, chatIncludesChronosWithID, getOriginalReportID, getReportLastVisibleActionCreated, isHarvestCreatedExpenseReport, isUnread} from '@libs/ReportUtils';
@@ -64,7 +64,7 @@ import ReportActionsListItemRenderer from '@pages/home/report/ReportActionsListI
 import shouldDisplayNewMarkerOnReportAction from '@pages/home/report/shouldDisplayNewMarkerOnReportAction';
 import useReportUnreadMessageScrollTracking from '@pages/home/report/useReportUnreadMessageScrollTracking';
 import variables from '@styles/variables';
-import {openReport, readNewestAction, subscribeToNewActionEvent} from '@userActions/Report';
+import {getCurrentUserAccountID, openReport, readNewestAction, subscribeToNewActionEvent} from '@userActions/Report';
 import CONST from '@src/CONST';
 import ONYXKEYS from '@src/ONYXKEYS';
 import ROUTES from '@src/ROUTES';
@@ -167,13 +167,12 @@ function MoneyRequestReportActionsList({
     const transactionThreadReportID = getOneTransactionThreadReportID(report, chatReport, reportActions ?? [], false, reportTransactionIDs);
     const firstVisibleReportActionID = useMemo(() => getFirstVisibleReportActionID(reportActions, isOffline), [reportActions, isOffline]);
     const [transactionThreadReport] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${transactionThreadReportID}`, {canBeMissing: true});
-    const {accountID: currentUserAccountID} = useCurrentUserPersonalDetails();
+    const [currentUserAccountID] = useOnyx(ONYXKEYS.SESSION, {canBeMissing: false, selector: accountIDSelector});
 
     const isReportArchived = useReportIsArchived(reportID);
     const canPerformWriteAction = canUserPerformWriteAction(report, isReportArchived);
-    const [visibleReportActionsData] = useOnyx(ONYXKEYS.DERIVED.VISIBLE_REPORT_ACTIONS, {canBeMissing: true});
 
-    const {shouldUseNarrowLayout} = useResponsiveLayoutOnWideRHP();
+    const {shouldUseNarrowLayout} = useResponsiveLayout();
 
     const [session] = useOnyx(ONYXKEYS.SESSION, {canBeMissing: false});
     const [reportNameValuePairs] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS}${getNonEmptyStringOnyxID(reportID)}`, {canBeMissing: true});
@@ -226,34 +225,17 @@ function MoneyRequestReportActionsList({
     const visibleReportActions = useMemo(() => {
         const filteredActions = reportActions.filter((reportAction) => {
             const isActionVisibleOnMoneyReport = isActionVisibleOnMoneyRequestReport(reportAction, shouldShowHarvestCreatedAction);
-            if (!isActionVisibleOnMoneyReport) {
-                return false;
-            }
-
-            const passesOfflineCheck = isOffline || isDeletedParentAction(reportAction) || reportAction.pendingAction !== CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE || reportAction.errors;
-            if (!passesOfflineCheck) {
-                return false;
-            }
 
-            const actionReportID = reportAction.reportID ?? reportID;
-            const isStaticallyVisible = visibleReportActionsData?.[actionReportID]?.[reportAction.reportActionID] ?? true;
-            if (!isStaticallyVisible) {
-                return false;
-            }
-
-            if (!canPerformWriteAction && isActionableWhisperRequiringWritePermission(reportAction)) {
-                return false;
-            }
-
-            if (!isIOUActionMatchingTransactionList(reportAction, reportTransactionIDs)) {
-                return false;
-            }
-
-            return true;
+            return (
+                isActionVisibleOnMoneyReport &&
+                (isOffline || isDeletedParentAction(reportAction) || reportAction.pendingAction !== CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE || reportAction.errors) &&
+                shouldReportActionBeVisible(reportAction, reportAction.reportActionID, canPerformWriteAction) &&
+                isIOUActionMatchingTransactionList(reportAction, reportTransactionIDs)
+            );
         });
 
         return filteredActions.toReversed();
-    }, [reportActions, isOffline, canPerformWriteAction, reportTransactionIDs, shouldShowHarvestCreatedAction, visibleReportActionsData, reportID]);
+    }, [reportActions, isOffline, canPerformWriteAction, reportTransactionIDs, shouldShowHarvestCreatedAction]);
 
     const reportActionSize = useRef(visibleReportActions.length);
     const lastAction = visibleReportActions.at(-1);
@@ -367,7 +349,7 @@ function MoneyRequestReportActionsList({
 
         const hasNewMessagesInView = scrollingVerticalBottomOffset.current < CONST.REPORT.ACTIONS.ACTION_VISIBLE_THRESHOLD;
         const hasUnreadReportAction = reportActions.some(
-            (reportAction) => newMessageTimeReference && newMessageTimeReference < reportAction.created && reportAction.actorAccountID !== currentUserAccountID,
+            (reportAction) => newMessageTimeReference && newMessageTimeReference < reportAction.created && reportAction.actorAccountID !== getCurrentUserAccountID(),
         );
 
         if (!hasNewMessagesInView || !hasUnreadReportAction) {
@@ -417,7 +399,7 @@ function MoneyRequestReportActionsList({
                     message: reportAction,
                     nextMessage: nextAction,
                     isEarliestReceivedOfflineMessage,
-                    currentUserAccountID,
+                    accountID: currentUserAccountID,
                     prevSortedVisibleReportActionsObjects: prevVisibleActionsMap,
                     unreadMarkerTime,
                     scrollingVerticalOffset: scrollingVerticalBottomOffset.current,
diff --git a/src/components/MoneyRequestReportView/MoneyRequestReportGroupHeader.tsx b/src/components/MoneyRequestReportView/MoneyRequestReportGroupHeader.tsx
index 5d561637bcfe..cd9ba8646637 100644
--- a/src/components/MoneyRequestReportView/MoneyRequestReportGroupHeader.tsx
+++ b/src/components/MoneyRequestReportView/MoneyRequestReportGroupHeader.tsx
@@ -4,7 +4,7 @@ import Checkbox from '@components/Checkbox';
 import OfflineWithFeedback from '@components/OfflineWithFeedback';
 import Text from '@components/Text';
 import useLocalize from '@hooks/useLocalize';
-import useResponsiveLayoutOnWideRHP from '@hooks/useResponsiveLayoutOnWideRHP';
+import useResponsiveLayout from '@hooks/useResponsiveLayout';
 import useThemeStyles from '@hooks/useThemeStyles';
 import {convertToDisplayString} from '@libs/CurrencyUtils';
 import {getCommaSeparatedTagNameWithSanitizedColons} from '@libs/PolicyUtils';
@@ -64,7 +64,7 @@ function MoneyRequestReportGroupHeader({
 }: MoneyRequestReportGroupHeaderProps) {
     const styles = useThemeStyles();
     const {translate} = useLocalize();
-    const {shouldUseNarrowLayout} = useResponsiveLayoutOnWideRHP();
+    const {shouldUseNarrowLayout} = useResponsiveLayout();
 
     const cleanedGroupName = isGroupedByTag && group.groupName ? getCommaSeparatedTagNameWithSanitizedColons(group.groupName) : group.groupName;
     const displayName = cleanedGroupName || translate(isGroupedByTag ? 'reportLayout.noTag' : 'reportLayout.uncategorized');
diff --git a/src/components/MoneyRequestReportView/MoneyRequestReportNavigation.tsx b/src/components/MoneyRequestReportView/MoneyRequestReportNavigation.tsx
index 9a9d656b1c38..c2a0d096c1f6 100644
--- a/src/components/MoneyRequestReportView/MoneyRequestReportNavigation.tsx
+++ b/src/components/MoneyRequestReportView/MoneyRequestReportNavigation.tsx
@@ -56,6 +56,7 @@ function MoneyRequestReportNavigation({reportID, shouldDisplayNarrowVersion}: Mo
             archivedReportsIDList: archivedReportsIdSet,
             isActionLoadingSet,
             cardFeeds,
+            shouldSkipActionFiltering: true,
         });
         results = getSortedSections(type, status ?? '', searchData, localeCompare, translate, sortBy, sortOrder, groupBy).map((value) => value.reportID);
     }
diff --git a/src/components/MoneyRequestReportView/MoneyRequestReportTransactionItem.tsx b/src/components/MoneyRequestReportView/MoneyRequestReportTransactionItem.tsx
index 349db531a581..badcc7950045 100644
--- a/src/components/MoneyRequestReportView/MoneyRequestReportTransactionItem.tsx
+++ b/src/components/MoneyRequestReportView/MoneyRequestReportTransactionItem.tsx
@@ -8,7 +8,6 @@ import TransactionItemRow from '@components/TransactionItemRow';
 import useAnimatedHighlightStyle from '@hooks/useAnimatedHighlightStyle';
 import useLocalize from '@hooks/useLocalize';
 import useResponsiveLayout from '@hooks/useResponsiveLayout';
-import useResponsiveLayoutOnWideRHP from '@hooks/useResponsiveLayoutOnWideRHP';
 import useTheme from '@hooks/useTheme';
 import useThemeStyles from '@hooks/useThemeStyles';
 import ControlSelection from '@libs/ControlSelection';
@@ -82,8 +81,7 @@ function MoneyRequestReportTransactionItem({
     const {translate} = useLocalize();
     const styles = useThemeStyles();
     // eslint-disable-next-line rulesdir/prefer-shouldUseNarrowLayout-instead-of-isSmallScreenWidth
-    const {isSmallScreenWidth, isMediumScreenWidth} = useResponsiveLayout();
-    const {shouldUseNarrowLayout} = useResponsiveLayoutOnWideRHP();
+    const {isSmallScreenWidth, isMediumScreenWidth, shouldUseNarrowLayout} = useResponsiveLayout();
     const theme = useTheme();
     const isPendingDelete = isTransactionPendingDelete(transaction);
     const pendingAction = getTransactionPendingAction(transaction);
diff --git a/src/components/MoneyRequestReportView/MoneyRequestReportTransactionList.tsx b/src/components/MoneyRequestReportView/MoneyRequestReportTransactionList.tsx
index 4a9598349e7c..5f8d6ac0eaa9 100644
--- a/src/components/MoneyRequestReportView/MoneyRequestReportTransactionList.tsx
+++ b/src/components/MoneyRequestReportView/MoneyRequestReportTransactionList.tsx
@@ -21,7 +21,6 @@ import useMobileSelectionMode from '@hooks/useMobileSelectionMode';
 import useOnyx from '@hooks/useOnyx';
 import useReportIsArchived from '@hooks/useReportIsArchived';
 import useResponsiveLayout from '@hooks/useResponsiveLayout';
-import useResponsiveLayoutOnWideRHP from '@hooks/useResponsiveLayoutOnWideRHP';
 import useStyleUtils from '@hooks/useStyleUtils';
 import useThemeStyles from '@hooks/useThemeStyles';
 import {turnOnMobileSelectionMode} from '@libs/actions/MobileSelectionMode';
@@ -169,8 +168,7 @@ function MoneyRequestReportTransactionList({
     const expensifyIcons = useMemoizedLazyExpensifyIcons(['Location', 'CheckSquare', 'ReceiptPlus']);
     const {translate, localeCompare} = useLocalize();
     // eslint-disable-next-line rulesdir/prefer-shouldUseNarrowLayout-instead-of-isSmallScreenWidth
-    const {isSmallScreenWidth, isMediumScreenWidth} = useResponsiveLayout();
-    const {shouldUseNarrowLayout} = useResponsiveLayoutOnWideRHP();
+    const {shouldUseNarrowLayout, isSmallScreenWidth, isMediumScreenWidth} = useResponsiveLayout();
     const {markReportIDAsExpense} = useContext(WideRHPContext);
     const [isModalVisible, setIsModalVisible] = useState(false);
     const [selectedTransactionID, setSelectedTransactionID] = useState<string>('');
diff --git a/src/components/MoneyRequestReportView/MoneyRequestReportView.tsx b/src/components/MoneyRequestReportView/MoneyRequestReportView.tsx
index f96ce35ec9f3..1d821678276d 100644
--- a/src/components/MoneyRequestReportView/MoneyRequestReportView.tsx
+++ b/src/components/MoneyRequestReportView/MoneyRequestReportView.tsx
@@ -1,14 +1,10 @@
 import {PortalHost} from '@gorhom/portal';
 import React, {useCallback, useEffect, useMemo} from 'react';
-// We use Animated for all functionality related to wide RHP to make it easier
-// to interact with react-navigation components (e.g., CardContainer, interpolator), which also use Animated.
-// eslint-disable-next-line no-restricted-imports
-import {Animated, InteractionManager, ScrollView, View} from 'react-native';
+import {InteractionManager, View} from 'react-native';
 import type {OnyxEntry} from 'react-native-onyx';
 import MoneyReportHeader from '@components/MoneyReportHeader';
 import MoneyRequestHeader from '@components/MoneyRequestHeader';
 import OfflineWithFeedback from '@components/OfflineWithFeedback';
-import MoneyRequestReceiptView from '@components/ReportActionItem/MoneyRequestReceiptView';
 import ReportActionsSkeletonView from '@components/ReportActionsSkeletonView';
 import ReportHeaderSkeletonView from '@components/ReportHeaderSkeletonView';
 import useNetwork from '@hooks/useNetwork';
@@ -16,7 +12,6 @@ import useNewTransactions from '@hooks/useNewTransactions';
 import useOnyx from '@hooks/useOnyx';
 import usePaginatedReportActions from '@hooks/usePaginatedReportActions';
 import useParentReportAction from '@hooks/useParentReportAction';
-import useResponsiveLayout from '@hooks/useResponsiveLayout';
 import useThemeStyles from '@hooks/useThemeStyles';
 import useTransactionsAndViolationsForReport from '@hooks/useTransactionsAndViolationsForReport';
 import {removeFailedReport} from '@libs/actions/Report';
@@ -61,16 +56,6 @@ function goBackFromSearchMoneyRequest() {
     const rootState = navigationRef.getRootState();
     const lastRoute = rootState.routes.at(-1);
 
-    if (!lastRoute) {
-        Log.hmmm('[goBackFromSearchMoneyRequest()] No last route found in root state.');
-        return;
-    }
-
-    if (lastRoute?.name === NAVIGATORS.RIGHT_MODAL_NAVIGATOR) {
-        Navigation.goBack();
-        return;
-    }
-
     if (lastRoute?.name !== NAVIGATORS.SEARCH_FULLSCREEN_NAVIGATOR) {
         Log.hmmm('[goBackFromSearchMoneyRequest()] goBackFromSearchMoneyRequest was called from a different navigator than SearchFullscreenNavigator.');
         return;
@@ -99,10 +84,6 @@ function MoneyRequestReportView({report, policy, reportMetadata, shouldDisplayRe
     const styles = useThemeStyles();
     const {isOffline} = useNetwork();
 
-    // eslint-disable-next-line rulesdir/prefer-shouldUseNarrowLayout-instead-of-isSmallScreenWidth
-    const {isSmallScreenWidth} = useResponsiveLayout();
-
-    const [allReports] = useOnyx(ONYXKEYS.COLLECTION.REPORT, {canBeMissing: false});
     const reportID = report?.reportID;
     const [isLoadingApp] = useOnyx(ONYXKEYS.IS_LOADING_APP, {canBeMissing: true});
     const [isComposerFullSize = false] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT_IS_COMPOSER_FULL_SIZE}${reportID}`, {canBeMissing: true});
@@ -143,14 +124,11 @@ function MoneyRequestReportView({report, policy, reportMetadata, shouldDisplayRe
 
     // Prevent the empty state flash by ensuring transaction data is fully loaded before deciding which view to render
     // We need to wait for both the selector to finish AND ensure we're not in a loading state where transactions could still populate
-    const shouldWaitForTransactions = shouldWaitForTransactionsUtil(report, transactions, reportMetadata, isOffline);
+    const shouldWaitForTransactions = shouldWaitForTransactionsUtil(report, transactions, reportMetadata);
 
     const isEmptyTransactionReport = visibleTransactions && visibleTransactions.length === 0 && transactionThreadReportID === undefined;
     const shouldDisplayMoneyRequestActionsList = !!isEmptyTransactionReport || shouldDisplayReportTableView(report, visibleTransactions ?? []);
 
-    const [transactionThreadReport] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${transactionThreadReportID}`, {canBeMissing: true});
-    const shouldShowWideRHPReceipt = visibleTransactions.length === 1 && !isSmallScreenWidth && !!transactionThreadReport;
-
     const reportHeaderView = useMemo(
         () =>
             isTransactionThreadView ? (
@@ -245,62 +223,48 @@ function MoneyRequestReportView({report, policy, reportMetadata, shouldDisplayRe
                 contentContainerStyle={styles.flex1}
                 errorRowStyles={[styles.ph5, styles.mv2]}
             >
-                <View style={[styles.flex1, styles.flexRow]}>
-                    {shouldShowWideRHPReceipt && (
-                        <Animated.View style={styles.wideRHPMoneyRequestReceiptViewContainer}>
-                            <ScrollView contentContainerStyle={styles.wideRHPMoneyRequestReceiptViewScrollViewContainer}>
-                                <MoneyRequestReceiptView
-                                    allReports={allReports}
-                                    report={transactionThreadReport}
-                                    fillSpace
-                                    isDisplayedInWideRHP
-                                />
-                            </ScrollView>
-                        </Animated.View>
+                <View style={[styles.overflowHidden, styles.justifyContentEnd, styles.flex1]}>
+                    {shouldDisplayMoneyRequestActionsList ? (
+                        <MoneyRequestReportActionsList
+                            report={report}
+                            policy={policy}
+                            transactions={visibleTransactions}
+                            hasPendingDeletionTransaction={hasPendingDeletionTransaction}
+                            newTransactions={newTransactions}
+                            reportActions={reportActions}
+                            violations={allReportViolations}
+                            hasOlderActions={hasOlderActions}
+                            hasNewerActions={hasNewerActions}
+                            showReportActionsLoadingState={isLoadingInitialReportActions && !reportMetadata?.hasOnceLoadedReportActions}
+                            reportPendingAction={reportPendingAction}
+                        />
+                    ) : (
+                        <ReportActionsView
+                            report={report}
+                            reportActions={reportActions}
+                            isLoadingInitialReportActions={reportMetadata?.isLoadingInitialReportActions}
+                            hasNewerActions={hasNewerActions}
+                            hasOlderActions={hasOlderActions}
+                            parentReportAction={parentReportAction}
+                            transactionThreadReportID={transactionThreadReportID}
+                        />
                     )}
-                    <View style={[styles.overflowHidden, styles.justifyContentEnd, styles.flex1]}>
-                        {shouldDisplayMoneyRequestActionsList ? (
-                            <MoneyRequestReportActionsList
+                    {shouldDisplayReportFooter ? (
+                        <>
+                            <ReportFooter
                                 report={report}
+                                reportMetadata={reportMetadata}
                                 policy={policy}
-                                transactions={visibleTransactions}
-                                hasPendingDeletionTransaction={hasPendingDeletionTransaction}
-                                newTransactions={newTransactions}
-                                reportActions={reportActions}
-                                violations={allReportViolations}
-                                hasOlderActions={hasOlderActions}
-                                hasNewerActions={hasNewerActions}
-                                showReportActionsLoadingState={isLoadingInitialReportActions && !reportMetadata?.hasOnceLoadedReportActions}
-                                reportPendingAction={reportPendingAction}
-                            />
-                        ) : (
-                            <ReportActionsView
-                                report={report}
-                                reportActions={reportActions}
-                                isLoadingInitialReportActions={reportMetadata?.isLoadingInitialReportActions}
-                                hasNewerActions={hasNewerActions}
-                                hasOlderActions={hasOlderActions}
-                                parentReportAction={parentReportAction}
-                                transactionThreadReportID={transactionThreadReportID}
+                                pendingAction={reportPendingAction}
+                                isComposerFullSize={!!isComposerFullSize}
+                                lastReportAction={lastReportAction}
+                                reportTransactions={transactions}
+                                // If the report is from the 'Send Money' flow, we add the comment to the `iou` report because for these we don't combine reportActions even if there is a single transaction (they always have a single transaction)
+                                transactionThreadReportID={isSentMoneyReport ? undefined : transactionThreadReportID}
                             />
-                        )}
-                        {shouldDisplayReportFooter ? (
-                            <>
-                                <ReportFooter
-                                    report={report}
-                                    reportMetadata={reportMetadata}
-                                    policy={policy}
-                                    pendingAction={reportPendingAction}
-                                    isComposerFullSize={!!isComposerFullSize}
-                                    lastReportAction={lastReportAction}
-                                    reportTransactions={transactions}
-                                    // If the report is from the 'Send Money' flow, we add the comment to the `iou` report because for these we don't combine reportActions even if there is a single transaction (they always have a single transaction)
-                                    transactionThreadReportID={isSentMoneyReport ? undefined : transactionThreadReportID}
-                                />
-                                <PortalHost name="suggestions" />
-                            </>
-                        ) : null}
-                    </View>
+                            <PortalHost name="suggestions" />
+                        </>
+                    ) : null}
                 </View>
             </OfflineWithFeedback>
         </View>
diff --git a/src/components/MoneyRequestReportView/MoneyRequestViewReportFields.tsx b/src/components/MoneyRequestReportView/MoneyRequestViewReportFields.tsx
index 0eb61411e18e..35d413dbff79 100644
--- a/src/components/MoneyRequestReportView/MoneyRequestViewReportFields.tsx
+++ b/src/components/MoneyRequestReportView/MoneyRequestViewReportFields.tsx
@@ -6,13 +6,12 @@ import OfflineWithFeedback from '@components/OfflineWithFeedback';
 import useOnyx from '@hooks/useOnyx';
 import useThemeStyles from '@hooks/useThemeStyles';
 import {clearReportFieldKeyErrors} from '@libs/actions/Report';
-import {resolveReportFieldValue} from '@libs/Formula';
 import Navigation from '@libs/Navigation/Navigation';
 import {
+    getAvailableReportFields,
     getFieldViolation,
     getFieldViolationTranslation,
     getReportFieldKey,
-    getReportFieldMaps,
     isInvoiceReport as isInvoiceReportUtils,
     isPaidGroupPolicyExpenseReport as isPaidGroupPolicyExpenseReportUtils,
     isReportFieldDisabled,
@@ -84,15 +83,13 @@ function MoneyRequestViewReportFields({report, policy, isCombinedReport = false,
     const [violations] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT_VIOLATIONS}${report?.reportID}`, {canBeMissing: true});
 
     const sortedPolicyReportFields = useMemo<EnrichedPolicyReportField[]>((): EnrichedPolicyReportField[] => {
-        const {fieldValues, fieldsByName} = getReportFieldMaps(report, policy?.fieldList ?? {});
-        const fields = Object.values(fieldsByName);
-
+        const fields = getAvailableReportFields(report, Object.values(policy?.fieldList ?? {}));
         return fields
             .filter((field) => field.target === report?.type)
             .filter((reportField) => !shouldHideSingleReportField(reportField))
             .sort(({orderWeight: firstOrderWeight}, {orderWeight: secondOrderWeight}) => firstOrderWeight - secondOrderWeight)
             .map((field): EnrichedPolicyReportField => {
-                const fieldValue = resolveReportFieldValue(field, report, policy, fieldValues, fieldsByName);
+                const fieldValue = field.value ?? field.defaultValue;
                 const isFieldDisabled = isReportFieldDisabledForUser(report, field, policy);
                 const isDeletedFormulaField = field.type === CONST.REPORT_FIELD_TYPES.FORMULA && field.deletable;
                 const fieldKey = getReportFieldKey(field.fieldID);
diff --git a/src/components/MultifactorAuthentication/NoEligibleMethodsDescription.tsx b/src/components/MultifactorAuthentication/NoEligibleMethodsDescription.tsx
deleted file mode 100644
index b1dcab2c7dca..000000000000
--- a/src/components/MultifactorAuthentication/NoEligibleMethodsDescription.tsx
+++ /dev/null
@@ -1,34 +0,0 @@
-import Text from '@components/Text';
-import TextLink from '@components/TextLink';
-import useLocalize from '@hooks/useLocalize';
-import useThemeStyles from '@hooks/useThemeStyles';
-import goToSettings from '@libs/goToSettings';
-
-const baseTranslationPath = 'multifactorAuthentication.pleaseEnableInSystemSettings' as const;
-
-const translationPaths = {
-    start: `${baseTranslationPath}.start`,
-    link: `${baseTranslationPath}.link`,
-    end: `${baseTranslationPath}.end`,
-} as const;
-
-function NoEligibleMethodsDescription() {
-    const styles = useThemeStyles();
-    const {translate} = useLocalize();
-
-    const start = translate(translationPaths.start);
-    const link = translate(translationPaths.link);
-    const end = translate(translationPaths.end);
-
-    return (
-        <Text style={[styles.textAlignCenter, styles.textSupporting]}>
-            {start}
-            <TextLink onPress={goToSettings}>{link}</TextLink>
-            {end}
-        </Text>
-    );
-}
-
-NoEligibleMethodsDescription.displayName = 'NoEligibleMethodsDescription';
-
-export default NoEligibleMethodsDescription;
diff --git a/src/components/MultifactorAuthentication/PromptContent.tsx b/src/components/MultifactorAuthentication/PromptContent.tsx
deleted file mode 100644
index 2d91ff96d1d4..000000000000
--- a/src/components/MultifactorAuthentication/PromptContent.tsx
+++ /dev/null
@@ -1,38 +0,0 @@
-import React from 'react';
-import {View} from 'react-native';
-import BlockingView from '@components/BlockingViews/BlockingView';
-import type DotLottieAnimation from '@components/LottieAnimations/types';
-import useLocalize from '@hooks/useLocalize';
-import useThemeStyles from '@hooks/useThemeStyles';
-import type {TranslationPaths} from '@src/languages/types';
-
-type MultifactorAuthenticationPromptContentProps = {
-    animation: DotLottieAnimation;
-    title: TranslationPaths;
-    subtitle: TranslationPaths;
-};
-
-function MultifactorAuthenticationPromptContent({title, subtitle, animation}: MultifactorAuthenticationPromptContentProps) {
-    const styles = useThemeStyles();
-    const {translate} = useLocalize();
-
-    return (
-        <View style={styles.flex1}>
-            <BlockingView
-                animation={animation}
-                animationStyles={styles.mfaBlockingViewAnimation}
-                animationWebStyle={styles.mfaBlockingViewAnimation}
-                title={translate(title)}
-                titleStyles={styles.mb2}
-                subtitle={translate(subtitle)}
-                subtitleStyle={styles.textSupporting}
-                containerStyle={styles.ph5}
-                testID="MultifactorAuthenticationPromptContent"
-            />
-        </View>
-    );
-}
-
-MultifactorAuthenticationPromptContent.displayName = 'MultifactorAuthenticationPromptContent';
-
-export default MultifactorAuthenticationPromptContent;
diff --git a/src/components/MultifactorAuthentication/TriggerCancelConfirmModal.tsx b/src/components/MultifactorAuthentication/TriggerCancelConfirmModal.tsx
deleted file mode 100644
index 819b38507497..000000000000
--- a/src/components/MultifactorAuthentication/TriggerCancelConfirmModal.tsx
+++ /dev/null
@@ -1,45 +0,0 @@
-import React from 'react';
-import ConfirmModal from '@components/ConfirmModal';
-import useLocalize from '@hooks/useLocalize';
-import type {TranslationPaths} from '@src/languages/types';
-
-type MultifactorAuthenticationTriggerCancelConfirmModalProps = {
-    isVisible: boolean;
-    onConfirm: () => void;
-    onCancel: () => void;
-};
-
-// TODO: this config will be part of the scenario configuration, the current implementation is for testing purposes (https://github.com/Expensify/App/issues/79373)
-const mockedConfig = {
-    title: 'common.areYouSure',
-    description: 'multifactorAuthentication.biometricsTest.areYouSureToReject',
-    confirmButtonText: 'multifactorAuthentication.biometricsTest.rejectAuthentication',
-    cancelButtonText: 'common.cancel',
-} as const satisfies Record<string, TranslationPaths>;
-
-function MultifactorAuthenticationTriggerCancelConfirmModal({isVisible, onConfirm, onCancel}: MultifactorAuthenticationTriggerCancelConfirmModalProps) {
-    const {translate} = useLocalize();
-
-    const title = translate(mockedConfig.title);
-    const description = translate(mockedConfig.description);
-    const confirmButtonText = translate(mockedConfig.confirmButtonText);
-    const cancelButtonText = translate(mockedConfig.cancelButtonText);
-
-    return (
-        <ConfirmModal
-            danger
-            title={title}
-            onConfirm={onConfirm}
-            onCancel={onCancel}
-            isVisible={isVisible}
-            prompt={description}
-            confirmText={confirmButtonText}
-            cancelText={cancelButtonText}
-            shouldShowCancelButton
-        />
-    );
-}
-
-MultifactorAuthenticationTriggerCancelConfirmModal.displayName = 'MultifactorAuthenticationTriggerCancelConfirmModal';
-
-export default MultifactorAuthenticationTriggerCancelConfirmModal;
diff --git a/src/components/MultifactorAuthentication/ValidateCodeResendButton.tsx b/src/components/MultifactorAuthentication/ValidateCodeResendButton.tsx
deleted file mode 100644
index e129d4461e18..000000000000
--- a/src/components/MultifactorAuthentication/ValidateCodeResendButton.tsx
+++ /dev/null
@@ -1,84 +0,0 @@
-import React, {useCallback, useImperativeHandle, useRef, useState} from 'react';
-import {View} from 'react-native';
-import PressableWithFeedback from '@components/Pressable/PressableWithFeedback';
-import Text from '@components/Text';
-import ValidateCodeCountdown from '@components/ValidateCodeCountdown';
-import type {ValidateCodeCountdownHandle} from '@components/ValidateCodeCountdown/types';
-import useLocalize from '@hooks/useLocalize';
-import useNetwork from '@hooks/useNetwork';
-import useStyleUtils from '@hooks/useStyleUtils';
-import useThemeStyles from '@hooks/useThemeStyles';
-import CONST from '@src/CONST';
-import type {TranslationPaths} from '@src/languages/types';
-
-type MultifactorAuthenticationValidateCodeResendButtonHandle = {
-    resetCountdown: () => void;
-};
-
-type MultifactorAuthenticationValidateCodeResendButtonProps = {
-    ref?: React.Ref<MultifactorAuthenticationValidateCodeResendButtonHandle>;
-    shouldDisableResendCode: boolean;
-    hasError: boolean;
-    resendButtonText: TranslationPaths;
-    onResendValidationCode: () => void;
-};
-
-function MultifactorAuthenticationValidateCodeResendButton({
-    ref,
-    shouldDisableResendCode,
-    hasError,
-    resendButtonText,
-    onResendValidationCode,
-}: MultifactorAuthenticationValidateCodeResendButtonProps) {
-    const styles = useThemeStyles();
-    const StyleUtils = useStyleUtils();
-    const {translate} = useLocalize();
-    const {isOffline} = useNetwork();
-
-    const [isCountdownRunning, setIsCountdownRunning] = useState(true);
-    const countdownRef = useRef<ValidateCodeCountdownHandle>(null);
-
-    const handleCountdownFinish = useCallback(() => {
-        setIsCountdownRunning(false);
-    }, []);
-
-    useImperativeHandle(ref, () => ({
-        resetCountdown: () => {
-            countdownRef.current?.resetCountdown();
-            setIsCountdownRunning(true);
-        },
-    }));
-
-    return (
-        <View style={styles.alignItemsStart}>
-            {isCountdownRunning && !isOffline ? (
-                <View style={[styles.mt5, styles.flexRow, styles.renderHTML]}>
-                    <ValidateCodeCountdown
-                        ref={countdownRef}
-                        onCountdownFinish={handleCountdownFinish}
-                    />
-                </View>
-            ) : (
-                <PressableWithFeedback
-                    style={styles.mt5}
-                    onPress={onResendValidationCode}
-                    disabled={shouldDisableResendCode}
-                    hoverDimmingValue={1}
-                    pressDimmingValue={0.2}
-                    role={CONST.ROLE.BUTTON}
-                    accessibilityLabel={translate(resendButtonText)}
-                >
-                    <Text style={[StyleUtils.getDisabledLinkStyles(shouldDisableResendCode)]}>
-                        {hasError ? translate('validateCodeForm.requestNewCodeAfterErrorOccurred') : translate(resendButtonText)}
-                    </Text>
-                </PressableWithFeedback>
-            )}
-        </View>
-    );
-}
-
-MultifactorAuthenticationValidateCodeResendButton.displayName = 'MultifactorAuthenticationValidateCodeResendButton';
-
-export default MultifactorAuthenticationValidateCodeResendButton;
-
-export type {MultifactorAuthenticationValidateCodeResendButtonHandle};
diff --git a/src/components/Navigation/DebugTabView.tsx b/src/components/Navigation/DebugTabView.tsx
index 2af72a9b1107..19248e166673 100644
--- a/src/components/Navigation/DebugTabView.tsx
+++ b/src/components/Navigation/DebugTabView.tsx
@@ -7,9 +7,9 @@ import Button from '@components/Button';
 import Icon from '@components/Icon';
 import * as Expensicons from '@components/Icon/Expensicons';
 import Text from '@components/Text';
+import type {IndicatorStatus} from '@hooks/useIndicatorStatus';
 import useIndicatorStatus from '@hooks/useIndicatorStatus';
 import useLocalize from '@hooks/useLocalize';
-import type {IndicatorStatus} from '@hooks/useNavigationTabBarIndicatorChecks';
 import useOnyx from '@hooks/useOnyx';
 import {useSidebarOrderedReports} from '@hooks/useSidebarOrderedReports';
 import useStyleUtils from '@hooks/useStyleUtils';
diff --git a/src/components/Navigation/NavigationTabBar/index.tsx b/src/components/Navigation/NavigationTabBar/index.tsx
index bce9af6826ea..67fa08bd3848 100644
--- a/src/components/Navigation/NavigationTabBar/index.tsx
+++ b/src/components/Navigation/NavigationTabBar/index.tsx
@@ -1,11 +1,10 @@
 import {findFocusedRoute, StackActions, useNavigationState} from '@react-navigation/native';
 import reportsSelector from '@selectors/Attributes';
-import React, {memo, useCallback, useEffect, useMemo, useState} from 'react';
+import React, {memo, useCallback, useEffect, useState} from 'react';
 import {View} from 'react-native';
 import type {OnyxCollection} from 'react-native-onyx';
 import type {ValueOf} from 'type-fest';
 import FloatingCameraButton from '@components/FloatingCameraButton';
-import FloatingGPSButton from '@components/FloatingGPSButton';
 import Icon from '@components/Icon';
 // import * as Expensicons from '@components/Icon/Expensicons';
 import ImageSVG from '@components/ImageSVG';
@@ -52,10 +51,10 @@ import NAVIGATION_TABS from './NAVIGATION_TABS';
 type NavigationTabBarProps = {
     selectedTab: ValueOf<typeof NAVIGATION_TABS>;
     isTopLevelBar?: boolean;
-    shouldShowFloatingButtons?: boolean;
+    shouldShowFloatingCameraButton?: boolean;
 };
 
-function NavigationTabBar({selectedTab, isTopLevelBar = false, shouldShowFloatingButtons = true}: NavigationTabBarProps) {
+function NavigationTabBar({selectedTab, isTopLevelBar = false, shouldShowFloatingCameraButton = true}: NavigationTabBarProps) {
     const theme = useTheme();
     const styles = useThemeStyles();
 
@@ -173,7 +172,7 @@ function NavigationTabBar({selectedTab, isTopLevelBar = false, shouldShowFloatin
         }
         clearSelectedText();
         interceptAnonymousUser(() => {
-            const parentSpan = startSpan(CONST.TELEMETRY.SPAN_NAVIGATE_TO_REPORTS_TAB, {
+            startSpan(CONST.TELEMETRY.SPAN_NAVIGATE_TO_REPORTS_TAB, {
                 name: CONST.TELEMETRY.SPAN_NAVIGATE_TO_REPORTS_TAB,
                 op: CONST.TELEMETRY.SPAN_NAVIGATE_TO_REPORTS_TAB,
             });
@@ -181,7 +180,6 @@ function NavigationTabBar({selectedTab, isTopLevelBar = false, shouldShowFloatin
             startSpan(CONST.TELEMETRY.SPAN_ON_LAYOUT_SKELETON_REPORTS, {
                 name: CONST.TELEMETRY.SPAN_ON_LAYOUT_SKELETON_REPORTS,
                 op: CONST.TELEMETRY.SPAN_ON_LAYOUT_SKELETON_REPORTS,
-                parentSpan,
             });
 
             const rootState = navigationRef.getRootState() as State<RootNavigatorParamList>;
@@ -240,10 +238,6 @@ function NavigationTabBar({selectedTab, isTopLevelBar = false, shouldShowFloatin
         navigateToWorkspacesPage({shouldUseNarrowLayout, currentUserLogin, policy: lastViewedPolicy, domain: lastViewedDomain});
     }, [shouldUseNarrowLayout, currentUserLogin, lastViewedPolicy, lastViewedDomain]);
 
-    const inboxAccessibilityState = useMemo(() => ({selected: selectedTab === NAVIGATION_TABS.HOME}), [selectedTab]);
-    const searchAccessibilityState = useMemo(() => ({selected: selectedTab === NAVIGATION_TABS.SEARCH}), [selectedTab]);
-    const workspacesAccessibilityState = useMemo(() => ({selected: selectedTab === NAVIGATION_TABS.WORKSPACES}), [selectedTab]);
-
     if (!shouldUseNarrowLayout) {
         return (
             <>
@@ -274,9 +268,8 @@ function NavigationTabBar({selectedTab, isTopLevelBar = false, shouldShowFloatin
                         </PressableWithFeedback>
                         <PressableWithFeedback
                             onPress={navigateToChats}
-                            role={CONST.ROLE.TAB}
+                            role={CONST.ROLE.BUTTON}
                             accessibilityLabel={translate('common.inbox')}
-                            accessibilityState={inboxAccessibilityState}
                             style={({hovered}) => [styles.leftNavigationTabBarItem, hovered && styles.navigationTabBarItemHovered]}
                             sentryLabel={CONST.SENTRY_LABEL.NAVIGATION_TAB_BAR.INBOX}
                         >
@@ -316,9 +309,8 @@ function NavigationTabBar({selectedTab, isTopLevelBar = false, shouldShowFloatin
                         </PressableWithFeedback>
                         <PressableWithFeedback
                             onPress={navigateToSearch}
-                            role={CONST.ROLE.TAB}
+                            role={CONST.ROLE.BUTTON}
                             accessibilityLabel={translate('common.reports')}
-                            accessibilityState={searchAccessibilityState}
                             style={({hovered}) => [styles.leftNavigationTabBarItem, hovered && styles.navigationTabBarItemHovered]}
                             sentryLabel={CONST.SENTRY_LABEL.NAVIGATION_TAB_BAR.REPORTS}
                         >
@@ -349,9 +341,8 @@ function NavigationTabBar({selectedTab, isTopLevelBar = false, shouldShowFloatin
                         </PressableWithFeedback>
                         <PressableWithFeedback
                             onPress={showWorkspaces}
-                            role={CONST.ROLE.TAB}
+                            role={CONST.ROLE.BUTTON}
                             accessibilityLabel={translate('common.workspacesTabTitle')}
-                            accessibilityState={workspacesAccessibilityState}
                             style={({hovered}) => [styles.leftNavigationTabBarItem, hovered && styles.navigationTabBarItemHovered]}
                             sentryLabel={CONST.SENTRY_LABEL.NAVIGATION_TAB_BAR.WORKSPACES}
                         >
@@ -417,9 +408,8 @@ function NavigationTabBar({selectedTab, isTopLevelBar = false, shouldShowFloatin
             >
                 <PressableWithFeedback
                     onPress={navigateToChats}
-                    role={CONST.ROLE.TAB}
+                    role={CONST.ROLE.BUTTON}
                     accessibilityLabel={translate('common.inbox')}
-                    accessibilityState={inboxAccessibilityState}
                     wrapperStyle={styles.flex1}
                     style={styles.navigationTabBarItem}
                     sentryLabel={CONST.SENTRY_LABEL.NAVIGATION_TAB_BAR.INBOX}
@@ -455,9 +445,8 @@ function NavigationTabBar({selectedTab, isTopLevelBar = false, shouldShowFloatin
                 </PressableWithFeedback>
                 <PressableWithFeedback
                     onPress={navigateToSearch}
-                    role={CONST.ROLE.TAB}
+                    role={CONST.ROLE.BUTTON}
                     accessibilityLabel={translate('common.reports')}
-                    accessibilityState={searchAccessibilityState}
                     wrapperStyle={styles.flex1}
                     style={styles.navigationTabBarItem}
                     sentryLabel={CONST.SENTRY_LABEL.NAVIGATION_TAB_BAR.REPORTS}
@@ -488,9 +477,8 @@ function NavigationTabBar({selectedTab, isTopLevelBar = false, shouldShowFloatin
                 </View>
                 <PressableWithFeedback
                     onPress={showWorkspaces}
-                    role={CONST.ROLE.TAB}
+                    role={CONST.ROLE.BUTTON}
                     accessibilityLabel={translate('common.workspacesTabTitle')}
-                    accessibilityState={workspacesAccessibilityState}
                     wrapperStyle={styles.flex1}
                     style={styles.navigationTabBarItem}
                     sentryLabel={CONST.SENTRY_LABEL.NAVIGATION_TAB_BAR.WORKSPACES}
@@ -523,12 +511,7 @@ function NavigationTabBar({selectedTab, isTopLevelBar = false, shouldShowFloatin
                     onPress={navigateToSettings}
                 />
             </View>
-            {shouldShowFloatingButtons && (
-                <>
-                    <FloatingGPSButton />
-                    <FloatingCameraButton />
-                </>
-            )}
+            {shouldShowFloatingCameraButton && <FloatingCameraButton />}
         </>
     );
 }
diff --git a/src/components/Navigation/SearchSidebar.tsx b/src/components/Navigation/SearchSidebar.tsx
index 21570acb8c5c..dffea363935b 100644
--- a/src/components/Navigation/SearchSidebar.tsx
+++ b/src/components/Navigation/SearchSidebar.tsx
@@ -1,15 +1,19 @@
 import type {ParamListBase} from '@react-navigation/native';
-import React, {useEffect} from 'react';
+import {searchResultsSelector} from '@selectors/Snapshot';
+import React, {useEffect, useMemo} from 'react';
 import {View} from 'react-native';
 import {useSearchContext} from '@components/Search/SearchContext';
 import useLocalize from '@hooks/useLocalize';
 import useNetwork from '@hooks/useNetwork';
+import useOnyx from '@hooks/useOnyx';
 import useResponsiveLayout from '@hooks/useResponsiveLayout';
 import useThemeStyles from '@hooks/useThemeStyles';
 import type {PlatformStackNavigationState} from '@libs/Navigation/PlatformStackNavigation/types';
 import type {SearchFullscreenNavigatorParamList} from '@libs/Navigation/types';
 import {buildSearchQueryJSON} from '@libs/SearchQueryUtils';
 import SearchTypeMenu from '@pages/Search/SearchTypeMenu';
+import CONST from '@src/CONST';
+import ONYXKEYS from '@src/ONYXKEYS';
 import SCREENS from '@src/SCREENS';
 import NavigationTabBar from './NavigationTabBar';
 import NAVIGATION_TABS from './NavigationTabBar/NAVIGATION_TABS';
@@ -27,22 +31,31 @@ function SearchSidebar({state}: SearchSidebarProps) {
 
     const route = state.routes.at(-1);
     const params = route?.params as SearchFullscreenNavigatorParamList[typeof SCREENS.SEARCH.ROOT] | undefined;
-    const {lastSearchType, setLastSearchType, currentSearchResults} = useSearchContext();
+    const {lastSearchType, setLastSearchType} = useSearchContext();
 
-    const queryJSON = params?.q ? buildSearchQueryJSON(params.q, params.rawQuery) : undefined;
+    const queryJSON = useMemo(() => {
+        if (!params?.q) {
+            return undefined;
+        }
+
+        return buildSearchQueryJSON(params.q, params.rawQuery);
+    }, [params?.q, params?.rawQuery]);
 
-    const searchType = currentSearchResults?.search?.type;
-    const isSearchLoading = currentSearchResults?.search?.isLoading;
+    const currentSearchResultsKey = queryJSON?.hash ?? CONST.DEFAULT_NUMBER_ID;
+    const [currentSearchResults] = useOnyx(`${ONYXKEYS.COLLECTION.SNAPSHOT}${currentSearchResultsKey}`, {
+        canBeMissing: true,
+        selector: searchResultsSelector,
+    });
 
     useEffect(() => {
-        if (!searchType) {
+        if (!currentSearchResults?.type) {
             return;
         }
 
-        setLastSearchType(searchType);
-    }, [lastSearchType, queryJSON, setLastSearchType, searchType]);
+        setLastSearchType(currentSearchResults.type);
+    }, [lastSearchType, queryJSON, setLastSearchType, currentSearchResults?.type]);
 
-    const shouldShowLoadingState = route?.name === SCREENS.RIGHT_MODAL.SEARCH_MONEY_REQUEST_REPORT ? false : !isOffline && !!isSearchLoading;
+    const shouldShowLoadingState = route?.name === SCREENS.SEARCH.MONEY_REQUEST_REPORT ? false : !isOffline && !!currentSearchResults?.isLoading;
 
     if (shouldUseNarrowLayout) {
         return null;
diff --git a/src/components/NumberWithSymbolForm.tsx b/src/components/NumberWithSymbolForm.tsx
index 10b373a81660..b218de77b702 100644
--- a/src/components/NumberWithSymbolForm.tsx
+++ b/src/components/NumberWithSymbolForm.tsx
@@ -458,7 +458,6 @@ function NumberWithSymbolForm({
             isNegative={isNegative}
             toggleNegative={toggleNegative}
             onFocus={props.onFocus}
-            accessibilityLabel={props.accessibilityLabel}
         />
     );
 
diff --git a/src/components/ParentNavigationSubtitle.tsx b/src/components/ParentNavigationSubtitle.tsx
index e04d280a1628..301b09e06ceb 100644
--- a/src/components/ParentNavigationSubtitle.tsx
+++ b/src/components/ParentNavigationSubtitle.tsx
@@ -12,8 +12,8 @@ import useTheme from '@hooks/useTheme';
 import useThemeStyles from '@hooks/useThemeStyles';
 import {isFullScreenName} from '@libs/Navigation/helpers/isNavigatorName';
 import Navigation from '@libs/Navigation/Navigation';
-import type {RightModalNavigatorParamList} from '@libs/Navigation/types';
-import {getReportAction, isReportActionVisible} from '@libs/ReportActionsUtils';
+import type {SearchFullscreenNavigatorParamList} from '@libs/Navigation/types';
+import {getReportAction, shouldReportActionBeVisible} from '@libs/ReportActionsUtils';
 import {canUserPerformWriteAction as canUserPerformWriteActionReportUtils, isMoneyRequestReport} from '@libs/ReportUtils';
 import CONST from '@src/CONST';
 import type {ParentNavigationSummaryParams} from '@src/languages/params';
@@ -88,27 +88,11 @@ function ParentNavigationSubtitle({
     const {translate} = useLocalize();
     const [currentReport] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${reportID}`, {canBeMissing: false});
     const [report] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${parentReportID}`, {canBeMissing: false});
-    const [visibleReportActionsData] = useOnyx(ONYXKEYS.DERIVED.VISIBLE_REPORT_ACTIONS, {canBeMissing: true});
     const isReportArchived = useReportIsArchived(report?.reportID);
     const canUserPerformWriteAction = canUserPerformWriteActionReportUtils(report, isReportArchived);
     const isReportInRHP = currentRoute.name === SCREENS.RIGHT_MODAL.SEARCH_REPORT;
+    const currentFullScreenRoute = useRootNavigationState((state) => state?.routes?.findLast((route) => isFullScreenName(route.name)));
     const hasAccessToParentReport = currentReport?.hasParentAccess !== false;
-    const {currentFullScreenRoute, currentFocusedNavigator} = useRootNavigationState((state) => {
-        const fullScreenRoute = state?.routes?.findLast((route) => isFullScreenName(route.name));
-
-        // We need to track which navigator is focused to handle parent report navigation correctly:
-        // if we are in RHP, and parent report is opened in RHP, we want to go back to the parent report
-        const focusedNavigator = state?.routes
-            ? state.routes.findLast((route) => {
-                  return route.state?.routes && route.state.routes.length > 0;
-              })
-            : undefined;
-
-        return {
-            currentFullScreenRoute: fullScreenRoute,
-            currentFocusedNavigator: focusedNavigator,
-        };
-    });
 
     // We should not display the parent navigation subtitle if the user does not have access to the parent chat (the reportName is empty in this case)
     if (!reportName) {
@@ -117,24 +101,18 @@ function ParentNavigationSubtitle({
 
     const onPress = () => {
         const parentAction = getReportAction(parentReportID, parentReportActionID);
-        const isVisibleAction = isReportActionVisible(parentAction, parentReportID, canUserPerformWriteAction, visibleReportActionsData);
-
-        const focusedNavigatorState = currentFocusedNavigator?.state;
-        const currentReportIndex = focusedNavigatorState?.index;
+        const isVisibleAction = shouldReportActionBeVisible(parentAction, parentAction?.reportActionID ?? CONST.DEFAULT_NUMBER_ID, canUserPerformWriteAction);
 
         if (openParentReportInCurrentTab && isReportInRHP) {
             // If the report is displayed in RHP in Reports tab, we want to stay in the current tab after opening the parent report
             if (currentFullScreenRoute?.name === NAVIGATORS.SEARCH_FULLSCREEN_NAVIGATOR && isMoneyRequestReport(report)) {
-                // Dismiss wide RHP and go back to already opened super wide RHP if the parent report is already opened there
-                if (currentFocusedNavigator?.name === NAVIGATORS.RIGHT_MODAL_NAVIGATOR && currentReportIndex && currentReportIndex > 0) {
-                    const previousRoute = focusedNavigatorState.routes[currentReportIndex - 1];
-
-                    if (previousRoute?.name === SCREENS.RIGHT_MODAL.SEARCH_MONEY_REQUEST_REPORT) {
-                        const moneyRequestReportID = (previousRoute?.params as RightModalNavigatorParamList[typeof SCREENS.RIGHT_MODAL.SEARCH_MONEY_REQUEST_REPORT])?.reportID;
-                        if (moneyRequestReportID === parentReportID) {
-                            Navigation.goBack();
-                            return;
-                        }
+                const lastRoute = currentFullScreenRoute?.state?.routes.at(-1);
+                if (lastRoute?.name === SCREENS.SEARCH.MONEY_REQUEST_REPORT) {
+                    const moneyRequestReportID = (lastRoute?.params as SearchFullscreenNavigatorParamList[typeof SCREENS.SEARCH.MONEY_REQUEST_REPORT])?.reportID;
+                    // If the parent report is already displayed underneath RHP, simply dismiss the modal
+                    if (moneyRequestReportID === parentReportID) {
+                        Navigation.dismissModal();
+                        return;
                     }
                 }
 
@@ -142,11 +120,6 @@ function ParentNavigationSubtitle({
                 return;
             }
 
-            if (Navigation.getTopmostSuperWideRHPReportID() === parentReportID && currentFullScreenRoute?.name === NAVIGATORS.REPORTS_SPLIT_NAVIGATOR) {
-                Navigation.dismissToSuperWideRHP();
-                return;
-            }
-
             // If the parent report is already displayed underneath RHP, simply dismiss the modal
             if (Navigation.getTopmostReportId() === parentReportID && currentFullScreenRoute?.name === NAVIGATORS.REPORTS_SPLIT_NAVIGATOR) {
                 Navigation.dismissModal();
@@ -156,27 +129,12 @@ function ParentNavigationSubtitle({
 
         // When viewing a money request in the search navigator, open the parent report in a right-hand pane (RHP)
         // to preserve the search context instead of navigating away.
-        if (openParentReportInCurrentTab && currentFocusedNavigator?.name === NAVIGATORS.RIGHT_MODAL_NAVIGATOR) {
-            const lastRoute = currentFocusedNavigator?.state?.routes.at(-1);
-            if (lastRoute?.name === SCREENS.RIGHT_MODAL.SEARCH_MONEY_REQUEST_REPORT) {
+        if (openParentReportInCurrentTab && currentFullScreenRoute?.name === NAVIGATORS.SEARCH_FULLSCREEN_NAVIGATOR) {
+            const lastRoute = currentFullScreenRoute?.state?.routes.at(-1);
+            if (lastRoute?.name === SCREENS.SEARCH.MONEY_REQUEST_REPORT) {
                 Navigation.navigate(ROUTES.SEARCH_REPORT.getRoute({reportID: parentReportID, reportActionID: parentReportActionID}));
                 return;
             }
-
-            // Specific case: when opening expense report from search report (chat RHP),
-            // avoid stacking RHPs by going back to the search report if it's already there
-            const previousRoute = currentFocusedNavigator?.state?.routes.at(-2);
-
-            if (previousRoute?.name === SCREENS.RIGHT_MODAL.SEARCH_REPORT && lastRoute?.name === SCREENS.RIGHT_MODAL.EXPENSE_REPORT) {
-                if (previousRoute.params && 'reportID' in previousRoute.params) {
-                    const reportIDFromParams = previousRoute.params.reportID;
-
-                    if (reportIDFromParams === parentReportID) {
-                        Navigation.goBack();
-                        return;
-                    }
-                }
-            }
         }
 
         if (isVisibleAction) {
diff --git a/src/components/PerDiemEReceipt.tsx b/src/components/PerDiemEReceipt.tsx
index a97c55092a69..6d9542b3f36f 100644
--- a/src/components/PerDiemEReceipt.tsx
+++ b/src/components/PerDiemEReceipt.tsx
@@ -1,12 +1,11 @@
 import React from 'react';
 import {View} from 'react-native';
-import useCurrencyList from '@hooks/useCurrencyList';
 import {useMemoizedLazyExpensifyIcons} from '@hooks/useLazyAsset';
 import useLocalize from '@hooks/useLocalize';
 import useOnyx from '@hooks/useOnyx';
 import useStyleUtils from '@hooks/useStyleUtils';
 import useThemeStyles from '@hooks/useThemeStyles';
-import {convertAmountToDisplayString, convertToDisplayStringWithoutCurrency} from '@libs/CurrencyUtils';
+import {convertAmountToDisplayString, convertToDisplayStringWithoutCurrency, getCurrencySymbol} from '@libs/CurrencyUtils';
 import getNonEmptyStringOnyxID from '@libs/getNonEmptyStringOnyxID';
 import {getTransactionDetails} from '@libs/ReportUtils';
 import variables from '@styles/variables';
@@ -53,7 +52,6 @@ function PerDiemEReceipt({transactionID}: PerDiemEReceiptProps) {
     const styles = useThemeStyles();
     const StyleUtils = useStyleUtils();
     const {translate} = useLocalize();
-    const {getCurrencySymbol} = useCurrencyList();
     const icons = useMemoizedLazyExpensifyIcons(['ExpensifyWordmark']);
     const [transaction] = useOnyx(`${ONYXKEYS.COLLECTION.TRANSACTION}${getNonEmptyStringOnyxID(transactionID)}`, {
         canBeMissing: true,
diff --git a/src/components/PlaidCardFeedIcon.tsx b/src/components/PlaidCardFeedIcon.tsx
index c42cd1cbc3a2..a01681d67c4d 100644
--- a/src/components/PlaidCardFeedIcon.tsx
+++ b/src/components/PlaidCardFeedIcon.tsx
@@ -8,17 +8,15 @@ import variables from '@styles/variables';
 import ActivityIndicator from './ActivityIndicator';
 import Icon from './Icon';
 import Image from './Image';
-import CardIconSkeleton from './Skeletons/CardIconSkeleton';
 
 type PlaidCardFeedIconProps = {
     plaidUrl: string;
     style?: StyleProp<ViewStyle>;
     isLarge?: boolean;
     isSmall?: boolean;
-    useSkeletonLoader?: boolean;
 };
 
-function PlaidCardFeedIcon({plaidUrl, style, isLarge, isSmall, useSkeletonLoader = false}: PlaidCardFeedIconProps) {
+function PlaidCardFeedIcon({plaidUrl, style, isLarge, isSmall}: PlaidCardFeedIconProps) {
     const [isBrokenImage, setIsBrokenImage] = useState<boolean>(false);
     const styles = useThemeStyles();
     const illustrations = useThemeIllustrations();
@@ -58,18 +56,11 @@ function PlaidCardFeedIcon({plaidUrl, style, isLarge, isSmall, useSkeletonLoader
                         onError={() => setIsBrokenImage(true)}
                         onLoadEnd={() => setLoading(false)}
                     />
-                    {loading && useSkeletonLoader && (
-                        <CardIconSkeleton
-                            width={iconWidth}
-                            height={iconHeight}
-                        />
-                    )}
-                    {loading && !useSkeletonLoader && (
+                    {loading ? (
                         <View style={[styles.justifyContentCenter, {width: iconWidth, height: iconHeight}]}>
                             <ActivityIndicator size={isSmall ? 10 : 20} />
                         </View>
-                    )}
-                    {!loading && (
+                    ) : (
                         <Icon
                             src={isLarge ? companyCardFeedIcons.PlaidCompanyCardDetailLarge : companyCardBankIcons.PlaidCompanyCardDetail}
                             height={iconHeight}
diff --git a/src/components/PopoverMenu.tsx b/src/components/PopoverMenu.tsx
index 1e8296815d23..eea11c2081a7 100644
--- a/src/components/PopoverMenu.tsx
+++ b/src/components/PopoverMenu.tsx
@@ -7,7 +7,6 @@ import type {GestureResponderEvent, LayoutChangeEvent, StyleProp, TextStyle, Vie
 import useArrowKeyFocusManager from '@hooks/useArrowKeyFocusManager';
 import useKeyboardShortcut from '@hooks/useKeyboardShortcut';
 import {useMemoizedLazyExpensifyIcons} from '@hooks/useLazyAsset';
-import useLocalize from '@hooks/useLocalize';
 import usePrevious from '@hooks/usePrevious';
 import useResponsiveLayout from '@hooks/useResponsiveLayout';
 import useStyleUtils from '@hooks/useStyleUtils';
@@ -288,7 +287,6 @@ function BasePopoverMenu({
     const styles = useThemeStyles();
     const theme = useTheme();
     const StyleUtils = useStyleUtils();
-    const {translate} = useLocalize();
     // We need to use isSmallScreenWidth instead of shouldUseNarrowLayout to apply correct popover styles
     // eslint-disable-next-line rulesdir/prefer-shouldUseNarrowLayout-instead-of-isSmallScreenWidth
     const {isSmallScreenWidth} = useResponsiveLayout();
@@ -346,7 +344,6 @@ function BasePopoverMenu({
         const previousMenuItems = getPreviousSubMenu();
         const previouslySelectedItem = previousMenuItems[enteredSubMenuIndexes[enteredSubMenuIndexes.length - 1]];
         const hasBackButtonText = !!previouslySelectedItem?.backButtonText;
-        const backButtonTitle = hasBackButtonText ? previouslySelectedItem?.backButtonText : previouslySelectedItem?.text;
 
         return (
             <MenuItem
@@ -355,8 +352,7 @@ function BasePopoverMenu({
                 iconFill={(isHovered) => (isHovered ? theme.iconHovered : theme.icon)}
                 style={hasBackButtonText ? styles.pv0 : undefined}
                 additionalIconStyles={[{width: variables.iconSizeSmall, height: variables.iconSizeSmall}, styles.opacitySemiTransparent, styles.mr1]}
-                title={backButtonTitle}
-                accessibilityLabel={`${translate('common.goBack')}, ${backButtonTitle}`}
+                title={hasBackButtonText ? previouslySelectedItem?.backButtonText : previouslySelectedItem?.text}
                 titleStyle={hasBackButtonText ? styles.createMenuHeaderText : undefined}
                 shouldShowBasicTitle={hasBackButtonText}
                 shouldCheckActionAllowedOnPress={false}
@@ -403,7 +399,6 @@ function BasePopoverMenu({
                     shouldRemoveHoverBackground={item.isSelected}
                     titleStyle={StyleSheet.flatten([styles.flex1, item.titleStyle])}
                     icon={icon}
-                    role={CONST.ROLE.BUTTON}
                     // Spread other props dynamically
                     {...menuItemProps}
                     hasSubMenuItems={!!subMenuItems?.length}
diff --git a/src/components/Pressable/GenericPressable/implementation/BaseGenericPressable.tsx b/src/components/Pressable/GenericPressable/implementation/BaseGenericPressable.tsx
index 72fe50bd4561..513e3df69bb0 100644
--- a/src/components/Pressable/GenericPressable/implementation/BaseGenericPressable.tsx
+++ b/src/components/Pressable/GenericPressable/implementation/BaseGenericPressable.tsx
@@ -39,7 +39,6 @@ function GenericPressable({
     ref,
     dataSet,
     forwardedFSClass,
-    accessibilityState,
     ...rest
 }: PressableProps) {
     const styles = useThemeStyles();
@@ -174,10 +173,9 @@ function GenericPressable({
             // accessibility props
             accessibilityState={{
                 disabled: isDisabled,
-                ...accessibilityState,
+                ...rest.accessibilityState,
             }}
             aria-disabled={isDisabled}
-            aria-selected={accessibilityState?.selected}
             aria-keyshortcuts={keyboardShortcut && `${keyboardShortcut.modifiers.join('')}+${keyboardShortcut.shortcutKey}`}
             // ios-only form of inputs
             onMagicTap={!isDisabled ? voidOnPressHandler : undefined}
diff --git a/src/components/ProcessMoneyReportHoldMenu.tsx b/src/components/ProcessMoneyReportHoldMenu.tsx
index f90caa084916..c34f11928ddc 100644
--- a/src/components/ProcessMoneyReportHoldMenu.tsx
+++ b/src/components/ProcessMoneyReportHoldMenu.tsx
@@ -1,4 +1,4 @@
-import React, {useContext, useMemo} from 'react';
+import React, {useMemo} from 'react';
 import type {OnyxEntry} from 'react-native-onyx';
 import useCurrentUserPersonalDetails from '@hooks/useCurrentUserPersonalDetails';
 import useLocalize from '@hooks/useLocalize';
@@ -14,7 +14,6 @@ import type * as OnyxTypes from '@src/types/onyx';
 import type {PaymentMethodType} from '@src/types/onyx/OriginalMessage';
 import type DeepValueOf from '@src/types/utils/DeepValueOf';
 import DecisionModal from './DecisionModal';
-import {DelegateNoAccessContext} from './DelegateNoAccessModalProvider';
 
 type ActionHandledType = DeepValueOf<typeof CONST.IOU.REPORT_ACTION_TYPE.PAY | typeof CONST.IOU.REPORT_ACTION_TYPE.APPROVE>;
 
@@ -48,14 +47,11 @@ type ProcessMoneyReportHoldMenuProps = {
 
     /** Callback for displaying payment animation on IOU preview component */
     startAnimation?: () => void;
-
-    /** Whether the report has non held expenses */
-    hasNonHeldExpenses?: boolean;
 };
 
 function ProcessMoneyReportHoldMenu({
     requestType,
-    nonHeldAmount = '0',
+    nonHeldAmount,
     fullAmount,
     onClose,
     isVisible,
@@ -64,7 +60,6 @@ function ProcessMoneyReportHoldMenu({
     moneyRequestReport,
     transactionCount,
     startAnimation,
-    hasNonHeldExpenses,
 }: ProcessMoneyReportHoldMenuProps) {
     const {translate} = useLocalize();
     const isApprove = requestType === CONST.IOU.REPORT_ACTION_TYPE.APPROVE;
@@ -82,13 +77,7 @@ function ProcessMoneyReportHoldMenu({
     const currentUserDetails = useCurrentUserPersonalDetails();
     const hasViolations = hasViolationsReportUtils(moneyRequestReport?.reportID, transactionViolations, currentUserDetails.accountID, currentUserDetails.email ?? '');
 
-    const {isDelegateAccessRestricted, showDelegateNoAccessModal} = useContext(DelegateNoAccessContext);
     const onSubmit = (full: boolean) => {
-        if (isDelegateAccessRestricted) {
-            showDelegateNoAccessModal();
-            return;
-        }
-
         if (isApprove) {
             if (startAnimation) {
                 startAnimation();
@@ -113,11 +102,11 @@ function ProcessMoneyReportHoldMenu({
     };
 
     const promptText = useMemo(() => {
-        if (hasNonHeldExpenses) {
+        if (nonHeldAmount) {
             return translate(isApprove ? 'iou.confirmApprovalAmount' : 'iou.confirmPayAmount');
         }
         return translate(isApprove ? 'iou.confirmApprovalAllHoldAmount' : 'iou.confirmPayAllHoldAmount', {count: transactionCount});
-    }, [hasNonHeldExpenses, transactionCount, translate, isApprove]);
+    }, [nonHeldAmount, transactionCount, translate, isApprove]);
 
     return (
         <DecisionModal
@@ -125,7 +114,7 @@ function ProcessMoneyReportHoldMenu({
             onClose={onClose}
             isVisible={isVisible}
             prompt={promptText}
-            firstOptionText={hasNonHeldExpenses ? `${translate(isApprove ? 'iou.approveOnly' : 'iou.payOnly')} ${nonHeldAmount}` : undefined}
+            firstOptionText={nonHeldAmount ? `${translate(isApprove ? 'iou.approveOnly' : 'iou.payOnly')} ${nonHeldAmount}` : undefined}
             secondOptionText={`${translate(isApprove ? 'iou.approve' : 'iou.pay')} ${fullAmount}`}
             onFirstOptionSubmit={() => onSubmit(false)}
             onSecondOptionSubmit={() => onSubmit(true)}
diff --git a/src/components/ReferralProgramCTA.tsx b/src/components/ReferralProgramCTA.tsx
index 153bfb03a5d7..cca34fd45ae5 100644
--- a/src/components/ReferralProgramCTA.tsx
+++ b/src/components/ReferralProgramCTA.tsx
@@ -51,7 +51,7 @@ function ReferralProgramCTA({referralContentType, style, onDismiss}: ReferralPro
             }}
             style={[styles.br2, styles.highlightBG, styles.flexRow, styles.justifyContentBetween, styles.alignItemsCenter, {gap: 10, padding: 10}, styles.pl5, style]}
             isNested
-            accessibilityLabel={translate(`referralProgram.${referralContentType}.header`)}
+            accessibilityLabel="referral"
             role={getButtonRole(true)}
         >
             <RenderHTML html={translate(`referralProgram.${referralContentType}.buttonText`)} />
diff --git a/src/components/ReportActionAvatars/useReportPreviewSenderID.ts b/src/components/ReportActionAvatars/useReportPreviewSenderID.ts
index 9bd649b8e8d0..bf8bd20c9258 100644
--- a/src/components/ReportActionAvatars/useReportPreviewSenderID.ts
+++ b/src/components/ReportActionAvatars/useReportPreviewSenderID.ts
@@ -1,6 +1,5 @@
 import {useMemo} from 'react';
 import type {OnyxEntry} from 'react-native-onyx';
-import useCurrentUserPersonalDetails from '@hooks/useCurrentUserPersonalDetails';
 import useOnyx from '@hooks/useOnyx';
 import useTransactionsAndViolationsForReport from '@hooks/useTransactionsAndViolationsForReport';
 import getNonEmptyStringOnyxID from '@libs/getNonEmptyStringOnyxID';
@@ -8,6 +7,7 @@ import {getAllNonDeletedTransactions} from '@libs/MoneyRequestReportUtils';
 import {getPersonalDetailByEmail} from '@libs/PersonalDetailsUtils';
 import {getOriginalMessage, isMoneyRequestAction, isSentMoneyReportAction} from '@libs/ReportActionsUtils';
 import {isDM, isIOUReport} from '@libs/ReportUtils';
+import {getCurrentUserAccountID} from '@userActions/Report';
 import CONST from '@src/CONST';
 import ONYXKEYS from '@src/ONYXKEYS';
 import type {Report, ReportAction, ReportActions, Transaction} from '@src/types/onyx';
@@ -65,10 +65,9 @@ function useReportPreviewSenderID({iouReport, action, chatReport}: {action: Onyx
     const [policy] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY}${getNonEmptyStringOnyxID(shouldFetchData ? iouReport?.policyID : undefined)}`, {
         canBeMissing: true,
     });
-    const {accountID: currentUserAccountID} = useCurrentUserPersonalDetails();
 
     if (isOptimisticReportPreview) {
-        return currentUserAccountID;
+        return getCurrentUserAccountID();
     }
 
     // 1. If all amounts have the same sign - either all amounts are positive or all amounts are negative.
diff --git a/src/components/ReportActionItem/MoneyReportView.tsx b/src/components/ReportActionItem/MoneyReportView.tsx
index 70e260c4ec45..2d87221b0d56 100644
--- a/src/components/ReportActionItem/MoneyReportView.tsx
+++ b/src/components/ReportActionItem/MoneyReportView.tsx
@@ -18,14 +18,13 @@ import useStyleUtils from '@hooks/useStyleUtils';
 import useTheme from '@hooks/useTheme';
 import useThemeStyles from '@hooks/useThemeStyles';
 import {convertToDisplayString} from '@libs/CurrencyUtils';
-import {resolveReportFieldValue} from '@libs/Formula';
 import Navigation from '@libs/Navigation/Navigation';
 import {
+    getAvailableReportFields,
     getFieldViolation,
     getFieldViolationTranslation,
     getMoneyRequestSpendBreakdown,
     getReportFieldKey,
-    getReportFieldMaps,
     hasUpdatedTotal,
     isClosedExpenseReportWithNoExpenses as isClosedExpenseReportWithNoExpensesReportUtils,
     isInvoiceReport as isInvoiceReportUtils,
@@ -42,7 +41,7 @@ import CONST from '@src/CONST';
 import {clearReportFieldKeyErrors} from '@src/libs/actions/Report';
 import ONYXKEYS from '@src/ONYXKEYS';
 import ROUTES from '@src/ROUTES';
-import type {Policy, Report} from '@src/types/onyx';
+import type {Policy, PolicyReportField, Report} from '@src/types/onyx';
 import type {PendingAction} from '@src/types/onyx/OnyxCommon';
 
 type MoneyReportViewProps = {
@@ -90,12 +89,9 @@ function MoneyReportView({report, policy, isCombinedReport = false, shouldShowTo
 
     const [violations] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT_VIOLATIONS}${report?.reportID}`, {canBeMissing: true});
 
-    const {sortedPolicyReportFields, fieldValues, fieldsByName} = useMemo(() => {
-        const {fieldValues: values, fieldsByName: byName} = getReportFieldMaps(report, policy?.fieldList ?? {});
-        const sorted = Object.values(byName)
-            .filter((field) => field.target === report?.type)
-            .sort(({orderWeight: a}, {orderWeight: b}) => a - b);
-        return {sortedPolicyReportFields: sorted, fieldValues: values, fieldsByName: byName};
+    const sortedPolicyReportFields = useMemo<PolicyReportField[]>((): PolicyReportField[] => {
+        const fields = getAvailableReportFields(report, Object.values(policy?.fieldList ?? {}));
+        return fields.filter((field) => field.target === report?.type).sort(({orderWeight: firstOrderWeight}, {orderWeight: secondOrderWeight}) => firstOrderWeight - secondOrderWeight);
     }, [policy?.fieldList, report]);
 
     const enabledReportFields = sortedPolicyReportFields.filter(
@@ -142,7 +138,7 @@ function MoneyReportView({report, policy, isCombinedReport = false, shouldShowTo
                                     return null;
                                 }
 
-                                const fieldValue = resolveReportFieldValue(reportField, report, policy, fieldValues, fieldsByName);
+                                const fieldValue = reportField.value ?? reportField.defaultValue;
                                 const isFieldDisabled = isReportFieldDisabledForUser(report, reportField, policy);
                                 const fieldKey = getReportFieldKey(reportField.fieldID);
 
diff --git a/src/components/ReportActionItem/MoneyRequestReceiptView.tsx b/src/components/ReportActionItem/MoneyRequestReceiptView.tsx
index 07fc3fa7d0d3..f8d4347c71ac 100644
--- a/src/components/ReportActionItem/MoneyRequestReceiptView.tsx
+++ b/src/components/ReportActionItem/MoneyRequestReceiptView.tsx
@@ -136,8 +136,7 @@ function MoneyRequestReceiptView({
     const canEdit = isMoneyRequestAction(parentReportAction) && canEditMoneyRequest(parentReportAction, isChatReportArchived, moneyRequestReport, policy, transaction) && isEditable;
     const companyCardPageURL = `${environmentURL}/${ROUTES.WORKSPACE_COMPANY_CARDS.getRoute(report?.policyID)}`;
 
-    const canEditReceipt =
-        isEditable && canEditFieldOfMoneyRequest(parentReportAction, CONST.EDIT_REQUEST_FIELD.RECEIPT, undefined, isChatReportArchived, undefined, transaction, moneyRequestReport, policy);
+    const canEditReceipt = isEditable && canEditFieldOfMoneyRequest(parentReportAction, CONST.EDIT_REQUEST_FIELD.RECEIPT, undefined, isChatReportArchived);
 
     const iouType = useMemo(() => {
         if (isTrackExpense) {
@@ -160,8 +159,7 @@ function MoneyRequestReceiptView({
 
     const transactionToCheck = updatedTransaction ?? transaction;
     const doesTransactionHaveReceipt = !!transactionToCheck?.receipt && !isEmptyObject(transactionToCheck?.receipt);
-    // Empty state for invoices should be displayed only in WideRHP
-    const shouldShowReceiptEmptyState = (isDisplayedInWideRHP || !isInvoice) && !hasReceipt && !!transactionToCheck && !doesTransactionHaveReceipt;
+    const shouldShowReceiptEmptyState = !isInvoice && !hasReceipt && !!transactionToCheck && !doesTransactionHaveReceipt;
 
     const [receiptImageViolations, receiptViolations] = useMemo(() => {
         const imageViolations = [];
diff --git a/src/components/ReportActionItem/MoneyRequestReportPreview/MoneyRequestReportPreviewContent.tsx b/src/components/ReportActionItem/MoneyRequestReportPreview/MoneyRequestReportPreviewContent.tsx
index d36c1dad5985..c2819921fd91 100644
--- a/src/components/ReportActionItem/MoneyRequestReportPreview/MoneyRequestReportPreviewContent.tsx
+++ b/src/components/ReportActionItem/MoneyRequestReportPreview/MoneyRequestReportPreviewContent.tsx
@@ -143,8 +143,7 @@ function MoneyRequestReportPreviewContent({
     const StyleUtils = useStyleUtils();
     const {translate, formatPhoneNumber} = useLocalize();
     const {isOffline} = useNetwork();
-    // eslint-disable-next-line rulesdir/prefer-shouldUseNarrowLayout-instead-of-isSmallScreenWidth
-    const {shouldUseNarrowLayout, isSmallScreenWidth} = useResponsiveLayout();
+    const {shouldUseNarrowLayout} = useResponsiveLayout();
     const currentUserDetails = useCurrentUserPersonalDetails();
     const currentUserAccountID = currentUserDetails.accountID;
     const currentUserEmail = currentUserDetails.email ?? '';
@@ -384,8 +383,6 @@ function MoneyRequestReportPreviewContent({
         [action?.childStateNum, action?.childStatusNum, iouReport?.stateNum, iouReport?.statusNum, translate],
     );
 
-    const shouldShowReportStatus = !!reportStatus && !!expenseCount;
-
     const reportStatusColorStyle = useMemo(
         () => getReportStatusColorStyle(theme, iouReport?.stateNum ?? action?.childStateNum, iouReport?.statusNum ?? action?.childStatusNum),
         [action?.childStateNum, action?.childStatusNum, iouReport?.stateNum, iouReport?.statusNum, theme],
@@ -520,14 +517,9 @@ function MoneyRequestReportPreviewContent({
             name: 'MoneyRequestReportPreviewContent',
             op: CONST.TELEMETRY.SPAN_OPEN_REPORT,
         });
-        // Small screens navigate to full report view since super wide RHP
-        // is not available on narrow layouts and would break the navigation logic.
-        if (isSmallScreenWidth) {
-            Navigation.navigate(ROUTES.REPORT_WITH_ID.getRoute(iouReportID, undefined, undefined, Navigation.getActiveRoute()));
-        } else {
-            Navigation.navigate(ROUTES.EXPENSE_REPORT_RHP.getRoute({reportID: iouReportID, backTo: Navigation.getActiveRoute()}));
-        }
-    }, [iouReportID, isSmallScreenWidth]);
+
+        Navigation.navigate(ROUTES.REPORT_WITH_ID.getRoute(iouReportID, undefined, undefined, Navigation.getActiveRoute()));
+    }, [iouReportID]);
 
     const isDEWPolicy = hasDynamicExternalWorkflow(policy);
     const isDEWSubmitPending = hasPendingDEWSubmit(iouReportMetadata, isDEWPolicy);
@@ -645,7 +637,7 @@ function MoneyRequestReportPreviewContent({
         ) : null,
         [CONST.REPORT.REPORT_PREVIEW_ACTIONS.VIEW]: (
             <Button
-                text={translate('common.view')}
+                text={shouldShowAccessPlaceHolder ? translate('common.viewReport') : translate('common.view')}
                 onPress={() => {
                     openReportFromPreview();
                 }}
@@ -746,10 +738,9 @@ function MoneyRequestReportPreviewContent({
                                                 {showStatusAndSkeleton && shouldShowSkeleton ? (
                                                     <MoneyReportHeaderStatusBarSkeleton />
                                                 ) : (
-                                                    (!shouldShowEmptyPlaceholder || shouldShowAccessPlaceHolder) &&
-                                                    (shouldShowReportStatus || !shouldShowAccessPlaceHolder) && (
+                                                    (!shouldShowEmptyPlaceholder || shouldShowAccessPlaceHolder) && (
                                                         <View style={[styles.flexRow, styles.justifyContentStart, styles.alignItemsCenter]}>
-                                                            {shouldShowReportStatus && (
+                                                            {!!reportStatus && !!expenseCount && (
                                                                 <View
                                                                     style={[
                                                                         styles.reportStatusContainer,
diff --git a/src/components/ReportActionItem/MoneyRequestReportPreview/index.tsx b/src/components/ReportActionItem/MoneyRequestReportPreview/index.tsx
index 957cc1db45f8..3de2093e0fb3 100644
--- a/src/components/ReportActionItem/MoneyRequestReportPreview/index.tsx
+++ b/src/components/ReportActionItem/MoneyRequestReportPreview/index.tsx
@@ -41,8 +41,7 @@ function MoneyRequestReportPreview({
 }: MoneyRequestReportPreviewProps) {
     const styles = useThemeStyles();
     const StyleUtils = useStyleUtils();
-    // eslint-disable-next-line rulesdir/prefer-shouldUseNarrowLayout-instead-of-isSmallScreenWidth
-    const {shouldUseNarrowLayout, isSmallScreenWidth} = useResponsiveLayout();
+    const {shouldUseNarrowLayout} = useResponsiveLayout();
     const personalDetailsList = usePersonalDetails();
     const chatReport = allReports?.[`${ONYXKEYS.COLLECTION.REPORT}${chatReportID}`];
     const invoiceReceiverPolicy =
@@ -97,7 +96,7 @@ function MoneyRequestReportPreview({
         }
 
         // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
-        return transactions.some((transaction) => (Number(transaction?.modifiedAmount) || transaction?.amount) < 0);
+        return transactions.some((transaction) => (transaction?.modifiedAmount || transaction?.amount) < 0);
     }, [transactions, action.childType, iouReport]);
 
     const openReportFromPreview = useCallback(() => {
@@ -111,14 +110,8 @@ function MoneyRequestReportPreview({
             name: 'MoneyRequestReportPreview',
             op: CONST.TELEMETRY.SPAN_OPEN_REPORT,
         });
-        // Small screens navigate to full report view since super wide RHP
-        // is not available on narrow layouts and would break the navigation logic.
-        if (isSmallScreenWidth) {
-            Navigation.navigate(ROUTES.REPORT_WITH_ID.getRoute(iouReportID, undefined, undefined, Navigation.getActiveRoute()));
-        } else {
-            Navigation.navigate(ROUTES.EXPENSE_REPORT_RHP.getRoute({reportID: iouReportID, backTo: Navigation.getActiveRoute()}));
-        }
-    }, [iouReportID, isSmallScreenWidth]);
+        Navigation.navigate(ROUTES.REPORT_WITH_ID.getRoute(iouReportID, undefined, undefined, Navigation.getActiveRoute()));
+    }, [iouReportID]);
 
     const renderItem: ListRenderItem<Transaction> = ({item}) => (
         <TransactionPreview
diff --git a/src/components/ReportActionItem/MoneyRequestView.tsx b/src/components/ReportActionItem/MoneyRequestView.tsx
index 943e2d94e0d2..c2e31941a049 100644
--- a/src/components/ReportActionItem/MoneyRequestView.tsx
+++ b/src/components/ReportActionItem/MoneyRequestView.tsx
@@ -15,7 +15,6 @@ import Text from '@components/Text';
 import ViolationMessages from '@components/ViolationMessages';
 import {WideRHPContext} from '@components/WideRHPContextProvider';
 import useActiveRoute from '@hooks/useActiveRoute';
-import useCurrencyList from '@hooks/useCurrencyList';
 import useCurrentUserPersonalDetails from '@hooks/useCurrentUserPersonalDetails';
 import useEnvironment from '@hooks/useEnvironment';
 import {useMemoizedLazyExpensifyIcons} from '@hooks/useLazyAsset';
@@ -33,8 +32,6 @@ import useThemeStyles from '@hooks/useThemeStyles';
 import useTransactionViolations from '@hooks/useTransactionViolations';
 import type {ViolationField} from '@hooks/useViolations';
 import useViolations from '@hooks/useViolations';
-import {initSplitExpense, updateMoneyRequestBillable, updateMoneyRequestReimbursable} from '@libs/actions/IOU/index';
-import {getIsMissingAttendeesViolation} from '@libs/AttendeeUtils';
 import {filterPersonalCards, getCompanyCardDescription, mergeCardListWithWorkspaceFeeds} from '@libs/CardUtils';
 import {getDecodedCategoryName, isCategoryMissing} from '@libs/CategoryUtils';
 import {convertToDisplayString} from '@libs/CurrencyUtils';
@@ -102,6 +99,7 @@ import {
 import ViolationsUtils from '@libs/Violations/ViolationsUtils';
 import Navigation from '@navigation/Navigation';
 import AnimatedEmptyStateBackground from '@pages/home/report/AnimatedEmptyStateBackground';
+import {initSplitExpense, updateMoneyRequestBillable, updateMoneyRequestReimbursable} from '@userActions/IOU';
 import CONST from '@src/CONST';
 import type {TranslationPaths} from '@src/languages/types';
 import ONYXKEYS from '@src/ONYXKEYS';
@@ -168,18 +166,18 @@ function MoneyRequestView({
     const {isOffline} = useNetwork();
     const {environmentURL} = useEnvironment();
     const {translate, toLocaleDigit} = useLocalize();
-    const {getCurrencySymbol} = useCurrencyList();
     const {getReportRHPActiveRoute} = useActiveRoute();
     const [lastVisitedPath] = useOnyx(ONYXKEYS.LAST_VISITED_PATH, {canBeMissing: true});
 
     const [allTransactions] = useOnyx(ONYXKEYS.COLLECTION.TRANSACTION, {canBeMissing: false});
 
-    const {currentSearchResults} = useSearchContext();
+    const searchContext = useSearchContext();
+    const searchHash = searchContext?.currentSearchHash ?? CONST.DEFAULT_NUMBER_ID;
+    const [currentSearchResults] = useOnyx(`${ONYXKEYS.COLLECTION.SNAPSHOT}${searchHash}`, {canBeMissing: true});
 
     // When this component is used when merging from the search page, we might not have the parent report stored in the main collection
     let [parentReport] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${parentReportID}`, {canBeMissing: true});
     parentReport = parentReport ?? currentSearchResults?.data[`${ONYXKEYS.COLLECTION.REPORT}${parentReportID}`];
-    const [parentReportNextStep] = useOnyx(`${ONYXKEYS.COLLECTION.NEXT_STEP}${getNonEmptyStringOnyxID(parentReport?.reportID)}`, {canBeMissing: true});
 
     const parentReportActionSelector = (reportActions: OnyxEntry<OnyxTypes.ReportActions>) =>
         transactionThreadReport?.parentReportActionID ? reportActions?.[transactionThreadReport.parentReportActionID] : undefined;
@@ -241,7 +239,6 @@ function MoneyRequestView({
     const currentUserEmailParam = currentUserPersonalDetails.login ?? '';
     const {isBetaEnabled} = usePermissions();
     const isASAPSubmitBetaEnabled = isBetaEnabled(CONST.BETAS.ASAP_SUBMIT);
-    const isZeroExpensesBetaEnabled = isBetaEnabled(CONST.BETAS.ZERO_EXPENSES);
 
     const moneyRequestReport = parentReport;
     const isApproved = isReportApproved({report: moneyRequestReport});
@@ -277,9 +274,7 @@ function MoneyRequestView({
         postedDate: transactionPostedDate,
         convertedAmount: transactionConvertedAmount,
     } = getTransactionDetails(transaction, undefined, undefined, allowNegativeAmount, false, currentUserPersonalDetails) ?? {};
-    const isZeroTransactionAmount = transactionAmount === 0;
-    const isEmptyMerchant =
-        transactionMerchant === '' || transactionMerchant === CONST.TRANSACTION.PARTIAL_TRANSACTION_MERCHANT || transactionMerchant === CONST.TRANSACTION.DEFAULT_MERCHANT;
+    const isEmptyMerchant = transactionMerchant === '' || transactionMerchant === CONST.TRANSACTION.PARTIAL_TRANSACTION_MERCHANT;
     const isDistanceRequest = isDistanceRequestTransactionUtils(transaction);
     const isManualDistanceRequest = isManualDistanceRequestTransactionUtils(transaction, !!mergeTransactionID);
     const isOdometerDistanceRequest = isOdometerDistanceRequestTransactionUtils(transaction);
@@ -292,10 +287,9 @@ function MoneyRequestView({
     // Use the updated transaction amount in merge flow to have correct positive/negative sign
     const actualAmount = isFromMergeTransaction && updatedTransaction ? updatedTransaction.amount : transactionAmount;
     const actualCurrency = updatedTransaction ? getCurrency(updatedTransaction) : transactionCurrency;
-    const shouldDisplayTransactionAmount = (isDistanceRequest && hasRoute) || !isDistanceRequest;
+    const shouldDisplayTransactionAmount = ((isDistanceRequest && hasRoute) || !!actualAmount) && actualAmount !== undefined;
     const formattedTransactionAmount = shouldDisplayTransactionAmount ? convertToDisplayString(actualAmount, actualCurrency) : '';
-    const formattedPerAttendeeAmount =
-        shouldDisplayTransactionAmount && actualAmount !== undefined ? convertToDisplayString(actualAmount / (transactionAttendees?.length ?? 1), actualCurrency) : '';
+    const formattedPerAttendeeAmount = shouldDisplayTransactionAmount ? convertToDisplayString(actualAmount / (actualAttendees?.length ?? 1), actualCurrency) : '';
 
     const transactionOriginalAmount = transaction && getOriginalAmountForDisplay(transaction, isExpenseReport(moneyRequestReport));
     const formattedOriginalAmount = transactionOriginalAmount && transactionOriginalCurrency && convertToDisplayString(transactionOriginalAmount, transactionOriginalCurrency);
@@ -309,7 +303,7 @@ function MoneyRequestView({
         : convertToDisplayString(Math.abs(transactionTaxAmount ?? 0), transactionCurrency);
 
     const taxRatesDescription = taxRates?.name;
-    const taxRateTitle = updatedTransaction ? getTaxName(policy, updatedTransaction, isExpenseUnreported) : getTaxName(policy, transaction, isExpenseUnreported);
+    const taxRateTitle = updatedTransaction ? getTaxName(policy, updatedTransaction) : getTaxName(policy, transaction);
 
     const actualTransactionDate = isFromMergeTransaction && updatedTransaction ? getFormattedCreated(updatedTransaction) : transactionDate;
     const fallbackTaxRateTitle = transaction?.taxValue;
@@ -328,43 +322,26 @@ function MoneyRequestView({
     const companyCardPageURL = `${environmentURL}/${ROUTES.WORKSPACE_COMPANY_CARDS.getRoute(transactionThreadReport?.policyID)}`;
     const [originalTransaction] = useOnyx(`${ONYXKEYS.COLLECTION.TRANSACTION}${getNonEmptyStringOnyxID(transaction?.comment?.originalTransactionID)}`, {canBeMissing: true});
     const {isExpenseSplit} = getOriginalTransactionWithSplitInfo(transaction, originalTransaction);
-    const [transactionReport] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${transaction?.reportID}`, {canBeMissing: true});
-    const isSplitAvailable =
-        moneyRequestReport &&
-        transaction &&
-        isSplitAction(moneyRequestReport, [transaction], originalTransaction, currentUserPersonalDetails.login ?? '', currentUserPersonalDetails.accountID, policy);
+    const isSplitAvailable = moneyRequestReport && transaction && isSplitAction(moneyRequestReport, [transaction], originalTransaction, currentUserPersonalDetails.login ?? '', policy);
 
     const canEditTaxFields = canEdit && !isDistanceRequest;
     const canEditAmount =
         isEditable && (canEditFieldOfMoneyRequest(parentReportAction, CONST.EDIT_REQUEST_FIELD.AMOUNT, undefined, isChatReportArchived) || (isExpenseSplit && isSplitAvailable));
-    const canEditMerchant =
-        isEditable && canEditFieldOfMoneyRequest(parentReportAction, CONST.EDIT_REQUEST_FIELD.MERCHANT, undefined, isChatReportArchived, undefined, transaction, moneyRequestReport, policy);
+    const canEditMerchant = isEditable && canEditFieldOfMoneyRequest(parentReportAction, CONST.EDIT_REQUEST_FIELD.MERCHANT, undefined, isChatReportArchived);
 
-    const canEditDate =
-        isEditable && canEditFieldOfMoneyRequest(parentReportAction, CONST.EDIT_REQUEST_FIELD.DATE, undefined, isChatReportArchived, undefined, transaction, moneyRequestReport, policy);
+    const canEditDate = isEditable && canEditFieldOfMoneyRequest(parentReportAction, CONST.EDIT_REQUEST_FIELD.DATE, undefined, isChatReportArchived);
 
     const canEditDistance =
-        isEditable &&
-        canEditFieldOfMoneyRequest(parentReportAction, CONST.EDIT_REQUEST_FIELD.DISTANCE, undefined, isChatReportArchived, undefined, transaction, moneyRequestReport, policy) &&
-        isPolicyAccessible(policy, currentUserEmailParam);
+        isEditable && canEditFieldOfMoneyRequest(parentReportAction, CONST.EDIT_REQUEST_FIELD.DISTANCE, undefined, isChatReportArchived) && isPolicyAccessible(policy, currentUserEmailParam);
 
     const canEditDistanceRate =
         isEditable &&
-        canEditFieldOfMoneyRequest(parentReportAction, CONST.EDIT_REQUEST_FIELD.DISTANCE_RATE, undefined, isChatReportArchived, undefined, transaction, moneyRequestReport, policy) &&
+        canEditFieldOfMoneyRequest(parentReportAction, CONST.EDIT_REQUEST_FIELD.DISTANCE_RATE, undefined, isChatReportArchived) &&
         isPolicyAccessible(policy, currentUserEmailParam);
 
     const canEditReport =
         isEditable &&
-        canEditFieldOfMoneyRequest(
-            parentReportAction,
-            CONST.EDIT_REQUEST_FIELD.REPORT,
-            undefined,
-            isChatReportArchived,
-            outstandingReportsByPolicyID,
-            transaction,
-            moneyRequestReport,
-            policy,
-        ) &&
+        canEditFieldOfMoneyRequest(parentReportAction, CONST.EDIT_REQUEST_FIELD.REPORT, undefined, isChatReportArchived, outstandingReportsByPolicyID) &&
         (!isPerDiemRequest || canSubmitPerDiemExpenseFromWorkspace(policy) || (isExpenseUnreported && !!perDiemOriginalPolicy));
 
     // A flag for verifying that the current report is a sub-report of a expense chat
@@ -383,22 +360,20 @@ function MoneyRequestView({
         (isExpenseUnreported && (!policyForMovingExpenses || hasEnabledOptions(policyCategories ?? {})));
     // transactionTag can be an empty string
     // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
-    const shouldShowTag = (isPolicyExpenseChat || isExpenseUnreported) && (transactionTag || (canEdit && hasEnabledTags(policyTagLists)));
+    const shouldShowTag = (isPolicyExpenseChat || isExpenseUnreported) && (transactionTag || hasEnabledTags(policyTagLists));
     const shouldShowBillable =
         (isPolicyExpenseChat || isExpenseUnreported) && (!!transactionBillable || !(policy?.disabledFields?.defaultBillable ?? true) || !!updatedTransaction?.billable);
     const isCurrentTransactionReimbursableDifferentFromPolicyDefault =
         policy?.defaultReimbursable !== undefined && !!(updatedTransaction?.reimbursable ?? transactionReimbursable) !== policy.defaultReimbursable;
     const shouldShowReimbursable =
-        (isPolicyExpenseChat || (isExpenseUnreported && !!policy)) &&
+        (isPolicyExpenseChat || isExpenseUnreported) &&
         (policy?.disabledFields?.reimbursable !== true || isCurrentTransactionReimbursableDifferentFromPolicyDefault) &&
         !isManagedCardTransaction &&
         !isInvoice;
-    const canEditReimbursable =
-        isEditable &&
-        canEditFieldOfMoneyRequest(parentReportAction, CONST.EDIT_REQUEST_FIELD.REIMBURSABLE, undefined, isChatReportArchived, undefined, transaction, moneyRequestReport, policy);
+    const canEditReimbursable = isEditable && canEditFieldOfMoneyRequest(parentReportAction, CONST.EDIT_REQUEST_FIELD.REIMBURSABLE, undefined, isChatReportArchived);
     const shouldShowAttendees = shouldShowAttendeesTransactionUtils(iouType, policy);
 
-    const shouldShowTax = isTaxTrackingEnabled(isPolicyExpenseChat || isExpenseUnreported, policy, isDistanceRequest, isPerDiemRequest, isTimeRequest);
+    const shouldShowTax = isTaxTrackingEnabled(isPolicyExpenseChat, policy, isDistanceRequest, isPerDiemRequest, isTimeRequest);
     const tripID = getTripIDFromTransactionParentReportID(parentReport?.parentReportID);
     const shouldShowViewTripDetails = hasReservationList(transaction) && !!tripID;
 
@@ -419,23 +394,19 @@ function MoneyRequestView({
     const currency = transactionCurrency ?? CONST.CURRENCY.USD;
     const hasRequiredCompanyCardViolation = transactionViolations.some((violation) => violation.name === CONST.VIOLATIONS.COMPANY_CARD_REQUIRED);
     const isCustomUnitOutOfPolicy = transactionViolations.some((violation) => violation.name === CONST.VIOLATIONS.CUSTOM_UNIT_OUT_OF_POLICY) || (isDistanceRequest && !rate);
-    let rateToDisplay = isCustomUnitOutOfPolicy
-        ? translate('common.rateOutOfPolicy')
-        : DistanceRequestUtils.getRateForDisplay(unit, rate, currency, translate, toLocaleDigit, getCurrencySymbol, isOffline);
+    let rateToDisplay = isCustomUnitOutOfPolicy ? translate('common.rateOutOfPolicy') : DistanceRequestUtils.getRateForDisplay(unit, rate, currency, translate, toLocaleDigit, isOffline);
     const distanceToDisplay = DistanceRequestUtils.getDistanceForDisplay(hasRoute, distance, unit, rate, translate);
     let merchantTitle = isEmptyMerchant ? '' : transactionMerchant;
-    let amountTitle = formattedTransactionAmount?.toString() || '';
+    let amountTitle = formattedTransactionAmount ? formattedTransactionAmount.toString() : '';
     if (isTransactionScanning) {
         merchantTitle = translate('iou.receiptStatusTitle');
         amountTitle = translate('iou.receiptStatusTitle');
     }
 
     const shouldNavigateToUpgradePath = !policyForMovingExpenses && !shouldSelectPolicy;
+
     const updatedTransactionDescription = getDescription(updatedTransaction) || undefined;
-    const isEmptyUpdatedMerchant =
-        updatedTransaction?.modifiedMerchant === '' ||
-        updatedTransaction?.modifiedMerchant === CONST.TRANSACTION.PARTIAL_TRANSACTION_MERCHANT ||
-        updatedTransaction?.modifiedMerchant === CONST.TRANSACTION.DEFAULT_MERCHANT;
+    const isEmptyUpdatedMerchant = updatedTransaction?.modifiedMerchant === '' || updatedTransaction?.modifiedMerchant === CONST.TRANSACTION.PARTIAL_TRANSACTION_MERCHANT;
     const updatedMerchantTitle = isEmptyUpdatedMerchant ? '' : (updatedTransaction?.modifiedMerchant ?? merchantTitle);
 
     const shouldShowConvertedAmount =
@@ -453,19 +424,18 @@ function MoneyRequestView({
         if (newBillable === getBillable(transaction) || !transaction?.transactionID || !transactionThreadReport?.reportID) {
             return;
         }
-        updateMoneyRequestBillable({
-            transactionID: transaction.transactionID,
+        updateMoneyRequestBillable(
+            transaction.transactionID,
             transactionThreadReport,
             parentReport,
-            value: newBillable,
+            newBillable,
             policy,
             policyTagList,
             policyCategories,
             currentUserAccountIDParam,
             currentUserEmailParam,
             isASAPSubmitBetaEnabled,
-            parentReportNextStep,
-        });
+        );
     };
 
     const saveReimbursable = (newReimbursable: boolean) => {
@@ -473,19 +443,18 @@ function MoneyRequestView({
         if (newReimbursable === getReimbursable(transaction) || !transaction?.transactionID || !transactionThreadReport?.reportID) {
             return;
         }
-        updateMoneyRequestReimbursable({
-            transactionID: transaction.transactionID,
+        updateMoneyRequestReimbursable(
+            transaction.transactionID,
             transactionThreadReport,
             parentReport,
-            value: newReimbursable,
+            newReimbursable,
             policy,
             policyTagList,
             policyCategories,
             currentUserAccountIDParam,
             currentUserEmailParam,
             isASAPSubmitBetaEnabled,
-            parentReportNextStep,
-        });
+        );
     };
 
     if (isManagedCardTransaction) {
@@ -519,21 +488,14 @@ function MoneyRequestView({
         rateToDisplay = getRateFromMerchant(updatedMerchantTitle);
     }
 
-    const hasErrors = hasMissingSmartscanFields(transaction, transactionReport);
-    const isMissingAttendeesViolation = getIsMissingAttendeesViolation(
-        policyCategories,
-        updatedTransaction?.category ?? categoryForDisplay,
-        actualAttendees,
-        currentUserPersonalDetails,
-        policy?.isAttendeeTrackingEnabled,
-    );
+    const hasErrors = hasMissingSmartscanFields(transaction);
 
     const getErrorForField = (field: ViolationField, data?: OnyxTypes.TransactionViolation['data'], policyHasDependentTags = false, tagValue?: string) => {
         // Checks applied when creating a new expense
         // NOTE: receipt field can return multiple violations, so we need to handle it separately
         const fieldChecks: Partial<Record<ViolationField, {isError: boolean; translationPath: TranslationPaths}>> = {
             amount: {
-                isError: isZeroTransactionAmount && !isZeroExpensesBetaEnabled,
+                isError: transactionAmount === 0,
                 translationPath: canEditAmount ? 'common.error.enterAmount' : 'common.error.missingAmount',
             },
             merchant: {
@@ -567,10 +529,6 @@ function MoneyRequestView({
             return `${violations.map((violation) => ViolationsUtils.getViolationTranslation(violation, translate, canEdit, undefined, companyCardPageURL)).join('. ')}.`;
         }
 
-        if (field === 'attendees' && isMissingAttendeesViolation) {
-            return translate('violations.missingAttendees');
-        }
-
         return '';
     };
 
@@ -611,7 +569,13 @@ function MoneyRequestView({
 
                         if (isOdometerDistanceRequest) {
                             Navigation.navigate(
-                                ROUTES.MONEY_REQUEST_STEP_DISTANCE_ODOMETER.getRoute(CONST.IOU.ACTION.EDIT, iouType, transaction.transactionID, transactionThreadReport.reportID),
+                                ROUTES.MONEY_REQUEST_STEP_DISTANCE_ODOMETER.getRoute(
+                                    CONST.IOU.ACTION.EDIT,
+                                    iouType,
+                                    transaction.transactionID,
+                                    transactionThreadReport.reportID,
+                                    getReportRHPActiveRoute(),
+                                ),
                             );
                             return;
                         }
@@ -639,8 +603,6 @@ function MoneyRequestView({
                             ),
                         );
                     }}
-                    brickRoadIndicator={getErrorForField('waypoints') ? CONST.BRICK_ROAD_INDICATOR_STATUS.ERROR : undefined}
-                    errorText={getErrorForField('waypoints')}
                     copyValue={distanceCopyValue}
                     copyable={!!distanceCopyValue}
                 />
@@ -731,7 +693,7 @@ function MoneyRequestView({
                 }
             }
         } else {
-            shouldShow = !!tagForDisplay || (canEdit && hasEnabledOptions(tags));
+            shouldShow = !!tagForDisplay || hasEnabledOptions(tags);
         }
 
         if (!shouldShow) {
@@ -1080,8 +1042,6 @@ function MoneyRequestView({
                             onPress={() => {
                                 Navigation.navigate(ROUTES.MONEY_REQUEST_ATTENDEE.getRoute(CONST.IOU.ACTION.EDIT, iouType, transaction.transactionID, transactionThreadReport?.reportID));
                             }}
-                            brickRoadIndicator={getErrorForField('attendees') ? CONST.BRICK_ROAD_INDICATOR_STATUS.ERROR : undefined}
-                            errorText={getErrorForField('attendees')}
                             interactive={canEdit}
                             shouldShowRightIcon={canEdit}
                             shouldRenderAsHTML
diff --git a/src/components/ReportActionItem/TransactionPreview/index.tsx b/src/components/ReportActionItem/TransactionPreview/index.tsx
index 782af0b9a795..5a50a494d99a 100644
--- a/src/components/ReportActionItem/TransactionPreview/index.tsx
+++ b/src/components/ReportActionItem/TransactionPreview/index.tsx
@@ -93,7 +93,7 @@ function TransactionPreview(props: TransactionPreviewProps) {
 
     // See description of `transactionRawAmount` prop for more context
     // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
-    const transactionRawAmount = (Number(transaction?.modifiedAmount) || transaction?.amount) ?? 0;
+    const transactionRawAmount = (transaction?.modifiedAmount || transaction?.amount) ?? 0;
 
     const shouldDisableOnPress = isBillSplit && isEmptyObject(transaction);
     const isTransactionMadeWithCard = isManagedCardTransaction(transaction);
diff --git a/src/components/ReportWelcomeText.tsx b/src/components/ReportWelcomeText.tsx
index 332d6cf56b6a..707944fb0f77 100644
--- a/src/components/ReportWelcomeText.tsx
+++ b/src/components/ReportWelcomeText.tsx
@@ -1,5 +1,5 @@
 import {createPersonalDetailsSelector} from '@selectors/PersonalDetails';
-import React from 'react';
+import React, {useMemo} from 'react';
 import {View} from 'react-native';
 import type {OnyxEntry} from 'react-native-onyx';
 import useEnvironment from '@hooks/useEnvironment';
@@ -90,20 +90,37 @@ function ReportWelcomeText({report, policy}: ReportWelcomeTextProps) {
         moneyRequestOptions.includes(CONST.IOU.TYPE.TRACK) ||
         moneyRequestOptions.includes(CONST.IOU.TYPE.SPLIT);
 
-    const reportDetailsLink = report?.reportID ? `${environmentURL}/${ROUTES.REPORT_WITH_ID_DETAILS.getRoute(report.reportID, Navigation.getReportRHPActiveRoute())}` : '';
-
-    let welcomeHeroText = translate('reportActionsView.sayHello');
-    if (isInvoiceRoom) {
-        welcomeHeroText = translate('reportActionsView.sayHello');
-    } else if (isChatRoom) {
-        welcomeHeroText = translate('reportActionsView.welcomeToRoom', {roomName: reportName});
-    } else if (isSelfDM) {
-        welcomeHeroText = translate('reportActionsView.yourSpace');
-    } else if (isSystemChat) {
-        welcomeHeroText = reportName;
-    } else if (isPolicyExpenseChat) {
-        welcomeHeroText = translate('reportActionsView.welcomeToRoom', {roomName: policyName});
-    }
+    const reportDetailsLink = useMemo(() => {
+        if (!report?.reportID) {
+            return '';
+        }
+
+        return `${environmentURL}/${ROUTES.REPORT_WITH_ID_DETAILS.getRoute(report.reportID, Navigation.getReportRHPActiveRoute())}`;
+    }, [environmentURL, report?.reportID]);
+
+    const welcomeHeroText = useMemo(() => {
+        if (isInvoiceRoom) {
+            return translate('reportActionsView.sayHello');
+        }
+
+        if (isChatRoom) {
+            return translate('reportActionsView.welcomeToRoom', {roomName: reportName});
+        }
+
+        if (isSelfDM) {
+            return translate('reportActionsView.yourSpace');
+        }
+
+        if (isSystemChat) {
+            return reportName;
+        }
+
+        if (isPolicyExpenseChat) {
+            return translate('reportActionsView.welcomeToRoom', {roomName: policyName});
+        }
+
+        return translate('reportActionsView.sayHello');
+    }, [isChatRoom, isInvoiceRoom, isPolicyExpenseChat, isSelfDM, isSystemChat, translate, policyName, reportName]);
 
     // If we are the only participant (e.g. solo group chat) then keep the current user personal details so the welcome message does not show up empty.
     const shouldExcludeCurrentUser = participantAccountIDs.length > 0;
diff --git a/src/components/Rule/RuleBooleanBase.tsx b/src/components/Rule/RuleBooleanBase.tsx
deleted file mode 100644
index 1e06c4fa3137..000000000000
--- a/src/components/Rule/RuleBooleanBase.tsx
+++ /dev/null
@@ -1,101 +0,0 @@
-import React from 'react';
-import {View} from 'react-native';
-import type {ValueOf} from 'type-fest';
-import HeaderWithBackButton from '@components/HeaderWithBackButton';
-import ScreenWrapper from '@components/ScreenWrapper';
-import SelectionList from '@components/SelectionList';
-import SingleSelectListItem from '@components/SelectionList/ListItem/SingleSelectListItem';
-import type {ListItem} from '@components/SelectionList/ListItem/types';
-import useLocalize from '@hooks/useLocalize';
-import useOnyx from '@hooks/useOnyx';
-import useThemeStyles from '@hooks/useThemeStyles';
-import {updateDraftRule} from '@libs/actions/User';
-import Navigation from '@libs/Navigation/Navigation';
-import CONST from '@src/CONST';
-import type {TranslationPaths} from '@src/languages/types';
-import ONYXKEYS from '@src/ONYXKEYS';
-import ROUTES from '@src/ROUTES';
-import type {InputID} from '@src/types/form/ExpenseRuleForm';
-import RuleNotFoundPageWrapper from './RuleNotFoundPageWrapper';
-
-type BooleanFilterItem = ListItem & {
-    value: ValueOf<typeof CONST.SEARCH.BOOLEAN>;
-};
-
-type RuleBooleanBasePageProps = {
-    /** The key from boolean-based InputID */
-    fieldID: InputID;
-
-    /** The translation key for the page title */
-    titleKey: TranslationPaths;
-
-    /** The rule identifier */
-    hash?: string;
-};
-
-const booleanValues = Object.values(CONST.SEARCH.BOOLEAN);
-
-function RuleBooleanBasePage({fieldID, titleKey, hash}: RuleBooleanBasePageProps) {
-    const {translate} = useLocalize();
-    const [form] = useOnyx(ONYXKEYS.FORMS.EXPENSE_RULE_FORM, {canBeMissing: true});
-    const styles = useThemeStyles();
-
-    const selectedItem =
-        booleanValues.find((value) => {
-            if (!form?.[fieldID]) {
-                return false;
-            }
-            const booleanValue = form[fieldID] === 'true' ? CONST.SEARCH.BOOLEAN.YES : CONST.SEARCH.BOOLEAN.NO;
-            return booleanValue === value;
-        }) ?? null;
-
-    const items = booleanValues.map((value) => ({
-        value,
-        keyForList: value,
-        text: translate(`common.${value}`),
-        isSelected: selectedItem === value,
-    }));
-
-    const goBack = () => {
-        Navigation.goBack(hash ? ROUTES.SETTINGS_RULES_EDIT.getRoute(hash) : ROUTES.SETTINGS_RULES_ADD.getRoute());
-    };
-
-    const onSelectItem = (selectedValue: BooleanFilterItem) => {
-        const newValue = selectedValue.isSelected ? null : selectedValue.value;
-        let value = '';
-        if (newValue === CONST.SEARCH.BOOLEAN.YES) {
-            value = 'true';
-        } else if (newValue === CONST.SEARCH.BOOLEAN.NO) {
-            value = 'false';
-        }
-        updateDraftRule({[fieldID]: value});
-        goBack();
-    };
-
-    return (
-        <RuleNotFoundPageWrapper hash={hash}>
-            <ScreenWrapper
-                testID="RuleBooleanBasePage"
-                shouldShowOfflineIndicatorInWideScreen
-                offlineIndicatorStyle={styles.mtAuto}
-                includeSafeAreaPaddingBottom
-                shouldEnableMaxHeight
-            >
-                <HeaderWithBackButton
-                    title={translate(titleKey)}
-                    onBackButtonPress={goBack}
-                />
-                <View style={[styles.flex1]}>
-                    <SelectionList
-                        shouldSingleExecuteRowSelect
-                        data={items}
-                        ListItem={SingleSelectListItem}
-                        onSelectRow={onSelectItem}
-                    />
-                </View>
-            </ScreenWrapper>
-        </RuleNotFoundPageWrapper>
-    );
-}
-
-export default RuleBooleanBasePage;
diff --git a/src/components/Rule/RuleNotFoundPageWrapper.tsx b/src/components/Rule/RuleNotFoundPageWrapper.tsx
deleted file mode 100644
index 567100a7bd12..000000000000
--- a/src/components/Rule/RuleNotFoundPageWrapper.tsx
+++ /dev/null
@@ -1,46 +0,0 @@
-/* eslint-disable rulesdir/no-negated-variables */
-import React from 'react';
-import FullscreenLoadingIndicator from '@components/FullscreenLoadingIndicator';
-import useOnyx from '@hooks/useOnyx';
-import {getKeyForRule} from '@libs/ExpenseRuleUtils';
-import Navigation from '@navigation/Navigation';
-import NotFoundPage from '@pages/ErrorPage/NotFoundPage';
-import ONYXKEYS from '@src/ONYXKEYS';
-import ROUTES from '@src/ROUTES';
-import type {ExpenseRule} from '@src/types/onyx';
-import getEmptyArray from '@src/types/utils/getEmptyArray';
-import isLoadingOnyxValue from '@src/types/utils/isLoadingOnyxValue';
-
-type RuleNotFoundPageWrapperProps = {
-    children: React.ReactNode;
-    hash?: string;
-    shouldPreventShow?: boolean;
-};
-
-function RuleNotFoundPageWrapper({children, hash, shouldPreventShow}: RuleNotFoundPageWrapperProps) {
-    const [expenseRules = getEmptyArray<ExpenseRule>(), rulesMetadata] = useOnyx(ONYXKEYS.NVP_EXPENSE_RULES, {canBeMissing: true});
-    const doesRuleExist = !!hash && expenseRules.some((rule) => getKeyForRule(rule) === hash);
-
-    const shouldShowFullScreenLoadingIndicator = isLoadingOnyxValue(rulesMetadata);
-    const shouldShowNotFoundPage = !!hash && !doesRuleExist;
-
-    if (shouldShowFullScreenLoadingIndicator) {
-        return <FullscreenLoadingIndicator />;
-    }
-
-    if (!shouldPreventShow && shouldShowNotFoundPage) {
-        return (
-            <NotFoundPage
-                onBackButtonPress={() => {
-                    Navigation.goBack(ROUTES.SETTINGS_RULES);
-                }}
-                shouldShowBackButton
-                shouldShowOfflineIndicator={false}
-            />
-        );
-    }
-
-    return children;
-}
-
-export default RuleNotFoundPageWrapper;
diff --git a/src/components/Rule/RuleTextBase.tsx b/src/components/Rule/RuleTextBase.tsx
deleted file mode 100644
index 9775aa2027c2..000000000000
--- a/src/components/Rule/RuleTextBase.tsx
+++ /dev/null
@@ -1,84 +0,0 @@
-import React from 'react';
-import type {FormOnyxValues} from '@components/Form/types';
-import HeaderWithBackButton from '@components/HeaderWithBackButton';
-import ScreenWrapper from '@components/ScreenWrapper';
-import useLocalize from '@hooks/useLocalize';
-import useThemeStyles from '@hooks/useThemeStyles';
-import {updateDraftRule} from '@libs/actions/User';
-import Navigation from '@libs/Navigation/Navigation';
-import CONST from '@src/CONST';
-import type {TranslationPaths} from '@src/languages/types';
-import type ONYXKEYS from '@src/ONYXKEYS';
-import ROUTES from '@src/ROUTES';
-import type {InputID} from '@src/types/form/ExpenseRuleForm';
-import RuleNotFoundPageWrapper from './RuleNotFoundPageWrapper';
-import TextBase from './TextBase';
-
-// Text-based field IDs that accept string input
-type RuleTextBaseProps = {
-    /** The key from text-based InputID */
-    fieldID: InputID;
-
-    /** The translation key for the page title and input label if labelKey is missing */
-    titleKey: TranslationPaths;
-
-    /** The translation key for the input label */
-    labelKey?: TranslationPaths;
-
-    /** Test ID for the screen wrapper */
-    testID: string;
-
-    /** The translation key for the hint text to display below the TextInput */
-    hintKey?: TranslationPaths;
-
-    /** Whether this field is required */
-    isRequired?: boolean;
-
-    /** The character limit for the input */
-    characterLimit?: number;
-
-    /** The rule identifier */
-    hash?: string;
-};
-
-function RuleTextBase({fieldID, hintKey, isRequired, titleKey, labelKey, testID, hash, characterLimit = CONST.MERCHANT_NAME_MAX_BYTES}: RuleTextBaseProps) {
-    const {translate} = useLocalize();
-    const styles = useThemeStyles();
-
-    const goBack = () => {
-        Navigation.goBack(hash ? ROUTES.SETTINGS_RULES_EDIT.getRoute(hash) : ROUTES.SETTINGS_RULES_ADD.getRoute());
-    };
-
-    const onSave = (values: FormOnyxValues<typeof ONYXKEYS.FORMS.EXPENSE_RULE_FORM>) => {
-        updateDraftRule(values);
-        goBack();
-    };
-
-    return (
-        <RuleNotFoundPageWrapper hash={hash}>
-            <ScreenWrapper
-                testID={testID}
-                shouldShowOfflineIndicatorInWideScreen
-                offlineIndicatorStyle={styles.mtAuto}
-                includeSafeAreaPaddingBottom
-                shouldEnableMaxHeight
-            >
-                <HeaderWithBackButton
-                    title={translate(titleKey)}
-                    onBackButtonPress={goBack}
-                />
-                <TextBase
-                    fieldID={fieldID}
-                    hint={hintKey ? translate(hintKey) : undefined}
-                    isRequired={isRequired}
-                    label={translate(labelKey ?? titleKey)}
-                    onSubmit={onSave}
-                    title={translate(titleKey)}
-                    characterLimit={characterLimit}
-                />
-            </ScreenWrapper>
-        </RuleNotFoundPageWrapper>
-    );
-}
-
-export default RuleTextBase;
diff --git a/src/components/Rule/TextBase.tsx b/src/components/Rule/TextBase.tsx
deleted file mode 100644
index eb05f4760f08..000000000000
--- a/src/components/Rule/TextBase.tsx
+++ /dev/null
@@ -1,83 +0,0 @@
-import React from 'react';
-import {View} from 'react-native';
-import FormProvider from '@components/Form/FormProvider';
-import InputWrapper from '@components/Form/InputWrapper';
-import type {FormInputErrors, FormOnyxValues} from '@components/Form/types';
-import TextInput from '@components/TextInput';
-import useAutoFocusInput from '@hooks/useAutoFocusInput';
-import useLocalize from '@hooks/useLocalize';
-import useOnyx from '@hooks/useOnyx';
-import useThemeStyles from '@hooks/useThemeStyles';
-import {isRequiredFulfilled, isValidInputLength} from '@libs/ValidationUtils';
-import CONST from '@src/CONST';
-import ONYXKEYS from '@src/ONYXKEYS';
-import type {InputID} from '@src/types/form/ExpenseRuleForm';
-
-type TextBaseProps = {
-    fieldID: InputID;
-    hint?: string;
-    isRequired?: boolean;
-    title: string;
-    label: string;
-    characterLimit?: number;
-    onSubmit: (values: FormOnyxValues<typeof ONYXKEYS.FORMS.EXPENSE_RULE_FORM>) => void;
-};
-
-function TextBase({fieldID, hint, isRequired, title, label, onSubmit, characterLimit = CONST.MERCHANT_NAME_MAX_BYTES}: TextBaseProps) {
-    const {translate} = useLocalize();
-    const [form] = useOnyx(ONYXKEYS.FORMS.EXPENSE_RULE_FORM, {canBeMissing: true});
-    const styles = useThemeStyles();
-
-    const currentValue = form?.[fieldID] ?? '';
-    const {inputCallbackRef} = useAutoFocusInput();
-
-    const validate = (values: FormOnyxValues<typeof ONYXKEYS.FORMS.EXPENSE_RULE_FORM>) => {
-        const errors: FormInputErrors<typeof ONYXKEYS.FORMS.EXPENSE_RULE_FORM> = {};
-        const fieldValue = values[fieldID] ?? '';
-
-        if (typeof fieldValue !== 'string') {
-            return errors;
-        }
-
-        const trimmedValue = fieldValue.trim();
-
-        if (isRequired && !isRequiredFulfilled(fieldValue)) {
-            errors[fieldID] = translate('common.error.fieldRequired');
-        } else {
-            const {isValid, byteLength} = isValidInputLength(trimmedValue, characterLimit);
-
-            if (!isValid) {
-                errors[fieldID] = translate('common.error.characterLimitExceedCounter', byteLength, characterLimit);
-            }
-        }
-
-        return errors;
-    };
-
-    return (
-        <FormProvider
-            style={[styles.flex1, styles.ph5]}
-            formID={ONYXKEYS.FORMS.EXPENSE_RULE_FORM}
-            validate={validate}
-            onSubmit={onSubmit}
-            submitButtonText={translate('common.save')}
-            enabledWhenOffline
-        >
-            <View style={styles.mb5}>
-                <InputWrapper
-                    hint={hint}
-                    InputComponent={TextInput}
-                    inputID={fieldID}
-                    name={fieldID}
-                    defaultValue={typeof currentValue === 'string' ? currentValue : undefined}
-                    label={label}
-                    accessibilityLabel={title}
-                    role={CONST.ROLE.PRESENTATION}
-                    ref={inputCallbackRef}
-                />
-            </View>
-        </FormProvider>
-    );
-}
-
-export default TextBase;
diff --git a/src/components/ScrollOffsetContextProvider.tsx b/src/components/ScrollOffsetContextProvider.tsx
index 1c3fbc9052f8..790287845b26 100644
--- a/src/components/ScrollOffsetContextProvider.tsx
+++ b/src/components/ScrollOffsetContextProvider.tsx
@@ -108,8 +108,7 @@ function ScrollOffsetContextProvider({children}: ScrollOffsetContextProviderProp
             const routeName = focusedRoute?.name;
 
             const isSearchScreen = routeName === SCREENS.SEARCH.ROOT;
-            const isSearchMoneyRequestReport =
-                routeName === SCREENS.RIGHT_MODAL.EXPENSE_REPORT || routeName === SCREENS.RIGHT_MODAL.SEARCH_MONEY_REQUEST_REPORT || routeName === SCREENS.RIGHT_MODAL.SEARCH_REPORT;
+            const isSearchMoneyRequestReport = routeName === SCREENS.SEARCH.MONEY_REQUEST_REPORT || routeName === SCREENS.RIGHT_MODAL.SEARCH_REPORT;
 
             const scrollOffsetKeys = Object.keys(scrollOffsetsRef.current);
 
diff --git a/src/components/Search/FilterDropdowns/DropdownButton.tsx b/src/components/Search/FilterDropdowns/DropdownButton.tsx
index fcdc1cd55946..a2b54a29d449 100644
--- a/src/components/Search/FilterDropdowns/DropdownButton.tsx
+++ b/src/components/Search/FilterDropdowns/DropdownButton.tsx
@@ -141,7 +141,6 @@ function DropdownButton({label, value, viewportOffsetTop, PopoverComponent, medi
                     style={[styles.flex1, styles.mw100, caretWrapperStyle]}
                     caretWidth={variables.iconSizeSmall}
                     caretHeight={variables.iconSizeSmall}
-                    isActive={isOverlayVisible}
                 >
                     <Text
                         numberOfLines={1}
diff --git a/src/components/Search/FilterDropdowns/UserSelectPopup.tsx b/src/components/Search/FilterDropdowns/UserSelectPopup.tsx
index c0128495581f..e9fc33df0b20 100644
--- a/src/components/Search/FilterDropdowns/UserSelectPopup.tsx
+++ b/src/components/Search/FilterDropdowns/UserSelectPopup.tsx
@@ -67,7 +67,6 @@ function UserSelectPopup({value, closeOverlay, onChange, isSearchable}: UserSele
     const [isSearchingForReports] = useOnyx(ONYXKEYS.IS_SEARCHING_FOR_REPORTS, {initWithStoredValues: false, canBeMissing: true});
     const [draftComments] = useOnyx(ONYXKEYS.COLLECTION.REPORT_DRAFT_COMMENT, {canBeMissing: true});
     const [nvpDismissedProductTraining] = useOnyx(ONYXKEYS.NVP_DISMISSED_PRODUCT_TRAINING, {canBeMissing: true});
-    const [allPolicies] = useOnyx(ONYXKEYS.COLLECTION.POLICY, {canBeMissing: true});
     const initialSelectedOptions = useMemo(() => {
         return value.reduce<OptionData[]>((acc, id) => {
             const participant = personalDetails?.[id];
@@ -98,7 +97,6 @@ function UserSelectPopup({value, closeOverlay, onChange, isSearchable}: UserSele
                 reports: options.reports,
                 personalDetails: options.personalDetails,
             },
-            allPolicies,
             draftComments,
             nvpDismissedProductTraining,
             loginList,
@@ -108,7 +106,7 @@ function UserSelectPopup({value, closeOverlay, onChange, isSearchable}: UserSele
             },
             countryCode,
         );
-    }, [options.reports, options.personalDetails, allPolicies, draftComments, nvpDismissedProductTraining, loginList, countryCode]);
+    }, [options.reports, options.personalDetails, draftComments, nvpDismissedProductTraining, loginList, countryCode]);
 
     const filteredOptions = useMemo(() => {
         return filterAndOrderOptions(optionsList, cleanSearchTerm, countryCode, loginList, {
diff --git a/src/components/Search/SearchAutocompleteInput.tsx b/src/components/Search/SearchAutocompleteInput.tsx
index 173644f175e5..d388ed389294 100644
--- a/src/components/Search/SearchAutocompleteInput.tsx
+++ b/src/components/Search/SearchAutocompleteInput.tsx
@@ -9,7 +9,6 @@ import type {AnimatedTextInputRef} from '@components/RNTextInput';
 import type {SelectionListHandle} from '@components/SelectionListWithSections/types';
 import TextInput from '@components/TextInput';
 import type {BaseTextInputRef} from '@components/TextInput/BaseTextInput/types';
-import useCurrencyList from '@hooks/useCurrencyList';
 import useCurrentUserPersonalDetails from '@hooks/useCurrentUserPersonalDetails';
 import useFocusAfterNav from '@hooks/useFocusAfterNav';
 import useLocalize from '@hooks/useLocalize';
@@ -103,8 +102,8 @@ function SearchAutocompleteInput({
     const currentUserPersonalDetails = useCurrentUserPersonalDetails();
     const inputRef = useRef<AnimatedTextInputRef>(null);
     const autoFocusAfterNav = useFocusAfterNav(inputRef, shouldDelayFocus);
-    const {currencyList} = useCurrencyList();
-    const currencyAutocompleteList = Object.keys(currencyList).filter((currencyCode) => !currencyList[currencyCode]?.retired);
+    const [currencyList] = useOnyx(ONYXKEYS.CURRENCY_LIST, {canBeMissing: false});
+    const currencyAutocompleteList = Object.keys(currencyList ?? {}).filter((currencyCode) => !currencyList?.[currencyCode]?.retired);
     const currencySharedValue = useSharedValue(currencyAutocompleteList);
 
     const [allPolicyCategories] = useOnyx(ONYXKEYS.COLLECTION.POLICY_CATEGORIES, {canBeMissing: false});
@@ -197,7 +196,7 @@ function SearchAutocompleteInput({
                         onChangeText={onSearchQueryChange}
                         autoFocus={shouldDelayFocus ? autoFocusAfterNav : autoFocus}
                         caretHidden={caretHidden}
-                        role={CONST.ROLE.SEARCHBOX}
+                        role={CONST.ROLE.PRESENTATION}
                         placeholder={translate('search.searchPlaceholder')}
                         autoCapitalize="none"
                         autoCorrect={false}
diff --git a/src/components/Search/SearchAutocompleteList.tsx b/src/components/Search/SearchAutocompleteList.tsx
index 7c67bb8c3f8c..9bf74be30480 100644
--- a/src/components/Search/SearchAutocompleteList.tsx
+++ b/src/components/Search/SearchAutocompleteList.tsx
@@ -10,7 +10,6 @@ import type {SearchQueryItem, SearchQueryListItemProps} from '@components/Select
 import SearchQueryListItem, {isSearchQueryItem} from '@components/SelectionListWithSections/Search/SearchQueryListItem';
 import type {SectionListDataType, SelectionListHandle, UserListItemProps} from '@components/SelectionListWithSections/types';
 import UserListItem from '@components/SelectionListWithSections/UserListItem';
-import useCurrencyList from '@hooks/useCurrencyList';
 import useDebounce from '@hooks/useDebounce';
 import {useMemoizedLazyExpensifyIcons} from '@hooks/useLazyAsset';
 import useLocalize from '@hooks/useLocalize';
@@ -24,12 +23,9 @@ import FS from '@libs/Fullstory';
 import Log from '@libs/Log';
 import type {Options, SearchOption} from '@libs/OptionsListUtils';
 import {combineOrderingOfReportsAndPersonalDetails, getSearchOptions} from '@libs/OptionsListUtils';
-import Parser from '@libs/Parser';
 import Performance from '@libs/Performance';
 import {getAllTaxRates, getCleanedTagName, shouldShowPolicy} from '@libs/PolicyUtils';
-import {getReportAction} from '@libs/ReportActionsUtils';
 import type {OptionData} from '@libs/ReportUtils';
-import {getReportOrDraftReport} from '@libs/ReportUtils';
 import {
     getAutocompleteCategories,
     getAutocompleteRecentCategories,
@@ -196,7 +192,6 @@ function SearchAutocompleteList({
     const [recentSearches] = useOnyx(ONYXKEYS.RECENT_SEARCHES, {canBeMissing: true});
     const [countryCode] = useOnyx(ONYXKEYS.COUNTRY_CODE, {canBeMissing: false});
     const [loginList] = useOnyx(ONYXKEYS.LOGIN_LIST, {canBeMissing: true});
-    const [visibleReportActionsData] = useOnyx(ONYXKEYS.DERIVED.VISIBLE_REPORT_ACTIONS, {canBeMissing: true});
     const expensifyIcons = useMemoizedLazyExpensifyIcons(['History', 'MagnifyingGlass']);
 
     const {options, areOptionsInitialized} = useOptionsList();
@@ -220,9 +215,8 @@ function SearchAutocompleteList({
             shouldShowGBR: false,
             shouldUnreadBeBold: true,
             loginList,
-            visibleReportActionsData,
         });
-    }, [areOptionsInitialized, options, draftComments, nvpDismissedProductTraining, betas, autocompleteQueryValue, countryCode, loginList, visibleReportActionsData]);
+    }, [areOptionsInitialized, options, draftComments, nvpDismissedProductTraining, betas, autocompleteQueryValue, countryCode, loginList]);
 
     const [isInitialRender, setIsInitialRender] = useState(true);
     const parsedQuery = useMemo(() => parseForAutocomplete(autocompleteQueryValue), [autocompleteQueryValue]);
@@ -311,8 +305,8 @@ function SearchAutocompleteList({
         [policies, currentUserLogin],
     );
 
-    const {currencyList} = useCurrencyList();
-    const currencyAutocompleteList = useMemo(() => Object.keys(currencyList).filter((currency) => !currencyList[currency]?.retired), [currencyList]);
+    const [currencyList] = useOnyx(ONYXKEYS.CURRENCY_LIST, {canBeMissing: false});
+    const currencyAutocompleteList = useMemo(() => Object.keys(currencyList ?? {}).filter((currency) => !currencyList?.[currency]?.retired), [currencyList]);
     const [recentCurrencyAutocompleteList] = useOnyx(ONYXKEYS.RECENTLY_USED_CURRENCIES, {canBeMissing: true});
     const [allPoliciesTags] = useOnyx(ONYXKEYS.COLLECTION.POLICY_TAGS, {canBeMissing: false});
     const [allRecentTags] = useOnyx(ONYXKEYS.COLLECTION.POLICY_RECENTLY_USED_TAGS, {canBeMissing: true});
@@ -431,7 +425,6 @@ function SearchAutocompleteList({
                     countryCode,
                     loginList,
                     shouldShowGBR: true,
-                    visibleReportActionsData,
                 }).personalDetails.filter((participant) => participant.text && !alreadyAutocompletedKeys.has(participant.text.toLowerCase()));
 
                 return participants.map((participant) => ({
@@ -463,7 +456,6 @@ function SearchAutocompleteList({
                     countryCode,
                     loginList,
                     shouldShowGBR: true,
-                    visibleReportActionsData,
                 }).recentReports.filter((chat) => {
                     if (!chat.text) {
                         return false;
@@ -538,14 +530,14 @@ function SearchAutocompleteList({
                     .filter(
                         (card) =>
                             (card.bank.toLowerCase().includes(autocompleteValue.toLowerCase()) || card.lastFourPAN?.includes(autocompleteValue)) &&
-                            !alreadyAutocompletedKeys.has(getCardDescription(card, translate).toLowerCase()),
+                            !alreadyAutocompletedKeys.has(getCardDescription(card).toLowerCase()),
                     )
                     .sort()
                     .slice(0, 10);
 
                 return filteredCards.map((card) => ({
                     filterKey: CONST.SEARCH.SEARCH_USER_FRIENDLY_KEYS.CARD_ID,
-                    text: getCardDescription(card, translate),
+                    text: getCardDescription(card),
                     autocompleteID: card.cardID.toString(),
                     mapKey: CONST.SEARCH.SYNTAX_FILTER_KEYS.CARD_ID,
                 }));
@@ -638,11 +630,9 @@ function SearchAutocompleteList({
         statusAutocompleteList,
         feedAutoCompleteList,
         cardAutocompleteList,
-        translate,
         workspaceList,
         hasAutocompleteList,
         isAutocompleteList,
-        visibleReportActionsData,
     ]);
 
     const sortedRecentSearches = useMemo(() => {
@@ -800,22 +790,13 @@ function SearchAutocompleteList({
     if (!autocompleteQueryValue && recentSearchesData && recentSearchesData.length > 0) {
         sections.push({title: translate('search.recentSearches'), data: recentSearchesData});
     }
-    const styledRecentReports = useMemo(
-        () =>
-            recentReportsOptions.map((option) => {
-                const report = getReportOrDraftReport(option.reportID);
-                const reportAction = getReportAction(report?.parentReportID, report?.parentReportActionID);
-                const shouldParserToHTML = reportAction?.actionName !== CONST.REPORT.ACTIONS.TYPE.ADD_COMMENT;
-                return {
-                    ...option,
-                    pressableStyle: styles.br2,
-                    text: StringUtils.lineBreaksToSpaces(shouldParserToHTML ? Parser.htmlToText(option.text ?? '') : (option.text ?? '')),
-                    wrapperStyle: [styles.pr3, styles.pl3],
-                };
-            }),
-        [recentReportsOptions, styles.br2, styles.pr3, styles.pl3],
-    );
 
+    const styledRecentReports = recentReportsOptions.map((item) => ({
+        ...item,
+        pressableStyle: styles.br2,
+        text: StringUtils.lineBreaksToSpaces(item.text),
+        wrapperStyle: [styles.pr3, styles.pl3],
+    }));
     sections.push({title: autocompleteQueryValue.trim() === '' ? translate('search.recentChats') : undefined, data: styledRecentReports});
 
     if (autocompleteSuggestions.length > 0) {
diff --git a/src/components/Search/SearchContext.tsx b/src/components/Search/SearchContext.tsx
index 4e227884e892..fcc0f8a20940 100644
--- a/src/components/Search/SearchContext.tsx
+++ b/src/components/Search/SearchContext.tsx
@@ -1,10 +1,8 @@
 import React, {useCallback, useContext, useMemo, useRef, useState} from 'react';
-import useOnyx from '@hooks/useOnyx';
 import {isMoneyRequestReport} from '@libs/ReportUtils';
 import {isTransactionListItemType, isTransactionReportGroupListItemType} from '@libs/SearchUIUtils';
 import type {SearchKey} from '@libs/SearchUIUtils';
 import CONST from '@src/CONST';
-import ONYXKEYS from '@src/ONYXKEYS';
 import type ChildrenProps from '@src/types/utils/ChildrenProps';
 import {isEmptyObject} from '@src/types/utils/EmptyObject';
 import type {SearchContextData, SearchContextProps, SearchQueryJSON, SelectedTransactions} from './types';
@@ -13,7 +11,6 @@ const defaultSearchContextData: SearchContextData = {
     currentSearchHash: -1,
     currentSearchKey: undefined,
     currentSearchQueryJSON: undefined,
-    currentSearchResults: undefined,
     selectedTransactions: {},
     selectedTransactionIDs: [],
     selectedReports: [],
@@ -28,7 +25,6 @@ const defaultSearchContext: SearchContextProps = {
     areAllMatchingItemsSelected: false,
     showSelectAllMatchingItems: false,
     shouldShowFiltersBarLoading: false,
-    currentSearchResults: undefined,
     setLastSearchType: () => {},
     setCurrentSearchHashAndKey: () => {},
     setCurrentSearchQueryJSON: () => {},
@@ -51,8 +47,6 @@ function SearchContextProvider({children}: ChildrenProps) {
     const [searchContextData, setSearchContextData] = useState(defaultSearchContextData);
     const areTransactionsEmpty = useRef(true);
 
-    const [currentSearchResults] = useOnyx(`${ONYXKEYS.COLLECTION.SNAPSHOT}${searchContextData.currentSearchHash}`, {canBeMissing: true});
-
     const setCurrentSearchHashAndKey = useCallback((searchHash: number, searchKey: SearchKey | undefined) => {
         setSearchContextData((prevState) => {
             if (searchHash === prevState.currentSearchHash && searchKey === prevState.currentSearchKey) {
@@ -98,7 +92,15 @@ function SearchContextProvider({children}: ChildrenProps) {
 
         if (data.length && data.every(isTransactionReportGroupListItemType)) {
             selectedReports = data
-                .filter((item) => isMoneyRequestReport(item) && item.transactions.length > 0 && item.transactions.every(({keyForList}) => selectedTransactions[keyForList]?.isSelected))
+                .filter((item) => {
+                    if (!isMoneyRequestReport(item)) {
+                        return false;
+                    }
+                    if (item.transactions.length === 0) {
+                        return !!item.keyForList && selectedTransactions[item.keyForList]?.isSelected;
+                    }
+                    return item.transactions.every(({keyForList}) => selectedTransactions[keyForList]?.isSelected);
+                })
                 .map(({reportID, action = CONST.SEARCH.ACTION_TYPES.VIEW, total = CONST.DEFAULT_NUMBER_ID, policyID, allActions = [action], currency, chatReportID}) => ({
                     reportID,
                     action,
@@ -206,7 +208,6 @@ function SearchContextProvider({children}: ChildrenProps) {
     const searchContext = useMemo<SearchContextProps>(
         () => ({
             ...searchContextData,
-            currentSearchResults,
             removeTransaction,
             setCurrentSearchHashAndKey,
             setCurrentSearchQueryJSON,
@@ -224,7 +225,6 @@ function SearchContextProvider({children}: ChildrenProps) {
         }),
         [
             searchContextData,
-            currentSearchResults,
             removeTransaction,
             setCurrentSearchHashAndKey,
             setCurrentSearchQueryJSON,
diff --git a/src/components/Search/SearchFilterPageFooterButtons.tsx b/src/components/Search/SearchFilterPageFooterButtons.tsx
index ef93781a8d1f..dc6b23a0709a 100644
--- a/src/components/Search/SearchFilterPageFooterButtons.tsx
+++ b/src/components/Search/SearchFilterPageFooterButtons.tsx
@@ -6,7 +6,7 @@ import useThemeStyles from '@hooks/useThemeStyles';
 
 type SearchFilterPageFooterButtonsProps = {
     /** Function to reset changes made in the filter */
-    resetChanges?: () => void;
+    resetChanges: () => void;
 
     /** Function to apply changes made in the filter */
     applyChanges: () => void;
@@ -18,14 +18,12 @@ function SearchFilterPageFooterButtons({resetChanges, applyChanges}: SearchFilte
 
     return (
         <View>
-            {!!resetChanges && (
-                <Button
-                    large
-                    style={[styles.mt3]}
-                    text={translate('common.reset')}
-                    onPress={resetChanges}
-                />
-            )}
+            <Button
+                large
+                style={[styles.mt3]}
+                text={translate('common.reset')}
+                onPress={resetChanges}
+            />
             <Button
                 large
                 success
diff --git a/src/components/Search/SearchFiltersChatsSelector.tsx b/src/components/Search/SearchFiltersChatsSelector.tsx
index 6b74447a36c5..2d8f438aeb86 100644
--- a/src/components/Search/SearchFiltersChatsSelector.tsx
+++ b/src/components/Search/SearchFiltersChatsSelector.tsx
@@ -60,34 +60,22 @@ function SearchFiltersChatsSelector({initialReportIDs, onFiltersUpdate, isScreen
     const [draftComments] = useOnyx(ONYXKEYS.COLLECTION.REPORT_DRAFT_COMMENT, {canBeMissing: true});
     const archivedReportsIdSet = useArchivedReportsIdSet();
     const [nvpDismissedProductTraining] = useOnyx(ONYXKEYS.NVP_DISMISSED_PRODUCT_TRAINING, {canBeMissing: true});
-    const [visibleReportActionsData] = useOnyx(ONYXKEYS.DERIVED.VISIBLE_REPORT_ACTIONS, {canBeMissing: true});
 
     const selectedOptions = useMemo<OptionData[]>(() => {
         return selectedReportIDs.map((id) => {
-            const report = getSelectedOptionData(
-                createOptionFromReport({...reports?.[`${ONYXKEYS.COLLECTION.REPORT}${id}`], reportID: id}, personalDetails, reportAttributesDerived, undefined, visibleReportActionsData),
-            );
+            const report = getSelectedOptionData(createOptionFromReport({...reports?.[`${ONYXKEYS.COLLECTION.REPORT}${id}`], reportID: id}, personalDetails, reportAttributesDerived));
             const isReportArchived = archivedReportsIdSet.has(`${ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS}${report.reportID}`);
-            const alternateText = getAlternateText(report, {}, isReportArchived, {}, visibleReportActionsData);
+            const alternateText = getAlternateText(report, {}, isReportArchived, {});
             return {...report, alternateText};
         });
-    }, [archivedReportsIdSet, personalDetails, reportAttributesDerived, reports, selectedReportIDs, visibleReportActionsData]);
+    }, [archivedReportsIdSet, personalDetails, reportAttributesDerived, reports, selectedReportIDs]);
 
     const defaultOptions = useMemo(() => {
         if (!areOptionsInitialized || !isScreenTransitionEnd) {
             return defaultListOptions;
         }
-        return getSearchOptions({
-            options,
-            draftComments,
-            nvpDismissedProductTraining,
-            betas: undefined,
-            isUsedInChatFinder: false,
-            countryCode,
-            loginList,
-            visibleReportActionsData,
-        });
-    }, [areOptionsInitialized, isScreenTransitionEnd, options, draftComments, nvpDismissedProductTraining, countryCode, loginList, visibleReportActionsData]);
+        return getSearchOptions({options, draftComments, nvpDismissedProductTraining, betas: undefined, isUsedInChatFinder: false, countryCode, loginList});
+    }, [areOptionsInitialized, isScreenTransitionEnd, options, draftComments, nvpDismissedProductTraining, countryCode, loginList]);
 
     const chatOptions = useMemo(() => {
         return filterAndOrderOptions(defaultOptions, cleanSearchTerm, countryCode, loginList, {
diff --git a/src/components/Search/SearchFiltersCurrencyBase.tsx b/src/components/Search/SearchFiltersCurrencyBase.tsx
index 926cab494bea..a8c42f40f821 100644
--- a/src/components/Search/SearchFiltersCurrencyBase.tsx
+++ b/src/components/Search/SearchFiltersCurrencyBase.tsx
@@ -2,11 +2,11 @@ import React, {useMemo} from 'react';
 import {View} from 'react-native';
 import HeaderWithBackButton from '@components/HeaderWithBackButton';
 import ScreenWrapper from '@components/ScreenWrapper';
-import useCurrencyList from '@hooks/useCurrencyList';
 import useLocalize from '@hooks/useLocalize';
 import useOnyx from '@hooks/useOnyx';
 import useThemeStyles from '@hooks/useThemeStyles';
 import {updateAdvancedFilters} from '@libs/actions/Search';
+import {getCurrencySymbol} from '@libs/CurrencyUtils';
 import Navigation from '@libs/Navigation/Navigation';
 import type {TranslationPaths} from '@src/languages/types';
 import ONYXKEYS from '@src/ONYXKEYS';
@@ -26,7 +26,7 @@ type SearchFiltersCurrencyBaseProps = {
 function SearchFiltersCurrencyBase({title, filterKey, multiselect = false}: SearchFiltersCurrencyBaseProps) {
     const styles = useThemeStyles();
     const {translate} = useLocalize();
-    const {currencyList, getCurrencySymbol} = useCurrencyList();
+    const [currencyList] = useOnyx(ONYXKEYS.CURRENCY_LIST, {canBeMissing: false});
     const [searchAdvancedFiltersForm] = useOnyx(ONYXKEYS.FORMS.SEARCH_ADVANCED_FILTERS_FORM, {canBeMissing: false});
     const selectedCurrencyData = searchAdvancedFiltersForm?.[filterKey];
 
@@ -34,8 +34,8 @@ function SearchFiltersCurrencyBase({title, filterKey, multiselect = false}: Sear
         const currencies: SearchSingleSelectionPickerItem[] = [];
         const selectedCurrencies: SearchSingleSelectionPickerItem[] = [];
 
-        for (const currencyCode of Object.keys(currencyList)) {
-            if (currencyList[currencyCode]?.retired) {
+        for (const currencyCode of Object.keys(currencyList ?? {})) {
+            if (currencyList?.[currencyCode]?.retired) {
                 continue;
             }
 
@@ -53,7 +53,7 @@ function SearchFiltersCurrencyBase({title, filterKey, multiselect = false}: Sear
         }
 
         return {selectedCurrenciesItems: selectedCurrencies, currencyItems: currencies};
-    }, [currencyList, selectedCurrencyData, getCurrencySymbol]);
+    }, [currencyList, selectedCurrencyData]);
 
     const handleOnSubmit = (values: string[] | string | undefined) => {
         updateAdvancedFilters({[filterKey]: values ?? null} as Partial<SearchAdvancedFiltersForm>);
diff --git a/src/components/Search/SearchFiltersParticipantsSelector.tsx b/src/components/Search/SearchFiltersParticipantsSelector.tsx
index 27e829f323f7..9665142e3d08 100644
--- a/src/components/Search/SearchFiltersParticipantsSelector.tsx
+++ b/src/components/Search/SearchFiltersParticipantsSelector.tsx
@@ -56,7 +56,6 @@ function SearchFiltersParticipantsSelector({initialAccountIDs, onFiltersUpdate}:
     const cleanSearchTerm = useMemo(() => searchTerm.trim().toLowerCase(), [searchTerm]);
     const [draftComments] = useOnyx(ONYXKEYS.COLLECTION.REPORT_DRAFT_COMMENT, {canBeMissing: true});
     const [nvpDismissedProductTraining] = useOnyx(ONYXKEYS.NVP_DISMISSED_PRODUCT_TRAINING, {canBeMissing: true});
-    const [allPolicies] = useOnyx(ONYXKEYS.COLLECTION.POLICY, {canBeMissing: true});
     const defaultOptions = useMemo(() => {
         if (!areOptionsInitialized) {
             return defaultListOptions;
@@ -67,7 +66,6 @@ function SearchFiltersParticipantsSelector({initialAccountIDs, onFiltersUpdate}:
                 reports: options.reports,
                 personalDetails: options.personalDetails,
             },
-            allPolicies,
             draftComments,
             nvpDismissedProductTraining,
             loginList,
@@ -77,7 +75,7 @@ function SearchFiltersParticipantsSelector({initialAccountIDs, onFiltersUpdate}:
             },
             countryCode,
         );
-    }, [areOptionsInitialized, options.reports, options.personalDetails, allPolicies, draftComments, nvpDismissedProductTraining, loginList, countryCode]);
+    }, [areOptionsInitialized, options.reports, options.personalDetails, draftComments, nvpDismissedProductTraining, loginList, countryCode]);
 
     const unselectedOptions = useMemo(() => {
         return filterSelectedOptions(defaultOptions, new Set(selectedOptions.map((option) => option.accountID)));
diff --git a/src/components/Search/SearchList/BaseSearchList/index.tsx b/src/components/Search/SearchList/BaseSearchList/index.tsx
index 1afb13336744..678a73793d2a 100644
--- a/src/components/Search/SearchList/BaseSearchList/index.tsx
+++ b/src/components/Search/SearchList/BaseSearchList/index.tsx
@@ -114,7 +114,7 @@ function BaseSearchList({
             renderItem={renderItemWithKeyboardFocus}
             keyExtractor={keyExtractor}
             onScroll={onScroll}
-            showsVerticalScrollIndicator
+            showsVerticalScrollIndicator={false}
             ref={ref}
             extraData={extraData}
             onEndReached={onEndReached}
diff --git a/src/components/Search/SearchList/index.tsx b/src/components/Search/SearchList/index.tsx
index 404c64cc9e97..024e087aff41 100644
--- a/src/components/Search/SearchList/index.tsx
+++ b/src/components/Search/SearchList/index.tsx
@@ -42,7 +42,7 @@ import useThemeStyles from '@hooks/useThemeStyles';
 import useWindowDimensions from '@hooks/useWindowDimensions';
 import {turnOnMobileSelectionMode} from '@libs/actions/MobileSelectionMode';
 import navigationRef from '@libs/Navigation/navigationRef';
-import {getTableMinWidth} from '@libs/SearchUIUtils';
+import {getTableMinWidth, isTransactionReportGroupListItemType} from '@libs/SearchUIUtils';
 import variables from '@styles/variables';
 import type {TransactionPreviewData} from '@userActions/Search';
 import CONST from '@src/CONST';
@@ -129,9 +129,6 @@ type SearchListProps = Pick<FlashListProps<SearchListItem>, 'onScroll' | 'conten
     /** Selected transactions for determining isSelected state */
     selectedTransactions: SelectedTransactions;
 
-    /** Whether all transactions have been loaded from snapshots in group-by views */
-    hasLoadedAllTransactions?: boolean;
-
     /** Reference to the outer element */
     ref?: ForwardedRef<SearchListHandle>;
 };
@@ -184,7 +181,6 @@ function SearchList({
     onDEWModalOpen,
     isDEWBetaEnabled,
     selectedTransactions,
-    hasLoadedAllTransactions,
     ref,
 }: SearchListProps) {
     const styles = useThemeStyles();
@@ -200,16 +196,51 @@ function SearchList({
         }
         return data;
     }, [data, groupBy, type]);
-    const flattenedItemsWithoutPendingDelete = useMemo(() => flattenedItems.filter((t) => t?.pendingAction !== CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE), [flattenedItems]);
+    const emptyReports = useMemo(() => {
+        if (type === CONST.SEARCH.DATA_TYPES.EXPENSE_REPORT && isTransactionGroupListItemArray(data)) {
+            return data.filter((item) => item.transactions.length === 0);
+        }
+        return [];
+    }, [data, type]);
 
     const selectedItemsLength = useMemo(() => {
-        return flattenedItemsWithoutPendingDelete.reduce((acc, item) => {
-            if (item.keyForList && selectedTransactions[item.keyForList]?.isSelected) {
-                return acc + 1;
-            }
-            return acc;
+        const selectedTransactionsCount = flattenedItems.reduce((acc, item) => {
+            const isTransactionSelected = !!(item?.keyForList && selectedTransactions[item.keyForList]?.isSelected);
+            return acc + (isTransactionSelected ? 1 : 0);
         }, 0);
-    }, [flattenedItemsWithoutPendingDelete, selectedTransactions]);
+
+        if (type === CONST.SEARCH.DATA_TYPES.EXPENSE_REPORT && isTransactionGroupListItemArray(data)) {
+            const selectedEmptyReports = emptyReports.reduce((acc, item) => {
+                const isEmptyReportSelected = !!(item.keyForList && selectedTransactions[item.keyForList]?.isSelected);
+                return acc + (isEmptyReportSelected ? 1 : 0);
+            }, 0);
+
+            return selectedEmptyReports + selectedTransactionsCount;
+        }
+
+        return selectedTransactionsCount;
+    }, [flattenedItems, type, data, emptyReports, selectedTransactions]);
+
+    const totalItems = useMemo(() => {
+        if (type === CONST.SEARCH.DATA_TYPES.EXPENSE_REPORT && isTransactionGroupListItemArray(data)) {
+            const selectableEmptyReports = emptyReports.filter((item) => item.pendingAction !== CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE);
+            const selectableTransactions = flattenedItems.filter((item) => {
+                if ('pendingAction' in item) {
+                    return item.pendingAction !== CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE;
+                }
+                return true;
+            });
+            return selectableEmptyReports.length + selectableTransactions.length;
+        }
+
+        const selectableTransactions = flattenedItems.filter((item) => {
+            if ('pendingAction' in item) {
+                return item.pendingAction !== CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE;
+            }
+            return true;
+        });
+        return selectableTransactions.length;
+    }, [data, type, flattenedItems, emptyReports]);
 
     const itemsWithSelection = useMemo(() => {
         return data.map((item) => {
@@ -220,10 +251,16 @@ function SearchList({
                 if (!canSelectMultiple) {
                     itemWithSelection = {...item, isSelected: false};
                 } else {
-                    const hasAnySelected = item.transactions.some((t) => t.keyForList && selectedTransactions[t.keyForList]?.isSelected);
+                    const isEmptyReportSelected =
+                        item.transactions.length === 0 && isTransactionReportGroupListItemType(item) && !!(item.keyForList && selectedTransactions[item.keyForList]?.isSelected);
+
+                    const hasAnySelected = item.transactions.some((t) => t.keyForList && selectedTransactions[t.keyForList]?.isSelected) || isEmptyReportSelected;
 
                     if (!hasAnySelected) {
                         itemWithSelection = {...item, isSelected: false};
+                    } else if (isEmptyReportSelected) {
+                        isSelected = true;
+                        itemWithSelection = {...item, isSelected};
                     } else {
                         let allNonDeletedSelected = true;
                         let hasNonDeletedTransactions = false;
@@ -316,10 +353,7 @@ function SearchList({
             if (shouldPreventLongPressRow || !isSmallScreenWidth || item?.isDisabled || item?.isDisabledCheckbox) {
                 return;
             }
-            // disable long press for empty expense reports
-            if ('transactions' in item && item.transactions.length === 0 && !groupBy) {
-                return;
-            }
+
             if (isMobileSelectionModeEnabled) {
                 onCheckboxPress(item, itemTransactions);
                 return;
@@ -328,7 +362,7 @@ function SearchList({
             setLongPressedItemTransactions(itemTransactions);
             setIsModalVisible(true);
         },
-        [groupBy, route.key, shouldPreventLongPressRow, isSmallScreenWidth, isMobileSelectionModeEnabled, onCheckboxPress],
+        [route.key, shouldPreventLongPressRow, isSmallScreenWidth, isMobileSelectionModeEnabled, onCheckboxPress],
     );
 
     const turnOnSelectionMode = useCallback(() => {
@@ -457,7 +491,7 @@ function SearchList({
 
     const tableHeaderVisible = canSelectMultiple || !!SearchTableHeader;
     const selectAllButtonVisible = canSelectMultiple && !SearchTableHeader;
-    const isSelectAllChecked = selectedItemsLength > 0 && selectedItemsLength === flattenedItemsWithoutPendingDelete.length && hasLoadedAllTransactions;
+    const isSelectAllChecked = selectedItemsLength > 0 && selectedItemsLength === totalItems;
 
     const content = (
         <View style={[styles.flex1, !isKeyboardShown && safeAreaPaddingBottomStyle, containerStyle]}>
@@ -467,7 +501,7 @@ function SearchList({
                         <Checkbox
                             accessibilityLabel={translate('workspace.people.selectAll')}
                             isChecked={isSelectAllChecked}
-                            isIndeterminate={selectedItemsLength > 0 && (selectedItemsLength !== flattenedItemsWithoutPendingDelete.length || !hasLoadedAllTransactions)}
+                            isIndeterminate={selectedItemsLength > 0 && selectedItemsLength !== totalItems}
                             onPress={() => {
                                 onAllCheckboxPress();
                             }}
diff --git a/src/components/Search/SearchPageHeader/SearchFiltersBar.tsx b/src/components/Search/SearchPageHeader/SearchFiltersBar.tsx
index 41de08141f47..4f5fbc652ced 100644
--- a/src/components/Search/SearchPageHeader/SearchFiltersBar.tsx
+++ b/src/components/Search/SearchPageHeader/SearchFiltersBar.tsx
@@ -1,5 +1,6 @@
 import {isUserValidatedSelector} from '@selectors/Account';
 import {emailSelector} from '@selectors/Session';
+import {searchResultsErrorSelector} from '@selectors/Snapshot';
 import React, {useCallback, useContext, useMemo, useRef} from 'react';
 import type {ReactNode} from 'react';
 import {FlatList, View} from 'react-native';
@@ -24,7 +25,6 @@ import {useSearchContext} from '@components/Search/SearchContext';
 import type {BankAccountMenuItem, SearchDateFilterKeys, SearchQueryJSON, SingularSearchStatus} from '@components/Search/types';
 import SearchFiltersSkeleton from '@components/Skeletons/SearchFiltersSkeleton';
 import useAdvancedSearchFilters from '@hooks/useAdvancedSearchFilters';
-import useCurrencyList from '@hooks/useCurrencyList';
 import useCurrentUserPersonalDetails from '@hooks/useCurrentUserPersonalDetails';
 import useFilterFormValues from '@hooks/useFilterFormValues';
 import {useMemoizedLazyExpensifyIcons} from '@hooks/useLazyAsset';
@@ -54,7 +54,7 @@ import ROUTES from '@src/ROUTES';
 import type {SearchAdvancedFiltersForm} from '@src/types/form';
 import FILTER_KEYS, {AMOUNT_FILTER_KEYS, DATE_FILTER_KEYS} from '@src/types/form/SearchAdvancedFiltersForm';
 import type {SearchAdvancedFiltersKey} from '@src/types/form/SearchAdvancedFiltersForm';
-import type {Policy} from '@src/types/onyx';
+import type {CurrencyList, Policy} from '@src/types/onyx';
 import type {Icon} from '@src/types/onyx/OnyxCommon';
 import {getEmptyObject} from '@src/types/utils/EmptyObject';
 import type {SearchHeaderOptionValue} from './SearchPageHeader';
@@ -90,7 +90,7 @@ function SearchFiltersBar({
     const [isUserValidated] = useOnyx(ONYXKEYS.ACCOUNT, {selector: isUserValidatedSelector, canBeMissing: true});
     const [searchAdvancedFiltersForm = getEmptyObject<Partial<SearchAdvancedFiltersForm>>()] = useOnyx(ONYXKEYS.FORMS.SEARCH_ADVANCED_FILTERS_FORM, {canBeMissing: true});
     // type, groupBy and status values are not guaranteed to respect the ts type as they come from user input
-    const {type: unsafeType, groupBy: unsafeGroupBy, status: unsafeStatus, flatFilters} = queryJSON;
+    const {hash, type: unsafeType, groupBy: unsafeGroupBy, status: unsafeStatus, flatFilters} = queryJSON;
     const [selectedIOUReport] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${currentSelectedReportID}`, {canBeMissing: true});
     const isCurrentSelectedExpenseReport = isExpenseReport(currentSelectedReportID);
     const theme = useTheme();
@@ -102,15 +102,16 @@ function SearchFiltersBar({
     const personalDetails = usePersonalDetails();
     const filterFormValues = useFilterFormValues(queryJSON);
     const {shouldUseNarrowLayout, isLargeScreenWidth} = useResponsiveLayout();
-    const {selectedTransactions, selectAllMatchingItems, areAllMatchingItemsSelected, showSelectAllMatchingItems, shouldShowFiltersBarLoading, currentSearchResults} = useSearchContext();
-    const {currencyList, getCurrencySymbol} = useCurrencyList();
+    const {selectedTransactions, selectAllMatchingItems, areAllMatchingItemsSelected, showSelectAllMatchingItems, shouldShowFiltersBarLoading} = useSearchContext();
 
     const [email] = useOnyx(ONYXKEYS.SESSION, {canBeMissing: true, selector: emailSelector});
     const [userCardList] = useOnyx(ONYXKEYS.CARD_LIST, {selector: filterPersonalCards, canBeMissing: true});
     const [allPolicies] = useOnyx(ONYXKEYS.COLLECTION.POLICY, {canBeMissing: true});
     const [workspaceCardFeeds] = useOnyx(ONYXKEYS.COLLECTION.WORKSPACE_CARDS_LIST, {canBeMissing: true});
     const [allFeeds] = useOnyx(ONYXKEYS.COLLECTION.SHARED_NVP_PRIVATE_DOMAIN_MEMBER, {canBeMissing: true});
+    const [currencyList = getEmptyObject<CurrencyList>()] = useOnyx(ONYXKEYS.CURRENCY_LIST, {canBeMissing: true});
     const {isAccountLocked, showLockedAccountModal} = useContext(LockedAccountContext);
+    const [searchResultsErrors] = useOnyx(`${ONYXKEYS.COLLECTION.SNAPSHOT}${hash}`, {canBeMissing: true, selector: searchResultsErrorSelector});
     const expensifyIcons = useMemoizedLazyExpensifyIcons(['Filter', 'Columns']);
     const {isDelegateAccessRestricted, showDelegateNoAccessModal} = useContext(DelegateNoAccessContext);
 
@@ -155,7 +156,7 @@ function SearchFiltersBar({
         return workspaceOptions.filter((option) => normalizedIDs.includes(option.value));
     }, [searchAdvancedFiltersForm.policyID, queryJSON.policyID, workspaceOptions]);
 
-    const hasErrors = Object.keys(currentSearchResults?.errors ?? {}).length > 0 && !isOffline;
+    const hasErrors = Object.keys(searchResultsErrors ?? {}).length > 0 && !isOffline;
     const shouldShowSelectedDropdown = headerButtonsOptions.length > 0 && (!shouldUseNarrowLayout || isMobileSelectionModeEnabled);
 
     const [typeOptions, type] = useMemo(() => {
@@ -192,10 +193,10 @@ function SearchFiltersBar({
     }, [translate, unsafeGroupBy]);
 
     const [groupCurrencyOptions, groupCurrency] = useMemo(() => {
-        const options = getGroupCurrencyOptions(currencyList, getCurrencySymbol);
+        const options = getGroupCurrencyOptions(currencyList);
         const value = options.find((option) => option.value === searchAdvancedFiltersForm.groupCurrency) ?? null;
         return [options, value];
-    }, [searchAdvancedFiltersForm.groupCurrency, currencyList, getCurrencySymbol]);
+    }, [searchAdvancedFiltersForm.groupCurrency, currencyList]);
 
     const [feedOptions, feed] = useMemo(() => {
         const feedFilterValues = flatFilters.find((filter) => filter.key === CONST.SEARCH.SYNTAX_FILTER_KEYS.FEED)?.filters?.map((filter) => filter.value);
diff --git a/src/components/Search/SearchPageHeader/SearchPageHeaderInput.tsx b/src/components/Search/SearchPageHeader/SearchPageHeaderInput.tsx
index b489fb8bfc84..4ecd440d4a51 100644
--- a/src/components/Search/SearchPageHeader/SearchPageHeaderInput.tsx
+++ b/src/components/Search/SearchPageHeader/SearchPageHeaderInput.tsx
@@ -13,7 +13,7 @@ import {buildSubstitutionsMap} from '@components/Search/SearchRouter/buildSubsti
 import type {SubstitutionMap} from '@components/Search/SearchRouter/getQueryWithSubstitutions';
 import {getQueryWithSubstitutions} from '@components/Search/SearchRouter/getQueryWithSubstitutions';
 import {getUpdatedSubstitutionsMap} from '@components/Search/SearchRouter/getUpdatedSubstitutionsMap';
-import {useSearchRouterActions} from '@components/Search/SearchRouter/SearchRouterContext';
+import {useSearchRouterContext} from '@components/Search/SearchRouter/SearchRouterContext';
 import type {SearchQueryJSON, SearchQueryString} from '@components/Search/types';
 import type {SearchQueryItem} from '@components/SelectionListWithSections/Search/SearchQueryListItem';
 import {isSearchQueryItem} from '@components/SelectionListWithSections/Search/SearchQueryListItem';
@@ -84,7 +84,7 @@ function SearchPageHeaderInput({queryJSON, searchRouterListVisible, hideSearchRo
     const textInputRef = useRef<AnimatedTextInputRef>(null);
     const hasMountedRef = useRef(false);
     const isFocused = useIsFocused();
-    const {registerSearchPageInput} = useSearchRouterActions();
+    const {registerSearchPageInput} = useSearchRouterContext();
 
     useEffect(() => {
         hasMountedRef.current = true;
diff --git a/src/components/Search/SearchPageHeader/SearchTypeMenuPopover.tsx b/src/components/Search/SearchPageHeader/SearchTypeMenuPopover.tsx
index ee5797724f13..df5af069a91c 100644
--- a/src/components/Search/SearchPageHeader/SearchTypeMenuPopover.tsx
+++ b/src/components/Search/SearchPageHeader/SearchTypeMenuPopover.tsx
@@ -3,7 +3,6 @@ import Button from '@components/Button';
 import PopoverMenu from '@components/PopoverMenu';
 import type {SearchQueryJSON} from '@components/Search/types';
 import {useMemoizedLazyExpensifyIcons} from '@hooks/useLazyAsset';
-import useLocalize from '@hooks/useLocalize';
 import useSafeAreaPaddings from '@hooks/useSafeAreaPaddings';
 import useSearchTypeMenu from '@hooks/useSearchTypeMenu';
 import useThemeStyles from '@hooks/useThemeStyles';
@@ -14,7 +13,6 @@ type SearchTypeMenuNarrowProps = {
 
 function SearchTypeMenuPopover({queryJSON}: SearchTypeMenuNarrowProps) {
     const styles = useThemeStyles();
-    const {translate} = useLocalize();
     const {isPopoverVisible, delayPopoverMenuFirstRender, openMenu, closeMenu, allMenuItems, DeleteConfirmModal, windowHeight} = useSearchTypeMenu(queryJSON);
 
     const buttonRef = useRef<HTMLDivElement>(null);
@@ -27,7 +25,6 @@ function SearchTypeMenuPopover({queryJSON}: SearchTypeMenuNarrowProps) {
             <Button
                 icon={expensifyIcons.Menu}
                 onPress={openMenu}
-                accessibilityLabel={translate('search.filtersHeader')}
             />
             {!delayPopoverMenuFirstRender && (
                 <PopoverMenu
diff --git a/src/components/Search/SearchRouter/SearchButton.tsx b/src/components/Search/SearchRouter/SearchButton.tsx
index bece07f8948f..1dad9fc115d3 100644
--- a/src/components/Search/SearchRouter/SearchButton.tsx
+++ b/src/components/Search/SearchRouter/SearchButton.tsx
@@ -12,7 +12,7 @@ import {startSpan} from '@libs/telemetry/activeSpans';
 import {callFunctionIfActionIsAllowed} from '@userActions/Session';
 import Timing from '@userActions/Timing';
 import CONST from '@src/CONST';
-import {useSearchRouterActions} from './SearchRouterContext';
+import {useSearchRouterContext} from './SearchRouterContext';
 
 type SearchButtonProps = {
     style?: StyleProp<ViewStyle>;
@@ -23,36 +23,31 @@ function SearchButton({style, shouldUseAutoHitSlop = false}: SearchButtonProps)
     const styles = useThemeStyles();
     const theme = useTheme();
     const {translate} = useLocalize();
-    const {openSearchRouter} = useSearchRouterActions();
+    const {openSearchRouter} = useSearchRouterContext();
     const pressableRef = useRef<View>(null);
     const expensifyIcons = useMemoizedLazyExpensifyIcons(['MagnifyingGlass']);
 
-    const onPress = () => {
-        callFunctionIfActionIsAllowed(() => {
-            pressableRef.current?.blur();
-
-            Timing.start(CONST.TIMING.OPEN_SEARCH);
-            Performance.markStart(CONST.TIMING.OPEN_SEARCH);
-            startSpan(CONST.TELEMETRY.SPAN_OPEN_SEARCH_ROUTER, {
-                name: CONST.TELEMETRY.SPAN_OPEN_SEARCH_ROUTER,
-                op: CONST.TELEMETRY.SPAN_OPEN_SEARCH_ROUTER,
-            });
-
-            openSearchRouter();
-        })();
-    };
-
     return (
         <Tooltip text={translate('common.search')}>
             <PressableWithoutFeedback
                 ref={pressableRef}
                 testID="searchButton"
                 accessibilityLabel={translate('common.search')}
-                role={CONST.ROLE.BUTTON}
                 style={[styles.flexRow, styles.touchableButtonImage, style]}
                 shouldUseAutoHitSlop={shouldUseAutoHitSlop}
                 sentryLabel={CONST.SENTRY_LABEL.SEARCH.SEARCH_BUTTON}
-                onPress={onPress}
+                onPress={callFunctionIfActionIsAllowed(() => {
+                    pressableRef?.current?.blur();
+
+                    Timing.start(CONST.TIMING.OPEN_SEARCH);
+                    Performance.markStart(CONST.TIMING.OPEN_SEARCH);
+                    startSpan(CONST.TELEMETRY.SPAN_OPEN_SEARCH_ROUTER, {
+                        name: CONST.TELEMETRY.SPAN_OPEN_SEARCH_ROUTER,
+                        op: CONST.TELEMETRY.SPAN_OPEN_SEARCH_ROUTER,
+                    });
+
+                    openSearchRouter();
+                })}
             >
                 <Icon
                     src={expensifyIcons.MagnifyingGlass}
diff --git a/src/components/Search/SearchRouter/SearchRouter.tsx b/src/components/Search/SearchRouter/SearchRouter.tsx
index c94e8947c1aa..8f547047cb0e 100644
--- a/src/components/Search/SearchRouter/SearchRouter.tsx
+++ b/src/components/Search/SearchRouter/SearchRouter.tsx
@@ -32,9 +32,6 @@ import Log from '@libs/Log';
 import backHistory from '@libs/Navigation/helpers/backHistory';
 import type {SearchOption} from '@libs/OptionsListUtils';
 import {createOptionFromReport} from '@libs/OptionsListUtils';
-import Parser from '@libs/Parser';
-import {getReportAction} from '@libs/ReportActionsUtils';
-import {getReportOrDraftReport} from '@libs/ReportUtils';
 import type {OptionData} from '@libs/ReportUtils';
 import {getAutocompleteQueryWithComma, getQueryWithoutAutocompletedPart} from '@libs/SearchAutocompleteUtils';
 import {getPolicyNameWithFallback, getQueryWithUpdatedValues, sanitizeSearchValue} from '@libs/SearchQueryUtils';
@@ -131,7 +128,7 @@ function SearchRouter({onRouterClose, shouldHideInputCaret, isSearchRouterDispla
         }
 
         const focusedRoute = findFocusedRoute(state);
-        if (focusedRoute?.name === SCREENS.REPORT || focusedRoute?.name === SCREENS.RIGHT_MODAL.EXPENSE_REPORT) {
+        if (focusedRoute?.name === SCREENS.REPORT) {
             // We're guaranteed that the type of params is of SCREENS.REPORT
             return (focusedRoute.params as ReportsSplitNavigatorParamList[typeof SCREENS.REPORT]).reportID;
         }
@@ -152,9 +149,7 @@ function SearchRouter({onRouterClose, shouldHideInputCaret, isSearchRouterDispla
                 return undefined;
             }
             let reportForContextualSearch = recentReports.find((option) => option.reportID === contextualReportID);
-            const reportForContextualSearchReport = getReportOrDraftReport(reportForContextualSearch?.reportID);
-            const reportAction = getReportAction(reportForContextualSearchReport?.parentReportID, reportForContextualSearchReport?.parentReportActionID);
-            const shouldParserToHTML = reportAction?.actionName !== CONST.REPORT.ACTIONS.TYPE.ADD_COMMENT;
+
             if (!reportForContextualSearch) {
                 const report = reports?.[`${ONYXKEYS.COLLECTION.REPORT}${contextualReportID}`];
                 if (!report) {
@@ -192,13 +187,7 @@ function SearchRouter({onRouterClose, shouldHideInputCaret, isSearchRouterDispla
                 {
                     data: [
                         {
-                            text: StringUtils.lineBreaksToSpaces(
-                                `${translate('search.searchIn')} ${
-                                    shouldParserToHTML
-                                        ? Parser.htmlToText(reportForContextualSearch.text ?? reportForContextualSearch.alternateText ?? '')
-                                        : (reportForContextualSearch.text ?? reportForContextualSearch.alternateText ?? '')
-                                }`,
-                            ),
+                            text: StringUtils.lineBreaksToSpaces(`${translate('search.searchIn')} ${reportForContextualSearch.text ?? reportForContextualSearch.alternateText}`),
                             singleIcon: expensifyIcons.MagnifyingGlass,
                             searchQuery: reportQueryValue,
                             autocompleteID,
@@ -212,7 +201,7 @@ function SearchRouter({onRouterClose, shouldHideInputCaret, isSearchRouterDispla
                 },
             ];
         },
-        [contextualReportID, textInputValue, isSearchRouterDisplayed, translate, expensifyIcons.MagnifyingGlass, styles.activeComponentBG, reports, personalDetails],
+        [contextualReportID, styles.activeComponentBG, textInputValue, translate, isSearchRouterDisplayed, reports, personalDetails, expensifyIcons.MagnifyingGlass],
     );
 
     const searchQueryItem = textInputValue
diff --git a/src/components/Search/SearchRouter/SearchRouterContext.tsx b/src/components/Search/SearchRouter/SearchRouterContext.tsx
index 58ca77133a7c..cc97cf3d9756 100644
--- a/src/components/Search/SearchRouter/SearchRouterContext.tsx
+++ b/src/components/Search/SearchRouter/SearchRouterContext.tsx
@@ -1,4 +1,4 @@
-import React, {useContext, useEffect, useRef, useState} from 'react';
+import React, {useContext, useEffect, useMemo, useRef, useState} from 'react';
 import type {AnimatedTextInputRef} from '@components/RNTextInput';
 import isSearchTopmostFullScreenRoute from '@libs/Navigation/helpers/isSearchTopmostFullScreenRoute';
 import {navigationRef} from '@libs/Navigation/Navigation';
@@ -9,11 +9,8 @@ import NAVIGATORS from '@src/NAVIGATORS';
 import SCREENS from '@src/SCREENS';
 import type ChildrenProps from '@src/types/utils/ChildrenProps';
 
-type SearchRouterStateContextType = {
+type SearchRouterContext = {
     isSearchRouterDisplayed: boolean;
-};
-
-type SearchRouterActionsContextType = {
     openSearchRouter: () => void;
     closeSearchRouter: () => void;
     toggleSearch: () => void;
@@ -25,7 +22,8 @@ type HistoryState = {
     isSearchModalOpen?: boolean;
 };
 
-const defaultSearchRouterActionsContext: SearchRouterActionsContextType = {
+const defaultSearchContext: SearchRouterContext = {
+    isSearchRouterDisplayed: false,
     openSearchRouter: () => {},
     closeSearchRouter: () => {},
     toggleSearch: () => {},
@@ -33,9 +31,7 @@ const defaultSearchRouterActionsContext: SearchRouterActionsContextType = {
     unregisterSearchPageInput: () => {},
 };
 
-const SearchRouterStateContext = React.createContext<SearchRouterStateContextType>({isSearchRouterDisplayed: false});
-
-const SearchRouterActionsContext = React.createContext<SearchRouterActionsContextType>(defaultSearchRouterActionsContext);
+const Context = React.createContext<SearchRouterContext>(defaultSearchContext);
 
 const isBrowserWithHistory = typeof window !== 'undefined' && typeof window.history !== 'undefined';
 const canListenPopState = typeof window !== 'undefined' && typeof window.addEventListener === 'function';
@@ -73,98 +69,87 @@ function SearchRouterContextProvider({children}: ChildrenProps) {
         return () => window.removeEventListener('popstate', handlePopState);
     }, []);
 
-    const openSearchRouter = () => {
-        if (isBrowserWithHistory) {
-            window.history.pushState({isSearchModalOpen: true} satisfies HistoryState, '');
-        }
-        close(
-            () => {
-                setIsSearchRouterDisplayed(true);
-                searchRouterDisplayedRef.current = true;
-            },
-            false,
-            true,
-        );
-    };
-    const closeSearchRouter = () => {
-        setIsSearchRouterDisplayed(false);
-        searchRouterDisplayedRef.current = false;
-        if (isBrowserWithHistory) {
-            const state = window.history.state as HistoryState | null;
-            if (state?.isSearchModalOpen) {
-                window.history.replaceState({isSearchModalOpen: false} satisfies HistoryState, '');
+    const routerContext = useMemo(() => {
+        const openSearchRouter = () => {
+            if (isBrowserWithHistory) {
+                window.history.pushState({isSearchModalOpen: true} satisfies HistoryState, '');
             }
-        }
-    };
-
-    const startSearchRouterOpenSpan = () => {
-        startSpan(CONST.TELEMETRY.SPAN_OPEN_SEARCH_ROUTER, {
-            name: CONST.TELEMETRY.SPAN_OPEN_SEARCH_ROUTER,
-            op: CONST.TELEMETRY.SPAN_OPEN_SEARCH_ROUTER,
-            attributes: {
-                trigger: 'keyboard',
-            },
-        });
-    };
-
-    // There are callbacks that live outside of React render-loop and interact with SearchRouter
-    // So we need a function that is based on ref to correctly open/close it
-    // When user is on `/search` page we focus the Input instead of showing router
-    const toggleSearch = () => {
-        const searchFullScreenRoutes = navigationRef.getRootState()?.routes.findLast((route) => route.name === NAVIGATORS.SEARCH_FULLSCREEN_NAVIGATOR);
-        const lastRoute = searchFullScreenRoutes?.state?.routes?.at(-1);
-        const isUserOnSearchPage = isSearchTopmostFullScreenRoute() && lastRoute?.name === SCREENS.SEARCH.ROOT;
-
-        if (isUserOnSearchPage && searchPageInputRef.current) {
-            if (searchPageInputRef.current.isFocused()) {
-                searchPageInputRef.current.blur();
+            close(
+                () => {
+                    setIsSearchRouterDisplayed(true);
+                    searchRouterDisplayedRef.current = true;
+                },
+                false,
+                true,
+            );
+        };
+        const closeSearchRouter = () => {
+            setIsSearchRouterDisplayed(false);
+            searchRouterDisplayedRef.current = false;
+            if (isBrowserWithHistory) {
+                const state = window.history.state as HistoryState | null;
+                if (state?.isSearchModalOpen) {
+                    window.history.replaceState({isSearchModalOpen: false} satisfies HistoryState, '');
+                }
+            }
+        };
+
+        const startSearchRouterOpenSpan = () => {
+            startSpan(CONST.TELEMETRY.SPAN_OPEN_SEARCH_ROUTER, {
+                name: CONST.TELEMETRY.SPAN_OPEN_SEARCH_ROUTER,
+                op: CONST.TELEMETRY.SPAN_OPEN_SEARCH_ROUTER,
+                attributes: {
+                    trigger: 'keyboard',
+                },
+            });
+        };
+
+        // There are callbacks that live outside of React render-loop and interact with SearchRouter
+        // So we need a function that is based on ref to correctly open/close it
+        // When user is on `/search` page we focus the Input instead of showing router
+        const toggleSearch = () => {
+            const searchFullScreenRoutes = navigationRef.getRootState()?.routes.findLast((route) => route.name === NAVIGATORS.SEARCH_FULLSCREEN_NAVIGATOR);
+            const lastRoute = searchFullScreenRoutes?.state?.routes?.at(-1);
+            const isUserOnSearchPage = isSearchTopmostFullScreenRoute() && lastRoute?.name === SCREENS.SEARCH.ROOT;
+
+            if (isUserOnSearchPage && searchPageInputRef.current) {
+                if (searchPageInputRef.current.isFocused()) {
+                    searchPageInputRef.current.blur();
+                } else {
+                    startSearchRouterOpenSpan();
+                    searchPageInputRef.current.focus();
+                }
+            } else if (searchRouterDisplayedRef.current) {
+                closeSearchRouter();
             } else {
                 startSearchRouterOpenSpan();
-                searchPageInputRef.current.focus();
+                openSearchRouter();
             }
-        } else if (searchRouterDisplayedRef.current) {
-            closeSearchRouter();
-        } else {
-            startSearchRouterOpenSpan();
-            openSearchRouter();
-        }
-    };
-
-    const registerSearchPageInput = (ref: AnimatedTextInputRef) => {
-        searchPageInputRef.current = ref;
-    };
-
-    const unregisterSearchPageInput = () => {
-        searchPageInputRef.current = undefined;
-    };
-
-    // Because of the React Compiler we don't need to memoize it manually
-    // eslint-disable-next-line react/jsx-no-constructed-context-values
-    const actionsContextValue = {
-        openSearchRouter,
-        closeSearchRouter,
-        toggleSearch,
-        registerSearchPageInput,
-        unregisterSearchPageInput,
-    };
-
-    // Because of the React Compiler we don't need to memoize it manually
-    // eslint-disable-next-line react/jsx-no-constructed-context-values
-    const stateContextValue = {isSearchRouterDisplayed};
-
-    return (
-        <SearchRouterActionsContext.Provider value={actionsContextValue}>
-            <SearchRouterStateContext.Provider value={stateContextValue}>{children}</SearchRouterStateContext.Provider>
-        </SearchRouterActionsContext.Provider>
-    );
-}
+        };
+
+        const registerSearchPageInput = (ref: AnimatedTextInputRef) => {
+            searchPageInputRef.current = ref;
+        };
+
+        const unregisterSearchPageInput = () => {
+            searchPageInputRef.current = undefined;
+        };
+
+        return {
+            isSearchRouterDisplayed,
+            openSearchRouter,
+            closeSearchRouter,
+            toggleSearch,
+            registerSearchPageInput,
+            unregisterSearchPageInput,
+        };
+    }, [isSearchRouterDisplayed, setIsSearchRouterDisplayed]);
 
-function useSearchRouterState() {
-    return useContext(SearchRouterStateContext);
+    return <Context.Provider value={routerContext}>{children}</Context.Provider>;
 }
 
-function useSearchRouterActions() {
-    return useContext(SearchRouterActionsContext);
+function useSearchRouterContext() {
+    return useContext(Context);
 }
 
-export {SearchRouterContextProvider, useSearchRouterState, useSearchRouterActions};
+export {SearchRouterContextProvider, useSearchRouterContext};
diff --git a/src/components/Search/SearchRouter/SearchRouterModal.tsx b/src/components/Search/SearchRouter/SearchRouterModal.tsx
index d456e095e401..efa0ea5667f6 100644
--- a/src/components/Search/SearchRouter/SearchRouterModal.tsx
+++ b/src/components/Search/SearchRouter/SearchRouterModal.tsx
@@ -8,14 +8,13 @@ import useViewportOffsetTop from '@hooks/useViewportOffsetTop';
 import {isMobileIOS} from '@libs/Browser';
 import CONST from '@src/CONST';
 import SearchRouter from './SearchRouter';
-import {useSearchRouterActions, useSearchRouterState} from './SearchRouterContext';
+import {useSearchRouterContext} from './SearchRouterContext';
 
 const isMobileWebIOS = isMobileIOS();
 
 function SearchRouterModal() {
     const {shouldUseNarrowLayout} = useResponsiveLayout();
-    const {isSearchRouterDisplayed} = useSearchRouterState();
-    const {closeSearchRouter} = useSearchRouterActions();
+    const {isSearchRouterDisplayed, closeSearchRouter} = useSearchRouterContext();
     const viewportOffsetTop = useViewportOffsetTop();
 
     // On mWeb Safari, the input caret stuck for a moment while the modal is animating. So, we hide the caret until the animation is done.
diff --git a/src/components/Search/SearchSingleSelectionPicker.tsx b/src/components/Search/SearchSingleSelectionPicker.tsx
index a1c2a57617d0..49d6e3d1975a 100644
--- a/src/components/Search/SearchSingleSelectionPicker.tsx
+++ b/src/components/Search/SearchSingleSelectionPicker.tsx
@@ -7,7 +7,6 @@ import useLocalize from '@hooks/useLocalize';
 import Navigation from '@libs/Navigation/Navigation';
 import type {OptionData} from '@libs/ReportUtils';
 import ROUTES from '@src/ROUTES';
-import type {Route} from '@src/ROUTES';
 import SearchFilterPageFooterButtons from './SearchFilterPageFooterButtons';
 
 type SearchSingleSelectionPickerItem = {
@@ -20,20 +19,10 @@ type SearchSingleSelectionPickerProps = {
     initiallySelectedItem: SearchSingleSelectionPickerItem | undefined;
     pickerTitle?: string;
     onSaveSelection: (value: string | undefined) => void;
-    backToRoute?: Route;
-    shouldAutoSave?: boolean;
     shouldShowTextInput?: boolean;
 };
 
-function SearchSingleSelectionPicker({
-    items,
-    initiallySelectedItem,
-    pickerTitle,
-    onSaveSelection,
-    backToRoute,
-    shouldAutoSave,
-    shouldShowTextInput = true,
-}: SearchSingleSelectionPickerProps) {
+function SearchSingleSelectionPicker({items, initiallySelectedItem, pickerTitle, onSaveSelection, shouldShowTextInput = true}: SearchSingleSelectionPickerProps) {
     const {translate} = useLocalize();
 
     const [searchTerm, debouncedSearchTerm, setSearchTerm] = useDebouncedState('');
@@ -84,22 +73,14 @@ function SearchSingleSelectionPicker({
         };
     }, [initiallySelectedItem, selectedItem?.value, items, pickerTitle, debouncedSearchTerm]);
 
-    const onSelectItem = useCallback(
-        (item: Partial<OptionData & SearchSingleSelectionPickerItem>) => {
-            if (!item.text || !item.keyForList || !item.value) {
-                return;
-            }
-            if (shouldAutoSave) {
-                onSaveSelection(item.isSelected ? '' : item.value);
-                Navigation.goBack(backToRoute ?? ROUTES.SEARCH_ADVANCED_FILTERS.getRoute());
-                return;
-            }
-            if (!item.isSelected) {
-                setSelectedItem({name: item.text, value: item.value});
-            }
-        },
-        [shouldAutoSave, backToRoute, onSaveSelection],
-    );
+    const onSelectItem = useCallback((item: Partial<OptionData & SearchSingleSelectionPickerItem>) => {
+        if (!item.text || !item.keyForList || !item.value) {
+            return;
+        }
+        if (!item.isSelected) {
+            setSelectedItem({name: item.text, value: item.value});
+        }
+    }, []);
 
     const resetChanges = useCallback(() => {
         setSelectedItem(undefined);
@@ -107,8 +88,8 @@ function SearchSingleSelectionPicker({
 
     const applyChanges = useCallback(() => {
         onSaveSelection(selectedItem?.value);
-        Navigation.goBack(backToRoute ?? ROUTES.SEARCH_ADVANCED_FILTERS.getRoute());
-    }, [onSaveSelection, selectedItem?.value, backToRoute]);
+        Navigation.goBack(ROUTES.SEARCH_ADVANCED_FILTERS.getRoute());
+    }, [onSaveSelection, selectedItem?.value]);
 
     const footerContent = useMemo(
         () => (
@@ -128,7 +109,7 @@ function SearchSingleSelectionPicker({
             textInputLabel={shouldShowTextInput ? translate('common.search') : undefined}
             onSelectRow={onSelectItem}
             headerMessage={noResultsFound ? translate('common.noResultsFound') : undefined}
-            footerContent={shouldAutoSave ? undefined : footerContent}
+            footerContent={footerContent}
             shouldStopPropagation
             showLoadingPlaceholder={!noResultsFound}
             shouldShowTooltips
diff --git a/src/components/Search/index.tsx b/src/components/Search/index.tsx
index 458d59c5e833..913fd2d1b668 100644
--- a/src/components/Search/index.tsx
+++ b/src/components/Search/index.tsx
@@ -9,14 +9,20 @@ import FullPageErrorView from '@components/BlockingViews/FullPageErrorView';
 import FullPageOfflineBlockingView from '@components/BlockingViews/FullPageOfflineBlockingView';
 import ConfirmModal from '@components/ConfirmModal';
 import SearchTableHeader from '@components/SelectionListWithSections/SearchTableHeader';
-import type {ReportActionListItemType, SearchListItem, SelectionListHandle, TransactionGroupListItemType, TransactionListItemType} from '@components/SelectionListWithSections/types';
+import type {
+    ReportActionListItemType,
+    SearchListItem,
+    SelectionListHandle,
+    TransactionGroupListItemType,
+    TransactionListItemType,
+    TransactionReportGroupListItemType,
+} from '@components/SelectionListWithSections/types';
 import SearchRowSkeleton from '@components/Skeletons/SearchRowSkeleton';
 import {WideRHPContext} from '@components/WideRHPContextProvider';
 import useArchivedReportsIdSet from '@hooks/useArchivedReportsIdSet';
 import useCardFeedsForDisplay from '@hooks/useCardFeedsForDisplay';
 import useCurrentUserPersonalDetails from '@hooks/useCurrentUserPersonalDetails';
 import useLocalize from '@hooks/useLocalize';
-import useMultipleSnapshots from '@hooks/useMultipleSnapshots';
 import useNetwork from '@hooks/useNetwork';
 import useOnyx from '@hooks/useOnyx';
 import usePermissions from '@hooks/usePermissions';
@@ -54,12 +60,13 @@ import {
     isTransactionGroupListItemType,
     isTransactionListItemType,
     isTransactionMemberGroupListItemType,
+    isTransactionReportGroupListItemType,
     isTransactionWithdrawalIDGroupListItemType,
     shouldShowEmptyState,
     shouldShowYear as shouldShowYearUtil,
 } from '@libs/SearchUIUtils';
-import {cancelSpan, endSpan, getSpan, startSpan} from '@libs/telemetry/activeSpans';
-import {getOriginalTransactionWithSplitInfo, hasValidModifiedAmount, isOnHold, isTransactionPendingDelete} from '@libs/TransactionUtils';
+import {cancelSpan, endSpan, startSpan} from '@libs/telemetry/activeSpans';
+import {getOriginalTransactionWithSplitInfo, isOnHold, isTransactionPendingDelete} from '@libs/TransactionUtils';
 import Navigation, {navigationRef} from '@navigation/Navigation';
 import type {SearchFullscreenNavigatorParamList} from '@navigation/types';
 import EmptySearchView from '@pages/Search/EmptySearchView';
@@ -96,21 +103,23 @@ function mapTransactionItemToSelectedEntry(
     itemTransaction: OnyxEntry<Transaction>,
     originalItemTransaction: OnyxEntry<Transaction>,
     currentUserLogin: string,
-    currentUserAccountID: number,
     outstandingReportsByPolicyID?: OutstandingReportsByPolicyIDDerivedValue,
+    allowNegativeAmount = true,
 ): [string, SelectedTransactionInfo] {
     const {canHoldRequest, canUnholdRequest} = canHoldUnholdReportAction(item.report, item.reportAction, item.holdReportAction, item, item.policy);
     const canRejectRequest = item.report ? canRejectReportAction(currentUserLogin, item.report, item.policy) : false;
+    // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
+    const amount = item.modifiedAmount || item.amount;
+
     return [
         item.keyForList,
         {
-            transaction: item,
             isSelected: true,
             canReject: canRejectRequest,
             canHold: canHoldRequest,
             isHeld: isOnHold(item),
             canUnhold: canUnholdRequest,
-            canSplit: isSplitAction(item.report, [itemTransaction], originalItemTransaction, currentUserLogin, currentUserAccountID, item.policy),
+            canSplit: isSplitAction(item.report, [itemTransaction], originalItemTransaction, currentUserLogin, item.policy),
             hasBeenSplit: getOriginalTransactionWithSplitInfo(itemTransaction, originalItemTransaction).isExpenseSplit,
             canChangeReport: canEditFieldOfMoneyRequest(
                 item.reportAction,
@@ -126,8 +135,8 @@ function mapTransactionItemToSelectedEntry(
             groupCurrency: item.groupCurrency,
             groupExchangeRate: item.groupExchangeRate,
             reportID: item.reportID,
-            policyID: item.report?.policyID,
-            amount: hasValidModifiedAmount(item) ? Number(item.modifiedAmount) : item.amount,
+            policyID: item.policyID,
+            amount: allowNegativeAmount ? amount : Math.abs(amount),
             groupAmount: item.groupAmount,
             currency: item.currency,
             isFromOneTransactionReport: isOneTransactionReport(item.report),
@@ -137,13 +146,33 @@ function mapTransactionItemToSelectedEntry(
     ];
 }
 
+function mapEmptyReportToSelectedEntry(item: TransactionReportGroupListItemType): [string, SelectedTransactionInfo] {
+    return [
+        item.keyForList ?? '',
+        {
+            isSelected: true,
+            canHold: false,
+            canSplit: false,
+            canReject: false,
+            hasBeenSplit: false,
+            isHeld: false,
+            canUnhold: false,
+            canChangeReport: false,
+            action: item.action ?? CONST.SEARCH.ACTION_TYPES.VIEW,
+            reportID: item.reportID,
+            policyID: item.policyID ?? CONST.POLICY.ID_FAKE,
+            amount: 0,
+            currency: '',
+        },
+    ];
+}
+
 function prepareTransactionsList(
     item: TransactionListItemType,
     itemTransaction: OnyxEntry<Transaction>,
     originalItemTransaction: OnyxEntry<Transaction>,
     selectedTransactions: SelectedTransactions,
     currentUserLogin: string,
-    currentUserAccountID: number,
     outstandingReportsByPolicyID?: OutstandingReportsByPolicyIDDerivedValue,
 ) {
     if (selectedTransactions[item.keyForList]?.isSelected) {
@@ -152,42 +181,11 @@ function prepareTransactionsList(
         return transactions;
     }
 
-    const {canHoldRequest, canUnholdRequest} = canHoldUnholdReportAction(item.report, item.reportAction, item.holdReportAction, item, item.policy);
-    const canRejectRequest = item.report ? canRejectReportAction(currentUserLogin, item.report, item.policy) : false;
+    const [key, selectedInfo] = mapTransactionItemToSelectedEntry(item, itemTransaction, originalItemTransaction, currentUserLogin, outstandingReportsByPolicyID, false);
 
     return {
         ...selectedTransactions,
-        [item.keyForList]: {
-            transaction: item,
-            isSelected: true,
-            canReject: canRejectRequest,
-            canHold: canHoldRequest,
-            isHeld: isOnHold(item),
-            canUnhold: canUnholdRequest,
-            canSplit: isSplitAction(item.report, [itemTransaction], originalItemTransaction, currentUserLogin, currentUserAccountID, item.policy),
-            hasBeenSplit: getOriginalTransactionWithSplitInfo(itemTransaction, originalItemTransaction).isExpenseSplit,
-            canChangeReport: canEditFieldOfMoneyRequest(
-                item.reportAction,
-                CONST.EDIT_REQUEST_FIELD.REPORT,
-                undefined,
-                undefined,
-                outstandingReportsByPolicyID,
-                item,
-                item.report,
-                item.policy,
-            ),
-            action: item.action,
-            reportID: item.reportID,
-            policyID: item.policyID,
-            amount: Math.abs(hasValidModifiedAmount(item) ? Number(item.modifiedAmount) : item.amount),
-            groupAmount: item.groupAmount,
-            groupCurrency: item.groupCurrency,
-            groupExchangeRate: item.groupExchangeRate,
-            currency: item.currency,
-            isFromOneTransactionReport: isOneTransactionReport(item.report),
-            ownerAccountID: item.reportAction?.actorAccountID,
-            reportAction: item.reportAction,
-        },
+        [key]: selectedInfo,
     };
 }
 
@@ -247,14 +245,12 @@ function Search({
     const [reportActions] = useOnyx(ONYXKEYS.COLLECTION.REPORT_ACTIONS, {canBeMissing: true});
     const [outstandingReportsByPolicyID] = useOnyx(ONYXKEYS.DERIVED.OUTSTANDING_REPORTS_BY_POLICY_ID, {canBeMissing: true});
     const [violations] = useOnyx(ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS, {canBeMissing: true});
-    const [policies] = useOnyx(ONYXKEYS.COLLECTION.POLICY, {canBeMissing: true});
     const {accountID, email, login} = useCurrentUserPersonalDetails();
     const [isActionLoadingSet = new Set<string>()] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT_METADATA}`, {canBeMissing: true, selector: isActionLoadingSetSelector});
     const [visibleColumns] = useOnyx(ONYXKEYS.FORMS.SEARCH_ADVANCED_FILTERS_FORM, {canBeMissing: true, selector: columnsSelector});
     const [customCardNames] = useOnyx(ONYXKEYS.NVP_EXPENSIFY_COMPANY_CARDS_CUSTOM_NAMES, {canBeMissing: true});
 
     const isExpenseReportType = type === CONST.SEARCH.DATA_TYPES.EXPENSE_REPORT;
-    const {markReportIDAsMultiTransactionExpense, unmarkReportIDAsMultiTransactionExpense} = useContext(WideRHPContext);
 
     const archivedReportsIdSet = useArchivedReportsIdSet();
 
@@ -373,7 +369,7 @@ function Search({
     const shouldShowLoadingMoreItems = !shouldShowLoadingState && searchResults?.search?.isLoading && searchResults?.search?.offset > 0;
     const prevIsSearchResultEmpty = usePrevious(isSearchResultsEmpty);
 
-    const [baseFilteredData, filteredDataLength, allDataLength] = useMemo(() => {
+    const [filteredData, filteredDataLength, allDataLength] = useMemo(() => {
         if (searchResults === undefined || !isDataLoaded) {
             return [[], 0, 0];
         }
@@ -388,7 +384,6 @@ function Search({
         const [filteredData1, allLength] = getSections({
             type,
             data: searchResults.data,
-            policies,
             currentAccountID: accountID,
             currentUserEmail: email ?? '',
             translate,
@@ -419,64 +414,10 @@ function Search({
         email,
         isActionLoadingSet,
         cardFeeds,
-        policies,
         bankAccountList,
         violations,
     ]);
 
-    // For group-by views, each grouped item has a transactionsQueryJSON with a hash pointing to a separate snapshot
-    // containing its individual transactions. We collect these hashes and fetch their snapshots to enrich the grouped items.
-    const groupByTransactionHashes = useMemo(() => {
-        if (!validGroupBy) {
-            return [];
-        }
-        return (baseFilteredData as TransactionGroupListItemType[])
-            .map((item) => (item.transactionsQueryJSON?.hash ? String(item.transactionsQueryJSON.hash) : undefined))
-            .filter((hashValue): hashValue is string => !!hashValue);
-    }, [validGroupBy, baseFilteredData]);
-
-    const groupByTransactionSnapshots = useMultipleSnapshots(groupByTransactionHashes);
-
-    const filteredData = useMemo(() => {
-        if (!validGroupBy || isExpenseReportType) {
-            return baseFilteredData;
-        }
-
-        const enriched = (baseFilteredData as TransactionGroupListItemType[]).map((item) => {
-            const snapshot = item.transactionsQueryJSON?.hash ? groupByTransactionSnapshots[String(item.transactionsQueryJSON.hash)] : undefined;
-            if (!snapshot?.data) {
-                return item;
-            }
-
-            const [transactions1] = getSections({
-                type: CONST.SEARCH.DATA_TYPES.EXPENSE,
-                data: snapshot.data,
-                currentAccountID: accountID,
-                currentUserEmail: email ?? '',
-                bankAccountList,
-                translate,
-                formatPhoneNumber,
-                isActionLoadingSet,
-            });
-            return {...item, transactions: transactions1 as TransactionListItemType[]};
-        });
-
-        return enriched;
-    }, [validGroupBy, isExpenseReportType, baseFilteredData, groupByTransactionSnapshots, accountID, email, translate, formatPhoneNumber, isActionLoadingSet, bankAccountList]);
-
-    const hasLoadedAllTransactions = useMemo(() => {
-        if (!validGroupBy) {
-            return true;
-        }
-        // For group-by views, check if all transactions in groups have been loaded
-        return (baseFilteredData as TransactionGroupListItemType[]).every((item) => {
-            const snapshot = item.transactionsQueryJSON?.hash ? groupByTransactionSnapshots[String(item.transactionsQueryJSON.hash)] : undefined;
-            // If snapshot doesn't exist, the group hasn't been expanded yet (transactions not loaded)
-            // If snapshot exists and has hasMoreResults: true, not all transactions are loaded
-            return !!snapshot && !snapshot?.search?.hasMoreResults;
-        });
-    }, [validGroupBy, baseFilteredData, groupByTransactionSnapshots]);
-
     useEffect(() => {
         /** We only want to display the skeleton for the status filters the first time we load them for a specific data type */
         setShouldShowFiltersBarLoading(shouldShowLoadingState && lastSearchType !== type);
@@ -515,9 +456,28 @@ function Search({
                     continue;
                 }
 
+                if (transactionGroup.transactions.length === 0 && isTransactionReportGroupListItemType(transactionGroup)) {
+                    const reportKey = transactionGroup.keyForList;
+                    if (transactionGroup.pendingAction === CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE) {
+                        continue;
+                    }
+                    if (reportKey && (reportKey in selectedTransactions || areAllMatchingItemsSelected)) {
+                        const [, emptyReportSelection] = mapEmptyReportToSelectedEntry(transactionGroup);
+                        newTransactionList[reportKey] = {
+                            ...emptyReportSelection,
+                            isSelected: areAllMatchingItemsSelected || selectedTransactions[reportKey]?.isSelected,
+                        };
+                    }
+                    continue;
+                }
+
                 // For expense reports: when ANY transaction is selected, we want ALL transactions in the report selected.
                 // This ensures report-level selection persists when new transactions are added.
-                const hasAnySelected = isExpenseReportType && transactionGroup.transactions.some((transaction) => transaction.transactionID in selectedTransactions);
+                // Also check if the report itself was selected (when it was empty) by checking the reportID key
+                const reportKey = transactionGroup.keyForList;
+                const wasReportSelected = reportKey && reportKey in selectedTransactions;
+                // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
+                const hasAnySelected = isExpenseReportType && (wasReportSelected || transactionGroup.transactions.some((transaction) => transaction.transactionID in selectedTransactions));
 
                 for (const transactionItem of transactionGroup.transactions) {
                     const isSelected = transactionItem.transactionID in selectedTransactions;
@@ -541,12 +501,11 @@ function Search({
                     const originalItemTransaction = searchResults?.data?.[`${ONYXKEYS.COLLECTION.TRANSACTION}${itemTransaction?.comment?.originalTransactionID}`];
 
                     newTransactionList[transactionItem.transactionID] = {
-                        transaction: transactionItem,
                         action: transactionItem.action,
                         canHold: canHoldRequest,
                         isHeld: isOnHold(transactionItem),
                         canUnhold: canUnholdRequest,
-                        canSplit: isSplitAction(transactionItem.report, [itemTransaction], originalItemTransaction, login ?? '', accountID, transactionItem.policy),
+                        canSplit: isSplitAction(transactionItem.report, [itemTransaction], originalItemTransaction, login ?? '', transactionItem.policy),
                         hasBeenSplit: getOriginalTransactionWithSplitInfo(itemTransaction, originalItemTransaction).isExpenseSplit,
                         canChangeReport: canEditFieldOfMoneyRequest(
                             transactionItem.reportAction,
@@ -563,14 +522,13 @@ function Search({
                         canReject: canRejectRequest,
                         reportID: transactionItem.reportID,
                         policyID: transactionItem.report?.policyID,
-                        amount: hasValidModifiedAmount(transactionItem) ? Number(transactionItem.modifiedAmount) : transactionItem.amount,
+                        amount: transactionItem.modifiedAmount ?? transactionItem.amount,
                         groupAmount: transactionItem.groupAmount,
                         groupCurrency: transactionItem.groupCurrency,
                         groupExchangeRate: transactionItem.groupExchangeRate,
                         currency: transactionItem.currency,
                         ownerAccountID: transactionItem.reportAction?.actorAccountID,
                         reportAction: transactionItem.reportAction,
-                        isFromOneTransactionReport: isOneTransactionReport(transactionItem.report),
                     };
                 }
             }
@@ -596,12 +554,11 @@ function Search({
                 const originalItemTransaction = searchResults?.data?.[`${ONYXKEYS.COLLECTION.TRANSACTION}${itemTransaction?.comment?.originalTransactionID}`];
 
                 newTransactionList[transactionItem.transactionID] = {
-                    transaction: transactionItem,
                     action: transactionItem.action,
                     canHold: canHoldRequest,
                     isHeld: isOnHold(transactionItem),
                     canUnhold: canUnholdRequest,
-                    canSplit: isSplitAction(transactionItem.report, [itemTransaction], originalItemTransaction, login ?? '', accountID, transactionItem.policy),
+                    canSplit: isSplitAction(transactionItem.report, [itemTransaction], originalItemTransaction, login ?? '', transactionItem.policy),
                     hasBeenSplit: getOriginalTransactionWithSplitInfo(itemTransaction, originalItemTransaction).isExpenseSplit,
                     canChangeReport: canEditFieldOfMoneyRequest(
                         transactionItem.reportAction,
@@ -618,14 +575,13 @@ function Search({
                     canReject: canRejectRequest,
                     reportID: transactionItem.reportID,
                     policyID: transactionItem.report?.policyID,
-                    amount: hasValidModifiedAmount(transactionItem) ? Number(transactionItem.modifiedAmount) : transactionItem.amount,
+                    amount: transactionItem.modifiedAmount ?? transactionItem.amount,
                     groupAmount: transactionItem.groupAmount,
                     groupCurrency: transactionItem.groupCurrency,
                     groupExchangeRate: transactionItem.groupExchangeRate,
                     currency: transactionItem.currency,
                     ownerAccountID: transactionItem.reportAction?.actorAccountID,
                     reportAction: transactionItem.reportAction,
-                    isFromOneTransactionReport: isOneTransactionReport(transactionItem.report),
                 };
             }
         }
@@ -662,25 +618,37 @@ function Search({
         isRefreshingSelection.current = false;
     }, [selectedTransactions]);
 
-    useEffect(() => {
-        if (!isFocused) {
-            return;
-        }
-
-        if (!filteredData.length || isRefreshingSelection.current) {
-            return;
-        }
-        const areItemsGrouped = !!validGroupBy || type === CONST.SEARCH.DATA_TYPES.EXPENSE_REPORT;
-        const flattenedItems = areItemsGrouped ? (filteredData as TransactionGroupListItemType[]).flatMap((item) => item.transactions) : filteredData;
-        const areAllItemsSelected = flattenedItems.length === Object.keys(selectedTransactions).length;
-
-        // If the user has selected all the expenses in their view but there are more expenses matched by the search
-        // give them the option to select all matching expenses
-        shouldShowSelectAllMatchingItems(!!(areAllItemsSelected && searchResults?.search?.hasMoreResults));
-        if (!areAllItemsSelected) {
-            selectAllMatchingItems(false);
-        }
-    }, [isFocused, filteredData, searchResults?.search?.hasMoreResults, selectedTransactions, selectAllMatchingItems, shouldShowSelectAllMatchingItems, validGroupBy, type]);
+    const updateSelectAllMatchingItemsState = useCallback(
+        (updatedSelectedTransactions: SelectedTransactions) => {
+            if (!filteredData.length || isRefreshingSelection.current) {
+                return;
+            }
+            const areItemsGrouped = !!validGroupBy || type === CONST.SEARCH.DATA_TYPES.EXPENSE_REPORT;
+            const totalSelectableItemsCount = areItemsGrouped
+                ? (filteredData as TransactionGroupListItemType[]).reduce((count, item) => {
+                      // For empty reports, count the report itself as a selectable item
+                      if (item.transactions.length === 0 && isTransactionReportGroupListItemType(item)) {
+                          if (item.pendingAction === CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE) {
+                              return count;
+                          }
+                          return count + 1;
+                      }
+                      // For regular reports, count all transactions except pending delete ones
+                      const selectableTransactions = item.transactions.filter((transaction) => !isTransactionPendingDelete(transaction));
+                      return count + selectableTransactions.length;
+                  }, 0)
+                : filteredData.length;
+            const areAllItemsSelected = totalSelectableItemsCount === Object.keys(updatedSelectedTransactions).length;
+
+            // If the user has selected all the expenses in their view but there are more expenses matched by the search
+            // give them the option to select all matching expenses
+            shouldShowSelectAllMatchingItems(!!(areAllItemsSelected && searchResults?.search?.hasMoreResults));
+            if (!areAllItemsSelected) {
+                selectAllMatchingItems(false);
+            }
+        },
+        [filteredData, validGroupBy, type, searchResults?.search?.hasMoreResults, shouldShowSelectAllMatchingItems, selectAllMatchingItems],
+    );
 
     const toggleTransaction = useCallback(
         (item: SearchListItem, itemTransactions?: TransactionListItemType[]) => {
@@ -699,14 +667,43 @@ function Search({
                 }
                 const itemTransaction = transactions?.[`${ONYXKEYS.COLLECTION.TRANSACTION}${item.transactionID}`] as OnyxEntry<Transaction>;
                 const originalItemTransaction = transactions?.[`${ONYXKEYS.COLLECTION.TRANSACTION}${itemTransaction?.comment?.originalTransactionID}`];
-                setSelectedTransactions(
-                    prepareTransactionsList(item, itemTransaction, originalItemTransaction, selectedTransactions, email ?? '', accountID, outstandingReportsByPolicyID),
-                    filteredData,
-                );
+                const updatedTransactions = prepareTransactionsList(item, itemTransaction, originalItemTransaction, selectedTransactions, email ?? '', outstandingReportsByPolicyID);
+                setSelectedTransactions(updatedTransactions, filteredData);
+                updateSelectAllMatchingItemsState(updatedTransactions);
                 return;
             }
 
             const currentTransactions = itemTransactions ?? item.transactions;
+            // Handle empty reports - treat the report itself as selectable
+            if (currentTransactions.length === 0 && isTransactionReportGroupListItemType(item)) {
+                const reportKey = item.keyForList;
+                if (!reportKey) {
+                    return;
+                }
+
+                if (item.pendingAction === CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE) {
+                    return;
+                }
+
+                if (selectedTransactions[reportKey]?.isSelected) {
+                    // Deselect the empty report
+                    const reducedSelectedTransactions: SelectedTransactions = {...selectedTransactions};
+                    delete reducedSelectedTransactions[reportKey];
+                    setSelectedTransactions(reducedSelectedTransactions, filteredData);
+                    updateSelectAllMatchingItemsState(reducedSelectedTransactions);
+                    return;
+                }
+
+                const [, emptyReportSelection] = mapEmptyReportToSelectedEntry(item);
+                const updatedTransactions = {
+                    ...selectedTransactions,
+                    [reportKey]: emptyReportSelection,
+                };
+                setSelectedTransactions(updatedTransactions, filteredData);
+                updateSelectAllMatchingItemsState(updatedTransactions);
+                return;
+            }
+
             if (currentTransactions.some((transaction) => selectedTransactions[transaction.keyForList]?.isSelected)) {
                 const reducedSelectedTransactions: SelectedTransactions = {...selectedTransactions};
 
@@ -715,26 +712,26 @@ function Search({
                 }
 
                 setSelectedTransactions(reducedSelectedTransactions, filteredData);
+                updateSelectAllMatchingItemsState(reducedSelectedTransactions);
                 return;
             }
 
-            setSelectedTransactions(
-                {
-                    ...selectedTransactions,
-                    ...Object.fromEntries(
-                        currentTransactions
-                            .filter((t) => !isTransactionPendingDelete(t))
-                            .map((transactionItem) => {
-                                const itemTransaction = searchResults?.data?.[`${ONYXKEYS.COLLECTION.TRANSACTION}${transactionItem.transactionID}`] as OnyxEntry<Transaction>;
-                                const originalItemTransaction = searchResults?.data?.[`${ONYXKEYS.COLLECTION.TRANSACTION}${itemTransaction?.comment?.originalTransactionID}`];
-                                return mapTransactionItemToSelectedEntry(transactionItem, itemTransaction, originalItemTransaction, email ?? '', accountID, outstandingReportsByPolicyID);
-                            }),
-                    ),
-                },
-                filteredData,
-            );
+            const updatedTransactions = {
+                ...selectedTransactions,
+                ...Object.fromEntries(
+                    currentTransactions
+                        .filter((t) => !isTransactionPendingDelete(t))
+                        .map((transactionItem) => {
+                            const itemTransaction = searchResults?.data?.[`${ONYXKEYS.COLLECTION.TRANSACTION}${transactionItem.transactionID}`] as OnyxEntry<Transaction>;
+                            const originalItemTransaction = searchResults?.data?.[`${ONYXKEYS.COLLECTION.TRANSACTION}${itemTransaction?.comment?.originalTransactionID}`];
+                            return mapTransactionItemToSelectedEntry(transactionItem, itemTransaction, originalItemTransaction, email ?? '', outstandingReportsByPolicyID);
+                        }),
+                ),
+            };
+            setSelectedTransactions(updatedTransactions, filteredData);
+            updateSelectAllMatchingItemsState(updatedTransactions);
         },
-        [setSelectedTransactions, selectedTransactions, filteredData, transactions, outstandingReportsByPolicyID, searchResults?.data, email, accountID],
+        [selectedTransactions, setSelectedTransactions, filteredData, updateSelectAllMatchingItemsState, transactions, email, outstandingReportsByPolicyID, searchResults?.data],
     );
 
     const onSelectRow = useCallback(
@@ -825,13 +822,6 @@ function Search({
                         setOptimisticDataForTransactionThreadPreview(firstTransaction, transactionPreviewData, firstTransaction?.reportAction?.childReportID);
                     }
                 }
-
-                if (item.transactions.length > 1) {
-                    markReportIDAsMultiTransactionExpense(reportID);
-                } else {
-                    unmarkReportIDAsMultiTransactionExpense(reportID);
-                }
-
                 requestAnimationFrame(() => Navigation.navigate(ROUTES.SEARCH_MONEY_REQUEST_REPORT.getRoute({reportID, backTo})));
                 return;
             }
@@ -850,16 +840,7 @@ function Search({
 
             requestAnimationFrame(() => Navigation.navigate(ROUTES.SEARCH_REPORT.getRoute({reportID, backTo})));
         },
-        [
-            isMobileSelectionModeEnabled,
-            markReportIDAsExpense,
-            toggleTransaction,
-            queryJSON,
-            handleSearch,
-            searchKey,
-            markReportIDAsMultiTransactionExpense,
-            unmarkReportIDAsMultiTransactionExpense,
-        ],
+        [isMobileSelectionModeEnabled, toggleTransaction, queryJSON, handleSearch, searchKey, markReportIDAsExpense],
     );
 
     const currentColumns = useMemo(() => {
@@ -954,81 +935,61 @@ function Search({
 
         if (totalSelected > 0) {
             clearSelectedTransactions();
+            updateSelectAllMatchingItemsState({});
             return;
         }
 
+        let updatedTransactions: SelectedTransactions;
         if (areItemsGrouped) {
-            setSelectedTransactions(
-                Object.fromEntries(
-                    (filteredData as TransactionGroupListItemType[]).flatMap((item) =>
-                        item.transactions
-                            .filter((t) => !isTransactionPendingDelete(t))
-                            .map((transactionItem) => {
-                                const itemTransaction = transactions?.[`${ONYXKEYS.COLLECTION.TRANSACTION}${transactionItem.transactionID}`] as OnyxEntry<Transaction>;
-                                const originalItemTransaction = transactions?.[`${ONYXKEYS.COLLECTION.TRANSACTION}${itemTransaction?.comment?.originalTransactionID}`];
-                                return mapTransactionItemToSelectedEntry(transactionItem, itemTransaction, originalItemTransaction, email ?? '', accountID, outstandingReportsByPolicyID);
-                            }),
-                    ),
-                ),
-                filteredData,
-            );
-
-            return;
-        }
-
-        setSelectedTransactions(
-            Object.fromEntries(
-                (filteredData as TransactionListItemType[])
+            const allSelections: Array<[string, SelectedTransactionInfo]> = (filteredData as TransactionGroupListItemType[]).flatMap((item) => {
+                if (item.transactions.length === 0 && isTransactionReportGroupListItemType(item) && item.keyForList) {
+                    if (item.pendingAction === CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE) {
+                        return [];
+                    }
+                    return [mapEmptyReportToSelectedEntry(item)];
+                }
+                return item.transactions
                     .filter((t) => !isTransactionPendingDelete(t))
+                    .map((transactionItem) => {
+                        const itemTransaction = transactions?.[`${ONYXKEYS.COLLECTION.TRANSACTION}${transactionItem.transactionID}`] as OnyxEntry<Transaction>;
+                        const originalItemTransaction = transactions?.[`${ONYXKEYS.COLLECTION.TRANSACTION}${itemTransaction?.comment?.originalTransactionID}`];
+                        return mapTransactionItemToSelectedEntry(transactionItem, itemTransaction, originalItemTransaction, email ?? '', outstandingReportsByPolicyID);
+                    });
+            });
+            updatedTransactions = Object.fromEntries(allSelections);
+        } else {
+            // When items are not grouped, data is TransactionListItemType[] not TransactionGroupListItemType[]
+            updatedTransactions = Object.fromEntries(
+                (filteredData as TransactionListItemType[])
+                    .filter((item) => !isTransactionPendingDelete(item))
                     .map((transactionItem) => {
                         const itemTransaction = searchResults?.data?.[`${ONYXKEYS.COLLECTION.TRANSACTION}${transactionItem.transactionID}`] as OnyxEntry<Transaction>;
                         const originalItemTransaction = searchResults?.data?.[`${ONYXKEYS.COLLECTION.TRANSACTION}${itemTransaction?.comment?.originalTransactionID}`];
-                        return mapTransactionItemToSelectedEntry(transactionItem, itemTransaction, originalItemTransaction, email ?? '', accountID, outstandingReportsByPolicyID);
+                        return mapTransactionItemToSelectedEntry(transactionItem, itemTransaction, originalItemTransaction, email ?? '', outstandingReportsByPolicyID);
                     }),
-            ),
-            filteredData,
-        );
+            );
+        }
+        setSelectedTransactions(updatedTransactions, filteredData);
+        updateSelectAllMatchingItemsState(updatedTransactions);
     }, [
         validGroupBy,
         isExpenseReportType,
-        filteredData,
         selectedTransactions,
         setSelectedTransactions,
+        filteredData,
+        updateSelectAllMatchingItemsState,
         clearSelectedTransactions,
         transactions,
+        email,
         outstandingReportsByPolicyID,
         searchResults?.data,
-        email,
-        accountID,
     ]);
 
     const onLayout = useCallback(() => {
         endSpan(CONST.TELEMETRY.SPAN_NAVIGATE_TO_REPORTS_TAB);
-        endSpan(CONST.TELEMETRY.SPAN_NAVIGATE_TO_REPORTS_TAB_RENDER);
         handleSelectionListScroll(sortedData, searchListRef.current);
     }, [handleSelectionListScroll, sortedData]);
 
-    useEffect(() => {
-        if (shouldShowLoadingState) {
-            return;
-        }
-
-        const renderSpanParent = getSpan(CONST.TELEMETRY.SPAN_NAVIGATE_TO_REPORTS_TAB);
-
-        if (renderSpanParent) {
-            startSpan(CONST.TELEMETRY.SPAN_NAVIGATE_TO_REPORTS_TAB_RENDER, {
-                name: CONST.TELEMETRY.SPAN_NAVIGATE_TO_REPORTS_TAB_RENDER,
-                op: CONST.TELEMETRY.SPAN_NAVIGATE_TO_REPORTS_TAB_RENDER,
-                parentSpan: renderSpanParent,
-            }).setAttributes({
-                inputQuery: queryJSON?.inputQuery,
-            });
-        }
-
-        // Exclude `queryJSON?.inputQuery` since it’s only telemetry metadata and would cause the span to start multiple times.
-        // eslint-disable-next-line react-hooks/exhaustive-deps
-    }, [shouldShowLoadingState]);
-
     const onLayoutSkeleton = useCallback(() => {
         endSpan(CONST.TELEMETRY.SPAN_ON_LAYOUT_SKELETON_REPORTS);
     }, []);
@@ -1160,7 +1121,6 @@ function Search({
                     isMobileSelectionModeEnabled={isMobileSelectionModeEnabled}
                     shouldAnimate={type === CONST.SEARCH.DATA_TYPES.EXPENSE}
                     newTransactions={newTransactions}
-                    hasLoadedAllTransactions={hasLoadedAllTransactions}
                     customCardNames={customCardNames}
                 />
                 <ConfirmModal
diff --git a/src/components/Search/types.ts b/src/components/Search/types.ts
index add360fa1c93..289d2a889634 100644
--- a/src/components/Search/types.ts
+++ b/src/components/Search/types.ts
@@ -3,15 +3,12 @@ import type {PaymentMethod} from '@components/KYCWall/types';
 import type {ReportActionListItemType, TaskListItemType, TransactionGroupListItemType, TransactionListItemType} from '@components/SelectionListWithSections/types';
 import type {SearchKey} from '@libs/SearchUIUtils';
 import type CONST from '@src/CONST';
-import type {ReportAction, SearchResults, Transaction} from '@src/types/onyx';
+import type {ReportAction} from '@src/types/onyx';
 import type {SearchDataTypes} from '@src/types/onyx/SearchResults';
 import type IconAsset from '@src/types/utils/IconAsset';
 
 /** Model of the selected transaction */
 type SelectedTransactionInfo = {
-    /** The transaction itself */
-    transaction: Transaction;
-
     /** Whether the transaction is selected */
     isSelected: boolean;
 
@@ -61,7 +58,7 @@ type SelectedTransactionInfo = {
     groupExchangeRate?: number;
 
     /** Whether it is the only expense of the parent expense report */
-    isFromOneTransactionReport: boolean;
+    isFromOneTransactionReport?: boolean;
 
     /** Account ID of the report owner */
     ownerAccountID?: number;
@@ -128,7 +125,6 @@ type SearchContextData = {
     currentSearchHash: number;
     currentSearchKey: SearchKey | undefined;
     currentSearchQueryJSON: SearchQueryJSON | undefined;
-    currentSearchResults: SearchResults | undefined;
     selectedTransactions: SelectedTransactions;
     selectedTransactionIDs: string[];
     selectedReports: SelectedReports[];
@@ -138,7 +134,6 @@ type SearchContextData = {
 };
 
 type SearchContextProps = SearchContextData & {
-    currentSearchResults: SearchResults | undefined;
     setCurrentSearchHashAndKey: (hash: number, key: SearchKey | undefined) => void;
     setCurrentSearchQueryJSON: (searchQueryJSON: SearchQueryJSON | undefined) => void;
     /** If you want to set `selectedTransactionIDs`, pass an array as the first argument, object/record otherwise */
@@ -241,11 +236,11 @@ type SearchQueryAST = {
     status: SearchStatus;
     sortBy: SearchColumnType;
     sortOrder: SortOrder;
+    columns?: SearchCustomColumnIds[];
     groupBy?: SearchGroupBy;
     filters: ASTNode;
     policyID?: string[];
     rawFilterList?: RawQueryFilter[];
-    columns?: SearchCustomColumnIds | SearchCustomColumnIds[];
 };
 
 type SearchQueryJSON = {
diff --git a/src/components/SelectionList/ListItem/BaseListItem.tsx b/src/components/SelectionList/ListItem/BaseListItem.tsx
index dd216cb160b1..6cc84c3304be 100644
--- a/src/components/SelectionList/ListItem/BaseListItem.tsx
+++ b/src/components/SelectionList/ListItem/BaseListItem.tsx
@@ -112,7 +112,7 @@ function BaseListItem<TItem extends ListItem>({
                 }}
                 disabled={isDisabled && !item.isSelected}
                 interactive={item.isInteractive}
-                accessibilityLabel={item.accessibilityLabel ?? [item.text, item.text !== item.alternateText ? item.alternateText : undefined].filter(Boolean).join(', ')}
+                accessibilityLabel={item.text ?? ''}
                 role={getButtonRole(true)}
                 isNested
                 hoverDimmingValue={1}
diff --git a/src/components/SelectionList/ListItem/InviteMemberListItem.tsx b/src/components/SelectionList/ListItem/InviteMemberListItem.tsx
index 13f17e353307..9e5a5611681e 100644
--- a/src/components/SelectionList/ListItem/InviteMemberListItem.tsx
+++ b/src/components/SelectionList/ListItem/InviteMemberListItem.tsx
@@ -35,7 +35,6 @@ function InviteMemberListItem<TItem extends ListItem>({
     onFocus,
     shouldSyncFocus,
     wrapperStyle,
-    isMultilineSupported,
     canShowProductTrainingTooltip = true,
     index = 0,
     sectionIndex = 0,
@@ -136,12 +135,11 @@ function InviteMemberListItem<TItem extends ListItem>({
                                 <TextWithTooltip
                                     shouldShowTooltip={showTooltip}
                                     text={Str.removeSMSDomain(item.text ?? '')}
-                                    numberOfLines={isMultilineSupported ? 2 : 1}
                                     style={[
                                         styles.optionDisplayName,
                                         isFocused ? styles.sidebarLinkActiveText : styles.sidebarLinkText,
                                         item.isBold !== false && styles.sidebarLinkTextBold,
-                                        isMultilineSupported ? styles.preWrap : styles.pre,
+                                        styles.pre,
                                         item.alternateText ? styles.mb1 : null,
                                     ]}
                                 />
diff --git a/src/components/SelectionList/ListItem/SplitListItem.tsx b/src/components/SelectionList/ListItem/SplitListItem.tsx
index 548c4694b7cd..fbf5215d7869 100644
--- a/src/components/SelectionList/ListItem/SplitListItem.tsx
+++ b/src/components/SelectionList/ListItem/SplitListItem.tsx
@@ -1,5 +1,5 @@
-import React, {useCallback, useEffect, useRef, useState} from 'react';
-import {InteractionManager, View} from 'react-native';
+import React, {useCallback, useLayoutEffect, useRef, useState} from 'react';
+import {View} from 'react-native';
 import Icon from '@components/Icon';
 import type {ListItem} from '@components/SelectionList/types';
 import Text from '@components/Text';
@@ -63,19 +63,13 @@ function SplitListItem<TItem extends ListItem>({
     }, [onInputFocus, item]);
 
     // Auto-focus input when item is selected and screen transition ends
-    useEffect(() => {
-        if (!didScreenTransitionEnd || !splitItem.isSelected || !splitItem.isEditable || !inputRef.current) {
+    useLayoutEffect(() => {
+        if (!splitItem.isSelected || !splitItem.isEditable || !didScreenTransitionEnd || !inputRef.current) {
             return;
         }
 
-        // Use InteractionManager to ensure input focus happens after all animations/interactions complete.
-        // This prevents focus from interrupting modal close/open animations which would cause UI glitches
-        // and "jumping" behavior when quickly navigating between screens.
-        // eslint-disable-next-line @typescript-eslint/no-deprecated
-        InteractionManager.runAfterInteractions(() => {
-            inputRef.current?.focus();
-        });
-    }, [didScreenTransitionEnd, splitItem.isSelected, splitItem.isEditable]);
+        inputRef.current.focus();
+    }, [splitItem.isSelected, splitItem.isEditable, didScreenTransitionEnd]);
 
     const inputCallbackRef = (ref: BaseTextInputRef | null) => {
         inputRef.current = ref;
diff --git a/src/components/SelectionList/ListItem/TableListItem.tsx b/src/components/SelectionList/ListItem/TableListItem.tsx
index 42f795a70838..4835cc0a5b5f 100644
--- a/src/components/SelectionList/ListItem/TableListItem.tsx
+++ b/src/components/SelectionList/ListItem/TableListItem.tsx
@@ -1,12 +1,15 @@
 import React from 'react';
 import {View} from 'react-native';
-import Checkbox from '@components/Checkbox';
+import Icon from '@components/Icon';
+import PressableWithFeedback from '@components/Pressable/PressableWithFeedback';
 import ReportActionAvatars from '@components/ReportActionAvatars';
 import TextWithTooltip from '@components/TextWithTooltip';
 import useAnimatedHighlightStyle from '@hooks/useAnimatedHighlightStyle';
+import {useMemoizedLazyExpensifyIcons} from '@hooks/useLazyAsset';
 import useStyleUtils from '@hooks/useStyleUtils';
 import useTheme from '@hooks/useTheme';
 import useThemeStyles from '@hooks/useThemeStyles';
+import CONST from '@src/CONST';
 import BaseListItem from './BaseListItem';
 import type {ListItem, TableListItemProps} from './types';
 
@@ -30,6 +33,7 @@ function TableListItem<TItem extends ListItem>({
     const styles = useThemeStyles();
     const theme = useTheme();
     const StyleUtils = useStyleUtils();
+    const icons = useMemoizedLazyExpensifyIcons(['Checkmark']);
 
     const animatedHighlightStyle = useAnimatedHighlightStyle({
         borderRadius: styles.selectionListPressableItemWrapper.borderRadius,
@@ -83,17 +87,26 @@ function TableListItem<TItem extends ListItem>({
             {(hovered) => (
                 <>
                     {!!canSelectMultiple && (
-                        <Checkbox
+                        <PressableWithFeedback
                             accessibilityLabel={item.text ?? ''}
+                            role={CONST.ROLE.BUTTON}
                             // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
                             disabled={isDisabled || item.isDisabledCheckbox}
-                            isChecked={!!item.isSelected}
                             onPress={handleCheckboxPress}
-                            shouldStopMouseDownPropagation
-                            style={[item.cursorStyle, styles.p5, styles.mln4, styles.mhv5, styles.mrn1]}
-                            containerStyle={[StyleUtils.getMultiselectListStyles(!!item.isSelected, !!item.isDisabled), item.cursorStyle]}
                             testID={`TableListItemCheckbox-${item.text}`}
-                        />
+                            style={[styles.cursorUnset, StyleUtils.getCheckboxPressableStyle(), item.isDisabledCheckbox && styles.cursorDisabled, styles.mr3, item.cursorStyle]}
+                        >
+                            <View style={[StyleUtils.getCheckboxContainerStyle(20), StyleUtils.getMultiselectListStyles(!!item.isSelected, !!item.isDisabled), item.cursorStyle]}>
+                                {!!item.isSelected && (
+                                    <Icon
+                                        src={icons.Checkmark}
+                                        fill={theme.textLight}
+                                        height={14}
+                                        width={14}
+                                    />
+                                )}
+                            </View>
+                        </PressableWithFeedback>
                     )}
                     {!!item.accountID && (
                         <ReportActionAvatars
diff --git a/src/components/SelectionList/ListItem/types.ts b/src/components/SelectionList/ListItem/types.ts
index e0f52e208cd9..118eb407df00 100644
--- a/src/components/SelectionList/ListItem/types.ts
+++ b/src/components/SelectionList/ListItem/types.ts
@@ -29,9 +29,6 @@ type ListItem<K extends string | number = string> = {
     /** Alternate text to display */
     alternateText?: string | null;
 
-    /** Accessibility label for screen readers */
-    accessibilityLabel?: string;
-
     /** Key used internally by React */
     keyForList: K;
 
diff --git a/src/components/SelectionListWithSections/BaseListItem.tsx b/src/components/SelectionListWithSections/BaseListItem.tsx
index efd068359c06..ea490d7e6c3e 100644
--- a/src/components/SelectionListWithSections/BaseListItem.tsx
+++ b/src/components/SelectionListWithSections/BaseListItem.tsx
@@ -80,9 +80,6 @@ function BaseListItem<TItem extends ListItem>({
         return rightHandSideComponent;
     };
 
-    const defaultAccessibilityLabel = item.text === item.alternateText ? (item.text ?? '') : [item.text, item.alternateText].filter(Boolean).join(', ');
-    const accessibilityLabel = item.accessibilityLabel ?? defaultAccessibilityLabel;
-
     return (
         <OfflineWithFeedback
             onClose={() => onDismissError(item)}
@@ -110,7 +107,7 @@ function BaseListItem<TItem extends ListItem>({
                 }}
                 disabled={isDisabled && !item.isSelected}
                 interactive={item.isInteractive}
-                accessibilityLabel={accessibilityLabel}
+                accessibilityLabel={item.text ?? ''}
                 role={getButtonRole(true)}
                 isNested
                 hoverDimmingValue={1}
diff --git a/src/components/SelectionListWithSections/BaseSelectionListWithSections.tsx b/src/components/SelectionListWithSections/BaseSelectionListWithSections.tsx
index 24020a1e7988..cb49ef3ac3f5 100644
--- a/src/components/SelectionListWithSections/BaseSelectionListWithSections.tsx
+++ b/src/components/SelectionListWithSections/BaseSelectionListWithSections.tsx
@@ -104,7 +104,6 @@ function BaseSelectionListWithSections<TItem extends ListItem>({
     includeSafeAreaPaddingBottom = true,
     shouldTextInputInterceptSwipe = false,
     listHeaderContent,
-    showSectionTitleWithListHeaderContent = false,
     onEndReached,
     onEndReachedThreshold,
     windowSize = 5,
@@ -594,7 +593,7 @@ function BaseSelectionListWithSections<TItem extends ListItem>({
             return <section.CustomSectionHeader section={section} />;
         }
 
-        if (!section.title || isEmptyObject(section.data) || (!showSectionTitleWithListHeaderContent && listHeaderContent)) {
+        if (!section.title || isEmptyObject(section.data) || listHeaderContent) {
             return null;
         }
 
diff --git a/src/components/SelectionListWithSections/Search/CardListItemHeader.tsx b/src/components/SelectionListWithSections/Search/CardListItemHeader.tsx
index 00e68035562f..71406c829325 100644
--- a/src/components/SelectionListWithSections/Search/CardListItemHeader.tsx
+++ b/src/components/SelectionListWithSections/Search/CardListItemHeader.tsx
@@ -15,7 +15,7 @@ import {getDisplayNameOrDefault} from '@libs/PersonalDetailsUtils';
 import CONST from '@src/CONST';
 import type {CompanyCardFeed} from '@src/types/onyx/CardFeeds';
 import ExpandCollapseArrowButton from './ExpandCollapseArrowButton';
-import TextCell from './TextCell';
+import ExpensesCell from './ExpensesCell';
 import TotalCell from './TotalCell';
 
 type CardListItemHeaderProps<TItem extends ListItem> = {
@@ -98,7 +98,7 @@ function CardListItemHeader<TItem extends ListItem>({
                 key={CONST.SEARCH.TABLE_COLUMNS.GROUP_EXPENSES}
                 style={StyleUtils.getReportTableColumnStyles(CONST.SEARCH.TABLE_COLUMNS.EXPENSES)}
             >
-                <TextCell text={String(cardItem.count)} />
+                <ExpensesCell count={cardItem.count} />
             </View>
         ),
         [CONST.SEARCH.TABLE_COLUMNS.GROUP_TOTAL]: (
diff --git a/src/components/SelectionListWithSections/Search/ExpenseReportListItem.tsx b/src/components/SelectionListWithSections/Search/ExpenseReportListItem.tsx
index 5d7dbe67bb81..0a0859f50931 100644
--- a/src/components/SelectionListWithSections/Search/ExpenseReportListItem.tsx
+++ b/src/components/SelectionListWithSections/Search/ExpenseReportListItem.tsx
@@ -41,31 +41,26 @@ function ExpenseReportListItem<TItem extends ListItem>({
     const theme = useTheme();
     const {translate} = useLocalize();
     const {isLargeScreenWidth} = useResponsiveLayout();
-    const {currentSearchHash, currentSearchKey, currentSearchResults} = useSearchContext();
+    const {currentSearchHash, currentSearchKey} = useSearchContext();
     const [lastPaymentMethod] = useOnyx(ONYXKEYS.NVP_LAST_PAYMENT_METHOD, {canBeMissing: true});
     const [personalPolicyID] = useOnyx(ONYXKEYS.PERSONAL_POLICY_ID, {canBeMissing: true});
+    const [snapshot] = useOnyx(`${ONYXKEYS.COLLECTION.SNAPSHOT}${currentSearchHash}`, {canBeMissing: true});
     const [isActionLoading] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT_METADATA}${reportItem.reportID}`, {canBeMissing: true, selector: isActionLoadingSelector});
     const expensifyIcons = useMemoizedLazyExpensifyIcons(['DotIndicator']);
 
-    const searchData = currentSearchResults?.data;
+    const snapshotData = snapshot?.data;
 
     const snapshotReport = useMemo(() => {
-        return (searchData?.[`${ONYXKEYS.COLLECTION.REPORT}${reportItem.reportID}`] ?? {}) as Report;
-    }, [searchData, reportItem.reportID]);
+        return (snapshotData?.[`${ONYXKEYS.COLLECTION.REPORT}${reportItem.reportID}`] ?? {}) as Report;
+    }, [snapshotData, reportItem.reportID]);
 
     const snapshotPolicy = useMemo(() => {
-        return (searchData?.[`${ONYXKEYS.COLLECTION.POLICY}${reportItem.policyID}`] ?? {}) as Policy;
-    }, [searchData, reportItem.policyID]);
-
-    const reportActions = useMemo(() => {
-        const actionsData = searchData?.[`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${reportItem.reportID}`];
-        return actionsData ? Object.values(actionsData) : [];
-    }, [searchData, reportItem.reportID]);
+        return (snapshotData?.[`${ONYXKEYS.COLLECTION.POLICY}${reportItem.policyID}`] ?? {}) as Policy;
+    }, [snapshotData, reportItem.policyID]);
 
     const isDisabledCheckbox = useMemo(() => {
-        const isEmpty = reportItem.transactions.length === 0;
-        return isEmpty ?? reportItem.isDisabled ?? reportItem.isDisabledCheckbox;
-    }, [reportItem.isDisabled, reportItem.isDisabledCheckbox, reportItem.transactions.length]);
+        return reportItem.isDisabled ?? reportItem.isDisabledCheckbox;
+    }, [reportItem.isDisabled, reportItem.isDisabledCheckbox]);
 
     const {isDelegateAccessRestricted, showDelegateNoAccessModal} = useContext(DelegateNoAccessContext);
 
@@ -187,10 +182,10 @@ function ExpenseReportListItem<TItem extends ListItem>({
             {(hovered) => (
                 <View style={[styles.flex1]}>
                     <ExpenseReportListItemRow
+                        hash={currentSearchHash}
                         item={reportItem}
                         columns={columns}
                         policy={snapshotPolicy}
-                        reportActions={reportActions}
                         isActionLoading={isActionLoading ?? isLoading}
                         showTooltip={showTooltip}
                         canSelectMultiple={canSelectMultiple}
diff --git a/src/components/SelectionListWithSections/Search/ExpenseReportListItemRow.tsx b/src/components/SelectionListWithSections/Search/ExpenseReportListItemRow.tsx
index adac6124d0e4..5435fe69448a 100644
--- a/src/components/SelectionListWithSections/Search/ExpenseReportListItemRow.tsx
+++ b/src/components/SelectionListWithSections/Search/ExpenseReportListItemRow.tsx
@@ -16,7 +16,7 @@ import getBase62ReportID from '@libs/getBase62ReportID';
 import {getMoneyRequestSpendBreakdown} from '@libs/ReportUtils';
 import variables from '@styles/variables';
 import CONST from '@src/CONST';
-import type {Policy, ReportAction} from '@src/types/onyx';
+import type {Policy} from '@src/types/onyx';
 import ActionCell from './ActionCell';
 import DateCell from './DateCell';
 import ExportedIconCell from './ExportedIconCell';
@@ -28,9 +28,9 @@ import UserInfoCell from './UserInfoCell';
 import WorkspaceCell from './WorkspaceCell';
 
 type ExpenseReportListItemRowProps = {
+    hash: number;
     item: ExpenseReportListItemType;
     policy?: Policy;
-    reportActions?: ReportAction[];
     showTooltip: boolean;
     canSelectMultiple?: boolean;
     isActionLoading?: boolean;
@@ -46,9 +46,9 @@ type ExpenseReportListItemRowProps = {
 };
 
 function ExpenseReportListItemRow({
+    hash,
     item,
     policy,
-    reportActions,
     onCheckboxPress = () => {},
     onButtonPress = () => {},
     isActionLoading,
@@ -182,7 +182,10 @@ function ExpenseReportListItemRow({
         ),
         [CONST.SEARCH.TABLE_COLUMNS.EXPORTED_TO]: (
             <View style={[StyleUtils.getReportTableColumnStyles(CONST.SEARCH.TABLE_COLUMNS.EXPORTED_TO)]}>
-                <ExportedIconCell reportActions={reportActions} />
+                <ExportedIconCell
+                    reportID={item.reportID}
+                    hash={hash}
+                />
             </View>
         ),
         [CONST.SEARCH.TABLE_COLUMNS.ACTION]: (
diff --git a/src/components/SelectionListWithSections/Search/ExpensesCell.tsx b/src/components/SelectionListWithSections/Search/ExpensesCell.tsx
new file mode 100644
index 000000000000..f030e1070124
--- /dev/null
+++ b/src/components/SelectionListWithSections/Search/ExpensesCell.tsx
@@ -0,0 +1,25 @@
+import React from 'react';
+import TextWithTooltip from '@components/TextWithTooltip';
+import useThemeStyles from '@hooks/useThemeStyles';
+
+type ExpensesDataCellProps = {
+    count: number;
+
+    shouldShowTooltip?: boolean;
+};
+
+function ExpensesDataCell({count, shouldShowTooltip = true}: ExpensesDataCellProps) {
+    const styles = useThemeStyles();
+
+    return (
+        <TextWithTooltip
+            shouldShowTooltip={shouldShowTooltip}
+            text={String(count)}
+            style={[styles.optionDisplayName, styles.lineHeightLarge, styles.pre]}
+        />
+    );
+}
+
+ExpensesDataCell.displayName = 'ExpensesDataCell';
+
+export default ExpensesDataCell;
diff --git a/src/components/SelectionListWithSections/Search/ExportedIconCell.tsx b/src/components/SelectionListWithSections/Search/ExportedIconCell.tsx
index 559ec617a5c2..7e9a49c8f5e0 100644
--- a/src/components/SelectionListWithSections/Search/ExportedIconCell.tsx
+++ b/src/components/SelectionListWithSections/Search/ExportedIconCell.tsx
@@ -3,21 +3,38 @@ import {View} from 'react-native';
 import Avatar from '@components/Avatar';
 import Icon from '@components/Icon';
 import {useMemoizedLazyExpensifyIcons} from '@hooks/useLazyAsset';
+import useOnyx from '@hooks/useOnyx';
 import useTheme from '@hooks/useTheme';
 import useThemeStyles from '@hooks/useThemeStyles';
 import {getOriginalMessage, isExportedToIntegrationAction} from '@libs/ReportActionsUtils';
 import CONST from '@src/CONST';
+import ONYXKEYS from '@src/ONYXKEYS';
 import type {ReportAction} from '@src/types/onyx';
 
 type ExportedIconCellProps = {
-    reportActions?: ReportAction[];
+    reportID?: string;
+    hash?: number;
 };
 
-function ExportedIconCell({reportActions}: ExportedIconCellProps) {
+function ExportedIconCell({reportID, hash}: ExportedIconCellProps) {
     const theme = useTheme();
     const styles = useThemeStyles();
 
-    const actions = reportActions ?? [];
+    // We need to subscribe directly to the snapshot to get the report actions because this can be rendered in either a group
+    // list (which has a separate hash than the current top-level search query) or in the top-level search query.
+    // This selector is specific to this edge-case (and thus is not in the selectors folder) and should be used in other places where the snapshot needs to be accessed
+    // eslint-disable-next-line rulesdir/no-inline-useOnyx-selector
+    const reportActions = useOnyx(`${ONYXKEYS.COLLECTION.SNAPSHOT}${hash}`, {
+        canBeMissing: true,
+        selector: (snapshot) => {
+            return Object.entries(snapshot?.data ?? {})
+                .filter(([key]) => key === `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${reportID}`)
+                .map(([, value]) => Object.values(value ?? {}) as ReportAction[])
+                .flat();
+        },
+    });
+
+    const actions = Object.values(reportActions[0] ?? {});
     const icons = useMemoizedLazyExpensifyIcons(['NetSuiteSquare', 'XeroSquare', 'IntacctSquare', 'QBOSquare', 'Table', 'ZenefitsSquare', 'BillComSquare', 'CertiniaSquare']);
 
     let isExportedToCsv = false;
diff --git a/src/components/SelectionListWithSections/Search/MemberListItemHeader.tsx b/src/components/SelectionListWithSections/Search/MemberListItemHeader.tsx
index 8827f31ae807..005c7721a33b 100644
--- a/src/components/SelectionListWithSections/Search/MemberListItemHeader.tsx
+++ b/src/components/SelectionListWithSections/Search/MemberListItemHeader.tsx
@@ -13,7 +13,7 @@ import useThemeStyles from '@hooks/useThemeStyles';
 import {getDisplayNameOrDefault} from '@libs/PersonalDetailsUtils';
 import CONST from '@src/CONST';
 import ExpandCollapseArrowButton from './ExpandCollapseArrowButton';
-import TextCell from './TextCell';
+import ExpensesCell from './ExpensesCell';
 import TotalCell from './TotalCell';
 
 type MemberListItemHeaderProps<TItem extends ListItem> = {
@@ -86,7 +86,7 @@ function MemberListItemHeader<TItem extends ListItem>({
                 key={CONST.SEARCH.TABLE_COLUMNS.GROUP_EXPENSES}
                 style={StyleUtils.getReportTableColumnStyles(CONST.SEARCH.TABLE_COLUMNS.EXPENSES)}
             >
-                <TextCell text={String(memberItem.count)} />
+                <ExpensesCell count={memberItem.count} />
             </View>
         ),
         [CONST.SEARCH.TABLE_COLUMNS.GROUP_TOTAL]: (
diff --git a/src/components/SelectionListWithSections/Search/ReportListItemHeader.tsx b/src/components/SelectionListWithSections/Search/ReportListItemHeader.tsx
index 9119f45c9a21..e013f656fe85 100644
--- a/src/components/SelectionListWithSections/Search/ReportListItemHeader.tsx
+++ b/src/components/SelectionListWithSections/Search/ReportListItemHeader.tsx
@@ -211,12 +211,13 @@ function ReportListItemHeader<TItem extends ListItem>({
     const StyleUtils = useStyleUtils();
     const styles = useThemeStyles();
     const theme = useTheme();
-    const {currentSearchHash, currentSearchKey, currentSearchResults: snapshot} = useSearchContext();
+    const {currentSearchHash, currentSearchKey} = useSearchContext();
     const {isLargeScreenWidth, shouldUseNarrowLayout} = useResponsiveLayout();
     const [lastPaymentMethod] = useOnyx(ONYXKEYS.NVP_LAST_PAYMENT_METHOD, {canBeMissing: true});
     const [personalPolicyID] = useOnyx(ONYXKEYS.PERSONAL_POLICY_ID, {canBeMissing: true});
     const thereIsFromAndTo = !!reportItem?.from && !!reportItem?.to;
     const showUserInfo = (reportItem.type === CONST.REPORT.TYPE.IOU && thereIsFromAndTo) || (reportItem.type === CONST.REPORT.TYPE.EXPENSE && !!reportItem?.from);
+    const [snapshot] = useOnyx(`${ONYXKEYS.COLLECTION.SNAPSHOT}${currentSearchHash}`, {canBeMissing: true});
     const snapshotReport = useMemo(() => {
         return (snapshot?.data?.[`${ONYXKEYS.COLLECTION.REPORT}${reportItem.reportID}`] ?? {}) as Report;
     }, [snapshot, reportItem.reportID]);
diff --git a/src/components/SelectionListWithSections/Search/TransactionGroupListExpanded.tsx b/src/components/SelectionListWithSections/Search/TransactionGroupListExpanded.tsx
index 874021d576e2..58fadb2469f4 100644
--- a/src/components/SelectionListWithSections/Search/TransactionGroupListExpanded.tsx
+++ b/src/components/SelectionListWithSections/Search/TransactionGroupListExpanded.tsx
@@ -1,4 +1,4 @@
-import React, {useContext} from 'react';
+import React, {useCallback, useContext, useMemo} from 'react';
 import {View} from 'react-native';
 import ActivityIndicator from '@components/ActivityIndicator';
 import Button from '@components/Button';
@@ -56,22 +56,33 @@ function TransactionGroupListExpanded<TItem extends ListItem>({
     const [isMobileSelectionModeEnabled] = useOnyx(ONYXKEYS.MOBILE_SELECTION_MODE, {canBeMissing: true});
     const [visibleColumns] = useOnyx(ONYXKEYS.FORMS.SEARCH_ADVANCED_FILTERS_FORM, {canBeMissing: true, selector: columnsSelector});
 
-    const transactionsSnapshotMetadata = transactionsSnapshot?.search;
+    const transactionsSnapshotMetadata = useMemo(() => {
+        return transactionsSnapshot?.search;
+    }, [transactionsSnapshot?.search]);
 
-    const visibleTransactions = isExpenseReportType ? transactions.slice(0, transactionsVisibleLimit) : transactions;
+    const visibleTransactions = useMemo(() => {
+        if (isExpenseReportType) {
+            return transactions.slice(0, transactionsVisibleLimit);
+        }
+        return transactions;
+    }, [transactions, transactionsVisibleLimit, isExpenseReportType]);
 
-    const isLastTransaction = (index: number) => {
-        return index === visibleTransactions.length - 1;
-    };
+    const isLastTransaction = useCallback(
+        (index: number) => {
+            return index === visibleTransactions.length - 1;
+        },
+        [visibleTransactions.length],
+    );
 
-    let currentColumns = columns ?? [];
-    if (!isExpenseReportType) {
+    const currentColumns = useMemo(() => {
+        if (isExpenseReportType) {
+            return columns ?? [];
+        }
         if (!transactionsSnapshot?.data) {
-            currentColumns = [];
-        } else {
-            currentColumns = getColumnsToShow(accountID, transactionsSnapshot?.data, visibleColumns, false, transactionsSnapshot?.search.type);
+            return [];
         }
-    }
+        return getColumnsToShow(accountID, transactionsSnapshot?.data, visibleColumns, false, transactionsSnapshot?.search.type);
+    }, [accountID, columns, isExpenseReportType, transactionsSnapshot?.data, transactionsSnapshot?.search.type, visibleColumns]);
 
     // Currently only the transaction report groups have transactions where the empty view makes sense
     const shouldDisplayShowMoreButton = isExpenseReportType ? transactions.length > transactionsVisibleLimit : !!transactionsSnapshotMetadata?.hasMoreResults && !isOffline;
@@ -80,12 +91,16 @@ function TransactionGroupListExpanded<TItem extends ListItem>({
     const shouldDisplayLoadingIndicator = !isExpenseReportType && !!transactionsSnapshotMetadata?.isLoading && shouldShowLoadingOnSearch;
     const {isLargeScreenWidth} = useResponsiveLayout();
 
-    const isAmountColumnWide = transactions.some((transaction) => transaction.isAmountColumnWide);
-    const isTaxAmountColumnWide = transactions.some((transaction) => transaction.isTaxAmountColumnWide);
-    const shouldShowYearForSomeTransaction = transactions.some((transaction) => transaction.shouldShowYear);
-    const amountColumnSize = isAmountColumnWide ? CONST.SEARCH.TABLE_COLUMN_SIZES.WIDE : CONST.SEARCH.TABLE_COLUMN_SIZES.NORMAL;
-    const taxAmountColumnSize = isTaxAmountColumnWide ? CONST.SEARCH.TABLE_COLUMN_SIZES.WIDE : CONST.SEARCH.TABLE_COLUMN_SIZES.NORMAL;
-    const dateColumnSize = shouldShowYearForSomeTransaction ? CONST.SEARCH.TABLE_COLUMN_SIZES.WIDE : CONST.SEARCH.TABLE_COLUMN_SIZES.NORMAL;
+    const {amountColumnSize, dateColumnSize, taxAmountColumnSize} = useMemo(() => {
+        const isAmountColumnWide = transactions.some((transaction) => transaction.isAmountColumnWide);
+        const isTaxAmountColumnWide = transactions.some((transaction) => transaction.isTaxAmountColumnWide);
+        const shouldShowYearForSomeTransaction = transactions.some((transaction) => transaction.shouldShowYear);
+        return {
+            amountColumnSize: isAmountColumnWide ? CONST.SEARCH.TABLE_COLUMN_SIZES.WIDE : CONST.SEARCH.TABLE_COLUMN_SIZES.NORMAL,
+            taxAmountColumnSize: isTaxAmountColumnWide ? CONST.SEARCH.TABLE_COLUMN_SIZES.WIDE : CONST.SEARCH.TABLE_COLUMN_SIZES.NORMAL,
+            dateColumnSize: shouldShowYearForSomeTransaction ? CONST.SEARCH.TABLE_COLUMN_SIZES.WIDE : CONST.SEARCH.TABLE_COLUMN_SIZES.NORMAL,
+        };
+    }, [transactions]);
 
     const {markReportIDAsExpense} = useContext(WideRHPContext);
     const openReportInRHP = (transactionItem: TransactionListItemType) => {
@@ -119,13 +134,13 @@ function TransactionGroupListExpanded<TItem extends ListItem>({
         });
     };
 
-    const onShowMoreButtonPress = () => {
+    const onShowMoreButtonPress = useCallback(() => {
         if (isExpenseReportType) {
             setTransactionsVisibleLimit((currentPageSize) => currentPageSize + CONST.TRANSACTION.RESULTS_PAGE_SIZE);
         } else if (!isOffline && transactionsQueryJSON) {
             searchTransactions(CONST.SEARCH.RESULTS_PAGE_SIZE);
         }
-    };
+    }, [isExpenseReportType, isOffline, transactionsQueryJSON, setTransactionsVisibleLimit, searchTransactions]);
 
     if (shouldDisplayEmptyView) {
         return (
@@ -173,10 +188,9 @@ function TransactionGroupListExpanded<TItem extends ListItem>({
             )}
             {visibleTransactions.map((transaction, index) => {
                 const shouldShowBottomBorder = !isLastTransaction(index) && !isLargeScreenWidth;
-                const exportedReportActions = Object.values(transactionsSnapshot?.data?.[`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${transaction?.reportID}`] ?? {});
-
                 const transactionRow = (
                     <TransactionItemRow
+                        hash={transactionsQueryJSON?.hash}
                         report={transaction.report}
                         transactionItem={transaction}
                         violations={getTransactionViolations(transaction, violations, currentUserDetails.email ?? '', currentUserDetails.accountID, transaction.report, transaction.policy)}
@@ -198,7 +212,6 @@ function TransactionGroupListExpanded<TItem extends ListItem>({
                         shouldShowBottomBorder={shouldShowBottomBorder}
                         onArrowRightPress={() => openReportInRHP(transaction)}
                         shouldShowArrowRightOnNarrowLayout
-                        reportActions={exportedReportActions}
                     />
                 );
                 return (
diff --git a/src/components/SelectionListWithSections/Search/TransactionGroupListItem.tsx b/src/components/SelectionListWithSections/Search/TransactionGroupListItem.tsx
index bf5d45394495..c369b094c74b 100644
--- a/src/components/SelectionListWithSections/Search/TransactionGroupListItem.tsx
+++ b/src/components/SelectionListWithSections/Search/TransactionGroupListItem.tsx
@@ -145,10 +145,14 @@ function TransactionGroupListItem<TItem extends ListItem>({
         return transactions.filter((transaction) => transaction.pendingAction !== CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE);
     }, [transactions]);
 
-    const isSelectAllChecked = selectedItemsLength === transactions.length && transactions.length > 0;
+    const isEmpty = transactions.length === 0;
+
+    const isEmptyReportSelected = isEmpty && item?.keyForList && selectedTransactions[item.keyForList]?.isSelected;
+    // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
+    const isSelectAllChecked = isEmptyReportSelected || (selectedItemsLength === transactionsWithoutPendingDelete.length && transactionsWithoutPendingDelete.length > 0);
+
     const isIndeterminate = selectedItemsLength > 0 && selectedItemsLength !== transactionsWithoutPendingDelete.length;
 
-    const isEmpty = transactions.length === 0;
     // Currently only the transaction report groups have transactions where the empty view makes sense
     const shouldDisplayEmptyView = isEmpty && isExpenseReportType;
     const isDisabledOrEmpty = isEmpty || isDisabled;
@@ -208,11 +212,8 @@ function TransactionGroupListItem<TItem extends ListItem>({
     }, [isExpenseReportType, transactions.length, onSelectRow, transactionPreviewData, item, handleToggle]);
 
     const onLongPress = useCallback(() => {
-        if (isEmpty) {
-            return;
-        }
         onLongPressRow?.(item, isExpenseReportType ? undefined : transactions);
-    }, [isEmpty, isExpenseReportType, item, onLongPressRow, transactions]);
+    }, [isExpenseReportType, item, onLongPressRow, transactions]);
 
     const onExpandedRowLongPress = useCallback(
         (transaction: TransactionListItemType) => {
@@ -288,7 +289,7 @@ function TransactionGroupListItem<TItem extends ListItem>({
                         report={groupItem as TransactionReportGroupListItemType}
                         onSelectRow={(listItem) => onSelectRow(listItem, transactionPreviewData)}
                         onCheckboxPress={onCheckboxPress}
-                        isDisabled={isDisabledOrEmpty}
+                        isDisabled={isDisabled}
                         isFocused={isFocused}
                         canSelectMultiple={canSelectMultiple}
                         isSelectAllChecked={isSelectAllChecked}
@@ -323,6 +324,9 @@ function TransactionGroupListItem<TItem extends ListItem>({
             onExpandIconPress,
             isFocused,
             searchType,
+            groupBy,
+            isDisabled,
+            onDEWModalOpen,
             onSelectRow,
             transactionPreviewData,
         ],
diff --git a/src/components/SelectionListWithSections/Search/TransactionListItem.tsx b/src/components/SelectionListWithSections/Search/TransactionListItem.tsx
index 21331dd7d5cf..761b2fd5747a 100644
--- a/src/components/SelectionListWithSections/Search/TransactionListItem.tsx
+++ b/src/components/SelectionListWithSections/Search/TransactionListItem.tsx
@@ -1,4 +1,4 @@
-import React, {useContext, useRef} from 'react';
+import React, {useCallback, useContext, useMemo, useRef} from 'react';
 import type {View} from 'react-native';
 import type {OnyxEntry} from 'react-native-onyx';
 // Use the original useOnyx hook to get the real-time data from Onyx and not from the snapshot
@@ -21,7 +21,6 @@ import useTheme from '@hooks/useTheme';
 import useThemeStyles from '@hooks/useThemeStyles';
 import type {TransactionPreviewData} from '@libs/actions/Search';
 import {handleActionButtonPress as handleActionButtonPressUtil} from '@libs/actions/Search';
-import {syncMissingAttendeesViolation} from '@libs/AttendeeUtils';
 import getNonEmptyStringOnyxID from '@libs/getNonEmptyStringOnyxID';
 import {isViolationDismissed, mergeProhibitedViolations, shouldShowViolation} from '@libs/TransactionUtils';
 import variables from '@styles/variables';
@@ -30,6 +29,7 @@ import ONYXKEYS from '@src/ONYXKEYS';
 import {isActionLoadingSelector} from '@src/selectors/ReportMetaData';
 import type {Policy, Report, ReportAction, ReportActions} from '@src/types/onyx';
 import type {TransactionViolation} from '@src/types/onyx/TransactionViolation';
+import {isEmptyObject} from '@src/types/utils/EmptyObject';
 import UserInfoAndActionButtonRow from './UserInfoAndActionButtonRow';
 
 function TransactionListItem<TItem extends ListItem>({
@@ -55,50 +55,38 @@ function TransactionListItem<TItem extends ListItem>({
     const theme = useTheme();
 
     const {isLargeScreenWidth, shouldUseNarrowLayout} = useResponsiveLayout();
-    const {currentSearchHash, currentSearchKey, currentSearchResults} = useSearchContext();
-    const snapshotReport = (currentSearchResults?.data?.[`${ONYXKEYS.COLLECTION.REPORT}${transactionItem.reportID}`] ?? {}) as Report;
+    const {currentSearchHash, currentSearchKey} = useSearchContext();
+    const [snapshot] = useOnyx(`${ONYXKEYS.COLLECTION.SNAPSHOT}${currentSearchHash}`, {canBeMissing: true});
+    const snapshotReport = useMemo(() => {
+        return (snapshot?.data?.[`${ONYXKEYS.COLLECTION.REPORT}${transactionItem.reportID}`] ?? {}) as Report;
+    }, [snapshot, transactionItem.reportID]);
 
     const [isActionLoading] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT_METADATA}${transactionItem.reportID}`, {canBeMissing: true, selector: isActionLoadingSelector});
 
-    // Use active policy (user's current workspace) as fallback for self DM tracking expenses
-    // This matches MoneyRequestView's approach via usePolicyForMovingExpenses()
-    const [activePolicyID] = useOnyx(ONYXKEYS.NVP_ACTIVE_POLICY_ID, {canBeMissing: true});
-
-    // Use report's policyID as fallback when transaction doesn't have policyID directly
-    // Use active policy as final fallback for SelfDM (tracking expenses)
-    // NOTE: Using || instead of ?? to treat empty string "" as falsy
-    // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
-    const policyID = transactionItem.policyID || snapshotReport?.policyID || activePolicyID;
-    const [parentPolicy] = originalUseOnyx(ONYXKEYS.COLLECTION.POLICY, {
-        canBeMissing: true,
-        selector: (policy) => policy?.[`${ONYXKEYS.COLLECTION.POLICY}${policyID}`],
-    });
-    const snapshotPolicy = (currentSearchResults?.data?.[`${ONYXKEYS.COLLECTION.POLICY}${transactionItem.policyID}`] ?? {}) as Policy;
-
-    const actionsData = currentSearchResults?.data?.[`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${transactionItem.reportID}`];
-    const exportedReportActions = actionsData ? Object.values(actionsData) : [];
-
-    // Fetch policy categories directly from Onyx since they are not included in the search snapshot
-    const [policyCategories] = originalUseOnyx(`${ONYXKEYS.COLLECTION.POLICY_CATEGORIES}${getNonEmptyStringOnyxID(policyID)}`, {canBeMissing: true});
+    const snapshotPolicy = useMemo(() => {
+        return (snapshot?.data?.[`${ONYXKEYS.COLLECTION.POLICY}${transactionItem.policyID}`] ?? {}) as Policy;
+    }, [snapshot, transactionItem.policyID]);
     const [lastPaymentMethod] = useOnyx(`${ONYXKEYS.NVP_LAST_PAYMENT_METHOD}`, {canBeMissing: true});
     const [personalPolicyID] = useOnyx(ONYXKEYS.PERSONAL_POLICY_ID, {canBeMissing: true});
 
     const [parentReport] = originalUseOnyx(`${ONYXKEYS.COLLECTION.REPORT}${getNonEmptyStringOnyxID(transactionItem.reportID)}`, {canBeMissing: true});
+    const [parentPolicy] = originalUseOnyx(`${ONYXKEYS.COLLECTION.POLICY}${getNonEmptyStringOnyxID(transactionItem.policyID)}`, {canBeMissing: true});
     const [transactionThreadReport] = originalUseOnyx(`${ONYXKEYS.COLLECTION.REPORT}${transactionItem?.reportAction?.childReportID}`, {canBeMissing: true});
     const [transaction] = originalUseOnyx(`${ONYXKEYS.COLLECTION.TRANSACTION}${getNonEmptyStringOnyxID(transactionItem.transactionID)}`, {canBeMissing: true});
-    const parentReportActionSelector = (reportActions: OnyxEntry<ReportActions>): OnyxEntry<ReportAction> => reportActions?.[`${transactionItem?.reportAction?.reportActionID}`];
+    const parentReportActionSelector = useCallback(
+        (reportActions: OnyxEntry<ReportActions>): OnyxEntry<ReportAction> => reportActions?.[`${transactionItem?.reportAction?.reportActionID}`],
+        [transactionItem?.reportAction?.reportActionID],
+    );
     const [parentReportAction] = originalUseOnyx(
         `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${getNonEmptyStringOnyxID(transactionItem.reportID)}`,
         {selector: parentReportActionSelector, canBeMissing: true},
         [transactionItem],
     );
     const currentUserDetails = useCurrentUserPersonalDetails();
-    const transactionPreviewData: TransactionPreviewData = {
-        hasParentReport: !!parentReport,
-        hasTransaction: !!transaction,
-        hasParentReportAction: !!parentReportAction,
-        hasTransactionThreadReport: !!transactionThreadReport,
-    };
+    const transactionPreviewData: TransactionPreviewData = useMemo(
+        () => ({hasParentReport: !!parentReport, hasTransaction: !!transaction, hasParentReportAction: !!parentReportAction, hasTransactionThreadReport: !!transactionThreadReport}),
+        [parentReport, transaction, parentReportAction, transactionThreadReport],
+    );
 
     const pressableStyle = [
         styles.transactionListItemStyle,
@@ -114,44 +102,44 @@ function TransactionListItem<TItem extends ListItem>({
         backgroundColor: theme.highlightBG,
     });
 
-    const amountColumnSize = transactionItem.isAmountColumnWide ? CONST.SEARCH.TABLE_COLUMN_SIZES.WIDE : CONST.SEARCH.TABLE_COLUMN_SIZES.NORMAL;
-    const taxAmountColumnSize = transactionItem.isTaxAmountColumnWide ? CONST.SEARCH.TABLE_COLUMN_SIZES.WIDE : CONST.SEARCH.TABLE_COLUMN_SIZES.NORMAL;
-    const dateColumnSize = transactionItem.shouldShowYear ? CONST.SEARCH.TABLE_COLUMN_SIZES.WIDE : CONST.SEARCH.TABLE_COLUMN_SIZES.NORMAL;
-    const submittedColumnSize = transactionItem.shouldShowYearSubmitted ? CONST.SEARCH.TABLE_COLUMN_SIZES.WIDE : CONST.SEARCH.TABLE_COLUMN_SIZES.NORMAL;
-    const approvedColumnSize = transactionItem.shouldShowYearApproved ? CONST.SEARCH.TABLE_COLUMN_SIZES.WIDE : CONST.SEARCH.TABLE_COLUMN_SIZES.NORMAL;
-    const postedColumnSize = transactionItem.shouldShowYearPosted ? CONST.SEARCH.TABLE_COLUMN_SIZES.WIDE : CONST.SEARCH.TABLE_COLUMN_SIZES.NORMAL;
-    const exportedColumnSize = transactionItem.shouldShowYearExported ? CONST.SEARCH.TABLE_COLUMN_SIZES.WIDE : CONST.SEARCH.TABLE_COLUMN_SIZES.NORMAL;
-
-    // Prefer live Onyx policy data over snapshot to ensure fresh policy settings
-    // like isAttendeeTrackingEnabled is not missing
-    // Use snapshotReport/snapshotPolicy as fallbacks to fix offline issues where
-    // newly created reports aren't in the search snapshot yet
-    const policyForViolations = parentPolicy ?? snapshotPolicy;
-    const reportForViolations = parentReport ?? snapshotReport;
-
-    const onyxViolations = (violations?.[`${ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS}${transactionItem.transactionID}`] ?? []).filter(
-        (violation: TransactionViolation) =>
-            !isViolationDismissed(transactionItem, violation, currentUserDetails.email ?? '', currentUserDetails.accountID, reportForViolations, policyForViolations) &&
-            shouldShowViolation(reportForViolations, policyForViolations, violation.name, currentUserDetails.email ?? '', false, transactionItem),
-    );
-
-    // Sync missingAttendees violation with current policy category settings (can be removed later when BE handles this)
-    // Use live transaction data (attendees, category) to ensure we check against current state, not stale snapshot
-    const attendeeOnyxViolations = syncMissingAttendeesViolation(
-        onyxViolations,
-        policyCategories,
-        transaction?.category ?? transactionItem.category ?? '',
-        transaction?.comment?.attendees ?? transactionItem.attendees,
-        currentUserDetails,
-        policyForViolations?.isAttendeeTrackingEnabled ?? false,
-        policyForViolations?.type === CONST.POLICY.TYPE.CORPORATE,
-    );
-
-    const transactionViolations = mergeProhibitedViolations(attendeeOnyxViolations);
+    const {amountColumnSize, dateColumnSize, taxAmountColumnSize, submittedColumnSize, approvedColumnSize, postedColumnSize, exportedColumnSize} = useMemo(() => {
+        return {
+            amountColumnSize: transactionItem.isAmountColumnWide ? CONST.SEARCH.TABLE_COLUMN_SIZES.WIDE : CONST.SEARCH.TABLE_COLUMN_SIZES.NORMAL,
+            taxAmountColumnSize: transactionItem.isTaxAmountColumnWide ? CONST.SEARCH.TABLE_COLUMN_SIZES.WIDE : CONST.SEARCH.TABLE_COLUMN_SIZES.NORMAL,
+            dateColumnSize: transactionItem.shouldShowYear ? CONST.SEARCH.TABLE_COLUMN_SIZES.WIDE : CONST.SEARCH.TABLE_COLUMN_SIZES.NORMAL,
+            submittedColumnSize: transactionItem.shouldShowYearSubmitted ? CONST.SEARCH.TABLE_COLUMN_SIZES.WIDE : CONST.SEARCH.TABLE_COLUMN_SIZES.NORMAL,
+            approvedColumnSize: transactionItem.shouldShowYearApproved ? CONST.SEARCH.TABLE_COLUMN_SIZES.WIDE : CONST.SEARCH.TABLE_COLUMN_SIZES.NORMAL,
+            postedColumnSize: transactionItem.shouldShowYearPosted ? CONST.SEARCH.TABLE_COLUMN_SIZES.WIDE : CONST.SEARCH.TABLE_COLUMN_SIZES.NORMAL,
+            exportedColumnSize: transactionItem.shouldShowYearExported ? CONST.SEARCH.TABLE_COLUMN_SIZES.WIDE : CONST.SEARCH.TABLE_COLUMN_SIZES.NORMAL,
+        };
+    }, [
+        transactionItem.isAmountColumnWide,
+        transactionItem.isTaxAmountColumnWide,
+        transactionItem.shouldShowYear,
+        transactionItem.shouldShowYearSubmitted,
+        transactionItem.shouldShowYearApproved,
+        transactionItem.shouldShowYearPosted,
+        transactionItem.shouldShowYearExported,
+    ]);
+
+    // Use parentReport/parentPolicy as fallbacks when snapshotReport/snapshotPolicy are empty
+    // to fix offline issues where newly created reports aren't in the search snapshot yet
+    const reportForViolations = isEmptyObject(snapshotReport) ? parentReport : snapshotReport;
+    const policyForViolations = isEmptyObject(snapshotPolicy) ? parentPolicy : snapshotPolicy;
+
+    const transactionViolations = useMemo(() => {
+        return mergeProhibitedViolations(
+            (violations?.[`${ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS}${transactionItem.transactionID}`] ?? []).filter(
+                (violation: TransactionViolation) =>
+                    !isViolationDismissed(transactionItem, violation, currentUserDetails.email ?? '', currentUserDetails.accountID, reportForViolations, policyForViolations) &&
+                    shouldShowViolation(reportForViolations, policyForViolations, violation.name, currentUserDetails.email ?? '', false, transactionItem),
+            ),
+        );
+    }, [policyForViolations, reportForViolations, transactionItem, violations, currentUserDetails.email, currentUserDetails.accountID]);
 
     const {isDelegateAccessRestricted, showDelegateNoAccessModal} = useContext(DelegateNoAccessContext);
 
-    const handleActionButtonPress = () => {
+    const handleActionButtonPress = useCallback(() => {
         handleActionButtonPressUtil({
             hash: currentSearchHash,
             item: transactionItem,
@@ -166,7 +154,34 @@ function TransactionListItem<TItem extends ListItem>({
             onDelegateAccessRestricted: showDelegateNoAccessModal,
             personalPolicyID,
         });
-    };
+    }, [
+        currentSearchHash,
+        transactionItem,
+        transactionPreviewData,
+        snapshotReport,
+        snapshotPolicy,
+        lastPaymentMethod,
+        personalPolicyID,
+        currentSearchKey,
+        onSelectRow,
+        item,
+        onDEWModalOpen,
+        isDEWBetaEnabled,
+        isDelegateAccessRestricted,
+        showDelegateNoAccessModal,
+    ]);
+
+    const handleCheckboxPress = useCallback(() => {
+        onCheckboxPress?.(item);
+    }, [item, onCheckboxPress]);
+
+    const onPress = useCallback(() => {
+        onSelectRow(item, transactionPreviewData);
+    }, [item, onSelectRow, transactionPreviewData]);
+
+    const onLongPress = useCallback(() => {
+        onLongPressRow?.(item);
+    }, [item, onLongPressRow]);
 
     const StyleUtils = useStyleUtils();
     const pressableRef = useRef<View>(null);
@@ -177,8 +192,8 @@ function TransactionListItem<TItem extends ListItem>({
         <OfflineWithFeedback pendingAction={item.pendingAction}>
             <PressableWithFeedback
                 ref={pressableRef}
-                onLongPress={() => onLongPressRow?.(item)}
-                onPress={() => onSelectRow(item, transactionPreviewData)}
+                onLongPress={onLongPress}
+                onPress={onPress}
                 disabled={isDisabled && !item.isSelected}
                 accessibilityLabel={item.text ?? ''}
                 role={getButtonRole(true)}
@@ -205,11 +220,12 @@ function TransactionListItem<TItem extends ListItem>({
                             />
                         )}
                         <TransactionItemRow
+                            hash={currentSearchHash}
                             transactionItem={transactionItem}
                             report={transactionItem.report}
                             shouldShowTooltip={showTooltip}
                             onButtonPress={handleActionButtonPress}
-                            onCheckboxPress={() => onCheckboxPress?.(item)}
+                            onCheckboxPress={handleCheckboxPress}
                             shouldUseNarrowLayout={!isLargeScreenWidth}
                             columns={columns}
                             isActionLoading={isLoading ?? isActionLoading}
@@ -224,10 +240,9 @@ function TransactionListItem<TItem extends ListItem>({
                             shouldShowCheckbox={!!canSelectMultiple}
                             style={[styles.p3, styles.pv2, shouldUseNarrowLayout ? styles.pt2 : {}]}
                             violations={transactionViolations}
-                            onArrowRightPress={() => onSelectRow(item, transactionPreviewData)}
+                            onArrowRightPress={onPress}
                             isHover={hovered}
                             customCardNames={customCardNames}
-                            reportActions={exportedReportActions}
                         />
                     </>
                 )}
diff --git a/src/components/SelectionListWithSections/Search/WithdrawalIDListItemHeader.tsx b/src/components/SelectionListWithSections/Search/WithdrawalIDListItemHeader.tsx
index 7ab5f4e94796..813db1b1c2f3 100644
--- a/src/components/SelectionListWithSections/Search/WithdrawalIDListItemHeader.tsx
+++ b/src/components/SelectionListWithSections/Search/WithdrawalIDListItemHeader.tsx
@@ -21,7 +21,7 @@ import variables from '@styles/variables';
 import CONST from '@src/CONST';
 import ROUTES from '@src/ROUTES';
 import ExpandCollapseArrowButton from './ExpandCollapseArrowButton';
-import TextCell from './TextCell';
+import ExpensesCell from './ExpensesCell';
 import TotalCell from './TotalCell';
 
 type WithdrawalIDListItemHeaderProps<TItem extends ListItem> = {
@@ -132,7 +132,7 @@ function WithdrawalIDListItemHeader<TItem extends ListItem>({
                 key={CONST.SEARCH.TABLE_COLUMNS.EXPENSES}
                 style={StyleUtils.getReportTableColumnStyles(CONST.SEARCH.TABLE_COLUMNS.EXPENSES)}
             >
-                <TextCell text={String(withdrawalIDItem.count)} />
+                <ExpensesCell count={withdrawalIDItem.count} />
             </View>
         ),
         [CONST.SEARCH.TABLE_COLUMNS.GROUP_TOTAL]: (
diff --git a/src/components/SelectionListWithSections/types.ts b/src/components/SelectionListWithSections/types.ts
index 15464aebe076..3a13e47e4fca 100644
--- a/src/components/SelectionListWithSections/types.ts
+++ b/src/components/SelectionListWithSections/types.ts
@@ -125,9 +125,6 @@ type ListItem<K extends string | number = string> = {
     /** Text to display */
     text?: string;
 
-    /** Text to be announced by screen reader */
-    accessibilityLabel?: string;
-
     /** Alternate text to display */
     alternateText?: string | null;
 
@@ -873,9 +870,6 @@ type SelectionListProps<TItem extends ListItem> = Partial<ChildrenProps> & {
     /** Custom content to display in the header of list component. */
     listHeaderContent?: React.JSX.Element | null;
 
-    /** By default, when `listHeaderContent` is passed, the section title will not be rendered. This flag allows the section title to still be rendered in certain cases. */
-    showSectionTitleWithListHeaderContent?: boolean;
-
     /** Custom content to display in the footer */
     footerContent?: ReactNode;
 
diff --git a/src/components/SettlementButton/index.tsx b/src/components/SettlementButton/index.tsx
index ab5ae68d523c..758f9b21335e 100644
--- a/src/components/SettlementButton/index.tsx
+++ b/src/components/SettlementButton/index.tsx
@@ -103,12 +103,11 @@ function SettlementButton({
     // The app would crash due to subscribing to the entire report collection if chatReportID is an empty string. So we should have a fallback ID here.
     // eslint-disable-next-line rulesdir/no-default-id-values
     const [chatReport] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${chatReportID || CONST.DEFAULT_NUMBER_ID}`, {canBeMissing: true});
-    const [conciergeReportID = ''] = useOnyx(ONYXKEYS.CONCIERGE_REPORT_ID, {canBeMissing: true});
     const [iouReportNextStep] = useOnyx(`${ONYXKEYS.COLLECTION.NEXT_STEP}${iouReport?.reportID}`, {canBeMissing: true});
 
     const [isUserValidated] = useOnyx(ONYXKEYS.ACCOUNT, {selector: isUserValidatedSelector, canBeMissing: true});
     const policyEmployeeAccountIDs = getPolicyEmployeeAccountIDs(policy, accountID);
-    const reportBelongsToWorkspace = policyID ? doesReportBelongToWorkspace(chatReport, policyEmployeeAccountIDs, policyID, conciergeReportID) : false;
+    const reportBelongsToWorkspace = policyID ? doesReportBelongToWorkspace(chatReport, policyEmployeeAccountIDs, policyID) : false;
     const policyIDKey = reportBelongsToWorkspace ? policyID : (iouReport?.policyID ?? CONST.POLICY.ID_FAKE);
     const [userWallet] = useOnyx(ONYXKEYS.USER_WALLET, {canBeMissing: true});
     const hasActivatedWallet = ([CONST.WALLET.TIER_NAME.GOLD, CONST.WALLET.TIER_NAME.PLATINUM] as string[]).includes(userWallet?.tierName ?? '');
diff --git a/src/components/SidePanel/HelpComponents/HelpContent.tsx b/src/components/SidePanel/HelpComponents/HelpContent.tsx
index 2d83cadef093..ddcfb78ebb94 100644
--- a/src/components/SidePanel/HelpComponents/HelpContent.tsx
+++ b/src/components/SidePanel/HelpComponents/HelpContent.tsx
@@ -53,7 +53,6 @@ function HelpContent({closeSidePanel}: HelpContentProps) {
     });
 
     const [report] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${params?.reportID || String(CONST.DEFAULT_NUMBER_ID)}`, {canBeMissing: true});
-    const [conciergeReportID = ''] = useOnyx(ONYXKEYS.CONCIERGE_REPORT_ID, {canBeMissing: true});
     const [reportActions] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${report?.reportID}`, {canBeMissing: true});
     const [chatReport] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${report?.parentReportID}`, {canBeMissing: true});
 
@@ -90,7 +89,7 @@ function HelpContent({closeSidePanel}: HelpContentProps) {
 
         const cleanedPath = path.replaceAll('?', '');
         const expenseType = getExpenseType(transaction);
-        const reportType = getHelpPaneReportType(report, conciergeReportID);
+        const reportType = getHelpPaneReportType(report);
 
         if (expenseType && reportType !== CONST.REPORT.HELP_TYPE.EXPENSE_REPORT) {
             return cleanedPath.replaceAll(':reportID', `:${CONST.REPORT.HELP_TYPE.EXPENSE}/:${expenseType}`);
@@ -101,7 +100,7 @@ function HelpContent({closeSidePanel}: HelpContentProps) {
         }
 
         return cleanedPath;
-    }, [routeName, transaction, report, conciergeReportID]);
+    }, [routeName, transaction, report]);
 
     const wasPreviousNarrowScreen = useRef(!isExtraLargeScreenWidth);
     useEffect(() => {
diff --git a/src/components/SidePanel/SidePanelModal/index.tsx b/src/components/SidePanel/SidePanelModal/index.tsx
index 60fb40444e7c..467da113af98 100644
--- a/src/components/SidePanel/SidePanelModal/index.tsx
+++ b/src/components/SidePanel/SidePanelModal/index.tsx
@@ -27,9 +27,8 @@ function SidePanelModal({children, sidePanelTranslateX, closeSidePanel, shouldHi
     const [isRHPVisible = false] = useOnyx(ONYXKEYS.MODAL, {selector: isRHPVisibleSelector, canBeMissing: true});
     const uniqueModalId = ComposerFocusManager.getId();
 
-    const {wideRHPRouteKeys, isWideRHPFocused, superWideRHPRouteKeys, isSuperWideRHPFocused} = useContext(WideRHPContext);
-
-    const shouldOverlayBeVisible = (!!wideRHPRouteKeys.length && isWideRHPFocused) || (!!superWideRHPRouteKeys.length && isSuperWideRHPFocused) || !isRHPVisible;
+    const {wideRHPRouteKeys, isWideRHPFocused} = useContext(WideRHPContext);
+    const isWideRHPVisible = !!wideRHPRouteKeys.length;
 
     const onCloseSidePanelOnSmallScreens = () => {
         if (isExtraLargeScreenWidth) {
@@ -66,7 +65,7 @@ function SidePanelModal({children, sidePanelTranslateX, closeSidePanel, shouldHi
                         {!shouldHideSidePanelBackdrop && (
                             <SidePanelOverlay
                                 onBackdropPress={closeSidePanel}
-                                shouldBeVisible={shouldOverlayBeVisible}
+                                shouldBeVisible={isWideRHPVisible ? isWideRHPFocused : !isRHPVisible}
                             />
                         )}
                     </View>
diff --git a/src/components/Skeletons/CardIconSkeleton.tsx b/src/components/Skeletons/CardIconSkeleton.tsx
deleted file mode 100644
index f84af6cd708d..000000000000
--- a/src/components/Skeletons/CardIconSkeleton.tsx
+++ /dev/null
@@ -1,33 +0,0 @@
-import React from 'react';
-import {Rect} from 'react-native-svg';
-import SkeletonViewContentLoader from '@components/SkeletonViewContentLoader';
-import useTheme from '@hooks/useTheme';
-import useSkeletonSpan from '@libs/telemetry/useSkeletonSpan';
-
-type CardIconSkeletonProps = {
-    width: number;
-    height: number;
-};
-
-function CardIconSkeleton({width, height}: CardIconSkeletonProps) {
-    const theme = useTheme();
-    useSkeletonSpan('CardIconSkeleton');
-
-    return (
-        <SkeletonViewContentLoader
-            animate
-            height={height}
-            width={width}
-            backgroundColor={theme.skeletonLHNIn}
-            foregroundColor={theme.skeletonLHNOut}
-        >
-            <Rect
-                width={width}
-                height={height}
-                rx="4"
-            />
-        </SkeletonViewContentLoader>
-    );
-}
-
-export default CardIconSkeleton;
diff --git a/src/components/Skeletons/TableRowSkeleton.tsx b/src/components/Skeletons/TableRowSkeleton.tsx
index 6276033161ef..41efa7a0d9c4 100644
--- a/src/components/Skeletons/TableRowSkeleton.tsx
+++ b/src/components/Skeletons/TableRowSkeleton.tsx
@@ -8,43 +8,36 @@ type TableListItemSkeletonProps = {
     shouldAnimate?: boolean;
     fixedNumItems?: number;
     gradientOpacityEnabled?: boolean;
-    useCompanyCardsLayout?: boolean;
 };
 
 const barHeight = '8';
 const shortBarWidth = '60';
 const longBarWidth = '124';
 
-function TableListItemSkeleton({shouldAnimate = true, fixedNumItems, gradientOpacityEnabled = false, useCompanyCardsLayout = false}: TableListItemSkeletonProps) {
+function TableListItemSkeleton({shouldAnimate = true, fixedNumItems, gradientOpacityEnabled = false}: TableListItemSkeletonProps) {
     const styles = useThemeStyles();
     useSkeletonSpan('TableRowSkeleton');
 
-    const circleX = useCompanyCardsLayout ? 36 : 40;
-    const circleY = useCompanyCardsLayout ? 36 : 32;
-    const rectX = useCompanyCardsLayout ? 68 : 80;
-    const rectY1 = useCompanyCardsLayout ? 24 : 20;
-    const rectY2 = useCompanyCardsLayout ? 40 : 36;
-
     return (
         <ItemListSkeletonView
             shouldAnimate={shouldAnimate}
             fixedNumItems={fixedNumItems}
             gradientOpacityEnabled={gradientOpacityEnabled}
-            itemViewStyle={useCompanyCardsLayout ? [styles.highlightBG, styles.mb2, styles.br3] : [styles.highlightBG, styles.mb2, styles.br3, styles.ml5]}
+            itemViewStyle={[styles.highlightBG, styles.mb2, styles.br3, styles.ml5]}
             renderSkeletonItem={() => (
                 <>
                     <Circle
-                        cx={circleX}
-                        cy={circleY}
+                        cx="40"
+                        cy="32"
                         r="20"
                     />
                     <Rect
-                        transform={[{translateX: rectX}, {translateY: rectY1}]}
+                        transform={[{translateX: 80}, {translateY: 20}]}
                         width={longBarWidth}
                         height={barHeight}
                     />
                     <Rect
-                        transform={[{translateX: rectX}, {translateY: rectY2}]}
+                        transform={[{translateX: 80}, {translateY: 36}]}
                         width={shortBarWidth}
                         height={barHeight}
                     />
diff --git a/src/components/SubStepForms/ConfirmationStep.tsx b/src/components/SubStepForms/ConfirmationStep.tsx
index fe12036fa120..113570a2d8c6 100644
--- a/src/components/SubStepForms/ConfirmationStep.tsx
+++ b/src/components/SubStepForms/ConfirmationStep.tsx
@@ -3,15 +3,16 @@ import {View} from 'react-native';
 import Button from '@components/Button';
 import DotIndicatorMessage from '@components/DotIndicatorMessage';
 import MenuItemWithTopDescription from '@components/MenuItemWithTopDescription';
-import RenderHTML from '@components/RenderHTML';
 import ScrollView from '@components/ScrollView';
 import Text from '@components/Text';
+import TextLink from '@components/TextLink';
 import useLocalize from '@hooks/useLocalize';
 import useNetwork from '@hooks/useNetwork';
 import useSafeAreaPaddings from '@hooks/useSafeAreaPaddings';
 import type {SubStepProps} from '@hooks/useSubStep/types';
 import useThemeStyles from '@hooks/useThemeStyles';
 import type {ForwardedFSClassProps} from '@libs/Fullstory/types';
+import CONST from '@src/CONST';
 
 type SummaryItem = {
     description: string;
@@ -79,9 +80,29 @@ function ConfirmationStep({
             ))}
 
             {showOnfidoLinks && (
-                <View style={[styles.renderHTML, styles.ph5, styles.mt3]}>
-                    <RenderHTML html={translate('onfidoStep.onfidoLinks', onfidoLinksTitle ?? '')} />
-                </View>
+                <Text style={[styles.mt3, styles.ph5, styles.textMicroSupporting]}>
+                    {onfidoLinksTitle}
+                    <TextLink
+                        href={CONST.ONFIDO_FACIAL_SCAN_POLICY_URL}
+                        style={[styles.textMicro]}
+                    >
+                        {translate('onfidoStep.facialScan')}
+                    </TextLink>
+                    {', '}
+                    <TextLink
+                        href={CONST.ONFIDO_PRIVACY_POLICY_URL}
+                        style={[styles.textMicro]}
+                    >
+                        {translate('common.privacy')}
+                    </TextLink>
+                    {` ${translate('common.and')} `}
+                    <TextLink
+                        href={CONST.ONFIDO_TERMS_OF_SERVICE_URL}
+                        style={[styles.textMicro]}
+                    >
+                        {translate('common.termsOfService')}
+                    </TextLink>
+                </Text>
             )}
 
             <View style={[styles.ph5, styles.mt5, styles.flexGrow1, styles.justifyContentEnd]}>
diff --git a/src/components/TabSelector/TabSelectorItem.tsx b/src/components/TabSelector/TabSelectorItem.tsx
index 55961c9e1ac8..ceed1828500c 100644
--- a/src/components/TabSelector/TabSelectorItem.tsx
+++ b/src/components/TabSelector/TabSelectorItem.tsx
@@ -1,4 +1,4 @@
-import React, {useLayoutEffect, useMemo, useRef, useState} from 'react';
+import React, {useLayoutEffect, useRef, useState} from 'react';
 // eslint-disable-next-line no-restricted-imports
 import {Animated} from 'react-native';
 import type {View} from 'react-native';
@@ -112,12 +112,9 @@ function TabSelectorItem({
         };
     }, [isActive, childRef, isSmallScreenWidth, parentX, parentWidth]);
 
-    const accessibilityState = useMemo(() => ({selected: isActive}), [isActive]);
-
     const children = (
         <AnimatedPressableWithFeedback
             accessibilityLabel={title}
-            accessibilityState={accessibilityState}
             style={[styles.tabSelectorButton, styles.tabBackground(isHovered, isActive, backgroundColor), styles.userSelectNone]}
             wrapperStyle={[equalWidth ? styles.flex1 : styles.flexGrow1]}
             onPress={onPress}
diff --git a/src/components/TestDrive/TestDriveBanner.tsx b/src/components/TestDrive/TestDriveBanner.tsx
index af464655659b..b1070b87c720 100644
--- a/src/components/TestDrive/TestDriveBanner.tsx
+++ b/src/components/TestDrive/TestDriveBanner.tsx
@@ -17,7 +17,7 @@ function TestDriveBanner({onPress}: TestDriveBannerProps) {
     const {translate} = useLocalize();
 
     return (
-        <View style={styles.highlightBG}>
+        <View style={[styles.highlightBG]}>
             <View style={[styles.gap2, styles.alignItemsCenter, styles.flexRow, styles.justifyContentCenter, styles.h10]}>
                 <Text>
                     {shouldUseNarrowLayout
diff --git a/src/components/TestDrive/TestDriveDemo.tsx b/src/components/TestDrive/TestDriveDemo.tsx
index 52ad6b33aea4..902bef99817a 100644
--- a/src/components/TestDrive/TestDriveDemo.tsx
+++ b/src/components/TestDrive/TestDriveDemo.tsx
@@ -5,7 +5,6 @@ import FullPageOfflineBlockingView from '@components/BlockingViews/FullPageOffli
 import EmbeddedDemo from '@components/EmbeddedDemo';
 import Modal from '@components/Modal';
 import SafeAreaConsumer from '@components/SafeAreaConsumer';
-import {shouldOpenRHPVariant} from '@components/SidePanel/RHPVariantTest';
 import useCurrentUserPersonalDetails from '@hooks/useCurrentUserPersonalDetails';
 import useIsPaidPolicyAdmin from '@hooks/useIsPaidPolicyAdmin';
 import useOnboardingMessages from '@hooks/useOnboardingMessages';
@@ -15,7 +14,6 @@ import useParentReportAction from '@hooks/useParentReportAction';
 import useResponsiveLayout from '@hooks/useResponsiveLayout';
 import useThemeStyles from '@hooks/useThemeStyles';
 import {completeTestDriveTask} from '@libs/actions/Task';
-import Log from '@libs/Log';
 import Navigation from '@libs/Navigation/Navigation';
 import {isAdminRoom} from '@libs/ReportUtils';
 import {getTestDriveURL} from '@libs/TourUtils';
@@ -76,10 +74,6 @@ function TestDriveDemo() {
         InteractionManager.runAfterInteractions(() => {
             Navigation.goBack();
 
-            if (shouldOpenRHPVariant()) {
-                Log.hmmm('[AdminTestDriveModal] User was redirected to Workspace Editor, skipping navigation to admin room');
-                return;
-            }
             if (isAdminRoom(onboardingReport)) {
                 Navigation.navigate(ROUTES.REPORT_WITH_ID.getRoute(onboardingReport?.reportID));
             }
diff --git a/src/components/TestToolMenu.tsx b/src/components/TestToolMenu.tsx
index f4f83bfab000..d31450a02250 100644
--- a/src/components/TestToolMenu.tsx
+++ b/src/components/TestToolMenu.tsx
@@ -1,20 +1,15 @@
 import React from 'react';
-import {View} from 'react-native';
 import useIsAuthenticated from '@hooks/useIsAuthenticated';
 import useLocalize from '@hooks/useLocalize';
 import useOnyx from '@hooks/useOnyx';
 import {useSidebarOrderedReports} from '@hooks/useSidebarOrderedReports';
-import useSingleExecution from '@hooks/useSingleExecution';
 import useThemeStyles from '@hooks/useThemeStyles';
-import useWaitForNavigation from '@hooks/useWaitForNavigation';
 import {isUsingStagingApi} from '@libs/ApiUtils';
-import Navigation from '@libs/Navigation/Navigation';
 import {setShouldFailAllRequests, setShouldForceOffline, setShouldSimulatePoorConnection} from '@userActions/Network';
 import {expireSessionWithDelay, invalidateAuthToken, invalidateCredentials} from '@userActions/Session';
 import {setIsDebugModeEnabled, setShouldUseStagingServer} from '@userActions/User';
 import CONFIG from '@src/CONFIG';
 import ONYXKEYS from '@src/ONYXKEYS';
-import ROUTES from '@src/ROUTES';
 import Button from './Button';
 import SoftKillTestToolRow from './SoftKillTestToolRow';
 import Switch from './Switch';
@@ -31,20 +26,9 @@ function TestToolMenu() {
     const {translate} = useLocalize();
     const {clearLHNCache} = useSidebarOrderedReports();
 
-    const {singleExecution} = useSingleExecution();
-    const waitForNavigate = useWaitForNavigation();
-    const navigateToBiometricsTestPage = singleExecution(
-        waitForNavigate(() => {
-            Navigation.navigate(ROUTES.MULTIFACTOR_AUTHENTICATION_BIOMETRICS_TEST);
-        }),
-    );
-
     // Check if the user is authenticated to show options that require authentication
     const isAuthenticated = useIsAuthenticated();
 
-    // Temporary hardcoded false, expected behavior: status fetched from the MultifactorAuthenticationContext
-    const biometricsTitle = translate('multifactorAuthentication.biometricsTest.troubleshootBiometricsStatus', {registered: false});
-
     return (
         <>
             <Text
@@ -99,17 +83,6 @@ function TestToolMenu() {
                             onPress={clearLHNCache}
                         />
                     </TestToolRow>
-
-                    {/* Allows you to test the Biometrics flow */}
-                    <TestToolRow title={biometricsTitle}>
-                        <View style={[styles.flexRow, styles.gap2]}>
-                            <Button
-                                small
-                                text={translate('multifactorAuthentication.biometricsTest.test')}
-                                onPress={() => navigateToBiometricsTestPage()}
-                            />
-                        </View>
-                    </TestToolRow>
                 </>
             )}
 
diff --git a/src/components/TextInput/BaseTextInput/implementation/index.native.tsx b/src/components/TextInput/BaseTextInput/implementation/index.native.tsx
index e8ea3cb0b2ff..821f9d6d5f01 100644
--- a/src/components/TextInput/BaseTextInput/implementation/index.native.tsx
+++ b/src/components/TextInput/BaseTextInput/implementation/index.native.tsx
@@ -280,7 +280,6 @@ function BaseTextInput({
 
     // Height fix is needed only for Text single line inputs
     const shouldApplyHeight = !shouldUseFullInputHeight && !isMultiline && !isMarkdownEnabled;
-    const accessibilityLabel = [label, hint].filter(Boolean).join(', ');
 
     return (
         <>
@@ -292,7 +291,7 @@ function BaseTextInput({
                     // When autoGrowHeight is true we calculate the width for the text input, so it will break lines properly
                     // or if multiline is not supplied we calculate the text input height, using onLayout.
                     onLayout={onLayout}
-                    accessibilityLabel={accessibilityLabel}
+                    accessibilityLabel={label}
                     style={[
                         autoGrowHeight &&
                             !isAutoGrowHeightMarkdown &&
@@ -368,7 +367,6 @@ function BaseTextInput({
                                 }}
                                 // eslint-disable-next-line
                                 {...inputProps}
-                                accessibilityLabel={inputProps.accessibilityLabel ?? accessibilityLabel}
                                 autoCorrect={inputProps.secureTextEntry ? false : autoCorrect}
                                 placeholder={placeholderValue}
                                 placeholderTextColor={placeholderTextColor ?? theme.placeholderText}
@@ -430,10 +428,15 @@ function BaseTextInput({
                                     style={[StyleUtils.getTextInputIconContainerStyles(hasLabel, false, verticalPaddingDiff)]}
                                 />
                             )}
-                            {!!inputProps.isLoading && !shouldShowClearButton && (
+                            {inputProps.isLoading !== undefined && !shouldShowClearButton && (
                                 <ActivityIndicator
                                     color={theme.iconSuccessFill}
-                                    style={[StyleUtils.getTextInputIconContainerStyles(hasLabel, false, verticalPaddingDiff), styles.ml1, loadingSpinnerStyle]}
+                                    style={[
+                                        StyleUtils.getTextInputIconContainerStyles(hasLabel, false, verticalPaddingDiff),
+                                        styles.ml1,
+                                        loadingSpinnerStyle,
+                                        StyleUtils.getOpacityStyle(inputProps.isLoading ? 1 : 0),
+                                    ]}
                                 />
                             )}
                             {!!inputProps.secureTextEntry && (
diff --git a/src/components/TextInput/BaseTextInput/implementation/index.tsx b/src/components/TextInput/BaseTextInput/implementation/index.tsx
index 6fc2988bee93..91e097dffd3c 100644
--- a/src/components/TextInput/BaseTextInput/implementation/index.tsx
+++ b/src/components/TextInput/BaseTextInput/implementation/index.tsx
@@ -289,7 +289,6 @@ function BaseTextInput({
     // This is workaround for https://github.com/Expensify/App/issues/47939: in case when user is using Chrome on Android we set inputMode to 'search' to disable autocomplete bar above the keyboard.
     // If we need some other inputMode (eg. 'decimal'), then the autocomplete bar will show, but we can do nothing about it as it's a known Chrome bug.
     const inputMode = inputProps.inputMode ?? (isMobileChrome() ? 'search' : undefined);
-    const accessibilityLabel = [label, hint].filter(Boolean).join(', ');
     return (
         <>
             <View
@@ -301,7 +300,7 @@ function BaseTextInput({
                     role={CONST.ROLE.PRESENTATION}
                     onPress={onPress}
                     tabIndex={-1}
-                    accessibilityLabel={accessibilityLabel}
+                    accessibilityLabel={label}
                     // When autoGrowHeight is true we calculate the width for the text input, so it will break lines properly
                     // or if multiline is not supplied we calculate the text input height, using onLayout.
                     onLayout={onLayout}
@@ -448,7 +447,6 @@ function BaseTextInput({
                                 readOnly={isReadOnly}
                                 defaultValue={defaultValue}
                                 markdownStyle={markdownStyle}
-                                accessibilityLabel={inputProps.accessibilityLabel}
                             />
                             {!!suffixCharacter && (
                                 <View style={[styles.textInputSuffixWrapper, suffixContainerStyle]}>
@@ -481,10 +479,15 @@ function BaseTextInput({
                                     />
                                 </View>
                             )}
-                            {!!inputProps.isLoading && !shouldShowClearButton && (
+                            {inputProps.isLoading !== undefined && !shouldShowClearButton && (
                                 <ActivityIndicator
                                     color={theme.iconSuccessFill}
-                                    style={[StyleUtils.getTextInputIconContainerStyles(hasLabel, false, verticalPaddingDiff), styles.ml1, loadingSpinnerStyle]}
+                                    style={[
+                                        StyleUtils.getTextInputIconContainerStyles(hasLabel, false, verticalPaddingDiff),
+                                        styles.ml1,
+                                        loadingSpinnerStyle,
+                                        StyleUtils.getOpacityStyle(inputProps.isLoading ? 1 : 0),
+                                    ]}
                                 />
                             )}
                             {!!inputProps.secureTextEntry && (
diff --git a/src/components/TextInputWithSymbol/types.ts b/src/components/TextInputWithSymbol/types.ts
index 11243020d90a..9fa0bda44e4c 100644
--- a/src/components/TextInputWithSymbol/types.ts
+++ b/src/components/TextInputWithSymbol/types.ts
@@ -103,7 +103,6 @@ type BaseTextInputWithSymbolProps = {
     | 'onBlur'
     | 'disabled'
     | 'ref'
-    | 'accessibilityLabel'
 >;
 
 type TextInputWithSymbolProps = Omit<BaseTextInputWithSymbolProps, 'onSelectionChange'> & {
diff --git a/src/components/ThreeDotsMenu/index.tsx b/src/components/ThreeDotsMenu/index.tsx
index 9a34aa635712..372cf9066ff8 100644
--- a/src/components/ThreeDotsMenu/index.tsx
+++ b/src/components/ThreeDotsMenu/index.tsx
@@ -45,7 +45,6 @@ function ThreeDotsMenu({
     shouldSelfPosition = false,
     threeDotsMenuRef,
     sentryLabel,
-    isContainerFocused = true,
 }: ThreeDotsMenuProps) {
     const [modal] = useOnyx(ONYXKEYS.MODAL, {canBeMissing: true});
 
@@ -101,12 +100,13 @@ function ThreeDotsMenu({
         hidePopoverMenu,
         onThreeDotsPress,
     }));
+
     useEffect(() => {
-        if ((!isBehindModal || !isPopupMenuVisible) && isContainerFocused) {
+        if (!isBehindModal || !isPopupMenuVisible) {
             return;
         }
         hidePopoverMenu();
-    }, [hidePopoverMenu, isBehindModal, isPopupMenuVisible, isContainerFocused]);
+    }, [hidePopoverMenu, isBehindModal, isPopupMenuVisible]);
 
     useLayoutEffect(() => {
         if (!getMenuPosition || !isPopupMenuVisible) {
@@ -166,7 +166,7 @@ function ThreeDotsMenu({
             <PopoverMenu
                 onClose={hidePopoverMenu}
                 onModalHide={() => setRestoreFocusType(undefined)}
-                isVisible={isPopupMenuVisible && !isBehindModal && isContainerFocused}
+                isVisible={isPopupMenuVisible && !isBehindModal}
                 anchorPosition={position ?? anchorPosition ?? {horizontal: 0, vertical: 0}}
                 anchorAlignment={anchorAlignment}
                 onItemSelected={(item) => {
diff --git a/src/components/ThreeDotsMenu/types.ts b/src/components/ThreeDotsMenu/types.ts
index ec38b6074239..6617d65b4771 100644
--- a/src/components/ThreeDotsMenu/types.ts
+++ b/src/components/ThreeDotsMenu/types.ts
@@ -51,9 +51,6 @@ type ThreeDotsMenuProps = WithSentryLabel & {
 
     /** Ref to the menu */
     threeDotsMenuRef?: React.RefObject<{hidePopoverMenu: () => void; isPopupMenuVisible: boolean} | null>;
-
-    /** Whether the menu is focused */
-    isContainerFocused?: boolean;
 };
 
 type ThreeDotsMenuWithOptionalAnchorProps =
diff --git a/src/components/TransactionItemRow/ReceiptPreview/index.tsx b/src/components/TransactionItemRow/ReceiptPreview/index.tsx
index 9a7da1e77eba..be3c27af9884 100644
--- a/src/components/TransactionItemRow/ReceiptPreview/index.tsx
+++ b/src/components/TransactionItemRow/ReceiptPreview/index.tsx
@@ -8,7 +8,7 @@ import DistanceEReceipt from '@components/DistanceEReceipt';
 import EReceiptWithSizeCalculation from '@components/EReceiptWithSizeCalculation';
 import type {ImageOnLoadEvent} from '@components/Image/types';
 import useDebouncedState from '@hooks/useDebouncedState';
-import useResponsiveLayoutOnWideRHP from '@hooks/useResponsiveLayoutOnWideRHP';
+import useResponsiveLayout from '@hooks/useResponsiveLayout';
 import useThemeStyles from '@hooks/useThemeStyles';
 import useWindowDimensions from '@hooks/useWindowDimensions';
 import {hasReceiptSource, isDistanceRequest, isManualDistanceRequest, isPerDiemRequest} from '@libs/TransactionUtils';
@@ -40,7 +40,7 @@ function ReceiptPreview({source, hovered, isEReceipt = false, transactionItem}:
     const [imageAspectRatio, setImageAspectRatio] = useState<string | number | undefined>(undefined);
     const [distanceEReceiptAspectRatio, setDistanceEReceiptAspectRatio] = useState<string | number | undefined>(undefined);
     const [shouldShow, debounceShouldShow, setShouldShow] = useDebouncedState(false, CONST.TIMING.SHOW_HOVER_PREVIEW_DELAY);
-    const {shouldUseNarrowLayout} = useResponsiveLayoutOnWideRHP();
+    const {shouldUseNarrowLayout} = useResponsiveLayout();
     const hasMeasured = useRef(false);
     const {windowHeight} = useWindowDimensions();
     const [isLoading, setIsLoading] = useState(true);
diff --git a/src/components/TransactionItemRow/index.tsx b/src/components/TransactionItemRow/index.tsx
index e366a9f1ee8e..14cf550fac18 100644
--- a/src/components/TransactionItemRow/index.tsx
+++ b/src/components/TransactionItemRow/index.tsx
@@ -16,7 +16,6 @@ import AmountCell from '@components/SelectionListWithSections/Search/TotalCell';
 import UserInfoCell from '@components/SelectionListWithSections/Search/UserInfoCell';
 import WorkspaceCell from '@components/SelectionListWithSections/Search/WorkspaceCell';
 import Text from '@components/Text';
-import useCurrentUserPersonalDetails from '@hooks/useCurrentUserPersonalDetails';
 import {useMemoizedLazyExpensifyIcons} from '@hooks/useLazyAsset';
 import useLocalize from '@hooks/useLocalize';
 import useResponsiveLayout from '@hooks/useResponsiveLayout';
@@ -45,7 +44,7 @@ import {
 } from '@libs/TransactionUtils';
 import CONST from '@src/CONST';
 import type {TranslationPaths} from '@src/languages/types';
-import type {PersonalDetails, Policy, Report, ReportAction, TransactionViolation} from '@src/types/onyx';
+import type {PersonalDetails, Policy, Report, TransactionViolation} from '@src/types/onyx';
 import type {SearchTransactionAction} from '@src/types/onyx/SearchResults';
 import CategoryCell from './DataCells/CategoryCell';
 import ChatBubbleCell from './DataCells/ChatBubbleCell';
@@ -102,6 +101,7 @@ type TransactionWithOptionalSearchFields = TransactionWithOptionalHighlight & {
 };
 
 type TransactionItemRowProps = {
+    hash?: number;
     transactionItem: TransactionWithOptionalSearchFields;
     report?: Report;
     shouldUseNarrowLayout: boolean;
@@ -133,7 +133,6 @@ type TransactionItemRowProps = {
     isHover?: boolean;
     shouldShowArrowRightOnNarrowLayout?: boolean;
     customCardNames?: Record<number, string>;
-    reportActions?: ReportAction[];
 };
 
 function getMerchantName(transactionItem: TransactionWithOptionalSearchFields, translate: (key: TranslationPaths) => string) {
@@ -146,10 +145,11 @@ function getMerchantName(transactionItem: TransactionWithOptionalSearchFields, t
     }
 
     const merchantName = StringUtils.getFirstLine(merchant);
-    return merchantName !== CONST.TRANSACTION.PARTIAL_TRANSACTION_MERCHANT && merchantName !== CONST.TRANSACTION.DEFAULT_MERCHANT ? merchantName : '';
+    return merchantName !== CONST.TRANSACTION.PARTIAL_TRANSACTION_MERCHANT ? merchantName : '';
 }
 
 function TransactionItemRow({
+    hash,
     transactionItem,
     report,
     shouldUseNarrowLayout,
@@ -181,14 +181,12 @@ function TransactionItemRow({
     isHover = false,
     shouldShowArrowRightOnNarrowLayout,
     customCardNames,
-    reportActions,
 }: TransactionItemRowProps) {
     const styles = useThemeStyles();
     const {translate} = useLocalize();
     const StyleUtils = useStyleUtils();
     const theme = useTheme();
     const {isLargeScreenWidth} = useResponsiveLayout();
-    const {accountID: currentUserAccountID} = useCurrentUserPersonalDetails();
     const hasCategoryOrTag = !isCategoryMissing(transactionItem?.category) || !!transactionItem.tag;
     const createdAt = getTransactionCreated(transactionItem);
     const expensicons = useMemoizedLazyExpensifyIcons(['ArrowRight']);
@@ -201,16 +199,6 @@ function TransactionItemRow({
     const isAmountColumnWide = amountColumnSize === CONST.SEARCH.TABLE_COLUMN_SIZES.WIDE;
     const isTaxAmountColumnWide = taxAmountColumnSize === CONST.SEARCH.TABLE_COLUMN_SIZES.WIDE;
 
-    const filteredViolations = useMemo(() => {
-        if (!violations) {
-            return undefined;
-        }
-        if (CONST.IS_ATTENDEES_REQUIRED_FEATURE_DISABLED) {
-            return violations.filter((violation) => violation.name !== CONST.VIOLATIONS.MISSING_ATTENDEES);
-        }
-        return violations;
-    }, [violations]);
-
     const bgActiveStyles = useMemo(() => {
         if (!isSelected || !shouldHighlightItemWhenSelected) {
             return [];
@@ -553,11 +541,7 @@ function TransactionItemRow({
             [CONST.SEARCH.TABLE_COLUMNS.TITLE]: (
                 <View style={[StyleUtils.getReportTableColumnStyles(CONST.SEARCH.TABLE_COLUMNS.TITLE)]}>
                     <TextCell
-                        text={
-                            computeReportName(transactionItem.report, undefined, undefined, undefined, undefined, undefined, undefined, currentUserAccountID) ??
-                            transactionItem.report?.reportName ??
-                            ''
-                        }
+                        text={computeReportName(transactionItem.report) ?? transactionItem.report?.reportName ?? ''}
                         isLargeScreenWidth={isLargeScreenWidth}
                     />
                 </View>
@@ -572,7 +556,10 @@ function TransactionItemRow({
             ),
             [CONST.SEARCH.TABLE_COLUMNS.EXPORTED_TO]: (
                 <View style={[StyleUtils.getReportTableColumnStyles(CONST.SEARCH.TABLE_COLUMNS.EXPORTED_TO)]}>
-                    <ExportedIconCell reportActions={reportActions} />
+                    <ExportedIconCell
+                        hash={hash}
+                        reportID={transactionItem.reportID}
+                    />
                 </View>
             ),
         }),
@@ -604,8 +591,7 @@ function TransactionItemRow({
             isAmountColumnWide,
             isTaxAmountColumnWide,
             isLargeScreenWidth,
-            currentUserAccountID,
-            reportActions,
+            hash,
         ],
     );
     const shouldRenderChatBubbleCell = useMemo(() => {
@@ -717,7 +703,7 @@ function TransactionItemRow({
                             {shouldShowErrors && (
                                 <TransactionItemRowRBR
                                     transaction={transactionItem}
-                                    violations={filteredViolations}
+                                    violations={violations}
                                     report={report}
                                     containerStyles={[styles.mt2, styles.minHeight4]}
                                     missingFieldError={missingFieldError}
@@ -791,7 +777,7 @@ function TransactionItemRow({
                 {shouldShowErrors && (
                     <TransactionItemRowRBR
                         transaction={transactionItem}
-                        violations={filteredViolations}
+                        violations={violations}
                         report={report}
                         missingFieldError={missingFieldError}
                     />
diff --git a/src/components/UploadFile.tsx b/src/components/UploadFile.tsx
index 385648ab87dc..09737c4fbcf0 100644
--- a/src/components/UploadFile.tsx
+++ b/src/components/UploadFile.tsx
@@ -83,7 +83,7 @@ function UploadFile({
         }
 
         if (fileLimit && resultedFiles.length > 0 && resultedFiles.length > fileLimit) {
-            setError(translate('attachmentPicker.tooManyFiles', fileLimit));
+            setError(translate('attachmentPicker.tooManyFiles', {fileLimit}));
             return;
         }
 
diff --git a/src/components/ValidateCodeActionModal/ValidateCodeForm/BaseValidateCodeForm.tsx b/src/components/ValidateCodeActionModal/ValidateCodeForm/BaseValidateCodeForm.tsx
index 0c8e725f30f0..62fa9a1e17d2 100644
--- a/src/components/ValidateCodeActionModal/ValidateCodeForm/BaseValidateCodeForm.tsx
+++ b/src/components/ValidateCodeActionModal/ValidateCodeForm/BaseValidateCodeForm.tsx
@@ -10,8 +10,6 @@ import type {AutoCompleteVariant, MagicCodeInputHandle} from '@components/MagicC
 import OfflineWithFeedback from '@components/OfflineWithFeedback';
 import PressableWithFeedback from '@components/Pressable/PressableWithFeedback';
 import Text from '@components/Text';
-import ValidateCodeCountdown from '@components/ValidateCodeCountdown';
-import type {ValidateCodeCountdownHandle} from '@components/ValidateCodeCountdown/types';
 import {WideRHPContext} from '@components/WideRHPContextProvider';
 import useLocalize from '@hooks/useLocalize';
 import useNetwork from '@hooks/useNetwork';
@@ -22,6 +20,8 @@ import useThemeStyles from '@hooks/useThemeStyles';
 import {isMobileSafari} from '@libs/Browser';
 import {getLatestErrorField, getLatestErrorMessage} from '@libs/ErrorUtils';
 import {isValidValidateCode} from '@libs/ValidationUtils';
+import ValidateCodeCountdown from '@pages/signin/ValidateCodeCountdown';
+import type {ValidateCodeCountdownHandle} from '@pages/signin/ValidateCodeCountdown/types';
 import {clearValidateCodeActionError} from '@userActions/User';
 import CONST from '@src/CONST';
 import type {TranslationPaths} from '@src/languages/types';
diff --git a/src/components/VideoPlayerContexts/PlaybackContext/playbackContextReportIDUtils.ts b/src/components/VideoPlayerContexts/PlaybackContext/playbackContextReportIDUtils.ts
index f406e03c6218..aec9590bd640 100644
--- a/src/components/VideoPlayerContexts/PlaybackContext/playbackContextReportIDUtils.ts
+++ b/src/components/VideoPlayerContexts/PlaybackContext/playbackContextReportIDUtils.ts
@@ -47,13 +47,7 @@ const getCurrentRouteReportID: (url: string) => string | ProtectedCurrentRouteRe
     return isFocusedRouteAChatThread ? firstReportThatHasURLInAttachments : focusedRouteReportID;
 };
 
-const screensWithReportID = [
-    SCREENS.RIGHT_MODAL.SEARCH_REPORT,
-    SCREENS.RIGHT_MODAL.SEARCH_MONEY_REQUEST_REPORT,
-    SCREENS.RIGHT_MODAL.EXPENSE_REPORT,
-    SCREENS.REPORT,
-    SCREENS.REPORT_ATTACHMENTS,
-];
+const screensWithReportID = [SCREENS.RIGHT_MODAL.SEARCH_REPORT, SCREENS.REPORT, SCREENS.SEARCH.MONEY_REQUEST_REPORT, SCREENS.REPORT_ATTACHMENTS];
 
 function hasReportIdInRouteParams(route: SearchRoute): route is RouteWithReportIDInParams<SearchRoute> {
     return !!route && !!route.params && !!screensWithReportID.find((screen) => screen === route.name) && 'reportID' in route.params;
diff --git a/src/components/WideRHPContextProvider/default.ts b/src/components/WideRHPContextProvider/default.ts
index 10a359bfcb9c..7add883bb4a1 100644
--- a/src/components/WideRHPContextProvider/default.ts
+++ b/src/components/WideRHPContextProvider/default.ts
@@ -20,8 +20,6 @@ const defaultWideRHPContextValue: WideRHPContextType = {
     removeSuperWideRHPRouteKey: () => {},
     syncRHPKeys: () => {},
     clearWideRHPKeys: () => {},
-    setIsWideRHPClosing: () => {},
-    setIsSuperWideRHPClosing: () => {},
 };
 
 export default defaultWideRHPContextValue;
diff --git a/src/components/WideRHPContextProvider/getVisibleRHPRouteKeys.ts b/src/components/WideRHPContextProvider/getVisibleRHPRouteKeys.ts
index 4d1ff9b4c210..6c945a7fa5a3 100644
--- a/src/components/WideRHPContextProvider/getVisibleRHPRouteKeys.ts
+++ b/src/components/WideRHPContextProvider/getVisibleRHPRouteKeys.ts
@@ -23,6 +23,7 @@ function getVisibleRHPKeys(allSuperWideRHPKeys: string[], allWideRHPKeys: string
     }
 
     const rootState = navigationRef.getRootState();
+
     if (!rootState) {
         return emptyRHPKeysState;
     }
diff --git a/src/components/WideRHPContextProvider/index.tsx b/src/components/WideRHPContextProvider/index.tsx
index c697c1a846b4..941c3d20b6df 100644
--- a/src/components/WideRHPContextProvider/index.tsx
+++ b/src/components/WideRHPContextProvider/index.tsx
@@ -1,5 +1,5 @@
 import {findFocusedRoute} from '@react-navigation/native';
-import React, {createContext, useCallback, useEffect, useMemo, useRef, useState} from 'react';
+import React, {createContext, useCallback, useEffect, useMemo, useState} from 'react';
 // We use Animated for all functionality related to wide RHP to make it easier
 // to interact with react-navigation components (e.g., CardContainer, interpolator), which also use Animated.
 // eslint-disable-next-line no-restricted-imports
@@ -111,17 +111,6 @@ function WideRHPContextProvider({children}: React.PropsWithChildren) {
 
     const [allReports] = useOnyx(ONYXKEYS.COLLECTION.REPORT, {selector: expenseReportSelector, canBeMissing: true});
 
-    const isWideRHPClosingRef = useRef(false);
-    const isSuperWideRHPClosingRef = useRef(false);
-
-    const setIsWideRHPClosing = useCallback((isClosing: boolean) => {
-        isWideRHPClosingRef.current = isClosing;
-    }, []);
-
-    const setIsSuperWideRHPClosing = useCallback((isClosing: boolean) => {
-        isSuperWideRHPClosingRef.current = isClosing;
-    }, []);
-
     const {focusedRoute, focusedNavigator} = useRootNavigationState((state) => {
         if (!state) {
             return {focusedRoute: undefined, focusedNavigator: undefined};
@@ -344,8 +333,6 @@ function WideRHPContextProvider({children}: React.PropsWithChildren) {
             isSuperWideRHPFocused,
             syncRHPKeys,
             clearWideRHPKeys,
-            setIsWideRHPClosing,
-            setIsSuperWideRHPClosing,
         }),
         [
             wideRHPRouteKeys,
@@ -367,8 +354,6 @@ function WideRHPContextProvider({children}: React.PropsWithChildren) {
             isSuperWideRHPFocused,
             syncRHPKeys,
             clearWideRHPKeys,
-            setIsWideRHPClosing,
-            setIsSuperWideRHPClosing,
         ],
     );
 
diff --git a/src/components/WideRHPContextProvider/types.ts b/src/components/WideRHPContextProvider/types.ts
index 20300f48287e..8ffb8e7dca87 100644
--- a/src/components/WideRHPContextProvider/types.ts
+++ b/src/components/WideRHPContextProvider/types.ts
@@ -57,12 +57,6 @@ type WideRHPContextType = {
 
     // Clear the arrays of wide and super wide rhp keys
     clearWideRHPKeys: () => void;
-
-    // Set that wide rhp is closing
-    setIsWideRHPClosing: (isClosing: boolean) => void;
-
-    // Set that super wide rhp is closing
-    setIsSuperWideRHPClosing: (isClosing: boolean) => void;
 };
 
 // eslint-disable-next-line import/prefer-default-export
diff --git a/src/components/WorkspaceMembersSelectionList.tsx b/src/components/WorkspaceMembersSelectionList.tsx
index ec60837ad5a9..3bf855ae4d1f 100644
--- a/src/components/WorkspaceMembersSelectionList.tsx
+++ b/src/components/WorkspaceMembersSelectionList.tsx
@@ -1,4 +1,4 @@
-import React from 'react';
+import React, {useMemo} from 'react';
 import useDebouncedState from '@hooks/useDebouncedState';
 import {useMemoizedLazyExpensifyIcons} from '@hooks/useLazyAsset';
 import useLocalize from '@hooks/useLocalize';
@@ -43,53 +43,67 @@ function WorkspaceMembersSelectionList({policyID, selectedApprover, setApprover}
     const policy = usePolicy(policyID);
     const [countryCode = CONST.DEFAULT_COUNTRY_CODE] = useOnyx(ONYXKEYS.COUNTRY_CODE, {canBeMissing: false});
 
-    const approvers: SelectionListApprover[] = [];
-
-    if (policy?.employeeList) {
-        for (const employee of Object.values(policy.employeeList)) {
-            const email = employee.email;
-
-            if (!email || employee.pendingAction === CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE) {
-                continue;
-            }
-
-            const policyMemberEmailsToAccountIDs = getMemberAccountIDsForWorkspace(policy?.employeeList);
-            const accountID = Number(policyMemberEmailsToAccountIDs[email] ?? '');
-            const {avatar, displayName = email, login} = personalDetails?.[accountID] ?? {};
-
-            approvers.push({
-                text: displayName,
-                alternateText: email,
-                keyForList: email,
-                isSelected: selectedApprover === email,
-                login: email,
-                icons: [{source: avatar ?? icons.FallbackAvatar, type: CONST.ICON_TYPE_AVATAR, name: displayName, id: accountID}],
-                rightElement: (
-                    <MemberRightIcon
-                        role={employee.role}
-                        owner={policy?.owner}
-                        login={login}
-                    />
-                ),
-            });
+    const orderedApprovers = useMemo(() => {
+        const approvers: SelectionListApprover[] = [];
+
+        if (policy?.employeeList) {
+            const availableApprovers = Object.values(policy.employeeList)
+                .map((employee): SelectionListApprover | null => {
+                    const email = employee.email;
+
+                    if (!email || employee.pendingAction === CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE) {
+                        return null;
+                    }
+
+                    const policyMemberEmailsToAccountIDs = getMemberAccountIDsForWorkspace(policy?.employeeList);
+                    const accountID = Number(policyMemberEmailsToAccountIDs[email] ?? '');
+                    const {avatar, displayName = email, login} = personalDetails?.[accountID] ?? {};
+
+                    return {
+                        text: displayName,
+                        alternateText: email,
+                        keyForList: email,
+                        isSelected: selectedApprover === email,
+                        login: email,
+                        icons: [{source: avatar ?? icons.FallbackAvatar, type: CONST.ICON_TYPE_AVATAR, name: displayName, id: accountID}],
+                        rightElement: (
+                            <MemberRightIcon
+                                role={employee.role}
+                                owner={policy?.owner}
+                                login={login}
+                            />
+                        ),
+                    };
+                })
+                .filter((approver): approver is SelectionListApprover => !!approver);
+
+            approvers.push(...availableApprovers);
         }
-    }
 
-    const filteredApprovers = tokenizedSearch(approvers, getSearchValueForPhoneOrEmail(debouncedSearchTerm, countryCode), (approver) => [approver.text ?? '', approver.login ?? '']);
-    const orderedApprovers = sortAlphabetically(filteredApprovers, 'text', localeCompare);
+        const filteredApprovers = tokenizedSearch(approvers, getSearchValueForPhoneOrEmail(debouncedSearchTerm, countryCode), (approver) => [approver.text ?? '', approver.login ?? '']);
+
+        return sortAlphabetically(filteredApprovers, 'text', localeCompare);
+    }, [policy?.employeeList, policy?.owner, debouncedSearchTerm, countryCode, localeCompare, personalDetails, selectedApprover, icons.FallbackAvatar]);
 
-    const textInputOptions = {
-        label: translate('selectionList.nameEmailOrPhoneNumber'),
-        value: searchTerm,
-        headerMessage: searchTerm && !orderedApprovers.length ? translate('common.noResultsFound') : '',
-        onChangeText: setSearchTerm,
+    const handleOnSelectRow = (approver: SelectionListApprover) => {
+        setApprover(approver.login);
     };
 
+    const textInputOptions = useMemo(
+        () => ({
+            label: translate('selectionList.nameEmailOrPhoneNumber'),
+            value: searchTerm,
+            headerMessage: searchTerm && !orderedApprovers.length ? translate('common.noResultsFound') : '',
+            onChangeText: setSearchTerm,
+        }),
+        [searchTerm, orderedApprovers.length, setSearchTerm, translate],
+    );
+
     return (
         <SelectionList
             data={orderedApprovers}
             ListItem={InviteMemberListItem}
-            onSelectRow={(approver) => setApprover(approver.login)}
+            onSelectRow={handleOnSelectRow}
             textInputOptions={textInputOptions}
             showLoadingPlaceholder={!didScreenTransitionEnd}
             shouldPreventDefaultFocusOnSelectRow={!canUseTouchScreen()}
diff --git a/src/hooks/useAccountTabIndicatorStatus.ts b/src/hooks/useAccountTabIndicatorStatus.ts
index 480a814f41b9..ee3835b2fc12 100644
--- a/src/hooks/useAccountTabIndicatorStatus.ts
+++ b/src/hooks/useAccountTabIndicatorStatus.ts
@@ -1,19 +1,79 @@
-import useNavigationTabBarIndicatorChecks from './useNavigationTabBarIndicatorChecks';
-import type {IndicatorStatus} from './useNavigationTabBarIndicatorChecks';
+import type {ValueOf} from 'type-fest';
+import {hasPaymentMethodError} from '@libs/actions/PaymentMethods';
+import {hasPartiallySetupBankAccount} from '@libs/BankAccountUtils';
+import {checkIfFeedConnectionIsBroken, hasPendingExpensifyCardAction} from '@libs/CardUtils';
+import {hasSubscriptionGreenDotInfo, hasSubscriptionRedDotError} from '@libs/SubscriptionUtils';
+import {hasLoginListError, hasLoginListInfo} from '@libs/UserUtils';
+import CONST from '@src/CONST';
+import ONYXKEYS from '@src/ONYXKEYS';
+import useOnyx from './useOnyx';
 import useTheme from './useTheme';
 
+type AccountTabIndicatorStatus = ValueOf<typeof CONST.INDICATOR_STATUS>;
+
 type AccountTabIndicatorStatusResult = {
     indicatorColor: string;
-    status: IndicatorStatus | undefined;
+    status: ValueOf<typeof CONST.INDICATOR_STATUS> | undefined;
 };
 
 function useAccountTabIndicatorStatus(): AccountTabIndicatorStatusResult {
     const theme = useTheme();
+    const [bankAccountList] = useOnyx(ONYXKEYS.BANK_ACCOUNT_LIST, {canBeMissing: true});
+    const [reimbursementAccount] = useOnyx(ONYXKEYS.REIMBURSEMENT_ACCOUNT, {canBeMissing: true});
+    const [fundList] = useOnyx(ONYXKEYS.FUND_LIST, {canBeMissing: true});
+    const [userWallet] = useOnyx(ONYXKEYS.USER_WALLET, {canBeMissing: true});
+    const [walletTerms] = useOnyx(ONYXKEYS.WALLET_TERMS, {canBeMissing: true});
+    const [loginList] = useOnyx(ONYXKEYS.LOGIN_LIST, {canBeMissing: true});
+    const [privatePersonalDetails] = useOnyx(ONYXKEYS.PRIVATE_PERSONAL_DETAILS, {canBeMissing: true});
+    const [allCards] = useOnyx(`${ONYXKEYS.CARD_LIST}`, {canBeMissing: true});
+    const hasBrokenFeedConnection = checkIfFeedConnectionIsBroken(allCards, CONST.EXPENSIFY_CARD.BANK);
+    const [session] = useOnyx(ONYXKEYS.SESSION, {canBeMissing: true});
+    const [stripeCustomerId] = useOnyx(ONYXKEYS.NVP_PRIVATE_STRIPE_CUSTOMER_ID, {canBeMissing: true});
+    const [retryBillingSuccessful] = useOnyx(ONYXKEYS.SUBSCRIPTION_RETRY_BILLING_STATUS_SUCCESSFUL, {canBeMissing: true});
+    const [billingDisputePending] = useOnyx(ONYXKEYS.NVP_PRIVATE_BILLING_DISPUTE_PENDING, {canBeMissing: true});
+    const [retryBillingFailed] = useOnyx(ONYXKEYS.SUBSCRIPTION_RETRY_BILLING_STATUS_FAILED, {canBeMissing: true});
+    const [billingStatus] = useOnyx(ONYXKEYS.NVP_PRIVATE_BILLING_STATUS, {canBeMissing: true});
+    // All of the error & info-checking methods are put into an array. This is so that using _.some() will return
+    // early as soon as the first error / info condition is returned. This makes the checks very efficient since
+    // we only care if a single error / info condition exists anywhere.
+    const errorChecking: Partial<Record<AccountTabIndicatorStatus, boolean>> = {
+        [CONST.INDICATOR_STATUS.HAS_USER_WALLET_ERRORS]: Object.keys(userWallet?.errors ?? {}).length > 0,
+        [CONST.INDICATOR_STATUS.HAS_PAYMENT_METHOD_ERROR]: hasPaymentMethodError(bankAccountList, fundList, allCards),
+        [CONST.INDICATOR_STATUS.HAS_REIMBURSEMENT_ACCOUNT_ERRORS]: Object.keys(reimbursementAccount?.errors ?? {}).length > 0,
+        [CONST.INDICATOR_STATUS.HAS_LOGIN_LIST_ERROR]: !!loginList && hasLoginListError(loginList),
+        // Wallet term errors that are not caused by an IOU (we show the red brick indicator for those in the LHN instead)
+        [CONST.INDICATOR_STATUS.HAS_WALLET_TERMS_ERRORS]: Object.keys(walletTerms?.errors ?? {}).length > 0 && !walletTerms?.chatReportID,
+        [CONST.INDICATOR_STATUS.HAS_CARD_CONNECTION_ERROR]: hasBrokenFeedConnection,
+        [CONST.INDICATOR_STATUS.HAS_PHONE_NUMBER_ERROR]: !!privatePersonalDetails?.errorFields?.phoneNumber,
+        [CONST.INDICATOR_STATUS.HAS_SUBSCRIPTION_ERRORS]: hasSubscriptionRedDotError(
+            stripeCustomerId,
+            retryBillingSuccessful,
+            billingDisputePending,
+            retryBillingFailed,
+            fundList,
+            billingStatus,
+        ),
+    };
+
+    const infoChecking: Partial<Record<AccountTabIndicatorStatus, boolean>> = {
+        [CONST.INDICATOR_STATUS.HAS_LOGIN_LIST_INFO]: !!loginList && hasLoginListInfo(loginList, session?.email),
+        [CONST.INDICATOR_STATUS.HAS_PENDING_CARD_INFO]: hasPendingExpensifyCardAction(allCards, privatePersonalDetails),
+        [CONST.INDICATOR_STATUS.HAS_SUBSCRIPTION_INFO]: hasSubscriptionGreenDotInfo(
+            stripeCustomerId,
+            retryBillingSuccessful,
+            billingDisputePending,
+            retryBillingFailed,
+            fundList,
+            billingStatus,
+        ),
+        [CONST.INDICATOR_STATUS.HAS_PARTIALLY_SETUP_BANK_ACCOUNT_INFO]: hasPartiallySetupBankAccount(bankAccountList),
+    };
 
-    const {accountStatus, infoStatus} = useNavigationTabBarIndicatorChecks();
+    const [error] = Object.entries(errorChecking).find(([, value]) => value) ?? [];
+    const [info] = Object.entries(infoChecking).find(([, value]) => value) ?? [];
 
-    const status = accountStatus ?? infoStatus;
-    const indicatorColor = accountStatus ? theme.danger : theme.success;
+    const status = (error ?? info) as AccountTabIndicatorStatus | undefined;
+    const indicatorColor = error ? theme.danger : theme.success;
 
     return {indicatorColor, status};
 }
diff --git a/src/hooks/useAllTransactions.ts b/src/hooks/useAllTransactions.ts
index 34a2fb0037b5..f907458ba3a3 100644
--- a/src/hooks/useAllTransactions.ts
+++ b/src/hooks/useAllTransactions.ts
@@ -1,6 +1,7 @@
 import {useMemo} from 'react';
 import type {OnyxEntry} from 'react-native-onyx';
 import {useSearchContext} from '@components/Search/SearchContext';
+import CONST from '@src/CONST';
 import ONYXKEYS from '@src/ONYXKEYS';
 import type {Transaction} from '@src/types/onyx';
 import useOnyx from './useOnyx';
@@ -9,7 +10,9 @@ import useOnyx from './useOnyx';
  * Hook that returns all transactions, filtered by current search results if a search data is available
  */
 function useAllTransactions() {
-    const {currentSearchResults} = useSearchContext();
+    const searchContext = useSearchContext();
+    const searchHash = searchContext?.currentSearchHash ?? CONST.DEFAULT_NUMBER_ID;
+    const [currentSearchResults] = useOnyx(`${ONYXKEYS.COLLECTION.SNAPSHOT}${searchHash}`, {canBeMissing: true});
     const [allTransactionsCollection] = useOnyx(ONYXKEYS.COLLECTION.TRANSACTION, {canBeMissing: false});
 
     const allTransactions = useMemo(() => {
diff --git a/src/hooks/useAssignCard.ts b/src/hooks/useAssignCard.ts
index 09df344ac255..7e51bd999a29 100644
--- a/src/hooks/useAssignCard.ts
+++ b/src/hooks/useAssignCard.ts
@@ -6,7 +6,6 @@ import {
     filterInactiveCards,
     getCompanyCardFeed,
     getCompanyFeeds,
-    getDefaultCardName,
     getDomainOrWorkspaceAccountID,
     getPlaidCountry,
     getPlaidInstitutionId,
@@ -20,11 +19,11 @@ import {clearAddNewCardFlow, clearAssignCardStepAndData, openPolicyCompanyCardsP
 import CONST from '@src/CONST';
 import ONYXKEYS from '@src/ONYXKEYS';
 import ROUTES from '@src/ROUTES';
-import type {CompanyCardFeedWithDomainID} from '@src/types/onyx';
+import type {CompanyCardFeedWithDomainID, CurrencyList} from '@src/types/onyx';
 import type {AssignCardData, AssignCardStep} from '@src/types/onyx/AssignCard';
+import {getEmptyObject} from '@src/types/utils/EmptyObject';
 import useCardFeeds from './useCardFeeds';
 import type {CombinedCardFeed} from './useCardFeeds';
-import useCurrencyList from './useCurrencyList';
 import useIsAllowedToIssueCompanyCard from './useIsAllowedToIssueCompanyCard';
 import useNetwork from './useNetwork';
 import useOnyx from './useOnyx';
@@ -73,12 +72,7 @@ function useAssignCard({feedName, policyID, setShouldShowOfflineModal}: UseAssig
 
     const getInitialAssignCardStep = useInitialAssignCardStep({policyID, selectedFeed: feedName});
 
-    /**
-     * Initiates the card assignment flow.
-     * @param cardName - The masked card number displayed to users (e.g., "XXXX1234")
-     * @param cardID - The identifier sent to backend (equals cardName for direct feeds)
-     */
-    const assignCard = (cardName?: string, cardID?: string) => {
+    const assignCard = (cardID?: string) => {
         if (isAssigningCardDisabled) {
             return;
         }
@@ -104,7 +98,7 @@ function useAssignCard({feedName, policyID, setShouldShowOfflineModal}: UseAssig
         clearAddNewCardFlow();
         clearAssignCardStepAndData();
 
-        const initialAssignCardStep = getInitialAssignCardStep(cardName, cardID);
+        const initialAssignCardStep = getInitialAssignCardStep(cardID);
 
         if (!initialAssignCardStep) {
             return;
@@ -143,9 +137,9 @@ function useInitialAssignCardStep({policyID, selectedFeed}: UseInitialAssignCard
     const {isOffline} = useNetwork();
 
     const policy = usePolicy(policyID);
-    const {currencyList} = useCurrencyList();
 
     const [countryByIp] = useOnyx(ONYXKEYS.COUNTRY, {canBeMissing: false});
+    const [currencyList = getEmptyObject<CurrencyList>()] = useOnyx(ONYXKEYS.CURRENCY_LIST, {canBeMissing: true});
 
     const [cardFeeds] = useCardFeeds(policyID);
     const companyCards = getCompanyFeeds(cardFeeds);
@@ -155,19 +149,14 @@ function useInitialAssignCardStep({policyID, selectedFeed}: UseInitialAssignCard
     const plaidAccessToken = feedData?.plaidAccessToken;
     const hasImportedPlaidAccounts = useRef(false);
 
-    /**
-     * Gets the initial step and card data for the assignment flow.
-     * @param cardName - The masked card number displayed to users
-     * @param cardID - The identifier sent to backend (equals cardName for direct feeds)
-     */
-    const getInitialAssignCardStep = (cardName: string | undefined, cardID?: string): {initialStep: AssignCardStep; cardToAssign: Partial<AssignCardData>} | undefined => {
+    const getInitialAssignCardStep = (cardID: string | undefined): {initialStep: AssignCardStep; cardToAssign: Partial<AssignCardData>} | undefined => {
         if (!selectedFeed) {
             return;
         }
 
         const cardToAssign: Partial<AssignCardData> = {
             bankName,
-            cardName,
+            cardNumber: cardID,
             encryptedCardNumber: cardID,
         };
 
@@ -206,7 +195,7 @@ function useInitialAssignCardStep({policyID, selectedFeed}: UseInitialAssignCard
             cardToAssign.email = userEmail;
             const personalDetails = getPersonalDetailByEmail(userEmail);
             const memberName = personalDetails?.firstName ? personalDetails.firstName : personalDetails?.login;
-            cardToAssign.customCardName = getDefaultCardName(memberName);
+            cardToAssign.cardName = `${memberName}'s card`;
 
             return {
                 initialStep: CONST.COMPANY_CARD.STEP.CONFIRMATION,
diff --git a/src/hooks/useBulkPayOptions.ts b/src/hooks/useBulkPayOptions.ts
index 29b70bea45be..8beeb9099f2f 100644
--- a/src/hooks/useBulkPayOptions.ts
+++ b/src/hooks/useBulkPayOptions.ts
@@ -1,4 +1,5 @@
 import truncate from 'lodash/truncate';
+import {useCallback, useMemo} from 'react';
 import type {TupleToUnion} from 'type-fest';
 import type {PopoverMenuItem} from '@components/PopoverMenu';
 import type {BankAccountMenuItem} from '@components/Search/types';
@@ -98,65 +99,72 @@ function useBulkPayOptions({
         });
     }
 
-    const getPaymentSubitems = (payAsBusiness: boolean) => {
-        const requiredAccountType = payAsBusiness ? CONST.BANK_ACCOUNT.TYPE.BUSINESS : CONST.BANK_ACCOUNT.TYPE.PERSONAL;
-        return formattedPaymentMethods
-            .filter((method) => {
-                const accountData = method?.accountData as AccountData;
-                return accountData?.type === requiredAccountType;
-            })
-            .map((formattedPaymentMethod) => ({
-                text: formattedPaymentMethod?.title ?? '',
-                description: formattedPaymentMethod?.description ?? '',
-                icon: formattedPaymentMethod?.icon,
-                shouldUpdateSelectedIndex: true,
-                iconStyles: formattedPaymentMethod?.iconStyles,
-                iconHeight: formattedPaymentMethod?.iconSize,
-                iconWidth: formattedPaymentMethod?.iconSize,
-                key: CONST.IOU.PAYMENT_TYPE.EXPENSIFY,
-                additionalData: {
-                    payAsBusiness,
-                    methodID: formattedPaymentMethod.methodID,
-                    paymentMethod: formattedPaymentMethod.accountType,
-                },
-            }));
-    };
+    const getPaymentSubitems = useCallback(
+        (payAsBusiness: boolean) => {
+            const requiredAccountType = payAsBusiness ? CONST.BANK_ACCOUNT.TYPE.BUSINESS : CONST.BANK_ACCOUNT.TYPE.PERSONAL;
+
+            return formattedPaymentMethods
+                .filter((method) => {
+                    const accountData = method?.accountData as AccountData;
+                    return accountData?.type === requiredAccountType;
+                })
+                .map((formattedPaymentMethod) => ({
+                    text: formattedPaymentMethod?.title ?? '',
+                    description: formattedPaymentMethod?.description ?? '',
+                    icon: formattedPaymentMethod?.icon,
+                    shouldUpdateSelectedIndex: true,
+                    iconStyles: formattedPaymentMethod?.iconStyles,
+                    iconHeight: formattedPaymentMethod?.iconSize,
+                    iconWidth: formattedPaymentMethod?.iconSize,
+                    key: CONST.IOU.PAYMENT_TYPE.EXPENSIFY,
+                    additionalData: {
+                        payAsBusiness,
+                        methodID: formattedPaymentMethod.methodID,
+                        paymentMethod: formattedPaymentMethod.accountType,
+                    },
+                }));
+        },
+        [formattedPaymentMethods],
+    );
 
     const latestBankItems = getLatestBankAccountItem();
     const personalBankAccountList = formattedPaymentMethods.filter((ba) => (ba.accountData as AccountData)?.type === CONST.BANK_ACCOUNT.TYPE.PERSONAL);
 
-    let bulkPayButtonOptions;
-    if (!selectedReportID || !selectedPolicyID) {
-        bulkPayButtonOptions = undefined;
-    } else if (onlyShowPayElsewhere) {
-        bulkPayButtonOptions = [paymentMethods[CONST.IOU.PAYMENT_TYPE.ELSEWHERE]];
-    } else {
-        bulkPayButtonOptions = [];
+    const bulkPayButtonOptions = useMemo(() => {
+        const buttonOptions = [];
+
+        if (!selectedReportID || !selectedPolicyID) {
+            return undefined;
+        }
+
+        if (onlyShowPayElsewhere) {
+            return [paymentMethods[CONST.IOU.PAYMENT_TYPE.ELSEWHERE]];
+        }
 
         if (shouldShowBusinessBankAccountOptions) {
-            bulkPayButtonOptions.push(paymentMethods[CONST.PAYMENT_METHODS.BUSINESS_BANK_ACCOUNT]);
+            buttonOptions.push(paymentMethods[CONST.PAYMENT_METHODS.BUSINESS_BANK_ACCOUNT]);
         }
 
         if (canUseWallet) {
             if (personalBankAccountList.length && canUsePersonalBankAccount) {
-                bulkPayButtonOptions.push({
+                buttonOptions.push({
                     text: translate('iou.settleWallet', {formattedAmount: ''}),
                     key: CONST.PAYMENT_METHODS.PERSONAL_BANK_ACCOUNT,
                     icon: icons.Wallet,
                 });
             } else if (canUsePersonalBankAccount) {
-                bulkPayButtonOptions.push(paymentMethods[CONST.PAYMENT_METHODS.PERSONAL_BANK_ACCOUNT]);
+                buttonOptions.push(paymentMethods[CONST.PAYMENT_METHODS.PERSONAL_BANK_ACCOUNT]);
             }
 
             if (activeAdminPolicies.length === 0 && !isPersonalOnlyOption) {
-                bulkPayButtonOptions.push(paymentMethods[CONST.PAYMENT_METHODS.BUSINESS_BANK_ACCOUNT]);
+                buttonOptions.push(paymentMethods[CONST.PAYMENT_METHODS.BUSINESS_BANK_ACCOUNT]);
             }
         }
 
         if ((hasMultiplePolicies || hasSinglePolicy) && canUseWallet && !isPersonalOnlyOption) {
             for (const activePolicy of activeAdminPolicies) {
                 const policyName = activePolicy.name;
-                bulkPayButtonOptions.push({
+                buttonOptions.push({
                     text: translate('iou.payWithPolicy', {policyName: truncate(policyName, {length: CONST.ADDITIONAL_ALLOWED_CHARACTERS}), formattedAmount: ''}),
                     icon: icons.Building,
                     key: activePolicy.id,
@@ -166,7 +174,7 @@ function useBulkPayOptions({
         }
 
         if (shouldShowPayElsewhereOption) {
-            bulkPayButtonOptions.push(paymentMethods[CONST.IOU.PAYMENT_TYPE.ELSEWHERE]);
+            buttonOptions.push(paymentMethods[CONST.IOU.PAYMENT_TYPE.ELSEWHERE]);
         }
 
         if (isInvoiceReport) {
@@ -195,13 +203,13 @@ function useBulkPayOptions({
             };
 
             if (isIndividualInvoiceRoomUtil(chatReport)) {
-                bulkPayButtonOptions.push({
+                buttonOptions.push({
                     text: translate('iou.settlePersonal', {formattedAmount}),
                     icon: icons.User,
                     backButtonText: translate('iou.individual'),
                     subMenuItems: getInvoicesOptions(false),
                 });
-                bulkPayButtonOptions.push({
+                buttonOptions.push({
                     text: translate('iou.settleBusiness', {formattedAmount}),
                     icon: icons.Building,
                     backButtonText: translate('iou.business'),
@@ -209,10 +217,34 @@ function useBulkPayOptions({
                 });
             } else {
                 // If there is pay as business option, we should show the submenu items instead.
-                bulkPayButtonOptions.push(...getInvoicesOptions(true));
+                buttonOptions.push(...getInvoicesOptions(true));
             }
         }
-    }
+
+        return buttonOptions;
+    }, [
+        translate,
+        icons.Building,
+        icons.User,
+        selectedReportID,
+        selectedPolicyID,
+        shouldShowBusinessBankAccountOptions,
+        canUseWallet,
+        hasMultiplePolicies,
+        hasSinglePolicy,
+        isPersonalOnlyOption,
+        shouldShowPayElsewhereOption,
+        isInvoiceReport,
+        paymentMethods,
+        personalBankAccountList.length,
+        canUsePersonalBankAccount,
+        activeAdminPolicies,
+        currency,
+        chatReport,
+        getPaymentSubitems,
+        formattedAmount,
+        onlyShowPayElsewhere,
+    ]);
 
     return {
         bulkPayButtonOptions,
diff --git a/src/hooks/useCardFeedsForDisplay.ts b/src/hooks/useCardFeedsForDisplay.ts
index 0248d41d9f6f..ec83214640f2 100644
--- a/src/hooks/useCardFeedsForDisplay.ts
+++ b/src/hooks/useCardFeedsForDisplay.ts
@@ -1,3 +1,4 @@
+import {useMemo} from 'react';
 import type {OnyxCollection} from 'react-native-onyx';
 import {getCardFeedsForDisplay, getCardFeedsForDisplayPerPolicy} from '@libs/CardFeedUtils';
 import {filterPersonalCards, isCustomFeed, mergeCardListWithWorkspaceFeeds} from '@libs/CardUtils';
@@ -26,42 +27,40 @@ const useCardFeedsForDisplay = () => {
         canBeMissing: true,
     });
 
-    const cardFeedsByPolicy = getCardFeedsForDisplayPerPolicy(allFeeds);
+    const cardFeedsByPolicy = useMemo(() => getCardFeedsForDisplayPerPolicy(allFeeds), [allFeeds]);
+
+    const defaultCardFeed = useMemo(() => {
+        if (!eligiblePoliciesIDs) {
+            return undefined;
+        }
 
-    let defaultCardFeed;
-    if (eligiblePoliciesIDs) {
         // Prioritize the active policy if eligible
         if (activePolicyID && eligiblePoliciesIDs.has(activePolicyID)) {
             const policyCardFeeds = cardFeedsByPolicy[activePolicyID];
             if (policyCardFeeds?.length) {
-                defaultCardFeed = policyCardFeeds.sort((a, b) => localeCompare(a.name, b.name)).at(0);
+                return policyCardFeeds.sort((a, b) => localeCompare(a.name, b.name)).at(0);
             }
         }
 
-        if (!defaultCardFeed) {
-            // If the active policy doesn't have card feeds, use the first eligible policy that does
-            for (const eligiblePolicyID of eligiblePoliciesIDs) {
-                const policyCardFeeds = cardFeedsByPolicy[eligiblePolicyID];
-                if (policyCardFeeds?.length) {
-                    defaultCardFeed = policyCardFeeds.sort((a, b) => localeCompare(a.name, b.name)).at(0);
-                    break;
-                }
+        // If the active policy doesn't have card feeds, use the first eligible policy that does
+        for (const eligiblePolicyID of eligiblePoliciesIDs) {
+            const policyCardFeeds = cardFeedsByPolicy[eligiblePolicyID];
+            if (policyCardFeeds?.length) {
+                return policyCardFeeds.sort((a, b) => localeCompare(a.name, b.name)).at(0);
             }
         }
 
-        if (!defaultCardFeed) {
-            // Commercial feeds don't have preferred policies, so we need to include these in the list
-            const commercialFeeds = Object.values(cardFeedsByPolicy)
-                .flat()
-                .filter((feed) => !isCustomFeed(feed.name as CompanyCardFeed));
+        // Commercial feeds don't have preferred policies, so we need to include these in the list
+        const commercialFeeds = Object.values(cardFeedsByPolicy)
+            .flat()
+            .filter((feed) => !isCustomFeed(feed.name as CompanyCardFeed));
 
-            defaultCardFeed = commercialFeeds.sort((a, b) => localeCompare(a.name, b.name)).at(0);
-        }
-    }
+        return commercialFeeds.sort((a, b) => localeCompare(a.name, b.name)).at(0);
+    }, [eligiblePoliciesIDs, activePolicyID, cardFeedsByPolicy, localeCompare]);
 
     const [userCardList] = useOnyx(ONYXKEYS.CARD_LIST, {selector: filterPersonalCards, canBeMissing: true});
     const [workspaceCardFeeds] = useOnyx(ONYXKEYS.COLLECTION.WORKSPACE_CARDS_LIST, {canBeMissing: true});
-    const allCards = mergeCardListWithWorkspaceFeeds(workspaceCardFeeds ?? CONST.EMPTY_OBJECT, userCardList);
+    const allCards = useMemo(() => mergeCardListWithWorkspaceFeeds(workspaceCardFeeds ?? CONST.EMPTY_OBJECT, userCardList), [userCardList, workspaceCardFeeds]);
     const expensifyCards = getCardFeedsForDisplay({}, allCards);
     const defaultExpensifyCard = Object.values(expensifyCards)?.at(0);
 
diff --git a/src/hooks/useCurrencyList.ts b/src/hooks/useCurrencyList.ts
deleted file mode 100644
index 01d89fc95324..000000000000
--- a/src/hooks/useCurrencyList.ts
+++ /dev/null
@@ -1,7 +0,0 @@
-import {useContext} from 'react';
-import type {CurrencyListContextProps} from '@components/CurrencyListContextProvider';
-import {CurrencyListContext} from '@components/CurrencyListContextProvider';
-
-export default function useCurrencyList(): CurrencyListContextProps {
-    return useContext(CurrencyListContext);
-}
diff --git a/src/hooks/useDeleteTransactions.ts b/src/hooks/useDeleteTransactions.ts
index 6cb199928627..c98dbafbe8b2 100644
--- a/src/hooks/useDeleteTransactions.ts
+++ b/src/hooks/useDeleteTransactions.ts
@@ -1,8 +1,7 @@
 import {useCallback} from 'react';
 import type {OnyxCollection} from 'react-native-onyx';
-import {deleteMoneyRequest, getIOURequestPolicyID, initSplitExpenseItemData} from '@libs/actions/IOU';
+import {deleteMoneyRequest, getIOURequestPolicyID, initSplitExpenseItemData, updateSplitTransactions} from '@libs/actions/IOU';
 import {getIOUActionForTransactions} from '@libs/actions/IOU/Duplicate';
-import {updateSplitTransactions} from '@libs/actions/IOU/Split';
 import getNonEmptyStringOnyxID from '@libs/getNonEmptyStringOnyxID';
 import {getOriginalMessage, isMoneyRequestAction} from '@libs/ReportActionsUtils';
 import {getChildTransactions, getOriginalTransactionWithSplitInfo} from '@libs/TransactionUtils';
@@ -37,7 +36,6 @@ function useDeleteTransactions({report, reportActions, policy}: UseDeleteTransac
     const [transactionViolations] = useOnyx(ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS, {canBeMissing: true});
     const [policyRecentlyUsedCurrencies] = useOnyx(ONYXKEYS.RECENTLY_USED_CURRENCIES, {canBeMissing: true});
     const [quickAction] = useOnyx(ONYXKEYS.NVP_QUICK_ACTION_GLOBAL_CREATE, {canBeMissing: true});
-    const [iouReportNextStep] = useOnyx(`${ONYXKEYS.COLLECTION.NEXT_STEP}${getNonEmptyStringOnyxID(report?.reportID)}`, {canBeMissing: true});
 
     const {isBetaEnabled} = usePermissions();
     const archivedReportsIdSet = useArchivedReportsIdSet();
@@ -151,7 +149,6 @@ function useDeleteTransactions({report, reportActions, policy}: UseDeleteTransac
                     transactionViolations,
                     policyRecentlyUsedCurrencies: policyRecentlyUsedCurrencies ?? [],
                     quickAction,
-                    iouReportNextStep,
                 });
             }
 
@@ -176,7 +173,6 @@ function useDeleteTransactions({report, reportActions, policy}: UseDeleteTransac
                     transactionIDsPendingDeletion: deletedTransactionIDs,
                     selectedTransactionIDs: transactionIDs,
                     hash: currentSearchHash,
-                    allTransactionViolationsParam: transactionViolations,
                 });
                 deletedTransactionIDs.push(transactionID);
                 if (action.childReportID) {
@@ -187,21 +183,20 @@ function useDeleteTransactions({report, reportActions, policy}: UseDeleteTransac
             return Array.from(deletedTransactionThreadReportIDs);
         },
         [
+            reportActions,
+            allTransactions,
+            allReports,
+            report,
             allPolicyRecentlyUsedCategories,
             allReportNameValuePairs,
-            allReports,
-            allTransactions,
-            archivedReportsIdSet,
-            currentUserPersonalDetails,
-            iouReportNextStep,
-            isBetaEnabled,
-            policy,
             policyCategories,
+            policy,
+            isBetaEnabled,
+            currentUserPersonalDetails,
+            transactionViolations,
             policyRecentlyUsedCurrencies,
             quickAction,
-            report,
-            reportActions,
-            transactionViolations,
+            archivedReportsIdSet,
         ],
     );
 
diff --git a/src/hooks/useFilterFormValues.tsx b/src/hooks/useFilterFormValues.tsx
index bd355d966b6d..f26fa41f8d2c 100644
--- a/src/hooks/useFilterFormValues.tsx
+++ b/src/hooks/useFilterFormValues.tsx
@@ -6,13 +6,12 @@ import {buildFilterFormValuesFromQuery} from '@libs/SearchQueryUtils';
 import CONST from '@src/CONST';
 import ONYXKEYS from '@src/ONYXKEYS';
 import type {SearchAdvancedFiltersForm} from '@src/types/form';
+import type {CurrencyList} from '@src/types/onyx';
 import {getEmptyObject} from '@src/types/utils/EmptyObject';
-import useCurrencyList from './useCurrencyList';
 import useOnyx from './useOnyx';
 
 const useFilterFormValues = (queryJSON?: SearchQueryJSON) => {
     const personalDetails = usePersonalDetails();
-    const {currencyList} = useCurrencyList();
 
     const [userCardList] = useOnyx(ONYXKEYS.CARD_LIST, {canBeMissing: true});
     const [policies] = useOnyx(ONYXKEYS.COLLECTION.POLICY, {canBeMissing: true});
@@ -20,6 +19,7 @@ const useFilterFormValues = (queryJSON?: SearchQueryJSON) => {
     const [policyTagsLists] = useOnyx(ONYXKEYS.COLLECTION.POLICY_TAGS, {canBeMissing: true});
     const [policyCategories] = useOnyx(ONYXKEYS.COLLECTION.POLICY_CATEGORIES, {canBeMissing: true});
     const [workspaceCardFeeds] = useOnyx(ONYXKEYS.COLLECTION.WORKSPACE_CARDS_LIST, {canBeMissing: true});
+    const [currencyList = getEmptyObject<CurrencyList>()] = useOnyx(ONYXKEYS.CURRENCY_LIST, {canBeMissing: true});
 
     const taxRates = getAllTaxRates(policies);
     const allCards = mergeCardListWithWorkspaceFeeds(workspaceCardFeeds ?? CONST.EMPTY_OBJECT, userCardList);
diff --git a/src/hooks/useIndicatorStatus.ts b/src/hooks/useIndicatorStatus.ts
index 3d5fc0021f53..17b3cf6ba191 100644
--- a/src/hooks/useIndicatorStatus.ts
+++ b/src/hooks/useIndicatorStatus.ts
@@ -1,8 +1,19 @@
+import {useMemo} from 'react';
 import type {ValueOf} from 'type-fest';
-import type CONST from '@src/CONST';
-import useNavigationTabBarIndicatorChecks from './useNavigationTabBarIndicatorChecks';
+import {isConnectionInProgress} from '@libs/actions/connections';
+import {shouldShowQBOReimbursableExportDestinationAccountError} from '@libs/actions/connections/QuickbooksOnline';
+import {hasPaymentMethodError} from '@libs/actions/PaymentMethods';
+import {checkIfFeedConnectionIsBroken, hasPendingExpensifyCardAction} from '@libs/CardUtils';
+import {shouldShowCustomUnitsError, shouldShowEmployeeListError, shouldShowPolicyError, shouldShowSyncError} from '@libs/PolicyUtils';
+import {hasSubscriptionGreenDotInfo, hasSubscriptionRedDotError} from '@libs/SubscriptionUtils';
+import {hasLoginListError, hasLoginListInfo} from '@libs/UserUtils';
+import CONST from '@src/CONST';
+import ONYXKEYS from '@src/ONYXKEYS';
+import useOnyx from './useOnyx';
 import useTheme from './useTheme';
 
+type IndicatorStatus = ValueOf<typeof CONST.INDICATOR_STATUS>;
+
 type IndicatorStatusResult = {
     indicatorColor: string;
     status: ValueOf<typeof CONST.INDICATOR_STATUS> | undefined;
@@ -11,14 +22,84 @@ type IndicatorStatusResult = {
 
 function useIndicatorStatus(): IndicatorStatusResult {
     const theme = useTheme();
+    const [allConnectionSyncProgresses] = useOnyx(ONYXKEYS.COLLECTION.POLICY_CONNECTION_SYNC_PROGRESS, {canBeMissing: true});
+    const [policies] = useOnyx(ONYXKEYS.COLLECTION.POLICY, {canBeMissing: true});
+    const [bankAccountList] = useOnyx(ONYXKEYS.BANK_ACCOUNT_LIST, {canBeMissing: true});
+    const [reimbursementAccount] = useOnyx(ONYXKEYS.REIMBURSEMENT_ACCOUNT, {canBeMissing: true});
+    const [fundList] = useOnyx(ONYXKEYS.FUND_LIST, {canBeMissing: true});
+    const [userWallet] = useOnyx(ONYXKEYS.USER_WALLET, {canBeMissing: true});
+    const [walletTerms] = useOnyx(ONYXKEYS.WALLET_TERMS, {canBeMissing: true});
+    const [loginList] = useOnyx(ONYXKEYS.LOGIN_LIST, {canBeMissing: true});
+    const [privatePersonalDetails] = useOnyx(ONYXKEYS.PRIVATE_PERSONAL_DETAILS, {canBeMissing: true});
+    const [allCards] = useOnyx(`${ONYXKEYS.CARD_LIST}`, {canBeMissing: true});
+    const [stripeCustomerId] = useOnyx(ONYXKEYS.NVP_PRIVATE_STRIPE_CUSTOMER_ID, {canBeMissing: true});
+    const [retryBillingSuccessful] = useOnyx(ONYXKEYS.SUBSCRIPTION_RETRY_BILLING_STATUS_SUCCESSFUL, {canBeMissing: true});
+    const [billingDisputePending] = useOnyx(ONYXKEYS.NVP_PRIVATE_BILLING_DISPUTE_PENDING, {canBeMissing: true});
+    const [retryBillingFailed] = useOnyx(ONYXKEYS.SUBSCRIPTION_RETRY_BILLING_STATUS_FAILED, {canBeMissing: true});
+    const [billingStatus] = useOnyx(ONYXKEYS.NVP_PRIVATE_BILLING_STATUS, {canBeMissing: true});
+    const hasBrokenFeedConnection = checkIfFeedConnectionIsBroken(allCards, CONST.EXPENSIFY_CARD.BANK);
+    const [session] = useOnyx(ONYXKEYS.SESSION, {canBeMissing: true});
+
+    // If a policy was just deleted from Onyx, then Onyx will pass a null value to the props, and
+    // those should be cleaned out before doing any error checking
+    const cleanPolicies = useMemo(() => Object.fromEntries(Object.entries(policies ?? {}).filter(([, policy]) => policy?.id)), [policies]);
+
+    const policyErrors = {
+        [CONST.INDICATOR_STATUS.HAS_POLICY_ERRORS]: Object.values(cleanPolicies).find(shouldShowPolicyError),
+        [CONST.INDICATOR_STATUS.HAS_CUSTOM_UNITS_ERROR]: Object.values(cleanPolicies).find(shouldShowCustomUnitsError),
+        [CONST.INDICATOR_STATUS.HAS_EMPLOYEE_LIST_ERROR]: Object.values(cleanPolicies).find(shouldShowEmployeeListError),
+        [CONST.INDICATOR_STATUS.HAS_SYNC_ERRORS]: Object.values(cleanPolicies).find((cleanPolicy) =>
+            shouldShowSyncError(cleanPolicy, isConnectionInProgress(allConnectionSyncProgresses?.[`${ONYXKEYS.COLLECTION.POLICY_CONNECTION_SYNC_PROGRESS}${cleanPolicy?.id}`], cleanPolicy)),
+        ),
+        [CONST.INDICATOR_STATUS.HAS_QBO_EXPORT_ERROR]: Object.values(cleanPolicies).find(shouldShowQBOReimbursableExportDestinationAccountError),
+    };
 
-    const {accountStatus, infoStatus, policyStatus, policyIDWithErrors} = useNavigationTabBarIndicatorChecks();
+    // All of the error & info-checking methods are put into an array. This is so that using _.some() will return
+    // early as soon as the first error / info condition is returned. This makes the checks very efficient since
+    // we only care if a single error / info condition exists anywhere.
+    const errorChecking: Partial<Record<IndicatorStatus, boolean>> = {
+        [CONST.INDICATOR_STATUS.HAS_USER_WALLET_ERRORS]: Object.keys(userWallet?.errors ?? {}).length > 0,
+        [CONST.INDICATOR_STATUS.HAS_PAYMENT_METHOD_ERROR]: hasPaymentMethodError(bankAccountList, fundList, allCards),
+        ...(Object.fromEntries(Object.entries(policyErrors).map(([error, policy]) => [error, !!policy])) as Record<keyof typeof policyErrors, boolean>),
+        [CONST.INDICATOR_STATUS.HAS_SUBSCRIPTION_ERRORS]: hasSubscriptionRedDotError(
+            stripeCustomerId,
+            retryBillingSuccessful,
+            billingDisputePending,
+            retryBillingFailed,
+            fundList,
+            billingStatus,
+        ),
+        [CONST.INDICATOR_STATUS.HAS_REIMBURSEMENT_ACCOUNT_ERRORS]: Object.keys(reimbursementAccount?.errors ?? {}).length > 0,
+        [CONST.INDICATOR_STATUS.HAS_LOGIN_LIST_ERROR]: !!loginList && hasLoginListError(loginList),
+        // Wallet term errors that are not caused by an IOU (we show the red brick indicator for those in the LHN instead)
+        [CONST.INDICATOR_STATUS.HAS_WALLET_TERMS_ERRORS]: Object.keys(walletTerms?.errors ?? {}).length > 0 && !walletTerms?.chatReportID,
+        [CONST.INDICATOR_STATUS.HAS_CARD_CONNECTION_ERROR]: hasBrokenFeedConnection,
+        [CONST.INDICATOR_STATUS.HAS_PHONE_NUMBER_ERROR]: !!privatePersonalDetails?.errorFields?.phoneNumber,
+    };
 
-    const errorStatus = accountStatus ?? policyStatus;
-    const status = errorStatus ?? infoStatus;
-    const indicatorColor = errorStatus ? theme.danger : theme.success;
+    const infoChecking: Partial<Record<IndicatorStatus, boolean>> = {
+        [CONST.INDICATOR_STATUS.HAS_LOGIN_LIST_INFO]: !!loginList && hasLoginListInfo(loginList, session?.email),
+        [CONST.INDICATOR_STATUS.HAS_SUBSCRIPTION_INFO]: hasSubscriptionGreenDotInfo(
+            stripeCustomerId,
+            retryBillingSuccessful,
+            billingDisputePending,
+            retryBillingFailed,
+            fundList,
+            billingStatus,
+        ),
+        [CONST.INDICATOR_STATUS.HAS_PENDING_CARD_INFO]: hasPendingExpensifyCardAction(allCards, privatePersonalDetails),
+    };
+
+    const [error] = Object.entries(errorChecking).find(([, value]) => value) ?? [];
+    const [info] = Object.entries(infoChecking).find(([, value]) => value) ?? [];
+
+    const status = (error ?? info) as IndicatorStatus | undefined;
+    const policyIDWithErrors = Object.values(policyErrors).find(Boolean)?.id;
+    const indicatorColor = error ? theme.danger : theme.success;
 
     return {indicatorColor, status, policyIDWithErrors};
 }
 
 export default useIndicatorStatus;
+
+export type {IndicatorStatus};
diff --git a/src/hooks/useIsPaidPolicyAdmin.ts b/src/hooks/useIsPaidPolicyAdmin.ts
index dcbef1526eaf..fcdfdc8e11dc 100644
--- a/src/hooks/useIsPaidPolicyAdmin.ts
+++ b/src/hooks/useIsPaidPolicyAdmin.ts
@@ -1,3 +1,4 @@
+import {useCallback} from 'react';
 import type {OnyxCollection} from 'react-native-onyx';
 import {isPaidGroupPolicy, isPolicyAdmin} from '@libs/PolicyUtils';
 import ONYXKEYS from '@src/ONYXKEYS';
@@ -11,9 +12,12 @@ import useOnyx from './useOnyx';
 function useIsPaidPolicyAdmin() {
     const currentUserPersonalDetails = useCurrentUserPersonalDetails();
 
-    const isUserPaidPolicyAdminSelector = (policies: OnyxCollection<Policy>) => {
-        return Object.values(policies ?? {}).some((policy) => isPaidGroupPolicy(policy) && isPolicyAdmin(policy, currentUserPersonalDetails.login));
-    };
+    const isUserPaidPolicyAdminSelector = useCallback(
+        (policies: OnyxCollection<Policy>) => {
+            return Object.values(policies ?? {}).some((policy) => isPaidGroupPolicy(policy) && isPolicyAdmin(policy, currentUserPersonalDetails.login));
+        },
+        [currentUserPersonalDetails?.login],
+    );
 
     const [isCurrentUserPolicyAdmin = false] = useOnyx(ONYXKEYS.COLLECTION.POLICY, {
         canBeMissing: true,
diff --git a/src/hooks/useMergeTransactions.ts b/src/hooks/useMergeTransactions.ts
index b82f1afcb742..d33eb28b3f80 100644
--- a/src/hooks/useMergeTransactions.ts
+++ b/src/hooks/useMergeTransactions.ts
@@ -2,6 +2,7 @@ import type {OnyxEntry} from 'react-native-onyx';
 import {useSearchContext} from '@components/Search/SearchContext';
 import getNonEmptyStringOnyxID from '@libs/getNonEmptyStringOnyxID';
 import {getTransactionFromMergeTransaction} from '@libs/MergeTransactionUtils';
+import CONST from '@src/CONST';
 import ONYXKEYS from '@src/ONYXKEYS';
 import type {MergeTransaction, Report, SearchResults, Transaction} from '@src/types/onyx';
 import useOnyx from './useOnyx';
@@ -36,7 +37,9 @@ function getTransaction(
 }
 
 function useMergeTransactions({mergeTransaction}: UseMergeTransactionsProps): UseMergeTransactionsReturn {
-    const {currentSearchHash, currentSearchResults} = useSearchContext();
+    const searchContext = useSearchContext();
+    const searchHash = searchContext?.currentSearchHash ?? CONST.DEFAULT_NUMBER_ID;
+    const [currentSearchResults] = useOnyx(`${ONYXKEYS.COLLECTION.SNAPSHOT}${searchHash}`, {canBeMissing: true});
 
     const [onyxTargetTransaction] = useOnyx(`${ONYXKEYS.COLLECTION.TRANSACTION}${getNonEmptyStringOnyxID(mergeTransaction?.targetTransactionID)}`, {
         canBeMissing: true,
@@ -56,7 +59,7 @@ function useMergeTransactions({mergeTransaction}: UseMergeTransactionsProps): Us
     });
 
     // If we're on search and main collection reports are not available, get them from the search snapshot
-    if (currentSearchHash && currentSearchResults?.data) {
+    if (searchHash && currentSearchResults?.data) {
         targetTransactionReport = targetTransactionReport ?? currentSearchResults?.data[`${ONYXKEYS.COLLECTION.REPORT}${targetTransaction?.reportID}`];
         sourceTransactionReport = sourceTransactionReport ?? currentSearchResults?.data[`${ONYXKEYS.COLLECTION.REPORT}${sourceTransaction?.reportID}`];
     }
diff --git a/src/hooks/useMultipleSnapshots.ts b/src/hooks/useMultipleSnapshots.ts
deleted file mode 100644
index c6b6ee28cdf8..000000000000
--- a/src/hooks/useMultipleSnapshots.ts
+++ /dev/null
@@ -1,42 +0,0 @@
-import {useMemo} from 'react';
-import type {OnyxCollection} from 'react-native-onyx';
-import ONYXKEYS from '@src/ONYXKEYS';
-import type {SearchResults} from '@src/types/onyx';
-import {getEmptyObject} from '@src/types/utils/EmptyObject';
-import useOnyx from './useOnyx';
-
-type SnapshotMap = Record<string, SearchResults>;
-
-/**
- * Hook to subscribe to multiple search snapshots by their hashes.
- * Returns an object mapping each hash to its corresponding SearchResults.
- */
-function useMultipleSnapshots(hashes: string[]): SnapshotMap {
-    const selector = useMemo(() => {
-        return (snapshots: OnyxCollection<SearchResults>): SnapshotMap => {
-            if (!snapshots || hashes.length === 0) {
-                return {};
-            }
-
-            const result: SnapshotMap = {};
-            for (const hash of hashes) {
-                const snapshot = snapshots[`${ONYXKEYS.COLLECTION.SNAPSHOT}${hash}`];
-                if (snapshot) {
-                    result[hash] = snapshot;
-                }
-            }
-            return result;
-        };
-    }, [hashes]);
-
-    const [snapshotMap = getEmptyObject<SnapshotMap>()] = useOnyx(ONYXKEYS.COLLECTION.SNAPSHOT, {
-        canBeMissing: true,
-        selector,
-    });
-
-    return snapshotMap;
-}
-
-export type {SnapshotMap};
-
-export default useMultipleSnapshots;
diff --git a/src/hooks/useNavigationTabBarIndicatorChecks.ts b/src/hooks/useNavigationTabBarIndicatorChecks.ts
deleted file mode 100644
index 16448379a732..000000000000
--- a/src/hooks/useNavigationTabBarIndicatorChecks.ts
+++ /dev/null
@@ -1,111 +0,0 @@
-import type {ValueOf} from 'type-fest';
-import {isConnectionInProgress} from '@libs/actions/connections';
-import {shouldShowQBOReimbursableExportDestinationAccountError} from '@libs/actions/connections/QuickbooksOnline';
-import {hasPaymentMethodError} from '@libs/actions/PaymentMethods';
-import {hasPartiallySetupBankAccount} from '@libs/BankAccountUtils';
-import {checkIfFeedConnectionIsBroken, hasPendingExpensifyCardAction} from '@libs/CardUtils';
-import {getUberConnectionErrorDirectlyFromPolicy, shouldShowCustomUnitsError, shouldShowEmployeeListError, shouldShowPolicyError, shouldShowSyncError} from '@libs/PolicyUtils';
-import {hasSubscriptionGreenDotInfo, hasSubscriptionRedDotError} from '@libs/SubscriptionUtils';
-import {hasLoginListError, hasLoginListInfo} from '@libs/UserUtils';
-import CONST from '@src/CONST';
-import ONYXKEYS from '@src/ONYXKEYS';
-import type {Policy} from '@src/types/onyx';
-import useOnyx from './useOnyx';
-
-type IndicatorStatus = ValueOf<typeof CONST.INDICATOR_STATUS>;
-
-type NavigationTabBarChecksResult = {
-    accountStatus: IndicatorStatus | undefined;
-    policyStatus: IndicatorStatus | undefined;
-    infoStatus: IndicatorStatus | undefined;
-    policyIDWithErrors: string | undefined;
-};
-
-function useNavigationTabBarIndicatorChecks(): NavigationTabBarChecksResult {
-    const [allConnectionSyncProgresses] = useOnyx(ONYXKEYS.COLLECTION.POLICY_CONNECTION_SYNC_PROGRESS, {canBeMissing: true});
-    const [policies] = useOnyx(ONYXKEYS.COLLECTION.POLICY, {canBeMissing: true});
-    const [bankAccountList] = useOnyx(ONYXKEYS.BANK_ACCOUNT_LIST, {canBeMissing: true});
-    const [reimbursementAccount] = useOnyx(ONYXKEYS.REIMBURSEMENT_ACCOUNT, {canBeMissing: true});
-    const [fundList] = useOnyx(ONYXKEYS.FUND_LIST, {canBeMissing: true});
-    const [userWallet] = useOnyx(ONYXKEYS.USER_WALLET, {canBeMissing: true});
-    const [walletTerms] = useOnyx(ONYXKEYS.WALLET_TERMS, {canBeMissing: true});
-    const [loginList] = useOnyx(ONYXKEYS.LOGIN_LIST, {canBeMissing: true});
-    const [privatePersonalDetails] = useOnyx(ONYXKEYS.PRIVATE_PERSONAL_DETAILS, {canBeMissing: true});
-    const [allCards] = useOnyx(`${ONYXKEYS.CARD_LIST}`, {canBeMissing: true});
-    const [stripeCustomerId] = useOnyx(ONYXKEYS.NVP_PRIVATE_STRIPE_CUSTOMER_ID, {canBeMissing: true});
-    const [retryBillingSuccessful] = useOnyx(ONYXKEYS.SUBSCRIPTION_RETRY_BILLING_STATUS_SUCCESSFUL, {canBeMissing: true});
-    const [billingDisputePending] = useOnyx(ONYXKEYS.NVP_PRIVATE_BILLING_DISPUTE_PENDING, {canBeMissing: true});
-    const [retryBillingFailed] = useOnyx(ONYXKEYS.SUBSCRIPTION_RETRY_BILLING_STATUS_FAILED, {canBeMissing: true});
-    const [billingStatus] = useOnyx(ONYXKEYS.NVP_PRIVATE_BILLING_STATUS, {canBeMissing: true});
-    const [session] = useOnyx(ONYXKEYS.SESSION, {canBeMissing: true});
-
-    const hasBrokenFeedConnection = checkIfFeedConnectionIsBroken(allCards, CONST.EXPENSIFY_CARD.BANK);
-
-    // If a policy was just deleted from Onyx, then Onyx will pass a null value to the props, and
-    // those should be cleaned out before doing any error checking
-    const cleanPolicies = Object.values(policies ?? {}).filter((policy) => policy?.id);
-
-    const policyChecks: Partial<Record<IndicatorStatus, Policy | undefined>> = {
-        [CONST.INDICATOR_STATUS.HAS_POLICY_ERRORS]: cleanPolicies.find(shouldShowPolicyError),
-        [CONST.INDICATOR_STATUS.HAS_CUSTOM_UNITS_ERROR]: cleanPolicies.find(shouldShowCustomUnitsError),
-        [CONST.INDICATOR_STATUS.HAS_EMPLOYEE_LIST_ERROR]: cleanPolicies.find(shouldShowEmployeeListError),
-        [CONST.INDICATOR_STATUS.HAS_SYNC_ERRORS]: cleanPolicies.find((cleanPolicy) =>
-            shouldShowSyncError(cleanPolicy, isConnectionInProgress(allConnectionSyncProgresses?.[`${ONYXKEYS.COLLECTION.POLICY_CONNECTION_SYNC_PROGRESS}${cleanPolicy?.id}`], cleanPolicy)),
-        ),
-        [CONST.INDICATOR_STATUS.HAS_QBO_EXPORT_ERROR]: cleanPolicies.find(shouldShowQBOReimbursableExportDestinationAccountError),
-        [CONST.INDICATOR_STATUS.HAS_UBER_CREDENTIALS_ERROR]: cleanPolicies.find(getUberConnectionErrorDirectlyFromPolicy),
-    };
-
-    // All the error & info-checking methods are put into an array. This is so that using _.some() will return
-    // early as soon as the first error / info condition is returned. This makes the checks very efficient since
-    // we only care if a single error / info condition exists anywhere.
-    const accountChecks: Partial<Record<IndicatorStatus, boolean>> = {
-        [CONST.INDICATOR_STATUS.HAS_USER_WALLET_ERRORS]: Object.keys(userWallet?.errors ?? {}).length > 0,
-        [CONST.INDICATOR_STATUS.HAS_PAYMENT_METHOD_ERROR]: hasPaymentMethodError(bankAccountList, fundList, allCards),
-        [CONST.INDICATOR_STATUS.HAS_SUBSCRIPTION_ERRORS]: hasSubscriptionRedDotError(
-            stripeCustomerId,
-            retryBillingSuccessful,
-            billingDisputePending,
-            retryBillingFailed,
-            fundList,
-            billingStatus,
-        ),
-        [CONST.INDICATOR_STATUS.HAS_REIMBURSEMENT_ACCOUNT_ERRORS]: Object.keys(reimbursementAccount?.errors ?? {}).length > 0,
-        [CONST.INDICATOR_STATUS.HAS_LOGIN_LIST_ERROR]: !!loginList && hasLoginListError(loginList),
-        // Wallet term errors that are not caused by an IOU (we show the red brick indicator for those in the LHN instead)
-        [CONST.INDICATOR_STATUS.HAS_WALLET_TERMS_ERRORS]: Object.keys(walletTerms?.errors ?? {}).length > 0 && !walletTerms?.chatReportID,
-        [CONST.INDICATOR_STATUS.HAS_PHONE_NUMBER_ERROR]: !!privatePersonalDetails?.errorFields?.phoneNumber,
-        [CONST.INDICATOR_STATUS.HAS_CARD_CONNECTION_ERROR]: hasBrokenFeedConnection,
-    };
-
-    const infoChecks: Partial<Record<IndicatorStatus, boolean>> = {
-        [CONST.INDICATOR_STATUS.HAS_LOGIN_LIST_INFO]: !!loginList && hasLoginListInfo(loginList, session?.email),
-        [CONST.INDICATOR_STATUS.HAS_PENDING_CARD_INFO]: hasPendingExpensifyCardAction(allCards, privatePersonalDetails),
-        [CONST.INDICATOR_STATUS.HAS_SUBSCRIPTION_INFO]: hasSubscriptionGreenDotInfo(
-            stripeCustomerId,
-            retryBillingSuccessful,
-            billingDisputePending,
-            retryBillingFailed,
-            fundList,
-            billingStatus,
-        ),
-        [CONST.INDICATOR_STATUS.HAS_PARTIALLY_SETUP_BANK_ACCOUNT_INFO]: hasPartiallySetupBankAccount(bankAccountList),
-    };
-
-    const [accountStatus] = Object.entries(accountChecks).find(([, value]) => value) ?? [];
-    const [policyStatus] = Object.entries(policyChecks).find(([, value]) => value) ?? [];
-    const [infoStatus] = Object.entries(infoChecks).find(([, value]) => value) ?? [];
-
-    const policyIDWithErrors = Object.values(policyChecks).find(Boolean)?.id;
-
-    return {
-        accountStatus: accountStatus as IndicatorStatus | undefined,
-        policyStatus: policyStatus as IndicatorStatus | undefined,
-        infoStatus: infoStatus as IndicatorStatus | undefined,
-        policyIDWithErrors,
-    };
-}
-
-export default useNavigationTabBarIndicatorChecks;
-
-export type {IndicatorStatus};
diff --git a/src/hooks/useOnboardingFlow.ts b/src/hooks/useOnboardingFlow.ts
index 5b3009214593..2f1134ffd8a8 100644
--- a/src/hooks/useOnboardingFlow.ts
+++ b/src/hooks/useOnboardingFlow.ts
@@ -38,6 +38,7 @@ function useOnboardingFlowRouter() {
     const [sessionEmail] = useOnyx(ONYXKEYS.SESSION, {canBeMissing: true, selector: emailSelector});
     const isLoggingInAsNewSessionUser = isLoggingInAsNewUser(currentUrl, sessionEmail);
     const startedOnboardingFlowRef = useRef(false);
+    const started2FAFlowRef = useRef(false);
     const [tryNewDot, tryNewDotMetadata] = useOnyx(ONYXKEYS.NVP_TRY_NEW_DOT, {
         selector: tryNewDotOnyxSelector,
         canBeMissing: true,
@@ -78,6 +79,16 @@ function useOnboardingFlowRouter() {
                 return;
             }
 
+            if (shouldShowRequire2FAPage) {
+                if (started2FAFlowRef.current) {
+                    startedOnboardingFlowRef.current = false;
+                    return;
+                }
+                started2FAFlowRef.current = true;
+                Navigation.navigate(ROUTES.REQUIRE_TWO_FACTOR_AUTH);
+                return;
+            }
+
             if (hasBeenAddedToNudgeMigration && !isProductTrainingElementDismissed('migratedUserWelcomeModal', dismissedProductTraining)) {
                 const navigationState = navigationRef.getRootState();
                 const lastRoute = navigationState.routes.at(-1);
@@ -162,6 +173,7 @@ function useOnboardingFlowRouter() {
         currentOnboardingPurposeSelected,
         onboardingInitialPath,
         isOnboardingLoading,
+        shouldShowRequire2FAPage,
     ]);
 
     return {
diff --git a/src/hooks/useOutstandingReports.ts b/src/hooks/useOutstandingReports.ts
deleted file mode 100644
index 1ce5855d8b7d..000000000000
--- a/src/hooks/useOutstandingReports.ts
+++ /dev/null
@@ -1,46 +0,0 @@
-import type {OnyxCollection, OnyxEntry} from 'react-native-onyx';
-import {getOutstandingReportsForUser, isSelfDM} from '@libs/ReportUtils';
-import CONST from '@src/CONST';
-import ONYXKEYS from '@src/ONYXKEYS';
-import {createPoliciesSelector} from '@src/selectors/Policy';
-import type {Policy} from '@src/types/onyx';
-import {isEmptyObject} from '@src/types/utils/EmptyObject';
-import useOnyx from './useOnyx';
-
-const policyIdSelector = (policy: OnyxEntry<Policy>) => policy?.id;
-
-const policiesSelector = (policies: OnyxCollection<Policy>) => createPoliciesSelector(policies, policyIdSelector);
-
-export default function useOutstandingReports(selectedReportID: string | undefined, selectedPolicyID: string | undefined, ownerAccountID: number | undefined, isEditing: boolean) {
-    const [outstandingReportsByPolicyID] = useOnyx(ONYXKEYS.DERIVED.OUTSTANDING_REPORTS_BY_POLICY_ID, {canBeMissing: true});
-    const [personalPolicyID] = useOnyx(ONYXKEYS.PERSONAL_POLICY_ID, {canBeMissing: true});
-    const [allPoliciesID] = useOnyx(ONYXKEYS.COLLECTION.POLICY, {selector: policiesSelector, canBeMissing: false});
-    const [reportNameValuePairs] = useOnyx(ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS, {canBeMissing: true});
-    const [selectedReport] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${selectedReportID}`, {canBeMissing: true});
-
-    // Early return if no reports are available to prevent useless loop
-    if (!outstandingReportsByPolicyID || isEmptyObject(outstandingReportsByPolicyID)) {
-        return [];
-    }
-
-    if (!selectedPolicyID || selectedPolicyID === personalPolicyID || isSelfDM(selectedReport)) {
-        return Object.values(allPoliciesID ?? {})
-            .filter((policyID) => personalPolicyID !== policyID)
-            .flatMap((policyID) => {
-                if (!policyID) {
-                    return [];
-                }
-                const reports = getOutstandingReportsForUser(
-                    policyID,
-                    ownerAccountID,
-                    outstandingReportsByPolicyID?.[policyID ?? CONST.DEFAULT_NUMBER_ID] ?? {},
-                    reportNameValuePairs,
-                    isEditing,
-                );
-
-                return reports;
-            });
-    }
-
-    return getOutstandingReportsForUser(selectedPolicyID, ownerAccountID, outstandingReportsByPolicyID?.[selectedPolicyID ?? CONST.DEFAULT_NUMBER_ID] ?? {}, reportNameValuePairs, isEditing);
-}
diff --git a/src/hooks/usePaymentOptions.ts b/src/hooks/usePaymentOptions.ts
index a397cf284bcc..c260240d767d 100644
--- a/src/hooks/usePaymentOptions.ts
+++ b/src/hooks/usePaymentOptions.ts
@@ -68,11 +68,10 @@ function usePaymentOptions({
     // The app would crash due to subscribing to the entire report collection if chatReportID is an empty string. So we should have a fallback ID here.
     // eslint-disable-next-line rulesdir/no-default-id-values
     const [chatReport] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${chatReportID || CONST.DEFAULT_NUMBER_ID}`, {canBeMissing: true});
-    const [conciergeReportID = ''] = useOnyx(ONYXKEYS.CONCIERGE_REPORT_ID, {canBeMissing: true});
     const [userWallet] = useOnyx(ONYXKEYS.USER_WALLET, {canBeMissing: true});
     const hasActivatedWallet = ([CONST.WALLET.TIER_NAME.GOLD, CONST.WALLET.TIER_NAME.PLATINUM] as string[]).includes(userWallet?.tierName ?? '');
     const policyEmployeeAccountIDs = getPolicyEmployeeAccountIDs(policy, accountID);
-    const reportBelongsToWorkspace = policyID ? doesReportBelongToWorkspace(chatReport, policyEmployeeAccountIDs, policyID, conciergeReportID) : false;
+    const reportBelongsToWorkspace = policyID ? doesReportBelongToWorkspace(chatReport, policyEmployeeAccountIDs, policyID) : false;
     const policyIDKey = reportBelongsToWorkspace ? policyID : CONST.POLICY.ID_FAKE;
     const lastPaymentMethodSelector = useCallback(
         (paymentMethod: OnyxEntry<LastPaymentMethod>) => {
diff --git a/src/hooks/usePolicyForTransaction.ts b/src/hooks/usePolicyForTransaction.ts
deleted file mode 100644
index 31f33c9b5c81..000000000000
--- a/src/hooks/usePolicyForTransaction.ts
+++ /dev/null
@@ -1,39 +0,0 @@
-import type {OnyxEntry} from 'react-native-onyx';
-import {isExpenseUnreported} from '@libs/TransactionUtils';
-import CONST from '@src/CONST';
-import ONYXKEYS from '@src/ONYXKEYS';
-import type {Policy, Report, Transaction} from '@src/types/onyx';
-import useOnyx from './useOnyx';
-import usePolicyForMovingExpenses from './usePolicyForMovingExpenses';
-
-type UsePolicyForTransactionParams = {
-    /** The transaction to determine the policy for */
-    transaction: OnyxEntry<Transaction>;
-
-    /** The report associated with the transaction */
-    report: OnyxEntry<Report>;
-
-    /** The current action being performed */
-    action: string;
-
-    /** The type of IOU (split, track, submit, etc.) */
-    iouType: string;
-};
-
-type UsePolicyForTransactionResult = {
-    /** The policy to use for the transaction */
-    policy: OnyxEntry<Policy>;
-};
-
-function usePolicyForTransaction({transaction, report, action, iouType}: UsePolicyForTransactionParams): UsePolicyForTransactionResult {
-    const {policyForMovingExpenses} = usePolicyForMovingExpenses();
-    const isUnreportedExpense = isExpenseUnreported(transaction);
-    const isCreatingTrackExpense = action === CONST.IOU.ACTION.CREATE && iouType === CONST.IOU.TYPE.TRACK;
-
-    const [reportPolicy] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY}${report?.policyID}`, {canBeMissing: true});
-    const policy = isUnreportedExpense || isCreatingTrackExpense ? policyForMovingExpenses : reportPolicy;
-
-    return {policy};
-}
-
-export default usePolicyForTransaction;
diff --git a/src/hooks/usePrivateIsArchivedMap.ts b/src/hooks/usePrivateIsArchivedMap.ts
deleted file mode 100644
index 2a325ad474ca..000000000000
--- a/src/hooks/usePrivateIsArchivedMap.ts
+++ /dev/null
@@ -1,20 +0,0 @@
-import type {PrivateIsArchivedMap} from '@selectors/ReportNameValuePairs';
-import {privateIsArchivedMapSelector} from '@selectors/ReportNameValuePairs';
-import ONYXKEYS from '@src/ONYXKEYS';
-import {getEmptyObject} from '@src/types/utils/EmptyObject';
-import useDeepCompareRef from './useDeepCompareRef';
-import useOnyx from './useOnyx';
-
-/**
- * Hook that returns a map of report IDs to their private_isArchived values
- */
-function usePrivateIsArchivedMap(): PrivateIsArchivedMap {
-    const [privateIsArchivedMap = getEmptyObject<PrivateIsArchivedMap>()] = useOnyx(ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS, {
-        canBeMissing: true,
-        selector: privateIsArchivedMapSelector,
-    });
-
-    return useDeepCompareRef(privateIsArchivedMap) ?? {};
-}
-
-export default usePrivateIsArchivedMap;
diff --git a/src/hooks/useResponsiveLayoutOnWideRHP/index.native.ts b/src/hooks/useResponsiveLayoutOnWideRHP/index.native.ts
deleted file mode 100644
index 505b966964c1..000000000000
--- a/src/hooks/useResponsiveLayoutOnWideRHP/index.native.ts
+++ /dev/null
@@ -1,13 +0,0 @@
-import useResponsiveLayout from '@hooks/useResponsiveLayout';
-import type ResponsiveLayoutOnWideRHPResult from './types';
-
-// Super Wide and Wide RHPs are not displayed on native platforms.
-export default function useResponsiveLayoutOnWideRHP(): ResponsiveLayoutOnWideRHPResult {
-    const responsiveLayoutValues = useResponsiveLayout();
-
-    return {
-        ...responsiveLayoutValues,
-        isWideRHPDisplayedOnWideLayout: false,
-        isSuperWideRHPDisplayedOnWideLayout: false,
-    };
-}
diff --git a/src/hooks/useResponsiveLayoutOnWideRHP/index.ts b/src/hooks/useResponsiveLayoutOnWideRHP/index.ts
deleted file mode 100644
index 8919d15bdfe6..000000000000
--- a/src/hooks/useResponsiveLayoutOnWideRHP/index.ts
+++ /dev/null
@@ -1,33 +0,0 @@
-import {useRoute} from '@react-navigation/native';
-import {useContext} from 'react';
-import {WideRHPContext} from '@components/WideRHPContextProvider';
-import useResponsiveLayout from '@hooks/useResponsiveLayout';
-import type ResponsiveLayoutOnWideRHPResult from './types';
-
-/**
- * useResponsiveLayoutOnWideRHP is a wrapper on useResponsiveLayout. shouldUseNarrowLayout on a wide screen is true when the screen is displayed in RHP.
- * In this hook this value is modified when the screen is displayed in Wide/Super Wide RHP, then in wide screen this value is false.
- */
-export default function useResponsiveLayoutOnWideRHP(): ResponsiveLayoutOnWideRHPResult {
-    const route = useRoute();
-
-    const responsiveLayoutValues = useResponsiveLayout();
-
-    // eslint-disable-next-line rulesdir/prefer-shouldUseNarrowLayout-instead-of-isSmallScreenWidth
-    const {isSmallScreenWidth, isInNarrowPaneModal} = responsiveLayoutValues;
-
-    const {superWideRHPRouteKeys, wideRHPRouteKeys} = useContext(WideRHPContext);
-
-    const isWideRHPDisplayedOnWideLayout = !isSmallScreenWidth && wideRHPRouteKeys.includes(route?.key);
-
-    const isSuperWideRHPDisplayedOnWideLayout = !isSmallScreenWidth && superWideRHPRouteKeys.includes(route?.key);
-
-    const shouldUseNarrowLayout = (isSmallScreenWidth || isInNarrowPaneModal) && !isSuperWideRHPDisplayedOnWideLayout && !isWideRHPDisplayedOnWideLayout;
-
-    return {
-        ...responsiveLayoutValues,
-        shouldUseNarrowLayout,
-        isWideRHPDisplayedOnWideLayout,
-        isSuperWideRHPDisplayedOnWideLayout,
-    };
-}
diff --git a/src/hooks/useResponsiveLayoutOnWideRHP/types.ts b/src/hooks/useResponsiveLayoutOnWideRHP/types.ts
deleted file mode 100644
index ca889fb4b263..000000000000
--- a/src/hooks/useResponsiveLayoutOnWideRHP/types.ts
+++ /dev/null
@@ -1,8 +0,0 @@
-import type ResponsiveLayoutResult from '@hooks/useResponsiveLayout/types';
-
-type ResponsiveLayoutOnWideRHPResult = ResponsiveLayoutResult & {
-    isWideRHPDisplayedOnWideLayout: boolean;
-    isSuperWideRHPDisplayedOnWideLayout: boolean;
-};
-
-export default ResponsiveLayoutOnWideRHPResult;
diff --git a/src/hooks/useSearchHighlightAndScroll.ts b/src/hooks/useSearchHighlightAndScroll.ts
index 87d08877018a..bb2826105dc4 100644
--- a/src/hooks/useSearchHighlightAndScroll.ts
+++ b/src/hooks/useSearchHighlightAndScroll.ts
@@ -1,5 +1,5 @@
 import {useIsFocused} from '@react-navigation/native';
-import {useEffect, useRef, useState} from 'react';
+import {useCallback, useEffect, useMemo, useRef, useState} from 'react';
 import {InteractionManager} from 'react-native';
 import type {OnyxCollection, OnyxEntry} from 'react-native-onyx';
 import type {SearchQueryJSON} from '@components/Search/types';
@@ -51,22 +51,36 @@ function useSearchHighlightAndScroll({
     const initializedRef = useRef(false);
     const hasPendingSearchRef = useRef(false);
     const isChat = queryJSON.type === CONST.SEARCH.DATA_TYPES.CHAT;
-    const searchResultsData = searchResults?.data;
 
-    const prevTransactionsIDs = Object.keys(previousTransactions ?? {});
-    const newTransactions: Transaction[] = [];
-    if (prevTransactionsIDs.length > 0) {
-        const previousIDs = new Set(prevTransactionsIDs);
+    const existingSearchResultIDs = useMemo(() => {
+        if (!searchResults?.data) {
+            return [];
+        }
+        return isChat ? extractReportActionIDsFromSearchResults(searchResults.data) : extractTransactionIDsFromSearchResults(searchResults.data);
+    }, [searchResults?.data, isChat]);
+
+    const newTransactions = useMemo(() => {
+        const previousTransactionsIDs = Object.keys(previousTransactions ?? {});
+
+        if (previousTransactionsIDs.length === 0) {
+            return [];
+        }
+
+        const previousIDs = new Set(previousTransactionsIDs);
+        const result: Transaction[] = [];
+
         for (const [id, transaction] of Object.entries(transactions ?? {})) {
             if (!previousIDs.has(id) && transaction) {
-                newTransactions.push(transaction);
+                result.push(transaction);
             }
         }
-    }
+
+        return result;
+    }, [previousTransactions, transactions]);
 
     // Trigger search when a new report action is added while on chat or when a new transaction is added for the other search types.
     useEffect(() => {
-        const previousTransactionIDsLocal = Object.keys(previousTransactions ?? {});
+        const previousTransactionsIDs = Object.keys(previousTransactions ?? {});
         const transactionsIDs = Object.keys(transactions ?? {});
 
         const reportActionsIDs = Object.values(reportActions ?? {})
@@ -78,13 +92,13 @@ function useSearchHighlightAndScroll({
 
         // Only proceed if we have previous data to compare against
         // This prevents triggering on initial data load
-        if ((previousTransactionIDsLocal.length === 0 && previousReportActionsIDs.length === 0) || searchTriggeredRef.current) {
+        if ((previousTransactionsIDs.length === 0 && previousReportActionsIDs.length === 0) || searchTriggeredRef.current) {
             return;
         }
 
-        const previousTransactionsIDsSet = new Set(previousTransactionIDsLocal);
+        const previousTransactionsIDsSet = new Set(previousTransactionsIDs);
         const previousReportActionsIDsSet = new Set(previousReportActionsIDs);
-        const hasTransactionsIDsChange = transactionsIDs.length !== previousTransactionIDsLocal.length || transactionsIDs.some((id) => !previousTransactionsIDsSet.has(id));
+        const hasTransactionsIDsChange = transactionsIDs.length !== previousTransactionsIDs.length || transactionsIDs.some((id) => !previousTransactionsIDsSet.has(id));
         const hasReportActionsIDsChange = reportActionsIDs.some((id) => !previousReportActionsIDsSet.has(id));
 
         // Check if there is a change in the transactions or report actions list
@@ -97,18 +111,14 @@ function useSearchHighlightAndScroll({
             hasPendingSearchRef.current = false;
 
             const newIDs = isChat ? reportActionsIDs : transactionsIDs;
-            let currentSearchResultIDs: string[] = [];
-            if (searchResultsData) {
-                currentSearchResultIDs = isChat ? extractReportActionIDsFromSearchResults(searchResultsData) : extractTransactionIDsFromSearchResults(searchResultsData);
-            }
-            const existingSearchResultIDsSet = new Set(currentSearchResultIDs);
+            const existingSearchResultIDsSet = new Set(existingSearchResultIDs);
             const hasAGenuinelyNewID = newIDs.some((id) => !existingSearchResultIDsSet.has(id));
 
             // Only skip search if there are no new items AND search results aren't empty
             // This ensures deletions that result in empty data still trigger search
-            if (!hasAGenuinelyNewID && currentSearchResultIDs.length > 0) {
+            if (!hasAGenuinelyNewID && existingSearchResultIDs.length > 0) {
                 const newIDsSet = new Set(newIDs);
-                const hasDeletedID = currentSearchResultIDs.some((id) => !newIDsSet.has(id));
+                const hasDeletedID = existingSearchResultIDs.some((id) => !newIDsSet.has(id));
                 if (!hasDeletedID) {
                     return;
                 }
@@ -116,7 +126,7 @@ function useSearchHighlightAndScroll({
             // We only want to highlight new items if the addition of transactions or report actions triggered the search.
             // This is because, on deletion of items, the backend sometimes returns old items in place of the deleted ones.
             // We don't want to highlight these old items, even if they appear new in the current search results.
-            hasNewItemsRef.current = isChat ? reportActionsIDs.length > previousReportActionsIDs.length : transactionsIDs.length > previousTransactionIDsLocal.length;
+            hasNewItemsRef.current = isChat ? reportActionsIDs.length > previousReportActionsIDs.length : transactionsIDs.length > previousTransactionsIDs.length;
 
             // Set the flag indicating the search is triggered by the hook
             triggeredByHookRef.current = true;
@@ -141,7 +151,8 @@ function useSearchHighlightAndScroll({
         reportActions,
         previousReportActions,
         isChat,
-        searchResultsData,
+        searchResults?.data,
+        existingSearchResultIDs,
         isOffline,
         searchResults?.search?.isLoading,
     ]);
@@ -156,14 +167,13 @@ function useSearchHighlightAndScroll({
 
     // Initialize the set with existing IDs only once
     useEffect(() => {
-        if (initializedRef.current || !searchResultsData) {
+        if (initializedRef.current || !searchResults?.data) {
             return;
         }
 
-        const initialIDs = isChat ? extractReportActionIDsFromSearchResults(searchResultsData) : extractTransactionIDsFromSearchResults(searchResultsData);
-        highlightedIDs.current = new Set(initialIDs);
+        highlightedIDs.current = new Set(existingSearchResultIDs);
         initializedRef.current = true;
-    }, [searchResultsData, isChat]);
+    }, [searchResults?.data, isChat, existingSearchResultIDs]);
 
     // Detect new items (transactions or report actions)
     useEffect(() => {
@@ -225,48 +235,51 @@ function useSearchHighlightAndScroll({
     /**
      * Callback to handle scrolling to the new search result.
      */
-    const handleSelectionListScroll = (data: SearchListItem[], ref: SelectionListHandle | null) => {
-        // Early return if there's no ref, new transaction wasn't brought in by this hook
-        // or there's no new search result key
-        const newSearchResultKey = newSearchResultKeys?.values().next().value;
-        if (!ref || !triggeredByHookRef.current || !newSearchResultKey) {
-            return;
-        }
-
-        // Extract the transaction/report action ID from the newSearchResultKey
-        const newID = newSearchResultKey.replace(isChat ? ONYXKEYS.COLLECTION.REPORT_ACTIONS : ONYXKEYS.COLLECTION.TRANSACTION, '');
-
-        // Find the index of the new transaction/report action in the data array
-        const indexOfNewItem = data.findIndex((item) => {
-            if (isChat) {
-                if ('reportActionID' in item && item.reportActionID === newID) {
-                    return true;
-                }
-            } else {
-                // Handle TransactionListItemType
-                if ('transactionID' in item && item.transactionID === newID) {
-                    return true;
-                }
+    const handleSelectionListScroll = useCallback(
+        (data: SearchListItem[], ref: SelectionListHandle | null) => {
+            // Early return if there's no ref, new transaction wasn't brought in by this hook
+            // or there's no new search result key
+            const newSearchResultKey = newSearchResultKeys?.values().next().value;
+            if (!ref || !triggeredByHookRef.current || !newSearchResultKey) {
+                return;
+            }
 
-                // Handle TransactionGroupListItemType with transactions array
-                if ('transactions' in item && Array.isArray(item.transactions)) {
-                    return item.transactions.some((transaction) => transaction?.transactionID === newID);
+            // Extract the transaction/report action ID from the newSearchResultKey
+            const newID = newSearchResultKey.replace(isChat ? ONYXKEYS.COLLECTION.REPORT_ACTIONS : ONYXKEYS.COLLECTION.TRANSACTION, '');
+
+            // Find the index of the new transaction/report action in the data array
+            const indexOfNewItem = data.findIndex((item) => {
+                if (isChat) {
+                    if ('reportActionID' in item && item.reportActionID === newID) {
+                        return true;
+                    }
+                } else {
+                    // Handle TransactionListItemType
+                    if ('transactionID' in item && item.transactionID === newID) {
+                        return true;
+                    }
+
+                    // Handle TransactionGroupListItemType with transactions array
+                    if ('transactions' in item && Array.isArray(item.transactions)) {
+                        return item.transactions.some((transaction) => transaction?.transactionID === newID);
+                    }
                 }
-            }
 
-            return false;
-        });
+                return false;
+            });
 
-        // Early return if the new item is not found in the data array
-        if (indexOfNewItem <= 0) {
-            return;
-        }
+            // Early return if the new item is not found in the data array
+            if (indexOfNewItem <= 0) {
+                return;
+            }
 
-        // Perform the scrolling action
-        ref.scrollToIndex(indexOfNewItem);
-        // Reset the trigger flag to prevent unintended future scrolls and highlights
-        triggeredByHookRef.current = false;
-    };
+            // Perform the scrolling action
+            ref.scrollToIndex(indexOfNewItem);
+            // Reset the trigger flag to prevent unintended future scrolls and highlights
+            triggeredByHookRef.current = false;
+        },
+        [newSearchResultKeys, isChat],
+    );
 
     return {newSearchResultKeys, handleSelectionListScroll, newTransactions};
 }
diff --git a/src/hooks/useSearchSelector.base.ts b/src/hooks/useSearchSelector.base.ts
index 87b5eaefd18b..cd87176342b2 100644
--- a/src/hooks/useSearchSelector.base.ts
+++ b/src/hooks/useSearchSelector.base.ts
@@ -162,10 +162,8 @@ function useSearchSelectorBase({
     const [maxResults, setMaxResults] = useState(maxResultsPerPage);
     const [countryCode = CONST.DEFAULT_COUNTRY_CODE] = useOnyx(ONYXKEYS.COUNTRY_CODE, {canBeMissing: false});
     const [loginList] = useOnyx(ONYXKEYS.LOGIN_LIST, {canBeMissing: true});
-    const [allPolicies] = useOnyx(ONYXKEYS.COLLECTION.POLICY, {canBeMissing: true});
     const [draftComments] = useOnyx(ONYXKEYS.COLLECTION.REPORT_DRAFT_COMMENT, {canBeMissing: true});
     const [nvpDismissedProductTraining] = useOnyx(ONYXKEYS.NVP_DISMISSED_PRODUCT_TRAINING, {canBeMissing: true});
-    const [visibleReportActionsData] = useOnyx(ONYXKEYS.DERIVED.VISIBLE_REPORT_ACTIONS, {canBeMissing: true});
 
     const onListEndReached = useDebounce(
         useCallback(() => {
@@ -197,10 +195,9 @@ function useSearchSelectorBase({
                     includeUserToInvite,
                     countryCode,
                     loginList,
-                    visibleReportActionsData,
                 });
             case CONST.SEARCH_SELECTOR.SEARCH_CONTEXT_MEMBER_INVITE:
-                return getValidOptions(optionsWithContacts, allPolicies, draftComments, nvpDismissedProductTraining, loginList, {
+                return getValidOptions(optionsWithContacts, draftComments, nvpDismissedProductTraining, loginList, {
                     betas: betas ?? [],
                     includeP2P: true,
                     includeSelectedOptions: false,
@@ -212,7 +209,7 @@ function useSearchSelectorBase({
                     includeUserToInvite,
                 });
             case CONST.SEARCH_SELECTOR.SEARCH_CONTEXT_GENERAL:
-                return getValidOptions(optionsWithContacts, allPolicies, draftComments, nvpDismissedProductTraining, loginList, {
+                return getValidOptions(optionsWithContacts, draftComments, nvpDismissedProductTraining, loginList, {
                     ...getValidOptionsConfig,
                     betas: betas ?? [],
                     searchString: computedSearchTerm,
@@ -224,7 +221,6 @@ function useSearchSelectorBase({
             case CONST.SEARCH_SELECTOR.SEARCH_CONTEXT_SHARE_LOG:
                 return getValidOptions(
                     optionsWithContacts,
-                    allPolicies,
                     draftComments,
                     nvpDismissedProductTraining,
                     loginList,
@@ -244,7 +240,7 @@ function useSearchSelectorBase({
                     countryCode,
                 );
             case CONST.SEARCH_SELECTOR.SEARCH_CONTEXT_SHARE_DESTINATION:
-                return getValidOptions(optionsWithContacts, allPolicies, draftComments, nvpDismissedProductTraining, loginList, {
+                return getValidOptions(optionsWithContacts, draftComments, nvpDismissedProductTraining, loginList, {
                     betas,
                     selectedOptions,
                     includeMultipleParticipantReports: true,
@@ -262,7 +258,7 @@ function useSearchSelectorBase({
                     includeUserToInvite,
                 });
             case CONST.SEARCH_SELECTOR.SEARCH_CONTEXT_ATTENDEES:
-                return getValidOptions(optionsWithContacts, allPolicies, draftComments, nvpDismissedProductTraining, loginList, {
+                return getValidOptions(optionsWithContacts, draftComments, nvpDismissedProductTraining, loginList, {
                     ...getValidOptionsConfig,
                     betas: betas ?? [],
                     includeP2P: true,
@@ -284,7 +280,6 @@ function useSearchSelectorBase({
         areOptionsInitialized,
         searchContext,
         optionsWithContacts,
-        allPolicies,
         draftComments,
         nvpDismissedProductTraining,
         betas,
@@ -299,7 +294,6 @@ function useSearchSelectorBase({
         getValidOptionsConfig,
         selectedOptions,
         includeCurrentUser,
-        visibleReportActionsData,
     ]);
 
     const isOptionSelected = useMemo(() => {
diff --git a/src/hooks/useSelectedTransactionsActions.ts b/src/hooks/useSelectedTransactionsActions.ts
index bd1980bfe565..6a640914a309 100644
--- a/src/hooks/useSelectedTransactionsActions.ts
+++ b/src/hooks/useSelectedTransactionsActions.ts
@@ -1,6 +1,4 @@
-import {useContext, useState} from 'react';
-import type {DropdownOption} from '@components/ButtonWithDropdownMenu/types';
-import {DelegateNoAccessContext} from '@components/DelegateNoAccessModalProvider';
+import {useCallback, useMemo, useState} from 'react';
 import type {PopoverMenuItem} from '@components/PopoverMenu';
 import {useSearchContext} from '@components/Search/SearchContext';
 import {initSplitExpense} from '@libs/actions/IOU';
@@ -68,7 +66,6 @@ function useSelectedTransactionsActions({
     isOnSearch?: boolean;
 }) {
     const {isOffline} = useNetworkWithOfflineStatus();
-    const {isDelegateAccessRestricted, showDelegateNoAccessModal} = useContext(DelegateNoAccessContext);
     const {selectedTransactionIDs, clearSelectedTransactions, currentSearchHash, selectedTransactions: selectedTransactionsMeta} = useSearchContext();
     const allTransactions = useAllTransactions();
     const [allReports] = useOnyx(ONYXKEYS.COLLECTION.REPORT, {canBeMissing: false});
@@ -82,45 +79,60 @@ function useSelectedTransactionsActions({
     const {duplicateTransactions, duplicateTransactionViolations} = useDuplicateTransactionsAndViolations(selectedTransactionIDs);
     const isReportArchived = useReportIsArchived(report?.reportID);
     const {deleteTransactions} = useDeleteTransactions({report, reportActions, policy});
-    const {login, accountID: currentUserAccountID} = useCurrentUserPersonalDetails();
-    const selectedTransactionsList = selectedTransactionIDs.reduce((acc, transactionID) => {
-        const transaction = allTransactions?.[`${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`];
-        if (transaction) {
-            acc.push(transaction);
-        }
-        return acc;
-    }, [] as Transaction[]);
-
-    const knownOwnerIDs = new Set<number>();
-    let hasUnknownOwner = false;
-
-    for (const selectedTransactionInfo of Object.values(selectedTransactionsMeta ?? {})) {
-        const ownerAccountID = selectedTransactionInfo?.ownerAccountID;
-        if (typeof ownerAccountID === 'number') {
-            knownOwnerIDs.add(ownerAccountID);
-        } else {
-            hasUnknownOwner = true;
+    const {login} = useCurrentUserPersonalDetails();
+    const selectedTransactionsList = useMemo(
+        () =>
+            selectedTransactionIDs.reduce((acc, transactionID) => {
+                const transaction = allTransactions?.[`${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`];
+                if (transaction) {
+                    acc.push(transaction);
+                }
+                return acc;
+            }, [] as Transaction[]),
+        [allTransactions, selectedTransactionIDs],
+    );
+    const hasTransactionsFromMultipleOwners = useMemo(() => {
+        const knownOwnerIDs = new Set<number>();
+        let hasUnknownOwner = false;
+
+        for (const selectedTransactionInfo of Object.values(selectedTransactionsMeta ?? {})) {
+            const ownerAccountID = selectedTransactionInfo?.ownerAccountID;
+            if (typeof ownerAccountID === 'number') {
+                knownOwnerIDs.add(ownerAccountID);
+                if (knownOwnerIDs.size > 1) {
+                    return true;
+                }
+            } else {
+                hasUnknownOwner = true;
+            }
         }
-    }
 
-    for (const selectedTransaction of selectedTransactionsList) {
-        const reportID = selectedTransaction?.reportID;
-        if (!reportID || reportID === CONST.REPORT.UNREPORTED_REPORT_ID) {
-            hasUnknownOwner = true;
-            continue;
-        }
+        for (const selectedTransaction of selectedTransactionsList) {
+            const reportID = selectedTransaction?.reportID;
+            if (!reportID || reportID === CONST.REPORT.UNREPORTED_REPORT_ID) {
+                hasUnknownOwner = true;
+                continue;
+            }
 
-        const parentReport = getReportOrDraftReport(reportID);
-        const ownerAccountID = parentReport?.ownerAccountID;
+            const parentReport = getReportOrDraftReport(reportID);
+            const ownerAccountID = parentReport?.ownerAccountID;
 
-        if (typeof ownerAccountID === 'number') {
-            knownOwnerIDs.add(ownerAccountID);
-        } else {
-            hasUnknownOwner = true;
+            if (typeof ownerAccountID === 'number') {
+                knownOwnerIDs.add(ownerAccountID);
+                if (knownOwnerIDs.size > 1) {
+                    return true;
+                }
+            } else {
+                hasUnknownOwner = true;
+            }
+        }
+
+        if (hasUnknownOwner) {
+            return knownOwnerIDs.size > 0 || selectedTransactionIDs.length > 1;
         }
-    }
 
-    const hasTransactionsFromMultipleOwners = hasUnknownOwner ? knownOwnerIDs.size > 0 || selectedTransactionIDs.length > 1 : knownOwnerIDs.size > 1;
+        return false;
+    }, [selectedTransactionsList, selectedTransactionsMeta, selectedTransactionIDs.length]);
 
     const {translate, localeCompare} = useLocalize();
     const [isDeleteModalVisible, setIsDeleteModalVisible] = useState(false);
@@ -138,23 +150,25 @@ function useSelectedTransactionsActions({
         iouType = CONST.IOU.TYPE.INVOICE;
     }
 
-    const handleDeleteTransactions = () => {
+    const handleDeleteTransactions = useCallback(() => {
         const deletedThreadReportIDs = deleteTransactions(selectedTransactionIDs, duplicateTransactions, duplicateTransactionViolations, currentSearchHash, false);
         clearSelectedTransactions(true);
         setIsDeleteModalVisible(false);
         Navigation.removeReportScreen(new Set(deletedThreadReportIDs));
-    };
+    }, [deleteTransactions, selectedTransactionIDs, duplicateTransactions, duplicateTransactionViolations, currentSearchHash, clearSelectedTransactions]);
 
-    const showDeleteModal = () => {
+    const showDeleteModal = useCallback(() => {
         setIsDeleteModalVisible(true);
-    };
+    }, []);
 
-    const hideDeleteModal = () => {
+    const hideDeleteModal = useCallback(() => {
         setIsDeleteModalVisible(false);
-    };
+    }, []);
 
-    let computedOptions: Array<DropdownOption<string>> = [];
-    if (selectedTransactionIDs.length) {
+    const computedOptions = useMemo(() => {
+        if (!selectedTransactionIDs.length) {
+            return [];
+        }
         const options = [];
         const isMoneyRequestReport = isMoneyRequestReportUtils(report);
         const isReportReimbursed = report?.stateNum === CONST.REPORT.STATE_NUM.APPROVED && report?.statusNum === CONST.REPORT.STATUS_NUM.REIMBURSED;
@@ -186,11 +200,6 @@ function useSelectedTransactionsActions({
                 icon: expensifyIcons.Stopwatch,
                 value: HOLD,
                 onSelected: () => {
-                    if (isDelegateAccessRestricted) {
-                        showDelegateNoAccessModal();
-                        return;
-                    }
-
                     if (!report?.reportID) {
                         return;
                     }
@@ -205,11 +214,6 @@ function useSelectedTransactionsActions({
                 icon: expensifyIcons.Stopwatch,
                 value: UNHOLD,
                 onSelected: () => {
-                    if (isDelegateAccessRestricted) {
-                        showDelegateNoAccessModal();
-                        return;
-                    }
-
                     for (const transactionID of selectedTransactionIDs) {
                         const action = getIOUActionForTransactionID(reportActions, transactionID);
                         if (!action?.childReportID) {
@@ -231,11 +235,6 @@ function useSelectedTransactionsActions({
                 icon: expensifyIcons.ThumbsDown,
                 value: CONST.REPORT.SECONDARY_ACTIONS.REJECT,
                 onSelected: () => {
-                    if (isDelegateAccessRestricted) {
-                        showDelegateNoAccessModal();
-                        return;
-                    }
-
                     Navigation.navigate(ROUTES.SEARCH_MONEY_REQUEST_REPORT_REJECT_TRANSACTIONS.getRoute({reportID: report.reportID}));
                 },
             });
@@ -334,8 +333,7 @@ function useSelectedTransactionsActions({
         const originalTransaction = allTransactions?.[`${ONYXKEYS.COLLECTION.TRANSACTION}${firstTransaction?.comment?.originalTransactionID}`];
 
         const {isExpenseSplit} = getOriginalTransactionWithSplitInfo(firstTransaction, originalTransaction);
-        const canSplitTransaction =
-            selectedTransactionsList.length === 1 && report && !isExpenseSplit && isSplitAction(report, [firstTransaction], originalTransaction, login ?? '', currentUserAccountID, policy);
+        const canSplitTransaction = selectedTransactionsList.length === 1 && report && !isExpenseSplit && isSplitAction(report, [firstTransaction], originalTransaction, login ?? '', policy);
 
         if (canSplitTransaction) {
             options.push({
@@ -367,8 +365,46 @@ function useSelectedTransactionsActions({
                 onSelected: showDeleteModal,
             });
         }
-        computedOptions = options;
-    }
+        return options;
+    }, [
+        session?.email,
+        selectedTransactionIDs,
+        report,
+        selectedTransactionsList,
+        translate,
+        isReportArchived,
+        hasTransactionsFromMultipleOwners,
+        policy,
+        reportActions,
+        clearSelectedTransactions,
+        allTransactionsLength,
+        integrationsExportTemplates,
+        csvExportLayouts,
+        isOffline,
+        onExportOffline,
+        onExportFailed,
+        beginExportWithTemplate,
+        outstandingReportsByPolicyID,
+        iouType,
+        lastVisitedPath,
+        allTransactions,
+        allReports,
+        session?.accountID,
+        showDeleteModal,
+        allTransactionViolations,
+        expensifyIcons.Stopwatch,
+        expensifyIcons.ThumbsDown,
+        expensifyIcons.Table,
+        expensifyIcons.Export,
+        expensifyIcons.ArrowRight,
+        expensifyIcons.ArrowSplit,
+        expensifyIcons.DocumentMerge,
+        expensifyIcons.ArrowCollapse,
+        expensifyIcons.Trashcan,
+        localeCompare,
+        isOnSearch,
+        login,
+    ]);
 
     return {
         options: computedOptions,
diff --git a/src/hooks/useShowNotFoundPageInIOUStep.ts b/src/hooks/useShowNotFoundPageInIOUStep.ts
index e576ba1d40d2..443dcfe29ffe 100644
--- a/src/hooks/useShowNotFoundPageInIOUStep.ts
+++ b/src/hooks/useShowNotFoundPageInIOUStep.ts
@@ -54,7 +54,7 @@ const useShowNotFoundPageInIOUStep = (action: IOUAction, iouType: IOUType, repor
 
     // eslint-disable-next-line rulesdir/no-negated-variables
     let shouldShowNotFoundPage = false;
-    const canEditSplitBill = isSplitBill && reportAction && session?.accountID === reportAction.actorAccountID && areRequiredFieldsEmpty(transaction, iouReport);
+    const canEditSplitBill = isSplitBill && reportAction && session?.accountID === reportAction.actorAccountID && areRequiredFieldsEmpty(transaction);
     const canEditSplitExpense = isSplitExpense && !!transaction;
 
     if (isEditing) {
diff --git a/src/hooks/useSidePanelDisplayStatus.tsx b/src/hooks/useSidePanelDisplayStatus.tsx
index 730aa2f19f57..e24ee963bb2e 100644
--- a/src/hooks/useSidePanelDisplayStatus.tsx
+++ b/src/hooks/useSidePanelDisplayStatus.tsx
@@ -1,10 +1,8 @@
-import {getDeepestFocusedScreenName, isTwoFactorSetupScreen} from '@libs/Navigation/Navigation';
 import ONYXKEYS from '@src/ONYXKEYS';
 import {hasCompletedGuidedSetupFlowSelector} from '@src/selectors/Onboarding';
 import useIsAnonymousUser from './useIsAnonymousUser';
 import useOnyx from './useOnyx';
 import useResponsiveLayout from './useResponsiveLayout';
-import useRootNavigationState from './useRootNavigationState';
 
 /**
  * Hook to get the display status of the Side Panel
@@ -18,10 +16,6 @@ function useSidePanelDisplayStatus() {
     });
     const isAnonymousUser = useIsAnonymousUser();
     const isSidePanelVisible = isExtraLargeScreenWidth ? sidePanelNVP?.open : sidePanelNVP?.openNarrowScreen;
-    const isIn2FASetupFlow = useRootNavigationState((state) => {
-        const focusedScreenName = getDeepestFocusedScreenName(state);
-        return isTwoFactorSetupScreen(focusedScreenName);
-    });
 
     // The Side Panel is hidden when:
     // - NVP is not set or it is false
@@ -33,8 +27,7 @@ function useSidePanelDisplayStatus() {
     // - Side Panel is displayed currently
     // - Onboarding is not completed
     // - User is anonymous (not signed in)
-    // - User is setting up 2FA - if their current token is a TWO_FACTOR_SETUP token, any messages to concierge will fail to send
-    const shouldHideHelpButton = !shouldHideSidePanel || !isOnboardingCompleted || isAnonymousUser || isIn2FASetupFlow;
+    const shouldHideHelpButton = !shouldHideSidePanel || !isOnboardingCompleted || isAnonymousUser;
     const shouldHideSidePanelBackdrop = shouldHideSidePanel || isExtraLargeScreenWidth || shouldUseNarrowLayout;
 
     return {
diff --git a/src/hooks/useSidebarOrderedReports.tsx b/src/hooks/useSidebarOrderedReports.tsx
index 2f939b36d5d6..8307061e1353 100644
--- a/src/hooks/useSidebarOrderedReports.tsx
+++ b/src/hooks/useSidebarOrderedReports.tsx
@@ -34,7 +34,7 @@ type SidebarOrderedReportsContextValue = {
     clearLHNCache: () => void;
 };
 
-type ReportsToDisplayInLHN = Record<string, OnyxTypes.Report & {hasErrorsOtherThanFailedReceipt?: boolean; requiresAttention?: boolean}>;
+type ReportsToDisplayInLHN = Record<string, OnyxTypes.Report & {hasErrorsOtherThanFailedReceipt?: boolean}>;
 
 const SidebarOrderedReportsContext = createContext<SidebarOrderedReportsContextValue>({
     orderedReports: [],
@@ -230,7 +230,7 @@ function SidebarOrderedReportsContextProvider({
     }, [reportsToDisplayInLHN]);
 
     const getOrderedReportIDs = useCallback(
-        () => SidebarUtils.sortReportsToDisplayInLHN(deepComparedReportsToDisplayInLHN ?? {}, priorityMode, localeCompare, deepComparedReportsDrafts, reportNameValuePairs),
+        () => SidebarUtils.sortReportsToDisplayInLHN(deepComparedReportsToDisplayInLHN ?? {}, priorityMode, localeCompare, deepComparedReportsDrafts, reportNameValuePairs, reportAttributes),
         // Rule disabled intentionally - reports should be sorted only when the reportsToDisplayInLHN changes
         // eslint-disable-next-line react-hooks/exhaustive-deps
         [deepComparedReportsToDisplayInLHN, localeCompare, deepComparedReportsDrafts],
diff --git a/src/hooks/useTodos.ts b/src/hooks/useTodos.ts
index 609621bfc4eb..485bea8bbf2c 100644
--- a/src/hooks/useTodos.ts
+++ b/src/hooks/useTodos.ts
@@ -13,7 +13,7 @@ export default function useTodos() {
     const [allTransactions] = useOnyx(ONYXKEYS.COLLECTION.TRANSACTION, {canBeMissing: false});
     const [allReportActions] = useOnyx(ONYXKEYS.COLLECTION.REPORT_ACTIONS, {canBeMissing: false});
     const [bankAccountList] = useOnyx(ONYXKEYS.BANK_ACCOUNT_LIST, {canBeMissing: true});
-    const {login = '', accountID: currentUserAccountID} = useCurrentUserPersonalDetails();
+    const {login = '', accountID} = useCurrentUserPersonalDetails();
 
     return useMemo(() => {
         const reportsToSubmit: Report[] = [];
@@ -48,10 +48,10 @@ export default function useTodos() {
             if (isSubmitAction(report, reportTransactions, policy, reportNameValuePair)) {
                 reportsToSubmit.push(report);
             }
-            if (isApproveAction(report, reportTransactions, currentUserAccountID, policy)) {
+            if (isApproveAction(report, reportTransactions, policy)) {
                 reportsToApprove.push(report);
             }
-            if (isPrimaryPayAction(report, currentUserAccountID, login, bankAccountList, policy, reportNameValuePair)) {
+            if (isPrimaryPayAction(report, accountID, login, bankAccountList, policy, reportNameValuePair)) {
                 reportsToPay.push(report);
             }
             if (isExportAction(report, login, policy, reportActions)) {
@@ -60,5 +60,5 @@ export default function useTodos() {
         }
 
         return {reportsToSubmit, reportsToApprove, reportsToPay, reportsToExport};
-    }, [allReports, allTransactions, allPolicies, allReportNameValuePairs, allReportActions, currentUserAccountID, login, bankAccountList]);
+    }, [allReports, allTransactions, allPolicies, allReportNameValuePairs, allReportActions, accountID, login, bankAccountList]);
 }
diff --git a/src/hooks/useTransactionViolations.ts b/src/hooks/useTransactionViolations.ts
index eaaf3a5ac24d..71ab0554f952 100644
--- a/src/hooks/useTransactionViolations.ts
+++ b/src/hooks/useTransactionViolations.ts
@@ -1,7 +1,6 @@
 import {useMemo} from 'react';
 import getNonEmptyStringOnyxID from '@libs/getNonEmptyStringOnyxID';
 import {isViolationDismissed, mergeProhibitedViolations, shouldShowViolation} from '@libs/TransactionUtils';
-import CONST from '@src/CONST';
 import ONYXKEYS from '@src/ONYXKEYS';
 import type {TransactionViolation, TransactionViolations} from '@src/types/onyx';
 import getEmptyArray from '@src/types/utils/getEmptyArray';
@@ -29,8 +28,7 @@ function useTransactionViolations(transactionID?: string, shouldShowRterForSettl
                 transactionViolations.filter(
                     (violation: TransactionViolation) =>
                         !isViolationDismissed(transaction, violation, currentUserDetails.email ?? '', currentUserDetails.accountID, iouReport, policy) &&
-                        shouldShowViolation(iouReport, policy, violation.name, currentUserDetails.email ?? '', shouldShowRterForSettledReport, transaction) &&
-                        (!CONST.IS_ATTENDEES_REQUIRED_FEATURE_DISABLED || violation.name !== CONST.VIOLATIONS.MISSING_ATTENDEES),
+                        shouldShowViolation(iouReport, policy, violation.name, currentUserDetails.email ?? '', shouldShowRterForSettledReport, transaction),
                 ),
             ),
         [transaction, transactionViolations, iouReport, policy, shouldShowRterForSettledReport, currentUserDetails.email, currentUserDetails.accountID],
diff --git a/src/hooks/useTransactionsAndViolationsForReport.ts b/src/hooks/useTransactionsAndViolationsForReport.ts
index 512030a1f3ed..d92ec801bdd4 100644
--- a/src/hooks/useTransactionsAndViolationsForReport.ts
+++ b/src/hooks/useTransactionsAndViolationsForReport.ts
@@ -1,3 +1,4 @@
+import {useMemo} from 'react';
 import {useAllReportsTransactionsAndViolations} from '@components/OnyxListItemProvider';
 import {getTransactionViolations} from '@libs/TransactionUtils';
 import ONYXKEYS from '@src/ONYXKEYS';
@@ -16,14 +17,25 @@ function useTransactionsAndViolationsForReport(reportID?: string) {
 
     const {transactions, violations} = reportID ? (allReportsTransactionsAndViolations?.[reportID] ?? DEFAULT_RETURN_VALUE) : DEFAULT_RETURN_VALUE;
 
-    const filteredViolations: Record<string, TransactionViolations> = {};
-    for (const transactionViolationKey of Object.keys(violations)) {
-        const transactionID = transactionViolationKey.split('_').at(1) ?? '';
-        const transaction = transactions[`${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`];
-        filteredViolations[transactionViolationKey] = getTransactionViolations(transaction, violations, currentUserDetails.email ?? '', currentUserDetails.accountID, report, policy) ?? [];
-    }
+    const transactionsAndViolations = useMemo<ReportTransactionsAndViolations>(() => {
+        const filteredViolations = Object.keys(violations).reduce(
+            (filteredTransactionViolations, transactionViolationKey) => {
+                const transactionID = transactionViolationKey.split('_').at(1) ?? '';
+                const transaction = transactions[`${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`];
 
-    return {transactions, violations: filteredViolations};
+                // This is our accumulator, it's okay to reassign
+                // eslint-disable-next-line no-param-reassign
+                filteredTransactionViolations[transactionViolationKey] =
+                    getTransactionViolations(transaction, violations, currentUserDetails.email ?? '', currentUserDetails.accountID, report, policy) ?? [];
+                return filteredTransactionViolations;
+            },
+            {} as Record<string, TransactionViolations>,
+        );
+
+        return {transactions, violations: filteredViolations};
+    }, [transactions, violations, currentUserDetails?.email, currentUserDetails?.accountID, report, policy]);
+
+    return transactionsAndViolations;
 }
 
 export default useTransactionsAndViolationsForReport;
diff --git a/src/hooks/useViolations.ts b/src/hooks/useViolations.ts
index bbad1d83c2fa..f86a875b35ed 100644
--- a/src/hooks/useViolations.ts
+++ b/src/hooks/useViolations.ts
@@ -6,7 +6,7 @@ import type {TransactionViolation, ViolationName} from '@src/types/onyx';
 /**
  * Names of Fields where violations can occur.
  */
-const validationFields = ['amount', 'billable', 'category', 'comment', 'date', 'merchant', 'receipt', 'tag', 'tax', 'attendees', 'customUnitRateID', 'waypoints', 'none'] as const;
+const validationFields = ['amount', 'billable', 'category', 'comment', 'date', 'merchant', 'receipt', 'tag', 'tax', 'customUnitRateID', 'none'] as const;
 
 type ViolationField = TupleToUnion<typeof validationFields>;
 
@@ -28,7 +28,6 @@ const violationNameToField: Record<ViolationName, (violation: TransactionViolati
     maxAge: () => 'date',
     missingCategory: () => 'category',
     missingComment: () => 'comment',
-    missingAttendees: () => 'attendees',
     missingTag: () => 'tag',
     modifiedAmount: () => 'amount',
     modifiedDate: () => 'date',
@@ -61,7 +60,6 @@ const violationNameToField: Record<ViolationName, (violation: TransactionViolati
     hold: () => 'none',
     receiptGeneratedWithAI: () => 'receipt',
     companyCardRequired: () => 'none',
-    noRoute: () => 'waypoints',
 };
 
 type ViolationsMap = Map<ViolationField, TransactionViolation[]>;
diff --git a/src/hooks/useWorkspacesTabIndicatorStatus.ts b/src/hooks/useWorkspacesTabIndicatorStatus.ts
index d5a705202a7c..5c5c56269d80 100644
--- a/src/hooks/useWorkspacesTabIndicatorStatus.ts
+++ b/src/hooks/useWorkspacesTabIndicatorStatus.ts
@@ -1,20 +1,51 @@
-import useNavigationTabBarIndicatorChecks from './useNavigationTabBarIndicatorChecks';
-import type {IndicatorStatus} from './useNavigationTabBarIndicatorChecks';
+import {useMemo} from 'react';
+import type {ValueOf} from 'type-fest';
+import {isConnectionInProgress} from '@libs/actions/connections';
+import {shouldShowQBOReimbursableExportDestinationAccountError} from '@libs/actions/connections/QuickbooksOnline';
+import {getUberConnectionErrorDirectlyFromPolicy, shouldShowCustomUnitsError, shouldShowEmployeeListError, shouldShowPolicyError, shouldShowSyncError} from '@libs/PolicyUtils';
+import CONST from '@src/CONST';
+import ONYXKEYS from '@src/ONYXKEYS';
+import useOnyx from './useOnyx';
 import useTheme from './useTheme';
 
+type WorkspacesTabIndicatorStatus = ValueOf<typeof CONST.INDICATOR_STATUS>;
+
 type WorkspacesTabIndicatorStatusResult = {
     indicatorColor: string;
-    status: IndicatorStatus | undefined;
+    status: ValueOf<typeof CONST.INDICATOR_STATUS> | undefined;
     policyIDWithErrors: string | undefined;
 };
 
 function useWorkspacesTabIndicatorStatus(): WorkspacesTabIndicatorStatusResult {
     const theme = useTheme();
+    const [allConnectionSyncProgresses] = useOnyx(ONYXKEYS.COLLECTION.POLICY_CONNECTION_SYNC_PROGRESS, {canBeMissing: true});
+    const [policies] = useOnyx(ONYXKEYS.COLLECTION.POLICY, {canBeMissing: true});
+    // If a policy was just deleted from Onyx, then Onyx will pass a null value to the props, and
+    // those should be cleaned out before doing any error checking
+    const cleanPolicies = useMemo(() => Object.fromEntries(Object.entries(policies ?? {}).filter(([, policy]) => policy?.id)), [policies]);
+    const policyErrors = {
+        [CONST.INDICATOR_STATUS.HAS_POLICY_ERRORS]: Object.values(cleanPolicies).find(shouldShowPolicyError),
+        [CONST.INDICATOR_STATUS.HAS_CUSTOM_UNITS_ERROR]: Object.values(cleanPolicies).find(shouldShowCustomUnitsError),
+        [CONST.INDICATOR_STATUS.HAS_EMPLOYEE_LIST_ERROR]: Object.values(cleanPolicies).find(shouldShowEmployeeListError),
+        [CONST.INDICATOR_STATUS.HAS_SYNC_ERRORS]: Object.values(cleanPolicies).find((cleanPolicy) =>
+            shouldShowSyncError(cleanPolicy, isConnectionInProgress(allConnectionSyncProgresses?.[`${ONYXKEYS.COLLECTION.POLICY_CONNECTION_SYNC_PROGRESS}${cleanPolicy?.id}`], cleanPolicy)),
+        ),
+        [CONST.INDICATOR_STATUS.HAS_QBO_EXPORT_ERROR]: Object.values(cleanPolicies).find(shouldShowQBOReimbursableExportDestinationAccountError),
+        [CONST.INDICATOR_STATUS.HAS_UBER_CREDENTIALS_ERROR]: Object.values(cleanPolicies).find(getUberConnectionErrorDirectlyFromPolicy),
+    };
+
+    // All of the error & info-checking methods are put into an array. This is so that using _.some() will return
+    // early as soon as the first error / info condition is returned. This makes the checks very efficient since
+    // we only care if a single error / info condition exists anywhere.
+    const errorChecking: Partial<Record<WorkspacesTabIndicatorStatus, boolean>> = {
+        ...(Object.fromEntries(Object.entries(policyErrors).map(([error, policy]) => [error, !!policy])) as Record<keyof typeof policyErrors, boolean>),
+    };
 
-    const {policyStatus, policyIDWithErrors} = useNavigationTabBarIndicatorChecks();
+    const [error] = Object.entries(errorChecking).find(([, value]) => value) ?? [];
 
-    const status = policyStatus;
-    const indicatorColor = policyStatus ? theme.danger : theme.success;
+    const status = error as WorkspacesTabIndicatorStatus | undefined;
+    const policyIDWithErrors = Object.values(policyErrors).find(Boolean)?.id;
+    const indicatorColor = error ? theme.danger : theme.success;
 
     return {indicatorColor, status, policyIDWithErrors};
 }
diff --git a/src/languages/de.ts b/src/languages/de.ts
index c9531841315e..27bc9d97b453 100644
--- a/src/languages/de.ts
+++ b/src/languages/de.ts
@@ -28,6 +28,24 @@ import type {
     EditActionParams,
     ExportAgainModalDescriptionParams,
     ExportIntegrationSelectedParams,
+    FileLimitParams,
+    FileTypeParams,
+    FiltersAmountBetweenParams,
+    FlightLayoverParams,
+    FlightParams,
+    FocusModeUpdateParams,
+    FormattedMaxLengthParams,
+    GoBackMessageParams,
+    HarvestCreatedExpenseReportParams,
+    ImportedTagsMessageParams,
+    ImportedTypesParams,
+    ImportFieldParams,
+    ImportMembersSuccessfulDescriptionParams,
+    ImportPerDiemRatesSuccessfulDescriptionParams,
+    ImportTagsSuccessfulDescriptionParams,
+    IncorrectZipFormatParams,
+    IndividualExpenseRulesSubtitleParams,
+    InstantSummaryParams,
     IntacctMappingTitleParams,
     IntegrationExportParams,
     IntegrationSyncFailedParams,
@@ -115,6 +133,9 @@ import type {
     SplitDateRangeParams,
     SplitExpenseEditTitleParams,
     SplitExpenseSubtitleParams,
+    SpreadCategoriesParams,
+    SpreadFieldNameParams,
+    SpreadSheetColumnParams,
     StatementTitleParams,
     StepCounterParams,
     StripePaidParams,
@@ -164,7 +185,6 @@ import type {
     UpdatedPolicyManualApprovalThresholdParams,
     UpdatedPolicyPreventSelfApprovalParams,
     UpdatedPolicyReimbursementEnabledParams,
-    UpdatedPolicyReimburserParams,
     UpdatedPolicyReportFieldDefaultValueParams,
     UpdatedPolicyTagFieldParams,
     UpdatedPolicyTagNameParams,
@@ -259,6 +279,7 @@ const translations: TranslationDeepObject<typeof en> = {
         searchWithThreeDots: 'Suchen …',
         next: 'Weiter',
         previous: 'Zurück',
+        // @context Navigation button that returns the user to the previous screen. Should be interpreted as a UI action label.
         goBack: 'Zurück',
         create: 'Erstellen',
         add: 'Hinzufügen',
@@ -276,7 +297,6 @@ const translations: TranslationDeepObject<typeof en> = {
         zoom: 'Zoom',
         password: 'Passwort',
         magicCode: 'Magischer Code',
-        digits: 'Ziffern',
         twoFactorCode: 'Zwei-Faktor-Code',
         workspaces: 'Arbeitsbereiche',
         inbox: 'Posteingang',
@@ -532,6 +552,10 @@ const translations: TranslationDeepObject<typeof en> = {
         value: 'Wert',
         downloadFailedTitle: 'Download fehlgeschlagen',
         downloadFailedDescription: 'Ihr Download konnte nicht abgeschlossen werden. Bitte versuchen Sie es später noch einmal.',
+        downloadFailedEmptyReportDescription: () => ({
+            one: 'Sie können keinen leeren Bericht exportieren.',
+            other: () => 'Sie können keine leeren Berichte exportieren.',
+        }),
         filterLogs: 'Protokolle filtern',
         network: 'Netzwerk',
         reportID: 'Berichts-ID',
@@ -627,6 +651,7 @@ const translations: TranslationDeepObject<typeof en> = {
         copyToClipboard: 'In die Zwischenablage kopieren',
         thisIsTakingLongerThanExpected: 'Das dauert länger als erwartet ...',
         domains: 'Domänen',
+        viewReport: 'Bericht anzeigen',
         actionRequired: 'Aktion erforderlich',
         duplicate: 'Duplizieren',
         duplicated: 'Dupliziert',
@@ -687,12 +712,12 @@ const translations: TranslationDeepObject<typeof en> = {
         protectedPDFNotSupported: 'Passwortgeschützte PDF-Datei wird nicht unterstützt',
         attachmentImageResized: 'Dieses Bild wurde für die Vorschau verkleinert. Für die volle Auflösung herunterladen.',
         attachmentImageTooLarge: 'Dieses Bild ist zu groß, um vor dem Hochladen eine Vorschau anzuzeigen.',
-        tooManyFiles: (fileLimit: number) => `Sie können jeweils nur bis zu ${fileLimit} Dateien hochladen.`,
+        tooManyFiles: ({fileLimit}: FileLimitParams) => `Sie können jeweils nur bis zu ${fileLimit} Dateien hochladen.`,
         sizeExceededWithValue: ({maxUploadSizeInMB}: SizeExceededParams) => `Datei überschreitet ${maxUploadSizeInMB} MB. Bitte versuche es erneut.`,
         someFilesCantBeUploaded: 'Einige Dateien können nicht hochgeladen werden',
         sizeLimitExceeded: ({maxUploadSizeInMB}: SizeExceededParams) => `Dateien müssen kleiner als ${maxUploadSizeInMB} MB sein. Größere Dateien werden nicht hochgeladen.`,
         maxFileLimitExceeded: 'Sie können bis zu 30 Belege auf einmal hochladen. Alle weiteren werden nicht hochgeladen.',
-        unsupportedFileType: (fileType: string) => `${fileType}-Dateien werden nicht unterstützt. Es werden nur unterstützte Dateitypen hochgeladen.`,
+        unsupportedFileType: ({fileType}: FileTypeParams) => `${fileType}-Dateien werden nicht unterstützt. Es werden nur unterstützte Dateitypen hochgeladen.`,
         learnMoreAboutSupportedFiles: 'Erfahren Sie mehr über unterstützte Formate.',
         passwordProtected: 'Passwortgeschützte PDFs werden nicht unterstützt. Es werden nur unterstützte Dateien hochgeladen.',
     },
@@ -717,8 +742,8 @@ const translations: TranslationDeepObject<typeof en> = {
     composer: {
         noExtensionFoundForMimeType: 'Keine Erweiterung für diesen MIME-Typ gefunden',
         problemGettingImageYouPasted: 'Es gab ein Problem beim Abrufen des von dir eingefügten Bildes',
-        commentExceededMaxLength: (formattedMaxLength: string) => `Die maximale Kommentarlänge beträgt ${formattedMaxLength} Zeichen.`,
-        taskTitleExceededMaxLength: (formattedMaxLength: string) => `Die maximale Aufgabenüberschrift darf ${formattedMaxLength} Zeichen lang sein.`,
+        commentExceededMaxLength: ({formattedMaxLength}: FormattedMaxLengthParams) => `Die maximale Kommentarlänge beträgt ${formattedMaxLength} Zeichen.`,
+        taskTitleExceededMaxLength: ({formattedMaxLength}: FormattedMaxLengthParams) => `Die maximale Aufgabenüberschrift darf ${formattedMaxLength} Zeichen lang sein.`,
     },
     baseUpdateAppModal: {
         updateApp: 'App aktualisieren',
@@ -729,35 +754,6 @@ const translations: TranslationDeepObject<typeof en> = {
         expired: 'Ihre Sitzung ist abgelaufen.',
         signIn: 'Bitte melden Sie sich erneut an.',
     },
-    multifactorAuthentication: {
-        biometricsTest: {
-            biometricsTest: 'Biometrie-Test',
-            authenticationSuccessful: 'Authentifizierung erfolgreich',
-            successfullyAuthenticatedUsing: ({authType}) => `Du hast dich erfolgreich mit ${authType} authentifiziert.`,
-            troubleshootBiometricsStatus: ({registered}) => `Biometrie (${registered ? 'Registriert' : 'Nicht registriert'})`,
-            yourAttemptWasUnsuccessful: 'Dein Authentifizierungsversuch war nicht erfolgreich.',
-            youCouldNotBeAuthenticated: 'Sie konnten nicht authentifiziert werden',
-            areYouSureToReject: 'Bist du sicher? Der Authentifizierungsversuch wird abgelehnt, wenn du diesen Bildschirm schließt.',
-            rejectAuthentication: 'Authentifizierung ablehnen',
-            test: 'Test',
-            biometricsAuthentication: 'Biometrie-Authentifizierung',
-        },
-        pleaseEnableInSystemSettings: {
-            start: 'Bitte aktivieren Sie die Gesichts-/Fingerabdrucküberprüfung oder setzen Sie eine Geräte-Passcode in Ihren ',
-            link: 'Systemeinstellungen',
-            end: '.',
-        },
-        oops: 'Hoppla, etwas ist schief gelaufen',
-        looksLikeYouRanOutOfTime: 'Sieht aus, als wäre deine Zeit abgelaufen! Bitte versuche es erneut beim Händler.',
-        youRanOutOfTime: 'Die Zeit ist abgelaufen',
-        letsVerifyItsYou: 'Lass uns überprüfen, ob du es bist',
-        verifyYourself: {
-            biometrics: 'Verifiziere dich mit deinem Gesicht oder Fingerabdruck',
-        },
-        enableQuickVerification: {
-            biometrics: 'Schnelle, sichere Verifizierung mit deinem Gesicht oder Fingerabdruck aktivieren. Keine Passwörter oder Codes erforderlich.',
-        },
-    },
     validateCodeModal: {
         successfulSignInTitle: dedent(`
             Abrakadabra,
@@ -928,7 +924,7 @@ const translations: TranslationDeepObject<typeof en> = {
     adminOnlyCanPost: 'Nur Administratoren können Nachrichten in diesem Raum senden.',
     reportAction: {
         asCopilot: 'als Copilot für',
-        harvestCreatedExpenseReport: (reportUrl: string, reportName: string) =>
+        harvestCreatedExpenseReport: ({reportUrl, reportName}: HarvestCreatedExpenseReportParams) =>
             `hat diesen Bericht erstellt, um alle Ausgaben aus <a href="${reportUrl}">${reportName}</a> aufzunehmen, die mit der von dir gewählten Frequenz nicht eingereicht werden konnten`,
         createdReportForUnapprovedTransactions: ({reportUrl, reportName}: CreatedReportForUnapprovedTransactionsParams) =>
             `hat diesen Bericht für alle zurückgehaltenen Ausgaben aus <a href="${reportUrl}">${reportName}</a> erstellt`,
@@ -971,7 +967,7 @@ const translations: TranslationDeepObject<typeof en> = {
         buttonFind: 'Etwas suchen …',
         buttonMySettings: 'Meine Einstellungen',
         fabNewChat: 'Chat starten',
-        fabNewChatExplained: 'Aktionsmenü öffnen',
+        fabNewChatExplained: 'Chat starten (Schwebende Aktion)',
         fabScanReceiptExplained: 'Beleg scannen (Schwebende Aktion)',
         chatPinned: 'Chat angeheftet',
         draftedMessage: 'Entwurfsnachricht',
@@ -998,13 +994,15 @@ const translations: TranslationDeepObject<typeof en> = {
         chooseSpreadsheet: '<muted-link>Wählen Sie eine Tabellenkalkulationsdatei zum Importieren aus. Unterstützte Formate: .csv, .txt, .xls und .xlsx.</muted-link>',
         chooseSpreadsheetMultiLevelTag: `<muted-link>Wähle eine Tabellenkalkulationsdatei zum Importieren aus. <a href="${CONST.IMPORT_SPREADSHEET.MULTI_LEVEL_TAGS_ARTICLE_LINK}">Erfahre mehr</a> über unterstützte Dateiformate.</muted-link>`,
         fileContainsHeader: 'Datei enthält Spaltenüberschriften',
-        column: (name: string) => `Spalte ${name}`,
-        fieldNotMapped: (fieldName: string) => `Ups! Ein erforderliches Feld („${fieldName}“) wurde nicht zugeordnet. Bitte überprüfen und erneut versuchen.`,
-        singleFieldMultipleColumns: (fieldName: string) => `Ups! Du hast ein einzelnes Feld („${fieldName}“) mehreren Spalten zugeordnet. Bitte überprüfe dies und versuche es erneut.`,
-        emptyMappedField: (fieldName: string) => `Ups! Das Feld („${fieldName}“) enthält einen oder mehrere leere Werte. Bitte überprüfen Sie es und versuchen Sie es erneut.`,
+        column: ({name}: SpreadSheetColumnParams) => `Spalte ${name}`,
+        fieldNotMapped: ({fieldName}: SpreadFieldNameParams) => `Ups! Ein erforderliches Feld („${fieldName}“) wurde nicht zugeordnet. Bitte überprüfen und erneut versuchen.`,
+        singleFieldMultipleColumns: ({fieldName}: SpreadFieldNameParams) =>
+            `Ups! Du hast ein einzelnes Feld („${fieldName}“) mehreren Spalten zugeordnet. Bitte überprüfe dies und versuche es erneut.`,
+        emptyMappedField: ({fieldName}: SpreadFieldNameParams) =>
+            `Ups! Das Feld („${fieldName}“) enthält einen oder mehrere leere Werte. Bitte überprüfen Sie es und versuchen Sie es erneut.`,
         importSuccessfulTitle: 'Import erfolgreich',
-        importCategoriesSuccessfulDescription: ({categories}: {categories: number}) => (categories > 1 ? `${categories} Kategorien wurden hinzugefügt.` : '1 Kategorie wurde hinzugefügt.'),
-        importMembersSuccessfulDescription: ({added, updated}: {added: number; updated: number}) => {
+        importCategoriesSuccessfulDescription: ({categories}: SpreadCategoriesParams) => (categories > 1 ? `${categories} Kategorien wurden hinzugefügt.` : '1 Kategorie wurde hinzugefügt.'),
+        importMembersSuccessfulDescription: ({added, updated}: ImportMembersSuccessfulDescriptionParams) => {
             if (!added && !updated) {
                 return 'Es wurden keine Mitglieder hinzugefügt oder aktualisiert.';
             }
@@ -1016,9 +1014,10 @@ const translations: TranslationDeepObject<typeof en> = {
             }
             return added > 1 ? `${added} Mitglieder wurden hinzugefügt.` : '1 Mitglied wurde hinzugefügt.';
         },
-        importTagsSuccessfulDescription: ({tags}: {tags: number}) => (tags > 1 ? `${tags} Tags wurden hinzugefügt.` : '1 Tag wurde hinzugefügt.'),
+        importTagsSuccessfulDescription: ({tags}: ImportTagsSuccessfulDescriptionParams) => (tags > 1 ? `${tags} Tags wurden hinzugefügt.` : '1 Tag wurde hinzugefügt.'),
         importMultiLevelTagsSuccessfulDescription: 'Hierarchische Tags wurden hinzugefügt.',
-        importPerDiemRatesSuccessfulDescription: ({rates}: {rates: number}) => (rates > 1 ? `${rates} Übernachtungspauschalen wurden hinzugefügt.` : '1 Pauschale wurde hinzugefügt.'),
+        importPerDiemRatesSuccessfulDescription: ({rates}: ImportPerDiemRatesSuccessfulDescriptionParams) =>
+            rates > 1 ? `${rates} Übernachtungspauschalen wurden hinzugefügt.` : '1 Pauschale wurde hinzugefügt.',
         importFailedTitle: 'Import fehlgeschlagen',
         importFailedDescription: 'Bitte stelle sicher, dass alle Felder korrekt ausgefüllt sind, und versuche es erneut. Wenn das Problem weiterhin besteht, wende dich bitte an Concierge.',
         importDescription: 'Wählen Sie aus, welche Felder aus Ihrer Tabelle zugeordnet werden sollen, indem Sie auf das Dropdown-Menü neben jeder der importierten Spalten unten klicken.',
@@ -1199,8 +1198,14 @@ const translations: TranslationDeepObject<typeof en> = {
             one: 'Sind Sie sicher, dass Sie diese Ausgabe löschen möchten?',
             other: 'Sind Sie sicher, dass Sie diese Ausgaben löschen möchten?',
         }),
-        deleteReport: 'Bericht löschen',
-        deleteReportConfirmation: 'Sind Sie sicher, dass Sie diesen Bericht löschen möchten?',
+        deleteReport: () => ({
+            one: 'Bericht löschen',
+            other: 'Berichte löschen',
+        }),
+        deleteReportConfirmation: () => ({
+            one: 'Möchten Sie diesen Bericht wirklich löschen?',
+            other: 'Möchten Sie diese Berichte wirklich löschen?',
+        }),
         settledExpensify: 'Bezahlt',
         done: 'Fertig',
         settledElsewhere: 'Anderswo bezahlt',
@@ -1451,8 +1456,9 @@ const translations: TranslationDeepObject<typeof en> = {
         moveExpensesError: 'Sie können Per Diem-Ausgaben nicht in Berichte auf anderen Arbeitsbereichen verschieben, da sich die Tagessätze zwischen Arbeitsbereichen unterscheiden können.',
         changeApprover: {
             title: 'Genehmigenden ändern',
-            header: ({workflowSettingLink}: WorkflowSettingsParam) =>
-                `Wählen Sie eine Option, um den Genehmiger für diesen Bericht zu ändern. (Aktualisieren Sie Ihre <a href="${workflowSettingLink}">Arbeitsbereichseinstellungen</a>, um diese Änderung dauerhaft für alle Berichte zu übernehmen.)`,
+            subtitle: 'Wählen Sie eine Option, um den Genehmiger für diesen Bericht zu ändern.',
+            description: ({workflowSettingLink}: WorkflowSettingsParam) =>
+                `Sie können den Genehmiger auch dauerhaft für alle Berichte in Ihren <a href="${workflowSettingLink}">Workflow-Einstellungen</a> ändern.`,
             changedApproverMessage: (managerID: number) => `Genehmigenden in <mention-user accountID="${managerID}"/> geändert`,
             actions: {
                 addApprover: 'Genehmiger hinzufügen',
@@ -1470,13 +1476,7 @@ const translations: TranslationDeepObject<typeof en> = {
         splitDateRange: ({startDate, endDate, count}: SplitDateRangeParams) => `${startDate} bis ${endDate} (${count} Tage)`,
         splitByDate: 'Nach Datum aufteilen',
         routedDueToDEW: ({to}: RoutedDueToDEWParams) => `bericht aufgrund eines benutzerdefinierten Genehmigungsworkflows an ${to} weitergeleitet`,
-        timeTracking: {
-            hoursAt: (hours: number, rate: string) => `${hours} ${hours === 1 ? 'Stunde' : 'Stunden'} @ ${rate} / Stunde`,
-            hrs: 'Std.',
-            hours: 'Stunden',
-            ratePreview: (rate: string) => `${rate} / Stunde`,
-            amountTooLargeError: 'Der Gesamtbetrag ist zu hoch. Verringere die Stunden oder reduziere den Satz.',
-        },
+        timeTracking: {hoursAt: (hours: number, rate: string) => `${hours} ${hours === 1 ? 'Stunde' : 'Stunden'} @ ${rate} / Stunde`, hrs: 'Std.'},
     },
     transactionMerge: {
         listPage: {
@@ -1955,6 +1955,13 @@ const translations: TranslationDeepObject<typeof en> = {
         chatToConciergeToUnlock: 'Chatte mit Concierge, um Sicherheitsbedenken zu klären und dein Konto wieder freizuschalten.',
         chatWithConcierge: 'Chat mit Concierge',
     },
+    passwordPage: {
+        changePassword: 'Passwort ändern',
+        changingYourPasswordPrompt: 'Wenn Sie Ihr Passwort ändern, wird es sowohl für Ihr Expensify.com-Konto als auch für Ihr New-Expensify-Konto aktualisiert.',
+        currentPassword: 'Aktuelles Passwort',
+        newPassword: 'Neues Passwort',
+        newPasswordPrompt: 'Ihr neues Passwort muss sich von Ihrem alten Passwort unterscheiden und mindestens 8 Zeichen, 1 Großbuchstaben, 1 Kleinbuchstaben und 1 Zahl enthalten.',
+    },
     twoFactorAuth: {
         headerTitle: 'Zwei-Faktor-Authentifizierung',
         twoFactorAuthEnabled: 'Zwei-Faktor-Authentifizierung aktiviert',
@@ -2354,7 +2361,7 @@ ${amount} für ${merchant} – ${date}`,
     transferAmountPage: {
         transfer: ({amount}: TransferParams) => `Überweisen${amount ? ` ${amount}` : ''}`,
         instant: 'Sofort (Debitkarte)',
-        instantSummary: (rate: string, minAmount: string) => `${rate}% Gebühr (mindestens ${minAmount})`,
+        instantSummary: ({rate, minAmount}: InstantSummaryParams) => `${rate}% Gebühr (mindestens ${minAmount})`,
         ach: '1–3 Werktage (Bankkonto)',
         achSummary: 'Keine Gebühr',
         whichAccount: 'Welches Konto?',
@@ -2389,31 +2396,10 @@ ${amount} für ${merchant} – ${date}`,
             comment: (value: string) => `Beschreibung in „${value}“ ändern`,
             merchant: (value: string) => `Händler aktualisieren auf „${value}“`,
             reimbursable: (value: boolean) => `Ausgabe ${value ? 'erstattungsfähig' : 'nicht erstattungsfähig'} aktualisieren`,
-            report: (value: string) => `Zu einem Bericht mit dem Namen „${value}“ hinzufügen`,
+            report: (value: string) => `Einen Bericht mit dem Namen „${value}“ hinzufügen`,
             tag: (value: string) => `Tag auf „${value}“ aktualisieren`,
             tax: (value: string) => `Steuersatz auf ${value} aktualisieren`,
         },
-        newRule: 'Neue Regel',
-        addRule: {
-            title: 'Regel hinzufügen',
-            expenseContains: 'Wenn Ausgabe enthält:',
-            applyUpdates: 'Wenden Sie dann diese Aktualisierungen an:',
-            merchantHint: 'Gib * ein, um eine Regel zu erstellen, die für alle Händler gilt',
-            addToReport: 'Zu einem Bericht mit dem Namen hinzufügen',
-            createReport: 'Bericht bei Bedarf erstellen',
-            applyToExistingExpenses: 'Auf passende vorhandene Spesen anwenden',
-            confirmError: 'Geben Sie einen Händler ein und nehmen Sie mindestens eine Änderung vor',
-            confirmErrorMerchant: 'Bitte Händler eingeben',
-            confirmErrorUpdate: 'Bitte wende mindestens eine Aktualisierung an',
-            saveRule: 'Regel speichern',
-        },
-        editRule: {title: 'Regel bearbeiten'},
-        deleteRule: {
-            deleteSingle: 'Regel löschen',
-            deleteMultiple: 'Regeln löschen',
-            deleteSinglePrompt: 'Sind Sie sicher, dass Sie diese Regel löschen möchten?',
-            deleteMultiplePrompt: 'Möchten Sie diese Regeln wirklich löschen?',
-        },
     },
     preferencesPage: {
         appSection: {
@@ -2910,7 +2896,7 @@ ${
             dateShouldBeBefore: (dateString: string) => `Das Datum sollte vor dem ${dateString} liegen`,
             dateShouldBeAfter: (dateString: string) => `Datum muss nach ${dateString} liegen`,
             hasInvalidCharacter: 'Name darf nur lateinische Zeichen enthalten',
-            incorrectZipFormat: (zipFormat?: string) => `Ungültiges Postleitzahlformat${zipFormat ? `Akzeptables Format: ${zipFormat}` : ''}`,
+            incorrectZipFormat: ({zipFormat}: IncorrectZipFormatParams = {}) => `Ungültiges Postleitzahlformat${zipFormat ? `Akzeptables Format: ${zipFormat}` : ''}`,
             invalidPhoneNumber: `Bitte stelle sicher, dass die Telefonnummer gültig ist (z. B. ${CONST.EXAMPLE_PHONE_NUMBER})`,
         },
     },
@@ -2994,7 +2980,7 @@ ${
     },
     focusModeUpdateModal: {
         title: 'Willkommen im #Focus-Modus!',
-        prompt: (priorityModePageUrl: string) =>
+        prompt: ({priorityModePageUrl}: FocusModeUpdateParams) =>
             `Behalte den Überblick, indem du nur ungelesene Chats oder Chats siehst, die deine Aufmerksamkeit erfordern. Keine Sorge, du kannst dies jederzeit in den <a href="${priorityModePageUrl}">Einstellungen</a> ändern.`,
     },
     notFound: {
@@ -3014,6 +3000,15 @@ ${
         subtitle: 'Ihre Anfrage konnte nicht abgeschlossen werden. Bitte versuchen Sie es später noch einmal.',
         wrongTypeSubtitle: 'Diese Suche ist ungültig. Versuche, deine Suchkriterien anzupassen.',
     },
+    setPasswordPage: {
+        enterPassword: 'Passwort eingeben',
+        setPassword: 'Passwort festlegen',
+        newPasswordPrompt: 'Dein Passwort muss mindestens 8 Zeichen, 1 Großbuchstaben, 1 Kleinbuchstaben und 1 Zahl enthalten.',
+        passwordFormTitle: 'Willkommen zurück bei New Expensify! Bitte lege dein Passwort fest.',
+        passwordNotSet: 'Wir konnten Ihr neues Passwort nicht festlegen. Wir haben Ihnen einen neuen Passwort-Link gesendet, damit Sie es erneut versuchen können.',
+        setPasswordLinkInvalid: 'Dieser Link zum Festlegen des Passworts ist ungültig oder abgelaufen. Ein neuer wartet bereits in deinem E-Mail-Posteingang auf dich!',
+        validateAccount: 'Konto verifizieren',
+    },
     statusPage: {
         status: 'Status',
         statusExplanation: 'Füge ein Emoji hinzu, damit deine Kolleg:innen und Freund:innen leicht sehen können, was los ist. Du kannst optional auch eine Nachricht hinzufügen!',
@@ -3157,13 +3152,10 @@ ${
         errorMessageInvalidPhone: `Bitte gib eine gültige Telefonnummer ohne Klammern oder Bindestriche ein. Wenn du außerhalb der USA bist, gib bitte deine Ländervorwahl an (z. B. ${CONST.EXAMPLE_PHONE_NUMBER}).`,
         errorMessageInvalidEmail: 'Ungültige E-Mail',
         userIsAlreadyMember: ({login, name}: UserIsAlreadyMemberParams) => `${login} ist bereits Mitglied von ${name}`,
-        userIsAlreadyAnAdmin: ({login, name}: UserIsAlreadyMemberParams) => `${login} ist bereits ein Admin von ${name}`,
     },
     onfidoStep: {
         acceptTerms: 'Indem Sie mit der Anfrage zur Aktivierung Ihres Expensify Wallets fortfahren, bestätigen Sie, dass Sie gelesen, verstanden und akzeptiert haben',
         facialScan: 'Onfidos Richtlinie und Einverständniserklärung zur Gesichtserfassung',
-        onfidoLinks: (onfidoTitle: string) =>
-            `<muted-text-micro>${onfidoTitle} <a href='${CONST.ONFIDO_FACIAL_SCAN_POLICY_URL}'>Onfidos Richtlinie und Einverständniserklärung zur Gesichtserfassung</a>, <a href='${CONST.ONFIDO_PRIVACY_POLICY_URL}'>Datenschutz</a> und <a href='${CONST.ONFIDO_TERMS_OF_SERVICE_URL}'>Nutzungsbedingungen</a>.</muted-text-micro>`,
         tryAgain: 'Erneut versuchen',
         verifyIdentity: 'Identität bestätigen',
         letsVerifyIdentity: 'Lass uns deine Identität bestätigen',
@@ -3662,7 +3654,7 @@ ${
         flight: 'Flug',
         flightDetails: {
             passenger: 'Passagier',
-            layover: (layover: string) => `<muted-text-label>Sie haben einen <strong>${layover} Zwischenstopp</strong> vor diesem Flug</muted-text-label>`,
+            layover: ({layover}: FlightLayoverParams) => `<muted-text-label>Sie haben einen <strong>${layover} Zwischenstopp</strong> vor diesem Flug</muted-text-label>`,
             takeOff: 'Abflug',
             landing: 'Startseite',
             seat: 'Sitz',
@@ -3753,18 +3745,17 @@ ${
                 `Aktivierung von Reisen für die Domain ${domain} fehlgeschlagen. Bitte überprüfen Sie diese Domain und aktivieren Sie Reisen dafür.`,
         },
         updates: {
-            bookingTicketed: (airlineCode: string, origin: string, destination: string, startDate: string, confirmationID = '') =>
+            bookingTicketed: ({airlineCode, origin, destination, startDate, confirmationID = ''}: FlightParams) =>
                 `Ihr Flug ${airlineCode} (${origin} → ${destination}) am ${startDate} wurde gebucht. Bestätigungscode: ${confirmationID}`,
-            ticketVoided: (airlineCode: string, origin: string, destination: string, startDate: string) =>
+            ticketVoided: ({airlineCode, origin, destination, startDate}: FlightParams) =>
                 `Ihr Ticket für den Flug ${airlineCode} (${origin} → ${destination}) am ${startDate} wurde storniert.`,
-            ticketRefunded: (airlineCode: string, origin: string, destination: string, startDate: string) =>
+            ticketRefunded: ({airlineCode, origin, destination, startDate}: FlightParams) =>
                 `Ihr Ticket für Flug ${airlineCode} (${origin} → ${destination}) am ${startDate} wurde erstattet oder umgebucht.`,
-            flightCancelled: (airlineCode: string, origin: string, destination: string, startDate: string) =>
+            flightCancelled: ({airlineCode, origin, destination, startDate}: FlightParams) =>
                 `Ihr Flug ${airlineCode} (${origin} → ${destination}) am ${startDate}} wurde von der Fluggesellschaft storniert.`,
             flightScheduleChangePending: (airlineCode: string) => `Die Fluggesellschaft hat eine Flugplanänderung für Flug ${airlineCode} vorgeschlagen; wir warten auf die Bestätigung.`,
             flightScheduleChangeClosed: (airlineCode: string, startDate?: string) => `Flugplanänderung bestätigt: Flug ${airlineCode} startet jetzt um ${startDate}.`,
-            flightUpdated: (airlineCode: string, origin: string, destination: string, startDate: string) =>
-                `Ihr Flug ${airlineCode} (${origin} → ${destination}) am ${startDate} wurde aktualisiert.`,
+            flightUpdated: ({airlineCode, origin, destination, startDate}: FlightParams) => `Ihr Flug ${airlineCode} (${origin} → ${destination}) am ${startDate} wurde aktualisiert.`,
             flightCabinChanged: (airlineCode: string, cabinClass?: string) => `Ihre Kabinenklasse wurde für den Flug ${airlineCode} auf ${cabinClass} aktualisiert.`,
             flightSeatConfirmed: (airlineCode: string) => `Ihre Sitzplatzzuweisung auf Flug ${airlineCode} wurde bestätigt.`,
             flightSeatChanged: (airlineCode: string) => `Ihre Sitzplatzzuweisung auf Flug ${airlineCode} wurde geändert.`,
@@ -4581,7 +4572,7 @@ ${
                 importTaxDescription: 'Steuergruppen aus NetSuite importieren.',
                 importCustomFields: {
                     chooseOptionBelow: 'Wähle eine der folgenden Optionen:',
-                    label: (importedTypes: string[]) => `Importiert als ${importedTypes.join('und')}`,
+                    label: ({importedTypes}: ImportedTypesParams) => `Importiert als ${importedTypes.join('und')}`,
                     requiredFieldError: ({fieldName}: RequiredFieldParams) => `Bitte geben Sie das ${fieldName} ein`,
                     customSegments: {
                         title: 'Benutzerdefinierte Segmente/Einträge',
@@ -4696,18 +4687,18 @@ _Für ausführlichere Anweisungen [besuchen Sie unsere Hilfeseite](${CONST.NETSU
                     [CONST.INTEGRATION_ENTITY_MAP_TYPES.NETSUITE_DEFAULT]: {
                         label: 'Standard-NetSuite-Mitarbeiter',
                         description: 'Nicht in Expensify importiert, beim Export angewendet',
-                        footerContent: (importField: string) =>
+                        footerContent: ({importField}: ImportFieldParams) =>
                             `Wenn du ${importField} in NetSuite verwendest, wenden wir den Standardwert an, der im Mitarbeitendendatensatz festgelegt ist, sobald nach „Expense Report“ oder „Journal Entry“ exportiert wird.`,
                     },
                     [CONST.INTEGRATION_ENTITY_MAP_TYPES.TAG]: {
                         label: 'Stichwörter',
                         description: 'Auf Positionsebene',
-                        footerContent: (importField: string) => `${startCase(importField)} wird für jede einzelne Ausgabe im Bericht eines Mitarbeiters auswählbar sein.`,
+                        footerContent: ({importField}: ImportFieldParams) => `${startCase(importField)} wird für jede einzelne Ausgabe im Bericht eines Mitarbeiters auswählbar sein.`,
                     },
                     [CONST.INTEGRATION_ENTITY_MAP_TYPES.REPORT_FIELD]: {
                         label: 'Berichtsfelder',
                         description: 'Berichtsebene',
-                        footerContent: (importField: string) => `${startCase(importField)}-Auswahl gilt für alle Ausgaben auf dem Bericht eines Mitarbeiters.`,
+                        footerContent: ({importField}: ImportFieldParams) => `${startCase(importField)}-Auswahl gilt für alle Ausgaben auf dem Bericht eines Mitarbeiters.`,
                     },
                 },
             },
@@ -4785,7 +4776,7 @@ _Für ausführlichere Anweisungen [besuchen Sie unsere Hilfeseite](${CONST.NETSU
                 commercialFeedPlaidDetails: `Erfordert die Einrichtung mit Ihrer Bank, aber wir führen Sie durch den Prozess. Dies ist in der Regel auf größere Unternehmen beschränkt.`,
                 directFeedDetails: 'Der einfachste Ansatz. Verbinde dich direkt mit deinen Master-Zugangsdaten. Diese Methode ist am gebräuchlichsten.',
                 enableFeed: {
-                    title: (provider: string) => `Aktiviere deinen ${provider}-Feed`,
+                    title: ({provider}: GoBackMessageParams) => `Aktiviere deinen ${provider}-Feed`,
                     heading:
                         'Wir verfügen über eine direkte Integration mit Ihrem Kartenaussteller und können Ihre Transaktionsdaten schnell und genau in Expensify importieren.\n\nUm zu beginnen, gehen Sie einfach wie folgt vor:',
                     visa: 'Wir verfügen über globale Integrationen mit Visa, wobei die Berechtigung je nach Bank und Kartenprogramm variiert.\n\nUm loszulegen, gehen Sie einfach wie folgt vor:',
@@ -5061,25 +5052,6 @@ _Für ausführlichere Anweisungen [besuchen Sie unsere Hilfeseite](${CONST.NETSU
                     subtitle: 'Nutzen Sie Expensify Travel für die besten Reiseangebote und verwalten Sie alle Ihre Geschäftsausgaben an einem Ort.',
                     ctaText: 'Buchen oder verwalten',
                 },
-                travelInvoicing: {
-                    travelBookingSection: {
-                        title: 'Reisebuchung',
-                        subtitle: 'Glückwunsch! Du kannst jetzt in diesem Workspace Reisen buchen und verwalten.',
-                        manageTravelLabel: 'Reisen verwalten',
-                    },
-                    centralInvoicingSection: {
-                        title: 'Zentrale Rechnungsstellung',
-                        subtitle: 'Zentralisieren Sie alle Reisekosten in einer monatlichen Rechnung, anstatt zum Zeitpunkt des Kaufs zu bezahlen.',
-                        learnHow: "So funktioniert's.",
-                        subsections: {
-                            currentTravelSpendLabel: 'Aktuelle Reisekosten',
-                            currentTravelSpendCta: 'Saldo bezahlen',
-                            currentTravelLimitLabel: 'Aktuelles Reiselimit',
-                            settlementAccountLabel: 'Ausgleichskonto',
-                            settlementFrequencyLabel: 'Abrechnungshäufigkeit',
-                        },
-                    },
-                },
             },
             expensifyCard: {
                 title: 'Expensify Card',
@@ -5368,7 +5340,7 @@ _Für ausführlichere Anweisungen [besuchen Sie unsere Hilfeseite](${CONST.NETSU
                 prompt3: 'Ein Backup herunterladen',
                 prompt4: 'zuerst.',
             },
-            importedTagsMessage: (columnCounts: number) =>
+            importedTagsMessage: ({columnCounts}: ImportedTagsMessageParams) =>
                 `Wir haben *${columnCounts} Spalten* in Ihrer Tabelle gefunden. Wählen Sie *Name* neben der Spalte aus, die die Tag-Namen enthält. Sie können außerdem *Aktiviert* neben der Spalte auswählen, die den Tag-Status festlegt.`,
             cannotDeleteOrDisableAllTags: {
                 title: 'Es können nicht alle Tags gelöscht oder deaktiviert werden',
@@ -5539,8 +5511,7 @@ _Für ausführlichere Anweisungen [besuchen Sie unsere Hilfeseite](${CONST.NETSU
                 giveItNameInstruction: 'Mach sie eindeutig genug, um sie von anderen Karten unterscheiden zu können. Konkrete Anwendungsfälle sind sogar noch besser!',
                 cardName: 'Kartenname',
                 letsDoubleCheck: 'Lass uns noch einmal überprüfen, ob alles richtig aussieht.',
-                willBeReadyToUse: 'Diese Karte ist sofort einsatzbereit.',
-                willBeReadyToShip: 'Diese Karte ist sofort versandbereit.',
+                willBeReady: 'Diese Karte ist sofort einsatzbereit.',
                 cardholder: 'Karteninhaber',
                 cardType: 'Kartentyp',
                 limit: 'Limit',
@@ -6198,7 +6169,7 @@ Fordere Spesendetails wie Belege und Beschreibungen an, lege Limits und Standard
         rules: {
             individualExpenseRules: {
                 title: 'Ausgaben',
-                subtitle: (categoriesPageLink: string, tagsPageLink: string) =>
+                subtitle: ({categoriesPageLink, tagsPageLink}: IndividualExpenseRulesSubtitleParams) =>
                     `<muted-text>Legen Sie Ausgabenkontrollen und Standardwerte für einzelne Ausgaben fest. Sie können auch Regeln für <a href="${categoriesPageLink}">Kategorien</a> und <a href="${tagsPageLink}">Tags</a> erstellen.</muted-text>`,
                 receiptRequiredAmount: 'Erforderlicher Belegbetrag',
                 receiptRequiredAmountDescription: 'Belege verlangen, wenn die Ausgaben diesen Betrag überschreiten, sofern dies nicht durch eine Kategorienregel außer Kraft gesetzt wird.',
@@ -6269,10 +6240,6 @@ Fordere Spesendetails wie Belege und Beschreibungen an, lege Limits und Standard
                 title: 'Kategorierichtlinien',
                 approver: 'Genehmiger',
                 requireDescription: 'Beschreibung erforderlich',
-                requireFields: 'Felder verpflichtend machen',
-                requiredFieldsTitle: 'Pflichtfelder',
-                requiredFieldsDescription: (categoryName: string) => `Dies gilt für alle Ausgaben, die als <strong>${categoryName}</strong> kategorisiert sind.`,
-                requireAttendees: 'Teilnehmer erforderlich machen',
                 descriptionHint: 'Hinweis zur Beschreibung',
                 descriptionHintDescription: (categoryName: string) =>
                     `Mitarbeitende daran erinnern, zusätzliche Informationen für Ausgaben der Kategorie „${categoryName}“ anzugeben. Dieser Hinweis erscheint im Beschreibungsfeld von Ausgaben.`,
@@ -6506,6 +6473,11 @@ Fordere Spesendetails wie Belege und Beschreibungen an, lege Limits und Standard
         deleteReportField: (fieldType: string, fieldName?: string) => `${fieldType}-Berichts­feld „${fieldName}“ entfernt`,
         preventSelfApproval: ({oldValue, newValue}: UpdatedPolicyPreventSelfApprovalParams) =>
             `„Verhinderung der Selbstgenehmigung“ aktualisiert auf „${newValue === 'true' ? 'Aktiviert' : 'Deaktiviert'}“ (zuvor „${oldValue === 'true' ? 'Aktiviert' : 'Deaktiviert'}“)`,
+        updateMaxExpenseAmountNoReceipt: ({oldValue, newValue}: UpdatedPolicyFieldWithNewAndOldValueParams) =>
+            `den maximalen Belegbetrag für erforderliche Ausgaben auf ${newValue} geändert (zuvor ${oldValue})`,
+        updateMaxExpenseAmount: ({oldValue, newValue}: UpdatedPolicyFieldWithNewAndOldValueParams) => `den maximalen Spesenbetrag für Verstöße auf ${newValue} geändert (zuvor ${oldValue})`,
+        updateMaxExpenseAge: ({oldValue, newValue}: UpdatedPolicyFieldWithNewAndOldValueParams) =>
+            `„Maximales Spesenalter (Tage)“ aktualisiert auf „${newValue}“ (zuvor „${oldValue === 'false' ? CONST.POLICY.DEFAULT_MAX_EXPENSE_AGE : oldValue}“)`,
         updateMonthlyOffset: ({oldValue, newValue}: UpdatedPolicyFieldWithNewAndOldValueParams) => {
             if (!oldValue) {
                 return `Das Datum für die monatliche Berichtseinreichung auf „${newValue}“ festlegen`;
@@ -6658,40 +6630,8 @@ Fordere Spesendetails wie Belege und Beschreibungen an, lege Limits und Standard
                 }
             }
         },
-        setDefaultBankAccount: ({bankAccountName, maskedBankAccountNumber}: {bankAccountName: string; maskedBankAccountNumber: string}) =>
-            `das Standardgeschäftsbankkonto auf „${bankAccountName ? `${bankAccountName}: ` : ''}${maskedBankAccountNumber}“ festlegen`,
-        removedDefaultBankAccount: ({bankAccountName, maskedBankAccountNumber}: {bankAccountName: string; maskedBankAccountNumber: string}) =>
-            `das Standard-Geschäftsbankkonto „${bankAccountName ? `${bankAccountName}: ` : ''}${maskedBankAccountNumber}“ entfernt`,
-        changedDefaultBankAccount: ({
-            bankAccountName,
-            maskedBankAccountNumber,
-            oldBankAccountName,
-            oldMaskedBankAccountNumber,
-        }: {
-            bankAccountName: string;
-            maskedBankAccountNumber: string;
-            oldBankAccountName: string;
-            oldMaskedBankAccountNumber: string;
-        }) =>
-            `Standard-Geschäftsbankkonto geändert zu „${bankAccountName ? `${bankAccountName}: ` : ''}${maskedBankAccountNumber}“ (zuvor „${oldBankAccountName ? `${oldBankAccountName}: ` : ''}${oldMaskedBankAccountNumber}“)`,
-        changedInvoiceCompanyName: ({newValue, oldValue}: {newValue: string; oldValue?: string}) =>
-            oldValue ? `den Firmennamen der Rechnung in „${newValue}“ geändert (zuvor „${oldValue}“)` : `den Rechnungsfirmennamen auf „${newValue}“ festlegen`,
-        changedInvoiceCompanyWebsite: ({newValue, oldValue}: {newValue: string; oldValue?: string}) =>
-            oldValue ? `die Firmenwebsite der Rechnung wurde in „${newValue}“ geändert (zuvor „${oldValue}“)` : `setzen Sie die Firmenwebsite der Rechnung auf „${newValue}“`,
         changedCustomReportNameFormula: ({newValue, oldValue}: UpdatedPolicyFieldWithNewAndOldValueParams) =>
             `benutzerdefinierte Berichtsnamensformel in „${newValue}“ geändert (zuvor „${oldValue}“)`,
-        changedReimburser: ({newReimburser, previousReimburser}: UpdatedPolicyReimburserParams) =>
-            previousReimburser ? `hat den autorisierten Zahler in „${newReimburser}“ geändert (zuvor „${previousReimburser}“)` : `den autorisierten Zahler in „${newReimburser}“ geändert`,
-        setReceiptRequiredAmount: ({newValue}: UpdatedPolicyFieldWithNewAndOldValueParams) => `erforderlichen Belegbetrag auf „${newValue}“ festlegen`,
-        changedReceiptRequiredAmount: ({oldValue, newValue}: UpdatedPolicyFieldWithNewAndOldValueParams) =>
-            `Betrag für erforderlichen Beleg auf „${newValue}“ geändert (zuvor „${oldValue}“)`,
-        removedReceiptRequiredAmount: ({oldValue}: UpdatedPolicyFieldWithNewAndOldValueParams) => `Betrag für erforderlichen Beleg entfernt (zuvor „${oldValue}“)`,
-        setMaxExpenseAmount: ({newValue}: UpdatedPolicyFieldWithNewAndOldValueParams) => `maximalen Spesenbetrag auf „${newValue}“ festlegen`,
-        changedMaxExpenseAmount: ({oldValue, newValue}: UpdatedPolicyFieldWithNewAndOldValueParams) => `maximalen Ausgabenbetrag auf „${newValue}“ geändert (zuvor „${oldValue}“)`,
-        removedMaxExpenseAmount: ({oldValue}: UpdatedPolicyFieldWithNewAndOldValueParams) => `maximalen Ausgabenbetrag entfernt (zuvor „${oldValue}“)`,
-        setMaxExpenseAge: ({newValue}: UpdatedPolicyFieldWithNewAndOldValueParams) => `maximales Ausgabenalter auf „${newValue}“ Tage festlegen`,
-        changedMaxExpenseAge: ({oldValue, newValue}: UpdatedPolicyFieldWithNewAndOldValueParams) => `maximales Ausgabenalter auf „${newValue}“ Tage geändert (zuvor „${oldValue}“)`,
-        removedMaxExpenseAge: ({oldValue}: UpdatedPolicyFieldWithNewAndOldValueParams) => `maximales Ausgabenalter entfernt (zuvor „${oldValue}“ Tage)`,
     },
     roomMembersPage: {
         memberNotFound: 'Mitglied nicht gefunden.',
@@ -6858,7 +6798,7 @@ Fordere Spesendetails wie Belege und Beschreibungen an, lege Limits und Standard
             amount: {
                 lessThan: ({amount}: OptionalParam<RequestAmountParams> = {}) => `Weniger als ${amount ?? ''}`,
                 greaterThan: ({amount}: OptionalParam<RequestAmountParams> = {}) => `Größer als ${amount ?? ''}`,
-                between: (greaterThan: string, lessThan: string) => `Zwischen ${greaterThan} und ${lessThan}`,
+                between: ({greaterThan, lessThan}: FiltersAmountBetweenParams) => `Zwischen ${greaterThan} und ${lessThan}`,
                 equalTo: ({amount}: OptionalParam<RequestAmountParams> = {}) => `Gleich ${amount ?? ''}`,
             },
             card: {
@@ -7287,7 +7227,6 @@ Fordere Spesendetails wie Belege und Beschreibungen an, lege Limits und Standard
         maxAge: ({maxAge}: ViolationsMaxAgeParams) => `Datum älter als ${maxAge} Tage`,
         missingCategory: 'Fehlende Kategorie',
         missingComment: 'Beschreibung für ausgewählte Kategorie erforderlich',
-        missingAttendees: 'Für diese Kategorie sind mehrere Teilnehmer erforderlich',
         missingTag: ({tagName}: ViolationsMissingTagParams = {}) => `Fehlende ${tagName ?? 'Tag'}`,
         modifiedAmount: ({type, displayPercentVariance}: ViolationsModifiedAmountParams) => {
             switch (type) {
@@ -7395,7 +7334,6 @@ Fordere Spesendetails wie Belege und Beschreibungen an, lege Limits und Standard
         hold: 'Diese Ausgabe wurde zurückgestellt',
         resolvedDuplicates: 'Duplikat behoben',
         companyCardRequired: 'Firmenkartenkäufe erforderlich',
-        noRoute: 'Bitte wählen Sie eine gültige Adresse aus',
     },
     reportViolations: {
         [CONST.REPORT_VIOLATIONS.FIELD_REQUIRED]: ({fieldName}: RequiredFieldParams) => `${fieldName} ist erforderlich`,
@@ -8022,18 +7960,9 @@ Hier ist ein *Testbeleg*, um dir zu zeigen, wie es funktioniert:`,
             addAdminError: 'Dieser Benutzer kann nicht als Admin hinzugefügt werden. Bitte versuche es erneut.',
             revokeAdminAccess: 'Administratorzugriff widerrufen',
             cantRevokeAdminAccess: 'Adminzugriff kann dem technischen Ansprechpartner nicht entzogen werden',
-            error: {
-                removeAdmin: 'Dieser Benutzer kann nicht als Administrator entfernt werden. Bitte versuche es erneut.',
-                removeDomain: 'Diese Domain kann nicht entfernt werden. Bitte versuche es erneut.',
-                removeDomainNameInvalid: 'Bitte gib deinen Domainnamen ein, um ihn zurückzusetzen.',
-            },
-            resetDomain: 'Domain zurücksetzen',
-            resetDomainExplanation: ({domainName}: {domainName?: string}) => `Bitte geben Sie <strong>${domainName}</strong> ein, um das Zurücksetzen der Domain zu bestätigen.`,
-            enterDomainName: 'Geben Sie hier Ihren Domänennamen ein',
-            resetDomainInfo: `Diese Aktion ist <strong>dauerhaft</strong> und die folgenden Daten werden gelöscht: <br/> <ul><li>Firmenkarten-Verbindungen und alle nicht eingereichten Ausgaben von diesen Karten</li> <li>SAML- und Gruppeneinstellungen</li> </ul> Alle Konten, Workspaces, Berichte, Ausgaben und anderen Daten bleiben erhalten. <br/><br/>Hinweis: Sie können diese Domain aus Ihrer Domainliste entfernen, indem Sie die zugehörige E-Mail aus Ihren <a href="#">Kontaktmethoden</a> löschen.`,
+            error: {removeAdmin: 'Dieser Benutzer kann nicht als Admin entfernt werden. Bitte versuchen Sie es erneut.'},
         },
         members: {title: 'Mitglieder', findMember: 'Mitglied suchen'},
-        domainAdmins: 'Domain-Admins',
     },
     gps: {
         tooltip: 'GPS-Verfolgung läuft! Wenn du fertig bist, stoppe die Verfolgung unten.',
@@ -8074,13 +8003,6 @@ Hier ist ein *Testbeleg*, um dir zu zeigen, wie es funktioniert:`,
             subtitle: 'Protokolliere Meilen oder Kilometer automatisch mit GPS und verwandle Fahrten sofort in Ausgaben.',
             button: 'App herunterladen',
         },
-        notification: {title: 'GPS-Tracking läuft', body: 'Zur App gehen, um abzuschließen'},
-        locationServicesRequiredModal: {
-            title: 'Standortzugriff erforderlich',
-            confirm: 'Einstellungen öffnen',
-            prompt: 'Bitte erlaube den Standortzugriff in den Einstellungen deines Geräts, um die GPS-Distanzverfolgung zu starten.',
-        },
-        fabGpsTripExplained: 'Zur GPS-Ansicht wechseln (Schnellaktion)',
     },
 };
 // IMPORTANT: This line is manually replaced in generate translation files by scripts/generateTranslations.ts,
diff --git a/src/languages/en.ts b/src/languages/en.ts
index 4d0b71df0d2b..946ab9b84316 100755
--- a/src/languages/en.ts
+++ b/src/languages/en.ts
@@ -16,6 +16,24 @@ import type {
     EditActionParams,
     ExportAgainModalDescriptionParams,
     ExportIntegrationSelectedParams,
+    FileLimitParams,
+    FileTypeParams,
+    FiltersAmountBetweenParams,
+    FlightLayoverParams,
+    FlightParams,
+    FocusModeUpdateParams,
+    FormattedMaxLengthParams,
+    GoBackMessageParams,
+    HarvestCreatedExpenseReportParams,
+    ImportedTagsMessageParams,
+    ImportedTypesParams,
+    ImportFieldParams,
+    ImportMembersSuccessfulDescriptionParams,
+    ImportPerDiemRatesSuccessfulDescriptionParams,
+    ImportTagsSuccessfulDescriptionParams,
+    IncorrectZipFormatParams,
+    IndividualExpenseRulesSubtitleParams,
+    InstantSummaryParams,
     IntacctMappingTitleParams,
     IntegrationExportParams,
     IntegrationSyncFailedParams,
@@ -41,7 +59,6 @@ import type {
     MovedFromPersonalSpaceParams,
     MovedFromReportParams,
     MovedTransactionParams,
-    MultifactorAuthenticationTranslationParams,
     NeedCategoryForExportToIntegrationParams,
     NewWorkspaceNameParams,
     NextStepParams,
@@ -104,6 +121,9 @@ import type {
     SplitDateRangeParams,
     SplitExpenseEditTitleParams,
     SplitExpenseSubtitleParams,
+    SpreadCategoriesParams,
+    SpreadFieldNameParams,
+    SpreadSheetColumnParams,
     StatementTitleParams,
     StepCounterParams,
     StripePaidParams,
@@ -153,7 +173,6 @@ import type {
     UpdatedPolicyManualApprovalThresholdParams,
     UpdatedPolicyPreventSelfApprovalParams,
     UpdatedPolicyReimbursementEnabledParams,
-    UpdatedPolicyReimburserParams,
     UpdatedPolicyReportFieldDefaultValueParams,
     UpdatedPolicyTagFieldParams,
     UpdatedPolicyTagNameParams,
@@ -269,7 +288,6 @@ const translations = {
         zoom: 'Zoom',
         password: 'Password',
         magicCode: 'Magic code',
-        digits: 'digits',
         twoFactorCode: 'Two-factor code',
         workspaces: 'Workspaces',
         inbox: 'Inbox',
@@ -283,6 +301,7 @@ const translations = {
         wallet: 'Wallet',
         preferences: 'Preferences',
         view: 'View',
+        viewReport: 'View report',
         review: (reviewParams?: ReviewParams) => `Review${reviewParams?.amount ? ` ${reviewParams?.amount}` : ''}`,
         not: 'Not',
         signIn: 'Sign in',
@@ -525,6 +544,10 @@ const translations = {
         value: 'Value',
         downloadFailedTitle: 'Download failed',
         downloadFailedDescription: "Your download couldn't be completed. Please try again later.",
+        downloadFailedEmptyReportDescription: () => ({
+            one: "You can't export an empty report.",
+            other: () => `You can't export empty reports.`,
+        }),
         filterLogs: 'Filter Logs',
         network: 'Network',
         reportID: 'Report ID',
@@ -675,12 +698,12 @@ const translations = {
         protectedPDFNotSupported: 'Password-protected PDF is not supported',
         attachmentImageResized: 'This image has been resized for previewing. Download for full resolution.',
         attachmentImageTooLarge: 'This image is too large to preview before uploading.',
-        tooManyFiles: (fileLimit: number) => `You can only upload up to ${fileLimit} files at a time.`,
+        tooManyFiles: ({fileLimit}: FileLimitParams) => `You can only upload up to ${fileLimit} files at a time.`,
         sizeExceededWithValue: ({maxUploadSizeInMB}: SizeExceededParams) => `Files exceeds ${maxUploadSizeInMB} MB. Please try again.`,
         someFilesCantBeUploaded: "Some files can't be uploaded",
         sizeLimitExceeded: ({maxUploadSizeInMB}: SizeExceededParams) => `Files must be under ${maxUploadSizeInMB} MB. Any larger files won't be uploaded.`,
         maxFileLimitExceeded: "You can upload up to 30 receipts at a time. Any extras won't be uploaded.",
-        unsupportedFileType: (fileType: string) => `${fileType} files aren't supported. Only supported file types will be uploaded.`,
+        unsupportedFileType: ({fileType}: FileTypeParams) => `${fileType} files aren't supported. Only supported file types will be uploaded.`,
         learnMoreAboutSupportedFiles: 'Learn more about supported formats.',
         passwordProtected: "Password-protected PDFs aren't supported. Only supported files will be uploaded.",
     },
@@ -705,8 +728,8 @@ const translations = {
     composer: {
         noExtensionFoundForMimeType: 'No extension found for mime type',
         problemGettingImageYouPasted: 'There was a problem getting the image you pasted',
-        commentExceededMaxLength: (formattedMaxLength: string) => `The maximum comment length is ${formattedMaxLength} characters.`,
-        taskTitleExceededMaxLength: (formattedMaxLength: string) => `The maximum task title length is ${formattedMaxLength} characters.`,
+        commentExceededMaxLength: ({formattedMaxLength}: FormattedMaxLengthParams) => `The maximum comment length is ${formattedMaxLength} characters.`,
+        taskTitleExceededMaxLength: ({formattedMaxLength}: FormattedMaxLengthParams) => `The maximum task title length is ${formattedMaxLength} characters.`,
     },
     baseUpdateAppModal: {
         updateApp: 'Update app',
@@ -717,35 +740,6 @@ const translations = {
         expired: 'Your session has expired.',
         signIn: 'Please sign in again.',
     },
-    multifactorAuthentication: {
-        biometricsTest: {
-            biometricsTest: 'Biometrics test',
-            authenticationSuccessful: 'Authentication successful',
-            successfullyAuthenticatedUsing: ({authType}: MultifactorAuthenticationTranslationParams) => `You’ve successfully authenticated using ${authType}.`,
-            troubleshootBiometricsStatus: ({registered}: MultifactorAuthenticationTranslationParams) => `Biometrics (${registered ? 'Registered' : 'Not registered'})`,
-            yourAttemptWasUnsuccessful: 'Your authentication attempt was unsuccessful.',
-            youCouldNotBeAuthenticated: 'You couldn’t be authenticated',
-            areYouSureToReject: 'Are you sure? The authentication attempt will be rejected if you close this screen.',
-            rejectAuthentication: 'Reject authentication',
-            test: 'Test',
-            biometricsAuthentication: 'Biometrics authentication',
-        },
-        pleaseEnableInSystemSettings: {
-            start: 'Please enable face/fingerprint verification or set a device passcode in your ',
-            link: 'system settings',
-            end: '.',
-        },
-        oops: 'Oops, something went wrong',
-        looksLikeYouRanOutOfTime: 'Looks like you ran out of time! Please try again at the merchant.',
-        youRanOutOfTime: 'You ran out of time',
-        letsVerifyItsYou: 'Let’s verify it’s you',
-        verifyYourself: {
-            biometrics: 'Verify yourself with your face or fingerprint',
-        },
-        enableQuickVerification: {
-            biometrics: 'Enable quick, secure verification using your face or fingerprint. No passwords or codes required.',
-        },
-    },
     validateCodeModal: {
         successfulSignInTitle: dedent(`
             Abracadabra,
@@ -914,7 +908,7 @@ const translations = {
     adminOnlyCanPost: 'Only admins can send messages in this room.',
     reportAction: {
         asCopilot: 'as copilot for',
-        harvestCreatedExpenseReport: (reportUrl: string, reportName: string) =>
+        harvestCreatedExpenseReport: ({reportUrl, reportName}: HarvestCreatedExpenseReportParams) =>
             `created this report to hold all expenses from <a href="${reportUrl}">${reportName}</a> that couldn't be submitted on your chosen frequency`,
         createdReportForUnapprovedTransactions: ({reportUrl, reportName}: CreatedReportForUnapprovedTransactionsParams) =>
             `created this report for any held expenses from <a href="${reportUrl}">${reportName}</a>`,
@@ -956,8 +950,8 @@ const translations = {
         buttonFind: 'Find something...',
         buttonMySettings: 'My settings',
         fabNewChat: 'Start chat',
-        fabNewChatExplained: 'Open actions menu',
-        fabScanReceiptExplained: 'Scan receipt',
+        fabNewChatExplained: 'Start chat (Floating action)',
+        fabScanReceiptExplained: 'Scan receipt (Floating action)',
         chatPinned: 'Chat pinned',
         draftedMessage: 'Drafted message',
         listOfChatMessages: 'List of chat messages',
@@ -991,13 +985,13 @@ const translations = {
         chooseSpreadsheet: '<muted-link>Select a spreadsheet file to import. Supported formats: .csv, .txt, .xls, and .xlsx.</muted-link>',
         chooseSpreadsheetMultiLevelTag: `<muted-link>Select a spreadsheet file to import. <a href="${CONST.IMPORT_SPREADSHEET.MULTI_LEVEL_TAGS_ARTICLE_LINK}">Learn more</a> about supported file formats.</muted-link>`,
         fileContainsHeader: 'File contains column headers',
-        column: (name: string) => `Column ${name}`,
-        fieldNotMapped: (fieldName: string) => `Oops! A required field ("${fieldName}") hasn't been mapped. Please review and try again.`,
-        singleFieldMultipleColumns: (fieldName: string) => `Oops! You've mapped a single field ("${fieldName}") to multiple columns. Please review and try again.`,
-        emptyMappedField: (fieldName: string) => `Oops! The field ("${fieldName}") contains one or more empty values. Please review and try again.`,
+        column: ({name}: SpreadSheetColumnParams) => `Column ${name}`,
+        fieldNotMapped: ({fieldName}: SpreadFieldNameParams) => `Oops! A required field ("${fieldName}") hasn't been mapped. Please review and try again.`,
+        singleFieldMultipleColumns: ({fieldName}: SpreadFieldNameParams) => `Oops! You've mapped a single field ("${fieldName}") to multiple columns. Please review and try again.`,
+        emptyMappedField: ({fieldName}: SpreadFieldNameParams) => `Oops! The field ("${fieldName}") contains one or more empty values. Please review and try again.`,
         importSuccessfulTitle: 'Import successful',
-        importCategoriesSuccessfulDescription: ({categories}: {categories: number}) => (categories > 1 ? `${categories} categories have been added.` : '1 category has been added.'),
-        importMembersSuccessfulDescription: ({added, updated}: {added: number; updated: number}) => {
+        importCategoriesSuccessfulDescription: ({categories}: SpreadCategoriesParams) => (categories > 1 ? `${categories} categories have been added.` : '1 category has been added.'),
+        importMembersSuccessfulDescription: ({added, updated}: ImportMembersSuccessfulDescriptionParams) => {
             if (!added && !updated) {
                 return 'No members have been added or updated.';
             }
@@ -1012,9 +1006,10 @@ const translations = {
 
             return added > 1 ? `${added} members have been added.` : '1 member has been added.';
         },
-        importTagsSuccessfulDescription: ({tags}: {tags: number}) => (tags > 1 ? `${tags} tags have been added.` : '1 tag has been added.'),
+        importTagsSuccessfulDescription: ({tags}: ImportTagsSuccessfulDescriptionParams) => (tags > 1 ? `${tags} tags have been added.` : '1 tag has been added.'),
         importMultiLevelTagsSuccessfulDescription: 'Multi-level tags have been added.',
-        importPerDiemRatesSuccessfulDescription: ({rates}: {rates: number}) => (rates > 1 ? `${rates} per diem rates have been added.` : '1 per diem rate has been added.'),
+        importPerDiemRatesSuccessfulDescription: ({rates}: ImportPerDiemRatesSuccessfulDescriptionParams) =>
+            rates > 1 ? `${rates} per diem rates have been added.` : '1 per diem rate has been added.',
         importFailedTitle: 'Import failed',
         importFailedDescription: 'Please ensure all fields are filled out correctly and try again. If the problem persists, please reach out to Concierge.',
         importDescription: 'Choose which fields to map from your spreadsheet by clicking the dropdown next to each imported column below.',
@@ -1194,8 +1189,14 @@ const translations = {
             one: 'Are you sure that you want to delete this expense?',
             other: 'Are you sure that you want to delete these expenses?',
         }),
-        deleteReport: 'Delete report',
-        deleteReportConfirmation: 'Are you sure that you want to delete this report?',
+        deleteReport: () => ({
+            one: 'Delete report',
+            other: 'Delete reports',
+        }),
+        deleteReportConfirmation: () => ({
+            one: 'Are you sure that you want to delete this report?',
+            other: 'Are you sure that you want to delete these reports?',
+        }),
         settledExpensify: 'Paid',
         done: 'Done',
         settledElsewhere: 'Paid elsewhere',
@@ -1439,8 +1440,9 @@ const translations = {
         moveExpensesError: "You can't move per diem expenses to reports on other workspaces, because the per diem rates may differ between workspaces.",
         changeApprover: {
             title: 'Change approver',
-            header: ({workflowSettingLink}: WorkflowSettingsParam) =>
-                `Choose an option to change the approver for this report. (Update your <a href="${workflowSettingLink}">workspace settings</a> to change this permanently for all reports.)`,
+            subtitle: 'Choose an option to change the approver for this report.',
+            description: ({workflowSettingLink}: WorkflowSettingsParam) =>
+                `You can also change the approver permanently for all reports in your <a href="${workflowSettingLink}">workflow settings</a>.`,
             changedApproverMessage: (managerID: number) => `changed the approver to <mention-user accountID="${managerID}"/>`,
             actions: {
                 addApprover: 'Add approver',
@@ -1457,9 +1459,6 @@ const translations = {
         timeTracking: {
             hoursAt: (hours: number, rate: string) => `${hours} ${hours === 1 ? 'hour' : 'hours'} @ ${rate} / hour`,
             hrs: 'hrs',
-            hours: 'Hours',
-            ratePreview: (rate: string) => `${rate} / hour`,
-            amountTooLargeError: 'The total amount is too large. Lower the hours or reduce the rate.',
         },
     },
     transactionMerge: {
@@ -1948,6 +1947,13 @@ const translations = {
         chatToConciergeToUnlock: 'Chat with Concierge to resolve security concerns and unlock your account.',
         chatWithConcierge: 'Chat with Concierge',
     },
+    passwordPage: {
+        changePassword: 'Change password',
+        changingYourPasswordPrompt: 'Changing your password will update your password for both your Expensify.com and New Expensify accounts.',
+        currentPassword: 'Current password',
+        newPassword: 'New password',
+        newPasswordPrompt: 'Your new password must be different from your old password and contain at least 8 characters, 1 capital letter, 1 lowercase letter, and 1 number.',
+    },
     twoFactorAuth: {
         headerTitle: 'Two-factor authentication',
         twoFactorAuthEnabled: 'Two-factor authentication enabled',
@@ -2328,7 +2334,7 @@ const translations = {
     transferAmountPage: {
         transfer: ({amount}: TransferParams) => `Transfer${amount ? ` ${amount}` : ''}`,
         instant: 'Instant (Debit card)',
-        instantSummary: (rate: string, minAmount: string) => `${rate}% fee (${minAmount} minimum)`,
+        instantSummary: ({rate, minAmount}: InstantSummaryParams) => `${rate}% fee (${minAmount} minimum)`,
         ach: '1-3 Business days (Bank account)',
         achSummary: 'No fee',
         whichAccount: 'Which account?',
@@ -2366,33 +2372,10 @@ const translations = {
             comment: (value: string) => `Change description to "${value}"`,
             merchant: (value: string) => `Update merchant to "${value}"`,
             reimbursable: (value: boolean) => `Update expense ${value ? 'reimbursable' : 'non-reimbursable'}`,
-            report: (value: string) => `Add to a report named "${value}"`,
+            report: (value: string) => `Add a report named "${value}"`,
             tag: (value: string) => `Update tag to "${value}"`,
             tax: (value: string) => `Update tax rate to "${value}"`,
         },
-        newRule: 'New rule',
-        addRule: {
-            title: 'Add rule',
-            expenseContains: 'If expense contains:',
-            applyUpdates: 'Then apply these updates:',
-            merchantHint: 'Type * to create a rule that applies to all merchants',
-            addToReport: 'Add to a report named',
-            createReport: 'Create report if necessary',
-            applyToExistingExpenses: 'Apply to existing matching expenses',
-            confirmError: 'Enter merchant and apply at least one update',
-            confirmErrorMerchant: 'Please enter merchant',
-            confirmErrorUpdate: 'Please apply at least one update',
-            saveRule: 'Save rule',
-        },
-        editRule: {
-            title: 'Edit rule',
-        },
-        deleteRule: {
-            deleteSingle: 'Delete rule',
-            deleteMultiple: 'Delete rules',
-            deleteSinglePrompt: 'Are you sure you want to delete this rule?',
-            deleteMultiplePrompt: 'Are you sure you want to delete these rules?',
-        },
     },
     preferencesPage: {
         appSection: {
@@ -2900,7 +2883,7 @@ const translations = {
             dateShouldBeBefore: (dateString: string) => `Date should be before ${dateString}`,
             dateShouldBeAfter: (dateString: string) => `Date should be after ${dateString}`,
             hasInvalidCharacter: 'Name can only include Latin characters',
-            incorrectZipFormat: (zipFormat?: string) => `Incorrect zip code format${zipFormat ? ` Acceptable format: ${zipFormat}` : ''}`,
+            incorrectZipFormat: ({zipFormat}: IncorrectZipFormatParams = {}) => `Incorrect zip code format${zipFormat ? ` Acceptable format: ${zipFormat}` : ''}`,
             invalidPhoneNumber: `Please ensure the phone number is valid (e.g. ${CONST.EXAMPLE_PHONE_NUMBER})`,
         },
     },
@@ -2980,7 +2963,7 @@ const translations = {
     },
     focusModeUpdateModal: {
         title: 'Welcome to #focus mode!',
-        prompt: (priorityModePageUrl: string) =>
+        prompt: ({priorityModePageUrl}: FocusModeUpdateParams) =>
             `Stay on top of things by only seeing unread chats or chats that need your attention. Don’t worry, you can change this at any point in <a href="${priorityModePageUrl}">settings</a>.`,
     },
     notFound: {
@@ -3000,6 +2983,15 @@ const translations = {
         subtitle: 'Your request could not be completed. Please try again later.',
         wrongTypeSubtitle: "That search isn't valid. Try adjusting your search criteria.",
     },
+    setPasswordPage: {
+        enterPassword: 'Enter a password',
+        setPassword: 'Set password',
+        newPasswordPrompt: 'Your password must have at least 8 characters, 1 capital letter, 1 lowercase letter, and 1 number.',
+        passwordFormTitle: 'Welcome back to the New Expensify! Please set your password.',
+        passwordNotSet: 'We were unable to set your new password. We have sent you a new password link to try again.',
+        setPasswordLinkInvalid: 'This set password link is invalid or has expired. A new one is waiting for you in your email inbox!',
+        validateAccount: 'Verify account',
+    },
     statusPage: {
         status: 'Status',
         statusExplanation: "Add an emoji to give your colleagues and friends an easy way to know what's going on. You can optionally add a message too!",
@@ -3143,13 +3135,10 @@ const translations = {
         errorMessageInvalidPhone: `Please enter a valid phone number without brackets or dashes. If you're outside the US, please include your country code (e.g. ${CONST.EXAMPLE_PHONE_NUMBER}).`,
         errorMessageInvalidEmail: 'Invalid email',
         userIsAlreadyMember: ({login, name}: UserIsAlreadyMemberParams) => `${login} is already a member of ${name}`,
-        userIsAlreadyAnAdmin: ({login, name}: UserIsAlreadyMemberParams) => `${login} is already an admin of ${name}`,
     },
     onfidoStep: {
         acceptTerms: 'By continuing with the request to activate your Expensify Wallet, you confirm that you have read, understand, and accept',
         facialScan: 'Onfido’s Facial Scan Policy and Release',
-        onfidoLinks: (onfidoTitle: string) =>
-            `<muted-text-micro>${onfidoTitle} <a href='${CONST.ONFIDO_FACIAL_SCAN_POLICY_URL}'>Onfido’s Facial Scan Policy and Release</a>, <a href='${CONST.ONFIDO_PRIVACY_POLICY_URL}'>Privacy</a> and <a href='${CONST.ONFIDO_TERMS_OF_SERVICE_URL}'>Terms of Service</a>.</muted-text-micro>`,
         tryAgain: 'Try again',
         verifyIdentity: 'Verify identity',
         letsVerifyIdentity: "Let's verify your identity",
@@ -3645,7 +3634,7 @@ const translations = {
         flight: 'Flight',
         flightDetails: {
             passenger: 'Passenger',
-            layover: (layover: string) => `<muted-text-label>You have a <strong>${layover} layover</strong> before this flight</muted-text-label>`,
+            layover: ({layover}: FlightLayoverParams) => `<muted-text-label>You have a <strong>${layover} layover</strong> before this flight</muted-text-label>`,
             takeOff: 'Take-off',
             landing: 'Landing',
             seat: 'Seat',
@@ -3734,18 +3723,17 @@ const translations = {
             conciergeMessage: ({domain}: {domain: string}) => `Travel enablement failed for domain: ${domain}. Please review and enable travel for this domain.`,
         },
         updates: {
-            bookingTicketed: (airlineCode: string, origin: string, destination: string, startDate: string, confirmationID = '') =>
+            bookingTicketed: ({airlineCode, origin, destination, startDate, confirmationID = ''}: FlightParams) =>
                 `Your flight ${airlineCode} (${origin} → ${destination}) on ${startDate} has been booked. Confirmation code: ${confirmationID}`,
-            ticketVoided: (airlineCode: string, origin: string, destination: string, startDate: string) =>
+            ticketVoided: ({airlineCode, origin, destination, startDate}: FlightParams) =>
                 `Your ticket for flight ${airlineCode} (${origin} → ${destination}) on ${startDate} has been voided.`,
-            ticketRefunded: (airlineCode: string, origin: string, destination: string, startDate: string) =>
+            ticketRefunded: ({airlineCode, origin, destination, startDate}: FlightParams) =>
                 `Your ticket for flight ${airlineCode} (${origin} → ${destination}) on ${startDate} has been refunded or exchanged.`,
-            flightCancelled: (airlineCode: string, origin: string, destination: string, startDate: string) =>
+            flightCancelled: ({airlineCode, origin, destination, startDate}: FlightParams) =>
                 `Your flight ${airlineCode} (${origin} → ${destination}) on ${startDate}} has been canceled by the airline.`,
             flightScheduleChangePending: (airlineCode: string) => `The airline has proposed a schedule change for flight ${airlineCode}; we are awaiting confirmation.`,
             flightScheduleChangeClosed: (airlineCode: string, startDate?: string) => `Schedule change confirmed: flight ${airlineCode} now departs at ${startDate}.`,
-            flightUpdated: (airlineCode: string, origin: string, destination: string, startDate: string) =>
-                `Your flight ${airlineCode} (${origin} → ${destination}) on ${startDate} has been updated.`,
+            flightUpdated: ({airlineCode, origin, destination, startDate}: FlightParams) => `Your flight ${airlineCode} (${origin} → ${destination}) on ${startDate} has been updated.`,
             flightCabinChanged: (airlineCode: string, cabinClass?: string) => `Your cabin class has been updated to ${cabinClass} on flight ${airlineCode}.`,
             flightSeatConfirmed: (airlineCode: string) => `Your seat assignment on flight ${airlineCode} has been confirmed.`,
             flightSeatChanged: (airlineCode: string) => `Your seat assignment on flight ${airlineCode} has been changed.`,
@@ -4552,7 +4540,7 @@ const translations = {
                 importTaxDescription: 'Import tax groups from NetSuite.',
                 importCustomFields: {
                     chooseOptionBelow: 'Choose an option below:',
-                    label: (importedTypes: string[]) => `Imported as ${importedTypes.join(' and ')}`,
+                    label: ({importedTypes}: ImportedTypesParams) => `Imported as ${importedTypes.join(' and ')}`,
                     requiredFieldError: ({fieldName}: RequiredFieldParams) => `Please enter the ${fieldName}`,
                     customSegments: {
                         title: 'Custom segments/records',
@@ -4628,18 +4616,18 @@ const translations = {
                     [CONST.INTEGRATION_ENTITY_MAP_TYPES.NETSUITE_DEFAULT]: {
                         label: 'NetSuite employee default',
                         description: 'Not imported into Expensify, applied on export',
-                        footerContent: (importField: string) =>
+                        footerContent: ({importField}: ImportFieldParams) =>
                             `If you use ${importField} in NetSuite, we'll apply the default set on the employee record upon export to Expense Report or Journal Entry.`,
                     },
                     [CONST.INTEGRATION_ENTITY_MAP_TYPES.TAG]: {
                         label: 'Tags',
                         description: 'Line-item level',
-                        footerContent: (importField: string) => `${startCase(importField)} will be selectable for each individual expense on an employee's report.`,
+                        footerContent: ({importField}: ImportFieldParams) => `${startCase(importField)} will be selectable for each individual expense on an employee's report.`,
                     },
                     [CONST.INTEGRATION_ENTITY_MAP_TYPES.REPORT_FIELD]: {
                         label: 'Report fields',
                         description: 'Report level',
-                        footerContent: (importField: string) => `${startCase(importField)} selection will apply to all expense on an employee's report.`,
+                        footerContent: ({importField}: ImportFieldParams) => `${startCase(importField)} selection will apply to all expense on an employee's report.`,
                     },
                 },
             },
@@ -4716,7 +4704,7 @@ const translations = {
                 commercialFeedPlaidDetails: `Requires setup with your bank, but we'll guide you. This is typically limited to larger companies.`,
                 directFeedDetails: 'The simplest approach. Connect right away using your master credentials. This method is most common.',
                 enableFeed: {
-                    title: (provider: string) => `Enable your ${provider} feed`,
+                    title: ({provider}: GoBackMessageParams) => `Enable your ${provider} feed`,
                     heading: 'We have a direct integration with your card issuer and can import your transaction data into Expensify quickly and accurately.\n\nTo get started, simply:',
                     visa: 'We have global integrations with Visa, though eligibility varies by bank and card program.\n\nTo get started, simply:',
                     mastercard: 'We have global integrations with Mastercard, though eligibility varies by bank and card program.\n\nTo get started, simply:',
@@ -4969,25 +4957,6 @@ const translations = {
                     subtitle: 'Use Expensify Travel to get the best travel offers and manage all your business expenses in a single place.',
                     ctaText: 'Book or manage',
                 },
-                travelInvoicing: {
-                    travelBookingSection: {
-                        title: 'Travel booking',
-                        subtitle: "Congrats! You're all set to book and manage travel on this workspace.",
-                        manageTravelLabel: 'Manage travel',
-                    },
-                    centralInvoicingSection: {
-                        title: 'Central invoicing',
-                        subtitle: 'Centralize all travel spend in a monthly invoice instead of paying at time of purchase.',
-                        learnHow: 'Learn how.',
-                        subsections: {
-                            currentTravelSpendLabel: 'Current travel spend',
-                            currentTravelSpendCta: 'Pay balance',
-                            currentTravelLimitLabel: 'Current travel limit',
-                            settlementAccountLabel: 'Settlement account',
-                            settlementFrequencyLabel: 'Settlement frequency',
-                        },
-                    },
-                },
             },
             expensifyCard: {
                 title: 'Expensify Card',
@@ -5274,7 +5243,7 @@ const translations = {
                 prompt3: ' download a backup',
                 prompt4: ' first.',
             },
-            importedTagsMessage: (columnCounts: number) =>
+            importedTagsMessage: ({columnCounts}: ImportedTagsMessageParams) =>
                 `We found *${columnCounts} columns* in your spreadsheet. Select *Name* next to the column that contains tags names. You can also select *Enabled* next to the column that sets tags status.`,
             cannotDeleteOrDisableAllTags: {
                 title: 'Cannot delete or disable all tags',
@@ -5444,8 +5413,7 @@ const translations = {
                 giveItNameInstruction: 'Make it unique enough to tell apart from other cards. Specific use cases are even better!',
                 cardName: 'Card name',
                 letsDoubleCheck: 'Let’s double check that everything looks right.',
-                willBeReadyToUse: 'This card will be ready to use immediately.',
-                willBeReadyToShip: 'This card will be ready to ship immediately.',
+                willBeReady: 'This card will be ready to use immediately.',
                 cardholder: 'Cardholder',
                 cardType: 'Card type',
                 limit: 'Limit',
@@ -6082,7 +6050,7 @@ const translations = {
         rules: {
             individualExpenseRules: {
                 title: 'Expenses',
-                subtitle: (categoriesPageLink: string, tagsPageLink: string) =>
+                subtitle: ({categoriesPageLink, tagsPageLink}: IndividualExpenseRulesSubtitleParams) =>
                     `<muted-text>Set spend controls and defaults for individual expenses. You can also create rules for <a href="${categoriesPageLink}">categories</a> and <a href="${tagsPageLink}">tags</a>.</muted-text>`,
                 receiptRequiredAmount: 'Receipt required amount',
                 receiptRequiredAmountDescription: 'Require receipts when spend exceeds this amount, unless overridden by a category rule.',
@@ -6152,10 +6120,6 @@ const translations = {
                 title: 'Category rules',
                 approver: 'Approver',
                 requireDescription: 'Require description',
-                requireFields: 'Require fields',
-                requiredFieldsTitle: 'Required fields',
-                requiredFieldsDescription: (categoryName: string) => `This will apply to all expenses categorized as <strong>${categoryName}</strong>.`,
-                requireAttendees: 'Require attendees',
                 descriptionHint: 'Description hint',
                 descriptionHintDescription: (categoryName: string) =>
                     `Remind employees to provide additional information for “${categoryName}” spend. This hint appears in the description field on expenses.`,
@@ -6274,22 +6238,6 @@ const translations = {
         billcom: 'BILLCOM',
     },
     workspaceActions: {
-        setDefaultBankAccount: ({bankAccountName, maskedBankAccountNumber}: {bankAccountName: string; maskedBankAccountNumber: string}) =>
-            `set the default business bank account to "${bankAccountName ? `${bankAccountName}: ` : ''}${maskedBankAccountNumber}"`,
-        removedDefaultBankAccount: ({bankAccountName, maskedBankAccountNumber}: {bankAccountName: string; maskedBankAccountNumber: string}) =>
-            `removed the default business bank account "${bankAccountName ? `${bankAccountName}: ` : ''}${maskedBankAccountNumber}"`,
-        changedDefaultBankAccount: ({
-            bankAccountName,
-            maskedBankAccountNumber,
-            oldBankAccountName,
-            oldMaskedBankAccountNumber,
-        }: {
-            bankAccountName: string;
-            maskedBankAccountNumber: string;
-            oldBankAccountName: string;
-            oldMaskedBankAccountNumber: string;
-        }) =>
-            `changed the default business bank account to "${bankAccountName ? `${bankAccountName}: ` : ''}${maskedBankAccountNumber}" (previously "${oldBankAccountName ? `${oldBankAccountName}: ` : ''}${oldMaskedBankAccountNumber}")`,
         changedCompanyAddress: ({newAddress, previousAddress}: {newAddress: string; previousAddress?: string}) =>
             previousAddress ? `changed the company address to "${newAddress}" (previously "${previousAddress}")` : `set the company address to "${newAddress}"`,
         addApprovalRule: (approverEmail: string, approverName: string, field: string, name: string) => `added ${approverName} (${approverEmail}) as an approver for the ${field} "${name}"`,
@@ -6407,6 +6355,12 @@ const translations = {
         deleteReportField: (fieldType: string, fieldName?: string) => `removed ${fieldType} Report Field "${fieldName}"`,
         preventSelfApproval: ({oldValue, newValue}: UpdatedPolicyPreventSelfApprovalParams) =>
             `updated "Prevent self-approval" to "${newValue === 'true' ? 'Enabled' : 'Disabled'}" (previously "${oldValue === 'true' ? 'Enabled' : 'Disabled'}")`,
+        updateMaxExpenseAmountNoReceipt: ({oldValue, newValue}: UpdatedPolicyFieldWithNewAndOldValueParams) =>
+            `changed the maximum receipt required expense amount to ${newValue} (previously ${oldValue})`,
+        updateMaxExpenseAmount: ({oldValue, newValue}: UpdatedPolicyFieldWithNewAndOldValueParams) =>
+            `changed the maximum expense amount for violations to ${newValue} (previously ${oldValue})`,
+        updateMaxExpenseAge: ({oldValue, newValue}: UpdatedPolicyFieldWithNewAndOldValueParams) =>
+            `updated "Max expense age (days)" to "${newValue}" (previously "${oldValue === 'false' ? CONST.POLICY.DEFAULT_MAX_EXPENSE_AGE : oldValue}")`,
         updateMonthlyOffset: ({oldValue, newValue}: UpdatedPolicyFieldWithNewAndOldValueParams) => {
             if (!oldValue) {
                 return `set the monthly report submission date to "${newValue}"`;
@@ -6535,12 +6489,6 @@ const translations = {
             previousForwardsTo
                 ? `changed the approval workflow for ${approver} to stop forwarding approved reports (previously forwarded to ${previousForwardsTo})`
                 : `changed the approval workflow for ${approver} to stop forwarding approved reports`,
-        changedInvoiceCompanyName: ({newValue, oldValue}: {newValue: string; oldValue?: string}) =>
-            oldValue ? `changed the invoice company name to "${newValue}" (previously "${oldValue}")` : `set the invoice company name to "${newValue}"`,
-        changedInvoiceCompanyWebsite: ({newValue, oldValue}: {newValue: string; oldValue?: string}) =>
-            oldValue ? `changed the invoice company website to "${newValue}" (previously "${oldValue}")` : `set the invoice company website to "${newValue}"`,
-        changedReimburser: ({newReimburser, previousReimburser}: UpdatedPolicyReimburserParams) =>
-            previousReimburser ? `changed the authorized payer to "${newReimburser}" (previously "${previousReimburser}")` : `changed the authorized payer to "${newReimburser}"`,
         updateReimbursementEnabled: ({enabled}: UpdatedPolicyReimbursementEnabledParams) => `${enabled ? 'enabled' : 'disabled'} reimbursements`,
         addTax: ({taxName}: UpdatedPolicyTaxParams) => `added the tax "${taxName}"`,
         deleteTax: ({taxName}: UpdatedPolicyTaxParams) => `removed the tax "${taxName}"`,
@@ -6566,15 +6514,6 @@ const translations = {
                 }
             }
         },
-        setReceiptRequiredAmount: ({newValue}: UpdatedPolicyFieldWithNewAndOldValueParams) => `set receipt required amount to "${newValue}"`,
-        changedReceiptRequiredAmount: ({oldValue, newValue}: UpdatedPolicyFieldWithNewAndOldValueParams) => `changed receipt required amount to "${newValue}" (previously "${oldValue}")`,
-        removedReceiptRequiredAmount: ({oldValue}: UpdatedPolicyFieldWithNewAndOldValueParams) => `removed receipt required amount (previously "${oldValue}")`,
-        setMaxExpenseAmount: ({newValue}: UpdatedPolicyFieldWithNewAndOldValueParams) => `set max expense amount to "${newValue}"`,
-        changedMaxExpenseAmount: ({oldValue, newValue}: UpdatedPolicyFieldWithNewAndOldValueParams) => `changed max expense amount to "${newValue}" (previously "${oldValue}")`,
-        removedMaxExpenseAmount: ({oldValue}: UpdatedPolicyFieldWithNewAndOldValueParams) => `removed max expense amount (previously "${oldValue}")`,
-        setMaxExpenseAge: ({newValue}: UpdatedPolicyFieldWithNewAndOldValueParams) => `set max expense age to "${newValue}" days`,
-        changedMaxExpenseAge: ({oldValue, newValue}: UpdatedPolicyFieldWithNewAndOldValueParams) => `changed max expense age to "${newValue}" days (previously "${oldValue}")`,
-        removedMaxExpenseAge: ({oldValue}: UpdatedPolicyFieldWithNewAndOldValueParams) => `removed max expense age (previously "${oldValue}" days)`,
     },
     roomMembersPage: {
         memberNotFound: 'Member not found.',
@@ -6742,7 +6681,7 @@ const translations = {
             amount: {
                 lessThan: ({amount}: OptionalParam<RequestAmountParams> = {}) => `Less than ${amount ?? ''}`,
                 greaterThan: ({amount}: OptionalParam<RequestAmountParams> = {}) => `Greater than ${amount ?? ''}`,
-                between: (greaterThan: string, lessThan: string) => `Between ${greaterThan} and ${lessThan}`,
+                between: ({greaterThan, lessThan}: FiltersAmountBetweenParams) => `Between ${greaterThan} and ${lessThan}`,
                 equalTo: ({amount}: OptionalParam<RequestAmountParams> = {}) => `Equal to ${amount ?? ''}`,
             },
             card: {
@@ -7154,16 +7093,6 @@ const translations = {
             subtitle: 'Log miles or kilometers automatically with GPS and turn trips into expenses instantly.',
             button: 'Download the app',
         },
-        notification: {
-            title: 'GPS tracking in progress',
-            body: 'Go to the app to finish',
-        },
-        locationServicesRequiredModal: {
-            title: 'Location access required',
-            confirm: 'Open settings',
-            prompt: 'Please allow location access in your device settings to start GPS distance tracking.',
-        },
-        fabGpsTripExplained: 'Go to GPS screen (Floating action)',
     },
     reportCardLostOrDamaged: {
         screenTitle: 'Report card lost or damaged',
@@ -7228,7 +7157,6 @@ const translations = {
         maxAge: ({maxAge}: ViolationsMaxAgeParams) => `Date older than ${maxAge} days`,
         missingCategory: 'Missing category',
         missingComment: 'Description required for selected category',
-        missingAttendees: 'Multiple attendees required for this category',
         missingTag: ({tagName}: ViolationsMissingTagParams = {}) => `Missing ${tagName ?? 'tag'}`,
         modifiedAmount: ({type, displayPercentVariance}: ViolationsModifiedAmountParams) => {
             switch (type) {
@@ -7340,7 +7268,6 @@ const translations = {
         hold: 'This expense was put on hold',
         resolvedDuplicates: 'resolved the duplicate',
         companyCardRequired: 'Company card purchases required',
-        noRoute: 'Please select a valid address',
     },
     reportViolations: {
         [CONST.REPORT_VIOLATIONS.FIELD_REQUIRED]: ({fieldName}: RequiredFieldParams) => `${fieldName} is required`,
@@ -7939,7 +7866,6 @@ const translations = {
             subtitle: 'Require members on your domain to log in via single sign-on, restrict workspace creation, and more.',
             enable: 'Enable',
         },
-        domainAdmins: 'Domain admins',
         admins: {
             title: 'Admins',
             findAdmin: 'Find admin',
@@ -7958,13 +7884,7 @@ const translations = {
             cantRevokeAdminAccess: "Can't revoke admin access from the technical contact",
             error: {
                 removeAdmin: 'Unable to remove this user as an Admin. Please try again.',
-                removeDomain: 'Unable to remove this domain. Please try again.',
-                removeDomainNameInvalid: 'Please enter your domain name to reset it.',
             },
-            resetDomain: 'Reset domain',
-            resetDomainExplanation: ({domainName}: {domainName?: string}) => `Please type <strong>${domainName}</strong> to confirm the domain reset.`,
-            enterDomainName: 'Enter your domain name here',
-            resetDomainInfo: `This action is <strong>permanent</strong> and the following data will be deleted: <br/> <ul><li>Company card connections and any unreported expenses from those cards</li> <li>SAML and group settings</li> </ul> All accounts, workspaces, reports, expenses, and other data will remain. <br/><br/>Note: You can clear this domain from your domains list by removing the associated email from your <a href="#">contact methods</a>.`,
         },
         members: {
             title: 'Members',
diff --git a/src/languages/es.ts b/src/languages/es.ts
index 64bf4fb47ad2..68506d5ced42 100644
--- a/src/languages/es.ts
+++ b/src/languages/es.ts
@@ -2,7 +2,14 @@ import {CONST as COMMON_CONST} from 'expensify-common';
 import dedent from '@libs/StringUtils/dedent';
 import CONST from '@src/CONST';
 import type en from './en';
-import type {CreatedReportForUnapprovedTransactionsParams, PaidElsewhereParams, RoutedDueToDEWParams, SplitDateRangeParams, ViolationsRterParams} from './params';
+import type {
+    CreatedReportForUnapprovedTransactionsParams,
+    HarvestCreatedExpenseReportParams,
+    PaidElsewhereParams,
+    RoutedDueToDEWParams,
+    SplitDateRangeParams,
+    ViolationsRterParams,
+} from './params';
 import type {TranslationDeepObject} from './types';
 
 /* eslint-disable max-len */
@@ -50,7 +57,6 @@ const translations: TranslationDeepObject<typeof en> = {
         zoom: 'Zoom',
         password: 'Contraseña',
         magicCode: 'Código mágico',
-        digits: 'dígitos',
         twoFactorCode: 'Autenticación de dos factores',
         workspaces: 'Espacios de trabajo',
         inbox: 'Recibidos',
@@ -62,6 +68,7 @@ const translations: TranslationDeepObject<typeof en> = {
         wallet: 'Billetera',
         preferences: 'Preferencias',
         view: 'Ver',
+        viewReport: 'Ver informe',
         review: (reviewParams) => `Revisar${reviewParams?.amount ? ` ${reviewParams?.amount}` : ''}`,
         not: 'No',
         privacyPolicy: 'la Política de Privacidad de Expensify',
@@ -292,6 +299,10 @@ const translations: TranslationDeepObject<typeof en> = {
         value: 'Valor',
         downloadFailedTitle: 'Error en la descarga',
         downloadFailedDescription: 'No se pudo completar la descarga. Por favor, inténtalo más tarde.',
+        downloadFailedEmptyReportDescription: () => ({
+            one: 'No puedes exportar un informe vacío.',
+            other: () => `No puedes exportar informes vacíos.`,
+        }),
         filterLogs: 'Registros de filtrado',
         network: 'La red',
         reportID: 'ID del informe',
@@ -438,12 +449,12 @@ const translations: TranslationDeepObject<typeof en> = {
         protectedPDFNotSupported: 'Los PDFs con contraseña no son compatibles',
         attachmentImageResized: 'Se ha cambiado el tamaño de esta imagen para obtener una vista previa. Descargar para resolución completa.',
         attachmentImageTooLarge: 'Esta imagen es demasiado grande para obtener una vista previa antes de subirla.',
-        tooManyFiles: (fileLimit) => `Solamente puedes suber ${fileLimit} archivos a la vez.`,
+        tooManyFiles: ({fileLimit}) => `Solamente puedes suber ${fileLimit} archivos a la vez.`,
         sizeExceededWithValue: ({maxUploadSizeInMB}) => `El archivo supera los ${maxUploadSizeInMB} MB. Por favor, vuelve a intentarlo.`,
         someFilesCantBeUploaded: 'Algunos archivos no se pueden subir',
         sizeLimitExceeded: ({maxUploadSizeInMB}) => `Los archivos deben ser menores a ${maxUploadSizeInMB} MB. Los archivos más grandes no se subirán.`,
         maxFileLimitExceeded: 'Puedes subir hasta 30 recibos a la vez. Los extras no se subirán.',
-        unsupportedFileType: (fileType) => `${fileType} archivos no son compatibles. Solo se subirán los archivos compatibles.`,
+        unsupportedFileType: ({fileType}) => `${fileType} archivos no son compatibles. Solo se subirán los archivos compatibles.`,
         learnMoreAboutSupportedFiles: 'Obtén más información sobre los formatos compatibles.',
         passwordProtected: 'Los PDFs con contraseña no son compatibles. Solo se subirán los archivos compatibles',
     },
@@ -464,8 +475,8 @@ const translations: TranslationDeepObject<typeof en> = {
     composer: {
         noExtensionFoundForMimeType: 'No se encontró una extension para este tipo de contenido',
         problemGettingImageYouPasted: 'Ha ocurrido un problema al obtener la imagen que has pegado',
-        commentExceededMaxLength: (formattedMaxLength) => `El comentario debe tener máximo ${formattedMaxLength} caracteres.`,
-        taskTitleExceededMaxLength: (formattedMaxLength) => `La longitud máxima del título de una tarea es de ${formattedMaxLength} caracteres.`,
+        commentExceededMaxLength: ({formattedMaxLength}) => `El comentario debe tener máximo ${formattedMaxLength} caracteres.`,
+        taskTitleExceededMaxLength: ({formattedMaxLength}) => `La longitud máxima del título de una tarea es de ${formattedMaxLength} caracteres.`,
     },
     baseUpdateAppModal: {
         updateApp: 'Actualizar app',
@@ -476,35 +487,6 @@ const translations: TranslationDeepObject<typeof en> = {
         expired: 'Tu sesión ha expirado.',
         signIn: 'Por favor, inicia sesión de nuevo.',
     },
-    multifactorAuthentication: {
-        biometricsTest: {
-            biometricsTest: 'Prueba de biometría',
-            authenticationSuccessful: 'Autenticación exitosa',
-            successfullyAuthenticatedUsing: ({authType}) => `Te has autenticado exitosamente con ${authType}.`,
-            troubleshootBiometricsStatus: ({registered}) => `Biometría (${registered ? 'Registrada' : 'No registrada'})`,
-            yourAttemptWasUnsuccessful: 'Tu intento de autenticación fue fallido.',
-            youCouldNotBeAuthenticated: 'No se pudo autenticar',
-            areYouSureToReject: '¿Estás seguro? El intento de autenticación será rechazado si cierras esta pantalla.',
-            rejectAuthentication: 'Rechazar autenticación',
-            test: 'Prueba',
-            biometricsAuthentication: 'Autenticación biométrica',
-        },
-        pleaseEnableInSystemSettings: {
-            start: 'Por favor, activa la verificación de rostro/huella digital o establece un código de acceso en tus ',
-            link: 'ajustes del sistema',
-            end: '.',
-        },
-        oops: 'Ups, algo salió mal',
-        looksLikeYouRanOutOfTime: '¡Parece que se te acabó el tiempo! Por favor, inténtalo de nuevo en el comercio.',
-        youRanOutOfTime: 'Se te acabó el tiempo',
-        letsVerifyItsYou: 'Verifiquemos que eres tú',
-        verifyYourself: {
-            biometrics: 'Verifícate con tu rostro o huella dactilar',
-        },
-        enableQuickVerification: {
-            biometrics: 'Activa la verificación rápida y segura usando tu rostro o huella dactilar. No se requieren contraseñas ni códigos.',
-        },
-    },
     validateCodeModal: {
         successfulSignInTitle: 'Abracadabra,\n¡sesión iniciada!',
         successfulSignInDescription: 'Vuelve a la pestaña original para continuar.',
@@ -660,7 +642,7 @@ const translations: TranslationDeepObject<typeof en> = {
     adminOnlyCanPost: 'Solo los administradores pueden enviar mensajes en esta sala.',
     reportAction: {
         asCopilot: 'como copiloto de',
-        harvestCreatedExpenseReport: (reportUrl, reportName) =>
+        harvestCreatedExpenseReport: ({reportUrl, reportName}: HarvestCreatedExpenseReportParams) =>
             `creó este informe para contener todos los gastos de <a href="${reportUrl}">${reportName}</a> que no se pudieron enviar con la frecuencia que elegiste`,
         createdReportForUnapprovedTransactions: ({reportUrl, reportName}: CreatedReportForUnapprovedTransactionsParams) =>
             `creó este informe para cualquier gasto retenido de <a href="${reportUrl}">${reportName}</a>`,
@@ -699,8 +681,8 @@ const translations: TranslationDeepObject<typeof en> = {
         buttonFind: 'Encuentre algo...',
         buttonMySettings: 'Mi configuración',
         fabNewChat: 'Iniciar chat',
-        fabNewChatExplained: 'Abrir menú de acciones',
-        fabScanReceiptExplained: 'Escanear recibo',
+        fabNewChatExplained: 'Iniciar chat (Acción flotante)',
+        fabScanReceiptExplained: 'Escanear recibo (Acción flotante)',
         chatPinned: 'Chat fijado',
         draftedMessage: 'Mensaje borrador',
         listOfChatMessages: 'Lista de mensajes del chat',
@@ -734,10 +716,10 @@ const translations: TranslationDeepObject<typeof en> = {
         chooseSpreadsheet: '<muted-link>Elige un archivo de hoja de cálculo para importar. Los formatos soportados son .csv, .txt, .xls y .xlsx.</muted-link>',
         chooseSpreadsheetMultiLevelTag: `<muted-link>Elige un archivo de hoja de cálculo para importar. <a href="${CONST.IMPORT_SPREADSHEET.MULTI_LEVEL_TAGS_ARTICLE_LINK}">Aprende más</a> sobre los formatos de archivo soportados.</muted-link>`,
         fileContainsHeader: 'El archivo contiene encabezados',
-        column: (name) => `Columna ${name}`,
-        fieldNotMapped: (fieldName) => `¡Vaya! Un campo obligatorio ("${fieldName}") no ha sido mapeado. Por favor, revisa e inténtalo de nuevo.`,
-        singleFieldMultipleColumns: (fieldName) => `¡Vaya! Has mapeado un solo campo ("${fieldName}") a varias columnas. Por favor, revisa e inténtalo de nuevo.`,
-        emptyMappedField: (fieldName) => `¡Vaya! El campo ("${fieldName}") contiene uno o más valores vacíos. Por favor, revísalo e inténtalo de nuevo.`,
+        column: ({name}) => `Columna ${name}`,
+        fieldNotMapped: ({fieldName}) => `¡Vaya! Un campo obligatorio ("${fieldName}") no ha sido mapeado. Por favor, revisa e inténtalo de nuevo.`,
+        singleFieldMultipleColumns: ({fieldName}) => `¡Vaya! Has mapeado un solo campo ("${fieldName}") a varias columnas. Por favor, revisa e inténtalo de nuevo.`,
+        emptyMappedField: ({fieldName}) => `¡Vaya! El campo ("${fieldName}") contiene uno o más valores vacíos. Por favor, revísalo e inténtalo de nuevo.`,
         importFailedTitle: 'Fallo en la importación',
         importFailedDescription: 'Por favor, asegúrate de que todos los campos estén llenos correctamente e inténtalo de nuevo. Si el problema persiste, por favor contacta a Concierge.',
         importCategoriesSuccessfulDescription: ({categories}) => (categories > 1 ? `Se han agregado ${categories} categorías.` : 'Se ha agregado 1 categoría.'),
@@ -938,8 +920,14 @@ const translations: TranslationDeepObject<typeof en> = {
             one: '¿Estás seguro de que quieres eliminar esta solicitud?',
             other: '¿Estás seguro de que quieres eliminar estas solicitudes?',
         }),
-        deleteReport: 'Eliminar informe',
-        deleteReportConfirmation: '¿Estás seguro de que quieres eliminar este informe?',
+        deleteReport: () => ({
+            one: 'Eliminar informe',
+            other: 'Eliminar informes',
+        }),
+        deleteReportConfirmation: () => ({
+            one: '¿Estás seguro de que quieres eliminar este informe?',
+            other: '¿Estás seguro de que quieres eliminar estos informes?',
+        }),
         settledExpensify: 'Pagado',
         done: 'Listo',
         settledElsewhere: 'Pagado de otra forma',
@@ -1184,8 +1172,9 @@ const translations: TranslationDeepObject<typeof en> = {
         moveExpensesError: 'No puedes mover gastos per diem a informes de otros espacios de trabajo, porque las tarifas de dietas pueden diferir entre espacios de trabajo.',
         changeApprover: {
             title: 'Cambiar aprobador',
-            header: ({workflowSettingLink}) =>
-                `Elige una opción para cambiar el aprobador de este informe. (Actualiza la <a href="${workflowSettingLink}">configuración del espacio de trabajo</a> para cambiarlo de forma permanente en todos los informes.)`,
+            subtitle: 'Elige una opción para cambiar el aprobador de este informe.',
+            description: ({workflowSettingLink}) =>
+                `También puedes cambiar el aprobador de forma permanente para todos los informes en tu <a href="${workflowSettingLink}">configuración de flujo de trabajo</a>.`,
             changedApproverMessage: (managerID) => `cambió el aprobador a <mention-user accountID="${managerID}"/>`,
             actions: {
                 addApprover: 'Añadir aprobador',
@@ -1202,9 +1191,6 @@ const translations: TranslationDeepObject<typeof en> = {
         timeTracking: {
             hoursAt: (hours: number, rate: string) => `${hours} ${hours === 1 ? 'hora' : 'horas'} a ${rate} / hora`,
             hrs: 'h',
-            hours: 'Horas',
-            ratePreview: (rate: string) => `${rate} / hora`,
-            amountTooLargeError: 'El importe total es demasiado alto. Reduce las horas o disminuye la tasa.',
         },
     },
     transactionMerge: {
@@ -1677,6 +1663,13 @@ const translations: TranslationDeepObject<typeof en> = {
         chatToConciergeToUnlock: 'Chatea con Concierge para resolver los problemas de seguridad y desbloquear tu cuenta.',
         chatWithConcierge: 'Chatear con Concierge',
     },
+    passwordPage: {
+        changePassword: 'Cambiar contraseña',
+        changingYourPasswordPrompt: 'El cambio de contraseña va a afectar tanto a la cuenta de Expensify.com como la de New Expensify.',
+        currentPassword: 'Contraseña actual',
+        newPassword: 'Nueva contraseña',
+        newPasswordPrompt: 'La nueva contraseña debe ser diferente de la antigua y contener al menos 8 caracteres, 1 letra mayúscula, 1 letra minúscula y 1 número.',
+    },
     twoFactorAuth: {
         headerTitle: 'Autenticación de dos factores',
         twoFactorAuthEnabled: 'Autenticación de dos factores habilitada',
@@ -2057,7 +2050,7 @@ ${amount} para ${merchant} - ${date}`,
     transferAmountPage: {
         transfer: ({amount}) => `Transferir${amount ? ` ${amount}` : ''}`,
         instant: 'Instante',
-        instantSummary: (rate, minAmount) => `Tarifa del ${rate}% (${minAmount} mínimo)`,
+        instantSummary: ({rate, minAmount}) => `Tarifa del ${rate}% (${minAmount} mínimo)`,
         ach: '1-3 días laborales',
         achSummary: 'Sin cargo',
         whichAccount: '¿Qué cuenta?',
@@ -2095,33 +2088,10 @@ ${amount} para ${merchant} - ${date}`,
             comment: (value: string) => `Cambia la descripción a "${value}"`,
             merchant: (value: string) => `Actualiza el comercio a "${value}"`,
             reimbursable: (value: boolean) => `Actualiza el gasto a ${value ? 'reembolsable' : 'no reembolsable'}`,
-            report: (value: string) => `Añadir a un informe llamado "${value}"`,
+            report: (value: string) => `Añade un informe llamado "${value}"`,
             tag: (value: string) => `Actualiza la etiqueta a "${value}"`,
             tax: (value: string) => `Actualiza la tasa de impuesto a ${value}`,
         },
-        newRule: 'Nueva regla',
-        addRule: {
-            title: 'Añadir regla',
-            expenseContains: 'Si el gasto contiene:',
-            applyUpdates: 'Entonces aplica estas actualizaciones:',
-            merchantHint: 'Escribe * para crear una regla que se aplique a todos los comercios',
-            addToReport: 'Añadir a un informe llamado',
-            createReport: 'Crear informe si es necesario',
-            applyToExistingExpenses: 'Aplicar a gastos existentes que coincidan',
-            confirmError: 'Introduce el comercio y aplica al menos una actualización',
-            confirmErrorMerchant: 'Por favor, introduce el comercio',
-            confirmErrorUpdate: 'Por favor, aplica al menos una actualización',
-            saveRule: 'Guardar regla',
-        },
-        editRule: {
-            title: 'Editar regla',
-        },
-        deleteRule: {
-            deleteSingle: 'Eliminar regla',
-            deleteMultiple: 'Eliminar reglas',
-            deleteSinglePrompt: '¿Estás seguro de que quieres eliminar esta regla?',
-            deleteMultiplePrompt: '¿Estás seguro de que quieres eliminar estas reglas?',
-        },
     },
     preferencesPage: {
         appSection: {
@@ -2624,7 +2594,7 @@ ${amount} para ${merchant} - ${date}`,
         error: {
             dateShouldBeBefore: (dateString) => `La fecha debe ser anterior a ${dateString}`,
             dateShouldBeAfter: (dateString) => `La fecha debe ser posterior a ${dateString}`,
-            incorrectZipFormat: (zipFormat) => `Formato de código postal incorrecto.${zipFormat ? ` Formato aceptable: ${zipFormat}` : ''}`,
+            incorrectZipFormat: ({zipFormat} = {}) => `Formato de código postal incorrecto.${zipFormat ? ` Formato aceptable: ${zipFormat}` : ''}`,
             hasInvalidCharacter: 'El nombre sólo puede incluir caracteres latinos',
             invalidPhoneNumber: `Asegúrese de que el número de teléfono sean válidos (p. ej. ${CONST.EXAMPLE_PHONE_NUMBER})`,
         },
@@ -2698,7 +2668,7 @@ ${amount} para ${merchant} - ${date}`,
     },
     focusModeUpdateModal: {
         title: '¡Bienvenido al modo #concentración!',
-        prompt: (priorityModePageUrl) =>
+        prompt: ({priorityModePageUrl}) =>
             `Mantente al tanto de todo viendo sólo los chats no leídos o los que necesitan tu atención. No te preocupes, puedes cambiar el ajuste en cualquier momento desde la <a href="${priorityModePageUrl}">configuración</a>.`,
     },
     notFound: {
@@ -2718,6 +2688,15 @@ ${amount} para ${merchant} - ${date}`,
         subtitle: 'No se ha podido completar la acción. Por favor, inténtalo más tarde.',
         wrongTypeSubtitle: 'Esa búsqueda no es válida. Intenta ajustar tus criterios de búsqueda.',
     },
+    setPasswordPage: {
+        enterPassword: 'Escribe una contraseña',
+        setPassword: 'Configura tu contraseña',
+        newPasswordPrompt: 'La contraseña debe tener al menos 8 caracteres, 1 letra mayúscula, 1 letra minúscula y 1 número.',
+        passwordFormTitle: '¡Bienvenido de vuelta a New Expensify! Por favor, elige una contraseña.',
+        passwordNotSet: 'No se pudo cambiar tu clave. Te hemos enviado un nuevo enlace para que intentes cambiar la clave nuevamente.',
+        setPasswordLinkInvalid: 'El enlace para configurar tu contraseña ha expirado. Te hemos enviado un nuevo enlace a tu correo.',
+        validateAccount: 'Verificar cuenta',
+    },
     statusPage: {
         status: 'Estado',
         statusExplanation: 'Añade un emoji para que tus colegas y amigos puedan saber fácilmente qué está pasando. ¡También puedes añadir un mensaje opcionalmente!',
@@ -2877,13 +2856,10 @@ ${amount} para ${merchant} - ${date}`,
         errorMessageInvalidPhone: `Por favor, introduce un número de teléfono válido sin paréntesis o guiones. Si reside fuera de Estados Unidos, por favor incluye el prefijo internacional (p. ej. ${CONST.EXAMPLE_PHONE_NUMBER}).`,
         errorMessageInvalidEmail: 'Correo electrónico inválido',
         userIsAlreadyMember: ({login, name}) => `${login} ya es miembro de ${name}`,
-        userIsAlreadyAnAdmin: ({login, name}) => `${login} ya es administrador de ${name}`,
     },
     onfidoStep: {
         acceptTerms: 'Al continuar con la solicitud para activar tu Billetera Expensify, confirma que ha leído, comprende y acepta ',
         facialScan: 'Política y lanzamiento de la exploración facial de Onfido',
-        onfidoLinks: (onfidoTitle: string) =>
-            `<muted-text-micro>${onfidoTitle} <a href='${CONST.ONFIDO_FACIAL_SCAN_POLICY_URL}'>Política y lanzamiento de la exploración facial de Onfido</a>, <a href='${CONST.ONFIDO_PRIVACY_POLICY_URL}'>Privacidad</a> y <a href='${CONST.ONFIDO_TERMS_OF_SERVICE_URL}'>Términos de Servicio</a>.</muted-text-micro>`,
         tryAgain: 'Intentar otra vez',
         verifyIdentity: 'Verificar identidad',
         letsVerifyIdentity: '¡Vamos a verificar tu identidad!',
@@ -3380,7 +3356,7 @@ ${amount} para ${merchant} - ${date}`,
         flight: 'Vuelo',
         flightDetails: {
             passenger: 'Pasajero',
-            layover: (layover) => `<muted-text-label>Tienes una <strong>escala de ${layover}</strong> antes de este vuelo</muted-text-label>`,
+            layover: ({layover}) => `<muted-text-label>Tienes una <strong>escala de ${layover}</strong> antes de este vuelo</muted-text-label>`,
             takeOff: 'Despegue',
             landing: 'Aterrizaje',
             seat: 'Asiento',
@@ -3469,15 +3445,15 @@ ${amount} para ${merchant} - ${date}`,
             conciergeMessage: ({domain}) => `Hubo un error habilitando viajes para el dominio: ${domain}. Por favor, revisa y habilita los viajes para este dominio.`,
         },
         updates: {
-            bookingTicketed: (airlineCode, origin, destination, startDate, confirmationID = '') =>
+            bookingTicketed: ({airlineCode, origin, destination, startDate, confirmationID = ''}) =>
                 `Tu vuelo ${airlineCode} (${origin} → ${destination}) para el ${startDate} ha sido reservado. Código de confirmación: ${confirmationID}`,
-            ticketVoided: (airlineCode, origin, destination, startDate) => `Tu billete para el vuelo ${airlineCode} (${origin} → ${destination}) del ${startDate} ha sido anulado.`,
-            ticketRefunded: (airlineCode, origin, destination, startDate) =>
+            ticketVoided: ({airlineCode, origin, destination, startDate}) => `Tu billete para el vuelo ${airlineCode} (${origin} → ${destination}) del ${startDate} ha sido anulado.`,
+            ticketRefunded: ({airlineCode, origin, destination, startDate}) =>
                 `Tu billete para el vuelo ${airlineCode} (${origin} → ${destination}) del ${startDate} ha sido reembolsado o cambiado.`,
-            flightCancelled: (airlineCode, origin, destination, startDate) => `Tu vuelo ${airlineCode} (${origin} → ${destination}) del ${startDate} ha sido cancelado por la aerolínea.`,
+            flightCancelled: ({airlineCode, origin, destination, startDate}) => `Tu vuelo ${airlineCode} (${origin} → ${destination}) del ${startDate} ha sido cancelado por la aerolínea.`,
             flightScheduleChangePending: (airlineCode) => `La aerolínea ha propuesto un cambio de horario para el vuelo ${airlineCode}; estamos esperando la confirmación.`,
             flightScheduleChangeClosed: (airlineCode, startDate) => `Cambio de horario confirmado: el vuelo ${airlineCode} ahora sale a las ${startDate}.`,
-            flightUpdated: (airlineCode, origin, destination, startDate) => `Tu vuelo ${airlineCode} (${origin} → ${destination}) del ${startDate} ha sido actualizado.`,
+            flightUpdated: ({airlineCode, origin, destination, startDate}) => `Tu vuelo ${airlineCode} (${origin} → ${destination}) del ${startDate} ha sido actualizado.`,
             flightCabinChanged: (airlineCode, cabinClass) => `Tu clase de cabina ha sido actualizada a ${cabinClass} en el vuelo ${airlineCode}.`,
             flightSeatConfirmed: (airlineCode) => `Tu asignación de asiento en el vuelo ${airlineCode} ha sido confirmada.`,
             flightSeatChanged: (airlineCode) => `Tu asignación de asiento en el vuelo ${airlineCode} ha sido modificada.`,
@@ -4297,7 +4273,7 @@ ${amount} para ${merchant} - ${date}`,
                 importTaxDescription: 'Importar grupos de impuestos desde NetSuite.',
                 importCustomFields: {
                     chooseOptionBelow: 'Elija una de las opciones siguientes:',
-                    label: (importedTypes) => `Importados como ${importedTypes.join(' y ')}`,
+                    label: ({importedTypes}) => `Importados como ${importedTypes.join(' y ')}`,
                     requiredFieldError: ({fieldName}) => `Por favor, introduzca el ${fieldName}`,
                     customSegments: {
                         title: 'Segmentos/registros personalizados',
@@ -4373,18 +4349,18 @@ ${amount} para ${merchant} - ${date}`,
                     [CONST.INTEGRATION_ENTITY_MAP_TYPES.NETSUITE_DEFAULT]: {
                         label: 'Predeterminado del empleado NetSuite',
                         description: 'No importado a Expensify, aplicado en exportación',
-                        footerContent: (importField) =>
+                        footerContent: ({importField}) =>
                             `Si usa ${importField} en NetSuite, aplicaremos el conjunto predeterminado en el registro del empleado al exportarlo a Informe de gastos o Entrada de diario.`,
                     },
                     [CONST.INTEGRATION_ENTITY_MAP_TYPES.TAG]: {
                         label: 'Etiquetas',
                         description: 'Nivel de línea de pedido',
-                        footerContent: (importField) => `Se podrán seleccionar ${importField} para cada gasto individual en el informe de un empleado.`,
+                        footerContent: ({importField}) => `Se podrán seleccionar ${importField} para cada gasto individual en el informe de un empleado.`,
                     },
                     [CONST.INTEGRATION_ENTITY_MAP_TYPES.REPORT_FIELD]: {
                         label: 'Campos de informe',
                         description: 'Nivel de informe',
-                        footerContent: (importField) => `La selección de ${importField} se aplicará a todos los gastos en el informe de un empleado.`,
+                        footerContent: ({importField}) => `La selección de ${importField} se aplicará a todos los gastos en el informe de un empleado.`,
                     },
                 },
             },
@@ -4461,7 +4437,7 @@ ${amount} para ${merchant} - ${date}`,
                 commercialFeedPlaidDetails: 'Requiere configurarlo con tu banco, pero te guiaremos. Esto suele estar limitado a empresas más grandes.',
                 directFeedDetails: 'El enfoque más simple. Conéctate de inmediato usando tus credenciales maestras. Este método es el más común.',
                 enableFeed: {
-                    title: (provider) => `Habilita tu feed ${provider}`,
+                    title: ({provider}) => `Habilita tu feed ${provider}`,
                     heading:
                         'Tenemos una integración directa con el emisor de su tarjeta y podemos importar los datos de sus transacciones a Expensify de forma rápida y precisa.\n\nPara empezar, simplemente:',
                     visa: 'Contamos con integraciones globales con Visa, aunque la elegibilidad varía según el banco y el programa de la tarjeta.\n\nTPara empezar, simplemente:',
@@ -4718,25 +4694,6 @@ ${amount} para ${merchant} - ${date}`,
                     subtitle: 'Usa Expensify Travel para obtener las mejores ofertas de viaje y gestionar todos tus gastos de empresa en un solo lugar.',
                     ctaText: 'Reservar o gestionar',
                 },
-                travelInvoicing: {
-                    travelBookingSection: {
-                        title: 'Reserva de viajes',
-                        subtitle: '¡Felicidades! Todo está listo para reservar y gestionar viajes en este espacio de trabajo.',
-                        manageTravelLabel: 'Gestionar viajes',
-                    },
-                    centralInvoicingSection: {
-                        title: 'Facturación centralizada',
-                        subtitle: 'Centraliza todos los gastos de viaje en una factura mensual en lugar de pagar en el momento de la compra.',
-                        learnHow: 'Aprende cómo.',
-                        subsections: {
-                            currentTravelSpendLabel: 'Gasto actual en viajes',
-                            currentTravelSpendCta: 'Pagar saldo',
-                            currentTravelLimitLabel: 'Límite actual de viajes',
-                            settlementAccountLabel: 'Cuenta de liquidación',
-                            settlementFrequencyLabel: 'Frecuencia de liquidación',
-                        },
-                    },
-                },
             },
             expensifyCard: {
                 title: 'Tarjeta Expensify',
@@ -5023,7 +4980,7 @@ ${amount} para ${merchant} - ${date}`,
                 prompt3: ' descargar una copia de seguridad',
                 prompt4: ' primero.',
             },
-            importedTagsMessage: (columnCounts) =>
+            importedTagsMessage: ({columnCounts}) =>
                 `Hemos encontrado *${columnCounts} columnas* en su hoja de cálculo. Seleccione *Nombre* junto a la columna que contiene los nombres de las etiquetas. También puede seleccionar *Habilitado* junto a la columna que establece el estado de la etiqueta.`,
             cannotDeleteOrDisableAllTags: {
                 title: 'No se pueden eliminar ni deshabilitar todas las etiquetas',
@@ -5457,8 +5414,7 @@ ${amount} para ${merchant} - ${date}`,
                 giveItNameInstruction: 'Hazlo lo suficientemente único para distinguirla de otras tarjetas. ¡Los casos de uso específicos son aún mejores!',
                 cardName: 'Nombre de la tarjeta',
                 letsDoubleCheck: 'Vuelve a comprobar que todo parece correcto. ',
-                willBeReadyToUse: 'Esta tarjeta estará lista para su uso inmediato.',
-                willBeReadyToShip: 'Esta tarjeta estará lista para enviarse de inmediato.',
+                willBeReady: 'Esta tarjeta estará lista para su uso inmediato.',
                 cardholder: 'Titular de la tarjeta',
                 cardType: 'Tipo de tarjeta',
                 limit: 'Limite',
@@ -5857,7 +5813,7 @@ ${amount} para ${merchant} - ${date}`,
         rules: {
             individualExpenseRules: {
                 title: 'Gastos',
-                subtitle: (categoriesPageLink, tagsPageLink) =>
+                subtitle: ({categoriesPageLink, tagsPageLink}) =>
                     `<muted-text>Establece controles y valores predeterminados para gastos individuales. También puedes crear reglas para <a href="${categoriesPageLink}">categorías</a> y <a href="${tagsPageLink}">etiquetas</a>.</muted-text>`,
                 receiptRequiredAmount: 'Cantidad requerida para los recibos',
                 receiptRequiredAmountDescription: 'Exige recibos cuando los gastos superen este importe, a menos que lo anule una regla de categoría.',
@@ -5927,10 +5883,6 @@ ${amount} para ${merchant} - ${date}`,
                 title: 'Reglas de categoría',
                 approver: 'Aprobador',
                 requireDescription: 'Requerir descripción',
-                requireFields: 'Requerir campos',
-                requiredFieldsTitle: 'Campos obligatorios',
-                requiredFieldsDescription: (categoryName) => `Esto se aplicará a todos los gastos categorizados como <strong>${categoryName}</strong>.`,
-                requireAttendees: 'Requerir asistentes',
                 descriptionHint: 'Sugerencia de descripción',
                 descriptionHintDescription: (categoryName) =>
                     `Recuerda a los empleados que deben proporcionar información adicional para los gastos de “${categoryName}”. Esta sugerencia aparece en el campo de descripción en los gastos.`,
@@ -6030,22 +5982,6 @@ ${amount} para ${merchant} - ${date}`,
         billcom: 'BILLCOM',
     },
     workspaceActions: {
-        setDefaultBankAccount: ({bankAccountName, maskedBankAccountNumber}: {bankAccountName: string; maskedBankAccountNumber: string}) =>
-            `estableció la cuenta bancaria de empresa predeterminada a "${bankAccountName ? `${bankAccountName}: ` : ''}${maskedBankAccountNumber}"`,
-        removedDefaultBankAccount: ({bankAccountName, maskedBankAccountNumber}: {bankAccountName: string; maskedBankAccountNumber: string}) =>
-            `eliminó la cuenta bancaria de empresa predeterminada "${bankAccountName ? `${bankAccountName}: ` : ''}${maskedBankAccountNumber}"`,
-        changedDefaultBankAccount: ({
-            bankAccountName,
-            maskedBankAccountNumber,
-            oldBankAccountName,
-            oldMaskedBankAccountNumber,
-        }: {
-            bankAccountName: string;
-            maskedBankAccountNumber: string;
-            oldBankAccountName: string;
-            oldMaskedBankAccountNumber: string;
-        }) =>
-            `cambió la cuenta bancaria de empresa predeterminada a "${bankAccountName ? `${bankAccountName}: ` : ''}${maskedBankAccountNumber}" (previamente "${oldBankAccountName ? `${oldBankAccountName}: ` : ''}${oldMaskedBankAccountNumber}")`,
         changedCompanyAddress: ({newAddress, previousAddress}: {newAddress: string; previousAddress?: string}) =>
             previousAddress ? `cambió la dirección de la empresa a "${newAddress}" (anteriormente "${previousAddress}")` : `estableció la dirección de la empresa en "${newAddress}"`,
         addApprovalRule: (approverEmail, approverName, field, name) => `añadió a ${approverName} (${approverEmail}) como aprobador para la ${field} "${name}"`,
@@ -6160,17 +6096,10 @@ ${amount} para ${merchant} - ${date}`,
         deleteReportField: (fieldType, fieldName) => `eliminó el campo de informe ${fieldType} "${fieldName}"`,
         preventSelfApproval: ({oldValue, newValue}) =>
             `actualizó "Evitar la autoaprobación" a "${newValue === 'true' ? 'Habilitada' : 'Deshabilitada'}" (previamente "${oldValue === 'true' ? 'Habilitada' : 'Deshabilitada'}")`,
-        setReceiptRequiredAmount: ({newValue}) => `estableció el importe requerido del recibo en "${newValue}"`,
-        changedReceiptRequiredAmount: ({oldValue, newValue}) => `cambió el importe requerido del recibo a "${newValue}" (antes "${oldValue}")`,
-        removedReceiptRequiredAmount: ({oldValue}) => `eliminó el importe requerido del recibo (antes "${oldValue}")`,
-
-        setMaxExpenseAmount: ({newValue}) => `estableció el importe máximo del gasto en "${newValue}"`,
-        changedMaxExpenseAmount: ({oldValue, newValue}) => `cambió el importe máximo del gasto a "${newValue}" (antes "${oldValue}")`,
-        removedMaxExpenseAmount: ({oldValue}) => `eliminó el importe máximo del gasto (antes "${oldValue}")`,
-
-        setMaxExpenseAge: ({newValue}) => `estableció la antigüedad máxima del gasto en "${newValue}" días`,
-        changedMaxExpenseAge: ({oldValue, newValue}) => `cambió la antigüedad máxima del gasto a "${newValue}" días (antes "${oldValue}")`,
-        removedMaxExpenseAge: ({oldValue}) => `eliminó la antigüedad máxima del gasto (anteriormente "${oldValue}" días)`,
+        updateMaxExpenseAmountNoReceipt: ({oldValue, newValue}) => `cambió el monto máximo de gasto requerido sin recibo a ${newValue} (previamente ${oldValue})`,
+        updateMaxExpenseAmount: ({oldValue, newValue}) => `cambió el monto máximo de gasto para violaciones a ${newValue} (previamente ${oldValue})`,
+        updateMaxExpenseAge: ({oldValue, newValue}) =>
+            `actualizó "Antigüedad máxima de gastos (días)" a "${newValue}" (previamente "${oldValue === 'false' ? CONST.POLICY.DEFAULT_MAX_EXPENSE_AGE : oldValue}")`,
         updateDefaultBillable: ({oldValue, newValue}) => `actualizó "Volver a facturar gastos a clientes" a "${newValue}" (previamente "${oldValue}")`,
         updateDefaultReimbursable: ({oldValue, newValue}) => `actualizó "Valor predeterminado para gastos en efectivo" a "${newValue}" (previamente "${oldValue}")`,
         updateMonthlyOffset: ({oldValue, newValue}) => {
@@ -6209,8 +6138,6 @@ ${amount} para ${merchant} - ${date}`,
         downgradedWorkspace: 'bajó de categoría este espacio de trabajo al plan Recopilar',
         updatedAuditRate: ({oldAuditRate, newAuditRate}) =>
             `cambió la tasa de informes enviados aleatoriamente para aprobación manual a ${Math.round(newAuditRate * 100)}% (previamente ${Math.round(oldAuditRate * 100)}%)`,
-        changedReimburser: ({newReimburser, previousReimburser}) =>
-            previousReimburser ? `cambió el pagador autorizado a "${newReimburser}" (previamente "${previousReimburser}")` : `cambió el pagador autorizado a "${newReimburser}"`,
         updateReimbursementEnabled: ({enabled}) => `${enabled ? 'habilitó' : 'deshabilitó'} los reembolsos`,
         updatedManualApprovalThreshold: ({oldLimit, newLimit}) => `cambió el límite de aprobación manual para todos los gastos a ${newLimit} (previamente ${oldLimit})`,
         updatedFeatureEnabled: ({enabled, featureName}) => {
@@ -6298,12 +6225,6 @@ ${amount} para ${merchant} - ${date}`,
             previousForwardsTo
                 ? `cambió el flujo de aprobación para ${approver} para dejar de reenviar informes aprobados (anteriormente reenviados a ${previousForwardsTo})`
                 : `cambió el flujo de aprobación para ${approver} para dejar de reenviar informes aprobados`,
-        changedInvoiceCompanyName: ({newValue, oldValue}: {newValue: string; oldValue?: string}) =>
-            oldValue ? `cambió el nombre de la empresa de la factura a "${newValue}" (previamente "${oldValue}")` : `estableció el nombre de la empresa de la factura como "${newValue}"`,
-        changedInvoiceCompanyWebsite: ({newValue, oldValue}: {newValue: string; oldValue?: string}) =>
-            oldValue
-                ? `cambió el sitio web de la empresa de la factura a "${newValue}" (previamente "${oldValue}")`
-                : `estableció el sitio web de la empresa de la factura como "${newValue}"`,
         addTax: ({taxName}) => `añadió el impuesto "${taxName}"`,
         deleteTax: ({taxName}) => `eliminó el impuesto "${taxName}"`,
         updateTax: ({oldValue, taxName, updatedField, newValue}) => {
@@ -6500,7 +6421,7 @@ ${amount} para ${merchant} - ${date}`,
             amount: {
                 lessThan: ({amount} = {}) => `Menos de ${amount ?? ''}`,
                 greaterThan: ({amount} = {}) => `Más que ${amount ?? ''}`,
-                between: (greaterThan, lessThan) => `Entre ${greaterThan} y ${lessThan}`,
+                between: ({greaterThan, lessThan}) => `Entre ${greaterThan} y ${lessThan}`,
                 equalTo: ({amount} = {}) => `Igual a ${amount ?? ''}`,
             },
             current: 'Actual',
@@ -7385,7 +7306,6 @@ ${amount} para ${merchant} - ${date}`,
         maxAge: ({maxAge}) => `Fecha de más de ${maxAge} días`,
         missingCategory: 'Falta categoría',
         missingComment: 'Descripción obligatoria para la categoría seleccionada',
-        missingAttendees: 'Se requieren múltiples asistentes para esta categoría',
         missingTag: ({tagName} = {}) => `Falta ${tagName ?? 'etiqueta'}`,
         modifiedAmount: ({type, displayPercentVariance}) => {
             switch (type) {
@@ -7498,7 +7418,6 @@ ${amount} para ${merchant} - ${date}`,
         hold: 'Este gasto está retenido',
         resolvedDuplicates: 'resolvió el duplicado',
         companyCardRequired: 'Se requieren compras con la tarjeta de la empresa.',
-        noRoute: 'Por favor, selecciona una dirección válida',
     },
     reportViolations: {
         [CONST.REPORT_VIOLATIONS.FIELD_REQUIRED]: ({fieldName}) => `${fieldName} es obligatorio`,
@@ -8105,7 +8024,6 @@ ${amount} para ${merchant} - ${date}`,
             subtitle: 'Solicita que los miembros de tu dominio inicien sesión mediante inicio de sesión único, restringe la creación de espacios de trabajo y más.',
             enable: 'Habilitar',
         },
-        domainAdmins: 'Administradores de dominio',
         admins: {
             title: 'Administradores',
             findAdmin: 'Encontrar administrador',
@@ -8115,22 +8033,14 @@ ${amount} para ${merchant} - ${date}`,
             settings: 'Configuración',
             consolidatedDomainBilling: 'Facturación consolidada del dominio',
             consolidatedDomainBillingDescription: (domainName: string) =>
-                `<comment><muted-text-label>Cuando está habilitada, el contacto principal pagará todos los espacios de trabajo de los miembros de <strong>${domainName}</strong> y recibirá todos los recibos de facturación.</muted-text-label></comment>`,
+                `<comment><muted-text-label>Cuando está habilitada, el contacto principal pagará todos los espacios de trabajo propiedad de los miembros de <strong>${domainName}</strong> y recibirá todos los recibos de facturación.</muted-text-label></comment>`,
             consolidatedDomainBillingError: 'No se pudo cambiar la facturación consolidada del dominio. Por favor, inténtalo de nuevo más tarde.',
             addAdmin: 'Añadir administrador',
             invite: 'Invitar',
             addAdminError: 'No se pudo añadir a este miembro como administrador. Por favor, inténtalo de nuevo.',
             revokeAdminAccess: 'Revocar acceso de administrador',
             cantRevokeAdminAccess: 'No se puede revocar el acceso de administrador del contacto técnico',
-            error: {
-                removeAdmin: 'No se pudo eliminar a este usuario como administrador. Por favor, inténtalo de nuevo.',
-                removeDomain: 'No se pudo eliminar este dominio. Por favor inténtalo de nuevo.',
-                removeDomainNameInvalid: 'Introduce el nombre de tu dominio para restablecerlo.',
-            },
-            resetDomain: 'Restablecer dominio',
-            resetDomainExplanation: ({domainName}: {domainName?: string}) => `Por favor escribe <strong>${domainName}</strong> para confirmar el restablecimiento del dominio.`,
-            enterDomainName: 'Introduce aquí tu nombre de dominio',
-            resetDomainInfo: `Esta acción es <strong>permanente</strong> y se eliminarán los siguientes datos: <br/> <ul><li>Conexiones de tarjeta corporativa y cualquier gasto no reportado de esas tarjetas</li> <li>Configuración de SAML y grupos</li> </ul> Todas las cuentas, espacios de trabajo, informes, gastos y otros datos se conservarán. <br/><br/>Nota: Puedes eliminar este dominio de tu lista de dominios eliminando el correo electrónico asociado de tus <a href="#">métodos de contacto</a>.`,
+            error: {removeAdmin: 'No se pudo eliminar a este usuario como administrador. Por favor, inténtalo de nuevo.'},
         },
         members: {
             title: 'Miembros',
@@ -8182,16 +8092,6 @@ ${amount} para ${merchant} - ${date}`,
             subtitle: 'Registra millas o kilómetros automáticamente con GPS y convierte los viajes en gastos al instante.',
             button: 'Descarga la app',
         },
-        notification: {
-            title: 'Seguimiento GPS en curso',
-            body: 'Ve a la app para finalizar',
-        },
-        locationServicesRequiredModal: {
-            title: 'Se requiere acceso a la ubicación',
-            confirm: 'Abrir ajustes',
-            prompt: 'Por favor, permite el acceso a la ubicación en los ajustes de tu dispositivo para iniciar el seguimiento de distancia por GPS.',
-        },
-        fabGpsTripExplained: 'Ir a la pantalla de GPS (Acción flotante)',
     },
 };
 
diff --git a/src/languages/fr.ts b/src/languages/fr.ts
index 4915aea38b9d..a331be4738f1 100644
--- a/src/languages/fr.ts
+++ b/src/languages/fr.ts
@@ -28,6 +28,24 @@ import type {
     EditActionParams,
     ExportAgainModalDescriptionParams,
     ExportIntegrationSelectedParams,
+    FileLimitParams,
+    FileTypeParams,
+    FiltersAmountBetweenParams,
+    FlightLayoverParams,
+    FlightParams,
+    FocusModeUpdateParams,
+    FormattedMaxLengthParams,
+    GoBackMessageParams,
+    HarvestCreatedExpenseReportParams,
+    ImportedTagsMessageParams,
+    ImportedTypesParams,
+    ImportFieldParams,
+    ImportMembersSuccessfulDescriptionParams,
+    ImportPerDiemRatesSuccessfulDescriptionParams,
+    ImportTagsSuccessfulDescriptionParams,
+    IncorrectZipFormatParams,
+    IndividualExpenseRulesSubtitleParams,
+    InstantSummaryParams,
     IntacctMappingTitleParams,
     IntegrationExportParams,
     IntegrationSyncFailedParams,
@@ -115,6 +133,9 @@ import type {
     SplitDateRangeParams,
     SplitExpenseEditTitleParams,
     SplitExpenseSubtitleParams,
+    SpreadCategoriesParams,
+    SpreadFieldNameParams,
+    SpreadSheetColumnParams,
     StatementTitleParams,
     StepCounterParams,
     StripePaidParams,
@@ -164,7 +185,6 @@ import type {
     UpdatedPolicyManualApprovalThresholdParams,
     UpdatedPolicyPreventSelfApprovalParams,
     UpdatedPolicyReimbursementEnabledParams,
-    UpdatedPolicyReimburserParams,
     UpdatedPolicyReportFieldDefaultValueParams,
     UpdatedPolicyTagFieldParams,
     UpdatedPolicyTagNameParams,
@@ -259,6 +279,7 @@ const translations: TranslationDeepObject<typeof en> = {
         searchWithThreeDots: 'Rechercher...',
         next: 'Suivant',
         previous: 'Précédent',
+        // @context Navigation button that returns the user to the previous screen. Should be interpreted as a UI action label.
         goBack: 'Retour',
         create: 'Créer',
         add: 'Ajouter',
@@ -276,7 +297,6 @@ const translations: TranslationDeepObject<typeof en> = {
         zoom: 'Zoom',
         password: 'Mot de passe',
         magicCode: 'Code magique',
-        digits: 'chiffres',
         twoFactorCode: 'Code à deux facteurs',
         workspaces: 'Espaces de travail',
         inbox: 'Boîte de réception',
@@ -533,6 +553,10 @@ const translations: TranslationDeepObject<typeof en> = {
         value: 'Valeur',
         downloadFailedTitle: 'Échec du téléchargement',
         downloadFailedDescription: 'Votre téléchargement n’a pas pu être terminé. Veuillez réessayer plus tard.',
+        downloadFailedEmptyReportDescription: () => ({
+            one: 'Vous ne pouvez pas exporter un rapport vide.',
+            other: () => 'Vous ne pouvez pas exporter des rapports vides.',
+        }),
         filterLogs: 'Filtrer les journaux',
         network: 'Réseau',
         reportID: 'ID du rapport',
@@ -629,6 +653,7 @@ const translations: TranslationDeepObject<typeof en> = {
         copyToClipboard: 'Copier dans le presse-papiers',
         thisIsTakingLongerThanExpected: 'Cela prend plus de temps que prévu...',
         domains: 'Domaines',
+        viewReport: 'Voir le rapport',
         actionRequired: 'Action requise',
         duplicate: 'Dupliquer',
         duplicated: 'Dupliqué',
@@ -689,12 +714,12 @@ const translations: TranslationDeepObject<typeof en> = {
         protectedPDFNotSupported: 'Les PDF protégés par mot de passe ne sont pas pris en charge',
         attachmentImageResized: 'Cette image a été redimensionnée pour l’aperçu. Téléchargez-la pour la pleine résolution.',
         attachmentImageTooLarge: 'Cette image est trop volumineuse pour être prévisualisée avant le téléversement.',
-        tooManyFiles: (fileLimit: number) => `Vous pouvez télécharger au maximum ${fileLimit} fichiers à la fois.`,
+        tooManyFiles: ({fileLimit}: FileLimitParams) => `Vous pouvez télécharger au maximum ${fileLimit} fichiers à la fois.`,
         sizeExceededWithValue: ({maxUploadSizeInMB}: SizeExceededParams) => `Les fichiers dépassent ${maxUploadSizeInMB} Mo. Veuillez réessayer.`,
         someFilesCantBeUploaded: 'Certains fichiers ne peuvent pas être téléversés',
         sizeLimitExceeded: ({maxUploadSizeInMB}: SizeExceededParams) => `Les fichiers doivent être inférieurs à ${maxUploadSizeInMB} Mo. Tout fichier plus volumineux ne sera pas téléversé.`,
         maxFileLimitExceeded: 'Vous pouvez téléverser jusqu’à 30 reçus à la fois. Les reçus supplémentaires ne seront pas téléversés.',
-        unsupportedFileType: (fileType: string) => `Les fichiers ${fileType} ne sont pas pris en charge. Seuls les types de fichiers pris en charge seront téléversés.`,
+        unsupportedFileType: ({fileType}: FileTypeParams) => `Les fichiers ${fileType} ne sont pas pris en charge. Seuls les types de fichiers pris en charge seront téléversés.`,
         learnMoreAboutSupportedFiles: 'En savoir plus sur les formats pris en charge.',
         passwordProtected: 'Les PDF protégés par mot de passe ne sont pas pris en charge. Seuls les fichiers pris en charge seront téléversés.',
     },
@@ -719,8 +744,8 @@ const translations: TranslationDeepObject<typeof en> = {
     composer: {
         noExtensionFoundForMimeType: 'Aucune extension trouvée pour le type MIME',
         problemGettingImageYouPasted: 'Un problème est survenu lors de la récupération de l’image que vous avez collée',
-        commentExceededMaxLength: (formattedMaxLength: string) => `La longueur maximale du commentaire est de ${formattedMaxLength} caractères.`,
-        taskTitleExceededMaxLength: (formattedMaxLength: string) => `La longueur maximale du titre de la tâche est de ${formattedMaxLength} caractères.`,
+        commentExceededMaxLength: ({formattedMaxLength}: FormattedMaxLengthParams) => `La longueur maximale du commentaire est de ${formattedMaxLength} caractères.`,
+        taskTitleExceededMaxLength: ({formattedMaxLength}: FormattedMaxLengthParams) => `La longueur maximale du titre de la tâche est de ${formattedMaxLength} caractères.`,
     },
     baseUpdateAppModal: {
         updateApp: 'Mettre à jour l’app',
@@ -732,35 +757,6 @@ const translations: TranslationDeepObject<typeof en> = {
         expired: 'Votre session a expiré.',
         signIn: 'Veuillez vous reconnecter.',
     },
-    multifactorAuthentication: {
-        biometricsTest: {
-            biometricsTest: 'Test biométrique',
-            authenticationSuccessful: 'Authentification réussie',
-            successfullyAuthenticatedUsing: ({authType}) => `Tu t'es authentifié avec succès en utilisant ${authType}.`,
-            troubleshootBiometricsStatus: ({registered}) => `Biométrie (${registered ? 'Enregistrée' : 'Non enregistrée'})`,
-            yourAttemptWasUnsuccessful: "Votre tentative d'authentification a échoué.",
-            youCouldNotBeAuthenticated: "Vous n'avez pas pu être authentifié",
-            areYouSureToReject: "Êtes-vous sûr ? L'authentification sera rejetée si vous fermez cet écran.",
-            rejectAuthentication: "Rejeter l'authentification",
-            test: 'Test',
-            biometricsAuthentication: 'Authentification biométrique',
-        },
-        pleaseEnableInSystemSettings: {
-            start: "Veuillez activer la vérification par visage/empreinte digitale ou définir un code d'accès de l'appareil dans vos ",
-            link: 'paramètres système',
-            end: '.',
-        },
-        oops: "Oups, quelque chose s'est mal passé",
-        looksLikeYouRanOutOfTime: 'On dirait que vous avez manqué de temps ! Veuillez réessayer chez le marchand.',
-        youRanOutOfTime: 'Le temps est écoulé',
-        letsVerifyItsYou: "Vérifions que c'est bien vous",
-        verifyYourself: {
-            biometrics: 'Identifiez-vous avec votre visage ou votre empreinte digitale',
-        },
-        enableQuickVerification: {
-            biometrics: 'Activez une vérification rapide et sécurisée avec votre visage ou votre empreinte digitale. Aucun mot de passe ou code requis.',
-        },
-    },
     validateCodeModal: {
         successfulSignInTitle: dedent(`
             Abracadabra,
@@ -931,7 +927,7 @@ const translations: TranslationDeepObject<typeof en> = {
     adminOnlyCanPost: 'Seuls les administrateurs peuvent envoyer des messages dans cette salle.',
     reportAction: {
         asCopilot: 'en tant que copilote pour',
-        harvestCreatedExpenseReport: (reportUrl: string, reportName: string) =>
+        harvestCreatedExpenseReport: ({reportUrl, reportName}: HarvestCreatedExpenseReportParams) =>
             `a créé ce rapport pour regrouper toutes les dépenses de <a href="${reportUrl}">${reportName}</a> qui n'ont pas pu être soumises selon la fréquence que vous avez choisie`,
         createdReportForUnapprovedTransactions: ({reportUrl, reportName}: CreatedReportForUnapprovedTransactionsParams) =>
             `a créé ce rapport pour toutes les dépenses en attente depuis <a href="${reportUrl}">${reportName}</a>`,
@@ -973,7 +969,7 @@ const translations: TranslationDeepObject<typeof en> = {
         buttonFind: 'Rechercher quelque chose...',
         buttonMySettings: 'Mes paramètres',
         fabNewChat: 'Démarrer le chat',
-        fabNewChatExplained: "Ouvrir le menu d'actions",
+        fabNewChatExplained: 'Démarrer le chat (Action flottante)',
         fabScanReceiptExplained: 'Scanner un reçu (Action flottante)',
         chatPinned: 'Discussion épinglée',
         draftedMessage: 'Message rédigé',
@@ -999,13 +995,13 @@ const translations: TranslationDeepObject<typeof en> = {
         chooseSpreadsheet: '<muted-link>Sélectionnez un fichier de feuille de calcul à importer. Formats pris en charge : .csv, .txt, .xls et .xlsx.</muted-link>',
         chooseSpreadsheetMultiLevelTag: `<muted-link>Sélectionnez un fichier de feuille de calcul à importer. <a href="${CONST.IMPORT_SPREADSHEET.MULTI_LEVEL_TAGS_ARTICLE_LINK}">En savoir plus</a> sur les formats de fichier pris en charge.</muted-link>`,
         fileContainsHeader: 'Le fichier contient des en-têtes de colonnes',
-        column: (name: string) => `Colonne ${name}`,
-        fieldNotMapped: (fieldName: string) => `Oups ! Un champ requis (« ${fieldName} ») n’a pas été associé. Veuillez vérifier et réessayer.`,
-        singleFieldMultipleColumns: (fieldName: string) => `Oups ! Vous avez associé un seul champ (« ${fieldName} ») à plusieurs colonnes. Veuillez vérifier et réessayer.`,
-        emptyMappedField: (fieldName: string) => `Oups ! Le champ (« ${fieldName} ») contient une ou plusieurs valeurs vides. Veuillez vérifier et réessayer.`,
+        column: ({name}: SpreadSheetColumnParams) => `Colonne ${name}`,
+        fieldNotMapped: ({fieldName}: SpreadFieldNameParams) => `Oups ! Un champ requis (« ${fieldName} ») n’a pas été associé. Veuillez vérifier et réessayer.`,
+        singleFieldMultipleColumns: ({fieldName}: SpreadFieldNameParams) => `Oups ! Vous avez associé un seul champ (« ${fieldName} ») à plusieurs colonnes. Veuillez vérifier et réessayer.`,
+        emptyMappedField: ({fieldName}: SpreadFieldNameParams) => `Oups ! Le champ (« ${fieldName} ») contient une ou plusieurs valeurs vides. Veuillez vérifier et réessayer.`,
         importSuccessfulTitle: 'Importation réussie',
-        importCategoriesSuccessfulDescription: ({categories}: {categories: number}) => (categories > 1 ? `${categories} catégories ont été ajoutées.` : '1 catégorie a été ajoutée.'),
-        importMembersSuccessfulDescription: ({added, updated}: {added: number; updated: number}) => {
+        importCategoriesSuccessfulDescription: ({categories}: SpreadCategoriesParams) => (categories > 1 ? `${categories} catégories ont été ajoutées.` : '1 catégorie a été ajoutée.'),
+        importMembersSuccessfulDescription: ({added, updated}: ImportMembersSuccessfulDescriptionParams) => {
             if (!added && !updated) {
                 return 'Aucun membre n’a été ajouté ou mis à jour.';
             }
@@ -1017,9 +1013,10 @@ const translations: TranslationDeepObject<typeof en> = {
             }
             return added > 1 ? `${added} membres ont été ajoutés.` : '1 membre a été ajouté.';
         },
-        importTagsSuccessfulDescription: ({tags}: {tags: number}) => (tags > 1 ? `${tags} libellés ont été ajoutés.` : '1 tag a été ajouté.'),
+        importTagsSuccessfulDescription: ({tags}: ImportTagsSuccessfulDescriptionParams) => (tags > 1 ? `${tags} libellés ont été ajoutés.` : '1 tag a été ajouté.'),
         importMultiLevelTagsSuccessfulDescription: 'Des balises à plusieurs niveaux ont été ajoutées.',
-        importPerDiemRatesSuccessfulDescription: ({rates}: {rates: number}) => (rates > 1 ? `Les taux de per diem ${rates} ont été ajoutés.` : '1 taux de per diem a été ajouté.'),
+        importPerDiemRatesSuccessfulDescription: ({rates}: ImportPerDiemRatesSuccessfulDescriptionParams) =>
+            rates > 1 ? `Les taux de per diem ${rates} ont été ajoutés.` : '1 taux de per diem a été ajouté.',
         importFailedTitle: 'Échec de l’importation',
         importFailedDescription: 'Veuillez vous assurer que tous les champs sont correctement remplis, puis réessayez. Si le problème persiste, veuillez contacter Concierge.',
         importDescription: 'Choisissez quels champs mapper à partir de votre feuille de calcul en cliquant sur le menu déroulant à côté de chaque colonne importée ci-dessous.',
@@ -1200,8 +1197,14 @@ const translations: TranslationDeepObject<typeof en> = {
             one: 'Êtes-vous sûr de vouloir supprimer cette dépense ?',
             other: 'Voulez-vous vraiment supprimer ces dépenses ?',
         }),
-        deleteReport: 'Supprimer le rapport',
-        deleteReportConfirmation: 'Voulez-vous vraiment supprimer ce rapport ?',
+        deleteReport: () => ({
+            one: 'Supprimer le rapport',
+            other: 'Supprimer les rapports',
+        }),
+        deleteReportConfirmation: () => ({
+            one: 'Êtes-vous sûr de vouloir supprimer ce rapport ?',
+            other: 'Êtes-vous sûr de vouloir supprimer ces rapports ?',
+        }),
         settledExpensify: 'Payé',
         done: 'Terminé',
         settledElsewhere: 'Payé ailleurs',
@@ -1454,8 +1457,9 @@ const translations: TranslationDeepObject<typeof en> = {
             "Vous ne pouvez pas déplacer les dépenses de per diem vers des rapports sur d'autres espaces de travail, car les taux de per diem peuvent différer entre les espaces de travail.",
         changeApprover: {
             title: 'Changer d’approbateur',
-            header: ({workflowSettingLink}: WorkflowSettingsParam) =>
-                `Choisissez une option pour modifier l'approbateur de ce rapport. (Mettez à jour vos <a href="${workflowSettingLink}">paramètres d'espace de travail</a> pour modifier cela de manière permanente pour tous les rapports.)`,
+            subtitle: 'Choisissez une option pour changer l’approbateur de ce rapport.',
+            description: ({workflowSettingLink}: WorkflowSettingsParam) =>
+                `Vous pouvez également modifier définitivement le validateur pour tous les rapports dans vos <a href="${workflowSettingLink}">paramètres de workflow</a>.`,
             changedApproverMessage: (managerID: number) => `a modifié l’approbateur en <mention-user accountID="${managerID}"/>`,
             actions: {
                 addApprover: 'Ajouter un approbateur',
@@ -1473,13 +1477,7 @@ const translations: TranslationDeepObject<typeof en> = {
         splitDateRange: ({startDate, endDate, count}: SplitDateRangeParams) => `Du ${startDate} au ${endDate} (${count} jours)`,
         splitByDate: 'Scinder par date',
         routedDueToDEW: ({to}: RoutedDueToDEWParams) => `rapport acheminé vers ${to} en raison d'un workflow d'approbation personnalisé`,
-        timeTracking: {
-            hoursAt: (hours: number, rate: string) => `${hours} ${hours === 1 ? 'heure' : 'heures'} @ ${rate} / heure`,
-            hrs: 'h',
-            hours: 'Heures',
-            ratePreview: (rate: string) => `${rate} / heure`,
-            amountTooLargeError: 'Le montant total est trop élevé. Réduisez le nombre d’heures ou diminuez le tarif.',
-        },
+        timeTracking: {hoursAt: (hours: number, rate: string) => `${hours} ${hours === 1 ? 'heure' : 'heures'} @ ${rate} / heure`, hrs: 'h'},
     },
     transactionMerge: {
         listPage: {
@@ -1960,6 +1958,14 @@ const translations: TranslationDeepObject<typeof en> = {
         chatToConciergeToUnlock: 'Discutez avec Concierge pour résoudre les problèmes de sécurité et déverrouiller votre compte.',
         chatWithConcierge: 'Discuter avec Concierge',
     },
+    passwordPage: {
+        changePassword: 'Modifier le mot de passe',
+        changingYourPasswordPrompt: 'La modification de votre mot de passe mettra à jour votre mot de passe pour vos comptes Expensify.com et New Expensify.',
+        currentPassword: 'Mot de passe actuel',
+        newPassword: 'Nouveau mot de passe',
+        newPasswordPrompt:
+            'Votre nouveau mot de passe doit être différent de votre ancien mot de passe et contenir au moins 8 caractères, 1 lettre majuscule, 1 lettre minuscule et 1 chiffre.',
+    },
     twoFactorAuth: {
         headerTitle: 'Authentification à deux facteurs',
         twoFactorAuthEnabled: 'Authentification à deux facteurs activée',
@@ -2358,7 +2364,7 @@ ${amount} pour ${merchant} - ${date}`,
     transferAmountPage: {
         transfer: ({amount}: TransferParams) => `Transférer${amount ? ` ${amount}` : ''}`,
         instant: 'Instantané (carte de débit)',
-        instantSummary: (rate: string, minAmount: string) => `Frais de ${rate} % (${minAmount} minimum)`,
+        instantSummary: ({rate, minAmount}: InstantSummaryParams) => `Frais de ${rate} % (${minAmount} minimum)`,
         ach: '1 à 3 jours ouvrables (Compte bancaire)',
         achSummary: 'Aucun frais',
         whichAccount: 'Quel compte ?',
@@ -2393,31 +2399,10 @@ ${amount} pour ${merchant} - ${date}`,
             comment: (value: string) => `Modifier la description en « ${value} »`,
             merchant: (value: string) => `Mettre à jour le marchand en « ${value} »`,
             reimbursable: (value: boolean) => `Mettre à jour la dépense ${value ? 'remboursable' : 'non remboursable'}`,
-            report: (value: string) => `Ajouter à un rapport nommé « ${value} »`,
+            report: (value: string) => `Ajouter un rapport nommé « ${value} »`,
             tag: (value: string) => `Mettre à jour le tag sur « ${value} »`,
             tax: (value: string) => `Mettre à jour le taux de taxe à ${value}`,
         },
-        newRule: 'Nouvelle règle',
-        addRule: {
-            title: 'Ajouter une règle',
-            expenseContains: 'Si la dépense contient :',
-            applyUpdates: 'Appliquez ensuite ces mises à jour :',
-            merchantHint: 'Tapez * pour créer une règle qui s’applique à tous les commerçants',
-            addToReport: 'Ajouter à un rapport nommé',
-            createReport: 'Créer un rapport si nécessaire',
-            applyToExistingExpenses: 'Appliquer aux dépenses correspondantes existantes',
-            confirmError: 'Saisissez le commerçant et appliquez au moins une mise à jour',
-            confirmErrorMerchant: 'Veuillez saisir le commerçant',
-            confirmErrorUpdate: 'Veuillez appliquer au moins une mise à jour',
-            saveRule: 'Enregistrer la règle',
-        },
-        editRule: {title: 'Modifier la règle'},
-        deleteRule: {
-            deleteSingle: 'Supprimer la règle',
-            deleteMultiple: 'Supprimer les règles',
-            deleteSinglePrompt: 'Voulez-vous vraiment supprimer cette règle ?',
-            deleteMultiplePrompt: 'Voulez-vous vraiment supprimer ces règles ?',
-        },
     },
     preferencesPage: {
         appSection: {
@@ -2916,7 +2901,7 @@ ${
             dateShouldBeBefore: (dateString: string) => `La date doit être antérieure au ${dateString}`,
             dateShouldBeAfter: (dateString: string) => `La date doit être postérieure au ${dateString}`,
             hasInvalidCharacter: 'Le nom ne peut inclure que des caractères latins',
-            incorrectZipFormat: (zipFormat?: string) => `Format de code postal incorrect${zipFormat ? `Format acceptable : ${zipFormat}` : ''}`,
+            incorrectZipFormat: ({zipFormat}: IncorrectZipFormatParams = {}) => `Format de code postal incorrect${zipFormat ? `Format acceptable : ${zipFormat}` : ''}`,
             invalidPhoneNumber: `Veuillez vous assurer que le numéro de téléphone est valide (p. ex. ${CONST.EXAMPLE_PHONE_NUMBER})`,
         },
     },
@@ -3000,7 +2985,7 @@ ${
     },
     focusModeUpdateModal: {
         title: 'Bienvenue dans le mode #focus !',
-        prompt: (priorityModePageUrl: string) =>
+        prompt: ({priorityModePageUrl}: FocusModeUpdateParams) =>
             `Restez maître de la situation en n’affichant que les discussions non lues ou celles qui nécessitent votre attention. Ne vous inquiétez pas, vous pouvez modifier ce paramètre à tout moment dans les <a href="${priorityModePageUrl}">paramètres</a>.`,
     },
     notFound: {
@@ -3020,6 +3005,15 @@ ${
         subtitle: 'Votre demande n’a pas pu être effectuée. Veuillez réessayer plus tard.',
         wrongTypeSubtitle: 'Cette recherche n’est pas valide. Essayez de modifier vos critères de recherche.',
     },
+    setPasswordPage: {
+        enterPassword: 'Saisissez un mot de passe',
+        setPassword: 'Définir le mot de passe',
+        newPasswordPrompt: 'Votre mot de passe doit contenir au moins 8 caractères, 1 lettre majuscule, 1 lettre minuscule et 1 chiffre.',
+        passwordFormTitle: 'Bon retour sur le nouveau Expensify ! Veuillez définir votre mot de passe.',
+        passwordNotSet: 'Nous n’avons pas pu définir votre nouveau mot de passe. Nous vous avons envoyé un nouveau lien de mot de passe pour réessayer.',
+        setPasswordLinkInvalid: 'Ce lien de définition de mot de passe n’est pas valide ou a expiré. Un nouveau vous attend dans votre boîte de réception !',
+        validateAccount: 'Vérifier le compte',
+    },
     statusPage: {
         status: 'Statut',
         statusExplanation: 'Ajoutez un émoji pour permettre à vos collègues et amis de savoir facilement ce qui se passe. Vous pouvez aussi ajouter un message si vous le souhaitez !',
@@ -3164,13 +3158,10 @@ ${
         errorMessageInvalidPhone: `Veuillez saisir un numéro de téléphone valide sans parenthèses ni tirets. Si vous êtes en dehors des États-Unis, veuillez inclure votre indicatif de pays (p. ex. ${CONST.EXAMPLE_PHONE_NUMBER}).`,
         errorMessageInvalidEmail: 'Adresse e-mail invalide',
         userIsAlreadyMember: ({login, name}: UserIsAlreadyMemberParams) => `${login} est déjà membre de ${name}`,
-        userIsAlreadyAnAdmin: ({login, name}: UserIsAlreadyMemberParams) => `${login} est déjà administrateur de ${name}`,
     },
     onfidoStep: {
         acceptTerms: 'En poursuivant la demande d’activation de votre Expensify Wallet, vous confirmez que vous avez lu, compris et accepté',
         facialScan: 'Politique et autorisation de scan facial d’Onfido',
-        onfidoLinks: (onfidoTitle: string) =>
-            `<muted-text-micro>${onfidoTitle} <a href='${CONST.ONFIDO_FACIAL_SCAN_POLICY_URL}'>Politique et autorisation de scan facial d’Onfido</a>, <a href='${CONST.ONFIDO_PRIVACY_POLICY_URL}'>Confidentialité</a> et <a href='${CONST.ONFIDO_TERMS_OF_SERVICE_URL}'>Conditions d’utilisation</a>.</muted-text-micro>`,
         tryAgain: 'Réessayer',
         verifyIdentity: 'Vérifier l’identité',
         letsVerifyIdentity: 'Vérifions votre identité',
@@ -3670,7 +3661,7 @@ ${
         flight: 'Vol',
         flightDetails: {
             passenger: 'Passager',
-            layover: (layover: string) => `<muted-text-label>Vous avez une <strong>escale de ${layover}</strong> avant ce vol</muted-text-label>`,
+            layover: ({layover}: FlightLayoverParams) => `<muted-text-label>Vous avez une <strong>escale de ${layover}</strong> avant ce vol</muted-text-label>`,
             takeOff: 'Décollage',
             landing: 'Page d’accueil',
             seat: 'Siège',
@@ -3760,18 +3751,17 @@ ${
             conciergeMessage: ({domain}: {domain: string}) => `L’activation des voyages a échoué pour le domaine : ${domain}. Veuillez vérifier et activer les voyages pour ce domaine.`,
         },
         updates: {
-            bookingTicketed: (airlineCode: string, origin: string, destination: string, startDate: string, confirmationID = '') =>
+            bookingTicketed: ({airlineCode, origin, destination, startDate, confirmationID = ''}: FlightParams) =>
                 `Votre vol ${airlineCode} (${origin} → ${destination}) du ${startDate} a été réservé. Code de confirmation : ${confirmationID}`,
-            ticketVoided: (airlineCode: string, origin: string, destination: string, startDate: string) =>
+            ticketVoided: ({airlineCode, origin, destination, startDate}: FlightParams) =>
                 `Votre billet pour le vol ${airlineCode} (${origin} → ${destination}) le ${startDate} a été annulé.`,
-            ticketRefunded: (airlineCode: string, origin: string, destination: string, startDate: string) =>
+            ticketRefunded: ({airlineCode, origin, destination, startDate}: FlightParams) =>
                 `Votre billet pour le vol ${airlineCode} (${origin} → ${destination}) du ${startDate} a été remboursé ou échangé.`,
-            flightCancelled: (airlineCode: string, origin: string, destination: string, startDate: string) =>
+            flightCancelled: ({airlineCode, origin, destination, startDate}: FlightParams) =>
                 `Votre vol ${airlineCode} (${origin} → ${destination}) du ${startDate}} a été annulé par la compagnie aérienne.`,
             flightScheduleChangePending: (airlineCode: string) => `La compagnie aérienne a proposé un changement d’horaire pour le vol ${airlineCode} ; nous attendons la confirmation.`,
             flightScheduleChangeClosed: (airlineCode: string, startDate?: string) => `Changement d’horaire confirmé : le vol ${airlineCode} part désormais à ${startDate}.`,
-            flightUpdated: (airlineCode: string, origin: string, destination: string, startDate: string) =>
-                `Votre vol ${airlineCode} (${origin} → ${destination}) le ${startDate} a été mis à jour.`,
+            flightUpdated: ({airlineCode, origin, destination, startDate}: FlightParams) => `Votre vol ${airlineCode} (${origin} → ${destination}) le ${startDate} a été mis à jour.`,
             flightCabinChanged: (airlineCode: string, cabinClass?: string) => `Votre classe de cabine a été mise à jour en ${cabinClass} sur le vol ${airlineCode}.`,
             flightSeatConfirmed: (airlineCode: string) => `Votre siège attribué sur le vol ${airlineCode} a été confirmé.`,
             flightSeatChanged: (airlineCode: string) => `Votre siège attribué sur le vol ${airlineCode} a été modifié.`,
@@ -4587,7 +4577,7 @@ ${
                 importTaxDescription: 'Importer des groupes de taxes depuis NetSuite.',
                 importCustomFields: {
                     chooseOptionBelow: 'Choisissez une option ci-dessous :',
-                    label: (importedTypes: string[]) => `Importé en tant que ${importedTypes.join('et')}`,
+                    label: ({importedTypes}: ImportedTypesParams) => `Importé en tant que ${importedTypes.join('et')}`,
                     requiredFieldError: ({fieldName}: RequiredFieldParams) => `Veuillez saisir le ${fieldName}`,
                     customSegments: {
                         title: 'Segments/enregistrements personnalisés',
@@ -4702,18 +4692,18 @@ _Pour des instructions plus détaillées, [visitez notre site d’aide](${CONST.
                     [CONST.INTEGRATION_ENTITY_MAP_TYPES.NETSUITE_DEFAULT]: {
                         label: 'Paramètre par défaut de l’employé NetSuite',
                         description: 'Non importé dans Expensify, appliqué à l’exportation',
-                        footerContent: (importField: string) =>
+                        footerContent: ({importField}: ImportFieldParams) =>
                             `Si vous utilisez ${importField} dans NetSuite, nous appliquerons la valeur par défaut définie sur la fiche employé lors de l’exportation vers le rapport de dépenses ou l’écriture de journal.`,
                     },
                     [CONST.INTEGRATION_ENTITY_MAP_TYPES.TAG]: {
                         label: 'Étiquettes',
                         description: 'Niveau poste de ligne',
-                        footerContent: (importField: string) => `${startCase(importField)} sera sélectionnable pour chaque dépense individuelle dans le rapport d'un employé.`,
+                        footerContent: ({importField}: ImportFieldParams) => `${startCase(importField)} sera sélectionnable pour chaque dépense individuelle dans le rapport d'un employé.`,
                     },
                     [CONST.INTEGRATION_ENTITY_MAP_TYPES.REPORT_FIELD]: {
                         label: 'Champs du rapport',
                         description: 'Niveau de rapport',
-                        footerContent: (importField: string) => `La sélection ${startCase(importField)} s’appliquera à toutes les dépenses sur le rapport d’un employé.`,
+                        footerContent: ({importField}: ImportFieldParams) => `La sélection ${startCase(importField)} s’appliquera à toutes les dépenses sur le rapport d’un employé.`,
                     },
                 },
             },
@@ -4791,7 +4781,7 @@ _Pour des instructions plus détaillées, [visitez notre site d’aide](${CONST.
                 commercialFeedPlaidDetails: `Nécessite une configuration avec votre banque, mais nous vous guiderons. Cela est généralement réservé aux grandes entreprises.`,
                 directFeedDetails: 'L’approche la plus simple. Connectez-vous immédiatement à l’aide de vos identifiants principaux. Cette méthode est la plus courante.',
                 enableFeed: {
-                    title: (provider: string) => `Activer votre flux ${provider}`,
+                    title: ({provider}: GoBackMessageParams) => `Activer votre flux ${provider}`,
                     heading:
                         'Nous avons une intégration directe avec l’émetteur de votre carte et pouvons importer rapidement et avec précision vos données de transactions dans Expensify.\n\nPour commencer, il vous suffit de :',
                     visa: 'Nous disposons d’intégrations globales avec Visa, bien que l’éligibilité varie selon la banque et le programme de carte.\n\nPour commencer, il vous suffit de :',
@@ -5068,25 +5058,6 @@ _Pour des instructions plus détaillées, [visitez notre site d’aide](${CONST.
                     subtitle: 'Utilisez Expensify Travel pour obtenir les meilleures offres de voyage et gérez toutes vos dépenses professionnelles en un seul endroit.',
                     ctaText: 'Réserver ou gérer',
                 },
-                travelInvoicing: {
-                    travelBookingSection: {
-                        title: 'Réservation de voyage',
-                        subtitle: 'Félicitations ! Vous êtes prêt à réserver et gérer les déplacements sur cet espace de travail.',
-                        manageTravelLabel: 'Gérer les déplacements',
-                    },
-                    centralInvoicingSection: {
-                        title: 'Facturation centralisée',
-                        subtitle: 'Centralisez toutes les dépenses de voyage dans une facture mensuelle plutôt que de payer au moment de l’achat.',
-                        learnHow: 'Découvrez comment.',
-                        subsections: {
-                            currentTravelSpendLabel: 'Dépenses de voyage actuelles',
-                            currentTravelSpendCta: 'Payer le solde',
-                            currentTravelLimitLabel: 'Limite de déplacement actuelle',
-                            settlementAccountLabel: 'Compte de règlement',
-                            settlementFrequencyLabel: 'Fréquence de règlement',
-                        },
-                    },
-                },
             },
             expensifyCard: {
                 title: 'Carte Expensify',
@@ -5376,7 +5347,7 @@ _Pour des instructions plus détaillées, [visitez notre site d’aide](${CONST.
                 prompt3: 'télécharger une sauvegarde',
                 prompt4: "d'abord.",
             },
-            importedTagsMessage: (columnCounts: number) =>
+            importedTagsMessage: ({columnCounts}: ImportedTagsMessageParams) =>
                 `Nous avons trouvé *${columnCounts} colonnes* dans votre feuille de calcul. Sélectionnez *Nom* à côté de la colonne qui contient les noms de tags. Vous pouvez également sélectionner *Activé* à côté de la colonne qui définit l’état des tags.`,
             cannotDeleteOrDisableAllTags: {
                 title: 'Impossible de supprimer ou de désactiver toutes les tags',
@@ -5546,8 +5517,7 @@ _Pour des instructions plus détaillées, [visitez notre site d’aide](${CONST.
                 giveItNameInstruction: 'Rendez-la suffisamment unique pour qu’on puisse la distinguer des autres cartes. Des cas d’usage précis, c’est encore mieux !',
                 cardName: 'Nom de la carte',
                 letsDoubleCheck: 'Vérifions une dernière fois que tout est correct.',
-                willBeReadyToUse: 'Cette carte sera prête à être utilisée immédiatement.',
-                willBeReadyToShip: 'Cette carte sera prête à être expédiée immédiatement.',
+                willBeReady: 'Cette carte sera prête à être utilisée immédiatement.',
                 cardholder: 'Titulaire de la carte',
                 cardType: 'Type de carte',
                 limit: 'Limite',
@@ -6208,7 +6178,7 @@ Exigez des informations de dépense comme les reçus et les descriptions, défin
         rules: {
             individualExpenseRules: {
                 title: 'Dépenses',
-                subtitle: (categoriesPageLink: string, tagsPageLink: string) =>
+                subtitle: ({categoriesPageLink, tagsPageLink}: IndividualExpenseRulesSubtitleParams) =>
                     `<muted-text>Définissez des contrôles de dépenses et des valeurs par défaut pour les dépenses individuelles. Vous pouvez également créer des règles pour les <a href="${categoriesPageLink}">catégories</a> et les <a href="${tagsPageLink}">tags</a>.</muted-text>`,
                 receiptRequiredAmount: 'Montant nécessitant un reçu',
                 receiptRequiredAmountDescription: 'Exiger des reçus lorsque la dépense dépasse ce montant, sauf si une règle de catégorie l’outrepasse.',
@@ -6279,10 +6249,6 @@ Exigez des informations de dépense comme les reçus et les descriptions, défin
                 title: 'Règles de catégorie',
                 approver: 'Approbateur',
                 requireDescription: 'Description requise',
-                requireFields: 'Rendre les champs obligatoires',
-                requiredFieldsTitle: 'Champs obligatoires',
-                requiredFieldsDescription: (categoryName: string) => `Cela s’appliquera à toutes les dépenses classées dans la catégorie <strong>${categoryName}</strong>.`,
-                requireAttendees: 'Exiger des participants',
                 descriptionHint: 'Indice de description',
                 descriptionHintDescription: (categoryName: string) =>
                     `Rappelez aux employés de fournir des informations supplémentaires pour les dépenses « ${categoryName} ». Cet indice apparaît dans le champ de description des dépenses.`,
@@ -6517,6 +6483,12 @@ Exigez des informations de dépense comme les reçus et les descriptions, défin
         deleteReportField: (fieldType: string, fieldName?: string) => `${fieldType} de rapport "${fieldName}" supprimé`,
         preventSelfApproval: ({oldValue, newValue}: UpdatedPolicyPreventSelfApprovalParams) =>
             `mis à jour « Empêcher l’auto-approbation » en « ${newValue === 'true' ? 'Activé' : 'Désactivé'} » (auparavant « ${oldValue === 'true' ? 'Activé' : 'Désactivé'} »)`,
+        updateMaxExpenseAmountNoReceipt: ({oldValue, newValue}: UpdatedPolicyFieldWithNewAndOldValueParams) =>
+            `a modifié le montant maximal d’une dépense nécessitant un reçu à ${newValue} (auparavant ${oldValue})`,
+        updateMaxExpenseAmount: ({oldValue, newValue}: UpdatedPolicyFieldWithNewAndOldValueParams) =>
+            `a modifié le montant maximal d’une dépense pour les violations à ${newValue} (auparavant ${oldValue})`,
+        updateMaxExpenseAge: ({oldValue, newValue}: UpdatedPolicyFieldWithNewAndOldValueParams) =>
+            `« Ancienneté maximale de la dépense (jours) » mise à jour sur « ${newValue} » (précédemment « ${oldValue === 'false' ? CONST.POLICY.DEFAULT_MAX_EXPENSE_AGE : oldValue} »)`,
         updateMonthlyOffset: ({oldValue, newValue}: UpdatedPolicyFieldWithNewAndOldValueParams) => {
             if (!oldValue) {
                 return `définir la date de soumission du rapport mensuel sur « ${newValue} »`;
@@ -6672,39 +6644,6 @@ Exigez des informations de dépense comme les reçus et les descriptions, défin
             previousForwardsTo
                 ? `a modifié le flux d’approbation pour ${approver} afin de ne plus transférer les rapports approuvés (auparavant transférés à ${previousForwardsTo})`
                 : `a modifié le flux d'approbation pour ${approver} afin de ne plus transférer les rapports approuvés`,
-        setDefaultBankAccount: ({bankAccountName, maskedBankAccountNumber}: {bankAccountName: string; maskedBankAccountNumber: string}) =>
-            `définir le compte bancaire professionnel par défaut sur « ${bankAccountName ? `${bankAccountName}: ` : ''}${maskedBankAccountNumber} »`,
-        removedDefaultBankAccount: ({bankAccountName, maskedBankAccountNumber}: {bankAccountName: string; maskedBankAccountNumber: string}) =>
-            `a supprimé le compte bancaire professionnel par défaut « ${bankAccountName ? `${bankAccountName}: ` : ''}${maskedBankAccountNumber} »`,
-        changedDefaultBankAccount: ({
-            bankAccountName,
-            maskedBankAccountNumber,
-            oldBankAccountName,
-            oldMaskedBankAccountNumber,
-        }: {
-            bankAccountName: string;
-            maskedBankAccountNumber: string;
-            oldBankAccountName: string;
-            oldMaskedBankAccountNumber: string;
-        }) =>
-            `a modifié le compte bancaire professionnel par défaut en « ${bankAccountName ? `${bankAccountName}: ` : ''}${maskedBankAccountNumber} » (auparavant « ${oldBankAccountName ? `${oldBankAccountName}: ` : ''}${oldMaskedBankAccountNumber} »)`,
-        changedInvoiceCompanyName: ({newValue, oldValue}: {newValue: string; oldValue?: string}) =>
-            oldValue ? `a modifié le nom de l’entreprise sur la facture en « ${newValue} » (auparavant « ${oldValue} »)` : `définir le nom de l’entreprise de la facture sur « ${newValue} »`,
-        changedInvoiceCompanyWebsite: ({newValue, oldValue}: {newValue: string; oldValue?: string}) =>
-            oldValue
-                ? `a modifié le site web de l’entreprise de la facture en « ${newValue} » (auparavant « ${oldValue} »)`
-                : `définir le site web de l’entreprise de la facture sur « ${newValue} »`,
-        changedReimburser: ({newReimburser, previousReimburser}: UpdatedPolicyReimburserParams) =>
-            previousReimburser ? `a modifié le payeur autorisé en « ${newReimburser} » (auparavant « ${previousReimburser} »)` : `a modifié le payeur autorisé en « ${newReimburser} »`,
-        setReceiptRequiredAmount: ({newValue}: UpdatedPolicyFieldWithNewAndOldValueParams) => `définir le montant requis du reçu sur « ${newValue} »`,
-        changedReceiptRequiredAmount: ({oldValue, newValue}: UpdatedPolicyFieldWithNewAndOldValueParams) => `montant de reçu requis modifié en « ${newValue} » (auparavant « ${oldValue} »)`,
-        removedReceiptRequiredAmount: ({oldValue}: UpdatedPolicyFieldWithNewAndOldValueParams) => `montant requis du reçu supprimé (précédemment « ${oldValue} »)`,
-        setMaxExpenseAmount: ({newValue}: UpdatedPolicyFieldWithNewAndOldValueParams) => `définir le montant maximal de dépense sur « ${newValue} »`,
-        changedMaxExpenseAmount: ({oldValue, newValue}: UpdatedPolicyFieldWithNewAndOldValueParams) => `montant maximal de dépense modifié en « ${newValue} » (précédemment « ${oldValue} »)`,
-        removedMaxExpenseAmount: ({oldValue}: UpdatedPolicyFieldWithNewAndOldValueParams) => `montant de dépense maximal supprimé (précédemment « ${oldValue} »)`,
-        setMaxExpenseAge: ({newValue}: UpdatedPolicyFieldWithNewAndOldValueParams) => `définir l’ancienneté maximale des dépenses à « ${newValue} » jours`,
-        changedMaxExpenseAge: ({oldValue, newValue}: UpdatedPolicyFieldWithNewAndOldValueParams) => `âge maximal de dépense modifié à « ${newValue} » jours (auparavant « ${oldValue} »)`,
-        removedMaxExpenseAge: ({oldValue}: UpdatedPolicyFieldWithNewAndOldValueParams) => `âge maximal de dépense supprimé (auparavant « ${oldValue} » jours)`,
     },
     roomMembersPage: {
         memberNotFound: 'Membre introuvable.',
@@ -6870,7 +6809,7 @@ Exigez des informations de dépense comme les reçus et les descriptions, défin
             amount: {
                 lessThan: ({amount}: OptionalParam<RequestAmountParams> = {}) => `Moins de ${amount ?? ''}`,
                 greaterThan: ({amount}: OptionalParam<RequestAmountParams> = {}) => `Supérieur à ${amount ?? ''}`,
-                between: (greaterThan: string, lessThan: string) => `Entre ${greaterThan} et ${lessThan}`,
+                between: ({greaterThan, lessThan}: FiltersAmountBetweenParams) => `Entre ${greaterThan} et ${lessThan}`,
                 equalTo: ({amount}: OptionalParam<RequestAmountParams> = {}) => `Égal à ${amount ?? ''}`,
             },
             card: {
@@ -7299,7 +7238,6 @@ Exigez des informations de dépense comme les reçus et les descriptions, défin
         maxAge: ({maxAge}: ViolationsMaxAgeParams) => `Date de plus de ${maxAge} jours`,
         missingCategory: 'Catégorie manquante',
         missingComment: 'Description requise pour la catégorie sélectionnée',
-        missingAttendees: 'Plusieurs participants sont requis pour cette catégorie',
         missingTag: ({tagName}: ViolationsMissingTagParams = {}) => `Manquant ${tagName ?? 'étiquette'}`,
         modifiedAmount: ({type, displayPercentVariance}: ViolationsModifiedAmountParams) => {
             switch (type) {
@@ -7407,7 +7345,6 @@ Exigez des informations de dépense comme les reçus et les descriptions, défin
         hold: 'Cette dépense a été mise en attente',
         resolvedDuplicates: 'a résolu le doublon',
         companyCardRequired: 'Achats avec carte d’entreprise requis',
-        noRoute: 'Veuillez sélectionner une adresse valide',
     },
     reportViolations: {
         [CONST.REPORT_VIOLATIONS.FIELD_REQUIRED]: ({fieldName}: RequiredFieldParams) => `${fieldName} est requis`,
@@ -8028,18 +7965,9 @@ Voici un *reçu test* pour vous montrer comment cela fonctionne :`,
             addAdminError: 'Impossible d’ajouter ce membre en tant qu’administrateur. Veuillez réessayer.',
             revokeAdminAccess: 'Révoquer l’accès administrateur',
             cantRevokeAdminAccess: 'Impossible de révoquer l’accès administrateur au contact technique',
-            error: {
-                removeAdmin: 'Impossible de supprimer cet utilisateur en tant qu’administrateur. Veuillez réessayer.',
-                removeDomain: 'Impossible de supprimer ce domaine. Veuillez réessayer.',
-                removeDomainNameInvalid: 'Veuillez saisir votre nom de domaine pour le réinitialiser.',
-            },
-            resetDomain: 'Réinitialiser le domaine',
-            resetDomainExplanation: ({domainName}: {domainName?: string}) => `Veuillez saisir <strong>${domainName}</strong> pour confirmer la réinitialisation du domaine.`,
-            enterDomainName: 'Saisissez votre nom de domaine ici',
-            resetDomainInfo: `Cette action est <strong>définitive</strong> et les données suivantes seront supprimées : <br/> <ul><li>Connexions aux cartes d'entreprise et toutes les dépenses non déclarées de ces cartes</li> <li>Paramètres SAML et de groupe</li> </ul> Tous les comptes, espaces de travail, rapports, dépenses et autres données seront conservés. <br/><br/>Remarque : Vous pouvez supprimer ce domaine de votre liste de domaines en retirant l'adresse e-mail associée de vos <a href="#">méthodes de contact</a>.`,
+            error: {removeAdmin: 'Impossible de supprimer cet utilisateur en tant qu’administrateur. Veuillez réessayer.'},
         },
         members: {title: 'Membres', findMember: 'Rechercher un membre'},
-        domainAdmins: 'Administrateurs de domaine',
     },
     gps: {
         tooltip: 'Suivi GPS en cours ! Quand vous avez terminé, arrêtez le suivi ci-dessous.',
@@ -8080,13 +8008,6 @@ Voici un *reçu test* pour vous montrer comment cela fonctionne :`,
             subtitle: 'Enregistrez automatiquement les miles ou kilomètres avec le GPS et transformez instantanément vos trajets en dépenses.',
             button: 'Télécharger l’application',
         },
-        notification: {title: 'Suivi GPS en cours', body: 'Aller dans l’application pour terminer'},
-        locationServicesRequiredModal: {
-            title: 'Accès à la localisation requis',
-            confirm: 'Ouvrir les paramètres',
-            prompt: 'Veuillez autoriser l’accès à la localisation dans les réglages de votre appareil pour lancer le suivi de distance GPS.',
-        },
-        fabGpsTripExplained: 'Aller à l’écran GPS (action flottante)',
     },
 };
 // IMPORTANT: This line is manually replaced in generate translation files by scripts/generateTranslations.ts,
diff --git a/src/languages/it.ts b/src/languages/it.ts
index 0576e890726b..579005161cef 100644
--- a/src/languages/it.ts
+++ b/src/languages/it.ts
@@ -28,6 +28,24 @@ import type {
     EditActionParams,
     ExportAgainModalDescriptionParams,
     ExportIntegrationSelectedParams,
+    FileLimitParams,
+    FileTypeParams,
+    FiltersAmountBetweenParams,
+    FlightLayoverParams,
+    FlightParams,
+    FocusModeUpdateParams,
+    FormattedMaxLengthParams,
+    GoBackMessageParams,
+    HarvestCreatedExpenseReportParams,
+    ImportedTagsMessageParams,
+    ImportedTypesParams,
+    ImportFieldParams,
+    ImportMembersSuccessfulDescriptionParams,
+    ImportPerDiemRatesSuccessfulDescriptionParams,
+    ImportTagsSuccessfulDescriptionParams,
+    IncorrectZipFormatParams,
+    IndividualExpenseRulesSubtitleParams,
+    InstantSummaryParams,
     IntacctMappingTitleParams,
     IntegrationExportParams,
     IntegrationSyncFailedParams,
@@ -115,6 +133,9 @@ import type {
     SplitDateRangeParams,
     SplitExpenseEditTitleParams,
     SplitExpenseSubtitleParams,
+    SpreadCategoriesParams,
+    SpreadFieldNameParams,
+    SpreadSheetColumnParams,
     StatementTitleParams,
     StepCounterParams,
     StripePaidParams,
@@ -164,7 +185,6 @@ import type {
     UpdatedPolicyManualApprovalThresholdParams,
     UpdatedPolicyPreventSelfApprovalParams,
     UpdatedPolicyReimbursementEnabledParams,
-    UpdatedPolicyReimburserParams,
     UpdatedPolicyReportFieldDefaultValueParams,
     UpdatedPolicyTagFieldParams,
     UpdatedPolicyTagNameParams,
@@ -259,7 +279,8 @@ const translations: TranslationDeepObject<typeof en> = {
         searchWithThreeDots: 'Cerca...',
         next: 'Avanti',
         previous: 'Precedente',
-        goBack: 'Indietro',
+        // @context Navigation button that returns the user to the previous screen. Should be interpreted as a UI action label.
+        goBack: 'Torna indietro',
         create: 'Crea',
         add: 'Aggiungi',
         resend: 'Reinvia',
@@ -276,7 +297,6 @@ const translations: TranslationDeepObject<typeof en> = {
         zoom: 'Zoom',
         password: 'Password',
         magicCode: 'Codice magico',
-        digits: 'cifre',
         twoFactorCode: 'Codice di verifica in due passaggi',
         workspaces: 'Workspace',
         inbox: 'Posta in arrivo',
@@ -533,6 +553,10 @@ const translations: TranslationDeepObject<typeof en> = {
         value: 'Valore',
         downloadFailedTitle: 'Download non riuscito',
         downloadFailedDescription: 'Il download non può essere completato. Riprova più tardi.',
+        downloadFailedEmptyReportDescription: () => ({
+            one: 'Non puoi esportare un rapporto vuoto.',
+            other: () => 'Non puoi esportare rapporti vuoti.',
+        }),
         filterLogs: 'Filtra registri',
         network: 'Rete',
         reportID: 'ID rapporto',
@@ -628,6 +652,7 @@ const translations: TranslationDeepObject<typeof en> = {
         copyToClipboard: 'Copia negli appunti',
         thisIsTakingLongerThanExpected: 'Sta richiedendo più tempo del previsto...',
         domains: 'Domini',
+        viewReport: 'Visualizza rendiconto',
         actionRequired: 'Azione richiesta',
         duplicate: 'Duplica',
         duplicated: 'Duplicato',
@@ -688,12 +713,12 @@ const translations: TranslationDeepObject<typeof en> = {
         protectedPDFNotSupported: 'I PDF protetti da password non sono supportati',
         attachmentImageResized: 'Questa immagine è stata ridimensionata per l’anteprima. Scarica per la risoluzione completa.',
         attachmentImageTooLarge: 'Questa immagine è troppo grande per essere visualizzata in anteprima prima del caricamento.',
-        tooManyFiles: (fileLimit: number) => `Puoi caricare al massimo ${fileLimit} file alla volta.`,
+        tooManyFiles: ({fileLimit}: FileLimitParams) => `Puoi caricare al massimo ${fileLimit} file alla volta.`,
         sizeExceededWithValue: ({maxUploadSizeInMB}: SizeExceededParams) => `I file superano ${maxUploadSizeInMB} MB. Riprova.`,
         someFilesCantBeUploaded: 'Alcuni file non possono essere caricati',
         sizeLimitExceeded: ({maxUploadSizeInMB}: SizeExceededParams) => `I file devono essere inferiori a ${maxUploadSizeInMB} MB. I file più grandi non verranno caricati.`,
         maxFileLimitExceeded: 'Puoi caricare fino a 30 ricevute alla volta. Le eventuali ricevute in più non verranno caricate.',
-        unsupportedFileType: (fileType: string) => `I file ${fileType} non sono supportati. Verranno caricati solo i tipi di file supportati.`,
+        unsupportedFileType: ({fileType}: FileTypeParams) => `I file ${fileType} non sono supportati. Verranno caricati solo i tipi di file supportati.`,
         learnMoreAboutSupportedFiles: 'Scopri di più sui formati supportati.',
         passwordProtected: 'I PDF protetti da password non sono supportati. Verranno caricati solo i file supportati.',
     },
@@ -718,8 +743,8 @@ const translations: TranslationDeepObject<typeof en> = {
     composer: {
         noExtensionFoundForMimeType: 'Nessuna estensione trovata per il tipo MIME',
         problemGettingImageYouPasted: "Si è verificato un problema durante l'acquisizione dell'immagine che hai incollato",
-        commentExceededMaxLength: (formattedMaxLength: string) => `La lunghezza massima del commento è di ${formattedMaxLength} caratteri.`,
-        taskTitleExceededMaxLength: (formattedMaxLength: string) => `La lunghezza massima del titolo dell’attività è di ${formattedMaxLength} caratteri.`,
+        commentExceededMaxLength: ({formattedMaxLength}: FormattedMaxLengthParams) => `La lunghezza massima del commento è di ${formattedMaxLength} caratteri.`,
+        taskTitleExceededMaxLength: ({formattedMaxLength}: FormattedMaxLengthParams) => `La lunghezza massima del titolo dell’attività è di ${formattedMaxLength} caratteri.`,
     },
     baseUpdateAppModal: {
         updateApp: 'Aggiorna app',
@@ -730,35 +755,6 @@ const translations: TranslationDeepObject<typeof en> = {
         expired: 'La tua sessione è scaduta.',
         signIn: 'Accedi di nuovo.',
     },
-    multifactorAuthentication: {
-        biometricsTest: {
-            biometricsTest: 'Test biometrico',
-            authenticationSuccessful: 'Autenticazione riuscita',
-            successfullyAuthenticatedUsing: ({authType}) => `Ti sei autenticato con successo utilizzando ${authType}.`,
-            troubleshootBiometricsStatus: ({registered}) => `Biometria (${registered ? 'Registrata' : 'Non registrata'})`,
-            yourAttemptWasUnsuccessful: 'Il tuo tentativo di autenticazione non è riuscito.',
-            youCouldNotBeAuthenticated: 'Non è stato possibile autenticarti',
-            areYouSureToReject: "Sei sicuro? L'autenticazione sarà rifiutata se chiudi questa schermata.",
-            rejectAuthentication: 'Rifiuta autenticazione',
-            test: 'Test',
-            biometricsAuthentication: 'Autenticazione biometrica',
-        },
-        pleaseEnableInSystemSettings: {
-            start: 'Si prega di abilitare la verifica facciale/impronta digitale o impostare un codice di accesso del dispositivo nelle tue ',
-            link: 'impostazioni di sistema',
-            end: '.',
-        },
-        oops: 'Ops, qualcosa è andato storto',
-        looksLikeYouRanOutOfTime: 'Sembra che il tempo sia scaduto! Per favore, riprova presso il commerciante.',
-        youRanOutOfTime: 'Il tempo è scaduto',
-        letsVerifyItsYou: 'Verifichiamo che sei tu',
-        verifyYourself: {
-            biometrics: 'Verificati con il tuo viso o impronta digitale',
-        },
-        enableQuickVerification: {
-            biometrics: 'Abilita una verifica rapida e sicura utilizzando il tuo viso o impronta digitale. Nessuna password o codice necessario.',
-        },
-    },
     validateCodeModal: {
         successfulSignInTitle: dedent(`
             Abracadabra,
@@ -928,7 +924,7 @@ const translations: TranslationDeepObject<typeof en> = {
     adminOnlyCanPost: 'Solo gli amministratori possono inviare messaggi in questa stanza.',
     reportAction: {
         asCopilot: 'come copilota per',
-        harvestCreatedExpenseReport: (reportUrl: string, reportName: string) =>
+        harvestCreatedExpenseReport: ({reportUrl, reportName}: HarvestCreatedExpenseReportParams) =>
             `ha creato questo rapporto per raccogliere tutte le spese di <a href="${reportUrl}">${reportName}</a> che non sono state inviate con la frequenza scelta`,
         createdReportForUnapprovedTransactions: ({reportUrl, reportName}: CreatedReportForUnapprovedTransactionsParams) =>
             `ha creato questo report per eventuali spese in sospeso da <a href="${reportUrl}">${reportName}</a>`,
@@ -970,7 +966,7 @@ const translations: TranslationDeepObject<typeof en> = {
         buttonFind: 'Trova qualcosa...',
         buttonMySettings: 'Le mie impostazioni',
         fabNewChat: 'Avvia chat',
-        fabNewChatExplained: 'Apri menu azioni',
+        fabNewChatExplained: 'Avvia chat (Azione flottante)',
         fabScanReceiptExplained: 'Scansiona ricevuta (Azione flottante)',
         chatPinned: 'Chat fissata',
         draftedMessage: 'Messaggio in bozza',
@@ -996,13 +992,13 @@ const translations: TranslationDeepObject<typeof en> = {
         chooseSpreadsheet: '<muted-link>Seleziona un file di foglio di calcolo da importare. Formati supportati: .csv, .txt, .xls e .xlsx.</muted-link>',
         chooseSpreadsheetMultiLevelTag: `<muted-link>Seleziona un file di foglio di calcolo da importare. <a href="${CONST.IMPORT_SPREADSHEET.MULTI_LEVEL_TAGS_ARTICLE_LINK}">Ulteriori informazioni</a> sui formati di file supportati.</muted-link>`,
         fileContainsHeader: 'Il file contiene intestazioni di colonna',
-        column: (name: string) => `Colonna ${name}`,
-        fieldNotMapped: (fieldName: string) => `Ops! Un campo obbligatorio ("${fieldName}") non è stato mappato. Controlla e riprova.`,
-        singleFieldMultipleColumns: (fieldName: string) => `Ops! Hai associato un singolo campo ("${fieldName}") a più colonne. Controlla e riprova.`,
-        emptyMappedField: (fieldName: string) => `Ops! Il campo («${fieldName}») contiene uno o più valori vuoti. Controlla e riprova.`,
+        column: ({name}: SpreadSheetColumnParams) => `Colonna ${name}`,
+        fieldNotMapped: ({fieldName}: SpreadFieldNameParams) => `Ops! Un campo obbligatorio ("${fieldName}") non è stato mappato. Controlla e riprova.`,
+        singleFieldMultipleColumns: ({fieldName}: SpreadFieldNameParams) => `Ops! Hai associato un singolo campo ("${fieldName}") a più colonne. Controlla e riprova.`,
+        emptyMappedField: ({fieldName}: SpreadFieldNameParams) => `Ops! Il campo («${fieldName}») contiene uno o più valori vuoti. Controlla e riprova.`,
         importSuccessfulTitle: 'Importazione riuscita',
-        importCategoriesSuccessfulDescription: ({categories}: {categories: number}) => (categories > 1 ? `Sono state aggiunte ${categories} categorie.` : '1 categoria è stata aggiunta.'),
-        importMembersSuccessfulDescription: ({added, updated}: {added: number; updated: number}) => {
+        importCategoriesSuccessfulDescription: ({categories}: SpreadCategoriesParams) => (categories > 1 ? `Sono state aggiunte ${categories} categorie.` : '1 categoria è stata aggiunta.'),
+        importMembersSuccessfulDescription: ({added, updated}: ImportMembersSuccessfulDescriptionParams) => {
             if (!added && !updated) {
                 return 'Nessun membro è stato aggiunto o aggiornato.';
             }
@@ -1014,9 +1010,10 @@ const translations: TranslationDeepObject<typeof en> = {
             }
             return added > 1 ? `${added} membri sono stati aggiunti.` : 'È stato aggiunto 1 membro.';
         },
-        importTagsSuccessfulDescription: ({tags}: {tags: number}) => (tags > 1 ? `Sono stati aggiunti ${tags} tag.` : 'È stato aggiunto 1 tag.'),
+        importTagsSuccessfulDescription: ({tags}: ImportTagsSuccessfulDescriptionParams) => (tags > 1 ? `Sono stati aggiunti ${tags} tag.` : 'È stato aggiunto 1 tag.'),
         importMultiLevelTagsSuccessfulDescription: 'Sono stati aggiunti i tag multilivello.',
-        importPerDiemRatesSuccessfulDescription: ({rates}: {rates: number}) => (rates > 1 ? `Sono state aggiunte le tariffe di diaria ${rates}.` : 'È stata aggiunta 1 tariffa di diaria.'),
+        importPerDiemRatesSuccessfulDescription: ({rates}: ImportPerDiemRatesSuccessfulDescriptionParams) =>
+            rates > 1 ? `Sono state aggiunte le tariffe di diaria ${rates}.` : 'È stata aggiunta 1 tariffa di diaria.',
         importFailedTitle: 'Importazione non riuscita',
         importFailedDescription: 'Assicurati che tutti i campi siano compilati correttamente e riprova. Se il problema persiste, contatta Concierge.',
         importDescription: 'Scegli quali campi mappare dal tuo foglio di calcolo cliccando il menu a discesa accanto a ciascuna colonna importata qui sotto.',
@@ -1196,8 +1193,14 @@ const translations: TranslationDeepObject<typeof en> = {
             one: 'Sei sicuro di voler eliminare questa spesa?',
             other: 'Sei sicuro di voler eliminare queste spese?',
         }),
-        deleteReport: 'Elimina resoconto',
-        deleteReportConfirmation: 'Sei sicuro di voler eliminare questo report?',
+        deleteReport: () => ({
+            one: 'Elimina rapporto',
+            other: 'Elimina rapporti',
+        }),
+        deleteReportConfirmation: () => ({
+            one: 'Sei sicuro di voler eliminare questo report?',
+            other: 'Sei sicuro di voler eliminare questi report?',
+        }),
         settledExpensify: 'Pagato',
         done: 'Fatto',
         settledElsewhere: 'Pagato altrove',
@@ -1448,8 +1451,9 @@ const translations: TranslationDeepObject<typeof en> = {
         moveExpensesError: 'Non puoi spostare le spese per diaria su report in altri workspace, perché le tariffe per diaria possono differire tra workspace.',
         changeApprover: {
             title: 'Cambia approvatore',
-            header: ({workflowSettingLink}: WorkflowSettingsParam) =>
-                `Scegli un'opzione per modificare l'approvatore di questo report. (Aggiorna le <a href="${workflowSettingLink}">impostazioni dell'area di lavoro</a> per modificare questa impostazione in modo permanente per tutti i report.)`,
+            subtitle: "Scegli un'opzione per cambiare l'approvatore di questo report.",
+            description: ({workflowSettingLink}: WorkflowSettingsParam) =>
+                `Puoi anche modificare in modo permanente l'approvatore per tutti i report nelle tue <a href="${workflowSettingLink}">impostazioni del flusso di lavoro</a>.`,
             changedApproverMessage: (managerID: number) => `ha cambiato l'approvatore in <mention-user accountID="${managerID}"/>`,
             actions: {
                 addApprover: 'Aggiungi approvatore',
@@ -1467,13 +1471,7 @@ const translations: TranslationDeepObject<typeof en> = {
         splitDateRange: ({startDate, endDate, count}: SplitDateRangeParams) => `${startDate} a ${endDate} (${count} giorni)`,
         splitByDate: 'Dividi per data',
         routedDueToDEW: ({to}: RoutedDueToDEWParams) => `rapporto inoltrato a ${to} a causa del flusso di lavoro di approvazione personalizzato`,
-        timeTracking: {
-            hoursAt: (hours: number, rate: string) => `${hours} ${hours === 1 ? 'ora' : 'ore'} @ ${rate} / ora`,
-            hrs: 'ore',
-            hours: 'Ore',
-            ratePreview: (rate: string) => `${rate} / ora`,
-            amountTooLargeError: 'L’importo totale è troppo elevato. Riduci le ore o diminuisci la tariffa.',
-        },
+        timeTracking: {hoursAt: (hours: number, rate: string) => `${hours} ${hours === 1 ? 'ora' : 'ore'} @ ${rate} / ora`, hrs: 'ore'},
     },
     transactionMerge: {
         listPage: {
@@ -1952,6 +1950,13 @@ const translations: TranslationDeepObject<typeof en> = {
         chatToConciergeToUnlock: 'Chatta con Concierge per risolvere i problemi di sicurezza e sbloccare il tuo account.',
         chatWithConcierge: 'Chatta con Concierge',
     },
+    passwordPage: {
+        changePassword: 'Cambia password',
+        changingYourPasswordPrompt: 'La modifica della password aggiornerà la password sia per il tuo account Expensify.com sia per il tuo account New Expensify.',
+        currentPassword: 'Password attuale',
+        newPassword: 'Nuova password',
+        newPasswordPrompt: 'La nuova password deve essere diversa dalla vecchia password e contenere almeno 8 caratteri, 1 lettera maiuscola, 1 lettera minuscola e 1 numero.',
+    },
     twoFactorAuth: {
         headerTitle: 'Autenticazione a due fattori',
         twoFactorAuthEnabled: 'Autenticazione a due fattori abilitata',
@@ -2351,7 +2356,7 @@ ${amount} per ${merchant} - ${date}`,
     transferAmountPage: {
         transfer: ({amount}: TransferParams) => `Trasferimento${amount ? ` ${amount}` : ''}`,
         instant: 'Immediato (Carta di debito)',
-        instantSummary: (rate: string, minAmount: string) => `Commissione del ${rate}% (${minAmount} minimo)`,
+        instantSummary: ({rate, minAmount}: InstantSummaryParams) => `Commissione del ${rate}% (${minAmount} minimo)`,
         ach: '1-3 giorni lavorativi (Conto bancario)',
         achSummary: 'Nessuna commissione',
         whichAccount: 'Quale conto?',
@@ -2386,31 +2391,10 @@ ${amount} per ${merchant} - ${date}`,
             comment: (value: string) => `Modifica la descrizione in "${value}"`,
             merchant: (value: string) => `Aggiorna esercente in "${value}"`,
             reimbursable: (value: boolean) => `Aggiorna la spesa ${value ? 'rimborsabile' : 'non rimborsabile'}`,
-            report: (value: string) => `Aggiungi a un report chiamato «${value}»`,
+            report: (value: string) => `Aggiungi un report chiamato "${value}"`,
             tag: (value: string) => `Aggiorna etichetta in "${value}"`,
             tax: (value: string) => `Aggiorna l’aliquota fiscale a ${value}`,
         },
-        newRule: 'Nuova regola',
-        addRule: {
-            title: 'Aggiungi regola',
-            expenseContains: 'Se la spesa contiene:',
-            applyUpdates: 'Quindi applica questi aggiornamenti:',
-            merchantHint: 'Digita * per creare una regola che si applica a tutti gli esercenti',
-            addToReport: 'Aggiungi a un report chiamato',
-            createReport: 'Crea report se necessario',
-            applyToExistingExpenses: 'Applica alle spese corrispondenti esistenti',
-            confirmError: "Inserisci l'esercente e applica almeno un aggiornamento",
-            confirmErrorMerchant: 'Inserisci l’esercente',
-            confirmErrorUpdate: 'Applica almeno un aggiornamento',
-            saveRule: 'Salva regola',
-        },
-        editRule: {title: 'Modifica regola'},
-        deleteRule: {
-            deleteSingle: 'Elimina regola',
-            deleteMultiple: 'Elimina regole',
-            deleteSinglePrompt: 'Sei sicuro di voler eliminare questa regola?',
-            deleteMultiplePrompt: 'Sei sicuro di voler eliminare queste regole?',
-        },
     },
     preferencesPage: {
         appSection: {
@@ -2904,7 +2888,7 @@ ${
             dateShouldBeBefore: (dateString: string) => `La data deve essere precedente a ${dateString}`,
             dateShouldBeAfter: (dateString: string) => `La data deve essere successiva a ${dateString}`,
             hasInvalidCharacter: 'Il nome può includere solo caratteri latini',
-            incorrectZipFormat: (zipFormat?: string) => `Formato del codice postale non corretto${zipFormat ? `Formato accettabile: ${zipFormat}` : ''}`,
+            incorrectZipFormat: ({zipFormat}: IncorrectZipFormatParams = {}) => `Formato del codice postale non corretto${zipFormat ? `Formato accettabile: ${zipFormat}` : ''}`,
             invalidPhoneNumber: `Assicurati che il numero di telefono sia valido (ad es. ${CONST.EXAMPLE_PHONE_NUMBER})`,
         },
     },
@@ -2987,7 +2971,7 @@ ${
     },
     focusModeUpdateModal: {
         title: 'Benvenuto nella modalità #focus!',
-        prompt: (priorityModePageUrl: string) =>
+        prompt: ({priorityModePageUrl}: FocusModeUpdateParams) =>
             `Rimani sempre aggiornato visualizzando solo le chat non lette o quelle che richiedono la tua attenzione. Non preoccuparti, puoi modificare questa impostazione in qualsiasi momento dalle <a href="${priorityModePageUrl}">impostazioni</a>.`,
     },
     notFound: {
@@ -3007,6 +2991,15 @@ ${
         subtitle: 'Impossibile completare la tua richiesta. Riprova più tardi.',
         wrongTypeSubtitle: 'Questa ricerca non è valida. Prova a modificare i criteri di ricerca.',
     },
+    setPasswordPage: {
+        enterPassword: 'Inserisci una password',
+        setPassword: 'Imposta password',
+        newPasswordPrompt: 'La tua password deve contenere almeno 8 caratteri, 1 lettera maiuscola, 1 lettera minuscola e 1 numero.',
+        passwordFormTitle: 'Bentornato nella nuova Expensify! Imposta la tua password.',
+        passwordNotSet: 'Non è stato possibile impostare la tua nuova password. Ti abbiamo inviato un nuovo link per la password per riprovare.',
+        setPasswordLinkInvalid: 'Questo link per impostare la password non è valido o è scaduto. Un nuovo link ti sta aspettando nella tua casella di posta!',
+        validateAccount: 'Verifica account',
+    },
     statusPage: {
         status: 'Stato',
         statusExplanation: "Aggiungi un'emoji per offrire a colleghi e amici un modo semplice per capire cosa sta succedendo. Puoi anche aggiungere un messaggio opzionale!",
@@ -3148,13 +3141,10 @@ ${
         errorMessageInvalidPhone: `Per favore inserisci un numero di telefono valido senza parentesi o trattini. Se ti trovi fuori dagli Stati Uniti, includi il prefisso del tuo paese (ad es. ${CONST.EXAMPLE_PHONE_NUMBER}).`,
         errorMessageInvalidEmail: 'Email non valido',
         userIsAlreadyMember: ({login, name}: UserIsAlreadyMemberParams) => `${login} è già un membro di ${name}`,
-        userIsAlreadyAnAdmin: ({login, name}: UserIsAlreadyMemberParams) => `${login} è già un amministratore di ${name}`,
     },
     onfidoStep: {
         acceptTerms: 'Continuando con la richiesta di attivare il tuo Expensify Wallet, confermi di aver letto, compreso e accettato',
         facialScan: 'Informativa e liberatoria di Onfido per la scansione facciale',
-        onfidoLinks: (onfidoTitle: string) =>
-            `<muted-text-micro>${onfidoTitle} <a href='${CONST.ONFIDO_FACIAL_SCAN_POLICY_URL}'>Informativa e liberatoria di Onfido per la scansione facciale</a>, <a href='${CONST.ONFIDO_PRIVACY_POLICY_URL}'>Privacy</a> e <a href='${CONST.ONFIDO_TERMS_OF_SERVICE_URL}'>Termini di servizio</a>.</muted-text-micro>`,
         tryAgain: 'Riprova',
         verifyIdentity: 'Verifica identità',
         letsVerifyIdentity: 'Verifichiamo la tua identità',
@@ -3652,7 +3642,7 @@ ${
         flight: 'Volo',
         flightDetails: {
             passenger: 'Passeggero',
-            layover: (layover: string) => `<muted-text-label>Hai uno <strong>scalo di ${layover}</strong> prima di questo volo</muted-text-label>`,
+            layover: ({layover}: FlightLayoverParams) => `<muted-text-label>Hai uno <strong>scalo di ${layover}</strong> prima di questo volo</muted-text-label>`,
             takeOff: 'Decollo',
             landing: 'Pagina iniziale',
             seat: 'Postazione',
@@ -3742,18 +3732,17 @@ ${
             conciergeMessage: ({domain}: {domain: string}) => `Abilitazione dei viaggi non riuscita per il dominio: ${domain}. Controlla e abilita i viaggi per questo dominio.`,
         },
         updates: {
-            bookingTicketed: (airlineCode: string, origin: string, destination: string, startDate: string, confirmationID = '') =>
+            bookingTicketed: ({airlineCode, origin, destination, startDate, confirmationID = ''}: FlightParams) =>
                 `Il tuo volo ${airlineCode} (${origin} → ${destination}) del ${startDate} è stato prenotato. Codice di conferma: ${confirmationID}`,
-            ticketVoided: (airlineCode: string, origin: string, destination: string, startDate: string) =>
+            ticketVoided: ({airlineCode, origin, destination, startDate}: FlightParams) =>
                 `Il tuo biglietto per il volo ${airlineCode} (${origin} → ${destination}) del ${startDate} è stato annullato.`,
-            ticketRefunded: (airlineCode: string, origin: string, destination: string, startDate: string) =>
+            ticketRefunded: ({airlineCode, origin, destination, startDate}: FlightParams) =>
                 `Il tuo biglietto per il volo ${airlineCode} (${origin} → ${destination}) del ${startDate} è stato rimborsato o modificato.`,
-            flightCancelled: (airlineCode: string, origin: string, destination: string, startDate: string) =>
+            flightCancelled: ({airlineCode, origin, destination, startDate}: FlightParams) =>
                 `Il tuo volo ${airlineCode} (${origin} → ${destination}) del ${startDate}} è stato cancellato dalla compagnia aerea.`,
             flightScheduleChangePending: (airlineCode: string) => `La compagnia aerea ha proposto un cambio di orario per il volo ${airlineCode}; siamo in attesa di conferma.`,
             flightScheduleChangeClosed: (airlineCode: string, startDate?: string) => `Cambio di programmazione confermato: il volo ${airlineCode} ora parte alle ${startDate}.`,
-            flightUpdated: (airlineCode: string, origin: string, destination: string, startDate: string) =>
-                `Il tuo volo ${airlineCode} (${origin} → ${destination}) del ${startDate} è stato aggiornato.`,
+            flightUpdated: ({airlineCode, origin, destination, startDate}: FlightParams) => `Il tuo volo ${airlineCode} (${origin} → ${destination}) del ${startDate} è stato aggiornato.`,
             flightCabinChanged: (airlineCode: string, cabinClass?: string) => `La tua classe di cabina è stata aggiornata a ${cabinClass} sul volo ${airlineCode}.`,
             flightSeatConfirmed: (airlineCode: string) => `La tua assegnazione del posto sul volo ${airlineCode} è stata confermata.`,
             flightSeatChanged: (airlineCode: string) => `La tua assegnazione del posto sul volo ${airlineCode} è stata modificata.`,
@@ -4570,7 +4559,7 @@ ${
                 importTaxDescription: 'Importa gruppi di imposte da NetSuite.',
                 importCustomFields: {
                     chooseOptionBelow: "Scegli un'opzione qui sotto:",
-                    label: (importedTypes: string[]) => `Importato come ${importedTypes.join('e')}`,
+                    label: ({importedTypes}: ImportedTypesParams) => `Importato come ${importedTypes.join('e')}`,
                     requiredFieldError: ({fieldName}: RequiredFieldParams) => `Inserisci il/la ${fieldName}`,
                     customSegments: {
                         title: 'Segmenti/record personalizzati',
@@ -4685,18 +4674,18 @@ _Per istruzioni più dettagliate, [visita il nostro sito di assistenza](${CONST.
                     [CONST.INTEGRATION_ENTITY_MAP_TYPES.NETSUITE_DEFAULT]: {
                         label: 'Impostazione predefinita dipendente NetSuite',
                         description: "Non importato in Expensify, applicato all'esportazione",
-                        footerContent: (importField: string) =>
+                        footerContent: ({importField}: ImportFieldParams) =>
                             `Se utilizzi ${importField} in NetSuite, applicheremo il valore predefinito impostato nel record del dipendente all'esportazione verso Expense Report o Journal Entry.`,
                     },
                     [CONST.INTEGRATION_ENTITY_MAP_TYPES.TAG]: {
                         label: 'Tag',
                         description: 'A livello di singola voce',
-                        footerContent: (importField: string) => `${startCase(importField)} sarà selezionabile per ogni singola spesa nel report di un dipendente.`,
+                        footerContent: ({importField}: ImportFieldParams) => `${startCase(importField)} sarà selezionabile per ogni singola spesa nel report di un dipendente.`,
                     },
                     [CONST.INTEGRATION_ENTITY_MAP_TYPES.REPORT_FIELD]: {
                         label: 'Campi del report',
                         description: 'Livello del report',
-                        footerContent: (importField: string) => `La selezione ${startCase(importField)} verrà applicata a tutte le spese nel rendiconto di un dipendente.`,
+                        footerContent: ({importField}: ImportFieldParams) => `La selezione ${startCase(importField)} verrà applicata a tutte le spese nel rendiconto di un dipendente.`,
                     },
                 },
             },
@@ -4773,7 +4762,7 @@ _Per istruzioni più dettagliate, [visita il nostro sito di assistenza](${CONST.
                 commercialFeedPlaidDetails: `Richiede la configurazione con la tua banca, ma ti guideremo noi. Di solito è limitato alle aziende più grandi.`,
                 directFeedDetails: 'L’approccio più semplice. Connettiti subito utilizzando le tue credenziali master. Questo metodo è il più comune.',
                 enableFeed: {
-                    title: (provider: string) => `Abilita il tuo feed ${provider}`,
+                    title: ({provider}: GoBackMessageParams) => `Abilita il tuo feed ${provider}`,
                     heading:
                         'Abbiamo un’integrazione diretta con l’emittente della tua carta e possiamo importare i dati delle tue transazioni in Expensify in modo rapido e accurato.\n\nPer iniziare, ti basta:',
                     visa: 'Abbiamo integrazioni globali con Visa, anche se l’idoneità varia in base alla banca e al programma della carta.\n\nPer iniziare, ti basta:',
@@ -5048,25 +5037,6 @@ _Per istruzioni più dettagliate, [visita il nostro sito di assistenza](${CONST.
                     subtitle: 'Usa Expensify Travel per ottenere le migliori offerte di viaggio e gestisci tutte le tue spese aziendali in un unico posto.',
                     ctaText: 'Prenota o gestisci',
                 },
-                travelInvoicing: {
-                    travelBookingSection: {
-                        title: 'Prenotazione di viaggio',
-                        subtitle: 'Complimenti! Ora sei pronto per prenotare e gestire i viaggi in questo spazio di lavoro.',
-                        manageTravelLabel: 'Gestisci viaggi',
-                    },
-                    centralInvoicingSection: {
-                        title: 'Fatturazione centralizzata',
-                        subtitle: 'Centralizza tutte le spese di viaggio in una fattura mensile invece di pagare al momento dell’acquisto.',
-                        learnHow: 'Scopri come.',
-                        subsections: {
-                            currentTravelSpendLabel: 'Spesa di viaggio attuale',
-                            currentTravelSpendCta: 'Paga saldo',
-                            currentTravelLimitLabel: 'Limite di viaggio attuale',
-                            settlementAccountLabel: 'Conto di regolamento',
-                            settlementFrequencyLabel: 'Frequenza di regolamento',
-                        },
-                    },
-                },
             },
             expensifyCard: {
                 title: 'Carta Expensify',
@@ -5355,7 +5325,7 @@ _Per istruzioni più dettagliate, [visita il nostro sito di assistenza](${CONST.
                 prompt3: 'scarica un backup',
                 prompt4: 'primo.',
             },
-            importedTagsMessage: (columnCounts: number) =>
+            importedTagsMessage: ({columnCounts}: ImportedTagsMessageParams) =>
                 `Abbiamo trovato *${columnCounts} colonne* nel tuo foglio di calcolo. Seleziona *Nome* accanto alla colonna che contiene i nomi dei tag. Puoi anche selezionare *Abilitato* accanto alla colonna che imposta lo stato dei tag.`,
             cannotDeleteOrDisableAllTags: {
                 title: 'Impossibile eliminare o disattivare tutti i tag',
@@ -5525,8 +5495,7 @@ _Per istruzioni più dettagliate, [visita il nostro sito di assistenza](${CONST.
                 giveItNameInstruction: 'Rendila abbastanza unica da poterla distinguere dalle altre carte. Casi d’uso specifici sono ancora meglio!',
                 cardName: 'Nome carta',
                 letsDoubleCheck: 'Controlliamo ancora una volta che tutto sia corretto.',
-                willBeReadyToUse: "Questa carta sarà subito pronta all'uso.",
-                willBeReadyToShip: 'Questa carta sarà pronta per la spedizione immediata.',
+                willBeReady: "Questa carta sarà subito pronta all'uso.",
                 cardholder: 'Titolare della carta',
                 cardType: 'Tipo di carta',
                 limit: 'Limite',
@@ -6182,7 +6151,7 @@ Richiedi dettagli di spesa come ricevute e descrizioni, imposta limiti e valori
         rules: {
             individualExpenseRules: {
                 title: 'Spese',
-                subtitle: (categoriesPageLink: string, tagsPageLink: string) =>
+                subtitle: ({categoriesPageLink, tagsPageLink}: IndividualExpenseRulesSubtitleParams) =>
                     `<muted-text>Imposta controlli di spesa e valori predefiniti per le singole spese. Puoi anche creare regole per le <a href="${categoriesPageLink}">categorie</a> e per i <a href="${tagsPageLink}">tag</a>.</muted-text>`,
                 receiptRequiredAmount: 'Importo richiesto della ricevuta',
                 receiptRequiredAmountDescription: 'Richiedi ricevute quando la spesa supera questo importo, a meno che non venga sostituito da una regola della categoria.',
@@ -6253,10 +6222,6 @@ Richiedi dettagli di spesa come ricevute e descrizioni, imposta limiti e valori
                 title: 'Regole di categoria',
                 approver: 'Approvatore',
                 requireDescription: 'Richiedi descrizione',
-                requireFields: 'Rendi obbligatori i campi',
-                requiredFieldsTitle: 'Campi obbligatori',
-                requiredFieldsDescription: (categoryName: string) => `Questo si applicherà a tutte le spese classificate come <strong>${categoryName}</strong>.`,
-                requireAttendees: 'Richiedi partecipanti',
                 descriptionHint: 'Suggerimento per la descrizione',
                 descriptionHintDescription: (categoryName: string) =>
                     `Ricorda ai dipendenti di fornire informazioni aggiuntive per la spesa in “${categoryName}”. Questo suggerimento appare nel campo descrizione sulle spese.`,
@@ -6491,6 +6456,12 @@ Richiedi dettagli di spesa come ricevute e descrizioni, imposta limiti e valori
         deleteReportField: (fieldType: string, fieldName?: string) => `campo di report ${fieldType} "${fieldName}" rimosso`,
         preventSelfApproval: ({oldValue, newValue}: UpdatedPolicyPreventSelfApprovalParams) =>
             `aggiornato "Impedisci auto-approvazione" in "${newValue === 'true' ? 'Abilitato' : 'Disabilitato'}" (precedentemente "${oldValue === 'true' ? 'Abilitato' : 'Disabilitato'}")`,
+        updateMaxExpenseAmountNoReceipt: ({oldValue, newValue}: UpdatedPolicyFieldWithNewAndOldValueParams) =>
+            `ha modificato l’importo massimo per cui è richiesta la ricevuta a ${newValue} (in precedenza ${oldValue})`,
+        updateMaxExpenseAmount: ({oldValue, newValue}: UpdatedPolicyFieldWithNewAndOldValueParams) =>
+            `ha modificato l’importo massimo della spesa per violazioni a ${newValue} (in precedenza ${oldValue})`,
+        updateMaxExpenseAge: ({oldValue, newValue}: UpdatedPolicyFieldWithNewAndOldValueParams) =>
+            `aggiornato "Età massima spesa (giorni)" a "${newValue}" (in precedenza "${oldValue === 'false' ? CONST.POLICY.DEFAULT_MAX_EXPENSE_AGE : oldValue}")`,
         updateMonthlyOffset: ({oldValue, newValue}: UpdatedPolicyFieldWithNewAndOldValueParams) => {
             if (!oldValue) {
                 return `imposta la data di invio del report mensile su "${newValue}"`;
@@ -6644,45 +6615,8 @@ Richiedi dettagli di spesa come ricevute e descrizioni, imposta limiti e valori
                 }
             }
         },
-        setDefaultBankAccount: ({bankAccountName, maskedBankAccountNumber}: {bankAccountName: string; maskedBankAccountNumber: string}) =>
-            `imposta il conto bancario aziendale predefinito su "${bankAccountName ? `${bankAccountName}: ` : ''}${maskedBankAccountNumber}"`,
-        removedDefaultBankAccount: ({bankAccountName, maskedBankAccountNumber}: {bankAccountName: string; maskedBankAccountNumber: string}) =>
-            `ha rimosso il conto bancario aziendale predefinito "${bankAccountName ? `${bankAccountName}: ` : ''}${maskedBankAccountNumber}"`,
-        changedDefaultBankAccount: ({
-            bankAccountName,
-            maskedBankAccountNumber,
-            oldBankAccountName,
-            oldMaskedBankAccountNumber,
-        }: {
-            bankAccountName: string;
-            maskedBankAccountNumber: string;
-            oldBankAccountName: string;
-            oldMaskedBankAccountNumber: string;
-        }) =>
-            `ha modificato il conto bancario aziendale predefinito in "${bankAccountName ? `${bankAccountName}: ` : ''}${maskedBankAccountNumber}" (precedentemente "${oldBankAccountName ? `${oldBankAccountName}: ` : ''}${oldMaskedBankAccountNumber}")`,
-        changedInvoiceCompanyName: ({newValue, oldValue}: {newValue: string; oldValue?: string}) =>
-            oldValue ? `ha modificato il nome dell'azienda in fattura in "${newValue}" (precedentemente "${oldValue}")` : `imposta il nome dell’azienda della fattura su "${newValue}"`,
-        changedInvoiceCompanyWebsite: ({newValue, oldValue}: {newValue: string; oldValue?: string}) =>
-            oldValue
-                ? `ha modificato il sito web dell’azienda in fattura in "${newValue}" (precedentemente "${oldValue}")`
-                : `imposta il sito web dell'azienda della fattura su "${newValue}"`,
         changedCustomReportNameFormula: ({newValue, oldValue}: UpdatedPolicyFieldWithNewAndOldValueParams) =>
             `ha modificato la formula del nome del report personalizzato in "${newValue}" (precedentemente "${oldValue}")`,
-        changedReimburser: ({newReimburser, previousReimburser}: UpdatedPolicyReimburserParams) =>
-            previousReimburser
-                ? `ha modificato il pagatore autorizzato in "${newReimburser}" (precedentemente "${previousReimburser}")`
-                : `ha cambiato il pagatore autorizzato in "${newReimburser}"`,
-        setReceiptRequiredAmount: ({newValue}: UpdatedPolicyFieldWithNewAndOldValueParams) => `imposta l'importo richiesto per la ricevuta su "${newValue}"`,
-        changedReceiptRequiredAmount: ({oldValue, newValue}: UpdatedPolicyFieldWithNewAndOldValueParams) =>
-            `ha modificato l'importo della ricevuta obbligatoria a "${newValue}" (in precedenza "${oldValue}")`,
-        removedReceiptRequiredAmount: ({oldValue}: UpdatedPolicyFieldWithNewAndOldValueParams) => `importo richiesto per la ricevuta rimosso (precedentemente "${oldValue}")`,
-        setMaxExpenseAmount: ({newValue}: UpdatedPolicyFieldWithNewAndOldValueParams) => `imposta l'importo massimo spesa su "${newValue}"`,
-        changedMaxExpenseAmount: ({oldValue, newValue}: UpdatedPolicyFieldWithNewAndOldValueParams) =>
-            `ha modificato l'importo massimo della spesa a "${newValue}" (precedentemente "${oldValue}")`,
-        removedMaxExpenseAmount: ({oldValue}: UpdatedPolicyFieldWithNewAndOldValueParams) => `importo massimo spesa rimosso (precedentemente "${oldValue}")`,
-        setMaxExpenseAge: ({newValue}: UpdatedPolicyFieldWithNewAndOldValueParams) => `imposta età massima della spesa a "${newValue}" giorni`,
-        changedMaxExpenseAge: ({oldValue, newValue}: UpdatedPolicyFieldWithNewAndOldValueParams) => `età massima della spesa cambiata a "${newValue}" giorni (in precedenza "${oldValue}")`,
-        removedMaxExpenseAge: ({oldValue}: UpdatedPolicyFieldWithNewAndOldValueParams) => `età massima spesa rimossa (precedentemente "${oldValue}" giorni)`,
     },
     roomMembersPage: {
         memberNotFound: 'Membro non trovato.',
@@ -6849,7 +6783,7 @@ Richiedi dettagli di spesa come ricevute e descrizioni, imposta limiti e valori
             amount: {
                 lessThan: ({amount}: OptionalParam<RequestAmountParams> = {}) => `Meno di ${amount ?? ''}`,
                 greaterThan: ({amount}: OptionalParam<RequestAmountParams> = {}) => `Maggiore di ${amount ?? ''}`,
-                between: (greaterThan: string, lessThan: string) => `Tra ${greaterThan} e ${lessThan}`,
+                between: ({greaterThan, lessThan}: FiltersAmountBetweenParams) => `Tra ${greaterThan} e ${lessThan}`,
                 equalTo: ({amount}: OptionalParam<RequestAmountParams> = {}) => `Uguale a ${amount ?? ''}`,
             },
             card: {
@@ -7279,7 +7213,6 @@ Richiedi dettagli di spesa come ricevute e descrizioni, imposta limiti e valori
         maxAge: ({maxAge}: ViolationsMaxAgeParams) => `Data precedente a ${maxAge} giorni`,
         missingCategory: 'Categoria mancante',
         missingComment: 'Descrizione richiesta per la categoria selezionata',
-        missingAttendees: 'Più partecipanti obbligatori per questa categoria',
         missingTag: ({tagName}: ViolationsMissingTagParams = {}) => `Manca ${tagName ?? 'etichetta'}`,
         modifiedAmount: ({type, displayPercentVariance}: ViolationsModifiedAmountParams) => {
             switch (type) {
@@ -7387,7 +7320,6 @@ Richiedi dettagli di spesa come ricevute e descrizioni, imposta limiti e valori
         hold: 'Questa spesa è stata messa in sospeso',
         resolvedDuplicates: 'ha risolto il duplicato',
         companyCardRequired: 'Acquisti con carta aziendale obbligatori',
-        noRoute: 'Seleziona un indirizzo valido',
     },
     reportViolations: {
         [CONST.REPORT_VIOLATIONS.FIELD_REQUIRED]: ({fieldName}: RequiredFieldParams) => `${fieldName} è obbligatorio`,
@@ -8010,18 +7942,9 @@ Ecco una *ricevuta di prova* per mostrarti come funziona:`,
             addAdminError: 'Impossibile aggiungere questo membro come amministratore. Riprova.',
             revokeAdminAccess: 'Revoca accesso amministratore',
             cantRevokeAdminAccess: 'Impossibile revocare i privilegi di amministratore dal referente tecnico',
-            error: {
-                removeAdmin: 'Impossibile rimuovere questo utente come amministratore. Riprova.',
-                removeDomain: 'Impossibile rimuovere questo dominio. Riprova.',
-                removeDomainNameInvalid: 'Inserisci il tuo nome di dominio per reimpostarlo.',
-            },
-            resetDomain: 'Reimposta dominio',
-            resetDomainExplanation: ({domainName}: {domainName?: string}) => `Per favore digita <strong>${domainName}</strong> per confermare il ripristino del dominio.`,
-            enterDomainName: 'Inserisci qui il tuo nome di dominio',
-            resetDomainInfo: `Questa azione è <strong>permanente</strong> e i seguenti dati verranno eliminati: <br/> <ul><li>Connessioni alle carte aziendali e tutte le spese non riportate da tali carte</li> <li>Impostazioni SAML e di gruppo</li> </ul> Tutti gli account, gli spazi di lavoro, i report, le spese e gli altri dati rimarranno. <br/><br/>Nota: puoi rimuovere questo dominio dall'elenco dei tuoi domini eliminando l'email associata dalle tue <a href="#">modalità di contatto</a>.`,
+            error: {removeAdmin: 'Impossibile rimuovere questo utente come amministratore. Riprova.'},
         },
         members: {title: 'Membri', findMember: 'Trova membro'},
-        domainAdmins: 'Amministratori di dominio',
     },
     gps: {
         tooltip: 'Monitoraggio GPS in corso! Quando hai finito, interrompi il monitoraggio qui sotto.',
@@ -8062,13 +7985,6 @@ Ecco una *ricevuta di prova* per mostrarti come funziona:`,
             subtitle: 'Registra automaticamente miglia o chilometri con il GPS e trasforma i viaggi in spese all’istante.',
             button: 'Scarica l’app',
         },
-        notification: {title: 'Tracciamento GPS in corso', body: "Vai all'app per terminare"},
-        locationServicesRequiredModal: {
-            title: 'È necessario l’accesso alla posizione',
-            confirm: 'Apri impostazioni',
-            prompt: 'Consenti l’accesso alla posizione nelle impostazioni del dispositivo per avviare il tracciamento della distanza tramite GPS.',
-        },
-        fabGpsTripExplained: 'Vai alla schermata GPS (azione flottante)',
     },
 };
 // IMPORTANT: This line is manually replaced in generate translation files by scripts/generateTranslations.ts,
diff --git a/src/languages/ja.ts b/src/languages/ja.ts
index 10ac8f278862..a633689ceb4c 100644
--- a/src/languages/ja.ts
+++ b/src/languages/ja.ts
@@ -28,6 +28,24 @@ import type {
     EditActionParams,
     ExportAgainModalDescriptionParams,
     ExportIntegrationSelectedParams,
+    FileLimitParams,
+    FileTypeParams,
+    FiltersAmountBetweenParams,
+    FlightLayoverParams,
+    FlightParams,
+    FocusModeUpdateParams,
+    FormattedMaxLengthParams,
+    GoBackMessageParams,
+    HarvestCreatedExpenseReportParams,
+    ImportedTagsMessageParams,
+    ImportedTypesParams,
+    ImportFieldParams,
+    ImportMembersSuccessfulDescriptionParams,
+    ImportPerDiemRatesSuccessfulDescriptionParams,
+    ImportTagsSuccessfulDescriptionParams,
+    IncorrectZipFormatParams,
+    IndividualExpenseRulesSubtitleParams,
+    InstantSummaryParams,
     IntacctMappingTitleParams,
     IntegrationExportParams,
     IntegrationSyncFailedParams,
@@ -115,6 +133,9 @@ import type {
     SplitDateRangeParams,
     SplitExpenseEditTitleParams,
     SplitExpenseSubtitleParams,
+    SpreadCategoriesParams,
+    SpreadFieldNameParams,
+    SpreadSheetColumnParams,
     StatementTitleParams,
     StepCounterParams,
     StripePaidParams,
@@ -164,7 +185,6 @@ import type {
     UpdatedPolicyManualApprovalThresholdParams,
     UpdatedPolicyPreventSelfApprovalParams,
     UpdatedPolicyReimbursementEnabledParams,
-    UpdatedPolicyReimburserParams,
     UpdatedPolicyReportFieldDefaultValueParams,
     UpdatedPolicyTagFieldParams,
     UpdatedPolicyTagNameParams,
@@ -259,6 +279,7 @@ const translations: TranslationDeepObject<typeof en> = {
         searchWithThreeDots: '検索...',
         next: '次へ',
         previous: '前へ',
+        // @context Navigation button that returns the user to the previous screen. Should be interpreted as a UI action label.
         goBack: '戻る',
         create: '作成',
         add: '追加',
@@ -276,7 +297,6 @@ const translations: TranslationDeepObject<typeof en> = {
         zoom: 'Zoom',
         password: 'パスワード',
         magicCode: 'マジックコード',
-        digits: '桁',
         twoFactorCode: '2要素コード',
         workspaces: 'ワークスペース',
         inbox: '受信トレイ',
@@ -533,6 +553,10 @@ const translations: TranslationDeepObject<typeof en> = {
         value: '値',
         downloadFailedTitle: 'ダウンロードに失敗しました',
         downloadFailedDescription: 'ダウンロードを完了できませんでした。後でもう一度お試しください。',
+        downloadFailedEmptyReportDescription: () => ({
+            one: '空のレポートはエクスポートできません。',
+            other: () => '空のレポートはエクスポートできません。',
+        }),
         filterLogs: 'ログをフィルター',
         network: 'ネットワーク',
         reportID: 'レポート ID',
@@ -627,6 +651,7 @@ const translations: TranslationDeepObject<typeof en> = {
         copyToClipboard: 'クリップボードにコピー',
         thisIsTakingLongerThanExpected: '予想より時間がかかっています…',
         domains: 'ドメイン',
+        viewReport: 'レポートを表示',
         actionRequired: '対応が必要',
         duplicate: '複製',
         duplicated: '重複',
@@ -687,12 +712,12 @@ const translations: TranslationDeepObject<typeof en> = {
         protectedPDFNotSupported: 'パスワードで保護されたPDFはサポートされていません',
         attachmentImageResized: 'この画像はプレビュー用にサイズが変更されています。フル解像度で表示するにはダウンロードしてください。',
         attachmentImageTooLarge: 'この画像はアップロード前にプレビューするには大きすぎます。',
-        tooManyFiles: (fileLimit: number) => `一度にアップロードできるファイルは${fileLimit}件までです。`,
+        tooManyFiles: ({fileLimit}: FileLimitParams) => `一度にアップロードできるファイルは${fileLimit}件までです。`,
         sizeExceededWithValue: ({maxUploadSizeInMB}: SizeExceededParams) => `ファイルが ${maxUploadSizeInMB} MB を超えています。もう一度お試しください。`,
         someFilesCantBeUploaded: '一部のファイルはアップロードできません',
         sizeLimitExceeded: ({maxUploadSizeInMB}: SizeExceededParams) => `ファイルは${maxUploadSizeInMB}MB未満である必要があります。これより大きいファイルはアップロードされません。`,
         maxFileLimitExceeded: '一度にアップロードできる領収書は最大30枚です。それを超えた分はアップロードされません。',
-        unsupportedFileType: (fileType: string) => `${fileType} ファイルはサポートされていません。サポートされているファイル形式のみアップロードされます。`,
+        unsupportedFileType: ({fileType}: FileTypeParams) => `${fileType} ファイルはサポートされていません。サポートされているファイル形式のみアップロードされます。`,
         learnMoreAboutSupportedFiles: 'サポートされている形式の詳細はこちらをご覧ください。',
         passwordProtected: 'パスワード保護されたPDFはサポートされていません。サポートされているファイルのみがアップロードされます。',
     },
@@ -717,8 +742,8 @@ const translations: TranslationDeepObject<typeof en> = {
     composer: {
         noExtensionFoundForMimeType: 'この MIME タイプに対応する拡張子が見つかりません',
         problemGettingImageYouPasted: '貼り付けた画像の取得中に問題が発生しました',
-        commentExceededMaxLength: (formattedMaxLength: string) => `コメントの最大文字数は${formattedMaxLength}文字です。`,
-        taskTitleExceededMaxLength: (formattedMaxLength: string) => `タスクタイトルの最大長は${formattedMaxLength}文字です。`,
+        commentExceededMaxLength: ({formattedMaxLength}: FormattedMaxLengthParams) => `コメントの最大文字数は${formattedMaxLength}文字です。`,
+        taskTitleExceededMaxLength: ({formattedMaxLength}: FormattedMaxLengthParams) => `タスクタイトルの最大長は${formattedMaxLength}文字です。`,
     },
     baseUpdateAppModal: {
         updateApp: 'アプリを更新',
@@ -729,35 +754,6 @@ const translations: TranslationDeepObject<typeof en> = {
         expired: 'セッションの有効期限が切れました。',
         signIn: 'もう一度サインインしてください。',
     },
-    multifactorAuthentication: {
-        biometricsTest: {
-            biometricsTest: '生体認証テスト',
-            authenticationSuccessful: '認証成功',
-            successfullyAuthenticatedUsing: ({authType}) => `${authType}を使用して正常に認証されました。`,
-            troubleshootBiometricsStatus: ({registered}) => `生体認証（${registered ? '登録済み' : '未登録'}）`,
-            yourAttemptWasUnsuccessful: '認証試みが失敗しました。',
-            youCouldNotBeAuthenticated: '認証できませんでした',
-            areYouSureToReject: '本当に拒否しますか？この画面を閉じると認証試みが拒否されます。',
-            rejectAuthentication: '認証拒否',
-            test: 'テスト',
-            biometricsAuthentication: '生体認証',
-        },
-        pleaseEnableInSystemSettings: {
-            start: '',
-            link: 'システム設定',
-            end: 'で顔/指紋認証を有効にするか、デバイスのパスコードを設定してください。',
-        },
-        oops: 'おっと、何か問題が発生しました',
-        looksLikeYouRanOutOfTime: '時間切れのようです！ 商人で再試行してください。',
-        youRanOutOfTime: '時間切れでした',
-        letsVerifyItsYou: '本人確認をしましょう',
-        verifyYourself: {
-            biometrics: '顔または指紋で本人確認をしてください',
-        },
-        enableQuickVerification: {
-            biometrics: '顔または指紋を使用して、パスワードやコード不要の迅速かつ安全な認証を有効にしてください。',
-        },
-    },
     validateCodeModal: {
         successfulSignInTitle: dedent(`
             アブラカダブラ、
@@ -926,7 +922,7 @@ const translations: TranslationDeepObject<typeof en> = {
     adminOnlyCanPost: 'このルームでメッセージを送信できるのは管理者のみです。',
     reportAction: {
         asCopilot: 'のコパイロットとして',
-        harvestCreatedExpenseReport: (reportUrl: string, reportName: string) =>
+        harvestCreatedExpenseReport: ({reportUrl, reportName}: HarvestCreatedExpenseReportParams) =>
             `選択した頻度では提出できなかった <a href="${reportUrl}">${reportName}</a> のすべての経費をまとめるためにこのレポートを作成しました`,
         createdReportForUnapprovedTransactions: ({reportUrl, reportName}: CreatedReportForUnapprovedTransactionsParams) =>
             `<a href="${reportUrl}">${reportName}</a> から保留中の経費のためにこのレポートを作成しました`,
@@ -969,7 +965,7 @@ const translations: TranslationDeepObject<typeof en> = {
         buttonFind: '何かを検索…',
         buttonMySettings: 'マイ設定',
         fabNewChat: 'チャットを開始',
-        fabNewChatExplained: 'アクションメニューを開く',
+        fabNewChatExplained: 'チャットを開始 (フローティングアクション)',
         fabScanReceiptExplained: '領収書をスキャン',
         chatPinned: 'ピン留めされたチャット',
         draftedMessage: '下書きメッセージ',
@@ -995,13 +991,14 @@ const translations: TranslationDeepObject<typeof en> = {
         chooseSpreadsheet: '<muted-link>インポートするスプレッドシートファイルを選択してください。対応形式：.csv、.txt、.xls、.xlsx。</muted-link>',
         chooseSpreadsheetMultiLevelTag: `<muted-link>インポートするスプレッドシートファイルを選択してください。サポートされているファイル形式の詳細は、<a href="${CONST.IMPORT_SPREADSHEET.MULTI_LEVEL_TAGS_ARTICLE_LINK}">こちら</a>をご覧ください。</muted-link>`,
         fileContainsHeader: 'ファイルには列ヘッダーが含まれています',
-        column: (name: string) => `列 ${name}`,
-        fieldNotMapped: (fieldName: string) => `おっと！必須フィールド（「${fieldName}」）がマッピングされていません。確認して、もう一度お試しください。`,
-        singleFieldMultipleColumns: (fieldName: string) => `おっと！1 つのフィールド（「${fieldName}」）が複数の列に割り当てられています。内容を確認して、もう一度お試しください。`,
-        emptyMappedField: (fieldName: string) => `おっと！フィールド（「${fieldName}」）に 1 つ以上の空の値が含まれています。確認して、もう一度お試しください。`,
+        column: ({name}: SpreadSheetColumnParams) => `列 ${name}`,
+        fieldNotMapped: ({fieldName}: SpreadFieldNameParams) => `おっと！必須フィールド（「${fieldName}」）がマッピングされていません。確認して、もう一度お試しください。`,
+        singleFieldMultipleColumns: ({fieldName}: SpreadFieldNameParams) =>
+            `おっと！1 つのフィールド（「${fieldName}」）が複数の列に割り当てられています。内容を確認して、もう一度お試しください。`,
+        emptyMappedField: ({fieldName}: SpreadFieldNameParams) => `おっと！フィールド（「${fieldName}」）に 1 つ以上の空の値が含まれています。確認して、もう一度お試しください。`,
         importSuccessfulTitle: 'インポートに成功しました',
-        importCategoriesSuccessfulDescription: ({categories}: {categories: number}) => (categories > 1 ? `${categories}件のカテゴリーが追加されました。` : 'カテゴリを1件追加しました。'),
-        importMembersSuccessfulDescription: ({added, updated}: {added: number; updated: number}) => {
+        importCategoriesSuccessfulDescription: ({categories}: SpreadCategoriesParams) => (categories > 1 ? `${categories}件のカテゴリーが追加されました。` : 'カテゴリを1件追加しました。'),
+        importMembersSuccessfulDescription: ({added, updated}: ImportMembersSuccessfulDescriptionParams) => {
             if (!added && !updated) {
                 return 'メンバーは追加または更新されていません。';
             }
@@ -1013,9 +1010,10 @@ const translations: TranslationDeepObject<typeof en> = {
             }
             return added > 1 ? `${added} 名のメンバーが追加されました。` : '1名のメンバーが追加されました。';
         },
-        importTagsSuccessfulDescription: ({tags}: {tags: number}) => (tags > 1 ? `${tags} 個のタグを追加しました。` : 'タグが 1 件追加されました。'),
+        importTagsSuccessfulDescription: ({tags}: ImportTagsSuccessfulDescriptionParams) => (tags > 1 ? `${tags} 個のタグを追加しました。` : 'タグが 1 件追加されました。'),
         importMultiLevelTagsSuccessfulDescription: 'マルチレベルタグが追加されました。',
-        importPerDiemRatesSuccessfulDescription: ({rates}: {rates: number}) => (rates > 1 ? `${rates}件の日当レートが追加されました。` : '1件の日当レートが追加されました。'),
+        importPerDiemRatesSuccessfulDescription: ({rates}: ImportPerDiemRatesSuccessfulDescriptionParams) =>
+            rates > 1 ? `${rates}件の日当レートが追加されました。` : '1件の日当レートが追加されました。',
         importFailedTitle: 'インポートに失敗しました',
         importFailedDescription: 'すべての項目が正しく入力されていることを確認して、もう一度お試しください。問題が解決しない場合は、Concierge までお問い合わせください。',
         importDescription: '下のインポートされた各列の横にあるドロップダウンをクリックして、スプレッドシートからマッピングするフィールドを選択してください。',
@@ -1196,8 +1194,14 @@ const translations: TranslationDeepObject<typeof en> = {
             one: 'この経費を削除してもよろしいですか？',
             other: 'これらの経費を削除してもよろしいですか？',
         }),
-        deleteReport: 'レポートを削除',
-        deleteReportConfirmation: 'このレポートを削除してもよろしいですか？',
+        deleteReport: () => ({
+            one: 'レポートを削除',
+            other: 'レポートを削除',
+        }),
+        deleteReportConfirmation: () => ({
+            one: 'このレポートを削除してもよろしいですか？',
+            other: 'これらのレポートを削除してもよろしいですか？',
+        }),
         settledExpensify: '支払済み',
         done: '完了',
         settledElsewhere: '他で支払済み',
@@ -1446,8 +1450,9 @@ const translations: TranslationDeepObject<typeof en> = {
         moveExpensesError: '日当経費は他のワークスペースのレポートに移動できません。ワークスペース間で日当レートが異なる可能性があるためです。',
         changeApprover: {
             title: '承認者を変更',
-            header: ({workflowSettingLink}: WorkflowSettingsParam) =>
-                `このレポートの承認者を変更するには、オプションを選択してください。（すべてのレポートに対して恒久的に変更するには、<a href="${workflowSettingLink}">ワークスペース設定</a>を更新してください。）`,
+            subtitle: 'このレポートの承認者を変更する方法を選択してください。',
+            description: ({workflowSettingLink}: WorkflowSettingsParam) =>
+                `すべてのレポートの承認者を恒久的に変更するには、<a href="${workflowSettingLink}">ワークフロー設定</a>から行うこともできます。`,
             changedApproverMessage: (managerID: number) => `承認者を <mention-user accountID="${managerID}"/> に変更しました`,
             actions: {
                 addApprover: '承認者を追加',
@@ -1465,13 +1470,7 @@ const translations: TranslationDeepObject<typeof en> = {
         splitDateRange: ({startDate, endDate, count}: SplitDateRangeParams) => `${startDate} から ${endDate} まで（${count} 日間）`,
         splitByDate: '日付で分割',
         routedDueToDEW: ({to}: RoutedDueToDEWParams) => `カスタム承認ワークフローにより、${to} 宛にルーティングされたレポート`,
-        timeTracking: {
-            hoursAt: (hours: number, rate: string) => `${hours}  ${hours === 1 ? '時間' : '時間'} @ ${rate} / 時間`,
-            hrs: '時間',
-            hours: '時間',
-            ratePreview: (rate: string) => `${rate} / 時間`,
-            amountTooLargeError: '合計金額が大きすぎます。時間を減らすか、レートを下げてください。',
-        },
+        timeTracking: {hoursAt: (hours: number, rate: string) => `${hours} ${hours === 1 ? '時間' : '時間'} @ ${rate} / 時間`, hrs: '時間'},
     },
     transactionMerge: {
         listPage: {
@@ -1949,6 +1948,13 @@ const translations: TranslationDeepObject<typeof en> = {
         chatToConciergeToUnlock: 'セキュリティ上の懸念を解決し、アカウントのロックを解除するためにConciergeとチャットしましょう。',
         chatWithConcierge: 'Conciergeとチャット',
     },
+    passwordPage: {
+        changePassword: 'パスワードを変更',
+        changingYourPasswordPrompt: 'パスワードを変更すると、Expensify.com アカウントと New Expensify アカウントの両方のパスワードが更新されます。',
+        currentPassword: '現在のパスワード',
+        newPassword: '新しいパスワード',
+        newPasswordPrompt: '新しいパスワードは、以前のパスワードと異なるものであり、8文字以上で、少なくとも1つの大文字、1つの小文字、1つの数字を含める必要があります。',
+    },
     twoFactorAuth: {
         headerTitle: '二要素認証',
         twoFactorAuthEnabled: '2 要素認証が有効になりました',
@@ -2339,7 +2345,7 @@ ${merchant} への ${amount}（${date}）`,
     transferAmountPage: {
         transfer: ({amount}: TransferParams) => `振替${amount ? ` ${amount}` : ''}`,
         instant: '即時（デビットカード）',
-        instantSummary: (rate: string, minAmount: string) => `${rate}% の手数料（最低 ${minAmount}）`,
+        instantSummary: ({rate, minAmount}: InstantSummaryParams) => `${rate}% の手数料（最低 ${minAmount}）`,
         ach: '1～3 営業日（銀行口座）',
         achSummary: '手数料なし',
         whichAccount: 'どのアカウントですか？',
@@ -2375,31 +2381,10 @@ ${merchant} への ${amount}（${date}）`,
             comment: (value: string) => `説明を「${value}」に変更`,
             merchant: (value: string) => `支払先を「${value}」に更新`,
             reimbursable: (value: boolean) => `経費 ${value ? '精算対象' : '非精算'} を更新`,
-            report: (value: string) => `"${value}" という名前のレポートに追加`,
+            report: (value: string) => `レポート名を「${value}」として追加`,
             tag: (value: string) => `タグを「${value}」に更新`,
             tax: (value: string) => `税率を${value}に更新`,
         },
-        newRule: '新しいルール',
-        addRule: {
-            title: 'ルールを追加',
-            expenseContains: '経費に以下が含まれる場合:',
-            applyUpdates: '次に、これらの更新を適用します。',
-            merchantHint: 'すべての加盟店に適用されるルールを作成するには * を入力してください',
-            addToReport: '「…という名前のレポートに追加」',
-            createReport: '必要に応じてレポートを作成',
-            applyToExistingExpenses: '既存の一致する経費に適用',
-            confirmError: '店舗名を入力し、少なくとも 1 つの更新を適用してください',
-            confirmErrorMerchant: '支払先を入力してください',
-            confirmErrorUpdate: '少なくとも 1 件の更新を適用してください',
-            saveRule: 'ルールを保存',
-        },
-        editRule: {title: 'ルールを編集'},
-        deleteRule: {
-            deleteSingle: 'ルールを削除',
-            deleteMultiple: 'ルールを削除',
-            deleteSinglePrompt: 'このルールを削除してもよろしいですか？',
-            deleteMultiplePrompt: 'これらのルールを本当に削除しますか？',
-        },
     },
     preferencesPage: {
         appSection: {
@@ -2895,7 +2880,7 @@ ${
             dateShouldBeBefore: (dateString: string) => `日付は${dateString}より前でなければなりません`,
             dateShouldBeAfter: (dateString: string) => `日付は${dateString}より後である必要があります`,
             hasInvalidCharacter: '名前にはラテン文字のみ使用できます',
-            incorrectZipFormat: (zipFormat?: string) => `郵便番号の形式が正しくありません${zipFormat ? `許容される形式：${zipFormat}` : ''}`,
+            incorrectZipFormat: ({zipFormat}: IncorrectZipFormatParams = {}) => `郵便番号の形式が正しくありません${zipFormat ? `許容される形式：${zipFormat}` : ''}`,
             invalidPhoneNumber: `電話番号が有効であることを確認してください（例：${CONST.EXAMPLE_PHONE_NUMBER}）`,
         },
     },
@@ -2978,7 +2963,7 @@ ${
     },
     focusModeUpdateModal: {
         title: '#focus モードへようこそ！',
-        prompt: (priorityModePageUrl: string) =>
+        prompt: ({priorityModePageUrl}: FocusModeUpdateParams) =>
             `未読のチャットや、対応が必要なチャットだけを表示して、常に状況を把握しましょう。心配はいりません。これはいつでも<a href="${priorityModePageUrl}">設定</a>で変更できます。`,
     },
     notFound: {
@@ -2998,6 +2983,15 @@ ${
         subtitle: 'リクエストを完了できませんでした。時間をおいて、もう一度お試しください。',
         wrongTypeSubtitle: 'その検索条件は無効です。検索条件を調整してやり直してください。',
     },
+    setPasswordPage: {
+        enterPassword: 'パスワードを入力してください',
+        setPassword: 'パスワードを設定',
+        newPasswordPrompt: 'パスワードは8文字以上で、大文字1文字、小文字1文字、数字1文字を含める必要があります。',
+        passwordFormTitle: '新しい Expensify へお帰りなさい！パスワードを設定してください。',
+        passwordNotSet: '新しいパスワードを設定できませんでした。再試行用の新しいパスワードリンクを送信しました。',
+        setPasswordLinkInvalid: 'このパスワード設定リンクは無効か、有効期限が切れています。新しいリンクをメール受信箱にお送りしました。',
+        validateAccount: 'アカウントを確認',
+    },
     statusPage: {
         status: 'ステータス',
         statusExplanation: '絵文字を追加して、同僚や友だちが状況をひと目で分かるようにしましょう。必要に応じてメッセージを追加することもできます。',
@@ -3138,13 +3132,10 @@ ${
         errorMessageInvalidPhone: `かっこやハイフンを使わずに有効な電話番号を入力してください。米国外にいる場合は、国コードを含めて入力してください（例：${CONST.EXAMPLE_PHONE_NUMBER}）。`,
         errorMessageInvalidEmail: '無効なメールアドレス',
         userIsAlreadyMember: ({login, name}: UserIsAlreadyMemberParams) => `${login} はすでに ${name} のメンバーです`,
-        userIsAlreadyAnAdmin: ({login, name}: UserIsAlreadyMemberParams) => `${login} はすでに ${name} の管理者です`,
     },
     onfidoStep: {
         acceptTerms: 'Expensifyウォレットの有効化リクエストを続行することにより、あなたは次の内容を読み、理解し、承諾したことを確認します',
         facialScan: 'Onfido 顔認証ポリシーおよび同意書',
-        onfidoLinks: (onfidoTitle: string) =>
-            `<muted-text-micro>${onfidoTitle} <a href='${CONST.ONFIDO_FACIAL_SCAN_POLICY_URL}'>Onfido 顔認証ポリシーおよび同意書</a>、<a href='${CONST.ONFIDO_PRIVACY_POLICY_URL}'>プライバシー</a> と <a href='${CONST.ONFIDO_TERMS_OF_SERVICE_URL}'>利用規約</a>。</muted-text-micro>`,
         tryAgain: '再試行',
         verifyIdentity: '本人確認',
         letsVerifyIdentity: '本人確認を行いましょう',
@@ -3640,7 +3631,7 @@ ${
         flight: 'フライト',
         flightDetails: {
             passenger: '乗客',
-            layover: (layover: string) => `<muted-text-label>このフライトの前に<strong>${layover} の乗り継ぎ時間</strong>があります</muted-text-label>`,
+            layover: ({layover}: FlightLayoverParams) => `<muted-text-label>このフライトの前に<strong>${layover} の乗り継ぎ時間</strong>があります</muted-text-label>`,
             takeOff: '離陸',
             landing: 'ランディング',
             seat: '席',
@@ -3730,18 +3721,17 @@ ${
             conciergeMessage: ({domain}: {domain: string}) => `ドメイン ${domain} の出張機能の有効化に失敗しました。このドメインの出張機能を確認して有効にしてください。`,
         },
         updates: {
-            bookingTicketed: (airlineCode: string, origin: string, destination: string, startDate: string, confirmationID = '') =>
+            bookingTicketed: ({airlineCode, origin, destination, startDate, confirmationID = ''}: FlightParams) =>
                 `${startDate} のフライト ${airlineCode}（${origin} → ${destination}）が予約されました。確認コード：${confirmationID}`,
-            ticketVoided: (airlineCode: string, origin: string, destination: string, startDate: string) =>
+            ticketVoided: ({airlineCode, origin, destination, startDate}: FlightParams) =>
                 `${startDate} のフライト ${airlineCode}（${origin} → ${destination}）のチケットは無効になりました。`,
-            ticketRefunded: (airlineCode: string, origin: string, destination: string, startDate: string) =>
+            ticketRefunded: ({airlineCode, origin, destination, startDate}: FlightParams) =>
                 `${startDate} のフライト ${airlineCode}（${origin} → ${destination}）の航空券は、払い戻しまたは変更されています。`,
-            flightCancelled: (airlineCode: string, origin: string, destination: string, startDate: string) =>
+            flightCancelled: ({airlineCode, origin, destination, startDate}: FlightParams) =>
                 `${startDate}} のフライト ${airlineCode}（${origin} → ${destination}）は、航空会社によりキャンセルされました。`,
             flightScheduleChangePending: (airlineCode: string) => `航空会社が便名 ${airlineCode} のスケジュール変更を提案しており、現在確認待ちです。`,
             flightScheduleChangeClosed: (airlineCode: string, startDate?: string) => `スケジュール変更が確認されました：フライト ${airlineCode} の出発時刻は ${startDate} になりました。`,
-            flightUpdated: (airlineCode: string, origin: string, destination: string, startDate: string) =>
-                `${startDate} のフライト ${airlineCode}（${origin} → ${destination}）が更新されました。`,
+            flightUpdated: ({airlineCode, origin, destination, startDate}: FlightParams) => `${startDate} のフライト ${airlineCode}（${origin} → ${destination}）が更新されました。`,
             flightCabinChanged: (airlineCode: string, cabinClass?: string) => `ご搭乗クラスは、${airlineCode} 便で ${cabinClass} に更新されました。`,
             flightSeatConfirmed: (airlineCode: string) => `${airlineCode}便の座席指定が確定しました。`,
             flightSeatChanged: (airlineCode: string) => `ご搭乗便 ${airlineCode} の座席指定が変更されました。`,
@@ -4543,7 +4533,7 @@ ${
                 importTaxDescription: 'NetSuite から税グループをインポートします。',
                 importCustomFields: {
                     chooseOptionBelow: '以下からオプションを選択してください：',
-                    label: (importedTypes: string[]) => `${importedTypes.join('と')} としてインポートされました`,
+                    label: ({importedTypes}: ImportedTypesParams) => `${importedTypes.join('と')} としてインポートされました`,
                     requiredFieldError: ({fieldName}: RequiredFieldParams) => `${fieldName}を入力してください`,
                     customSegments: {
                         title: 'カスタムセグメント／レコード',
@@ -4658,18 +4648,18 @@ _より詳しい手順については、[ヘルプサイトをご覧ください
                     [CONST.INTEGRATION_ENTITY_MAP_TYPES.NETSUITE_DEFAULT]: {
                         label: 'NetSuite 従業員のデフォルト',
                         description: 'Expensify にインポートされず、エクスポート時に適用されます',
-                        footerContent: (importField: string) =>
+                        footerContent: ({importField}: ImportFieldParams) =>
                             `NetSuite で ${importField} を使用する場合、Expense Report または Journal Entry へエクスポートする際に、従業員レコードに設定されているデフォルトを適用します。`,
                     },
                     [CONST.INTEGRATION_ENTITY_MAP_TYPES.TAG]: {
                         label: 'タグ',
                         description: '明細行レベル',
-                        footerContent: (importField: string) => `${startCase(importField)} は、従業員のレポート上の各経費ごとに個別に選択できるようになります。`,
+                        footerContent: ({importField}: ImportFieldParams) => `${startCase(importField)} は、従業員のレポート上の各経費ごとに個別に選択できるようになります。`,
                     },
                     [CONST.INTEGRATION_ENTITY_MAP_TYPES.REPORT_FIELD]: {
                         label: 'レポート項目',
                         description: 'レポートレベル',
-                        footerContent: (importField: string) => `${startCase(importField)} の選択は、従業員のレポート上のすべての経費に適用されます。`,
+                        footerContent: ({importField}: ImportFieldParams) => `${startCase(importField)} の選択は、従業員のレポート上のすべての経費に適用されます。`,
                     },
                 },
             },
@@ -4746,7 +4736,7 @@ _より詳しい手順については、[ヘルプサイトをご覧ください
                 commercialFeedPlaidDetails: `銀行での設定が必要ですが、設定手順はご案内します。通常は大企業に限られます。`,
                 directFeedDetails: '最も簡単な方法です。マスター認証情報を使用して、すぐに接続します。この方法が最も一般的です。',
                 enableFeed: {
-                    title: (provider: string) => `${provider} フィードを有効にする`,
+                    title: ({provider}: GoBackMessageParams) => `${provider} フィードを有効にする`,
                     heading: 'お使いのカード発行会社と直接連携しており、取引データを迅速かつ正確に Expensify に取り込むことができます。\n\n開始するには、次の手順に従ってください。',
                     visa: '私たちはVisaとグローバル連携していますが、対象となるかどうかは銀行やカードプログラムによって異なります。\n\nご利用を開始するには、次のステップに従ってください。',
                     mastercard:
@@ -5018,25 +5008,6 @@ _より詳しい手順については、[ヘルプサイトをご覧ください
                     subtitle: 'Expensify Travelを使用して最高の旅行オファーを取得し、すべてのビジネス経費を一箇所で管理します。',
                     ctaText: '予約または管理',
                 },
-                travelInvoicing: {
-                    travelBookingSection: {
-                        title: '出張予約',
-                        subtitle: 'おめでとうございます！このワークスペースで旅行の予約と管理を行う準備が整いました。',
-                        manageTravelLabel: '出張を管理',
-                    },
-                    centralInvoicingSection: {
-                        title: '中央請求書管理',
-                        subtitle: 'すべての出張費を購入時に都度支払うのではなく、月次請求書にまとめて管理しましょう。',
-                        learnHow: '詳しく見る。',
-                        subsections: {
-                            currentTravelSpendLabel: '現在の出張費用',
-                            currentTravelSpendCta: '残高を支払う',
-                            currentTravelLimitLabel: '現在の出張上限',
-                            settlementAccountLabel: '決済口座',
-                            settlementFrequencyLabel: '清算頻度',
-                        },
-                    },
-                },
             },
             expensifyCard: {
                 title: 'Expensify Card',
@@ -5321,7 +5292,7 @@ _より詳しい手順については、[ヘルプサイトをご覧ください
                 prompt3: 'バックアップをダウンロード',
                 prompt4: '最初。',
             },
-            importedTagsMessage: (columnCounts: number) =>
+            importedTagsMessage: ({columnCounts}: ImportedTagsMessageParams) =>
                 `スプレッドシート内に *${columnCounts} 列* 見つかりました。タグ名が含まれている列の横で *Name* を選択してください。タグのステータスを設定する列の横で *Enabled* を選択することもできます。`,
             cannotDeleteOrDisableAllTags: {
                 title: 'すべてのタグを削除または無効にすることはできません',
@@ -5491,8 +5462,7 @@ _より詳しい手順については、[ヘルプサイトをご覧ください
                 giveItNameInstruction: '他のカードと見分けがつくように、十分ユニークな名前にしてください。具体的な使用例が入っていると、なお良いです！',
                 cardName: 'カード名',
                 letsDoubleCheck: 'すべてが正しく見えるか、もう一度確認しましょう。',
-                willBeReadyToUse: 'このカードはすぐに利用できるようになります。',
-                willBeReadyToShip: 'このカードはすぐに発送できる状態になります。',
+                willBeReady: 'このカードはすぐに利用できるようになります。',
                 cardholder: 'カード保有者',
                 cardType: 'カードの種類',
                 limit: '制限',
@@ -6140,7 +6110,7 @@ ${reportName}
         rules: {
             individualExpenseRules: {
                 title: '経費',
-                subtitle: (categoriesPageLink: string, tagsPageLink: string) =>
+                subtitle: ({categoriesPageLink, tagsPageLink}: IndividualExpenseRulesSubtitleParams) =>
                     `<muted-text>個々の経費に対して支出コントロールとデフォルトを設定します。<a href="${categoriesPageLink}">カテゴリ</a>や<a href="${tagsPageLink}">タグ</a>のルールを作成することもできます。</muted-text>`,
                 receiptRequiredAmount: '領収書が必要な金額',
                 receiptRequiredAmountDescription: 'カテゴリルールで上書きされない限り、支出がこの金額を超えた場合に領収書を必須にする。',
@@ -6211,10 +6181,6 @@ ${reportName}
                 title: 'カテゴリルール',
                 approver: '承認者',
                 requireDescription: '説明を必須にする',
-                requireFields: 'フィールドを必須にする',
-                requiredFieldsTitle: '必須項目',
-                requiredFieldsDescription: (categoryName: string) => `これは<strong>${categoryName}</strong>として分類されたすべての経費に適用されます。`,
-                requireAttendees: '参加者の入力を必須にする',
                 descriptionHint: '説明のヒント',
                 descriptionHintDescription: (categoryName: string) => `従業員に「${categoryName}」での支出について追加情報を提供するよう促します。このヒントは経費の説明欄に表示されます。`,
                 descriptionHintLabel: 'ヒント',
@@ -6445,6 +6411,10 @@ ${reportName}
         deleteReportField: (fieldType: string, fieldName?: string) => `${fieldType} レポートフィールド「${fieldName}」を削除しました`,
         preventSelfApproval: ({oldValue, newValue}: UpdatedPolicyPreventSelfApprovalParams) =>
             `「自分自身での承認を防ぐ」を「${newValue === 'true' ? '有効' : '無効'}」（以前は「${oldValue === 'true' ? '有効' : '無効'}」）に更新しました`,
+        updateMaxExpenseAmountNoReceipt: ({oldValue, newValue}: UpdatedPolicyFieldWithNewAndOldValueParams) => `最大領収書必須経費金額を${newValue}に変更しました（以前は${oldValue}）`,
+        updateMaxExpenseAmount: ({oldValue, newValue}: UpdatedPolicyFieldWithNewAndOldValueParams) => `違反となる経費の上限金額を${newValue}（以前は${oldValue}）に変更しました`,
+        updateMaxExpenseAge: ({oldValue, newValue}: UpdatedPolicyFieldWithNewAndOldValueParams) =>
+            `「最大経費期間（日数）」を「${newValue}」（以前は「${oldValue === 'false' ? CONST.POLICY.DEFAULT_MAX_EXPENSE_AGE : oldValue}」）に更新しました`,
         updateMonthlyOffset: ({oldValue, newValue}: UpdatedPolicyFieldWithNewAndOldValueParams) => {
             if (!oldValue) {
                 return `月次レポートの提出日を「${newValue}」に設定してください`;
@@ -6592,39 +6562,8 @@ ${reportName}
                 }
             }
         },
-        setDefaultBankAccount: ({bankAccountName, maskedBankAccountNumber}: {bankAccountName: string; maskedBankAccountNumber: string}) =>
-            `デフォルトのビジネス銀行口座を「${bankAccountName ? `${bankAccountName}: ` : ''}${maskedBankAccountNumber}」に設定`,
-        removedDefaultBankAccount: ({bankAccountName, maskedBankAccountNumber}: {bankAccountName: string; maskedBankAccountNumber: string}) =>
-            `デフォルトのビジネス銀行口座「${bankAccountName ? `${bankAccountName}: ` : ''}${maskedBankAccountNumber}」を削除しました`,
-        changedDefaultBankAccount: ({
-            bankAccountName,
-            maskedBankAccountNumber,
-            oldBankAccountName,
-            oldMaskedBankAccountNumber,
-        }: {
-            bankAccountName: string;
-            maskedBankAccountNumber: string;
-            oldBankAccountName: string;
-            oldMaskedBankAccountNumber: string;
-        }) =>
-            `デフォルトのビジネス銀行口座を「${bankAccountName ? `${bankAccountName}: ` : ''}${maskedBankAccountNumber}」（以前は「${oldBankAccountName ? `${oldBankAccountName}: ` : ''}${oldMaskedBankAccountNumber}」）に変更しました`,
-        changedInvoiceCompanyName: ({newValue, oldValue}: {newValue: string; oldValue?: string}) =>
-            oldValue ? `請求書の会社名を「${newValue}」（以前は「${oldValue}」）に変更しました` : `請求書の会社名を「${newValue}」に設定する`,
-        changedInvoiceCompanyWebsite: ({newValue, oldValue}: {newValue: string; oldValue?: string}) =>
-            oldValue ? `請求書会社のウェブサイトを「${newValue}」（以前は「${oldValue}」）に変更しました` : `請求書の会社ウェブサイトを「${newValue}」に設定`,
         changedCustomReportNameFormula: ({newValue, oldValue}: UpdatedPolicyFieldWithNewAndOldValueParams) =>
             `カスタムレポート名の数式を「${newValue}」（以前は「${oldValue}」）に変更しました`,
-        changedReimburser: ({newReimburser, previousReimburser}: UpdatedPolicyReimburserParams) =>
-            previousReimburser ? `認可された支払者を「${newReimburser}」（以前は「${previousReimburser}」）に変更しました` : `承認済み支払者を「${newReimburser}」に変更しました`,
-        setReceiptRequiredAmount: ({newValue}: UpdatedPolicyFieldWithNewAndOldValueParams) => `領収書が必要な金額を「${newValue}」に設定`,
-        changedReceiptRequiredAmount: ({oldValue, newValue}: UpdatedPolicyFieldWithNewAndOldValueParams) => `領収書の必須金額を「${newValue}」（以前は「${oldValue}」）に変更しました`,
-        removedReceiptRequiredAmount: ({oldValue}: UpdatedPolicyFieldWithNewAndOldValueParams) => `必須領収書金額を削除しました（以前の値：「${oldValue}」）`,
-        setMaxExpenseAmount: ({newValue}: UpdatedPolicyFieldWithNewAndOldValueParams) => `最大経費金額を「${newValue}」に設定`,
-        changedMaxExpenseAmount: ({oldValue, newValue}: UpdatedPolicyFieldWithNewAndOldValueParams) => `最大経費額を「${newValue}」（以前は「${oldValue}」）に変更しました`,
-        removedMaxExpenseAmount: ({oldValue}: UpdatedPolicyFieldWithNewAndOldValueParams) => `最大経費額を削除しました（以前の値：「${oldValue}」）`,
-        setMaxExpenseAge: ({newValue}: UpdatedPolicyFieldWithNewAndOldValueParams) => `最大経費日数を「${newValue}」日に設定`,
-        changedMaxExpenseAge: ({oldValue, newValue}: UpdatedPolicyFieldWithNewAndOldValueParams) => `最大経費期限を「${newValue}」日に変更しました（以前は「${oldValue}」日）`,
-        removedMaxExpenseAge: ({oldValue}: UpdatedPolicyFieldWithNewAndOldValueParams) => `最大経費日数を削除（以前は「${oldValue}」日）`,
     },
     roomMembersPage: {
         memberNotFound: 'メンバーが見つかりません。',
@@ -6790,7 +6729,7 @@ ${reportName}
             amount: {
                 lessThan: ({amount}: OptionalParam<RequestAmountParams> = {}) => `${amount ?? ''} 未満`,
                 greaterThan: ({amount}: OptionalParam<RequestAmountParams> = {}) => `${amount ?? ''}より大きい`,
-                between: (greaterThan: string, lessThan: string) => `${greaterThan} から ${lessThan} まで`,
+                between: ({greaterThan, lessThan}: FiltersAmountBetweenParams) => `${greaterThan} から ${lessThan} まで`,
                 equalTo: ({amount}: OptionalParam<RequestAmountParams> = {}) => `${amount ?? ''} と等しい`,
             },
             card: {
@@ -7218,7 +7157,6 @@ ${reportName}
         maxAge: ({maxAge}: ViolationsMaxAgeParams) => `${maxAge}日より前の日付`,
         missingCategory: 'カテゴリ未設定',
         missingComment: '選択したカテゴリーには説明が必要です',
-        missingAttendees: 'このカテゴリには複数の参加者が必要です',
         missingTag: ({tagName}: ViolationsMissingTagParams = {}) => `${tagName ?? 'タグ'} が見つかりません`,
         modifiedAmount: ({type, displayPercentVariance}: ViolationsModifiedAmountParams) => {
             switch (type) {
@@ -7326,7 +7264,6 @@ ${reportName}
         hold: 'この経費は保留になっています',
         resolvedDuplicates: '重複を解決しました',
         companyCardRequired: '法人カードでの購入が必須',
-        noRoute: '有効な住所を選択してください',
     },
     reportViolations: {
         [CONST.REPORT_VIOLATIONS.FIELD_REQUIRED]: ({fieldName}: RequiredFieldParams) => `${fieldName} は必須です`,
@@ -7944,18 +7881,9 @@ Expensify の使い方をお見せするための*テストレシート*がこ
             addAdminError: 'このメンバーを管理者として追加できません。もう一度お試しください。',
             revokeAdminAccess: '管理者アクセスを取り消す',
             cantRevokeAdminAccess: '技術連絡先から管理者アクセス権を取り消すことはできません',
-            error: {
-                removeAdmin: 'このユーザーを管理者として削除できません。もう一度お試しください。',
-                removeDomain: 'このドメインを削除できません。もう一度お試しください。',
-                removeDomainNameInvalid: 'リセットするドメイン名を入力してください。',
-            },
-            resetDomain: 'ドメインをリセット',
-            resetDomainExplanation: ({domainName}: {domainName?: string}) => `ドメインのリセットを確認するため、<strong>${domainName}</strong> と入力してください。`,
-            enterDomainName: 'ここにドメイン名を入力してください',
-            resetDomainInfo: `この操作は<strong>永久的</strong>であり、次のデータが削除されます：<br/> <ul><li>会社カードの接続およびそれらのカードからの未報告の経費</li> <li>SAML とグループ設定</li> </ul> すべてのアカウント、ワークスペース、レポート、経費、およびその他のデータは保持されます。<br/><br/>注：関連付けられているメールアドレスを<a href="#">連絡先方法</a>から削除することで、このドメインをドメイン一覧から消去できます。`,
+            error: {removeAdmin: 'このユーザーを管理者として削除できません。もう一度お試しください。'},
         },
         members: {title: 'メンバー', findMember: 'メンバーを検索'},
-        domainAdmins: 'ドメイン管理者',
     },
     gps: {
         tooltip: 'GPS 追跡を進行中です！完了したら、下で追跡を停止してください。',
@@ -7976,13 +7904,6 @@ Expensify の使い方をお見せするための*テストレシート*がこ
         },
         preciseLocationRequiredModal: {title: '正確な位置情報が必要です', prompt: 'GPS距離の追跡を開始するには、デバイスの設定で「正確な位置情報」を有効にしてください。'},
         desktop: {title: 'スマートフォンで距離を記録する', subtitle: 'GPS で自動的にマイルまたはキロメートルを記録し、移動をすぐに経費に変換します。', button: 'アプリをダウンロード'},
-        notification: {title: 'GPS追跡を実行中', body: '完了するにはアプリに移動'},
-        locationServicesRequiredModal: {
-            title: '位置情報へのアクセスが必要です',
-            confirm: '設定を開く',
-            prompt: 'GPS距離の追跡を開始するには、デバイスの設定で位置情報へのアクセスを許可してください。',
-        },
-        fabGpsTripExplained: 'GPS画面へ移動（フローティングアクション）',
     },
 };
 // IMPORTANT: This line is manually replaced in generate translation files by scripts/generateTranslations.ts,
diff --git a/src/languages/nl.ts b/src/languages/nl.ts
index 3d0bc2f48bf6..5ef71c2f20b5 100644
--- a/src/languages/nl.ts
+++ b/src/languages/nl.ts
@@ -28,6 +28,24 @@ import type {
     EditActionParams,
     ExportAgainModalDescriptionParams,
     ExportIntegrationSelectedParams,
+    FileLimitParams,
+    FileTypeParams,
+    FiltersAmountBetweenParams,
+    FlightLayoverParams,
+    FlightParams,
+    FocusModeUpdateParams,
+    FormattedMaxLengthParams,
+    GoBackMessageParams,
+    HarvestCreatedExpenseReportParams,
+    ImportedTagsMessageParams,
+    ImportedTypesParams,
+    ImportFieldParams,
+    ImportMembersSuccessfulDescriptionParams,
+    ImportPerDiemRatesSuccessfulDescriptionParams,
+    ImportTagsSuccessfulDescriptionParams,
+    IncorrectZipFormatParams,
+    IndividualExpenseRulesSubtitleParams,
+    InstantSummaryParams,
     IntacctMappingTitleParams,
     IntegrationExportParams,
     IntegrationSyncFailedParams,
@@ -115,6 +133,9 @@ import type {
     SplitDateRangeParams,
     SplitExpenseEditTitleParams,
     SplitExpenseSubtitleParams,
+    SpreadCategoriesParams,
+    SpreadFieldNameParams,
+    SpreadSheetColumnParams,
     StatementTitleParams,
     StepCounterParams,
     StripePaidParams,
@@ -164,7 +185,6 @@ import type {
     UpdatedPolicyManualApprovalThresholdParams,
     UpdatedPolicyPreventSelfApprovalParams,
     UpdatedPolicyReimbursementEnabledParams,
-    UpdatedPolicyReimburserParams,
     UpdatedPolicyReportFieldDefaultValueParams,
     UpdatedPolicyTagFieldParams,
     UpdatedPolicyTagNameParams,
@@ -259,6 +279,7 @@ const translations: TranslationDeepObject<typeof en> = {
         searchWithThreeDots: 'Zoeken...',
         next: 'Volgende',
         previous: 'Vorige',
+        // @context Navigation button that returns the user to the previous screen. Should be interpreted as a UI action label.
         goBack: 'Ga terug',
         create: 'Maken',
         add: 'Toevoegen',
@@ -276,7 +297,6 @@ const translations: TranslationDeepObject<typeof en> = {
         zoom: 'Zoom',
         password: 'Wachtwoord',
         magicCode: 'Magische code',
-        digits: 'cijfers',
         twoFactorCode: 'Tweeledige code',
         workspaces: 'Werkruimtes',
         inbox: 'Inbox',
@@ -533,6 +553,10 @@ const translations: TranslationDeepObject<typeof en> = {
         value: 'Waarde',
         downloadFailedTitle: 'Download mislukt',
         downloadFailedDescription: 'Je download kon niet worden voltooid. Probeer het later opnieuw.',
+        downloadFailedEmptyReportDescription: () => ({
+            one: 'Je kunt geen leeg rapport exporteren.',
+            other: () => 'Je kunt geen lege rapporten exporteren.',
+        }),
         filterLogs: 'Logboeken filteren',
         network: 'Netwerk',
         reportID: 'Rapport-ID',
@@ -628,6 +652,7 @@ const translations: TranslationDeepObject<typeof en> = {
         copyToClipboard: 'Kopiëren naar klembord',
         thisIsTakingLongerThanExpected: 'Dit duurt langer dan verwacht...',
         domains: 'Domeinen',
+        viewReport: 'Rapport bekijken',
         actionRequired: 'Actie vereist',
         duplicate: 'Dupliceren',
         duplicated: 'Gedupliceerd',
@@ -688,12 +713,12 @@ const translations: TranslationDeepObject<typeof en> = {
         protectedPDFNotSupported: 'Met wachtwoord beveiligde PDF wordt niet ondersteund',
         attachmentImageResized: 'Deze afbeelding is verkleind voor voorbeeldweergave. Download om de volledige resolutie te zien.',
         attachmentImageTooLarge: 'Deze afbeelding is te groot om een voorbeeld te tonen voordat je deze uploadt.',
-        tooManyFiles: (fileLimit: number) => `Je kunt maximaal ${fileLimit} bestanden tegelijk uploaden.`,
+        tooManyFiles: ({fileLimit}: FileLimitParams) => `Je kunt maximaal ${fileLimit} bestanden tegelijk uploaden.`,
         sizeExceededWithValue: ({maxUploadSizeInMB}: SizeExceededParams) => `Bestanden zijn groter dan ${maxUploadSizeInMB} MB. Probeer het opnieuw.`,
         someFilesCantBeUploaded: 'Sommige bestanden kunnen niet worden geüpload',
         sizeLimitExceeded: ({maxUploadSizeInMB}: SizeExceededParams) => `Bestanden moeten kleiner zijn dan ${maxUploadSizeInMB} MB. Grotere bestanden worden niet geüpload.`,
         maxFileLimitExceeded: 'Je kunt maximaal 30 bonnetjes tegelijk uploaden. Eventuele extra’s worden niet geüpload.',
-        unsupportedFileType: (fileType: string) => `${fileType}-bestanden worden niet ondersteund. Alleen ondersteunde bestandstypen worden geüpload.`,
+        unsupportedFileType: ({fileType}: FileTypeParams) => `${fileType}-bestanden worden niet ondersteund. Alleen ondersteunde bestandstypen worden geüpload.`,
         learnMoreAboutSupportedFiles: 'Meer informatie over ondersteunde indelingen.',
         passwordProtected: 'Met wachtwoord beveiligde pdf’s worden niet ondersteund. Alleen ondersteunde bestanden worden geüpload.',
     },
@@ -718,8 +743,8 @@ const translations: TranslationDeepObject<typeof en> = {
     composer: {
         noExtensionFoundForMimeType: 'Geen extensie gevonden voor mimetype',
         problemGettingImageYouPasted: 'Er is een probleem opgetreden bij het ophalen van de afbeelding die je hebt geplakt',
-        commentExceededMaxLength: (formattedMaxLength: string) => `De maximale lengte van opmerkingen is ${formattedMaxLength} tekens.`,
-        taskTitleExceededMaxLength: (formattedMaxLength: string) => `De maximale lengte van de taaknaam is ${formattedMaxLength} tekens.`,
+        commentExceededMaxLength: ({formattedMaxLength}: FormattedMaxLengthParams) => `De maximale lengte van opmerkingen is ${formattedMaxLength} tekens.`,
+        taskTitleExceededMaxLength: ({formattedMaxLength}: FormattedMaxLengthParams) => `De maximale lengte van de taaknaam is ${formattedMaxLength} tekens.`,
     },
     baseUpdateAppModal: {
         updateApp: 'App bijwerken',
@@ -730,35 +755,6 @@ const translations: TranslationDeepObject<typeof en> = {
         expired: 'Je sessie is verlopen.',
         signIn: 'Meld u opnieuw aan.',
     },
-    multifactorAuthentication: {
-        biometricsTest: {
-            biometricsTest: 'Biometrische test',
-            authenticationSuccessful: 'Authenticatie geslaagd',
-            successfullyAuthenticatedUsing: ({authType}) => `Je hebt je succesvol geverifieerd met ${authType}.`,
-            troubleshootBiometricsStatus: ({registered}) => `Biometrie (${registered ? 'Geregistreerd' : 'Niet geregistreerd'})`,
-            yourAttemptWasUnsuccessful: 'Je authenticatiepoging is mislukt.',
-            youCouldNotBeAuthenticated: 'U kon niet worden geauthenticeerd',
-            areYouSureToReject: 'Weet je het zeker? De authenticatiepoging wordt afgewezen als je dit scherm sluit.',
-            rejectAuthentication: 'Authenticatie afwijzen',
-            test: 'Test',
-            biometricsAuthentication: 'Biometrische authenticatie',
-        },
-        pleaseEnableInSystemSettings: {
-            start: 'Schakel gezichts-/vingerafdrukverificatie in of stel een apparaat-toegangscode in via je ',
-            link: 'systeeminstellingen',
-            end: '.',
-        },
-        oops: 'Oeps, er ging iets mis',
-        looksLikeYouRanOutOfTime: 'Het lijkt erop dat je tijd op is! Probeer het opnieuw bij de handelaar.',
-        youRanOutOfTime: 'De tijd is op',
-        letsVerifyItsYou: 'Laten we verifiëren dat jij het bent',
-        verifyYourself: {
-            biometrics: 'Verifieer jezelf met je gezicht of vingerafdruk',
-        },
-        enableQuickVerification: {
-            biometrics: 'Schakel snelle, veilige verificatie in met je gezicht of vingerafdruk. Geen wachtwoorden of codes nodig.',
-        },
-    },
     validateCodeModal: {
         successfulSignInTitle: dedent(`
             Abracadabra,
@@ -928,7 +924,7 @@ const translations: TranslationDeepObject<typeof en> = {
     adminOnlyCanPost: 'Alleen beheerders kunnen berichten sturen in deze ruimte.',
     reportAction: {
         asCopilot: 'als copiloot voor',
-        harvestCreatedExpenseReport: (reportUrl: string, reportName: string) =>
+        harvestCreatedExpenseReport: ({reportUrl, reportName}: HarvestCreatedExpenseReportParams) =>
             `heeft dit rapport aangemaakt om alle uitgaven van <a href="${reportUrl}">${reportName}</a> op te nemen die niet konden worden ingediend met de door jou gekozen frequentie`,
         createdReportForUnapprovedTransactions: ({reportUrl, reportName}: CreatedReportForUnapprovedTransactionsParams) =>
             `heeft dit rapport gemaakt voor uitgestelde uitgaven van <a href="${reportUrl}">${reportName}</a>`,
@@ -970,7 +966,7 @@ const translations: TranslationDeepObject<typeof en> = {
         buttonFind: 'Zoek iets...',
         buttonMySettings: 'Mijn instellingen',
         fabNewChat: 'Chat starten',
-        fabNewChatExplained: 'Actiemenu openen',
+        fabNewChatExplained: 'Chat starten (zwevende actie)',
         fabScanReceiptExplained: 'Bon scannen (Zwevende actie)',
         chatPinned: 'Chat vastgezet',
         draftedMessage: 'Conceptbericht',
@@ -996,13 +992,13 @@ const translations: TranslationDeepObject<typeof en> = {
         chooseSpreadsheet: '<muted-link>Selecteer een spreadsheetbestand om te importeren. Ondersteunde indelingen: .csv, .txt, .xls en .xlsx.</muted-link>',
         chooseSpreadsheetMultiLevelTag: `<muted-link>Selecteer een spreadsheetbestand om te importeren. <a href="${CONST.IMPORT_SPREADSHEET.MULTI_LEVEL_TAGS_ARTICLE_LINK}">Meer informatie</a> over ondersteunde bestandsindelingen.</muted-link>`,
         fileContainsHeader: 'Bestand bevat kolomkoppen',
-        column: (name: string) => `Kolom ${name}`,
-        fieldNotMapped: (fieldName: string) => `Oeps! Een verplicht veld ("${fieldName}") is niet toegewezen. Controleer dit en probeer het opnieuw.`,
-        singleFieldMultipleColumns: (fieldName: string) => `Oeps! Je hebt één veld ("${fieldName}") aan meerdere kolommen gekoppeld. Controleer dit en probeer het opnieuw.`,
-        emptyMappedField: (fieldName: string) => `Oeps! Het veld („${fieldName}”) bevat een of meer lege waarden. Controleer het en probeer het opnieuw.`,
+        column: ({name}: SpreadSheetColumnParams) => `Kolom ${name}`,
+        fieldNotMapped: ({fieldName}: SpreadFieldNameParams) => `Oeps! Een verplicht veld ("${fieldName}") is niet toegewezen. Controleer dit en probeer het opnieuw.`,
+        singleFieldMultipleColumns: ({fieldName}: SpreadFieldNameParams) => `Oeps! Je hebt één veld ("${fieldName}") aan meerdere kolommen gekoppeld. Controleer dit en probeer het opnieuw.`,
+        emptyMappedField: ({fieldName}: SpreadFieldNameParams) => `Oeps! Het veld („${fieldName}”) bevat een of meer lege waarden. Controleer het en probeer het opnieuw.`,
         importSuccessfulTitle: 'Import succesvol',
-        importCategoriesSuccessfulDescription: ({categories}: {categories: number}) => (categories > 1 ? `Er zijn ${categories} categorieën toegevoegd.` : '1 categorie is toegevoegd.'),
-        importMembersSuccessfulDescription: ({added, updated}: {added: number; updated: number}) => {
+        importCategoriesSuccessfulDescription: ({categories}: SpreadCategoriesParams) => (categories > 1 ? `Er zijn ${categories} categorieën toegevoegd.` : '1 categorie is toegevoegd.'),
+        importMembersSuccessfulDescription: ({added, updated}: ImportMembersSuccessfulDescriptionParams) => {
             if (!added && !updated) {
                 return 'Er zijn geen leden toegevoegd of bijgewerkt.';
             }
@@ -1014,9 +1010,10 @@ const translations: TranslationDeepObject<typeof en> = {
             }
             return added > 1 ? `${added} leden zijn toegevoegd.` : '1 lid is toegevoegd.';
         },
-        importTagsSuccessfulDescription: ({tags}: {tags: number}) => (tags > 1 ? `Er zijn ${tags} tags toegevoegd.` : '1 tag is toegevoegd.'),
+        importTagsSuccessfulDescription: ({tags}: ImportTagsSuccessfulDescriptionParams) => (tags > 1 ? `Er zijn ${tags} tags toegevoegd.` : '1 tag is toegevoegd.'),
         importMultiLevelTagsSuccessfulDescription: 'Tags op meerdere niveaus zijn toegevoegd.',
-        importPerDiemRatesSuccessfulDescription: ({rates}: {rates: number}) => (rates > 1 ? `${rates} dagvergoedingen zijn toegevoegd.` : '1 dagvergoedingstarief is toegevoegd.'),
+        importPerDiemRatesSuccessfulDescription: ({rates}: ImportPerDiemRatesSuccessfulDescriptionParams) =>
+            rates > 1 ? `${rates} dagvergoedingen zijn toegevoegd.` : '1 dagvergoedingstarief is toegevoegd.',
         importFailedTitle: 'Import mislukt',
         importFailedDescription: 'Zorg ervoor dat alle velden correct zijn ingevuld en probeer het opnieuw. Als het probleem zich blijft voordoen, neem dan contact op met Concierge.',
         importDescription: 'Kies welke velden je wilt koppelen vanuit je spreadsheet door op de vervolgkeuzelijst naast elke geïmporteerde kolom hieronder te klikken.',
@@ -1196,8 +1193,14 @@ const translations: TranslationDeepObject<typeof en> = {
             one: 'Weet je zeker dat je deze uitgave wilt verwijderen?',
             other: 'Weet je zeker dat je deze uitgaven wilt verwijderen?',
         }),
-        deleteReport: 'Rapport verwijderen',
-        deleteReportConfirmation: 'Weet u zeker dat u dit rapport wilt verwijderen?',
+        deleteReport: () => ({
+            one: 'Rapport verwijderen',
+            other: 'Rapporten verwijderen',
+        }),
+        deleteReportConfirmation: () => ({
+            one: 'Weet u zeker dat u dit rapport wilt verwijderen?',
+            other: 'Weet u zeker dat u deze rapporten wilt verwijderen?',
+        }),
         settledExpensify: 'Betaald',
         done: 'Gereed',
         settledElsewhere: 'Elders betaald',
@@ -1447,8 +1450,9 @@ const translations: TranslationDeepObject<typeof en> = {
         moveExpensesError: 'U kunt geen dagvergoedingskosten verplaatsen naar rapporten op andere werkruimtes, omdat de dagvergoedingstarieven tussen werkruimtes kunnen verschillen.',
         changeApprover: {
             title: 'Fiatteur wijzigen',
-            header: ({workflowSettingLink}: WorkflowSettingsParam) =>
-                `Kies een optie om de goedkeurder voor dit rapport te wijzigen. (Werk uw <a href="${workflowSettingLink}">werkruimte-instellingen</a> bij om dit permanent voor alle rapporten te wijzigen.)`,
+            subtitle: 'Kies een optie om de fiatteur voor dit rapport te wijzigen.',
+            description: ({workflowSettingLink}: WorkflowSettingsParam) =>
+                `Je kunt de goedkeurder ook permanent wijzigen voor alle rapporten in je <a href="${workflowSettingLink}">workflowinstellingen</a>.`,
             changedApproverMessage: (managerID: number) => `heeft de goedkeurder gewijzigd naar <mention-user accountID="${managerID}"/>`,
             actions: {
                 addApprover: 'Goedkeurder toevoegen',
@@ -1466,13 +1470,7 @@ const translations: TranslationDeepObject<typeof en> = {
         splitDateRange: ({startDate, endDate, count}: SplitDateRangeParams) => `${startDate} tot ${endDate} (${count} dagen)`,
         splitByDate: 'Splitsen op datum',
         routedDueToDEW: ({to}: RoutedDueToDEWParams) => `rapport doorgestuurd naar ${to} vanwege aangepaste goedkeuringsworkflow`,
-        timeTracking: {
-            hoursAt: (hours: number, rate: string) => `${hours} ${hours === 1 ? 'uur' : 'uren'} @ ${rate} / uur`,
-            hrs: 'uur',
-            hours: 'Uren',
-            ratePreview: (rate: string) => `${rate} / uur`,
-            amountTooLargeError: 'Het totale bedrag is te hoog. Verlaag het aantal uren of verlaag het tarief.',
-        },
+        timeTracking: {hoursAt: (hours: number, rate: string) => `${hours} ${hours === 1 ? 'uur' : 'uren'} @ ${rate} / uur`, hrs: 'uur'},
     },
     transactionMerge: {
         listPage: {
@@ -1950,6 +1948,13 @@ const translations: TranslationDeepObject<typeof en> = {
         chatToConciergeToUnlock: 'Chat met Concierge om beveiligingsproblemen op te lossen en je account te ontgrendelen.',
         chatWithConcierge: 'Chatten met Concierge',
     },
+    passwordPage: {
+        changePassword: 'Wachtwoord wijzigen',
+        changingYourPasswordPrompt: 'Je wachtwoord wijzigen zal je wachtwoord bijwerken voor zowel je Expensify.com- als je New Expensify-account.',
+        currentPassword: 'Huidig wachtwoord',
+        newPassword: 'Nieuw wachtwoord',
+        newPasswordPrompt: 'Je nieuwe wachtwoord moet verschillen van je oude wachtwoord en minstens 8 tekens, 1 hoofdletter, 1 kleine letter en 1 cijfer bevatten.',
+    },
     twoFactorAuth: {
         headerTitle: 'Twee-factor-authenticatie',
         twoFactorAuthEnabled: 'Authenticatie in twee stappen ingeschakeld',
@@ -2349,7 +2354,7 @@ ${amount} voor ${merchant} - ${date}`,
     transferAmountPage: {
         transfer: ({amount}: TransferParams) => `Overboeking${amount ? ` ${amount}` : ''}`,
         instant: 'Direct (debitkaart)',
-        instantSummary: (rate: string, minAmount: string) => `${rate}% vergoeding (${minAmount} minimum)`,
+        instantSummary: ({rate, minAmount}: InstantSummaryParams) => `${rate}% vergoeding (${minAmount} minimum)`,
         ach: '1-3 werkdagen (bankrekening)',
         achSummary: 'Geen kosten',
         whichAccount: 'Welk account?',
@@ -2384,31 +2389,10 @@ ${amount} voor ${merchant} - ${date}`,
             comment: (value: string) => `Beschrijving wijzigen in "${value}"`,
             merchant: (value: string) => `Handelaar bijwerken naar "${value}"`,
             reimbursable: (value: boolean) => `Uitgave ${value ? 'terugbetaalbaar' : 'niet-vergoedbaar'} bijwerken`,
-            report: (value: string) => `Toevoegen aan een rapport met de naam "${value}"`,
+            report: (value: string) => `Een rapport met de naam "${value}" toevoegen`,
             tag: (value: string) => `Tag bijwerken naar "${value}"`,
             tax: (value: string) => `Belastingtarief bijwerken naar ${value}`,
         },
-        newRule: 'Nieuwe regel',
-        addRule: {
-            title: 'Regel toevoegen',
-            expenseContains: 'Als de uitgave bevat:',
-            applyUpdates: 'Breng vervolgens deze updates aan:',
-            merchantHint: 'Typ * om een regel te maken die voor alle leveranciers geldt',
-            addToReport: 'Toevoegen aan een rapport met de naam',
-            createReport: 'Maak rapport indien nodig',
-            applyToExistingExpenses: 'Toepassen op bestaande overeenkomende onkosten',
-            confirmError: 'Voer een leverancier in en pas ten minste één wijziging toe',
-            confirmErrorMerchant: 'Voer handelaar in',
-            confirmErrorUpdate: 'Breng ten minste één wijziging aan alstublieft',
-            saveRule: 'Regel opslaan',
-        },
-        editRule: {title: 'Regel bewerken'},
-        deleteRule: {
-            deleteSingle: 'Regel verwijderen',
-            deleteMultiple: 'Regels verwijderen',
-            deleteSinglePrompt: 'Weet je zeker dat je deze regel wilt verwijderen?',
-            deleteMultiplePrompt: 'Weet je zeker dat je deze regels wilt verwijderen?',
-        },
     },
     preferencesPage: {
         appSection: {
@@ -2902,7 +2886,7 @@ ${
             dateShouldBeBefore: (dateString: string) => `Datum moet vóór ${dateString} zijn`,
             dateShouldBeAfter: (dateString: string) => `Datum moet na ${dateString} zijn`,
             hasInvalidCharacter: 'Naam mag alleen Latijnse tekens bevatten',
-            incorrectZipFormat: (zipFormat?: string) => `Ongeldig postcodeformaat${zipFormat ? `Acceptabel formaat: ${zipFormat}` : ''}`,
+            incorrectZipFormat: ({zipFormat}: IncorrectZipFormatParams = {}) => `Ongeldig postcodeformaat${zipFormat ? `Acceptabel formaat: ${zipFormat}` : ''}`,
             invalidPhoneNumber: `Zorg ervoor dat het telefoonnummer geldig is (bijv. ${CONST.EXAMPLE_PHONE_NUMBER})`,
         },
     },
@@ -2985,7 +2969,7 @@ ${
     },
     focusModeUpdateModal: {
         title: 'Welkom bij de #focus-modus!',
-        prompt: (priorityModePageUrl: string) =>
+        prompt: ({priorityModePageUrl}: FocusModeUpdateParams) =>
             `Blijf het overzicht houden door alleen ongelezen chats of chats die je aandacht nodig hebben te zien. Maak je geen zorgen, je kunt dit op elk moment wijzigen in de <a href="${priorityModePageUrl}">instellingen</a>.`,
     },
     notFound: {
@@ -3005,6 +2989,15 @@ ${
         subtitle: 'Je verzoek kon niet worden voltooid. Probeer het later opnieuw.',
         wrongTypeSubtitle: 'Die zoekopdracht is ongeldig. Probeer je zoekcriteria aan te passen.',
     },
+    setPasswordPage: {
+        enterPassword: 'Voer een wachtwoord in',
+        setPassword: 'Wachtwoord instellen',
+        newPasswordPrompt: 'Je wachtwoord moet minimaal 8 tekens bevatten, waarvan 1 hoofdletter, 1 kleine letter en 1 cijfer.',
+        passwordFormTitle: 'Welkom terug bij de nieuwe Expensify! Stel je wachtwoord in.',
+        passwordNotSet: 'We konden je nieuwe wachtwoord niet instellen. We hebben je een nieuwe wachtwoordlink gestuurd om het opnieuw te proberen.',
+        setPasswordLinkInvalid: 'Deze link om een wachtwoord in te stellen is ongeldig of verlopen. Er wacht een nieuwe op je in je e‑mailinbox!',
+        validateAccount: 'Account verifiëren',
+    },
     statusPage: {
         status: 'Status',
         statusExplanation: 'Voeg een emoji toe zodat je collega’s en vrienden gemakkelijk kunnen zien wat er aan de hand is. Je kunt er ook nog een bericht bij zetten als je wilt!',
@@ -3146,13 +3139,10 @@ ${
         errorMessageInvalidPhone: `Voer een geldig telefoonnummer in zonder haakjes of streepjes. Als u zich buiten de VS bevindt, voeg dan uw landcode toe (bijv. ${CONST.EXAMPLE_PHONE_NUMBER}).`,
         errorMessageInvalidEmail: 'Ongeldig e-mailadres',
         userIsAlreadyMember: ({login, name}: UserIsAlreadyMemberParams) => `${login} is al lid van ${name}`,
-        userIsAlreadyAnAdmin: ({login, name}: UserIsAlreadyMemberParams) => `${login} is al een beheerder van ${name}`,
     },
     onfidoStep: {
         acceptTerms: 'Door door te gaan met het verzoek om uw Expensify Wallet te activeren, bevestigt u dat u hebt gelezen, begrijpt en accepteert',
         facialScan: 'Onfido’s beleid en vrijgave voor gelaatscan',
-        onfidoLinks: (onfidoTitle: string) =>
-            `<muted-text-micro>${onfidoTitle} <a href='${CONST.ONFIDO_FACIAL_SCAN_POLICY_URL}'>Onfido’s beleid en vrijgave voor gelaatscan</a>, <a href='${CONST.ONFIDO_PRIVACY_POLICY_URL}'>Privacy</a> en <a href='${CONST.ONFIDO_TERMS_OF_SERVICE_URL}'>Servicevoorwaarden</a>.</muted-text-micro>`,
         tryAgain: 'Opnieuw proberen',
         verifyIdentity: 'Identiteit verifiëren',
         letsVerifyIdentity: 'Laten we je identiteit verifiëren',
@@ -3651,7 +3641,7 @@ ${
         flight: 'Vlucht',
         flightDetails: {
             passenger: 'Passagier',
-            layover: (layover: string) => `<muted-text-label>Je hebt een <strong>${layover} tussenstop</strong> vóór deze vlucht</muted-text-label>`,
+            layover: ({layover}: FlightLayoverParams) => `<muted-text-label>Je hebt een <strong>${layover} tussenstop</strong> vóór deze vlucht</muted-text-label>`,
             takeOff: 'Vertrek',
             landing: 'Landingspagina',
             seat: 'Licentie',
@@ -3741,19 +3731,18 @@ ${
             conciergeMessage: ({domain}: {domain: string}) => `Reizen inschakelen is mislukt voor domein: ${domain}. Controleer dit domein en schakel reizen in.`,
         },
         updates: {
-            bookingTicketed: (airlineCode: string, origin: string, destination: string, startDate: string, confirmationID = '') =>
+            bookingTicketed: ({airlineCode, origin, destination, startDate, confirmationID = ''}: FlightParams) =>
                 `Je vlucht ${airlineCode} (${origin} → ${destination}) op ${startDate} is geboekt. Bevestigingscode: ${confirmationID}`,
-            ticketVoided: (airlineCode: string, origin: string, destination: string, startDate: string) =>
+            ticketVoided: ({airlineCode, origin, destination, startDate}: FlightParams) =>
                 `Je ticket voor vlucht ${airlineCode} (${origin} → ${destination}) op ${startDate} is geannuleerd.`,
-            ticketRefunded: (airlineCode: string, origin: string, destination: string, startDate: string) =>
+            ticketRefunded: ({airlineCode, origin, destination, startDate}: FlightParams) =>
                 `Je ticket voor vlucht ${airlineCode} (${origin} → ${destination}) op ${startDate} is terugbetaald of gewijzigd.`,
-            flightCancelled: (airlineCode: string, origin: string, destination: string, startDate: string) =>
+            flightCancelled: ({airlineCode, origin, destination, startDate}: FlightParams) =>
                 `Je vlucht ${airlineCode} (${origin} → ${destination}) op ${startDate}} is door de luchtvaartmaatschappij geannuleerd.`,
             flightScheduleChangePending: (airlineCode: string) =>
                 `De luchtvaartmaatschappij heeft een wijziging in het schema voorgesteld voor vlucht ${airlineCode}; we wachten op bevestiging.`,
             flightScheduleChangeClosed: (airlineCode: string, startDate?: string) => `Wijziging van schema bevestigd: vlucht ${airlineCode} vertrekt nu om ${startDate}.`,
-            flightUpdated: (airlineCode: string, origin: string, destination: string, startDate: string) =>
-                `Je vlucht ${airlineCode} (${origin} → ${destination}) op ${startDate} is bijgewerkt.`,
+            flightUpdated: ({airlineCode, origin, destination, startDate}: FlightParams) => `Je vlucht ${airlineCode} (${origin} → ${destination}) op ${startDate} is bijgewerkt.`,
             flightCabinChanged: (airlineCode: string, cabinClass?: string) => `Uw cabineklasse is bijgewerkt naar ${cabinClass} op vlucht ${airlineCode}.`,
             flightSeatConfirmed: (airlineCode: string) => `Je stoeltoewijzing op vlucht ${airlineCode} is bevestigd.`,
             flightSeatChanged: (airlineCode: string) => `Je stoeltoewijzing op vlucht ${airlineCode} is gewijzigd.`,
@@ -4566,7 +4555,7 @@ ${
                 importTaxDescription: 'Belastinggroepen uit NetSuite importeren.',
                 importCustomFields: {
                     chooseOptionBelow: 'Kies een optie hieronder:',
-                    label: (importedTypes: string[]) => `Geïmporteerd als ${importedTypes.join('en')}`,
+                    label: ({importedTypes}: ImportedTypesParams) => `Geïmporteerd als ${importedTypes.join('en')}`,
                     requiredFieldError: ({fieldName}: RequiredFieldParams) => `Voer de ${fieldName} in`,
                     customSegments: {
                         title: 'Aangepaste segmenten/records',
@@ -4681,18 +4670,19 @@ _Voor gedetailleerdere instructies, [bezoek onze helpsite](${CONST.NETSUITE_IMPO
                     [CONST.INTEGRATION_ENTITY_MAP_TYPES.NETSUITE_DEFAULT]: {
                         label: 'Standaard NetSuite-medewerker',
                         description: 'Niet in Expensify geïmporteerd, toegepast bij export',
-                        footerContent: (importField: string) =>
+                        footerContent: ({importField}: ImportFieldParams) =>
                             `Als je ${importField} in NetSuite gebruikt, passen we de standaardwaarde die is ingesteld op de werknemerskaart toe bij het exporteren naar Expense Report of Journal Entry.`,
                     },
                     [CONST.INTEGRATION_ENTITY_MAP_TYPES.TAG]: {
                         label: 'Labels',
                         description: 'Niveau van regelitems',
-                        footerContent: (importField: string) => `${startCase(importField)} zal selecteerbaar zijn voor elke afzonderlijke onkost in het rapport van een werknemer.`,
+                        footerContent: ({importField}: ImportFieldParams) =>
+                            `${startCase(importField)} zal selecteerbaar zijn voor elke afzonderlijke onkost in het rapport van een werknemer.`,
                     },
                     [CONST.INTEGRATION_ENTITY_MAP_TYPES.REPORT_FIELD]: {
                         label: 'Rapportvelden',
                         description: 'Rapportniveau',
-                        footerContent: (importField: string) => `${startCase(importField)}-selectie is van toepassing op alle onkosten op het rapport van een werknemer.`,
+                        footerContent: ({importField}: ImportFieldParams) => `${startCase(importField)}-selectie is van toepassing op alle onkosten op het rapport van een werknemer.`,
                     },
                 },
             },
@@ -4769,7 +4759,7 @@ _Voor gedetailleerdere instructies, [bezoek onze helpsite](${CONST.NETSUITE_IMPO
                 commercialFeedPlaidDetails: `Vereist een koppeling met je bank, maar wij begeleiden je daarbij. Dit is meestal beperkt tot grotere bedrijven.`,
                 directFeedDetails: 'De eenvoudigste aanpak. Maak direct verbinding met behulp van je hoofdreferenties. Deze methode komt het meest voor.',
                 enableFeed: {
-                    title: (provider: string) => `Schakel je ${provider}-feed in`,
+                    title: ({provider}: GoBackMessageParams) => `Schakel je ${provider}-feed in`,
                     heading:
                         'We hebben een directe integratie met uw kaartuitgever en kunnen uw transactiegegevens snel en nauwkeurig in Expensify importeren.\n\nOm te beginnen hoeft u alleen maar:',
                     visa: 'We hebben wereldwijde integraties met Visa, al verschilt de geschiktheid per bank en kaartprogramma.\n\nOm te beginnen, hoeft u alleen maar:',
@@ -5043,21 +5033,6 @@ _Voor gedetailleerdere instructies, [bezoek onze helpsite](${CONST.NETSUITE_IMPO
                     subtitle: 'Gebruik Expensify Travel om de beste reisaanbiedingen te krijgen en beheer al uw zakelijke uitgaven op één plek.',
                     ctaText: 'Boeken of beheren',
                 },
-                travelInvoicing: {
-                    travelBookingSection: {title: 'Reisboeking', subtitle: 'Gefeliciteerd! Je kunt nu reizen boeken en beheren in deze werkruimte.', manageTravelLabel: 'Reizen beheren'},
-                    centralInvoicingSection: {
-                        title: 'Centrale facturatie',
-                        subtitle: 'Centraliseer alle reiskosten in één maandelijkse factuur in plaats van bij aankoop te betalen.',
-                        learnHow: 'Meer informatie.',
-                        subsections: {
-                            currentTravelSpendLabel: 'Huidige reiskosten',
-                            currentTravelSpendCta: 'Saldo betalen',
-                            currentTravelLimitLabel: 'Huidige reislimoet',
-                            settlementAccountLabel: 'Afwikkelingsrekening',
-                            settlementFrequencyLabel: 'Frequentie van afwikkeling',
-                        },
-                    },
-                },
             },
             expensifyCard: {
                 title: 'Expensify Card',
@@ -5344,7 +5319,7 @@ _Voor gedetailleerdere instructies, [bezoek onze helpsite](${CONST.NETSUITE_IMPO
                 prompt3: 'een back-up downloaden',
                 prompt4: 'eerst.',
             },
-            importedTagsMessage: (columnCounts: number) =>
+            importedTagsMessage: ({columnCounts}: ImportedTagsMessageParams) =>
                 `We hebben *${columnCounts} kolommen* in je spreadsheet gevonden. Selecteer *Naam* naast de kolom die de tagnamen bevat. Je kunt ook *Ingeschakeld* selecteren naast de kolom die de tagstatus instelt.`,
             cannotDeleteOrDisableAllTags: {
                 title: 'Kan niet alle labels verwijderen of uitschakelen',
@@ -5514,8 +5489,7 @@ _Voor gedetailleerdere instructies, [bezoek onze helpsite](${CONST.NETSUITE_IMPO
                 giveItNameInstruction: 'Maak het uniek genoeg om het te onderscheiden van andere kaarten. Specifieke use-cases zijn zelfs nog beter!',
                 cardName: 'Kaartnaam',
                 letsDoubleCheck: 'Laten we nog eens controleren of alles er goed uitziet.',
-                willBeReadyToUse: 'Deze kaart is direct klaar voor gebruik.',
-                willBeReadyToShip: 'Deze kaart is direct klaar om te worden verzonden.',
+                willBeReady: 'Deze kaart is direct klaar voor gebruik.',
                 cardholder: 'Kaarthouder',
                 cardType: 'Kaarttype',
                 limit: 'Limiet',
@@ -6168,7 +6142,7 @@ Vraag verplichte uitgavedetails zoals bonnetjes en beschrijvingen, stel limieten
         rules: {
             individualExpenseRules: {
                 title: 'Declaraties',
-                subtitle: (categoriesPageLink: string, tagsPageLink: string) =>
+                subtitle: ({categoriesPageLink, tagsPageLink}: IndividualExpenseRulesSubtitleParams) =>
                     `<muted-text>Stel uitgavenlimieten en standaardwaarden in voor afzonderlijke uitgaven. Je kunt ook regels maken voor <a href="${categoriesPageLink}">categorieën</a> en <a href="${tagsPageLink}">tags</a>.</muted-text>`,
                 receiptRequiredAmount: 'Vereist bedrag voor bon',
                 receiptRequiredAmountDescription: 'Bonnen verplicht stellen wanneer de uitgaven dit bedrag overschrijden, tenzij dit wordt overschreven door een categoriewaarde.',
@@ -6239,10 +6213,6 @@ Vraag verplichte uitgavedetails zoals bonnetjes en beschrijvingen, stel limieten
                 title: 'Categorisatieregels',
                 approver: 'Fiatteur',
                 requireDescription: 'Beschrijving vereist',
-                requireFields: 'Velden verplicht stellen',
-                requiredFieldsTitle: 'Verplichte velden',
-                requiredFieldsDescription: (categoryName: string) => `Dit is van toepassing op alle uitgaven die zijn gecategoriseerd als <strong>${categoryName}</strong>.`,
-                requireAttendees: 'Aanwezigen verplicht stellen',
                 descriptionHint: 'Beschrijvingstip',
                 descriptionHintDescription: (categoryName: string) =>
                     `Herinner medewerkers eraan om extra informatie te geven voor uitgaven in de categorie “${categoryName}”. Deze tip verschijnt in het omschrijvingsveld van uitgaven.`,
@@ -6475,6 +6445,12 @@ Vraag verplichte uitgavedetails zoals bonnetjes en beschrijvingen, stel limieten
         deleteReportField: (fieldType: string, fieldName?: string) => `heeft ${fieldType}-rapportveld "${fieldName}" verwijderd`,
         preventSelfApproval: ({oldValue, newValue}: UpdatedPolicyPreventSelfApprovalParams) =>
             `heeft "Zelfgoedkeuring voorkomen" bijgewerkt naar "${newValue === 'true' ? 'Ingeschakeld' : 'Uitgeschakeld'}" (voorheen "${oldValue === 'true' ? 'Ingeschakeld' : 'Uitgeschakeld'}")`,
+        updateMaxExpenseAmountNoReceipt: ({oldValue, newValue}: UpdatedPolicyFieldWithNewAndOldValueParams) =>
+            `het maximale bedrag voor bonnetjesplichtige uitgaven gewijzigd naar ${newValue} (voorheen ${oldValue})`,
+        updateMaxExpenseAmount: ({oldValue, newValue}: UpdatedPolicyFieldWithNewAndOldValueParams) =>
+            `het maximale onkostbedrag voor overtredingen gewijzigd naar ${newValue} (voorheen ${oldValue})`,
+        updateMaxExpenseAge: ({oldValue, newValue}: UpdatedPolicyFieldWithNewAndOldValueParams) =>
+            `"Maximale onkostenduur (dagen)" bijgewerkt naar "${newValue}" (voorheen "${oldValue === 'false' ? CONST.POLICY.DEFAULT_MAX_EXPENSE_AGE : oldValue}")`,
         updateMonthlyOffset: ({oldValue, newValue}: UpdatedPolicyFieldWithNewAndOldValueParams) => {
             if (!oldValue) {
                 return `stel de maandelijkse rapportindieningsdatum in op "${newValue}"`;
@@ -6630,40 +6606,6 @@ Vraag verplichte uitgavedetails zoals bonnetjes en beschrijvingen, stel limieten
             previousForwardsTo
                 ? `heeft de goedkeuringsworkflow voor ${approver} gewijzigd zodat goedgekeurde rapporten niet meer worden doorgestuurd (voorheen doorgestuurd naar ${previousForwardsTo})`
                 : `heeft de goedkeuringsworkflow voor ${approver} gewijzigd zodat goedgekeurde rapporten niet meer worden doorgestuurd`,
-        setDefaultBankAccount: ({bankAccountName, maskedBankAccountNumber}: {bankAccountName: string; maskedBankAccountNumber: string}) =>
-            `stel de standaard zakelijke bankrekening in op "${bankAccountName ? `${bankAccountName}: ` : ''}${maskedBankAccountNumber}"`,
-        removedDefaultBankAccount: ({bankAccountName, maskedBankAccountNumber}: {bankAccountName: string; maskedBankAccountNumber: string}) =>
-            `heeft de standaard zakelijke bankrekening "${bankAccountName ? `${bankAccountName}: ` : ''}${maskedBankAccountNumber}" verwijderd`,
-        changedDefaultBankAccount: ({
-            bankAccountName,
-            maskedBankAccountNumber,
-            oldBankAccountName,
-            oldMaskedBankAccountNumber,
-        }: {
-            bankAccountName: string;
-            maskedBankAccountNumber: string;
-            oldBankAccountName: string;
-            oldMaskedBankAccountNumber: string;
-        }) =>
-            `de standaard zakelijke bankrekening gewijzigd naar "${bankAccountName ? `${bankAccountName}: ` : ''}${maskedBankAccountNumber}" (voorheen "${oldBankAccountName ? `${oldBankAccountName}: ` : ''}${oldMaskedBankAccountNumber}")`,
-        changedInvoiceCompanyName: ({newValue, oldValue}: {newValue: string; oldValue?: string}) =>
-            oldValue ? `heeft de bedrijfsnaam op de factuur gewijzigd naar "${newValue}" (voorheen "${oldValue}")` : `stel de bedrijfsnaam van de factuur in op "${newValue}"`,
-        changedInvoiceCompanyWebsite: ({newValue, oldValue}: {newValue: string; oldValue?: string}) =>
-            oldValue ? `heeft de bedrijfswebsite op de factuur gewijzigd naar "${newValue}" (voorheen "${oldValue}")` : `stel de bedrijfswebsite van de factuur in op "${newValue}"`,
-        changedReimburser: ({newReimburser, previousReimburser}: UpdatedPolicyReimburserParams) =>
-            previousReimburser
-                ? `heeft de gemachtigde betaler gewijzigd in "${newReimburser}" (voorheen "${previousReimburser}")`
-                : `heeft de gemachtigde betaler gewijzigd in "${newReimburser}"`,
-        setReceiptRequiredAmount: ({newValue}: UpdatedPolicyFieldWithNewAndOldValueParams) => `stel het vereiste bonbedrag in op "${newValue}"`,
-        changedReceiptRequiredAmount: ({oldValue, newValue}: UpdatedPolicyFieldWithNewAndOldValueParams) =>
-            `heeft het vereiste bonbedrag gewijzigd naar "${newValue}" (voorheen "${oldValue}")`,
-        removedReceiptRequiredAmount: ({oldValue}: UpdatedPolicyFieldWithNewAndOldValueParams) => `vereiste bedrag op verwijderde bon (voorheen “${oldValue}”)`,
-        setMaxExpenseAmount: ({newValue}: UpdatedPolicyFieldWithNewAndOldValueParams) => `maximumbedrag voor uitgave instellen op "${newValue}"`,
-        changedMaxExpenseAmount: ({oldValue, newValue}: UpdatedPolicyFieldWithNewAndOldValueParams) => `maximale onkostensom gewijzigd naar "${newValue}" (voorheen "${oldValue}")`,
-        removedMaxExpenseAmount: ({oldValue}: UpdatedPolicyFieldWithNewAndOldValueParams) => `maximaal bedrag voor uitgave verwijderd (voorheen "${oldValue}")`,
-        setMaxExpenseAge: ({newValue}: UpdatedPolicyFieldWithNewAndOldValueParams) => `stel maximale leeftijd uitgave in op "${newValue}" dagen`,
-        changedMaxExpenseAge: ({oldValue, newValue}: UpdatedPolicyFieldWithNewAndOldValueParams) => `maximale uitgaafleeftijd gewijzigd naar "${newValue}" dagen (voorheen "${oldValue}")`,
-        removedMaxExpenseAge: ({oldValue}: UpdatedPolicyFieldWithNewAndOldValueParams) => `maximale onkostendatum verwijderd (voorheen "${oldValue}" dagen)`,
     },
     roomMembersPage: {
         memberNotFound: 'Lid niet gevonden.',
@@ -6830,7 +6772,7 @@ Vraag verplichte uitgavedetails zoals bonnetjes en beschrijvingen, stel limieten
             amount: {
                 lessThan: ({amount}: OptionalParam<RequestAmountParams> = {}) => `Minder dan ${amount ?? ''}`,
                 greaterThan: ({amount}: OptionalParam<RequestAmountParams> = {}) => `Groter dan ${amount ?? ''}`,
-                between: (greaterThan: string, lessThan: string) => `Tussen ${greaterThan} en ${lessThan}`,
+                between: ({greaterThan, lessThan}: FiltersAmountBetweenParams) => `Tussen ${greaterThan} en ${lessThan}`,
                 equalTo: ({amount}: OptionalParam<RequestAmountParams> = {}) => `Gelijk aan ${amount ?? ''}`,
             },
             card: {
@@ -7259,7 +7201,6 @@ Vraag verplichte uitgavedetails zoals bonnetjes en beschrijvingen, stel limieten
         maxAge: ({maxAge}: ViolationsMaxAgeParams) => `Datum ouder dan ${maxAge} dagen`,
         missingCategory: 'Ontbrekende categorie',
         missingComment: 'Beschrijving vereist voor geselecteerde categorie',
-        missingAttendees: 'Meerdere deelnemers vereist voor deze categorie',
         missingTag: ({tagName}: ViolationsMissingTagParams = {}) => `Ontbreekt ${tagName ?? 'label'}`,
         modifiedAmount: ({type, displayPercentVariance}: ViolationsModifiedAmountParams) => {
             switch (type) {
@@ -7367,7 +7308,6 @@ Vraag verplichte uitgavedetails zoals bonnetjes en beschrijvingen, stel limieten
         hold: 'Deze uitgave is in de wacht gezet',
         resolvedDuplicates: 'het duplicaat opgelost',
         companyCardRequired: 'Aankopen met bedrijfskaart verplicht',
-        noRoute: 'Selecteer een geldig adres',
     },
     reportViolations: {
         [CONST.REPORT_VIOLATIONS.FIELD_REQUIRED]: ({fieldName}: RequiredFieldParams) => `${fieldName} is verplicht`,
@@ -7991,18 +7931,9 @@ Hier is een *testbon* om je te laten zien hoe het werkt:`,
             addAdminError: 'Kan dit lid niet als beheerder toevoegen. Probeer het opnieuw.',
             revokeAdminAccess: 'Beheerdersrechten intrekken',
             cantRevokeAdminAccess: 'Kan de beheerdersrechten niet intrekken van de technische contactpersoon',
-            error: {
-                removeAdmin: 'Kan deze gebruiker niet als beheerder verwijderen. Probeer het opnieuw.',
-                removeDomain: 'Kan dit domein niet verwijderen. Probeer het opnieuw.',
-                removeDomainNameInvalid: 'Voer uw domeinnaam in om deze opnieuw in te stellen.',
-            },
-            resetDomain: 'Domein resetten',
-            resetDomainExplanation: ({domainName}: {domainName?: string}) => `Typ hier <strong>${domainName}</strong> om het resetten van het domein te bevestigen.`,
-            enterDomainName: 'Voer hier uw domeinnaam in',
-            resetDomainInfo: `Deze actie is <strong>definitief</strong> en de volgende gegevens worden verwijderd: <br/> <ul><li>Bedrijfskaartverbindingen en niet-ingediende uitgaven van die kaarten</li> <li>SAML- en groepsinstellingen</li> </ul> Alle accounts, werkruimten, rapporten, uitgaven en andere gegevens blijven behouden. <br/><br/>Opmerking: je kunt dit domein uit je domeinenlijst verwijderen door het gekoppelde e-mailadres uit je <a href="#">contactmethoden</a> te verwijderen.`,
+            error: {removeAdmin: 'Kan deze gebruiker niet als beheerder verwijderen. Probeer het opnieuw.'},
         },
         members: {title: 'Leden', findMember: 'Lid zoeken'},
-        domainAdmins: 'Domeinbeheerders',
     },
     gps: {
         tooltip: 'GPS-tracking bezig! Als je klaar bent, stop dan hieronder met tracken.',
@@ -8025,6 +7956,7 @@ Hier is een *testbon* om je te laten zien hoe het werkt:`,
             confirm: 'Afstandstracking negeren',
         },
         zeroDistanceTripModal: {title: 'Kan geen uitgave aanmaken', prompt: 'Je kunt geen uitgave aanmaken met dezelfde begin- en eindlocatie.'},
+
         locationRequiredModal: {
             title: 'Locatietoegang vereist',
             prompt: 'Sta locatietoegang toe in de instellingen van je apparaat om GPS-afstandsregistratie te starten.',
@@ -8036,13 +7968,6 @@ Hier is een *testbon* om je te laten zien hoe het werkt:`,
         },
         preciseLocationRequiredModal: {title: 'Precieze locatie vereist', prompt: 'Schakel "precieze locatie" in de instellingen van je apparaat in om GPS-afstandsregistratie te starten.'},
         desktop: {title: 'Volg afstand op je telefoon', subtitle: 'Leg kilometers of mijlen automatisch vast met GPS en zet ritten direct om in uitgaven.', button: 'Download de app'},
-        notification: {title: 'GPS-tracking bezig', body: 'Ga naar de app om te voltooien'},
-        locationServicesRequiredModal: {
-            title: 'Locatietoegang vereist',
-            confirm: 'Instellingen openen',
-            prompt: 'Sta locatietoegang toe in de instellingen van je apparaat om het bijhouden van GPS-afstand te starten.',
-        },
-        fabGpsTripExplained: 'Ga naar GPS-scherm (Zwevende actie)',
     },
 };
 // IMPORTANT: This line is manually replaced in generate translation files by scripts/generateTranslations.ts,
diff --git a/src/languages/params.ts b/src/languages/params.ts
index 8315e3025da7..a188c3263caa 100644
--- a/src/languages/params.ts
+++ b/src/languages/params.ts
@@ -5,11 +5,6 @@ import type {DelegateRole} from '@src/types/onyx/Account';
 import type {AllConnectionName, ConnectionName, PolicyConnectionSyncStage, SageIntacctMappingName} from '@src/types/onyx/Policy';
 import type {ViolationDataType} from '@src/types/onyx/TransactionViolation';
 
-type MultifactorAuthenticationTranslationParams = {
-    authType?: string;
-    registered?: boolean;
-};
-
 type ZipCodeExampleFormatParams = {
     zipSampleFormat: string;
 };
@@ -22,6 +17,10 @@ type WelcomeEnterMagicCodeParams = {
     login: string;
 };
 
+type GoBackMessageParams = {
+    provider: string;
+};
+
 type LocalTimeParams = {
     user: string;
     time: string;
@@ -80,6 +79,11 @@ type ReportArchiveReasonsInvoiceReceiverPolicyDeletedParams = {
     policyName: string;
 };
 
+type HarvestCreatedExpenseReportParams = {
+    reportUrl: string;
+    reportName: string;
+};
+
 type CreatedReportForUnapprovedTransactionsParams = {
     reportUrl: string;
     reportName: string;
@@ -153,6 +157,8 @@ type NotAllowedExtensionParams = {allowedExtensions: string[]};
 
 type TransferParams = {amount: string};
 
+type InstantSummaryParams = {rate: string; minAmount: string};
+
 type NotYouParams = {user: string};
 
 type WeSentYouMagicSignInLinkParams = {login: string; loginType: string};
@@ -193,6 +199,8 @@ type UpdatedTheRequestParams = {valueName: string; newValueToDisplay: string; ol
 
 type UpdatedTheDistanceMerchantParams = {translatedChangedField: string; newMerchant: string; oldMerchant: string; newAmountToDisplay: string; oldAmountToDisplay: string};
 
+type FormattedMaxLengthParams = {formattedMaxLength: string};
+
 type WalletProgramParams = {walletProgram: string};
 
 type ViolationsCashExpenseWithNoReceiptParams = {formattedLimit?: string} | undefined;
@@ -312,8 +320,6 @@ type UpdatedPolicyManualApprovalThresholdParams = {oldLimit: string; newLimit: s
 
 type UpdatedPolicyReimbursementEnabledParams = {enabled: boolean};
 
-type UpdatedPolicyReimburserParams = {newReimburser: string; previousReimburser?: string};
-
 type ExportedToIntegrationParams = {label: string; markedManually?: boolean; inProgress?: boolean; lastModified?: string};
 
 type IntegrationsMessageParams = {
@@ -377,6 +383,8 @@ type LeftWorkspaceParams = {nameOrEmail: string};
 
 type RemoveMemberParams = {email: string; role: string};
 
+type FiltersAmountBetweenParams = {greaterThan: string; lessThan: string};
+
 type StatementPageTitleParams = {year: string | number; monthName: string};
 
 type DisconnectPromptParams = {currentIntegration?: ConnectionName} | undefined;
@@ -423,10 +431,14 @@ type SubscriptionSettingsLearnMoreParams = {hasAdminsRoom: boolean};
 
 type UnapproveWithIntegrationWarningParams = {accountingIntegration: string};
 
+type IncorrectZipFormatParams = {zipFormat?: string} | undefined;
+
 type ExportIntegrationSelectedParams = {connectionName: ConnectionName};
 
 type RequiredFieldParams = {fieldName: string};
 
+type ImportFieldParams = {importField: string};
+
 type IntacctMappingTitleParams = {mappingName: SageIntacctMappingName};
 
 type LastSyncAccountingParams = {relativeDate: string};
@@ -441,6 +453,18 @@ type SubmittedToVacationDelegateParams = {submittedToName: string; vacationDeleg
 
 type RoleNamesParams = {role: string};
 
+type SpreadSheetColumnParams = {
+    name: string;
+};
+
+type SpreadFieldNameParams = {
+    fieldName: string;
+};
+
+type SpreadCategoriesParams = {
+    categories: number;
+};
+
 type RemovedFromApprovalWorkflowParams = {
     submittersNames: string[];
 };
@@ -464,6 +488,27 @@ type InvalidValueParams = {
     expectedValues: string;
 };
 
+type ImportTagsSuccessfulDescriptionParams = {
+    tags: number;
+};
+
+type ImportedTagsMessageParams = {
+    columnCounts: number;
+};
+
+type ImportMembersSuccessfulDescriptionParams = {
+    added: number;
+    updated: number;
+};
+
+type ImportPerDiemRatesSuccessfulDescriptionParams = {
+    rates: number;
+};
+
+type ImportedTypesParams = {
+    importedTypes: string[];
+};
+
 type WorkspaceYouMayJoin = {
     domain: string;
     email: string;
@@ -482,6 +527,14 @@ type WorkspaceMemberList = {
     policyOwner: string;
 };
 
+type FileLimitParams = {
+    fileLimit: number;
+};
+
+type FileTypeParams = {
+    fileType: string;
+};
+
 type WorkspaceLockedPlanTypeParams = {
     count: number;
     annualSubscriptionEndDate: string;
@@ -496,6 +549,10 @@ type CustomUnitRateParams = {
     rate: number;
 };
 
+type FlightLayoverParams = {
+    layover: string;
+};
+
 type SubmitsToParams = {
     name: string;
 };
@@ -536,6 +593,14 @@ type TotalAmountGreaterOrLessThanOriginalParams = {
     amount: string;
 };
 
+type FlightParams = {
+    startDate: string;
+    airlineCode: string;
+    origin: string;
+    destination: string;
+    confirmationID?: string;
+};
+
 type RailTicketParams = {
     origin: string;
     destination: string;
@@ -576,6 +641,11 @@ type WorkspaceUpgradeNoteParams = {
 
 type WorkflowSettingsParam = {workflowSettingLink: string};
 
+type IndividualExpenseRulesSubtitleParams = {
+    categoriesPageLink: string;
+    tagsPageLink: string;
+};
+
 type WorkspaceShareNoteParams = {
     adminsRoomLink: string;
 };
@@ -621,6 +691,10 @@ type ToggleImportTitleParams = {
     mappingTitle: string;
 };
 
+type FocusModeUpdateParams = {
+    priorityModePageUrl: string;
+};
+
 type RoutedDueToDEWParams = {
     to: string;
 };
@@ -632,19 +706,29 @@ export type {
     SplitExpenseSubtitleParams,
     SplitDateRangeParams,
     TotalAmountGreaterOrLessThanOriginalParams,
+    ImportMembersSuccessfulDescriptionParams,
+    ImportedTagsMessageParams,
+    ImportTagsSuccessfulDescriptionParams,
     MissingPropertyParams,
     InvalidPropertyParams,
     InvalidValueParams,
     IntegrationExportParams,
     RemovedFromApprovalWorkflowParams,
+    FileLimitParams,
+    FileTypeParams,
+    SpreadSheetColumnParams,
+    SpreadFieldNameParams,
+    SpreadCategoriesParams,
     DelegateRoleParams,
     VacationDelegateParams,
     LastSyncAccountingParams,
     SyncStageNameConnectionsParams,
     RequiredFieldParams,
     IntacctMappingTitleParams,
+    ImportFieldParams,
     ExportIntegrationSelectedParams,
     UnapproveWithIntegrationWarningParams,
+    IncorrectZipFormatParams,
     YourPlanPriceParams,
     SubscriptionSizeParams,
     SubscriptionCommitmentParams,
@@ -665,9 +749,12 @@ export type {
     DeleteActionParams,
     DeleteConfirmationParams,
     EditActionParams,
+    FormattedMaxLengthParams,
+    GoBackMessageParams,
     SubmittedToVacationDelegateParams,
     LearnMoreRouteParams,
     HeldRequestParams,
+    InstantSummaryParams,
     IssueVirtualCardParams,
     LocalTimeParams,
     LogSizeParams,
@@ -694,6 +781,7 @@ export type {
     ReportArchiveReasonsMergedParams,
     ReportPolicyNameParams,
     ReportArchiveReasonsInvoiceReceiverPolicyDeletedParams,
+    HarvestCreatedExpenseReportParams,
     CreatedReportForUnapprovedTransactionsParams,
     ReportArchiveReasonsRemovedFromPolicyParams,
     RequestAmountParams,
@@ -759,12 +847,15 @@ export type {
     UpdatedCustomFieldParams,
     LeftWorkspaceParams,
     RemoveMemberParams,
+    FiltersAmountBetweenParams,
     StatementPageTitleParams,
     DisconnectPromptParams,
     DisconnectTitleParams,
     OptionalParam,
+    ImportedTypesParams,
     WorkspaceYouMayJoin,
     WorkspaceMemberList,
+    ImportPerDiemRatesSuccessfulDescriptionParams,
     WorkspaceLockedPlanTypeParams,
     CustomUnitRateParams,
     UpdatedPolicyCurrencyParams,
@@ -776,6 +867,7 @@ export type {
     UpdatedPolicyFieldWithNewAndOldValueParams,
     UpdatedPolicyFieldWithValueParam,
     UpdatedPolicyDescriptionParams,
+    FlightLayoverParams,
     WorkEmailResendCodeParams,
     WorkEmailMergingBlockedParams,
     NewWorkspaceNameParams,
@@ -799,7 +891,6 @@ export type {
     UpdatedPolicyAuditRateParams,
     UpdatedPolicyManualApprovalThresholdParams,
     UpdatedPolicyReimbursementEnabledParams,
-    UpdatedPolicyReimburserParams,
     UpdatePolicyCustomUnitTaxEnabledParams,
     UpdatePolicyCustomUnitParams,
     UpdatedPolicyApprovalRuleParams,
@@ -810,6 +901,7 @@ export type {
     SubscriptionSettingsSummaryParams,
     ReviewParams,
     WorkspaceMembersCountParams,
+    FlightParams,
     RailTicketParams,
     TravelTypeParams,
     PhoneErrorRouteParams,
@@ -823,6 +915,7 @@ export type {
     WorkspaceUpgradeNoteParams,
     WorkflowSettingsParam,
     MovedActionParams,
+    IndividualExpenseRulesSubtitleParams,
     WorkspaceShareNoteParams,
     RulesEnableWorkflowsParams,
     UpgradeSuccessMessageParams,
@@ -834,7 +927,7 @@ export type {
     MergeAccountIntoParams,
     NextStepParams,
     ReportFieldParams,
+    FocusModeUpdateParams,
     RoutedDueToDEWParams,
     UpdatedPolicyCustomUnitRateEnabledParams,
-    MultifactorAuthenticationTranslationParams,
 };
diff --git a/src/languages/pl.ts b/src/languages/pl.ts
index cc7e3d91b67e..ab204c691bc9 100644
--- a/src/languages/pl.ts
+++ b/src/languages/pl.ts
@@ -28,6 +28,24 @@ import type {
     EditActionParams,
     ExportAgainModalDescriptionParams,
     ExportIntegrationSelectedParams,
+    FileLimitParams,
+    FileTypeParams,
+    FiltersAmountBetweenParams,
+    FlightLayoverParams,
+    FlightParams,
+    FocusModeUpdateParams,
+    FormattedMaxLengthParams,
+    GoBackMessageParams,
+    HarvestCreatedExpenseReportParams,
+    ImportedTagsMessageParams,
+    ImportedTypesParams,
+    ImportFieldParams,
+    ImportMembersSuccessfulDescriptionParams,
+    ImportPerDiemRatesSuccessfulDescriptionParams,
+    ImportTagsSuccessfulDescriptionParams,
+    IncorrectZipFormatParams,
+    IndividualExpenseRulesSubtitleParams,
+    InstantSummaryParams,
     IntacctMappingTitleParams,
     IntegrationExportParams,
     IntegrationSyncFailedParams,
@@ -115,6 +133,9 @@ import type {
     SplitDateRangeParams,
     SplitExpenseEditTitleParams,
     SplitExpenseSubtitleParams,
+    SpreadCategoriesParams,
+    SpreadFieldNameParams,
+    SpreadSheetColumnParams,
     StatementTitleParams,
     StepCounterParams,
     StripePaidParams,
@@ -164,7 +185,6 @@ import type {
     UpdatedPolicyManualApprovalThresholdParams,
     UpdatedPolicyPreventSelfApprovalParams,
     UpdatedPolicyReimbursementEnabledParams,
-    UpdatedPolicyReimburserParams,
     UpdatedPolicyReportFieldDefaultValueParams,
     UpdatedPolicyTagFieldParams,
     UpdatedPolicyTagNameParams,
@@ -259,6 +279,7 @@ const translations: TranslationDeepObject<typeof en> = {
         searchWithThreeDots: 'Szukaj...',
         next: 'Dalej',
         previous: 'Wstecz',
+        // @context Navigation button that returns the user to the previous screen. Should be interpreted as a UI action label.
         goBack: 'Wróć',
         create: 'Utwórz',
         add: 'Dodaj',
@@ -276,7 +297,6 @@ const translations: TranslationDeepObject<typeof en> = {
         zoom: 'Zoom',
         password: 'Hasło',
         magicCode: 'Kod magiczny',
-        digits: 'cyfr',
         twoFactorCode: 'Kod dwuskładnikowy',
         workspaces: 'Przestrzenie robocze',
         inbox: 'Skrzynka odbiorcza',
@@ -533,6 +553,10 @@ const translations: TranslationDeepObject<typeof en> = {
         value: 'Wartość',
         downloadFailedTitle: 'Pobieranie nie powiodło się',
         downloadFailedDescription: 'Nie udało się zakończyć pobierania. Spróbuj ponownie później.',
+        downloadFailedEmptyReportDescription: () => ({
+            one: 'Nie możesz eksportować pustego raportu.',
+            other: () => 'Nie możesz eksportować pustych raportów.',
+        }),
         filterLogs: 'Filtruj logi',
         network: 'Sieć',
         reportID: 'ID raportu',
@@ -628,6 +652,7 @@ const translations: TranslationDeepObject<typeof en> = {
         copyToClipboard: 'Kopiuj do schowka',
         thisIsTakingLongerThanExpected: 'To trwa dłużej, niż się spodziewaliśmy…',
         domains: 'Domeny',
+        viewReport: 'Wyświetl raport',
         actionRequired: 'Wymagane działanie',
         duplicate: 'Duplikat',
         duplicated: 'Zduplikowano',
@@ -688,12 +713,12 @@ const translations: TranslationDeepObject<typeof en> = {
         protectedPDFNotSupported: 'Plik PDF zabezpieczony hasłem nie jest obsługiwany',
         attachmentImageResized: 'Ten obraz został zmniejszony na potrzeby podglądu. Pobierz go, aby zobaczyć w pełnej rozdzielczości.',
         attachmentImageTooLarge: 'Ten obraz jest zbyt duży, aby wyświetlić podgląd przed przesłaniem.',
-        tooManyFiles: (fileLimit: number) => `Możesz przesłać jednocześnie maksymalnie ${fileLimit} plików.`,
+        tooManyFiles: ({fileLimit}: FileLimitParams) => `Możesz przesłać jednocześnie maksymalnie ${fileLimit} plików.`,
         sizeExceededWithValue: ({maxUploadSizeInMB}: SizeExceededParams) => `Plik przekracza ${maxUploadSizeInMB} MB. Spróbuj ponownie.`,
         someFilesCantBeUploaded: 'Niektórych plików nie można przesłać',
         sizeLimitExceeded: ({maxUploadSizeInMB}: SizeExceededParams) => `Pliki muszą mieć mniej niż ${maxUploadSizeInMB} MB. Większe pliki nie zostaną przesłane.`,
         maxFileLimitExceeded: 'Możesz jednorazowo przesłać maksymalnie 30 paragonów. Dodatkowe nie zostaną przesłane.',
-        unsupportedFileType: (fileType: string) => `Pliki ${fileType} nie są obsługiwane. Przesłane zostaną tylko obsługiwane typy plików.`,
+        unsupportedFileType: ({fileType}: FileTypeParams) => `Pliki ${fileType} nie są obsługiwane. Przesłane zostaną tylko obsługiwane typy plików.`,
         learnMoreAboutSupportedFiles: 'Dowiedz się więcej o obsługiwanych formatach.',
         passwordProtected: 'Pliki PDF zabezpieczone hasłem nie są obsługiwane. Zostaną przesłane tylko obsługiwane pliki.',
     },
@@ -718,8 +743,8 @@ const translations: TranslationDeepObject<typeof en> = {
     composer: {
         noExtensionFoundForMimeType: 'Nie znaleziono rozszerzenia dla typu MIME',
         problemGettingImageYouPasted: 'Wystąpił problem z pobraniem wklejonego obrazu',
-        commentExceededMaxLength: (formattedMaxLength: string) => `Maksymalna długość komentarza to ${formattedMaxLength} znaków.`,
-        taskTitleExceededMaxLength: (formattedMaxLength: string) => `Maksymalna długość tytułu zadania to ${formattedMaxLength} znaków.`,
+        commentExceededMaxLength: ({formattedMaxLength}: FormattedMaxLengthParams) => `Maksymalna długość komentarza to ${formattedMaxLength} znaków.`,
+        taskTitleExceededMaxLength: ({formattedMaxLength}: FormattedMaxLengthParams) => `Maksymalna długość tytułu zadania to ${formattedMaxLength} znaków.`,
     },
     baseUpdateAppModal: {
         updateApp: 'Zaktualizuj aplikację',
@@ -730,35 +755,6 @@ const translations: TranslationDeepObject<typeof en> = {
         expired: 'Twoja sesja wygasła.',
         signIn: 'Zaloguj się ponownie.',
     },
-    multifactorAuthentication: {
-        biometricsTest: {
-            biometricsTest: 'Test biometryczny',
-            authenticationSuccessful: 'Autentykacja zakończona sukcesem',
-            successfullyAuthenticatedUsing: ({authType}) => `Pomyślnie uwierzytelniono za pomocą ${authType}.`,
-            troubleshootBiometricsStatus: ({registered}) => `Biometria (${registered ? 'Zarejestrowana' : 'Nie zarejestrowana'})`,
-            yourAttemptWasUnsuccessful: 'Twoja próba autentykacji była nieudana.',
-            youCouldNotBeAuthenticated: 'Nie udało się uwierzytelnić',
-            areYouSureToReject: 'Czy jesteś pewien? Próba autentykacji zostanie odrzucona, jeśli zamkniesz ten ekran.',
-            rejectAuthentication: 'Odrzuć autentykację',
-            test: 'Test',
-            biometricsAuthentication: 'Autentykacja biometryczna',
-        },
-        pleaseEnableInSystemSettings: {
-            start: 'Włącz weryfikację twarzy/odcisku palca lub ustaw kod dostępu do urządzenia w ',
-            link: 'ustawieniach systemowych',
-            end: '.',
-        },
-        oops: 'Ups, coś poszło nie tak',
-        looksLikeYouRanOutOfTime: 'Wygląda na to, że zabrakło ci czasu! Spróbuj ponownie u sprzedawcy.',
-        youRanOutOfTime: 'Czas minął',
-        letsVerifyItsYou: 'Sprawdźmy, czy to ty',
-        verifyYourself: {
-            biometrics: 'Zweryfikuj się za pomocą twarzy lub odcisku palca',
-        },
-        enableQuickVerification: {
-            biometrics: 'Włącz szybką i bezpieczną weryfikację za pomocą twarzy lub odcisku palca. Bez haseł ani kodów.',
-        },
-    },
     validateCodeModal: {
         successfulSignInTitle: dedent(`
             Abrakadabra,
@@ -927,7 +923,7 @@ const translations: TranslationDeepObject<typeof en> = {
     adminOnlyCanPost: 'Tylko administratorzy mogą wysyłać wiadomości w tym pokoju.',
     reportAction: {
         asCopilot: 'jako kopilot dla',
-        harvestCreatedExpenseReport: (reportUrl: string, reportName: string) =>
+        harvestCreatedExpenseReport: ({reportUrl, reportName}: HarvestCreatedExpenseReportParams) =>
             `utworzył ten raport, aby zawrzeć wszystkie wydatki z <a href="${reportUrl}">${reportName}</a>, które nie mogły zostać przesłane zgodnie z wybraną przez ciebie częstotliwością`,
         createdReportForUnapprovedTransactions: ({reportUrl, reportName}: CreatedReportForUnapprovedTransactionsParams) =>
             `utworzył ten raport dla wszystkich wstrzymanych wydatków z <a href="${reportUrl}">${reportName}</a>`,
@@ -970,7 +966,7 @@ const translations: TranslationDeepObject<typeof en> = {
         buttonFind: 'Znajdź coś...',
         buttonMySettings: 'Moje ustawienia',
         fabNewChat: 'Rozpocznij czat',
-        fabNewChatExplained: 'Otwórz menu akcji',
+        fabNewChatExplained: 'Rozpocznij czat (Akcja pływająca)',
         fabScanReceiptExplained: 'Zeskanuj paragon (Akcja pływająca)',
         chatPinned: 'Czat przypięty',
         draftedMessage: 'Wiadomość robocza',
@@ -996,13 +992,13 @@ const translations: TranslationDeepObject<typeof en> = {
         chooseSpreadsheet: '<muted-link>Wybierz plik arkusza kalkulacyjnego do zaimportowania. Obsługiwane formaty: .csv, .txt, .xls i .xlsx.</muted-link>',
         chooseSpreadsheetMultiLevelTag: `<muted-link>Wybierz plik arkusza kalkulacyjnego do zaimportowania. <a href="${CONST.IMPORT_SPREADSHEET.MULTI_LEVEL_TAGS_ARTICLE_LINK}">Dowiedz się więcej</a> o obsługiwanych formatach plików.</muted-link>`,
         fileContainsHeader: 'Plik zawiera nagłówki kolumn',
-        column: (name: string) => `Kolumna ${name}`,
-        fieldNotMapped: (fieldName: string) => `Ups! Wymagane pole („${fieldName}”) nie zostało zmapowane. Sprawdź wszystko i spróbuj ponownie.`,
-        singleFieldMultipleColumns: (fieldName: string) => `Ups! Przypisałeś jedno pole („${fieldName}”) do wielu kolumn. Sprawdź ustawienia i spróbuj ponownie.`,
-        emptyMappedField: (fieldName: string) => `Ups! Pole („${fieldName}”) zawiera jedną lub więcej pustych wartości. Sprawdź je i spróbuj ponownie.`,
+        column: ({name}: SpreadSheetColumnParams) => `Kolumna ${name}`,
+        fieldNotMapped: ({fieldName}: SpreadFieldNameParams) => `Ups! Wymagane pole („${fieldName}”) nie zostało zmapowane. Sprawdź wszystko i spróbuj ponownie.`,
+        singleFieldMultipleColumns: ({fieldName}: SpreadFieldNameParams) => `Ups! Przypisałeś jedno pole („${fieldName}”) do wielu kolumn. Sprawdź ustawienia i spróbuj ponownie.`,
+        emptyMappedField: ({fieldName}: SpreadFieldNameParams) => `Ups! Pole („${fieldName}”) zawiera jedną lub więcej pustych wartości. Sprawdź je i spróbuj ponownie.`,
         importSuccessfulTitle: 'Import zakończony pomyślnie',
-        importCategoriesSuccessfulDescription: ({categories}: {categories: number}) => (categories > 1 ? `Dodano ${categories} kategorii.` : 'Dodano 1 kategorię.'),
-        importMembersSuccessfulDescription: ({added, updated}: {added: number; updated: number}) => {
+        importCategoriesSuccessfulDescription: ({categories}: SpreadCategoriesParams) => (categories > 1 ? `Dodano ${categories} kategorii.` : 'Dodano 1 kategorię.'),
+        importMembersSuccessfulDescription: ({added, updated}: ImportMembersSuccessfulDescriptionParams) => {
             if (!added && !updated) {
                 return 'Nie dodano ani nie zaktualizowano żadnych członków.';
             }
@@ -1014,9 +1010,9 @@ const translations: TranslationDeepObject<typeof en> = {
             }
             return added > 1 ? `Dodano ${added} członków.` : 'Dodano 1 członka.';
         },
-        importTagsSuccessfulDescription: ({tags}: {tags: number}) => (tags > 1 ? `Dodano ${tags} tagów.` : 'Dodano 1 tag.'),
+        importTagsSuccessfulDescription: ({tags}: ImportTagsSuccessfulDescriptionParams) => (tags > 1 ? `Dodano ${tags} tagów.` : 'Dodano 1 tag.'),
         importMultiLevelTagsSuccessfulDescription: 'Dodano tagi wielopoziomowe.',
-        importPerDiemRatesSuccessfulDescription: ({rates}: {rates: number}) => (rates > 1 ? `Dodano ${rates} stawek ryczałtowych.` : 'Dodano 1 stawkę diety.'),
+        importPerDiemRatesSuccessfulDescription: ({rates}: ImportPerDiemRatesSuccessfulDescriptionParams) => (rates > 1 ? `Dodano ${rates} stawek ryczałtowych.` : 'Dodano 1 stawkę diety.'),
         importFailedTitle: 'Import zakończony niepowodzeniem',
         importFailedDescription: 'Upewnij się, że wszystkie pola zostały wypełnione poprawnie i spróbuj ponownie. Jeśli problem będzie się powtarzał, skontaktuj się z Concierge.',
         importDescription: 'Wybierz pola do zmapowania z arkusza kalkulacyjnego, klikając menu rozwijane obok każdej zaimportowanej kolumny poniżej.',
@@ -1196,9 +1192,15 @@ const translations: TranslationDeepObject<typeof en> = {
             one: 'Czy na pewno chcesz usunąć ten wydatek?',
             other: 'Czy na pewno chcesz usunąć te wydatki?',
         }),
-        deleteReport: 'Usuń raport',
-        deleteReportConfirmation: 'Czy na pewno chcesz usunąć ten raport?',
-        settledExpensify: 'Opłacone',
+        deleteReport: () => ({
+            one: 'Usuń raport',
+            other: 'Usuń raporty',
+        }),
+        deleteReportConfirmation: () => ({
+            one: 'Czy na pewno chcesz usunąć ten raport?',
+            other: 'Czy na pewno chcesz usunąć te raporty?',
+        }),
+        settledExpensify: 'Zapłacono',
         done: 'Gotowe',
         settledElsewhere: 'Opłacone gdzie indziej',
         individual: 'Indywidualny',
@@ -1446,8 +1448,9 @@ const translations: TranslationDeepObject<typeof en> = {
         moveExpensesError: 'Nie możesz przenosić wydatków do raportów w innych obszarach roboczych, ponieważ stawki diety mogą się różnić między obszarami roboczymi.',
         changeApprover: {
             title: 'Zmień akceptującego',
-            header: ({workflowSettingLink}: WorkflowSettingsParam) =>
-                `Wybierz opcję, aby zmienić osobę zatwierdzającą ten raport. (Zaktualizuj swoje <a href="${workflowSettingLink}">ustawienia przestrzeni roboczej</a>, aby na stałe zmienić osobę zatwierdzającą dla wszystkich raportów.)`,
+            subtitle: 'Wybierz opcję, aby zmienić osobę zatwierdzającą ten raport.',
+            description: ({workflowSettingLink}: WorkflowSettingsParam) =>
+                `Możesz także na stałe zmienić osobę zatwierdzającą dla wszystkich raportów w swoich <a href="${workflowSettingLink}">ustawieniach przepływu pracy</a>.`,
             changedApproverMessage: (managerID: number) => `zmieniono zatwierdzającego na <mention-user accountID="${managerID}"/>`,
             actions: {
                 addApprover: 'Dodaj osobę zatwierdzającą',
@@ -1465,13 +1468,7 @@ const translations: TranslationDeepObject<typeof en> = {
         splitDateRange: ({startDate, endDate, count}: SplitDateRangeParams) => `${startDate} do ${endDate} (${count} dni)`,
         splitByDate: 'Podziel według daty',
         routedDueToDEW: ({to}: RoutedDueToDEWParams) => `raport przekazany do ${to} z powodu niestandardowego procesu zatwierdzania`,
-        timeTracking: {
-            hoursAt: (hours: number, rate: string) => `${hours} ${hours === 1 ? 'godzina' : 'godziny'} @ ${rate} / godzinę`,
-            hrs: 'godz.',
-            hours: 'Godziny',
-            ratePreview: (rate: string) => `${rate} / godzina`,
-            amountTooLargeError: 'Całkowita kwota jest zbyt wysoka. Zmniejsz liczbę godzin lub obniż stawkę.',
-        },
+        timeTracking: {hoursAt: (hours: number, rate: string) => `${hours} ${hours === 1 ? 'godzina' : 'godziny'} @ ${rate} / godzinę`, hrs: 'godz.'},
     },
     transactionMerge: {
         listPage: {
@@ -1948,6 +1945,13 @@ const translations: TranslationDeepObject<typeof en> = {
         chatToConciergeToUnlock: 'Porozmawiaj z Concierge, aby rozwiązać problemy z bezpieczeństwem i odblokować swoje konto.',
         chatWithConcierge: 'Czat z Concierge',
     },
+    passwordPage: {
+        changePassword: 'Zmień hasło',
+        changingYourPasswordPrompt: 'Zmiana hasła zaktualizuje je zarówno dla Twojego konta na Expensify.com, jak i konta w New Expensify.',
+        currentPassword: 'Aktualne hasło',
+        newPassword: 'Nowe hasło',
+        newPasswordPrompt: 'Twoje nowe hasło musi się różnić od starego hasła i zawierać co najmniej 8 znaków, 1 wielką literę, 1 małą literę i 1 cyfrę.',
+    },
     twoFactorAuth: {
         headerTitle: 'Uwierzytelnianie dwuskładnikowe',
         twoFactorAuthEnabled: 'Uwierzytelnianie dwuskładnikowe włączone',
@@ -2342,7 +2346,7 @@ ${amount} dla ${merchant} - ${date}`,
     transferAmountPage: {
         transfer: ({amount}: TransferParams) => `Przelej${amount ? ` ${amount}` : ''}`,
         instant: 'Natychmiastowa (karta debetowa)',
-        instantSummary: (rate: string, minAmount: string) => `Opłata ${rate}% (minimum ${minAmount})`,
+        instantSummary: ({rate, minAmount}: InstantSummaryParams) => `Opłata ${rate}% (minimum ${minAmount})`,
         ach: '1–3 dni robocze (konto bankowe)',
         achSummary: 'Bez opłaty',
         whichAccount: 'Które konto?',
@@ -2377,31 +2381,10 @@ ${amount} dla ${merchant} - ${date}`,
             comment: (value: string) => `Zmień opis na „${value}”`,
             merchant: (value: string) => `Zaktualizuj sprzedawcę na „${value}”`,
             reimbursable: (value: boolean) => `Zaktualizuj wydatek ${value ? 'podlegający zwrotowi' : 'niepodlegający zwrotowi'}`,
-            report: (value: string) => `Dodaj do raportu o nazwie „${value}”`,
+            report: (value: string) => `Dodaj raport o nazwie „${value}”`,
             tag: (value: string) => `Zaktualizuj znacznik na „${value}”`,
             tax: (value: string) => `Zaktualizuj stawkę podatku na ${value}`,
         },
-        newRule: 'Nowa zasada',
-        addRule: {
-            title: 'Dodaj regułę',
-            expenseContains: 'Jeśli wydatek zawiera:',
-            applyUpdates: 'Następnie zastosuj te aktualizacje:',
-            merchantHint: 'Wpisz * , aby utworzyć regułę, która ma zastosowanie do wszystkich sprzedawców',
-            addToReport: 'Dodaj do raportu o nazwie',
-            createReport: 'Utwórz raport, jeśli to konieczne',
-            applyToExistingExpenses: 'Zastosuj do istniejących pasujących wydatków',
-            confirmError: 'Wprowadź sprzedawcę i zastosuj co najmniej jedną zmianę',
-            confirmErrorMerchant: 'Wprowadź sprzedawcę',
-            confirmErrorUpdate: 'Proszę wprowadzić co najmniej jedną zmianę',
-            saveRule: 'Zapisz regułę',
-        },
-        editRule: {title: 'Edytuj regułę'},
-        deleteRule: {
-            deleteSingle: 'Usuń regułę',
-            deleteMultiple: 'Usuń reguły',
-            deleteSinglePrompt: 'Czy na pewno chcesz usunąć tę regułę?',
-            deleteMultiplePrompt: 'Czy na pewno chcesz usunąć te reguły?',
-        },
     },
     preferencesPage: {
         appSection: {
@@ -2897,7 +2880,7 @@ ${
             dateShouldBeBefore: (dateString: string) => `Data powinna być wcześniejsza niż ${dateString}`,
             dateShouldBeAfter: (dateString: string) => `Data powinna być późniejsza niż ${dateString}`,
             hasInvalidCharacter: 'Nazwa może zawierać tylko znaki łacińskie',
-            incorrectZipFormat: (zipFormat?: string) => `Nieprawidłowy format kodu pocztowego${zipFormat ? `Akceptowalny format: ${zipFormat}` : ''}`,
+            incorrectZipFormat: ({zipFormat}: IncorrectZipFormatParams = {}) => `Nieprawidłowy format kodu pocztowego${zipFormat ? `Akceptowalny format: ${zipFormat}` : ''}`,
             invalidPhoneNumber: `Upewnij się, że numer telefonu jest prawidłowy (np. ${CONST.EXAMPLE_PHONE_NUMBER})`,
         },
     },
@@ -2979,7 +2962,7 @@ ${
     },
     focusModeUpdateModal: {
         title: 'Witamy w trybie #focus!',
-        prompt: (priorityModePageUrl: string) =>
+        prompt: ({priorityModePageUrl}: FocusModeUpdateParams) =>
             `Pozostań na bieżąco, wyświetlając tylko nieprzeczytane czaty lub czaty wymagające Twojej uwagi. Nie martw się, możesz to zmienić w dowolnym momencie w <a href="${priorityModePageUrl}">ustawieniach</a>.`,
     },
     notFound: {
@@ -2999,6 +2982,15 @@ ${
         subtitle: 'Twoje żądanie nie mogło zostać zrealizowane. Spróbuj ponownie później.',
         wrongTypeSubtitle: 'To wyszukiwanie jest nieprawidłowe. Spróbuj dostosować kryteria wyszukiwania.',
     },
+    setPasswordPage: {
+        enterPassword: 'Wprowadź hasło',
+        setPassword: 'Ustaw hasło',
+        newPasswordPrompt: 'Twoje hasło musi mieć co najmniej 8 znaków, 1 wielką literę, 1 małą literę i 1 cyfrę.',
+        passwordFormTitle: 'Witamy ponownie w Nowym Expensify! Ustaw swoje hasło.',
+        passwordNotSet: 'Nie udało się ustawić nowego hasła. Wysłaliśmy nowy link do ustawienia hasła, aby spróbować ponownie.',
+        setPasswordLinkInvalid: 'Ten link do ustawienia hasła jest nieprawidłowy lub wygasł. Nowy czeka już w Twojej skrzynce e-mail!',
+        validateAccount: 'Zweryfikuj konto',
+    },
     statusPage: {
         status: 'Status',
         statusExplanation: 'Dodaj emotikon, aby ułatwić współpracownikom i znajomym zorientowanie się, co się dzieje. Opcjonalnie możesz też dodać wiadomość!',
@@ -3140,13 +3132,10 @@ ${
         errorMessageInvalidPhone: `Wprowadź prawidłowy numer telefonu bez nawiasów i myślników. Jeśli jesteś poza USA, dołącz kod kraju (np. ${CONST.EXAMPLE_PHONE_NUMBER}).`,
         errorMessageInvalidEmail: 'Nieprawidłowy adres e-mail',
         userIsAlreadyMember: ({login, name}: UserIsAlreadyMemberParams) => `${login} jest już członkiem ${name}`,
-        userIsAlreadyAnAdmin: ({login, name}: UserIsAlreadyMemberParams) => `${login} jest już administratorem ${name}`,
     },
     onfidoStep: {
         acceptTerms: 'Kontynuując żądanie aktywacji portfela Expensify, potwierdzasz, że przeczytałeś, rozumiesz i akceptujesz',
         facialScan: 'Polityka i zgoda na skan twarzy Onfido',
-        onfidoLinks: (onfidoTitle: string) =>
-            `<muted-text-micro>${onfidoTitle} <a href='${CONST.ONFIDO_FACIAL_SCAN_POLICY_URL}'>Polityka i zgoda na skan twarzy Onfido</a>, <a href='${CONST.ONFIDO_PRIVACY_POLICY_URL}'>Prywatność</a> i <a href='${CONST.ONFIDO_TERMS_OF_SERVICE_URL}'>Warunki korzystania z usługi</a>.</muted-text-micro>`,
         tryAgain: 'Spróbuj ponownie',
         verifyIdentity: 'Zweryfikuj tożsamość',
         letsVerifyIdentity: 'Zweryfikujmy Twoją tożsamość',
@@ -3645,7 +3634,7 @@ ${
         flight: 'Lot',
         flightDetails: {
             passenger: 'Pasażer',
-            layover: (layover: string) => `<muted-text-label>Masz <strong>${layover} międzylądowanie</strong> przed tym lotem</muted-text-label>`,
+            layover: ({layover}: FlightLayoverParams) => `<muted-text-label>Masz <strong>${layover} międzylądowanie</strong> przed tym lotem</muted-text-label>`,
             takeOff: 'Odlot',
             landing: 'Strona startowa',
             seat: 'Miejsce',
@@ -3735,18 +3724,17 @@ ${
             conciergeMessage: ({domain}: {domain: string}) => `Konfigurowanie podróży nie powiodło się dla domeny: ${domain}. Sprawdź i włącz obsługę podróży dla tej domeny.`,
         },
         updates: {
-            bookingTicketed: (airlineCode: string, origin: string, destination: string, startDate: string, confirmationID = '') =>
+            bookingTicketed: ({airlineCode, origin, destination, startDate, confirmationID = ''}: FlightParams) =>
                 `Twój lot ${airlineCode} (${origin} → ${destination}) w dniu ${startDate} został zarezerwowany. Kod potwierdzenia: ${confirmationID}`,
-            ticketVoided: (airlineCode: string, origin: string, destination: string, startDate: string) =>
+            ticketVoided: ({airlineCode, origin, destination, startDate}: FlightParams) =>
                 `Twój bilet na lot ${airlineCode} (${origin} → ${destination}) w dniu ${startDate} został unieważniony.`,
-            ticketRefunded: (airlineCode: string, origin: string, destination: string, startDate: string) =>
+            ticketRefunded: ({airlineCode, origin, destination, startDate}: FlightParams) =>
                 `Twój bilet na lot ${airlineCode} (${origin} → ${destination}) w dniu ${startDate} został zwrócony lub wymieniony.`,
-            flightCancelled: (airlineCode: string, origin: string, destination: string, startDate: string) =>
+            flightCancelled: ({airlineCode, origin, destination, startDate}: FlightParams) =>
                 `Twój lot ${airlineCode} (${origin} → ${destination}) w dniu ${startDate}} został odwołany przez linię lotniczą.`,
             flightScheduleChangePending: (airlineCode: string) => `Linie lotnicze zaproponowały zmianę rozkładu lotu ${airlineCode}; oczekujemy na potwierdzenie.`,
             flightScheduleChangeClosed: (airlineCode: string, startDate?: string) => `Zmiana planu potwierdzona: lot ${airlineCode} odlot teraz o ${startDate}.`,
-            flightUpdated: (airlineCode: string, origin: string, destination: string, startDate: string) =>
-                `Twój lot ${airlineCode} (${origin} → ${destination}) w dniu ${startDate} został zaktualizowany.`,
+            flightUpdated: ({airlineCode, origin, destination, startDate}: FlightParams) => `Twój lot ${airlineCode} (${origin} → ${destination}) w dniu ${startDate} został zaktualizowany.`,
             flightCabinChanged: (airlineCode: string, cabinClass?: string) => `Twoja klasa kabiny została zaktualizowana do ${cabinClass} na locie ${airlineCode}.`,
             flightSeatConfirmed: (airlineCode: string) => `Twoje miejsce na locie ${airlineCode} zostało potwierdzone.`,
             flightSeatChanged: (airlineCode: string) => `Twoje miejsce na locie ${airlineCode} zostało zmienione.`,
@@ -4556,7 +4544,7 @@ ${
                 importTaxDescription: 'Importuj grupy podatkowe z NetSuite.',
                 importCustomFields: {
                     chooseOptionBelow: 'Wybierz jedną z opcji poniżej:',
-                    label: (importedTypes: string[]) => `Zaimportowano jako ${importedTypes.join('i')}`,
+                    label: ({importedTypes}: ImportedTypesParams) => `Zaimportowano jako ${importedTypes.join('i')}`,
                     requiredFieldError: ({fieldName}: RequiredFieldParams) => `Wprowadź ${fieldName}`,
                     customSegments: {
                         title: 'Niestandardowe segmenty/rejestry',
@@ -4671,18 +4659,18 @@ _Aby uzyskać bardziej szczegółowe instrukcje, [odwiedź naszą stronę pomocy
                     [CONST.INTEGRATION_ENTITY_MAP_TYPES.NETSUITE_DEFAULT]: {
                         label: 'Domyślne ustawienia pracownika NetSuite',
                         description: 'Niezaimportowane do Expensify, zastosowane przy eksporcie',
-                        footerContent: (importField: string) =>
+                        footerContent: ({importField}: ImportFieldParams) =>
                             `Jeśli używasz ${importField} w NetSuite, zastosujemy domyślną wartość ustawioną w rekordzie pracownika podczas eksportu do Raportu Wydatków lub Zapisu w Dzienniku.`,
                     },
                     [CONST.INTEGRATION_ENTITY_MAP_TYPES.TAG]: {
                         label: 'Tagi',
                         description: 'Na poziomie pozycji',
-                        footerContent: (importField: string) => `${startCase(importField)} będzie można wybrać osobno dla każdego wydatku w raporcie pracownika.`,
+                        footerContent: ({importField}: ImportFieldParams) => `${startCase(importField)} będzie można wybrać osobno dla każdego wydatku w raporcie pracownika.`,
                     },
                     [CONST.INTEGRATION_ENTITY_MAP_TYPES.REPORT_FIELD]: {
                         label: 'Pola raportu',
                         description: 'Poziom raportu',
-                        footerContent: (importField: string) => `Wybór ${startCase(importField)} zostanie zastosowany do wszystkich wydatków w raporcie pracownika.`,
+                        footerContent: ({importField}: ImportFieldParams) => `Wybór ${startCase(importField)} zostanie zastosowany do wszystkich wydatków w raporcie pracownika.`,
                     },
                 },
             },
@@ -4759,7 +4747,7 @@ _Aby uzyskać bardziej szczegółowe instrukcje, [odwiedź naszą stronę pomocy
                 commercialFeedPlaidDetails: `Wymaga konfiguracji z Twoim bankiem, ale poprowadzimy Cię przez ten proces. Zwykle jest to dostępne tylko dla większych firm.`,
                 directFeedDetails: 'Najprostsze rozwiązanie. Połącz się od razu, używając swoich głównych danych logowania. Ta metoda jest najczęściej stosowana.',
                 enableFeed: {
-                    title: (provider: string) => `Włącz swój kanał ${provider}`,
+                    title: ({provider}: GoBackMessageParams) => `Włącz swój kanał ${provider}`,
                     heading:
                         'Mamy bezpośrednią integrację z wystawcą Twojej karty i możemy szybko oraz dokładnie zaimportować dane Twoich transakcji do Expensify.\n\nAby rozpocząć, po prostu:',
                     visa: 'Mamy globalne integracje z Visa, choć kwalifikowalność zależy od banku i programu karty.\n\nAby rozpocząć, po prostu:',
@@ -5031,25 +5019,6 @@ _Aby uzyskać bardziej szczegółowe instrukcje, [odwiedź naszą stronę pomocy
                     subtitle: 'Użyj Expensify Travel, aby uzyskać najlepsze oferty podróży i zarządzaj wszystkimi wydatkami służbowymi w jednym miejscu.',
                     ctaText: 'Rezerwuj lub zarządzaj',
                 },
-                travelInvoicing: {
-                    travelBookingSection: {
-                        title: 'Rezerwacja podróży',
-                        subtitle: 'Gratulacje! Wszystko gotowe, aby rezerwować i zarządzać podróżami w tym obszarze roboczym.',
-                        manageTravelLabel: 'Zarządzaj podróżami',
-                    },
-                    centralInvoicingSection: {
-                        title: 'Centralne fakturowanie',
-                        subtitle: 'Scentralizuj wszystkie wydatki na podróże w miesięcznej fakturze zamiast płacić w momencie zakupu.',
-                        learnHow: 'Dowiedz się jak.',
-                        subsections: {
-                            currentTravelSpendLabel: 'Aktualne wydatki na podróże',
-                            currentTravelSpendCta: 'Zapłać saldo',
-                            currentTravelLimitLabel: 'Obecny limit podróży',
-                            settlementAccountLabel: 'Konto rozliczeniowe',
-                            settlementFrequencyLabel: 'Częstotliwość rozliczeń',
-                        },
-                    },
-                },
             },
             expensifyCard: {
                 title: 'Karta Expensify',
@@ -5337,7 +5306,7 @@ _Aby uzyskać bardziej szczegółowe instrukcje, [odwiedź naszą stronę pomocy
                 prompt3: 'pobierz kopię zapasową',
                 prompt4: 'pierwszy.',
             },
-            importedTagsMessage: (columnCounts: number) =>
+            importedTagsMessage: ({columnCounts}: ImportedTagsMessageParams) =>
                 `Znaleźliśmy *${columnCounts} kolumn* w Twoim arkuszu kalkulacyjnym. Wybierz *Name* obok kolumny, która zawiera nazwy tagów. Możesz także wybrać *Enabled* obok kolumny, która ustawia status tagów.`,
             cannotDeleteOrDisableAllTags: {
                 title: 'Nie można usunąć ani wyłączyć wszystkich tagów',
@@ -5507,8 +5476,7 @@ _Aby uzyskać bardziej szczegółowe instrukcje, [odwiedź naszą stronę pomocy
                 giveItNameInstruction: 'Uczyń go na tyle unikalnym, aby dało się go odróżnić od innych kart. Jeszcze lepiej, jeśli opisujesz konkretne przypadki użycia!',
                 cardName: 'Nazwa karty',
                 letsDoubleCheck: 'Sprawdźmy jeszcze raz, czy wszystko wygląda poprawnie.',
-                willBeReadyToUse: 'Ta karta będzie gotowa do użycia od razu.',
-                willBeReadyToShip: 'Ta karta będzie gotowa do natychmiastowej wysyłki.',
+                willBeReady: 'Ta karta będzie gotowa do użycia od razu.',
                 cardholder: 'Posiadacz karty',
                 cardType: 'Typ karty',
                 limit: 'Limit',
@@ -6162,7 +6130,7 @@ Wymagaj szczegółów wydatków, takich jak paragony i opisy, ustawiaj limity i
         rules: {
             individualExpenseRules: {
                 title: 'Wydatki',
-                subtitle: (categoriesPageLink: string, tagsPageLink: string) =>
+                subtitle: ({categoriesPageLink, tagsPageLink}: IndividualExpenseRulesSubtitleParams) =>
                     `<muted-text>Ustaw limity wydatków i domyślne ustawienia dla poszczególnych wydatków. Możesz też utworzyć reguły dla <a href="${categoriesPageLink}">kategorii</a> i <a href="${tagsPageLink}">tagów</a>.</muted-text>`,
                 receiptRequiredAmount: 'Wymagana kwota paragonu',
                 receiptRequiredAmountDescription: 'Wymagaj paragonów, gdy wydatki przekraczają tę kwotę, chyba że zostanie to nadpisane przez regułę kategorii.',
@@ -6233,10 +6201,6 @@ Wymagaj szczegółów wydatków, takich jak paragony i opisy, ustawiaj limity i
                 title: 'Zasady kategorii',
                 approver: 'Akceptujący',
                 requireDescription: 'Wymagaj opisu',
-                requireFields: 'Wymagaj pól',
-                requiredFieldsTitle: 'Wymagane pola',
-                requiredFieldsDescription: (categoryName: string) => `To będzie miało zastosowanie do wszystkich wydatków skategoryzowanych jako <strong>${categoryName}</strong>.`,
-                requireAttendees: 'Wymagaj uczestników',
                 descriptionHint: 'Podpowiedź opisu',
                 descriptionHintDescription: (categoryName: string) =>
                     `Przypominaj pracownikom o podaniu dodatkowych informacji dotyczących wydatków w kategorii „${categoryName}”. Ta podpowiedź pojawia się w polu opisu przy wydatkach.`,
@@ -6468,6 +6432,12 @@ Wymagaj szczegółów wydatków, takich jak paragony i opisy, ustawiaj limity i
         deleteReportField: (fieldType: string, fieldName?: string) => `usunięto pole raportu ${fieldType} „${fieldName}”`,
         preventSelfApproval: ({oldValue, newValue}: UpdatedPolicyPreventSelfApprovalParams) =>
             `zaktualizowano „Uniemożliwiaj samodzielne zatwierdzanie” na „${newValue === 'true' ? 'Włączone' : 'Wyłączone'}” (wcześniej „${oldValue === 'true' ? 'Włączone' : 'Wyłączone'}”)`,
+        updateMaxExpenseAmountNoReceipt: ({oldValue, newValue}: UpdatedPolicyFieldWithNewAndOldValueParams) =>
+            `zmienił maksymalną kwotę wydatku wymagającą paragonu na ${newValue} (wcześniej ${oldValue})`,
+        updateMaxExpenseAmount: ({oldValue, newValue}: UpdatedPolicyFieldWithNewAndOldValueParams) =>
+            `zmieniono maksymalną kwotę wydatku dla naruszeń na ${newValue} (wcześniej ${oldValue})`,
+        updateMaxExpenseAge: ({oldValue, newValue}: UpdatedPolicyFieldWithNewAndOldValueParams) =>
+            `zaktualizowano „Maksymalny wiek wydatku (dni)” na „${newValue}” (poprzednio „${oldValue === 'false' ? CONST.POLICY.DEFAULT_MAX_EXPENSE_AGE : oldValue}”)`,
         updateMonthlyOffset: ({oldValue, newValue}: UpdatedPolicyFieldWithNewAndOldValueParams) => {
             if (!oldValue) {
                 return `ustaw comiesięczną datę przesyłania raportu na „${newValue}”`;
@@ -6621,39 +6591,6 @@ Wymagaj szczegółów wydatków, takich jak paragony i opisy, ustawiaj limity i
             previousForwardsTo
                 ? `zmieniono proces zatwierdzania dla ${approver}, aby przestać przekazywać zatwierdzone raporty (wcześniej przekazywane do ${previousForwardsTo})`
                 : `zmieniono przepływ zatwierdzania dla ${approver}, aby nie przekazywać dalej zatwierdzonych raportów`,
-        setDefaultBankAccount: ({bankAccountName, maskedBankAccountNumber}: {bankAccountName: string; maskedBankAccountNumber: string}) =>
-            `ustaw domyślne firmowe konto bankowe na „${bankAccountName ? `${bankAccountName}: ` : ''}${maskedBankAccountNumber}”`,
-        removedDefaultBankAccount: ({bankAccountName, maskedBankAccountNumber}: {bankAccountName: string; maskedBankAccountNumber: string}) =>
-            `usunął domyślne firmowe konto bankowe „${bankAccountName ? `${bankAccountName}: ` : ''}${maskedBankAccountNumber}”`,
-        changedDefaultBankAccount: ({
-            bankAccountName,
-            maskedBankAccountNumber,
-            oldBankAccountName,
-            oldMaskedBankAccountNumber,
-        }: {
-            bankAccountName: string;
-            maskedBankAccountNumber: string;
-            oldBankAccountName: string;
-            oldMaskedBankAccountNumber: string;
-        }) =>
-            `zmieniono domyślne firmowe konto bankowe na „${bankAccountName ? `${bankAccountName}: ` : ''}${maskedBankAccountNumber}” (wcześniej „${oldBankAccountName ? `${oldBankAccountName}: ` : ''}${oldMaskedBankAccountNumber}”)`,
-        changedInvoiceCompanyName: ({newValue, oldValue}: {newValue: string; oldValue?: string}) =>
-            oldValue ? `zmienił nazwę firmy na fakturze na „${newValue}” (wcześniej „${oldValue}”)` : `ustaw nazwę firmy na fakturze na „${newValue}”`,
-        changedInvoiceCompanyWebsite: ({newValue, oldValue}: {newValue: string; oldValue?: string}) =>
-            oldValue ? `zmienił firmową stronę internetową faktury na „${newValue}” (wcześniej „${oldValue}”)` : `ustaw firmową stronę internetową faktury na „${newValue}”`,
-        changedReimburser: ({newReimburser, previousReimburser}: UpdatedPolicyReimburserParams) =>
-            previousReimburser
-                ? `zmieniono upoważnionego płatnika na „${newReimburser}” (wcześniej „${previousReimburser}”)`
-                : `zmienił(a) upoważnioną osobę dokonującą płatności na „${newReimburser}”`,
-        setReceiptRequiredAmount: ({newValue}: UpdatedPolicyFieldWithNewAndOldValueParams) => `ustaw wymaganą kwotę paragonu na „${newValue}”`,
-        changedReceiptRequiredAmount: ({oldValue, newValue}: UpdatedPolicyFieldWithNewAndOldValueParams) => `zmieniono wymaganą kwotę paragonu na „${newValue}” (wcześniej „${oldValue}”)`,
-        removedReceiptRequiredAmount: ({oldValue}: UpdatedPolicyFieldWithNewAndOldValueParams) => `usunięto wymaganą kwotę paragonu (wcześniej „${oldValue}”)`,
-        setMaxExpenseAmount: ({newValue}: UpdatedPolicyFieldWithNewAndOldValueParams) => `ustaw maksymalną kwotę wydatku na „${newValue}”`,
-        changedMaxExpenseAmount: ({oldValue, newValue}: UpdatedPolicyFieldWithNewAndOldValueParams) => `zmieniono maksymalną kwotę wydatku na „${newValue}” (wcześniej „${oldValue}”)`,
-        removedMaxExpenseAmount: ({oldValue}: UpdatedPolicyFieldWithNewAndOldValueParams) => `usunięto maksymalną kwotę wydatku (wcześniej „${oldValue}”)`,
-        setMaxExpenseAge: ({newValue}: UpdatedPolicyFieldWithNewAndOldValueParams) => `ustaw maksymalny wiek wydatku na „${newValue}” dni`,
-        changedMaxExpenseAge: ({oldValue, newValue}: UpdatedPolicyFieldWithNewAndOldValueParams) => `zmieniono maksymalny wiek wydatku na „${newValue}” dni (wcześniej „${oldValue}”)`,
-        removedMaxExpenseAge: ({oldValue}: UpdatedPolicyFieldWithNewAndOldValueParams) => `usunięto maksymalny wiek wydatku (wcześniej „${oldValue}” dni)`,
     },
     roomMembersPage: {
         memberNotFound: 'Użytkownik nie został znaleziony.',
@@ -6820,7 +6757,7 @@ Wymagaj szczegółów wydatków, takich jak paragony i opisy, ustawiaj limity i
             amount: {
                 lessThan: ({amount}: OptionalParam<RequestAmountParams> = {}) => `Mniej niż ${amount ?? ''}`,
                 greaterThan: ({amount}: OptionalParam<RequestAmountParams> = {}) => `Większe niż ${amount ?? ''}`,
-                between: (greaterThan: string, lessThan: string) => `Pomiędzy ${greaterThan} a ${lessThan}`,
+                between: ({greaterThan, lessThan}: FiltersAmountBetweenParams) => `Pomiędzy ${greaterThan} a ${lessThan}`,
                 equalTo: ({amount}: OptionalParam<RequestAmountParams> = {}) => `Równe ${amount ?? ''}`,
             },
             card: {
@@ -7249,7 +7186,6 @@ Wymagaj szczegółów wydatków, takich jak paragony i opisy, ustawiaj limity i
         maxAge: ({maxAge}: ViolationsMaxAgeParams) => `Data starsza niż ${maxAge} dni`,
         missingCategory: 'Brak kategorii',
         missingComment: 'Opis jest wymagany dla wybranej kategorii',
-        missingAttendees: 'Wymaganych jest wielu uczestników dla tej kategorii',
         missingTag: ({tagName}: ViolationsMissingTagParams = {}) => `Brakujące ${tagName ?? 'tag'}`,
         modifiedAmount: ({type, displayPercentVariance}: ViolationsModifiedAmountParams) => {
             switch (type) {
@@ -7357,7 +7293,6 @@ Wymagaj szczegółów wydatków, takich jak paragony i opisy, ustawiaj limity i
         hold: 'Ten wydatek został wstrzymany',
         resolvedDuplicates: 'rozwiązano duplikat',
         companyCardRequired: 'Wymagane zakupy kartą firmową',
-        noRoute: 'Wybierz prawidłowy adres',
     },
     reportViolations: {
         [CONST.REPORT_VIOLATIONS.FIELD_REQUIRED]: ({fieldName}: RequiredFieldParams) => `Pole ${fieldName} jest wymagane`,
@@ -7976,18 +7911,9 @@ Oto *paragon testowy*, który pokazuje, jak to działa:`,
             addAdminError: 'Nie można dodać tego członka jako administratora. Spróbuj ponownie.',
             revokeAdminAccess: 'Cofnij uprawnienia administratora',
             cantRevokeAdminAccess: 'Nie można odebrać uprawnień administratora kontaktowi technicznemu',
-            error: {
-                removeAdmin: 'Nie można usunąć tego użytkownika jako administratora. Spróbuj ponownie.',
-                removeDomain: 'Nie można usunąć tej domeny. Spróbuj ponownie.',
-                removeDomainNameInvalid: 'Wprowadź swoją nazwę domeny, aby ją zresetować.',
-            },
-            resetDomain: 'Resetuj domenę',
-            resetDomainExplanation: ({domainName}: {domainName?: string}) => `Wpisz proszę <strong>${domainName}</strong>, aby potwierdzić reset domeny.`,
-            enterDomainName: 'Wpisz tutaj swoją nazwę domeny',
-            resetDomainInfo: `Ta akcja jest <strong>trwała</strong> i następujące dane zostaną usunięte: <br/> <ul><li>Połączenia kart firmowych i wszystkie nierozliczone wydatki z tych kart</li> <li>Ustawienia SAML i grup</li> </ul> Wszystkie konta, przestrzenie robocze, raporty, wydatki i inne dane pozostaną bez zmian. <br/><br/>Uwaga: Możesz usunąć tę domenę z listy swoich domen, usuwając powiązany adres e-mail z <a href="#">metod kontaktu</a>.`,
+            error: {removeAdmin: 'Nie można usunąć tego użytkownika jako administratora. Spróbuj ponownie.'},
         },
         members: {title: 'Członkowie', findMember: 'Znajdź członka'},
-        domainAdmins: 'Administratorzy domeny',
     },
     gps: {
         tooltip: 'Śledzenie GPS w toku! Gdy skończysz, zatrzymaj śledzenie poniżej.',
@@ -8005,6 +7931,7 @@ Oto *paragon testowy*, który pokazuje, jak to działa:`,
             confirm: 'Odrzuć śledzenie dystansu',
         },
         zeroDistanceTripModal: {title: 'Nie można utworzyć wydatku', prompt: 'Nie możesz utworzyć wydatku z tym samym miejscem początkowym i końcowym.'},
+
         locationRequiredModal: {
             title: 'Wymagany dostęp do lokalizacji',
             prompt: 'Aby rozpocząć śledzenie dystansu GPS, zezwól na dostęp do lokalizacji w ustawieniach swojego urządzenia.',
@@ -8023,13 +7950,6 @@ Oto *paragon testowy*, który pokazuje, jak to działa:`,
             subtitle: 'Automatycznie rejestruj mile lub kilometry za pomocą GPS i natychmiast zamieniaj podróże w wydatki.',
             button: 'Pobierz aplikację',
         },
-        notification: {title: 'Śledzenie GPS w toku', body: 'Przejdź do aplikacji, aby dokończyć'},
-        locationServicesRequiredModal: {
-            title: 'Wymagany dostęp do lokalizacji',
-            confirm: 'Otwórz ustawienia',
-            prompt: 'Zezwól na dostęp do lokalizacji w ustawieniach urządzenia, aby rozpocząć śledzenie dystansu za pomocą GPS.',
-        },
-        fabGpsTripExplained: 'Przejdź do ekranu GPS (przycisk akcji)',
     },
 };
 // IMPORTANT: This line is manually replaced in generate translation files by scripts/generateTranslations.ts,
diff --git a/src/languages/pt-BR.ts b/src/languages/pt-BR.ts
index 0e7a3fa95b1d..7c627b644bca 100644
--- a/src/languages/pt-BR.ts
+++ b/src/languages/pt-BR.ts
@@ -28,6 +28,24 @@ import type {
     EditActionParams,
     ExportAgainModalDescriptionParams,
     ExportIntegrationSelectedParams,
+    FileLimitParams,
+    FileTypeParams,
+    FiltersAmountBetweenParams,
+    FlightLayoverParams,
+    FlightParams,
+    FocusModeUpdateParams,
+    FormattedMaxLengthParams,
+    GoBackMessageParams,
+    HarvestCreatedExpenseReportParams,
+    ImportedTagsMessageParams,
+    ImportedTypesParams,
+    ImportFieldParams,
+    ImportMembersSuccessfulDescriptionParams,
+    ImportPerDiemRatesSuccessfulDescriptionParams,
+    ImportTagsSuccessfulDescriptionParams,
+    IncorrectZipFormatParams,
+    IndividualExpenseRulesSubtitleParams,
+    InstantSummaryParams,
     IntacctMappingTitleParams,
     IntegrationExportParams,
     IntegrationSyncFailedParams,
@@ -115,6 +133,9 @@ import type {
     SplitDateRangeParams,
     SplitExpenseEditTitleParams,
     SplitExpenseSubtitleParams,
+    SpreadCategoriesParams,
+    SpreadFieldNameParams,
+    SpreadSheetColumnParams,
     StatementTitleParams,
     StepCounterParams,
     StripePaidParams,
@@ -164,7 +185,6 @@ import type {
     UpdatedPolicyManualApprovalThresholdParams,
     UpdatedPolicyPreventSelfApprovalParams,
     UpdatedPolicyReimbursementEnabledParams,
-    UpdatedPolicyReimburserParams,
     UpdatedPolicyReportFieldDefaultValueParams,
     UpdatedPolicyTagFieldParams,
     UpdatedPolicyTagNameParams,
@@ -259,6 +279,7 @@ const translations: TranslationDeepObject<typeof en> = {
         searchWithThreeDots: 'Pesquisar...',
         next: 'Próximo',
         previous: 'Anterior',
+        // @context Navigation button that returns the user to the previous screen. Should be interpreted as a UI action label.
         goBack: 'Voltar',
         create: 'Criar',
         add: 'Adicionar',
@@ -276,7 +297,6 @@ const translations: TranslationDeepObject<typeof en> = {
         zoom: 'Zoom',
         password: 'Senha',
         magicCode: 'Código mágico',
-        digits: 'dígitos',
         twoFactorCode: 'Código de autenticação de dois fatores',
         workspaces: 'Workspaces',
         inbox: 'Caixa de entrada',
@@ -533,6 +553,10 @@ const translations: TranslationDeepObject<typeof en> = {
         value: 'Valor',
         downloadFailedTitle: 'Falha no download',
         downloadFailedDescription: 'Seu download não pôde ser concluído. Tente novamente mais tarde.',
+        downloadFailedEmptyReportDescription: () => ({
+            one: 'Você não pode exportar um relatório vazio.',
+            other: () => 'Você não pode exportar relatórios vazios.',
+        }),
         filterLogs: 'Filtrar Logs',
         network: 'Rede',
         reportID: 'ID do Relatório',
@@ -627,6 +651,7 @@ const translations: TranslationDeepObject<typeof en> = {
         copyToClipboard: 'Copiar para a área de transferência',
         thisIsTakingLongerThanExpected: 'Isso está levando mais tempo do que o esperado...',
         domains: 'Domínios',
+        viewReport: 'Ver relatório',
         actionRequired: 'Ação necessária',
         duplicate: 'Duplicar',
         duplicated: 'Duplicado',
@@ -687,12 +712,12 @@ const translations: TranslationDeepObject<typeof en> = {
         protectedPDFNotSupported: 'PDF protegido por senha não é compatível',
         attachmentImageResized: 'Esta imagem foi redimensionada para visualização. Baixe para a resolução completa.',
         attachmentImageTooLarge: 'Esta imagem é muito grande para ser visualizada antes do envio.',
-        tooManyFiles: (fileLimit: number) => `Você só pode enviar até ${fileLimit} arquivos por vez.`,
+        tooManyFiles: ({fileLimit}: FileLimitParams) => `Você só pode enviar até ${fileLimit} arquivos por vez.`,
         sizeExceededWithValue: ({maxUploadSizeInMB}: SizeExceededParams) => `Os arquivos excedem ${maxUploadSizeInMB} MB. Tente novamente.`,
         someFilesCantBeUploaded: 'Alguns arquivos não podem ser enviados',
         sizeLimitExceeded: ({maxUploadSizeInMB}: SizeExceededParams) => `Os arquivos devem ter menos de ${maxUploadSizeInMB} MB. Arquivos maiores não serão carregados.`,
         maxFileLimitExceeded: 'Você pode enviar até 30 recibos por vez. Quaisquer extras não serão enviados.',
-        unsupportedFileType: (fileType: string) => `Arquivos ${fileType} não são compatíveis. Somente tipos de arquivo compatíveis serão enviados.`,
+        unsupportedFileType: ({fileType}: FileTypeParams) => `Arquivos ${fileType} não são compatíveis. Somente tipos de arquivo compatíveis serão enviados.`,
         learnMoreAboutSupportedFiles: 'Saiba mais sobre os formatos compatíveis.',
         passwordProtected: 'PDFs protegidos por senha não são compatíveis. Somente arquivos compatíveis serão enviados.',
     },
@@ -717,8 +742,8 @@ const translations: TranslationDeepObject<typeof en> = {
     composer: {
         noExtensionFoundForMimeType: 'Nenhuma extensão encontrada para o tipo MIME',
         problemGettingImageYouPasted: 'Houve um problema ao obter a imagem que você colou',
-        commentExceededMaxLength: (formattedMaxLength: string) => `O comprimento máximo do comentário é de ${formattedMaxLength} caracteres.`,
-        taskTitleExceededMaxLength: (formattedMaxLength: string) => `O comprimento máximo do título da tarefa é de ${formattedMaxLength} caracteres.`,
+        commentExceededMaxLength: ({formattedMaxLength}: FormattedMaxLengthParams) => `O comprimento máximo do comentário é de ${formattedMaxLength} caracteres.`,
+        taskTitleExceededMaxLength: ({formattedMaxLength}: FormattedMaxLengthParams) => `O comprimento máximo do título da tarefa é de ${formattedMaxLength} caracteres.`,
     },
     baseUpdateAppModal: {
         updateApp: 'Atualizar app',
@@ -729,35 +754,6 @@ const translations: TranslationDeepObject<typeof en> = {
         expired: 'Sua sessão expirou.',
         signIn: 'Entre novamente.',
     },
-    multifactorAuthentication: {
-        biometricsTest: {
-            biometricsTest: 'Teste biométrico',
-            authenticationSuccessful: 'Autenticação bem-sucedida',
-            successfullyAuthenticatedUsing: ({authType}) => `Você autenticou com sucesso utilizando ${authType}.`,
-            troubleshootBiometricsStatus: ({registered}) => `Biometria (${registered ? 'Registrada' : 'Não registrada'})`,
-            yourAttemptWasUnsuccessful: 'Sua tentativa de autenticação não foi bem-sucedida.',
-            youCouldNotBeAuthenticated: 'Você não pôde ser autenticado',
-            areYouSureToReject: 'Tem certeza? A tentativa de autenticação será rejeitada se você fechar esta tela.',
-            rejectAuthentication: 'Rejeitar autenticação',
-            test: 'Teste',
-            biometricsAuthentication: 'Autenticação biométrica',
-        },
-        pleaseEnableInSystemSettings: {
-            start: 'Por favor, habilite a verificação por rosto/impressão digital ou defina um código de acesso do dispositivo em suas ',
-            link: 'configurações do sistema',
-            end: '.',
-        },
-        oops: 'Ops, algo deu errado',
-        looksLikeYouRanOutOfTime: 'Parece que você ficou sem tempo! Por favor, tente novamente no comerciante.',
-        youRanOutOfTime: 'Você ficou sem tempo',
-        letsVerifyItsYou: 'Vamos verificar se é você',
-        verifyYourself: {
-            biometrics: 'Verifique sua identidade com seu rosto ou impressão digital',
-        },
-        enableQuickVerification: {
-            biometrics: 'Habilite a verificação rápida e segura usando seu rosto ou impressão digital. Sem senhas ou códigos necessários.',
-        },
-    },
     validateCodeModal: {
         successfulSignInTitle: dedent(`
             Abracadabra,
@@ -927,7 +923,7 @@ const translations: TranslationDeepObject<typeof en> = {
     adminOnlyCanPost: 'Somente administradores podem enviar mensagens nesta sala.',
     reportAction: {
         asCopilot: 'como copiloto para',
-        harvestCreatedExpenseReport: (reportUrl: string, reportName: string) =>
+        harvestCreatedExpenseReport: ({reportUrl, reportName}: HarvestCreatedExpenseReportParams) =>
             `criou este relatório para agrupar todas as despesas de <a href="${reportUrl}">${reportName}</a> que não puderam ser enviadas na frequência que você escolheu`,
         createdReportForUnapprovedTransactions: ({reportUrl, reportName}: CreatedReportForUnapprovedTransactionsParams) =>
             `criou este relatório para quaisquer despesas retidas de <a href="${reportUrl}">${reportName}</a>`,
@@ -969,7 +965,7 @@ const translations: TranslationDeepObject<typeof en> = {
         buttonFind: 'Encontre algo...',
         buttonMySettings: 'Minhas configurações',
         fabNewChat: 'Iniciar chat',
-        fabNewChatExplained: 'Abrir menu de ações',
+        fabNewChatExplained: 'Iniciar chat (Ação flutuante)',
         fabScanReceiptExplained: 'Digitalizar recibo (Ação flutuante)',
         chatPinned: 'Conversa fixada',
         draftedMessage: 'Mensagem rascunhada',
@@ -995,13 +991,13 @@ const translations: TranslationDeepObject<typeof en> = {
         chooseSpreadsheet: '<muted-link>Selecione um arquivo de planilha para importar. Formatos compatíveis: .csv, .txt, .xls e .xlsx.</muted-link>',
         chooseSpreadsheetMultiLevelTag: `<muted-link>Selecione um arquivo de planilha para importar. <a href="${CONST.IMPORT_SPREADSHEET.MULTI_LEVEL_TAGS_ARTICLE_LINK}">Saiba mais</a> sobre os formatos de arquivo compatíveis.</muted-link>`,
         fileContainsHeader: 'Arquivo contém cabeçalhos de coluna',
-        column: (name: string) => `Coluna ${name}`,
-        fieldNotMapped: (fieldName: string) => `Ops! Um campo obrigatório ("${fieldName}") não foi mapeado. Revise e tente novamente.`,
-        singleFieldMultipleColumns: (fieldName: string) => `Opa! Você associou um único campo ("${fieldName}") a várias colunas. Revise e tente novamente.`,
-        emptyMappedField: (fieldName: string) => `Opa! O campo ("${fieldName}") contém um ou mais valores vazios. Verifique e tente novamente.`,
+        column: ({name}: SpreadSheetColumnParams) => `Coluna ${name}`,
+        fieldNotMapped: ({fieldName}: SpreadFieldNameParams) => `Ops! Um campo obrigatório ("${fieldName}") não foi mapeado. Revise e tente novamente.`,
+        singleFieldMultipleColumns: ({fieldName}: SpreadFieldNameParams) => `Opa! Você associou um único campo ("${fieldName}") a várias colunas. Revise e tente novamente.`,
+        emptyMappedField: ({fieldName}: SpreadFieldNameParams) => `Opa! O campo ("${fieldName}") contém um ou mais valores vazios. Verifique e tente novamente.`,
         importSuccessfulTitle: 'Importação bem-sucedida',
-        importCategoriesSuccessfulDescription: ({categories}: {categories: number}) => (categories > 1 ? `${categories} categorias foram adicionadas.` : '1 categoria foi adicionada.'),
-        importMembersSuccessfulDescription: ({added, updated}: {added: number; updated: number}) => {
+        importCategoriesSuccessfulDescription: ({categories}: SpreadCategoriesParams) => (categories > 1 ? `${categories} categorias foram adicionadas.` : '1 categoria foi adicionada.'),
+        importMembersSuccessfulDescription: ({added, updated}: ImportMembersSuccessfulDescriptionParams) => {
             if (!added && !updated) {
                 return 'Nenhum membro foi adicionado ou atualizado.';
             }
@@ -1013,9 +1009,10 @@ const translations: TranslationDeepObject<typeof en> = {
             }
             return added > 1 ? `${added} membros foram adicionados.` : '1 membro foi adicionado.';
         },
-        importTagsSuccessfulDescription: ({tags}: {tags: number}) => (tags > 1 ? `${tags} tags foram adicionadas.` : '1 tag foi adicionada.'),
+        importTagsSuccessfulDescription: ({tags}: ImportTagsSuccessfulDescriptionParams) => (tags > 1 ? `${tags} tags foram adicionadas.` : '1 tag foi adicionada.'),
         importMultiLevelTagsSuccessfulDescription: 'Tags em vários níveis foram adicionadas.',
-        importPerDiemRatesSuccessfulDescription: ({rates}: {rates: number}) => (rates > 1 ? `Foram adicionadas taxas diárias de ${rates}.` : '1 taxa de diária foi adicionada.'),
+        importPerDiemRatesSuccessfulDescription: ({rates}: ImportPerDiemRatesSuccessfulDescriptionParams) =>
+            rates > 1 ? `Foram adicionadas taxas diárias de ${rates}.` : '1 taxa de diária foi adicionada.',
         importFailedTitle: 'Falha na importação',
         importFailedDescription: 'Verifique se todos os campos foram preenchidos corretamente e tente novamente. Se o problema persistir, entre em contato com a Concierge.',
         importDescription: 'Escolha quais campos mapear da sua planilha clicando no menu suspenso ao lado de cada coluna importada abaixo.',
@@ -1195,8 +1192,14 @@ const translations: TranslationDeepObject<typeof en> = {
             one: 'Você tem certeza de que deseja excluir esta despesa?',
             other: 'Tem certeza de que deseja excluir estas despesas?',
         }),
-        deleteReport: 'Excluir relatório',
-        deleteReportConfirmation: 'Você tem certeza de que deseja excluir este relatório?',
+        deleteReport: () => ({
+            one: 'Excluir relatório',
+            other: 'Excluir relatórios',
+        }),
+        deleteReportConfirmation: () => ({
+            one: 'Tem certeza de que deseja excluir este relatório?',
+            other: 'Tem certeza de que deseja excluir estes relatórios?',
+        }),
         settledExpensify: 'Pago',
         done: 'Concluído',
         settledElsewhere: 'Pago em outro lugar',
@@ -1444,8 +1447,9 @@ const translations: TranslationDeepObject<typeof en> = {
         moveExpensesError: 'Você não pode mover despesas de diária para relatórios em outros espaços de trabalho, porque as taxas de diária podem diferir entre espaços de trabalho.',
         changeApprover: {
             title: 'Alterar aprovador',
-            header: ({workflowSettingLink}: WorkflowSettingsParam) =>
-                `Escolha uma opção para alterar o aprovador deste relatório. (Atualize suas <a href="${workflowSettingLink}">configurações de espaço de trabalho</a> para alterar permanentemente o aprovador para todos os relatórios.)`,
+            subtitle: 'Escolha uma opção para alterar o aprovador deste relatório.',
+            description: ({workflowSettingLink}: WorkflowSettingsParam) =>
+                `Você também pode alterar permanentemente o aprovador para todos os relatórios nas suas <a href="${workflowSettingLink}">configurações de fluxo de trabalho</a>.`,
             changedApproverMessage: (managerID: number) => `alterou o aprovador para <mention-user accountID="${managerID}"/>`,
             actions: {
                 addApprover: 'Adicionar aprovador',
@@ -1463,13 +1467,7 @@ const translations: TranslationDeepObject<typeof en> = {
         splitDateRange: ({startDate, endDate, count}: SplitDateRangeParams) => `${startDate} a ${endDate} (${count} dias)`,
         splitByDate: 'Dividir por data',
         routedDueToDEW: ({to}: RoutedDueToDEWParams) => `relatório encaminhado para ${to} devido ao fluxo de trabalho de aprovação personalizado`,
-        timeTracking: {
-            hoursAt: (hours: number, rate: string) => `${hours} ${hours === 1 ? 'hora' : 'horas'} @ ${rate} / hora`,
-            hrs: 'h',
-            hours: 'Horas',
-            ratePreview: (rate: string) => `${rate} / hora`,
-            amountTooLargeError: 'O valor total é muito alto. Reduza as horas ou diminua a tarifa.',
-        },
+        timeTracking: {hoursAt: (hours: number, rate: string) => `${hours} ${hours === 1 ? 'hora' : 'horas'} @ ${rate} / hora`, hrs: 'h'},
     },
     transactionMerge: {
         listPage: {
@@ -1947,6 +1945,13 @@ const translations: TranslationDeepObject<typeof en> = {
         chatToConciergeToUnlock: 'Converse com o Concierge para resolver questões de segurança e desbloquear sua conta.',
         chatWithConcierge: 'Conversar com Concierge',
     },
+    passwordPage: {
+        changePassword: 'Alterar senha',
+        changingYourPasswordPrompt: 'Alterar sua senha atualizará a senha das suas contas do Expensify.com e do New Expensify.',
+        currentPassword: 'Senha atual',
+        newPassword: 'Nova senha',
+        newPasswordPrompt: 'Sua nova senha deve ser diferente da antiga e conter pelo menos 8 caracteres, 1 letra maiúscula, 1 letra minúscula e 1 número.',
+    },
     twoFactorAuth: {
         headerTitle: 'Autenticação em duas etapas',
         twoFactorAuthEnabled: 'Autenticação de dois fatores ativada',
@@ -2342,7 +2347,7 @@ ${amount} para ${merchant} - ${date}`,
     transferAmountPage: {
         transfer: ({amount}: TransferParams) => `Transferir${amount ? ` ${amount}` : ''}`,
         instant: 'Imediato (Cartão de débito)',
-        instantSummary: (rate: string, minAmount: string) => `Taxa de ${rate}% (${minAmount} mínimo)`,
+        instantSummary: ({rate, minAmount}: InstantSummaryParams) => `Taxa de ${rate}% (${minAmount} mínimo)`,
         ach: '1–3 dias úteis (Conta bancária)',
         achSummary: 'Sem taxa',
         whichAccount: 'Qual conta?',
@@ -2377,31 +2382,10 @@ ${amount} para ${merchant} - ${date}`,
             comment: (value: string) => `Alterar descrição para "${value}"`,
             merchant: (value: string) => `Atualizar comerciante para "${value}"`,
             reimbursable: (value: boolean) => `Atualizar despesa ${value ? 'reembolsável' : 'não reembolsável'}`,
-            report: (value: string) => `Adicionar a um relatório chamado "${value}"`,
+            report: (value: string) => `Adicione um relatório chamado "${value}"`,
             tag: (value: string) => `Atualizar etiqueta para "${value}"`,
             tax: (value: string) => `Atualizar taxa de imposto para ${value}`,
         },
-        newRule: 'Nova regra',
-        addRule: {
-            title: 'Adicionar regra',
-            expenseContains: 'Se a despesa contiver:',
-            applyUpdates: 'Em seguida, aplique estas atualizações:',
-            merchantHint: 'Digite * para criar uma regra que se aplique a todos os estabelecimentos',
-            addToReport: 'Adicionar a um relatório chamado',
-            createReport: 'Criar relatório se necessário',
-            applyToExistingExpenses: 'Aplicar às despesas correspondentes existentes',
-            confirmError: 'Insira o comerciante e aplique pelo menos uma atualização',
-            confirmErrorMerchant: 'Insira o comerciante',
-            confirmErrorUpdate: 'Por favor, aplique pelo menos uma atualização',
-            saveRule: 'Salvar regra',
-        },
-        editRule: {title: 'Editar regra'},
-        deleteRule: {
-            deleteSingle: 'Excluir regra',
-            deleteMultiple: 'Excluir regras',
-            deleteSinglePrompt: 'Tem certeza de que deseja excluir esta regra?',
-            deleteMultiplePrompt: 'Tem certeza de que deseja excluir estas regras?',
-        },
     },
     preferencesPage: {
         appSection: {
@@ -2896,7 +2880,7 @@ ${
             dateShouldBeBefore: (dateString: string) => `A data deve ser anterior a ${dateString}`,
             dateShouldBeAfter: (dateString: string) => `A data deve ser posterior a ${dateString}`,
             hasInvalidCharacter: 'O nome pode incluir apenas caracteres latinos',
-            incorrectZipFormat: (zipFormat?: string) => `Formato de CEP incorreto${zipFormat ? `Formato aceitável: ${zipFormat}` : ''}`,
+            incorrectZipFormat: ({zipFormat}: IncorrectZipFormatParams = {}) => `Formato de CEP incorreto${zipFormat ? `Formato aceitável: ${zipFormat}` : ''}`,
             invalidPhoneNumber: `Certifique-se de que o número de telefone é válido (por exemplo, ${CONST.EXAMPLE_PHONE_NUMBER})`,
         },
     },
@@ -2978,7 +2962,7 @@ ${
     },
     focusModeUpdateModal: {
         title: 'Bem-vindo ao modo #focus!',
-        prompt: (priorityModePageUrl: string) =>
+        prompt: ({priorityModePageUrl}: FocusModeUpdateParams) =>
             `Mantenha-se em dia vendo apenas os chats não lidos ou os chats que precisam da sua atenção. Não se preocupe, você pode alterar isso a qualquer momento em <a href="${priorityModePageUrl}">configurações</a>.`,
     },
     notFound: {
@@ -2998,6 +2982,15 @@ ${
         subtitle: 'Não foi possível concluir sua solicitação. Tente novamente mais tarde.',
         wrongTypeSubtitle: 'Essa pesquisa não é válida. Tente ajustar seus critérios de pesquisa.',
     },
+    setPasswordPage: {
+        enterPassword: 'Digite uma senha',
+        setPassword: 'Definir senha',
+        newPasswordPrompt: 'Sua senha deve ter pelo menos 8 caracteres, 1 letra maiúscula, 1 letra minúscula e 1 número.',
+        passwordFormTitle: 'Bem-vindo de volta ao New Expensify! Defina sua senha, por favor.',
+        passwordNotSet: 'Não foi possível definir sua nova senha. Enviamos um novo link de redefinição de senha para você tentar novamente.',
+        setPasswordLinkInvalid: 'Este link para definir senha é inválido ou expirou. Um novo está esperando por você na sua caixa de entrada!',
+        validateAccount: 'Verificar conta',
+    },
     statusPage: {
         status: 'Status',
         statusExplanation: 'Adicione um emoji para que seus colegas e amigos saibam facilmente o que está acontecendo. Você também pode adicionar uma mensagem, se quiser!',
@@ -3140,13 +3133,10 @@ ${
         errorMessageInvalidPhone: `Insira um número de telefone válido sem parênteses ou traços. Se você estiver fora dos EUA, inclua o código do seu país (por exemplo, ${CONST.EXAMPLE_PHONE_NUMBER}).`,
         errorMessageInvalidEmail: 'E-mail inválido',
         userIsAlreadyMember: ({login, name}: UserIsAlreadyMemberParams) => `${login} já é membro de ${name}`,
-        userIsAlreadyAnAdmin: ({login, name}: UserIsAlreadyMemberParams) => `${login} já é um administrador de ${name}`,
     },
     onfidoStep: {
         acceptTerms: 'Ao prosseguir com o pedido para ativar sua Carteira Expensify, você confirma que leu, compreende e aceita',
         facialScan: 'Política e Autorização de Varredura Facial da Onfido',
-        onfidoLinks: (onfidoTitle: string) =>
-            `<muted-text-micro>${onfidoTitle} <a href='${CONST.ONFIDO_FACIAL_SCAN_POLICY_URL}'>Política e Autorização de Varredura Facial da Onfido</a>, <a href='${CONST.ONFIDO_PRIVACY_POLICY_URL}'>Privacidade</a> e <a href='${CONST.ONFIDO_TERMS_OF_SERVICE_URL}'>Termos de Serviço</a>.</muted-text-micro>`,
         tryAgain: 'Tentar novamente',
         verifyIdentity: 'Verificar identidade',
         letsVerifyIdentity: 'Vamos verificar sua identidade',
@@ -3644,7 +3634,7 @@ ${
         flight: 'Voo',
         flightDetails: {
             passenger: 'Passageiro',
-            layover: (layover: string) => `<muted-text-label>Você tem uma <strong>conexão de ${layover}</strong> antes deste voo</muted-text-label>`,
+            layover: ({layover}: FlightLayoverParams) => `<muted-text-label>Você tem uma <strong>conexão de ${layover}</strong> antes deste voo</muted-text-label>`,
             takeOff: 'Decolagem',
             landing: 'Página inicial',
             seat: 'Assento',
@@ -3734,18 +3724,16 @@ ${
             conciergeMessage: ({domain}: {domain: string}) => `Falha na habilitação de viagens para o domínio: ${domain}. Revise e habilite viagens para este domínio.`,
         },
         updates: {
-            bookingTicketed: (airlineCode: string, origin: string, destination: string, startDate: string, confirmationID = '') =>
+            bookingTicketed: ({airlineCode, origin, destination, startDate, confirmationID = ''}: FlightParams) =>
                 `Seu voo ${airlineCode} (${origin} → ${destination}) em ${startDate} foi reservado. Código de confirmação: ${confirmationID}`,
-            ticketVoided: (airlineCode: string, origin: string, destination: string, startDate: string) =>
-                `Sua passagem para o voo ${airlineCode} (${origin} → ${destination}) em ${startDate} foi anulada.`,
-            ticketRefunded: (airlineCode: string, origin: string, destination: string, startDate: string) =>
+            ticketVoided: ({airlineCode, origin, destination, startDate}: FlightParams) => `Sua passagem para o voo ${airlineCode} (${origin} → ${destination}) em ${startDate} foi anulada.`,
+            ticketRefunded: ({airlineCode, origin, destination, startDate}: FlightParams) =>
                 `Sua passagem para o voo ${airlineCode} (${origin} → ${destination}) em ${startDate} foi reembolsada ou alterada.`,
-            flightCancelled: (airlineCode: string, origin: string, destination: string, startDate: string) =>
+            flightCancelled: ({airlineCode, origin, destination, startDate}: FlightParams) =>
                 `Seu voo ${airlineCode} (${origin} → ${destination}) em ${startDate}} foi cancelado pela companhia aérea.`,
             flightScheduleChangePending: (airlineCode: string) => `A companhia aérea propôs uma mudança de horário para o voo ${airlineCode}; estamos aguardando confirmação.`,
             flightScheduleChangeClosed: (airlineCode: string, startDate?: string) => `Alteração de horário confirmada: o voo ${airlineCode} agora parte em ${startDate}.`,
-            flightUpdated: (airlineCode: string, origin: string, destination: string, startDate: string) =>
-                `Seu voo ${airlineCode} (${origin} → ${destination}) em ${startDate} foi atualizado.`,
+            flightUpdated: ({airlineCode, origin, destination, startDate}: FlightParams) => `Seu voo ${airlineCode} (${origin} → ${destination}) em ${startDate} foi atualizado.`,
             flightCabinChanged: (airlineCode: string, cabinClass?: string) => `Sua classe de cabine foi atualizada para ${cabinClass} no voo ${airlineCode}.`,
             flightSeatConfirmed: (airlineCode: string) => `Sua poltrona no voo ${airlineCode} foi confirmada.`,
             flightSeatChanged: (airlineCode: string) => `Sua marcação de assento no voo ${airlineCode} foi alterada.`,
@@ -4555,7 +4543,7 @@ ${
                 importTaxDescription: 'Importar grupos de impostos do NetSuite.',
                 importCustomFields: {
                     chooseOptionBelow: 'Escolha uma opção abaixo:',
-                    label: (importedTypes: string[]) => `Importado como ${importedTypes.join('e')}`,
+                    label: ({importedTypes}: ImportedTypesParams) => `Importado como ${importedTypes.join('e')}`,
                     requiredFieldError: ({fieldName}: RequiredFieldParams) => `Por favor, insira o ${fieldName}`,
                     customSegments: {
                         title: 'Segmentos/registros personalizados',
@@ -4670,18 +4658,19 @@ _Para instruções mais detalhadas, [visite nosso site de ajuda](${CONST.NETSUIT
                     [CONST.INTEGRATION_ENTITY_MAP_TYPES.NETSUITE_DEFAULT]: {
                         label: 'Padrão de funcionário NetSuite',
                         description: 'Não importado para o Expensify, aplicado na exportação',
-                        footerContent: (importField: string) =>
+                        footerContent: ({importField}: ImportFieldParams) =>
                             `Se você usar ${importField} no NetSuite, aplicaremos o padrão definido no registro do funcionário ao exportar para Expense Report ou Journal Entry.`,
                     },
                     [CONST.INTEGRATION_ENTITY_MAP_TYPES.TAG]: {
                         label: 'Tags',
                         description: 'Nível de item de linha',
-                        footerContent: (importField: string) => `${startCase(importField)} estará disponível para seleção em cada despesa individual no relatório de um funcionário.`,
+                        footerContent: ({importField}: ImportFieldParams) =>
+                            `${startCase(importField)} estará disponível para seleção em cada despesa individual no relatório de um funcionário.`,
                     },
                     [CONST.INTEGRATION_ENTITY_MAP_TYPES.REPORT_FIELD]: {
                         label: 'Campos de relatório',
                         description: 'Nível de relatório',
-                        footerContent: (importField: string) => `A seleção de ${startCase(importField)} será aplicada a todas as despesas no relatório de um funcionário.`,
+                        footerContent: ({importField}: ImportFieldParams) => `A seleção de ${startCase(importField)} será aplicada a todas as despesas no relatório de um funcionário.`,
                     },
                 },
             },
@@ -4758,7 +4747,7 @@ _Para instruções mais detalhadas, [visite nosso site de ajuda](${CONST.NETSUIT
                 commercialFeedPlaidDetails: `Requer configuração com o seu banco, mas vamos orientar você. Isso geralmente é limitado a empresas maiores.`,
                 directFeedDetails: 'A abordagem mais simples. Conecte-se imediatamente usando suas credenciais principais. Esse método é o mais comum.',
                 enableFeed: {
-                    title: (provider: string) => `Ative seu feed ${provider}`,
+                    title: ({provider}: GoBackMessageParams) => `Ative seu feed ${provider}`,
                     heading:
                         'Temos uma integração direta com o emissor do seu cartão e podemos importar seus dados de transação para o Expensify de forma rápida e precisa.\n\nPara começar, simplesmente:',
                     visa: 'Temos integrações globais com a Visa, embora a elegibilidade varie de acordo com o banco e o programa do cartão.\n\nPara começar, basta:',
@@ -5031,25 +5020,6 @@ _Para instruções mais detalhadas, [visite nosso site de ajuda](${CONST.NETSUIT
                     subtitle: 'Use o Expensify Travel para obter as melhores ofertas de viagem e gerencie todas as suas despesas comerciais em um só lugar.',
                     ctaText: 'Reservar ou gerenciar',
                 },
-                travelInvoicing: {
-                    travelBookingSection: {
-                        title: 'Reserva de viagem',
-                        subtitle: 'Parabéns! Agora você está pronto para reservar e gerenciar viagens neste workspace.',
-                        manageTravelLabel: 'Gerenciar viagens',
-                    },
-                    centralInvoicingSection: {
-                        title: 'Faturamento centralizado',
-                        subtitle: 'Centralize todos os gastos de viagem em uma fatura mensal em vez de pagar no momento da compra.',
-                        learnHow: 'Saiba como.',
-                        subsections: {
-                            currentTravelSpendLabel: 'Gasto atual com viagens',
-                            currentTravelSpendCta: 'Pagar saldo',
-                            currentTravelLimitLabel: 'Limite de viagem atual',
-                            settlementAccountLabel: 'Conta de liquidação',
-                            settlementFrequencyLabel: 'Frequência de liquidação',
-                        },
-                    },
-                },
             },
             expensifyCard: {
                 title: 'Cartão Expensify',
@@ -5337,7 +5307,7 @@ _Para instruções mais detalhadas, [visite nosso site de ajuda](${CONST.NETSUIT
                 prompt3: 'baixar um backup',
                 prompt4: 'primeiro.',
             },
-            importedTagsMessage: (columnCounts: number) =>
+            importedTagsMessage: ({columnCounts}: ImportedTagsMessageParams) =>
                 `Encontramos *${columnCounts} colunas* na sua planilha. Selecione *Nome* ao lado da coluna que contém os nomes das tags. Você também pode selecionar *Ativado* ao lado da coluna que define o status das tags.`,
             cannotDeleteOrDisableAllTags: {
                 title: 'Não é possível excluir ou desativar todas as tags',
@@ -5507,8 +5477,7 @@ _Para instruções mais detalhadas, [visite nosso site de ajuda](${CONST.NETSUIT
                 giveItNameInstruction: 'Torne-o único o suficiente para diferenciá-lo de outros cartões. Casos de uso específicos são ainda melhores!',
                 cardName: 'Nome do cartão',
                 letsDoubleCheck: 'Vamos conferir se está tudo certo.',
-                willBeReadyToUse: 'Este cartão estará pronto para uso imediatamente.',
-                willBeReadyToShip: 'Este cartão estará pronto para envio imediato.',
+                willBeReady: 'Este cartão estará pronto para uso imediatamente.',
                 cardholder: 'Titular do cartão',
                 cardType: 'Tipo de cartão',
                 limit: 'Limite',
@@ -6163,7 +6132,7 @@ Exija detalhes de despesas como recibos e descrições, defina limites e padrõe
         rules: {
             individualExpenseRules: {
                 title: 'Despesas',
-                subtitle: (categoriesPageLink: string, tagsPageLink: string) =>
+                subtitle: ({categoriesPageLink, tagsPageLink}: IndividualExpenseRulesSubtitleParams) =>
                     `<muted-text>Defina controles de gastos e padrões para despesas individuais. Você também pode criar regras para <a href="${categoriesPageLink}">categorias</a> e <a href="${tagsPageLink}">tags</a>.</muted-text>`,
                 receiptRequiredAmount: 'Valor que exige recibo',
                 receiptRequiredAmountDescription: 'Exigir recibos quando o gasto exceder este valor, a menos que seja substituído por uma regra de categoria.',
@@ -6234,10 +6203,6 @@ Exija detalhes de despesas como recibos e descrições, defina limites e padrõe
                 title: 'Regras de categoria',
                 approver: 'Aprovador',
                 requireDescription: 'Exigir descrição',
-                requireFields: 'Exigir campos',
-                requiredFieldsTitle: 'Campos obrigatórios',
-                requiredFieldsDescription: (categoryName: string) => `Isso será aplicado a todas as despesas categorizadas como <strong>${categoryName}</strong>.`,
-                requireAttendees: 'Exigir participantes',
                 descriptionHint: 'Dica de descrição',
                 descriptionHintDescription: (categoryName: string) =>
                     `Lembre os funcionários de fornecer informações adicionais para gastos em “${categoryName}”. Essa dica aparece no campo de descrição das despesas.`,
@@ -6469,6 +6434,12 @@ Exija detalhes de despesas como recibos e descrições, defina limites e padrõe
         deleteReportField: (fieldType: string, fieldName?: string) => `removeu o Campo de Relatório de ${fieldType} "${fieldName}"`,
         preventSelfApproval: ({oldValue, newValue}: UpdatedPolicyPreventSelfApprovalParams) =>
             `atualizado "Evitar autoaprovação" para "${newValue === 'true' ? 'Ativado' : 'Desativado'}" (anteriormente "${oldValue === 'true' ? 'Ativado' : 'Desativado'}")`,
+        updateMaxExpenseAmountNoReceipt: ({oldValue, newValue}: UpdatedPolicyFieldWithNewAndOldValueParams) =>
+            `alterou o valor máximo de despesa que exige recibo para ${newValue} (antes ${oldValue})`,
+        updateMaxExpenseAmount: ({oldValue, newValue}: UpdatedPolicyFieldWithNewAndOldValueParams) =>
+            `alterou o valor máximo de despesa para violações para ${newValue} (anteriormente ${oldValue})`,
+        updateMaxExpenseAge: ({oldValue, newValue}: UpdatedPolicyFieldWithNewAndOldValueParams) =>
+            `atualizado "Idade máxima da despesa (dias)" para "${newValue}" (anteriormente "${oldValue === 'false' ? CONST.POLICY.DEFAULT_MAX_EXPENSE_AGE : oldValue}")`,
         updateMonthlyOffset: ({oldValue, newValue}: UpdatedPolicyFieldWithNewAndOldValueParams) => {
             if (!oldValue) {
                 return `defina a data de envio do relatório mensal para "${newValue}"`;
@@ -6622,40 +6593,8 @@ Exija detalhes de despesas como recibos e descrições, defina limites e padrõe
                 }
             }
         },
-        setDefaultBankAccount: ({bankAccountName, maskedBankAccountNumber}: {bankAccountName: string; maskedBankAccountNumber: string}) =>
-            `definir a conta bancária empresarial padrão como "${bankAccountName ? `${bankAccountName}: ` : ''}${maskedBankAccountNumber}"`,
-        removedDefaultBankAccount: ({bankAccountName, maskedBankAccountNumber}: {bankAccountName: string; maskedBankAccountNumber: string}) =>
-            `removeu a conta bancária empresarial padrão "${bankAccountName ? `${bankAccountName}: ` : ''}${maskedBankAccountNumber}"`,
-        changedDefaultBankAccount: ({
-            bankAccountName,
-            maskedBankAccountNumber,
-            oldBankAccountName,
-            oldMaskedBankAccountNumber,
-        }: {
-            bankAccountName: string;
-            maskedBankAccountNumber: string;
-            oldBankAccountName: string;
-            oldMaskedBankAccountNumber: string;
-        }) =>
-            `alterou a conta bancária empresarial padrão para "${bankAccountName ? `${bankAccountName}: ` : ''}${maskedBankAccountNumber}" (anteriormente "${oldBankAccountName ? `${oldBankAccountName}: ` : ''}${oldMaskedBankAccountNumber}")`,
-        changedInvoiceCompanyName: ({newValue, oldValue}: {newValue: string; oldValue?: string}) =>
-            oldValue ? `alterou o nome da empresa da fatura para "${newValue}" (anteriormente "${oldValue}")` : `definir o nome da empresa da fatura como "${newValue}"`,
-        changedInvoiceCompanyWebsite: ({newValue, oldValue}: {newValue: string; oldValue?: string}) =>
-            oldValue ? `alterou o site da empresa na fatura para "${newValue}" (anteriormente "${oldValue}")` : `definir o site da empresa na fatura como "${newValue}"`,
         changedCustomReportNameFormula: ({newValue, oldValue}: UpdatedPolicyFieldWithNewAndOldValueParams) =>
             `alterou a fórmula do nome do relatório personalizado para "${newValue}" (anteriormente "${oldValue}")`,
-        changedReimburser: ({newReimburser, previousReimburser}: UpdatedPolicyReimburserParams) =>
-            previousReimburser ? `alterou o pagador autorizado para "${newReimburser}" (anteriormente "${previousReimburser}")` : `alterou o pagador autorizado para "${newReimburser}"`,
-        setReceiptRequiredAmount: ({newValue}: UpdatedPolicyFieldWithNewAndOldValueParams) => `definir valor obrigatório do recibo como "${newValue}"`,
-        changedReceiptRequiredAmount: ({oldValue, newValue}: UpdatedPolicyFieldWithNewAndOldValueParams) =>
-            `alterou o valor exigido do recibo para "${newValue}" (anteriormente "${oldValue}")`,
-        removedReceiptRequiredAmount: ({oldValue}: UpdatedPolicyFieldWithNewAndOldValueParams) => `valor obrigatório de recibo removido (antes era "${oldValue}")`,
-        setMaxExpenseAmount: ({newValue}: UpdatedPolicyFieldWithNewAndOldValueParams) => `definir valor máximo de despesa como "${newValue}"`,
-        changedMaxExpenseAmount: ({oldValue, newValue}: UpdatedPolicyFieldWithNewAndOldValueParams) => `valor máximo de despesa alterado para "${newValue}" (antes "${oldValue}")`,
-        removedMaxExpenseAmount: ({oldValue}: UpdatedPolicyFieldWithNewAndOldValueParams) => `removeu o valor máximo de despesa (anteriormente "${oldValue}")`,
-        setMaxExpenseAge: ({newValue}: UpdatedPolicyFieldWithNewAndOldValueParams) => `definir idade máxima da despesa como "${newValue}" dias`,
-        changedMaxExpenseAge: ({oldValue, newValue}: UpdatedPolicyFieldWithNewAndOldValueParams) => `alterou a idade máxima da despesa para "${newValue}" dias (antes "${oldValue}")`,
-        removedMaxExpenseAge: ({oldValue}: UpdatedPolicyFieldWithNewAndOldValueParams) => `removeu a idade máxima de despesa (anteriormente "${oldValue}" dias)`,
     },
     roomMembersPage: {
         memberNotFound: 'Membro não encontrado.',
@@ -6822,7 +6761,7 @@ Exija detalhes de despesas como recibos e descrições, defina limites e padrõe
             amount: {
                 lessThan: ({amount}: OptionalParam<RequestAmountParams> = {}) => `Menos de ${amount ?? ''}`,
                 greaterThan: ({amount}: OptionalParam<RequestAmountParams> = {}) => `Maior que ${amount ?? ''}`,
-                between: (greaterThan: string, lessThan: string) => `Entre ${greaterThan} e ${lessThan}`,
+                between: ({greaterThan, lessThan}: FiltersAmountBetweenParams) => `Entre ${greaterThan} e ${lessThan}`,
                 equalTo: ({amount}: OptionalParam<RequestAmountParams> = {}) => `Igual a ${amount ?? ''}`,
             },
             card: {
@@ -7251,7 +7190,6 @@ Exija detalhes de despesas como recibos e descrições, defina limites e padrõe
         maxAge: ({maxAge}: ViolationsMaxAgeParams) => `Data anterior a ${maxAge} dias`,
         missingCategory: 'Categoria ausente',
         missingComment: 'Descrição obrigatória para a categoria selecionada',
-        missingAttendees: 'Vários participantes são obrigatórios para esta categoria',
         missingTag: ({tagName}: ViolationsMissingTagParams = {}) => `Faltando ${tagName ?? 'Tag'}`,
         modifiedAmount: ({type, displayPercentVariance}: ViolationsModifiedAmountParams) => {
             switch (type) {
@@ -7359,7 +7297,6 @@ Exija detalhes de despesas como recibos e descrições, defina limites e padrõe
         hold: 'Esta despesa foi colocada em espera',
         resolvedDuplicates: 'duplicata resolvida',
         companyCardRequired: 'Compras com cartão da empresa obrigatórias',
-        noRoute: 'Selecione um endereço válido',
     },
     reportViolations: {
         [CONST.REPORT_VIOLATIONS.FIELD_REQUIRED]: ({fieldName}: RequiredFieldParams) => `${fieldName} é obrigatório`,
@@ -7981,18 +7918,9 @@ Aqui está um *recibo de teste* para mostrar como funciona:`,
             addAdminError: 'Não foi possível adicionar este membro como administrador. Tente novamente.',
             revokeAdminAccess: 'Revogar acesso de administrador',
             cantRevokeAdminAccess: 'Não é possível revogar o acesso de administrador do contato técnico',
-            error: {
-                removeAdmin: 'Não foi possível remover este usuário como Administrador. Tente novamente.',
-                removeDomain: 'Não foi possível remover este domínio. Tente novamente.',
-                removeDomainNameInvalid: 'Insira o nome do seu domínio para redefini-lo.',
-            },
-            resetDomain: 'Redefinir domínio',
-            resetDomainExplanation: ({domainName}: {domainName?: string}) => `Digite <strong>${domainName}</strong> para confirmar a redefinição do domínio.`,
-            enterDomainName: 'Insira seu nome de domínio aqui',
-            resetDomainInfo: `Esta ação é <strong>permanente</strong> e os seguintes dados serão excluídos: <br/> <ul><li>Conexões de cartão corporativo e quaisquer despesas não reportadas desses cartões</li> <li>Configurações de SAML e de grupo</li> </ul> Todas as contas, workspaces, relatórios, despesas e outros dados permanecerão. <br/><br/>Observação: Você pode remover este domínio da sua lista de domínios excluindo o e-mail associado dos seus <a href="#">métodos de contato</a>.`,
+            error: {removeAdmin: 'Não foi possível remover este usuário como Administrador. Tente novamente.'},
         },
         members: {title: 'Membros', findMember: 'Encontrar membro'},
-        domainAdmins: 'Administradores de domínio',
     },
     gps: {
         tooltip: 'Rastreamento por GPS em andamento! Quando terminar, pare o rastreamento abaixo.',
@@ -8015,6 +7943,7 @@ Aqui está um *recibo de teste* para mostrar como funciona:`,
             confirm: 'Descartar rastreamento de distância',
         },
         zeroDistanceTripModal: {title: 'Não é possível criar a despesa', prompt: 'Você não pode criar uma despesa com o mesmo local de partida e de chegada.'},
+
         locationRequiredModal: {
             title: 'Acesso à localização necessário',
             prompt: 'Permita o acesso à localização nas configurações do seu dispositivo para iniciar o rastreamento de distância por GPS.',
@@ -8033,13 +7962,6 @@ Aqui está um *recibo de teste* para mostrar como funciona:`,
             subtitle: 'Registre milhas ou quilômetros automaticamente com o GPS e transforme viagens em despesas instantaneamente.',
             button: 'Baixar o app',
         },
-        notification: {title: 'Rastreamento por GPS em andamento', body: 'Ir para o app para finalizar'},
-        locationServicesRequiredModal: {
-            title: 'Acesso à localização obrigatório',
-            confirm: 'Abrir configurações',
-            prompt: 'Permita o acesso à localização nas configurações do seu dispositivo para iniciar o rastreamento de distância por GPS.',
-        },
-        fabGpsTripExplained: 'Ir para a tela de GPS (Ação flutuante)',
     },
 };
 // IMPORTANT: This line is manually replaced in generate translation files by scripts/generateTranslations.ts,
diff --git a/src/languages/zh-hans.ts b/src/languages/zh-hans.ts
index c4218ae09533..1b4f353c16b3 100644
--- a/src/languages/zh-hans.ts
+++ b/src/languages/zh-hans.ts
@@ -28,6 +28,24 @@ import type {
     EditActionParams,
     ExportAgainModalDescriptionParams,
     ExportIntegrationSelectedParams,
+    FileLimitParams,
+    FileTypeParams,
+    FiltersAmountBetweenParams,
+    FlightLayoverParams,
+    FlightParams,
+    FocusModeUpdateParams,
+    FormattedMaxLengthParams,
+    GoBackMessageParams,
+    HarvestCreatedExpenseReportParams,
+    ImportedTagsMessageParams,
+    ImportedTypesParams,
+    ImportFieldParams,
+    ImportMembersSuccessfulDescriptionParams,
+    ImportPerDiemRatesSuccessfulDescriptionParams,
+    ImportTagsSuccessfulDescriptionParams,
+    IncorrectZipFormatParams,
+    IndividualExpenseRulesSubtitleParams,
+    InstantSummaryParams,
     IntacctMappingTitleParams,
     IntegrationExportParams,
     IntegrationSyncFailedParams,
@@ -115,6 +133,9 @@ import type {
     SplitDateRangeParams,
     SplitExpenseEditTitleParams,
     SplitExpenseSubtitleParams,
+    SpreadCategoriesParams,
+    SpreadFieldNameParams,
+    SpreadSheetColumnParams,
     StatementTitleParams,
     StepCounterParams,
     StripePaidParams,
@@ -164,7 +185,6 @@ import type {
     UpdatedPolicyManualApprovalThresholdParams,
     UpdatedPolicyPreventSelfApprovalParams,
     UpdatedPolicyReimbursementEnabledParams,
-    UpdatedPolicyReimburserParams,
     UpdatedPolicyReportFieldDefaultValueParams,
     UpdatedPolicyTagFieldParams,
     UpdatedPolicyTagNameParams,
@@ -259,6 +279,7 @@ const translations: TranslationDeepObject<typeof en> = {
         searchWithThreeDots: '搜索…',
         next: '下一步',
         previous: '上一步',
+        // @context Navigation button that returns the user to the previous screen. Should be interpreted as a UI action label.
         goBack: '返回',
         create: '创建',
         add: '添加',
@@ -276,7 +297,6 @@ const translations: TranslationDeepObject<typeof en> = {
         zoom: 'Zoom',
         password: '密码',
         magicCode: '魔法代码',
-        digits: '位数字',
         twoFactorCode: '双重验证代码',
         workspaces: '工作区',
         inbox: '收件箱',
@@ -533,6 +553,10 @@ const translations: TranslationDeepObject<typeof en> = {
         value: '值',
         downloadFailedTitle: '下载失败',
         downloadFailedDescription: '您的下载未能完成。请稍后再试。',
+        downloadFailedEmptyReportDescription: () => ({
+            one: '您无法导出空报告。',
+            other: () => '您无法导出空报告。',
+        }),
         filterLogs: '筛选日志',
         network: '网络',
         reportID: '报告 ID',
@@ -624,6 +648,7 @@ const translations: TranslationDeepObject<typeof en> = {
         copyToClipboard: '复制到剪贴板',
         thisIsTakingLongerThanExpected: '这比预期花费的时间更长...',
         domains: '域名',
+        viewReport: '查看报告',
         actionRequired: '需要操作',
         duplicate: '复制',
         duplicated: '已重复',
@@ -683,12 +708,12 @@ const translations: TranslationDeepObject<typeof en> = {
         protectedPDFNotSupported: '不支持受密码保护的 PDF',
         attachmentImageResized: '此图片已调整大小以供预览。下载以查看完整分辨率。',
         attachmentImageTooLarge: '此图片过大，无法在上传前预览。',
-        tooManyFiles: (fileLimit: number) => `一次最多只能上传 ${fileLimit} 个文件。`,
+        tooManyFiles: ({fileLimit}: FileLimitParams) => `一次最多只能上传 ${fileLimit} 个文件。`,
         sizeExceededWithValue: ({maxUploadSizeInMB}: SizeExceededParams) => `文件超过 ${maxUploadSizeInMB} MB。请重试。`,
         someFilesCantBeUploaded: '某些文件无法上传',
         sizeLimitExceeded: ({maxUploadSizeInMB}: SizeExceededParams) => `文件大小必须小于 ${maxUploadSizeInMB} MB。更大的文件将不会被上传。`,
         maxFileLimitExceeded: '您一次最多可以上传 30 张收据。超出部分将不会被上传。',
-        unsupportedFileType: (fileType: string) => `不支持 ${fileType} 文件。只有支持的文件类型会被上传。`,
+        unsupportedFileType: ({fileType}: FileTypeParams) => `不支持 ${fileType} 文件。只有支持的文件类型会被上传。`,
         learnMoreAboutSupportedFiles: '了解支持的格式详情。',
         passwordProtected: '不支持受密码保护的 PDF 文件。只有受支持的文件会被上传。',
     },
@@ -713,8 +738,8 @@ const translations: TranslationDeepObject<typeof en> = {
     composer: {
         noExtensionFoundForMimeType: '未找到与该 MIME 类型对应的扩展名',
         problemGettingImageYouPasted: '获取您粘贴的图片时出现问题',
-        commentExceededMaxLength: (formattedMaxLength: string) => `最大评论长度为 ${formattedMaxLength} 个字符。`,
-        taskTitleExceededMaxLength: (formattedMaxLength: string) => `任务标题的最大长度为 ${formattedMaxLength} 个字符。`,
+        commentExceededMaxLength: ({formattedMaxLength}: FormattedMaxLengthParams) => `最大评论长度为 ${formattedMaxLength} 个字符。`,
+        taskTitleExceededMaxLength: ({formattedMaxLength}: FormattedMaxLengthParams) => `任务标题的最大长度为 ${formattedMaxLength} 个字符。`,
     },
     baseUpdateAppModal: {
         updateApp: '更新应用程序',
@@ -725,35 +750,6 @@ const translations: TranslationDeepObject<typeof en> = {
         expired: '您的会话已过期。',
         signIn: '请重新登录。',
     },
-    multifactorAuthentication: {
-        biometricsTest: {
-            biometricsTest: '生物特征测试',
-            authenticationSuccessful: '认证成功',
-            successfullyAuthenticatedUsing: ({authType}) => `您已成功使用${authType}进行认证。`,
-            troubleshootBiometricsStatus: ({registered}) => `生物特征（${registered ? '已注册' : '未注册'}）`,
-            yourAttemptWasUnsuccessful: '您的认证尝试未成功。',
-            youCouldNotBeAuthenticated: '无法认证您',
-            areYouSureToReject: '您确定要拒绝吗？如果您关闭此屏幕，认证尝试将被拒绝。',
-            rejectAuthentication: '拒绝认证',
-            test: '测试',
-            biometricsAuthentication: '生物特征认证',
-        },
-        pleaseEnableInSystemSettings: {
-            start: '请在',
-            link: '系统设置',
-            end: '中启用面部/指纹验证或设置设备密码。',
-        },
-        oops: '哎呀，出错了',
-        looksLikeYouRanOutOfTime: '看起来你的时间用完了！请在商户处再试一次。',
-        youRanOutOfTime: '时间已经用完',
-        letsVerifyItsYou: '让我们验证是不是你',
-        verifyYourself: {
-            biometrics: '用你的脸部或指纹进行身份验证',
-        },
-        enableQuickVerification: {
-            biometrics: '使用您的脸部或指纹启用快速安全验证。无需密码或代码。',
-        },
-    },
     validateCodeModal: {
         successfulSignInTitle: dedent(`
             阿布拉卡达布拉，
@@ -919,7 +915,8 @@ const translations: TranslationDeepObject<typeof en> = {
     adminOnlyCanPost: '只有管理员可以在此房间发送消息。',
     reportAction: {
         asCopilot: '作为副驾驶用于',
-        harvestCreatedExpenseReport: (reportUrl: string, reportName: string) => `创建了此报表以汇总 <a href="${reportUrl}">${reportName}</a> 中无法按您选择的频率提交的所有费用`,
+        harvestCreatedExpenseReport: ({reportUrl, reportName}: HarvestCreatedExpenseReportParams) =>
+            `创建了此报表以汇总 <a href="${reportUrl}">${reportName}</a> 中无法按您选择的频率提交的所有费用`,
         createdReportForUnapprovedTransactions: ({reportUrl, reportName}: CreatedReportForUnapprovedTransactionsParams) =>
             `为来自 <a href="${reportUrl}">${reportName}</a> 的所有暂挂报销创建了此报表`,
     },
@@ -957,7 +954,7 @@ const translations: TranslationDeepObject<typeof en> = {
         buttonFind: '查找内容…',
         buttonMySettings: '我的设置',
         fabNewChat: '开始聊天',
-        fabNewChatExplained: '打开操作菜单',
+        fabNewChatExplained: '开始聊天（浮动操作）',
         fabScanReceiptExplained: '扫描收据（浮动操作）',
         chatPinned: '聊天已置顶',
         draftedMessage: '已起草的消息',
@@ -983,13 +980,13 @@ const translations: TranslationDeepObject<typeof en> = {
         chooseSpreadsheet: '<muted-link>选择要导入的电子表格文件。支持的格式：.csv、.txt、.xls 和 .xlsx。</muted-link>',
         chooseSpreadsheetMultiLevelTag: `<muted-link>选择要导入的电子表格文件。<a href="${CONST.IMPORT_SPREADSHEET.MULTI_LEVEL_TAGS_ARTICLE_LINK}">了解更多</a>有关支持的文件格式的信息。</muted-link>`,
         fileContainsHeader: '文件包含列标题',
-        column: (name: string) => `列 ${name}`,
-        fieldNotMapped: (fieldName: string) => `哎呀！必填字段（“${fieldName}”）尚未映射。请检查后重试。`,
-        singleFieldMultipleColumns: (fieldName: string) => `哎呀！您已将单个字段（“${fieldName}”）映射到了多个列。请检查后重试。`,
-        emptyMappedField: (fieldName: string) => `哎呀！字段（“${fieldName}”）包含一个或多个空值。请检查后重试。`,
+        column: ({name}: SpreadSheetColumnParams) => `列 ${name}`,
+        fieldNotMapped: ({fieldName}: SpreadFieldNameParams) => `哎呀！必填字段（“${fieldName}”）尚未映射。请检查后重试。`,
+        singleFieldMultipleColumns: ({fieldName}: SpreadFieldNameParams) => `哎呀！您已将单个字段（“${fieldName}”）映射到了多个列。请检查后重试。`,
+        emptyMappedField: ({fieldName}: SpreadFieldNameParams) => `哎呀！字段（“${fieldName}”）包含一个或多个空值。请检查后重试。`,
         importSuccessfulTitle: '导入成功',
-        importCategoriesSuccessfulDescription: ({categories}: {categories: number}) => (categories > 1 ? `已添加 ${categories} 个类别。` : '已添加 1 个类别。'),
-        importMembersSuccessfulDescription: ({added, updated}: {added: number; updated: number}) => {
+        importCategoriesSuccessfulDescription: ({categories}: SpreadCategoriesParams) => (categories > 1 ? `已添加 ${categories} 个类别。` : '已添加 1 个类别。'),
+        importMembersSuccessfulDescription: ({added, updated}: ImportMembersSuccessfulDescriptionParams) => {
             if (!added && !updated) {
                 return '尚未添加或更新任何成员。';
             }
@@ -1001,9 +998,9 @@ const translations: TranslationDeepObject<typeof en> = {
             }
             return added > 1 ? `已添加 ${added} 名成员。` : '已添加 1 名成员。';
         },
-        importTagsSuccessfulDescription: ({tags}: {tags: number}) => (tags > 1 ? `已添加 ${tags} 个标签。` : '已添加 1 个标签。'),
+        importTagsSuccessfulDescription: ({tags}: ImportTagsSuccessfulDescriptionParams) => (tags > 1 ? `已添加 ${tags} 个标签。` : '已添加 1 个标签。'),
         importMultiLevelTagsSuccessfulDescription: '已添加多级标签。',
-        importPerDiemRatesSuccessfulDescription: ({rates}: {rates: number}) => (rates > 1 ? `已添加 ${rates} 项每日津贴标准。` : '已添加 1 个日津贴费率。'),
+        importPerDiemRatesSuccessfulDescription: ({rates}: ImportPerDiemRatesSuccessfulDescriptionParams) => (rates > 1 ? `已添加 ${rates} 项每日津贴标准。` : '已添加 1 个日津贴费率。'),
         importFailedTitle: '导入失败',
         importFailedDescription: '请确保所有字段均已正确填写，然后重试。如果问题仍然存在，请联系 Concierge。',
         importDescription: '通过单击下面每个已导入列旁边的下拉菜单，选择要从电子表格映射的字段。',
@@ -1178,8 +1175,14 @@ const translations: TranslationDeepObject<typeof en> = {
             one: '你确定要删除此报销吗？',
             other: '您确定要删除这些报销吗？',
         }),
-        deleteReport: '删除报表',
-        deleteReportConfirmation: '您确定要删除此报表吗？',
+        deleteReport: () => ({
+            one: '删除报告',
+            other: '删除报告',
+        }),
+        deleteReportConfirmation: () => ({
+            one: '您确定要删除此报告吗？',
+            other: '您确定要删除这些报告吗？',
+        }),
         settledExpensify: '已支付',
         done: '完成',
         settledElsewhere: '在其他地方已支付',
@@ -1423,8 +1426,8 @@ const translations: TranslationDeepObject<typeof en> = {
         moveExpensesError: '您无法将每日津贴费用移至其他工作区的报告，因为不同工作区之间的每日津贴费率可能有所不同。',
         changeApprover: {
             title: '更改审批人',
-            header: ({workflowSettingLink}: WorkflowSettingsParam) =>
-                `选择一个选项来更改此报告的审批人。（更新您的<a href="${workflowSettingLink}">工作区设置</a>，可永久更改所有报告的审批人。）`,
+            subtitle: '选择一个选项以更改此报表的审批人。',
+            description: ({workflowSettingLink}: WorkflowSettingsParam) => `您也可以在<a href="${workflowSettingLink}">工作流设置</a>中永久更改所有报表的审批人。`,
             changedApproverMessage: (managerID: number) => `将审批人更改为 <mention-user accountID="${managerID}"/>`,
             actions: {
                 addApprover: '添加审批人',
@@ -1442,13 +1445,7 @@ const translations: TranslationDeepObject<typeof en> = {
         splitDateRange: ({startDate, endDate, count}: SplitDateRangeParams) => `${startDate} 至 ${endDate}（${count} 天）`,
         splitByDate: '按日期拆分',
         routedDueToDEW: ({to}: RoutedDueToDEWParams) => `报告因自定义审批工作流而转发至 ${to}`,
-        timeTracking: {
-            hoursAt: (hours: number, rate: string) => `${hours} ${hours === 1 ? '小时' : '小时'} @ ${rate} / 小时`,
-            hrs: '小时',
-            hours: '小时',
-            ratePreview: (rate: string) => `${rate} / 小时`,
-            amountTooLargeError: '总金额过大。请减少工时或降低费率。',
-        },
+        timeTracking: {hoursAt: (hours: number, rate: string) => `${hours} ${hours === 1 ? '小时' : '小时'} @ ${rate} / 小时`, hrs: '小时'},
     },
     transactionMerge: {
         listPage: {
@@ -1922,6 +1919,13 @@ const translations: TranslationDeepObject<typeof en> = {
         chatToConciergeToUnlock: '与 Concierge 聊天以解决安全问题并解锁您的账户。',
         chatWithConcierge: '与 Concierge 聊天',
     },
+    passwordPage: {
+        changePassword: '更改密码',
+        changingYourPasswordPrompt: '更改密码会同时更新您在 Expensify.com 和 New Expensify 账户中的密码。',
+        currentPassword: '当前密码',
+        newPassword: '新密码',
+        newPasswordPrompt: '您的新密码必须不同于旧密码，并且至少包含 8 个字符，1 个大写字母、1 个小写字母和 1 个数字。',
+    },
     twoFactorAuth: {
         headerTitle: '双重身份验证',
         twoFactorAuthEnabled: '已启用双重身份验证',
@@ -2308,7 +2312,7 @@ ${amount}，商户：${merchant} - ${date}`,
     transferAmountPage: {
         transfer: ({amount}: TransferParams) => `转账${amount ? ` ${amount}` : ''}`,
         instant: '即时（借记卡）',
-        instantSummary: (rate: string, minAmount: string) => `${rate}% 费用（最低 ${minAmount}）`,
+        instantSummary: ({rate, minAmount}: InstantSummaryParams) => `${rate}% 费用（最低 ${minAmount}）`,
         ach: '1–3 个工作日（银行账户）',
         achSummary: '无手续费',
         whichAccount: '哪个账户？',
@@ -2343,26 +2347,10 @@ ${amount}，商户：${merchant} - ${date}`,
             comment: (value: string) => `将描述更改为 “${value}”`,
             merchant: (value: string) => `将商户更新为“${value}”`,
             reimbursable: (value: boolean) => `更新报销 ${value ? '可报销' : '不予报销'}`,
-            report: (value: string) => `添加到名为“${value}”的报表`,
+            report: (value: string) => `添加一个名为“${value}”的报告`,
             tag: (value: string) => `将标签更新为“${value}”`,
             tax: (value: string) => `将税率更新为 ${value}`,
         },
-        newRule: '新规则',
-        addRule: {
-            title: '添加规则',
-            expenseContains: '如果报销包含：',
-            applyUpdates: '然后应用这些更新：',
-            merchantHint: '输入 * 以创建适用于所有商家的规则',
-            addToReport: '添加到名为',
-            createReport: '如有必要则创建报表',
-            applyToExistingExpenses: '应用到现有匹配报销',
-            confirmError: '输入商户并至少应用一项更新',
-            confirmErrorMerchant: '请输入商家',
-            confirmErrorUpdate: '请至少应用一次更新',
-            saveRule: '保存规则',
-        },
-        editRule: {title: '编辑规则'},
-        deleteRule: {deleteSingle: '删除规则', deleteMultiple: '删除规则', deleteSinglePrompt: '您确定要删除此规则吗？', deleteMultiplePrompt: '您确定要删除这些规则吗？'},
     },
     preferencesPage: {
         appSection: {
@@ -2854,7 +2842,7 @@ ${
             dateShouldBeBefore: (dateString: string) => `日期应早于 ${dateString}`,
             dateShouldBeAfter: (dateString: string) => `日期应晚于 ${dateString}`,
             hasInvalidCharacter: '名称只能包含拉丁字符',
-            incorrectZipFormat: (zipFormat?: string) => `邮政编码格式不正确${zipFormat ? `可接受的格式：${zipFormat}` : ''}`,
+            incorrectZipFormat: ({zipFormat}: IncorrectZipFormatParams = {}) => `邮政编码格式不正确${zipFormat ? `可接受的格式：${zipFormat}` : ''}`,
             invalidPhoneNumber: `请确保电话号码有效（例如：${CONST.EXAMPLE_PHONE_NUMBER}）`,
         },
     },
@@ -2934,7 +2922,8 @@ ${
     },
     focusModeUpdateModal: {
         title: '欢迎使用 #focus 模式！',
-        prompt: (priorityModePageUrl: string) => `通过仅查看未读聊天或需要你关注的聊天，随时掌握一切动态。别担心，你可以随时在<a href="${priorityModePageUrl}">设置</a>中更改此选项。`,
+        prompt: ({priorityModePageUrl}: FocusModeUpdateParams) =>
+            `通过仅查看未读聊天或需要你关注的聊天，随时掌握一切动态。别担心，你可以随时在<a href="${priorityModePageUrl}">设置</a>中更改此选项。`,
     },
     notFound: {
         chatYouLookingForCannotBeFound: '找不到您要查找的聊天记录。',
@@ -2953,6 +2942,15 @@ ${
         subtitle: '无法完成您的请求。请稍后再试。',
         wrongTypeSubtitle: '该搜索无效。请尝试调整你的搜索条件。',
     },
+    setPasswordPage: {
+        enterPassword: '输入密码',
+        setPassword: '设置密码',
+        newPasswordPrompt: '您的密码必须至少包含 8 个字符，且至少包含 1 个大写字母、1 个小写字母和 1 个数字。',
+        passwordFormTitle: '欢迎回到全新 Expensify！请设置您的密码。',
+        passwordNotSet: '我们未能设置您的新密码。我们已向您发送了一个新的密码链接，请重试。',
+        setPasswordLinkInvalid: '该设置密码链接无效或已过期。新的链接已发送到您的邮箱！',
+        validateAccount: '验证账户',
+    },
     statusPage: {
         status: '状态',
         statusExplanation: '添加一个表情符号，让同事和朋友能轻松了解发生了什么。你也可以选择性地添加一条消息！',
@@ -3093,13 +3091,10 @@ ${
         errorMessageInvalidPhone: `请输入不带括号或短横线的有效电话号码。如果您在美国以外，请包含您的国家区号（例如：${CONST.EXAMPLE_PHONE_NUMBER}）。`,
         errorMessageInvalidEmail: '无效的邮箱',
         userIsAlreadyMember: ({login, name}: UserIsAlreadyMemberParams) => `${login} 已经是 ${name} 的成员`,
-        userIsAlreadyAnAdmin: ({login, name}: UserIsAlreadyMemberParams) => `${login} 已经是 ${name} 的管理员`,
     },
     onfidoStep: {
         acceptTerms: '通过继续申请激活您的 Expensify Wallet，即表示您确认已阅读、理解并接受',
         facialScan: 'Onfido 面部扫描政策与授权',
-        onfidoLinks: (onfidoTitle: string) =>
-            `<muted-text-micro>${onfidoTitle} <a href='${CONST.ONFIDO_FACIAL_SCAN_POLICY_URL}'>Onfido 面部扫描政策与授权</a>，<a href='${CONST.ONFIDO_PRIVACY_POLICY_URL}'>隐私</a> 和 <a href='${CONST.ONFIDO_TERMS_OF_SERVICE_URL}'>服务条款</a>。</muted-text-micro>`,
         tryAgain: '重试',
         verifyIdentity: '验证身份',
         letsVerifyIdentity: '让我们验证您的身份',
@@ -3586,7 +3581,7 @@ ${
         flight: '航班',
         flightDetails: {
             passenger: '乘客',
-            layover: (layover: string) => `<muted-text-label>在此航班前，你有一段<strong>${layover}的中转停留时间</strong></muted-text-label>`,
+            layover: ({layover}: FlightLayoverParams) => `<muted-text-label>在此航班前，你有一段<strong>${layover}的中转停留时间</strong></muted-text-label>`,
             takeOff: '起飞',
             landing: '登录页',
             seat: '座位',
@@ -3674,17 +3669,15 @@ ${
             conciergeMessage: ({domain}: {domain: string}) => `为域名：${domain} 启用差旅失败。请检查并为此域名启用差旅。`,
         },
         updates: {
-            bookingTicketed: (airlineCode: string, origin: string, destination: string, startDate: string, confirmationID = '') =>
+            bookingTicketed: ({airlineCode, origin, destination, startDate, confirmationID = ''}: FlightParams) =>
                 `您于${startDate}的航班 ${airlineCode}（${origin} → ${destination}）已预订成功。确认代码：${confirmationID}`,
-            ticketVoided: (airlineCode: string, origin: string, destination: string, startDate: string) =>
-                `您在${startDate}乘坐的航班${airlineCode}（${origin} → ${destination}）的机票已作废。`,
-            ticketRefunded: (airlineCode: string, origin: string, destination: string, startDate: string) =>
+            ticketVoided: ({airlineCode, origin, destination, startDate}: FlightParams) => `您在${startDate}乘坐的航班${airlineCode}（${origin} → ${destination}）的机票已作废。`,
+            ticketRefunded: ({airlineCode, origin, destination, startDate}: FlightParams) =>
                 `您于 ${startDate} 搭乘的航班 ${airlineCode}（${origin} → ${destination}）的机票已被退款或改签。`,
-            flightCancelled: (airlineCode: string, origin: string, destination: string, startDate: string) =>
-                `您在 ${startDate}} 搭乘的航班 ${airlineCode}（${origin} → ${destination}）已被航空公司取消。`,
+            flightCancelled: ({airlineCode, origin, destination, startDate}: FlightParams) => `您在 ${startDate}} 搭乘的航班 ${airlineCode}（${origin} → ${destination}）已被航空公司取消。`,
             flightScheduleChangePending: (airlineCode: string) => `航空公司已对航班 ${airlineCode} 提出行程变更，我们正在等待确认。`,
             flightScheduleChangeClosed: (airlineCode: string, startDate?: string) => `行程变更已确认：航班 ${airlineCode} 现在将于 ${startDate} 起飞。`,
-            flightUpdated: (airlineCode: string, origin: string, destination: string, startDate: string) => `您在${startDate}的航班 ${airlineCode}（${origin} → ${destination}）已更新。`,
+            flightUpdated: ({airlineCode, origin, destination, startDate}: FlightParams) => `您在${startDate}的航班 ${airlineCode}（${origin} → ${destination}）已更新。`,
             flightCabinChanged: (airlineCode: string, cabinClass?: string) => `您在航班 ${airlineCode} 上的舱位等级已更新为 ${cabinClass}。`,
             flightSeatConfirmed: (airlineCode: string) => `您在航班 ${airlineCode} 上的座位分配已确认。`,
             flightSeatChanged: (airlineCode: string) => `您在航班 ${airlineCode} 上的座位分配已被更改。`,
@@ -4467,7 +4460,7 @@ ${
                 importTaxDescription: '从 NetSuite 导入税务组。',
                 importCustomFields: {
                     chooseOptionBelow: '请选择下面的一个选项：',
-                    label: (importedTypes: string[]) => `已作为 ${importedTypes.join('和')} 导入`,
+                    label: ({importedTypes}: ImportedTypesParams) => `已作为 ${importedTypes.join('和')} 导入`,
                     requiredFieldError: ({fieldName}: RequiredFieldParams) => `请输入${fieldName}`,
                     customSegments: {
                         title: '自定义分段/记录',
@@ -4582,17 +4575,18 @@ _如需更详细的说明，请[访问我们的帮助网站](${CONST.NETSUITE_IM
                     [CONST.INTEGRATION_ENTITY_MAP_TYPES.NETSUITE_DEFAULT]: {
                         label: 'NetSuite 员工默认值',
                         description: '未导入到 Expensify，在导出时应用',
-                        footerContent: (importField: string) => `如果您在 NetSuite 中使用 ${importField}，我们将在导出至 Expense Report 或 Journal Entry 时应用员工记录中设置的默认值。`,
+                        footerContent: ({importField}: ImportFieldParams) =>
+                            `如果您在 NetSuite 中使用 ${importField}，我们将在导出至 Expense Report 或 Journal Entry 时应用员工记录中设置的默认值。`,
                     },
                     [CONST.INTEGRATION_ENTITY_MAP_TYPES.TAG]: {
                         label: '标签',
                         description: '逐项级别',
-                        footerContent: (importField: string) => `${startCase(importField)} 将可在员工报表中的每一笔单独费用上进行选择。`,
+                        footerContent: ({importField}: ImportFieldParams) => `${startCase(importField)} 将可在员工报表中的每一笔单独费用上进行选择。`,
                     },
                     [CONST.INTEGRATION_ENTITY_MAP_TYPES.REPORT_FIELD]: {
                         label: '报表字段',
                         description: '报表级别',
-                        footerContent: (importField: string) => `${startCase(importField)} 选择将应用于员工报表上的所有报销费用。`,
+                        footerContent: ({importField}: ImportFieldParams) => `${startCase(importField)} 选择将应用于员工报表上的所有报销费用。`,
                     },
                 },
             },
@@ -4669,7 +4663,7 @@ _如需更详细的说明，请[访问我们的帮助网站](${CONST.NETSUITE_IM
                 commercialFeedPlaidDetails: `需要与你的银行进行设置，但我们会指导你完成。此功能通常仅限较大规模的公司使用。`,
                 directFeedDetails: '最简单的方法。立即使用您的主凭证进行连接。此方法最为常见。',
                 enableFeed: {
-                    title: (provider: string) => `启用您的 ${provider} 订阅源`,
+                    title: ({provider}: GoBackMessageParams) => `启用您的 ${provider} 订阅源`,
                     heading: '我们已与您的发卡机构进行了直接集成，可以快速且准确地将您的交易数据导入 Expensify。\n\n要开始使用，只需：',
                     visa: '我们与 Visa 有全球集成，但资格取决于发卡银行和卡片项目。\n\n要开始使用，只需：',
                     mastercard: '我们与 Mastercard 建立了全球集成，但可用性会因银行和卡片计划而异。\n\n要开始使用，只需：',
@@ -4936,21 +4930,6 @@ _如需更详细的说明，请[访问我们的帮助网站](${CONST.NETSUITE_IM
                     subtitle: '使用 Expensify Travel 获得最佳旅行优惠，并在一个地方管理所有商务费用。',
                     ctaText: '预订或管理',
                 },
-                travelInvoicing: {
-                    travelBookingSection: {title: '旅行预订', subtitle: '恭喜！您现在可以在此工作区预订和管理差旅了。', manageTravelLabel: '管理差旅'},
-                    centralInvoicingSection: {
-                        title: '集中开票',
-                        subtitle: '将所有差旅支出集中到月度发票中，而不是在购买时逐笔付款。',
-                        learnHow: '了解如何操作。',
-                        subsections: {
-                            currentTravelSpendLabel: '当前差旅行支出',
-                            currentTravelSpendCta: '支付余额',
-                            currentTravelLimitLabel: '当前出差限额',
-                            settlementAccountLabel: '结算账户',
-                            settlementFrequencyLabel: '结算频率',
-                        },
-                    },
-                },
             },
             expensifyCard: {
                 title: 'Expensify Card',
@@ -5231,7 +5210,7 @@ _如需更详细的说明，请[访问我们的帮助网站](${CONST.NETSUITE_IM
                 prompt3: '下载备份',
                 prompt4: '第一。',
             },
-            importedTagsMessage: (columnCounts: number) =>
+            importedTagsMessage: ({columnCounts}: ImportedTagsMessageParams) =>
                 `我们在您的电子表格中找到了 *${columnCounts} 列*。请在包含标签名称的列旁边选择 *Name*。您也可以在设置标签状态的列旁边选择 *Enabled*。`,
             cannotDeleteOrDisableAllTags: {
                 title: '无法删除或禁用所有标签',
@@ -5398,8 +5377,7 @@ _如需更详细的说明，请[访问我们的帮助网站](${CONST.NETSUITE_IM
                 giveItNameInstruction: '让它足够独特，以便与其他卡片区分开来。提供具体的使用场景会更好！',
                 cardName: '卡片名称',
                 letsDoubleCheck: '让我们再仔细检查一下，确保一切都正确。',
-                willBeReadyToUse: '此卡将立即可用。',
-                willBeReadyToShip: '此卡将立即准备好发货。',
+                willBeReady: '此卡将立即可用。',
                 cardholder: '持卡人',
                 cardType: '卡类型',
                 limit: '限制',
@@ -6034,7 +6012,7 @@ ${reportName}
         rules: {
             individualExpenseRules: {
                 title: '报销',
-                subtitle: (categoriesPageLink: string, tagsPageLink: string) =>
+                subtitle: ({categoriesPageLink, tagsPageLink}: IndividualExpenseRulesSubtitleParams) =>
                     `<muted-text>为单笔报销设置支出控制和默认值。您还可以为<a href="${categoriesPageLink}">类别</a>和<a href="${tagsPageLink}">标签</a>创建规则。</muted-text>`,
                 receiptRequiredAmount: '所需收据金额',
                 receiptRequiredAmountDescription: '当支出超过此金额时要求提供收据，除非被类别规则覆盖。',
@@ -6102,10 +6080,6 @@ ${reportName}
                 title: '类别规则',
                 approver: '审批人',
                 requireDescription: '要求描述',
-                requireFields: '必填字段',
-                requiredFieldsTitle: '必填项',
-                requiredFieldsDescription: (categoryName: string) => `这将适用于所有被归类为 <strong>${categoryName}</strong> 的费用。`,
-                requireAttendees: '要求与会者',
                 descriptionHint: '描述提示',
                 descriptionHintDescription: (categoryName: string) => `提醒员工为“${categoryName}”支出提供更多信息。此提示将显示在报销单的描述字段中。`,
                 descriptionHintLabel: '提示',
@@ -6331,6 +6305,10 @@ ${reportName}
         deleteReportField: (fieldType: string, fieldName?: string) => `已移除 ${fieldType} 报告字段“${fieldName}”`,
         preventSelfApproval: ({oldValue, newValue}: UpdatedPolicyPreventSelfApprovalParams) =>
             `已将“Prevent self-approval”更新为“${newValue === 'true' ? '已启用' : '已禁用'}”（先前为“${oldValue === 'true' ? '已启用' : '已禁用'}”）`,
+        updateMaxExpenseAmountNoReceipt: ({oldValue, newValue}: UpdatedPolicyFieldWithNewAndOldValueParams) => `将需要收据的报销金额上限更改为 ${newValue}（之前为 ${oldValue}）`,
+        updateMaxExpenseAmount: ({oldValue, newValue}: UpdatedPolicyFieldWithNewAndOldValueParams) => `将违规的最高报销金额更改为 ${newValue}（之前为 ${oldValue}）`,
+        updateMaxExpenseAge: ({oldValue, newValue}: UpdatedPolicyFieldWithNewAndOldValueParams) =>
+            `已将“费用最长期限（天）”更新为“${newValue}”（之前为“${oldValue === 'false' ? CONST.POLICY.DEFAULT_MAX_EXPENSE_AGE : oldValue}”）`,
         updateMonthlyOffset: ({oldValue, newValue}: UpdatedPolicyFieldWithNewAndOldValueParams) => {
             if (!oldValue) {
                 return `将月度报表提交日期设置为“${newValue}”`;
@@ -6473,38 +6451,7 @@ ${reportName}
                 }
             }
         },
-        setDefaultBankAccount: ({bankAccountName, maskedBankAccountNumber}: {bankAccountName: string; maskedBankAccountNumber: string}) =>
-            `将默认企业银行账户设置为“${bankAccountName ? `${bankAccountName}: ` : ''}${maskedBankAccountNumber}”`,
-        removedDefaultBankAccount: ({bankAccountName, maskedBankAccountNumber}: {bankAccountName: string; maskedBankAccountNumber: string}) =>
-            `移除了默认的企业银行账户 “${bankAccountName ? `${bankAccountName}: ` : ''}${maskedBankAccountNumber}”`,
-        changedDefaultBankAccount: ({
-            bankAccountName,
-            maskedBankAccountNumber,
-            oldBankAccountName,
-            oldMaskedBankAccountNumber,
-        }: {
-            bankAccountName: string;
-            maskedBankAccountNumber: string;
-            oldBankAccountName: string;
-            oldMaskedBankAccountNumber: string;
-        }) =>
-            `已将默认企业银行账户更改为“${bankAccountName ? `${bankAccountName}: ` : ''}${maskedBankAccountNumber}”（之前为“${oldBankAccountName ? `${oldBankAccountName}: ` : ''}${oldMaskedBankAccountNumber}”）`,
-        changedInvoiceCompanyName: ({newValue, oldValue}: {newValue: string; oldValue?: string}) =>
-            oldValue ? `将发票公司名称更改为“${newValue}”（之前为“${oldValue}”）` : `将发票公司名称设置为“${newValue}”`,
-        changedInvoiceCompanyWebsite: ({newValue, oldValue}: {newValue: string; oldValue?: string}) =>
-            oldValue ? `将发票公司网站更改为 “${newValue}”（之前为 “${oldValue}”）` : `将发票公司网站设置为“${newValue}”`,
         changedCustomReportNameFormula: ({newValue, oldValue}: UpdatedPolicyFieldWithNewAndOldValueParams) => `将自定义报表名称公式更改为“${newValue}”（之前为“${oldValue}”）`,
-        changedReimburser: ({newReimburser, previousReimburser}: UpdatedPolicyReimburserParams) =>
-            previousReimburser ? `将授权付款人更改为“${newReimburser}”（原为“${previousReimburser}”）` : `已将授权付款人更改为“${newReimburser}”`,
-        setReceiptRequiredAmount: ({newValue}: UpdatedPolicyFieldWithNewAndOldValueParams) => `将报销单必填金额设置为“${newValue}”`,
-        changedReceiptRequiredAmount: ({oldValue, newValue}: UpdatedPolicyFieldWithNewAndOldValueParams) => `将报销单所需金额更改为“${newValue}”（之前为“${oldValue}”）`,
-        removedReceiptRequiredAmount: ({oldValue}: UpdatedPolicyFieldWithNewAndOldValueParams) => `已移除所需报销单金额（先前为“${oldValue}”）`,
-        setMaxExpenseAmount: ({newValue}: UpdatedPolicyFieldWithNewAndOldValueParams) => `将最高报销金额设置为“${newValue}”`,
-        changedMaxExpenseAmount: ({oldValue, newValue}: UpdatedPolicyFieldWithNewAndOldValueParams) => `将最高报销金额更改为 “${newValue}”（之前为 “${oldValue}”）`,
-        removedMaxExpenseAmount: ({oldValue}: UpdatedPolicyFieldWithNewAndOldValueParams) => `已移除最⾼报销金额（原为“${oldValue}”）`,
-        setMaxExpenseAge: ({newValue}: UpdatedPolicyFieldWithNewAndOldValueParams) => `将最大报销天数设置为“${newValue}”天`,
-        changedMaxExpenseAge: ({oldValue, newValue}: UpdatedPolicyFieldWithNewAndOldValueParams) => `将最大报销单据天数更改为 “${newValue}” 天（之前为 “${oldValue}”）`,
-        removedMaxExpenseAge: ({oldValue}: UpdatedPolicyFieldWithNewAndOldValueParams) => `已移除费用最长期限（之前为“${oldValue}”天）`,
     },
     roomMembersPage: {
         memberNotFound: '未找到成员。',
@@ -6671,7 +6618,7 @@ ${reportName}
             amount: {
                 lessThan: ({amount}: OptionalParam<RequestAmountParams> = {}) => `少于 ${amount ?? ''}`,
                 greaterThan: ({amount}: OptionalParam<RequestAmountParams> = {}) => `大于 ${amount ?? ''}`,
-                between: (greaterThan: string, lessThan: string) => `介于 ${greaterThan} 和 ${lessThan} 之间`,
+                between: ({greaterThan, lessThan}: FiltersAmountBetweenParams) => `介于 ${greaterThan} 和 ${lessThan} 之间`,
                 equalTo: ({amount}: OptionalParam<RequestAmountParams> = {}) => `等于 ${amount ?? ''}`,
             },
             card: {
@@ -7091,7 +7038,6 @@ ${reportName}
         maxAge: ({maxAge}: ViolationsMaxAgeParams) => `日期早于 ${maxAge} 天`,
         missingCategory: '缺少类别',
         missingComment: '所选类别需要填写描述',
-        missingAttendees: '此类别需要多个参与者',
         missingTag: ({tagName}: ViolationsMissingTagParams = {}) => `缺少 ${tagName ?? '标签'}`,
         modifiedAmount: ({type, displayPercentVariance}: ViolationsModifiedAmountParams) => {
             switch (type) {
@@ -7197,7 +7143,6 @@ ${reportName}
         hold: '此报销已被搁置',
         resolvedDuplicates: '已解决重复项',
         companyCardRequired: '需要公司卡消费',
-        noRoute: '请选择一个有效的地址',
     },
     reportViolations: {
         [CONST.REPORT_VIOLATIONS.FIELD_REQUIRED]: ({fieldName}: RequiredFieldParams) => `${fieldName}为必填项`,
@@ -7790,14 +7735,9 @@ ${reportName}
             addAdminError: '无法将此成员添加为管理员。请重试。',
             revokeAdminAccess: '撤销管理员访问权限',
             cantRevokeAdminAccess: '无法撤销技术联系人的管理员访问权限',
-            error: {removeAdmin: '无法将此用户从管理员中移除。请重试。', removeDomain: '无法移除此域名。请重试。', removeDomainNameInvalid: '请输入您的域名以重置。'},
-            resetDomain: '重置域名',
-            resetDomainExplanation: ({domainName}: {domainName?: string}) => `请输入 <strong>${domainName}</strong> 以确认重置该域名。`,
-            enterDomainName: '在此输入您的域名',
-            resetDomainInfo: `此操作是<strong>永久性的</strong>，并且以下数据将被删除：<br/> <ul><li>公司卡连接以及这些卡片上所有未报销的费用</li> <li>SAML 和群组设置</li> </ul> 所有账户、工作区、报表、费用以及其他数据将会保留。<br/><br/>注意：您可以通过从<a href="#">联系方法</a>中移除关联的邮箱，将此域名从您的域名列表中清除。`,
+            error: {removeAdmin: '无法将此用户移除管理员角色。请重试。'},
         },
         members: {title: '成员', findMember: '查找成员'},
-        domainAdmins: '域管理员',
     },
     gps: {
         tooltip: 'GPS 跟踪进行中！完成后，请在下方停止跟踪。',
@@ -7811,13 +7751,11 @@ ${reportName}
         stopGpsTrackingModal: {title: '停止 GPS 追踪', prompt: '你确定吗？这将结束你当前的旅程。', cancel: '恢复追踪', confirm: '停止 GPS 追踪'},
         discardDistanceTrackingModal: {title: '丢弃距离跟踪', prompt: '您确定吗？这将放弃您当前的流程，且无法撤销。', confirm: '丢弃距离跟踪'},
         zeroDistanceTripModal: {title: '无法创建报销', prompt: '你不能创建起点和终点相同的报销。'},
+
         locationRequiredModal: {title: '需要访问位置信息', prompt: '请在设备设置中允许位置访问以开始 GPS 距离跟踪。', allow: '允许'},
         androidBackgroundLocationRequiredModal: {title: '需要后台位置访问权限', prompt: '请在设备设置中允许应用使用“始终允许”位置访问权限，以开始 GPS 距离跟踪。'},
         preciseLocationRequiredModal: {title: '需要精确位置', prompt: '请在设备设置中启用“精确位置”以开始 GPS 距离跟踪。'},
         desktop: {title: '在手机上跟踪距离', subtitle: '使用 GPS 自动记录英里或公里，并将行程即时转换为报销费用。', button: '下载应用程序'},
-        notification: {title: '正在进行 GPS 跟踪', body: '前往应用完成'},
-        locationServicesRequiredModal: {title: '需要访问位置信息', confirm: '打开设置', prompt: '请在设备设置中允许位置访问，以开始 GPS 距离跟踪。'},
-        fabGpsTripExplained: '前往 GPS 屏幕（悬浮操作）',
     },
 };
 // IMPORTANT: This line is manually replaced in generate translation files by scripts/generateTranslations.ts,
diff --git a/src/libs/API/index.ts b/src/libs/API/index.ts
index 049e01a58196..a2ee05fab0fa 100644
--- a/src/libs/API/index.ts
+++ b/src/libs/API/index.ts
@@ -1,5 +1,5 @@
+import type {OnyxUpdate} from 'react-native-onyx';
 import Onyx from 'react-native-onyx';
-import type {OnyxKey} from 'react-native-onyx';
 import type {SetRequired} from 'type-fest';
 import {resolveDuplicationConflictAction, resolveEnableFeatureConflicts} from '@libs/actions/RequestConflictUtils';
 import type {EnablePolicyFeatureCommand, RequestMatcher} from '@libs/actions/RequestConflictUtils';
@@ -13,7 +13,7 @@ import {addMiddleware, processWithMiddleware} from '@libs/Request';
 import {getAll, getLength as getPersistedRequestsLength} from '@userActions/PersistedRequests';
 import CONST from '@src/CONST';
 import type OnyxRequest from '@src/types/onyx/Request';
-import type {OnyxData, PaginatedRequest, PaginationConfig, RequestConflictResolver} from '@src/types/onyx/Request';
+import type {PaginatedRequest, PaginationConfig, RequestConflictResolver} from '@src/types/onyx/Request';
 import type Response from '@src/types/onyx/Response';
 import type {ApiCommand, ApiRequestCommandParameters, ApiRequestType, CommandOfType, ReadCommand, SideEffectRequestCommand, WriteCommand} from './types';
 import {READ_COMMANDS} from './types';
@@ -51,6 +51,14 @@ addMiddleware(FraudMonitoring);
 
 let requestIndex = 0;
 
+type OnyxData = {
+    optimisticData?: OnyxUpdate[];
+    successData?: OnyxUpdate[];
+    failureData?: OnyxUpdate[];
+    finallyData?: OnyxUpdate[];
+    queueFlushedData?: OnyxUpdate[];
+};
+
 /**
  * Prepare the request to be sent. Bind data together with request metadata and apply optimistic Onyx data.
  */
@@ -58,7 +66,7 @@ function prepareRequest<TCommand extends ApiCommand>(
     command: TCommand,
     type: ApiRequestType,
     params: ApiRequestCommandParameters[TCommand],
-    onyxData: OnyxData<OnyxKey> = {},
+    onyxData: OnyxData = {},
     conflictResolver: RequestConflictResolver = {},
 ): OnyxRequest {
     Log.info('[API] Preparing request', false, {command, type});
@@ -147,7 +155,7 @@ function processRequest(request: OnyxRequest, type: ApiRequestType): Promise<voi
 function write<TCommand extends WriteCommand>(
     command: TCommand,
     apiCommandParameters: ApiRequestCommandParameters[TCommand],
-    onyxData: OnyxData<OnyxKey> = {},
+    onyxData: OnyxData = {},
     conflictResolver: RequestConflictResolver = {},
 ): Promise<void | Response> {
     Log.info('[API] Called API write', false, {command, ...apiCommandParameters});
@@ -162,7 +170,7 @@ function write<TCommand extends WriteCommand>(
 function writeWithNoDuplicatesConflictAction<TCommand extends WriteCommand>(
     command: TCommand,
     apiCommandParameters: ApiRequestCommandParameters[TCommand],
-    onyxData: OnyxData<OnyxKey> = {},
+    onyxData: OnyxData = {},
     requestMatcher: RequestMatcher = (request) => request.command === command,
 ): Promise<void | Response> {
     const conflictResolver = {
@@ -179,7 +187,7 @@ function writeWithNoDuplicatesConflictAction<TCommand extends WriteCommand>(
 function writeWithNoDuplicatesEnableFeatureConflicts<TCommand extends EnablePolicyFeatureCommand>(
     command: TCommand,
     apiCommandParameters: ApiRequestCommandParameters[TCommand],
-    onyxData: OnyxData<OnyxKey> = {},
+    onyxData: OnyxData = {},
 ): Promise<void | Response> {
     const conflictResolver = {
         checkAndFixConflictingRequest: (persistedRequests: OnyxRequest[]) => resolveEnableFeatureConflicts(command, persistedRequests, apiCommandParameters),
@@ -199,7 +207,7 @@ function writeWithNoDuplicatesEnableFeatureConflicts<TCommand extends EnablePoli
 function makeRequestWithSideEffects<TCommand extends SideEffectRequestCommand>(
     command: TCommand,
     apiCommandParameters: ApiRequestCommandParameters[TCommand],
-    onyxData: OnyxData<OnyxKey> = {},
+    onyxData: OnyxData = {},
 ): Promise<void | Response> {
     Log.info('[API] Called API makeRequestWithSideEffects', false, {command, ...apiCommandParameters});
     const request = prepareRequest(command, CONST.API_REQUEST_TYPE.MAKE_REQUEST_WITH_SIDE_EFFECTS, apiCommandParameters, onyxData);
@@ -222,7 +230,7 @@ function waitForWrites<TCommand extends ReadCommand | WriteCommand | SideEffectR
 /**
  * Requests made with this method are not be persisted to disk. If there is no network connectivity, the request is ignored and discarded.
  */
-function read<TCommand extends ReadCommand>(command: TCommand, apiCommandParameters: ApiRequestCommandParameters[TCommand], onyxData: OnyxData<OnyxKey> = {}): void {
+function read<TCommand extends ReadCommand>(command: TCommand, apiCommandParameters: ApiRequestCommandParameters[TCommand], onyxData: OnyxData = {}): void {
     Log.info('[API] Called API.read', false, {command, ...apiCommandParameters});
 
     // Apply optimistic updates of read requests immediately
@@ -241,21 +249,21 @@ function paginate<TRequestType extends typeof CONST.API_REQUEST_TYPE.MAKE_REQUES
     type: TRequestType,
     command: TCommand,
     apiCommandParameters: ApiRequestCommandParameters[TCommand],
-    onyxData: OnyxData<OnyxKey>,
+    onyxData: OnyxData,
     config: PaginationConfig,
 ): Promise<Response | void>;
 function paginate<TRequestType extends typeof CONST.API_REQUEST_TYPE.READ, TCommand extends CommandOfType<TRequestType>>(
     type: TRequestType,
     command: TCommand,
     apiCommandParameters: ApiRequestCommandParameters[TCommand],
-    onyxData: OnyxData<OnyxKey>,
+    onyxData: OnyxData,
     config: PaginationConfig,
 ): void;
 function paginate<TRequestType extends typeof CONST.API_REQUEST_TYPE.WRITE, TCommand extends CommandOfType<TRequestType>>(
     type: TRequestType,
     command: TCommand,
     apiCommandParameters: ApiRequestCommandParameters[TCommand],
-    onyxData: OnyxData<OnyxKey>,
+    onyxData: OnyxData,
     config: PaginationConfig,
     conflictResolver?: RequestConflictResolver,
 ): void;
@@ -263,7 +271,7 @@ function paginate<TRequestType extends ApiRequestType, TCommand extends CommandO
     type: TRequestType,
     command: TCommand,
     apiCommandParameters: ApiRequestCommandParameters[TCommand],
-    onyxData: OnyxData<OnyxKey>,
+    onyxData: OnyxData,
     config: PaginationConfig,
     conflictResolver: RequestConflictResolver = {},
 ): Promise<Response | void> | void {
diff --git a/src/libs/API/parameters/ApproveMoneyRequestParams.ts b/src/libs/API/parameters/ApproveMoneyRequestParams.ts
index 620c0fbdf8b3..59fa0ed0d644 100644
--- a/src/libs/API/parameters/ApproveMoneyRequestParams.ts
+++ b/src/libs/API/parameters/ApproveMoneyRequestParams.ts
@@ -12,14 +12,6 @@ type ApproveMoneyRequestParams = {
      * }>
      */
     optimisticHoldReportExpenseActionIDs?: string;
-    /**
-     * Stringified JSON object of type Record<string, string> with the following structure:
-     * {
-     *   [oldReportActionID]: optimisticReportActionID,
-     * }
-     * where optimisticReportActionID is the optimistic report action ID and oldReportActionID is the old report action ID
-     */
-    optimisticReportActionCopyIDs?: string;
 
     /** The optimistic action ID for the report created for unapproved transactions */
     optimisticCreatedReportForUnapprovedTransactionsActionID?: string;
diff --git a/src/libs/API/parameters/CreateAppReportParams.ts b/src/libs/API/parameters/CreateAppReportParams.ts
index de9e533b86d2..74e14f6b5d5d 100644
--- a/src/libs/API/parameters/CreateAppReportParams.ts
+++ b/src/libs/API/parameters/CreateAppReportParams.ts
@@ -4,7 +4,6 @@ type CreateAppReportParams = {
     reportID: string;
     reportActionID: string;
     reportPreviewReportActionID: string;
-    ownerEmail?: string;
     shouldDismissEmptyReportsConfirmation?: boolean;
 };
 export default CreateAppReportParams;
diff --git a/src/libs/API/parameters/DeleteDomainParams.ts b/src/libs/API/parameters/DeleteDomainParams.ts
deleted file mode 100644
index 49a67873820a..000000000000
--- a/src/libs/API/parameters/DeleteDomainParams.ts
+++ /dev/null
@@ -1,6 +0,0 @@
-type DeleteDomainParams = {
-    domainAccountID: number;
-    domainName: string;
-};
-
-export default DeleteDomainParams;
diff --git a/src/libs/API/parameters/GetDuplicateTransactionDetailsParams.ts b/src/libs/API/parameters/GetDuplicateTransactionDetailsParams.ts
deleted file mode 100644
index b211d4411821..000000000000
--- a/src/libs/API/parameters/GetDuplicateTransactionDetailsParams.ts
+++ /dev/null
@@ -1,5 +0,0 @@
-type GetDuplicateTransactionDetailsParams = {
-    transactionID: string;
-};
-
-export default GetDuplicateTransactionDetailsParams;
diff --git a/src/libs/API/parameters/OpenPolicyTravelPageParams.ts b/src/libs/API/parameters/OpenPolicyTravelPageParams.ts
deleted file mode 100644
index 24b2d79b2fff..000000000000
--- a/src/libs/API/parameters/OpenPolicyTravelPageParams.ts
+++ /dev/null
@@ -1,5 +0,0 @@
-type OpenPolicyTravelPageParams = {
-    policyID: string;
-};
-
-export default OpenPolicyTravelPageParams;
diff --git a/src/libs/API/parameters/SetNameValuePairParams.ts b/src/libs/API/parameters/SetNameValuePairParams.ts
index c9b05884f51d..abcd7118a914 100644
--- a/src/libs/API/parameters/SetNameValuePairParams.ts
+++ b/src/libs/API/parameters/SetNameValuePairParams.ts
@@ -1,6 +1,6 @@
 type SetNameValuePairParams = {
     name: string;
-    value: boolean | string | Record<string, boolean> | Array<Record<string, unknown>>;
+    value: boolean | string | Record<string, boolean>;
 };
 
 export default SetNameValuePairParams;
diff --git a/src/libs/API/parameters/SetPolicyCategoryAttendeesRequiredParams.ts b/src/libs/API/parameters/SetPolicyCategoryAttendeesRequiredParams.ts
deleted file mode 100644
index abaa94f241cc..000000000000
--- a/src/libs/API/parameters/SetPolicyCategoryAttendeesRequiredParams.ts
+++ /dev/null
@@ -1,7 +0,0 @@
-type SetPolicyCategoryAttendeesRequiredParams = {
-    policyID: string;
-    categoryName: string;
-    areAttendeesRequired: boolean;
-};
-
-export default SetPolicyCategoryAttendeesRequiredParams;
diff --git a/src/libs/API/parameters/TrackExpenseParams.ts b/src/libs/API/parameters/TrackExpenseParams.ts
index 42f8b878c678..9b653d5a2a3c 100644
--- a/src/libs/API/parameters/TrackExpenseParams.ts
+++ b/src/libs/API/parameters/TrackExpenseParams.ts
@@ -19,7 +19,6 @@ type TrackExpenseParams = {
     reportPreviewReportActionID?: string;
     optimisticReportID?: string;
     optimisticReportActionID?: string;
-    policyID?: string;
     receipt?: Receipt;
     receiptState?: ValueOf<typeof CONST.IOU.RECEIPT_STATE>;
     category?: string;
@@ -36,7 +35,6 @@ type TrackExpenseParams = {
     customUnitRateID?: string;
     description?: string;
     distance?: number;
-    isDistance?: boolean;
 };
 
 export default TrackExpenseParams;
diff --git a/src/libs/API/parameters/index.ts b/src/libs/API/parameters/index.ts
index d5e1b7e63f18..33efdf52df1f 100644
--- a/src/libs/API/parameters/index.ts
+++ b/src/libs/API/parameters/index.ts
@@ -308,7 +308,6 @@ export type {default as EnablePolicyInvoicingParams} from './EnablePolicyInvoici
 export type {default as CreateWorkspaceReportFieldListValueParams} from './CreateWorkspaceReportFieldListValueParams';
 export type {default as RemoveWorkspaceReportFieldListValueParams} from './RemoveWorkspaceReportFieldListValueParams';
 export type {default as OpenPolicyExpensifyCardsPageParams} from './OpenPolicyExpensifyCardsPageParams';
-export type {default as OpenPolicyTravelPageParams} from './OpenPolicyTravelPageParams';
 export type {default as OpenPolicyEditCardLimitTypePageParams} from './OpenPolicyEditCardLimitTypePageParams';
 export type {default as RequestExpensifyCardLimitIncreaseParams} from './RequestExpensifyCardLimitIncreaseParams';
 export type {default as UpdateNetSuiteGenericTypeParams} from './UpdateNetSuiteGenericTypeParams';
@@ -348,7 +347,6 @@ export type {default as AddDelegateParams} from './AddDelegateParams';
 export type {default as UpdateDelegateRoleParams} from './UpdateDelegateRoleParams';
 export type {default as OpenCardDetailsPageParams} from './OpenCardDetailsPageParams';
 export type {default as SetPolicyCategoryDescriptionRequiredParams} from './SetPolicyCategoryDescriptionRequiredParams';
-export type {default as SetPolicyCategoryAttendeesRequiredParams} from './SetPolicyCategoryAttendeesRequiredParams';
 export type {default as SetPolicyCategoryApproverParams} from './SetPolicyCategoryApproverParams';
 export type {default as SetWorkspaceCategoryDescriptionHintParams} from './SetWorkspaceCategoryDescriptionHintParams';
 export type {default as SetPolicyCategoryTaxParams} from './SetPolicyCategoryTaxParams';
@@ -460,5 +458,3 @@ export type {default as SetPolicyRequireCompanyCardsEnabledParams} from './SetPo
 export type {default as SetTechnicalContactEmailParams} from './SetTechnicalContactEmailParams';
 export type {default as ToggleConsolidatedDomainBillingParams} from './ToggleConsolidatedDomainBillingParams';
 export type {default as RemoveDomainAdminParams} from './RemoveDomainAdminParams';
-export type {default as DeleteDomainParams} from './DeleteDomainParams';
-export type {default as GetDuplicateTransactionDetailsParams} from './GetDuplicateTransactionDetailsParams';
diff --git a/src/libs/API/types.ts b/src/libs/API/types.ts
index 68781b4ae8a5..b808473b64bc 100644
--- a/src/libs/API/types.ts
+++ b/src/libs/API/types.ts
@@ -265,7 +265,6 @@ const WRITE_COMMANDS = {
     SET_POLICY_ATTENDEE_TRACKING_ENABLED: 'SetPolicyAttendeeTrackingEnabled',
     SET_POLICY_REQUIRE_COMPANY_CARDS_ENABLED: 'SetPolicyRequireCompanyCardsEnabled',
     SET_POLICY_CATEGORY_DESCRIPTION_REQUIRED: 'SetPolicyCategoryDescriptionRequired',
-    SET_POLICY_CATEGORY_ATTENDEES_REQUIRED: 'SetPolicyCategoryAttendeesRequired',
     SET_WORKSPACE_CATEGORY_DESCRIPTION_HINT: 'SetWorkspaceCategoryDescriptionHint',
     SET_POLICY_CATEGORY_RECEIPTS_REQUIRED: 'SetPolicyCategoryReceiptsRequired',
     REMOVE_POLICY_CATEGORY_RECEIPTS_REQUIRED: 'RemoveWorkspaceCategoryReceiptsRequired',
@@ -535,7 +534,6 @@ const WRITE_COMMANDS = {
     TOGGLE_CONSOLIDATED_DOMAIN_BILLING: 'ToggleConsolidatedDomainBilling',
     ADD_DOMAIN_ADMIN: 'AddDomainAdmin',
     REMOVE_DOMAIN_ADMIN: 'RemoveDomainAdmin',
-    DELETE_DOMAIN: 'DeleteDomain',
 } as const;
 
 type WriteCommand = ValueOf<typeof WRITE_COMMANDS>;
@@ -795,7 +793,6 @@ type WriteCommandParameters = {
     [WRITE_COMMANDS.SET_POLICY_RULES_ENABLED]: Parameters.SetPolicyRulesEnabledParams;
     [WRITE_COMMANDS.SET_POLICY_REQUIRE_COMPANY_CARDS_ENABLED]: Parameters.SetPolicyRequireCompanyCardsEnabledParams;
     [WRITE_COMMANDS.SET_POLICY_CATEGORY_DESCRIPTION_REQUIRED]: Parameters.SetPolicyCategoryDescriptionRequiredParams;
-    [WRITE_COMMANDS.SET_POLICY_CATEGORY_ATTENDEES_REQUIRED]: Parameters.SetPolicyCategoryAttendeesRequiredParams;
     [WRITE_COMMANDS.SET_WORKSPACE_CATEGORY_DESCRIPTION_HINT]: Parameters.SetWorkspaceCategoryDescriptionHintParams;
     [WRITE_COMMANDS.SET_POLICY_CATEGORY_RECEIPTS_REQUIRED]: Parameters.SetPolicyCategoryReceiptsRequiredParams;
     [WRITE_COMMANDS.REMOVE_POLICY_CATEGORY_RECEIPTS_REQUIRED]: Parameters.RemovePolicyCategoryReceiptsRequiredParams;
@@ -1091,7 +1088,6 @@ type WriteCommandParameters = {
     [WRITE_COMMANDS.SET_TECHNICAL_CONTACT_EMAIL]: Parameters.SetTechnicalContactEmailParams;
     [WRITE_COMMANDS.TOGGLE_CONSOLIDATED_DOMAIN_BILLING]: Parameters.ToggleConsolidatedDomainBillingParams;
     [WRITE_COMMANDS.REMOVE_DOMAIN_ADMIN]: Parameters.RemoveDomainAdminParams;
-    [WRITE_COMMANDS.DELETE_DOMAIN]: Parameters.DeleteDomainParams;
     [WRITE_COMMANDS.ADD_DOMAIN_ADMIN]: Parameters.AddAdminToDomainParams;
 };
 
@@ -1145,7 +1141,6 @@ const READ_COMMANDS = {
     OPEN_POLICY_REPORT_FIELDS_PAGE: 'OpenPolicyReportFieldsPage',
     OPEN_POLICY_RULES_PAGE: 'OpenPolicyRulesPage',
     OPEN_POLICY_EXPENSIFY_CARDS_PAGE: 'OpenPolicyExpensifyCardsPage',
-    OPEN_POLICY_TRAVEL_PAGE: 'OpenPolicyTravelPage',
     OPEN_POLICY_COMPANY_CARDS_FEED: 'OpenPolicyCompanyCardsFeed',
     OPEN_ASSIGN_FEED_CARD_PAGE: 'OpenAssignFeedCardPage',
     OPEN_POLICY_COMPANY_CARDS_PAGE: 'OpenPolicyCompanyCardsPage',
@@ -1175,7 +1170,6 @@ const READ_COMMANDS = {
     GET_DOMAIN_VALIDATE_CODE: 'GetDomainValidateCode',
     OPEN_DOMAIN_INITIAL_PAGE: 'OpenDomainInitialPage',
     GET_SAML_SETTINGS: 'GetSAMLSettings',
-    GET_DUPLICATE_TRANSACTION_DETAILS: 'GetDuplicateTransactionDetails',
 } as const;
 
 type ReadCommand = ValueOf<typeof READ_COMMANDS>;
@@ -1238,7 +1232,6 @@ type ReadCommandParameters = {
     [READ_COMMANDS.OPEN_POLICY_MORE_FEATURES_PAGE]: Parameters.OpenPolicyMoreFeaturesPageParams;
     [READ_COMMANDS.OPEN_POLICY_ACCOUNTING_PAGE]: Parameters.OpenPolicyAccountingPageParams;
     [READ_COMMANDS.OPEN_POLICY_EXPENSIFY_CARDS_PAGE]: Parameters.OpenPolicyExpensifyCardsPageParams;
-    [READ_COMMANDS.OPEN_POLICY_TRAVEL_PAGE]: Parameters.OpenPolicyTravelPageParams;
     [READ_COMMANDS.OPEN_POLICY_COMPANY_CARDS_PAGE]: Parameters.OpenPolicyExpensifyCardsPageParams;
     [READ_COMMANDS.OPEN_POLICY_COMPANY_CARDS_FEED]: Parameters.OpenPolicyCompanyCardsFeedParams;
     [READ_COMMANDS.OPEN_ASSIGN_FEED_CARD_PAGE]: Parameters.OpenPolicyCompanyCardsFeedParams;
@@ -1261,7 +1254,6 @@ type ReadCommandParameters = {
     [READ_COMMANDS.GET_DOMAIN_VALIDATE_CODE]: Parameters.DomainParams;
     [READ_COMMANDS.OPEN_DOMAIN_INITIAL_PAGE]: Parameters.DomainParams;
     [READ_COMMANDS.GET_SAML_SETTINGS]: Parameters.DomainParams;
-    [READ_COMMANDS.GET_DUPLICATE_TRANSACTION_DETAILS]: Parameters.GetDuplicateTransactionDetailsParams;
 };
 
 const SIDE_EFFECT_REQUEST_COMMANDS = {
diff --git a/src/libs/AccountUtils.ts b/src/libs/AccountUtils.ts
index 1df0098ef2be..2d44e4d5ec8f 100644
--- a/src/libs/AccountUtils.ts
+++ b/src/libs/AccountUtils.ts
@@ -12,26 +12,4 @@ function isDelegateOnlySubmitter(account: OnyxEntry<Account>): boolean {
     return delegateRole === CONST.DELEGATE_ROLE.SUBMITTER;
 }
 
-/**
- * Check if the current user has validateCodeExtendedAccess
- *
- * This is a UX optimization to avoid asking for validation codes when the user
- * has recently provided one.
- * The backend performs an authoritative validation check using server-side time.
- *
- * @return true if the user has extended access, false otherwise
- */
-function hasValidateCodeExtendedAccess(account: OnyxEntry<Account>): boolean {
-    const extendedAccessTimestamp = account?.validateCodeExtendedAccessExpires;
-    if (extendedAccessTimestamp) {
-        // Convert timestamp from microseconds to milliseconds and compare with current time
-        const extendedAccessExpiration = parseInt(extendedAccessTimestamp.toString(), 10) / 1000;
-        if (Date.now() <= extendedAccessExpiration) {
-            return true;
-        }
-    }
-
-    return false;
-}
-
-export default {isValidateCodeFormSubmitting, isDelegateOnlySubmitter, hasValidateCodeExtendedAccess};
+export default {isValidateCodeFormSubmitting, isDelegateOnlySubmitter};
diff --git a/src/libs/ActiveClientManager/index.ts b/src/libs/ActiveClientManager/index.ts
index 3776e2a53690..e29103edfe8c 100644
--- a/src/libs/ActiveClientManager/index.ts
+++ b/src/libs/ActiveClientManager/index.ts
@@ -5,7 +5,6 @@
  */
 import {Str} from 'expensify-common';
 import Onyx from 'react-native-onyx';
-import {setModalVisibility} from '@libs/actions/Modal';
 import {setActiveClients} from '@userActions/ActiveClients';
 import ONYXKEYS from '@src/ONYXKEYS';
 import type {Init, IsClientTheLeader, IsReady} from './types';
@@ -97,7 +96,6 @@ const init: Init = () => {
     beforeunloadListenerAdded = true;
     window.addEventListener('beforeunload', () => {
         cleanUpClientId();
-        setModalVisibility(false);
     });
 };
 
diff --git a/src/libs/AttendeeUtils.ts b/src/libs/AttendeeUtils.ts
deleted file mode 100644
index 693497ce4135..000000000000
--- a/src/libs/AttendeeUtils.ts
+++ /dev/null
@@ -1,109 +0,0 @@
-import type {LocaleContextProps} from '@components/LocaleContextProvider';
-import CONST from '@src/CONST';
-import type {PolicyCategories, PolicyCategory} from '@src/types/onyx';
-import type {Attendee} from '@src/types/onyx/IOU';
-import type {CurrentUserPersonalDetails} from '@src/types/onyx/PersonalDetails';
-
-/** Formats the title for requiredFields menu item based on which fields are enabled in the policy category */
-function formatRequiredFieldsTitle(translate: LocaleContextProps['translate'], policyCategory: PolicyCategory, isAttendeeTrackingEnabled = false): string {
-    const enabledFields: string[] = [];
-
-    // Attendees field should show first when both are selected and attendee tracking is enabled
-    // Respect feature flag - don't show attendees in title when feature is disabled
-    if (!CONST.IS_ATTENDEES_REQUIRED_FEATURE_DISABLED && isAttendeeTrackingEnabled && policyCategory.areAttendeesRequired) {
-        enabledFields.push(translate('iou.attendees'));
-    }
-
-    if (policyCategory.areCommentsRequired) {
-        enabledFields.push(translate('common.description'));
-    }
-
-    if (enabledFields.length === 0) {
-        return '';
-    }
-
-    const [first, ...rest] = enabledFields;
-    const capitalizedFirst = first.charAt(0).toUpperCase() + first.slice(1);
-    const lowercasedRest = rest.map((field) => field.charAt(0).toLowerCase() + field.slice(1));
-    return [capitalizedFirst, ...lowercasedRest].join(', ');
-}
-
-/** Returns whether there are missing attendees for the given category */
-function getIsMissingAttendeesViolation(
-    policyCategories: PolicyCategories | undefined,
-    category: string,
-    iouAttendees: Attendee[] | string | undefined,
-    userPersonalDetails: CurrentUserPersonalDetails,
-    isAttendeeTrackingEnabled = false,
-) {
-    // Feature flag to quickly disable the attendees required feature
-    if (CONST.IS_ATTENDEES_REQUIRED_FEATURE_DISABLED) {
-        return false;
-    }
-
-    const areAttendeesRequired = !!policyCategories?.[category ?? '']?.areAttendeesRequired;
-    // If attendee tracking is disabled at the policy level, don't enforce attendee requirement
-    if (!isAttendeeTrackingEnabled || !areAttendeesRequired) {
-        return false;
-    }
-
-    const creatorLogin = userPersonalDetails.login ?? '';
-    const creatorEmail = userPersonalDetails.email ?? '';
-    const attendees = Array.isArray(iouAttendees) ? iouAttendees : [];
-    // Check both login and email since attendee objects may have identifier in either property
-    const attendeesMinusCreatorCount = attendees.filter((a) => {
-        const attendeeIdentifier = a?.login ?? a?.email;
-        return attendeeIdentifier !== creatorLogin && attendeeIdentifier !== creatorEmail;
-    }).length;
-
-    if (attendees.length === 0 || attendeesMinusCreatorCount === 0) {
-        return true;
-    }
-
-    return false;
-}
-
-/**
- * Syncs the missingAttendees violation with current policy settings.
- * - Adds the violation when it should show but isn't present from BE
- * - Removes stale BE violation when policy settings changed (e.g., category no longer requires attendees)
- */
-function syncMissingAttendeesViolation<T extends {name: string}>(
-    violations: T[],
-    policyCategories: PolicyCategories | undefined,
-    category: string,
-    attendees: Attendee[] | undefined,
-    userPersonalDetails: CurrentUserPersonalDetails,
-    isAttendeeTrackingEnabled: boolean,
-    isControlPolicy: boolean,
-): T[] {
-    // Feature flag to quickly disable the attendees required feature
-    // When disabled, remove any existing missingAttendees violations and don't add new ones
-    if (CONST.IS_ATTENDEES_REQUIRED_FEATURE_DISABLED) {
-        return violations.filter((v) => v.name !== CONST.VIOLATIONS.MISSING_ATTENDEES);
-    }
-
-    const hasMissingAttendeesViolation = violations.some((v) => v.name === CONST.VIOLATIONS.MISSING_ATTENDEES);
-    const shouldShowMissingAttendees =
-        isControlPolicy && getIsMissingAttendeesViolation(policyCategories ?? {}, category ?? '', attendees ?? [], userPersonalDetails, isAttendeeTrackingEnabled);
-
-    if (!hasMissingAttendeesViolation && shouldShowMissingAttendees) {
-        // Add violation when it should show but isn't present from BE
-        return [
-            ...violations,
-            {
-                name: CONST.VIOLATIONS.MISSING_ATTENDEES,
-                type: CONST.VIOLATION_TYPES.VIOLATION,
-                showInReview: true,
-            } as unknown as T,
-        ];
-    }
-    if (hasMissingAttendeesViolation && !shouldShowMissingAttendees) {
-        // Remove stale BE violation when policy settings changed
-        return violations.filter((v) => v.name !== CONST.VIOLATIONS.MISSING_ATTENDEES);
-    }
-
-    return violations;
-}
-
-export {formatRequiredFieldsTitle, getIsMissingAttendeesViolation, syncMissingAttendeesViolation};
diff --git a/src/libs/Authentication.ts b/src/libs/Authentication.ts
index 409d0491dc5b..51dcf99b42cd 100644
--- a/src/libs/Authentication.ts
+++ b/src/libs/Authentication.ts
@@ -130,14 +130,6 @@ function reauthenticate(command = ''): Promise<boolean> {
         const partnerName = shouldUseNewPartnerName ? CONFIG.EXPENSIFY.PARTNER_NAME : CONFIG.EXPENSIFY.LEGACY_PARTNER_NAME;
         const partnerPassword = shouldUseNewPartnerName ? CONFIG.EXPENSIFY.PARTNER_PASSWORD : CONFIG.EXPENSIFY.LEGACY_PARTNER_PASSWORD;
 
-        // Prevent reauthentication if credentials are missing (e.g. after sign out)
-        if (!credentials?.autoGeneratedLogin || !credentials?.autoGeneratedPassword) {
-            Log.info('Reauthenticate - No credentials available, redirecting to sign in');
-            setIsAuthenticating(false);
-            redirectToSignIn('No credentials available');
-            return false;
-        }
-
         Log.info(`Reauthenticate - re-authenticating with ${shouldUseNewPartnerName ? 'new' : 'old'} partner name`);
 
         Log.hmmm('Reauthenticate - Starting authentication process', {
@@ -148,89 +140,75 @@ function reauthenticate(command = ''): Promise<boolean> {
             useExpensifyLogin: false,
             partnerName,
             partnerPassword,
-            partnerUserID: credentials.autoGeneratedLogin,
-            partnerUserSecret: credentials.autoGeneratedPassword,
-        })
-            .then((response) => {
-                if (!response) {
-                    return false;
-                }
-
-                Log.hmmm('Reauthenticate - Processing authentication result', {
-                    command,
-                });
-
-                if (response.jsonCode === CONST.JSON_CODE.UNABLE_TO_RETRY) {
-                    // When a fetch() fails due to a network issue and an error is thrown we won't log the user out. Most likely they
-                    // have a spotty connection and will need to retry reauthenticate when they come back online. Error so it can be handled by the retry mechanism.
-                    const error = new Error('Unable to retry Authenticate request');
-                    trackAuthenticationError(error, {
-                        errorType: 'network_retry',
-                        functionName: 'reauthenticate',
-                        jsonCode: response.jsonCode,
-                        command,
-                    });
-                    throw error;
-                }
-
-                // If authentication fails and we are online then log the user out
-                if (response.jsonCode !== 200) {
-                    const errorMessage = getAuthenticateErrorMessage(response);
-
-                    trackAuthenticationError(new Error('Authentication failed'), {
-                        errorType: 'auth_failure',
-                        functionName: 'reauthenticate',
-                        jsonCode: response.jsonCode,
-                        command,
-                        errorMessage,
-                    });
-                    setIsAuthenticating(false);
-                    Log.hmmm('Redirecting to Sign In because we failed to reauthenticate', {
-                        command,
-                        error: errorMessage,
-                    });
-                    redirectToSignIn(errorMessage);
-                    return false;
-                }
-
-                // If we reauthenticate due to an expired delegate token, restore the delegate's original account.
-                // This is because the credentials used to reauthenticate were for the delegate's original account, and not for the account they were connected as.
-                if (isConnectedAsDelegate({delegatedAccess: account?.delegatedAccess})) {
-                    Log.info('Reauthenticate while connected as a delegate. Restoring original account.');
-                    restoreDelegateSession(response);
-                    return true;
-                }
-
-                // Update authToken in Onyx and in our local variables so that API requests will use the new authToken
-                updateSessionAuthTokens(response.authToken, response.encryptedAuthToken);
-
-                // Note: It is important to manually set the authToken that is in the store here since any requests that are hooked into
-                // reauthenticate .then() will immediate post and use the local authToken. Onyx updates subscribers lately so it is not
-                // enough to do the updateSessionAuthTokens() call above.
-                setAuthToken(response.authToken ?? null);
-
-                // The authentication process is finished so the network can be unpaused to continue processing requests
-                setIsAuthenticating(false);
+            partnerUserID: credentials?.autoGeneratedLogin,
+            partnerUserSecret: credentials?.autoGeneratedPassword,
+        }).then((response) => {
+            if (!response) {
+                return false;
+            }
+
+            Log.hmmm('Reauthenticate - Processing authentication result', {
+                command,
+            });
 
-                Log.hmmm('Reauthenticate - Re-authentication successful', {
+            if (response.jsonCode === CONST.JSON_CODE.UNABLE_TO_RETRY) {
+                // When a fetch() fails due to a network issue and an error is thrown we won't log the user out. Most likely they
+                // have a spotty connection and will need to retry reauthenticate when they come back online. Error so it can be handled by the retry mechanism.
+                const error = new Error('Unable to retry Authenticate request');
+                trackAuthenticationError(error, {
+                    errorType: 'network_retry',
+                    functionName: 'reauthenticate',
+                    jsonCode: response.jsonCode,
                     command,
                 });
+                throw error;
+            }
 
-                return true;
-            })
-            .catch((error) => {
-                trackAuthenticationError(error as Error, {
-                    errorType: 'unexpected_error',
+            // If authentication fails and we are online then log the user out
+            if (response.jsonCode !== 200) {
+                const errorMessage = getAuthenticateErrorMessage(response);
+
+                trackAuthenticationError(new Error('Authentication failed'), {
+                    errorType: 'auth_failure',
                     functionName: 'reauthenticate',
+                    jsonCode: response.jsonCode,
                     command,
+                    errorMessage,
                 });
-
-                Log.alert('Reauthenticate - Unexpected error during authentication', {
-                    error: (error as Error).message,
+                setIsAuthenticating(false);
+                Log.hmmm('Redirecting to Sign In because we failed to reauthenticate', {
                     command,
+                    error: errorMessage,
                 });
-                throw error;
+                redirectToSignIn(errorMessage);
+                return false;
+            }
+
+            // If we reauthenticate due to an expired delegate token, restore the delegate's original account.
+            // This is because the credentials used to reauthenticate were for the delegate's original account, and not for the account they were connected as.
+            if (isConnectedAsDelegate({delegatedAccess: account?.delegatedAccess})) {
+                Log.info('Reauthenticate while connected as a delegate. Restoring original account.');
+                restoreDelegateSession(response);
+                return true;
+            }
+
+            // Update authToken in Onyx and in our local variables so that API requests will use the new authToken
+            updateSessionAuthTokens(response.authToken, response.encryptedAuthToken);
+
+            // Note: It is important to manually set the authToken that is in the store here since any requests that are hooked into
+            // reauthenticate .then() will immediate post and use the local authToken. Onyx updates subscribers lately so it is not
+            // enough to do the updateSessionAuthTokens() call above.
+            setAuthToken(response.authToken ?? null);
+
+            // The authentication process is finished so the network can be unpaused to continue processing requests
+            setIsAuthenticating(false);
+
+            Log.hmmm('Reauthenticate - Re-authentication successful', {
+                command,
             });
+
+            return true;
+        });
     });
 }
 
diff --git a/src/libs/CardFeedUtils.ts b/src/libs/CardFeedUtils.ts
index 78ae3ed8a74f..6aa9a7d1fad7 100644
--- a/src/libs/CardFeedUtils.ts
+++ b/src/libs/CardFeedUtils.ts
@@ -18,8 +18,6 @@ import {
     isCardHiddenFromSearch,
 } from './CardUtils';
 import type {CompanyCardFeedIcons} from './CardUtils';
-// eslint-disable-next-line @typescript-eslint/no-deprecated
-import {translateLocal} from './Localize';
 import {getDescriptionForPolicyDomainCard, getPolicy} from './PolicyUtils';
 import type {OptionData} from './ReportUtils';
 
@@ -451,8 +449,7 @@ function getCardFeedsForDisplay(allCardFeeds: OnyxCollection<CardFeeds>, allCard
                 id,
                 feed,
                 fundID,
-                // eslint-disable-next-line @typescript-eslint/no-deprecated
-                name: getCustomOrFormattedFeedName(translateLocal, feed, cardFeeds?.settings?.companyCardNicknames?.[feed], false) ?? feed,
+                name: getCustomOrFormattedFeedName(feed, cardFeeds?.settings?.companyCardNicknames?.[feed], false) ?? feed,
             };
         }
     }
@@ -503,8 +500,7 @@ function getCardFeedsForDisplayPerPolicy(allCardFeeds: OnyxCollection<CardFeeds>
                 id,
                 feed,
                 fundID,
-                // eslint-disable-next-line @typescript-eslint/no-deprecated
-                name: getCustomOrFormattedFeedName(translateLocal, feed, cardFeeds?.settings?.companyCardNicknames?.[feed], false) ?? feed,
+                name: getCustomOrFormattedFeedName(feed, cardFeeds?.settings?.companyCardNicknames?.[feed], false) ?? feed,
             });
         }
     }
diff --git a/src/libs/CardUtils.ts b/src/libs/CardUtils.ts
index 1f6663d948cb..6bbefbe67f06 100644
--- a/src/libs/CardUtils.ts
+++ b/src/libs/CardUtils.ts
@@ -2,7 +2,7 @@ import {fromUnixTime, isBefore} from 'date-fns';
 import groupBy from 'lodash/groupBy';
 import type {OnyxCollection, OnyxEntry} from 'react-native-onyx';
 import type {TupleToUnion, ValueOf} from 'type-fest';
-import type {LocaleContextProps, LocalizedTranslate} from '@components/LocaleContextProvider';
+import type {LocaleContextProps} from '@components/LocaleContextProvider';
 import type {CombinedCardFeed, CombinedCardFeeds} from '@hooks/useCardFeeds';
 import type IllustrationsType from '@styles/theme/illustrations/types';
 import * as Illustrations from '@src/components/Icon/Illustrations';
@@ -22,10 +22,12 @@ import type {
     PrivatePersonalDetails,
     WorkspaceCardsList,
 } from '@src/types/onyx';
-import type {UnassignedCard} from '@src/types/onyx/Card';
+import type {FilteredCardList} from '@src/types/onyx/Card';
 import type {CardFeedData, CompanyCardFeedWithDomainID, CompanyCardFeedWithNumber, CompanyFeeds} from '@src/types/onyx/CardFeeds';
 import {isEmptyObject} from '@src/types/utils/EmptyObject';
 import type IconAsset from '@src/types/utils/IconAsset';
+// eslint-disable-next-line @typescript-eslint/no-deprecated
+import {translateLocal} from './Localize';
 import {filterObject} from './ObjectUtils';
 import {arePersonalDetailsMissing, getDisplayNameOrDefault} from './PersonalDetailsUtils';
 import StringUtils from './StringUtils';
@@ -104,13 +106,14 @@ function isExpensifyCard(card?: Card) {
  * @param card
  * @returns string in format %<bank> - <lastFourPAN || Not Activated>%.
  */
-function getCardDescription(card: Card | undefined, translate: LocalizedTranslate) {
+function getCardDescription(card?: Card) {
     if (!card) {
         return '';
     }
     const isPlaid = !!getPlaidInstitutionId(card.bank);
     const bankName = isPlaid ? card?.cardName : getBankName(card.bank as CompanyCardFeed);
-    const cardDescriptor = card.state === CONST.EXPENSIFY_CARD.STATE.NOT_ACTIVATED ? translate('cardTransactions.notActivated') : card.lastFourPAN;
+    // eslint-disable-next-line @typescript-eslint/no-deprecated
+    const cardDescriptor = card.state === CONST.EXPENSIFY_CARD.STATE.NOT_ACTIVATED ? translateLocal('cardTransactions.notActivated') : card.lastFourPAN;
     const humanReadableBankName = card.bank === CONST.EXPENSIFY_CARD.BANK ? CONST.EXPENSIFY_CARD.BANK : bankName;
     return cardDescriptor && !isPlaid ? `${humanReadableBankName} - ${cardDescriptor}` : `${humanReadableBankName}`;
 }
@@ -467,7 +470,7 @@ const getBankCardDetailsImage = (bank: ValueOf<typeof CONST.COMPANY_CARDS.BANKS>
     return iconMap[bank];
 };
 
-function getCustomOrFormattedFeedName(translate: LocalizedTranslate, feed?: CompanyCardFeed, customFeedName?: string, shouldAddCardsSuffix = true): string | undefined {
+function getCustomOrFormattedFeedName(feed?: CompanyCardFeed, customFeedName?: string, shouldAddCardsSuffix = true): string | undefined {
     if (!feed) {
         return;
     }
@@ -477,7 +480,8 @@ function getCustomOrFormattedFeedName(translate: LocalizedTranslate, feed?: Comp
     }
 
     const feedName = getBankName(feed);
-    const formattedFeedName = feedName && shouldAddCardsSuffix ? translate('workspace.companyCards.feedName', feedName) : feedName;
+    // eslint-disable-next-line @typescript-eslint/no-deprecated
+    const formattedFeedName = feedName && shouldAddCardsSuffix ? translateLocal('workspace.companyCards.feedName', feedName) : feedName;
 
     // Custom feed name can be empty. Fallback to default feed name
     // Fallback to feed key name for unknown feeds
@@ -556,16 +560,8 @@ function isSelectedFeedExpired(cardFeed: CombinedCardFeed | undefined): boolean
     return cardFeed?.expiration ? isBefore(fromUnixTime(cardFeed.expiration), new Date()) : false;
 }
 
-/**
- * Returns list of unassigned cards that can be assigned.
- *
- * This function normalizes the difference between:
- * - Direct feeds (Plaid/OAuth): cards stored as string[] in accountList
- * - Commercial feeds (Visa/Mastercard/Amex): cards stored as Record<displayName, encryptedValue> in cardList
- *
- * @returns Array of UnassignedCard objects with consistent displayName and cardIdentifier properties
- */
-function getFilteredCardList(list: WorkspaceCardsList | undefined, accountList: string[] | undefined, workspaceCardFeeds: OnyxCollection<WorkspaceCardsList>): UnassignedCard[] {
+/** Returns list of cards which can be assigned */
+function getFilteredCardList(list: WorkspaceCardsList | undefined, accountList: string[] | undefined, workspaceCardFeeds: OnyxCollection<WorkspaceCardsList>) {
     const {cardList: customFeedCardsToAssign, ...cards} = list ?? {};
     const assignedCards = new Set(Object.values(cards).map((card) => card.cardName));
 
@@ -584,27 +580,16 @@ function getFilteredCardList(list: WorkspaceCardsList | undefined, accountList:
         }
     }
 
-    // For direct feeds (Plaid/OAuth): displayName === cardIdentifier
     if (accountList) {
-        return accountList
-            .filter((cardName) => !assignedCards.has(cardName) && !allWorkspaceAssignedCards.has(cardName))
-            .map((cardName) => ({
-                cardName,
-                cardID: cardName,
-            }));
+        const unassignedDirectFeedCards = accountList.filter((cardNumber) => !assignedCards.has(cardNumber) && !allWorkspaceAssignedCards.has(cardNumber));
+        return Object.fromEntries(unassignedDirectFeedCards.map((cardNumber) => [cardNumber, cardNumber]));
     }
 
-    // For commercial feeds: displayName is the key, cardIdentifier is the encrypted value
-    return Object.entries(customFeedCardsToAssign ?? {})
-        .filter(([cardName]) => !assignedCards.has(cardName) && !allWorkspaceAssignedCards.has(cardName))
-        .map(([cardName, encryptedCardNumber]) => ({
-            cardName,
-            cardID: encryptedCardNumber,
-        }));
+    return Object.fromEntries(Object.entries(customFeedCardsToAssign ?? {}).filter(([cardNumber]) => !assignedCards.has(cardNumber) && !allWorkspaceAssignedCards.has(cardNumber)));
 }
 
-function hasOnlyOneCardToAssign(list: UnassignedCard[]) {
-    return list.length === 1;
+function hasOnlyOneCardToAssign(list: FilteredCardList) {
+    return Object.keys(list).length === 1;
 }
 
 function getDefaultCardName(cardholder?: string) {
@@ -860,20 +845,60 @@ function splitMaskedCardNumber(cardNumber: string | undefined, maskChar: string
     };
 }
 
-function isCardAlreadyAssigned(cardNumberToCheck: string, workspaceCardFeeds: OnyxCollection<WorkspaceCardsList>): boolean {
-    if (!cardNumberToCheck || !workspaceCardFeeds) {
+/**
+ * Check if two masked card numbers (PAN) are equal.
+ * This function compares the first and last digits of the masked card numbers.
+ * If the number of revealed digits do not match, it will compare the the number of revealed digits.
+ *
+ * @param a the first masked card number
+ * @param b the second masked card number
+ * @param maskChar the character used to mask the card number
+ * @returns true if the two masked card numbers are equal, false otherwise
+ */
+function isMaskedCardNumberEqual(a: string | undefined, b: string | undefined, maskChar: string = CONST.COMPANY_CARD.CARD_NUMBER_MASK_CHAR, compareIfPatternDoesNotMatch = true) {
+    if (!a || !b) {
         return false;
     }
 
-    return Object.values(workspaceCardFeeds).some((workspaceCards) => {
+    const aParts = splitMaskedCardNumber(a, maskChar);
+    const bParts = splitMaskedCardNumber(b, maskChar);
+
+    const aFirstDigitsCount = aParts.firstDigits?.length ?? 0;
+    const bFirstDigitsCount = bParts.firstDigits?.length ?? 0;
+    const aLastDigitsCount = aParts.lastDigits?.length ?? 0;
+    const bLastDigitsCount = bParts.lastDigits?.length ?? 0;
+
+    if (!compareIfPatternDoesNotMatch) {
+        return aFirstDigitsCount === bFirstDigitsCount && aLastDigitsCount === bLastDigitsCount;
+    }
+
+    const firstDigitsCount = Math.min(aFirstDigitsCount, bFirstDigitsCount);
+    const lastDigitsCount = Math.min(aLastDigitsCount, bLastDigitsCount);
+
+    const areFirstDigitsEqual = aParts.firstDigits?.slice(0, firstDigitsCount) === bParts.firstDigits?.slice(0, firstDigitsCount);
+    const areLastDigitsEqual = aParts.lastDigits?.slice(-lastDigitsCount) === bParts.lastDigits?.slice(-lastDigitsCount);
+    return areFirstDigitsEqual && areLastDigitsEqual;
+}
+
+function isCardAlreadyAssigned(cardNumber: string, workspaceCardFeeds: OnyxCollection<WorkspaceCardsList>): boolean {
+    if (!cardNumber || !workspaceCardFeeds) {
+        return false;
+    }
+    for (const workspaceCards of Object.values(workspaceCardFeeds)) {
         if (!workspaceCards) {
-            return false;
+            continue;
         }
         const {cardList, ...assignedCards} = workspaceCards;
-        return Object.values(assignedCards).some(
-            (card) => card?.pendingAction !== CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE && (card?.encryptedCardNumber === cardNumberToCheck || card?.cardName === cardNumberToCheck),
-        );
-    });
+        for (const card of Object.values(assignedCards)) {
+            if (card?.pendingAction === CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE) {
+                continue;
+            }
+            if (card?.cardName === cardNumber) {
+                return true;
+            }
+        }
+    }
+    return false;
 }
 
 export {
@@ -941,6 +966,7 @@ export {
     isPersonalCard,
     COMPANY_CARD_FEED_ICON_NAMES,
     COMPANY_CARD_BANK_ICON_NAMES,
+    isMaskedCardNumberEqual,
     splitMaskedCardNumber,
     isCardAlreadyAssigned,
 };
diff --git a/src/libs/CategoryUtils.ts b/src/libs/CategoryUtils.ts
index 408afdc5f4a4..d313d84bbded 100644
--- a/src/libs/CategoryUtils.ts
+++ b/src/libs/CategoryUtils.ts
@@ -1,8 +1,6 @@
 import {Str} from 'expensify-common';
-import type {OnyxCollection} from 'react-native-onyx';
 import type {LocaleContextProps} from '@components/LocaleContextProvider';
 import CONST from '@src/CONST';
-import ONYXKEYS from '@src/ONYXKEYS';
 import type {Policy, PolicyCategories, TaxRate, TaxRatesWithDefault} from '@src/types/onyx';
 import type {ApprovalRule, ExpenseRule, MccGroup} from '@src/types/onyx/Policy';
 import {convertToShortDisplayString} from './CurrencyUtils';
@@ -113,18 +111,6 @@ function getDecodedCategoryName(categoryName: string) {
     return Str.htmlDecode(categoryName);
 }
 
-function getAvailableNonPersonalPolicyCategories(policyCategories: OnyxCollection<PolicyCategories>, personalPolicyID: string | undefined) {
-    return Object.fromEntries(
-        Object.entries(policyCategories ?? {}).filter(([key, categories]) => {
-            if (key === `${ONYXKEYS.COLLECTION.POLICY_CATEGORIES}${personalPolicyID}`) {
-                return false;
-            }
-            const availableCategories = Object.values(categories ?? {}).filter((category) => category.pendingAction !== CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE);
-            return availableCategories.length > 0;
-        }),
-    );
-}
-
 export {
     formatDefaultTaxRateText,
     formatRequireReceiptsOverText,
@@ -136,5 +122,4 @@ export {
     isCategoryMissing,
     isCategoryDescriptionRequired,
     getDecodedCategoryName,
-    getAvailableNonPersonalPolicyCategories,
 };
diff --git a/src/libs/CurrencyUtils.ts b/src/libs/CurrencyUtils.ts
index 504a6edd3b25..412bbdc831bd 100644
--- a/src/libs/CurrencyUtils.ts
+++ b/src/libs/CurrencyUtils.ts
@@ -200,6 +200,10 @@ function isValidCurrencyCode(currencyCode: string): boolean {
     return !!currency;
 }
 
+function sanitizeCurrencyCode(currencyCode: string): string {
+    return isValidCurrencyCode(currencyCode) ? currencyCode : CONST.CURRENCY.USD;
+}
+
 function getCurrencyKeyByCountryCode(currencies?: CurrencyList, countryCode?: string): string {
     if (!currencies || !countryCode) {
         return CONST.CURRENCY.USD;
@@ -226,4 +230,5 @@ export {
     convertToDisplayStringWithoutCurrency,
     isValidCurrencyCode,
     convertToShortDisplayString,
+    sanitizeCurrencyCode,
 };
diff --git a/src/libs/DistanceRequestUtils.ts b/src/libs/DistanceRequestUtils.ts
index 3002dc7aa254..1a3f1b119e73 100644
--- a/src/libs/DistanceRequestUtils.ts
+++ b/src/libs/DistanceRequestUtils.ts
@@ -1,13 +1,11 @@
 import type {OnyxEntry} from 'react-native-onyx';
-import type {CurrencyListContextProps} from '@components/CurrencyListContextProvider';
 import type {LocaleContextProps} from '@components/LocaleContextProvider';
 import CONST from '@src/CONST';
 import type {LastSelectedDistanceRates, OnyxInputOrEntry, Transaction} from '@src/types/onyx';
 import type {Unit} from '@src/types/onyx/Policy';
 import type Policy from '@src/types/onyx/Policy';
 import {isEmptyObject} from '@src/types/utils/EmptyObject';
-// This will be fixed as part of https://github.com/Expensify/App/issues/66397
-// eslint-disable-next-line @typescript-eslint/no-deprecated
+import {getCurrencySymbol} from './CurrencyUtils';
 import {getDistanceRateCustomUnit, getDistanceRateCustomUnitRate, getPersonalPolicy, getUnitRateValue} from './PolicyUtils';
 import {getCurrency, getRateID, isCustomUnitRateIDForP2P} from './TransactionUtils';
 
@@ -142,7 +140,6 @@ function getRateForDisplay(
     currency: string | undefined,
     translate: LocaleContextProps['translate'],
     toLocaleDigit: LocaleContextProps['toLocaleDigit'],
-    getCurrencySymbol: CurrencyListContextProps['getCurrencySymbol'],
     isOffline?: boolean,
     useShortFormUnit?: boolean,
 ): string {
@@ -178,14 +175,10 @@ function getDistanceForDisplay(
     translate: LocaleContextProps['translate'],
     useShortFormUnit?: boolean,
 ): string {
-    if (!hasRoute || !unit) {
+    if (!hasRoute || !unit || !distanceInMeters) {
         return translate('iou.fieldPending');
     }
 
-    if (!distanceInMeters) {
-        return '';
-    }
-
     const distanceInUnits = getRoundedDistanceInUnits(distanceInMeters, unit);
     if (useShortFormUnit) {
         return `${distanceInUnits} ${unit}`;
@@ -221,18 +214,13 @@ function getDistanceMerchant(
     currency: string,
     translate: LocaleContextProps['translate'],
     toLocaleDigit: LocaleContextProps['toLocaleDigit'],
-    getCurrencySymbol: CurrencyListContextProps['getCurrencySymbol'],
 ): string {
     if (!hasRoute || !rate) {
         return translate('iou.fieldPending');
     }
 
-    if (!distanceInMeters) {
-        return '';
-    }
-
     const distanceInUnits = getDistanceForDisplay(hasRoute, distanceInMeters, unit, rate, translate, true);
-    const ratePerUnit = getRateForDisplay(unit, rate, currency, translate, toLocaleDigit, getCurrencySymbol, undefined, true);
+    const ratePerUnit = getRateForDisplay(unit, rate, currency, translate, toLocaleDigit, undefined, true);
 
     return `${distanceInUnits} ${CONST.DISTANCE_MERCHANT_SEPARATOR} ${ratePerUnit}`;
 }
@@ -381,8 +369,6 @@ function getRate({
     if (isEmptyObject(mileageRates) && policyDraft) {
         mileageRates = getMileageRates(policyDraft, true, transaction?.comment?.customUnit?.customUnitRateID);
     }
-    // This will be fixed as part of https://github.com/Expensify/App/issues/66397
-    // eslint-disable-next-line @typescript-eslint/no-deprecated
     const policyCurrency = policy?.outputCurrency ?? getPersonalPolicy()?.outputCurrency ?? CONST.CURRENCY.USD;
     const defaultMileageRate = getDefaultMileageRate(policy);
     const customUnitRateID = getRateID(transaction);
diff --git a/src/libs/ExpenseRuleUtils.ts b/src/libs/ExpenseRuleUtils.ts
index cea1760e610d..81125e4e10a5 100644
--- a/src/libs/ExpenseRuleUtils.ts
+++ b/src/libs/ExpenseRuleUtils.ts
@@ -1,9 +1,6 @@
 import type {LocaleContextProps} from '@components/LocaleContextProvider';
-import type {ExpenseRuleForm} from '@src/types/form';
-import type {ExpenseRule, TaxRate} from '@src/types/onyx';
-import {getDecodedCategoryName} from './CategoryUtils';
+import type {ExpenseRule} from '@src/types/onyx';
 import {getCleanedTagName} from './PolicyUtils';
-import StringUtils from './StringUtils';
 
 function formatExpenseRuleChanges(rule: ExpenseRule, translate: LocaleContextProps['translate']): string {
     const changes: string[] = [];
@@ -12,7 +9,7 @@ function formatExpenseRuleChanges(rule: ExpenseRule, translate: LocaleContextPro
         changes.push(translate('expenseRulesPage.changes.billable', rule.billable === 'true'));
     }
     if (rule.category) {
-        changes.push(translate('expenseRulesPage.changes.category', getDecodedCategoryName(rule.category)));
+        changes.push(translate('expenseRulesPage.changes.category', rule.category));
     }
     if (rule.comment) {
         changes.push(translate('expenseRulesPage.changes.comment', rule.comment));
@@ -36,40 +33,5 @@ function formatExpenseRuleChanges(rule: ExpenseRule, translate: LocaleContextPro
     return changes.join(', ');
 }
 
-function extractRuleFromForm(form: ExpenseRuleForm, taxRate?: TaxRate) {
-    const rule: ExpenseRule = {
-        billable: form.billable,
-        category: form.category,
-        comment: form.comment,
-        createReport: form.createReport,
-        merchant: form.merchant,
-        merchantToMatch: form.merchantToMatch,
-        reimbursable: form.reimbursable,
-        report: form.report,
-        tag: form.tag,
-        // eslint-disable-next-line @typescript-eslint/naming-convention
-        tax: form.tax && taxRate ? {field_id_TAX: {externalID: form.tax, value: taxRate.value}} : undefined,
-    };
-    return rule;
-}
-
-function getKeyForRule(rule: ExpenseRule) {
-    // Use a stable key based on ordered properties
-    const stableKey = [
-        rule.merchantToMatch,
-        rule.merchant,
-        rule.category,
-        rule.tag,
-        rule.comment,
-        rule.reimbursable,
-        rule.billable,
-        rule.report,
-        rule.createReport,
-        rule.tax?.field_id_TAX?.externalID,
-    ]
-        .filter(Boolean)
-        .join('|');
-    return `${StringUtils.hash(stableKey)}`;
-}
-
-export {formatExpenseRuleChanges, extractRuleFromForm, getKeyForRule};
+// eslint-disable-next-line import/prefer-default-export
+export {formatExpenseRuleChanges};
diff --git a/src/libs/Formula.ts b/src/libs/Formula.ts
index 909ffc634acf..59f5e9203fae 100644
--- a/src/libs/Formula.ts
+++ b/src/libs/Formula.ts
@@ -2,7 +2,7 @@ import {endOfDay, endOfMonth, endOfWeek, getDay, lastDayOfMonth, set, startOfMon
 import type {OnyxEntry} from 'react-native-onyx';
 import type {ValueOf} from 'type-fest';
 import CONST from '@src/CONST';
-import type {PersonalDetails, Policy, PolicyReportField, Report, Transaction} from '@src/types/onyx';
+import type {PersonalDetails, Policy, Report, Transaction} from '@src/types/onyx';
 import {isEmptyObject} from '@src/types/utils/EmptyObject';
 import {convertToDisplayString, convertToDisplayStringWithoutCurrency, isValidCurrencyCode} from './CurrencyUtils';
 import {formatDate} from './FormulaDatetime';
@@ -35,9 +35,6 @@ type FormulaContext = {
     submitterPersonalDetails?: PersonalDetails;
     managerPersonalDetails?: PersonalDetails;
     allTransactions?: Record<string, Transaction>;
-    fieldValues?: Record<string, string>;
-    fieldsByName?: Record<string, PolicyReportField>;
-    visitedFields?: Set<string>;
 };
 
 type FieldList = Record<string, {name: string; defaultValue: string}>;
@@ -299,7 +296,7 @@ function compute(formula?: string, context?: FormulaContext): string {
                 }
                 break;
             case FORMULA_PART_TYPES.FIELD:
-                value = computeFieldPart(part, context);
+                value = computeFieldPart(part);
                 break;
             case FORMULA_PART_TYPES.USER:
                 value = computeUserPart(part);
@@ -431,48 +428,10 @@ function formatStatus(statusNum: number | undefined): string {
 }
 
 /**
- * Check if a formula string contains field references ({field:X})
- * Uses quick string check before expensive parsing for performance
+ * Compute the value of a field formula part
  */
-function hasFieldReferences(formula: string | undefined): boolean {
-    if (!formula?.includes('{field:')) {
-        return false;
-    }
-    const parsed = parse(formula);
-    return parsed.some((part) => part.type === FORMULA_PART_TYPES.FIELD);
-}
-
-/**
- * Compute the value of a field formula part with recursive resolution support
- */
-function computeFieldPart(part: FormulaPart, context?: FormulaContext): string {
-    const fieldName = part.fieldPath.at(0)?.toLowerCase();
-
-    if (!fieldName) {
-        return part.definition;
-    }
-
-    // Prevent circular references by tracking visited fields
-    const visited = context?.visitedFields ?? new Set<string>();
-    if (visited.has(fieldName)) {
-        return part.definition;
-    }
-
-    // If we have the full field definitions, we can recursively resolve dependencies
-    if (context?.fieldsByName?.[fieldName]) {
-        const field = context.fieldsByName[fieldName];
-        if (hasFieldReferences(field.defaultValue)) {
-            visited.add(fieldName);
-            return compute(field.defaultValue, {...context, visitedFields: visited});
-        }
-        return field.value ?? field.defaultValue ?? '';
-    }
-
-    // Fallback to flat value map
-    if (context?.fieldValues?.[fieldName]) {
-        return context.fieldValues[fieldName];
-    }
-
+function computeFieldPart(part: FormulaPart): string {
+    // Field computation will be implemented later
     return part.definition;
 }
 
@@ -926,11 +885,11 @@ function computePersonalDetailsField(path: string[], personalDetails: PersonalDe
         case 'email':
             return personalDetails.login ?? '';
         // userid/customfield1 returns employeeUserID from policy.employeeList
+        // TODO: Check policy.glCodes once backend adds it (issue #568268)
         case 'userid':
         case 'customfield1': {
             const email = personalDetails.login;
-            const isGlCodesEnabled = policy?.glCodes === true;
-            if (!isGlCodesEnabled || !email || !policy?.employeeList) {
+            if (!email || !policy?.employeeList) {
                 return '';
             }
             // eslint-disable-next-line rulesdir/no-default-id-values
@@ -940,8 +899,7 @@ function computePersonalDetailsField(path: string[], personalDetails: PersonalDe
         case 'payrollid':
         case 'customfield2': {
             const email = personalDetails.login;
-            const isGlCodesEnabled = policy?.glCodes === true;
-            if (!isGlCodesEnabled || !email || !policy?.employeeList) {
+            if (!email || !policy?.employeeList) {
                 return '';
             }
             // eslint-disable-next-line rulesdir/no-default-id-values
@@ -952,25 +910,6 @@ function computePersonalDetailsField(path: string[], personalDetails: PersonalDe
     }
 }
 
-/**
- * Resolve the display value for a report field, handling {field:X} references
- */
-function resolveReportFieldValue(
-    field: PolicyReportField,
-    report: OnyxEntry<Report>,
-    policy: OnyxEntry<Policy>,
-    fieldValues: Record<string, string>,
-    fieldsByName: Record<string, PolicyReportField>,
-): string {
-    const fieldValue = field.value ?? field.defaultValue ?? '';
-
-    if (!report || !hasFieldReferences(field.defaultValue)) {
-        return fieldValue;
-    }
-
-    return compute(field.defaultValue, {report, policy, fieldValues, fieldsByName});
-}
-
-export {FORMULA_PART_TYPES, compute, parse, hasCircularReferences, resolveReportFieldValue};
+export {FORMULA_PART_TYPES, compute, parse, hasCircularReferences};
 
 export type {FormulaContext, FieldList, MinimalTransaction};
diff --git a/src/libs/IOUUtils.ts b/src/libs/IOUUtils.ts
index c40a3045397f..04d6f7baebf2 100644
--- a/src/libs/IOUUtils.ts
+++ b/src/libs/IOUUtils.ts
@@ -38,9 +38,6 @@ function navigateToStartMoneyRequestStep(requestType: IOURequestType, iouType: I
         case CONST.IOU.REQUEST_TYPE.SCAN:
             Navigation.goBack(ROUTES.MONEY_REQUEST_CREATE_TAB_SCAN.getRoute(CONST.IOU.ACTION.CREATE, iouType, transactionID, reportID), {compareParams: false});
             break;
-        case CONST.IOU.REQUEST_TYPE.TIME:
-            Navigation.goBack(ROUTES.MONEY_REQUEST_CREATE_TAB_TIME.getRoute(CONST.IOU.ACTION.CREATE, iouType, transactionID, reportID), {compareParams: false});
-            break;
         default:
             Navigation.goBack(ROUTES.MONEY_REQUEST_CREATE_TAB_MANUAL.getRoute(CONST.IOU.ACTION.CREATE, iouType, transactionID, reportID), {compareParams: false});
             break;
@@ -323,40 +320,6 @@ function formatCurrentUserToAttendee(currentUser?: PersonalDetails, reportID?: s
     return [initialAttendee];
 }
 
-function navigateToConfirmationPage(
-    iouType: IOUType,
-    transactionID: string,
-    reportID: string,
-    backToReport: string | undefined,
-    shouldNavigateToSubmit = false,
-    reportIDParam: string | undefined = undefined,
-    fromManualDistanceRequest = false,
-) {
-    switch (iouType) {
-        case CONST.IOU.TYPE.REQUEST:
-            Navigation.navigate(ROUTES.MONEY_REQUEST_STEP_CONFIRMATION.getRoute(CONST.IOU.ACTION.CREATE, CONST.IOU.TYPE.SUBMIT, transactionID, reportID, backToReport));
-            break;
-        case CONST.IOU.TYPE.SEND:
-            if (fromManualDistanceRequest) {
-                Navigation.navigate(ROUTES.MONEY_REQUEST_STEP_CONFIRMATION.getRoute(CONST.IOU.ACTION.CREATE, iouType, transactionID, reportID, backToReport));
-            } else {
-                Navigation.navigate(ROUTES.MONEY_REQUEST_STEP_CONFIRMATION.getRoute(CONST.IOU.ACTION.CREATE, CONST.IOU.TYPE.PAY, transactionID, reportID));
-            }
-            break;
-        default:
-            Navigation.navigate(
-                ROUTES.MONEY_REQUEST_STEP_CONFIRMATION.getRoute(
-                    CONST.IOU.ACTION.CREATE,
-                    shouldNavigateToSubmit ? CONST.IOU.TYPE.SUBMIT : iouType,
-                    transactionID,
-                    // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
-                    reportIDParam || reportID,
-                    backToReport,
-                ),
-            );
-    }
-}
-
 export {
     calculateAmount,
     calculateSplitAmountFromPercentage,
@@ -371,5 +334,4 @@ export {
     formatCurrentUserToAttendee,
     navigateToParticipantPage,
     shouldShowReceiptEmptyState,
-    navigateToConfirmationPage,
 };
diff --git a/src/libs/LoginUtils.ts b/src/libs/LoginUtils.ts
index 6201df99d63f..de75b75158ab 100644
--- a/src/libs/LoginUtils.ts
+++ b/src/libs/LoginUtils.ts
@@ -115,22 +115,6 @@ function formatE164PhoneNumber(phoneNumber: string, countryCode: number) {
     return parsedPhoneNumber.number?.e164;
 }
 
-/**
- * Format a login string by removing SMS domain if applicable
- * @param login - The login string to format
- * @returns The formatted login string, or empty string if no login provided
- */
-function normalizeLogin(login: string | undefined): string {
-    if (!login) {
-        return '';
-    }
-    return Str.isSMSLogin(login) ? Str.removeSMSDomain(login) : login;
-}
-
-function sanitizePhoneOrEmail(phoneOrEmail: string) {
-    return phoneOrEmail.replaceAll(CONST.REGEX.WHITESPACE, '').toLowerCase();
-}
-
 export {
     getPhoneNumberWithoutSpecialChars,
     appendCountryCode,
@@ -143,6 +127,4 @@ export {
     formatE164PhoneNumber,
     getEmailDomain,
     isDomainPublic,
-    normalizeLogin,
-    sanitizePhoneOrEmail,
 };
diff --git a/src/libs/ModifiedExpenseMessage.ts b/src/libs/ModifiedExpenseMessage.ts
index 4df78d4fa146..8c3670757e94 100644
--- a/src/libs/ModifiedExpenseMessage.ts
+++ b/src/libs/ModifiedExpenseMessage.ts
@@ -15,7 +15,6 @@ import {getEnvironmentURL} from './Environment/Environment';
 import {translateLocal} from './Localize';
 import Log from './Log';
 import Parser from './Parser';
-import {getPersonalDetailByEmail} from './PersonalDetailsUtils';
 import {getCleanedTagName, getPolicy, getSortedTagKeys, isPolicyAdmin} from './PolicyUtils';
 import {getOriginalMessage, isModifiedExpenseAction} from './ReportActionsUtils';
 // This cycle import is safe because ReportNameUtils was extracted from ReportUtils to separate report name computation logic.
@@ -164,10 +163,8 @@ function getForExpenseMovedFromSelfDM(translate: LocalizedTranslate, destination
     // In NewDot, the "Move report" flow only supports moving expenses from self-DM to:
     // - A policy expense chat
     // - A 1:1 DM
-    const currentUserAccountID = getPersonalDetailByEmail(currentUserLogin)?.accountID;
-    const reportName = isPolicyExpenseChat(rootParentReport)
-        ? getPolicyExpenseChatName({report: rootParentReport})
-        : buildReportNameFromParticipantNames({report: rootParentReport, currentUserAccountID});
+    // eslint-disable-next-line @typescript-eslint/no-deprecated
+    const reportName = isPolicyExpenseChat(rootParentReport) ? getPolicyExpenseChatName({report: rootParentReport}) : buildReportNameFromParticipantNames({report: rootParentReport});
     const policyName = getPolicyName({report: rootParentReport, returnEmptyIfNotFound: true});
     // If we can't determine either the report name or policy name, return the default message
     if (isEmpty(policyName) && !reportName) {
@@ -248,7 +245,7 @@ function getForReportAction({
     if (hasModifiedAmount) {
         const oldCurrency = reportActionOriginalMessage?.oldCurrency;
         const oldAmountValue = reportActionOriginalMessage?.oldAmount ?? 0;
-        const oldAmount = convertToDisplayString(oldAmountValue, oldCurrency);
+        const oldAmount = oldAmountValue ? convertToDisplayString(reportActionOriginalMessage?.oldAmount ?? 0, oldCurrency) : '';
 
         const currency = reportActionOriginalMessage?.currency;
         const amount = convertToDisplayString(reportActionOriginalMessage?.amount ?? 0, currency);
@@ -399,7 +396,7 @@ function getForReportAction({
 
         const taxAmount = convertToDisplayString(getTaxAmountAbsValue(reportActionOriginalMessage?.taxAmount ?? 0), currency);
         const oldTaxAmountValue = getTaxAmountAbsValue(reportActionOriginalMessage?.oldTaxAmount ?? 0);
-        const oldTaxAmount = convertToDisplayString(oldTaxAmountValue, currency);
+        const oldTaxAmount = oldTaxAmountValue > 0 ? convertToDisplayString(oldTaxAmountValue, currency) : '';
         // eslint-disable-next-line @typescript-eslint/no-deprecated
         buildMessageFragmentForValue(translateLocal, taxAmount, oldTaxAmount, translateLocal('iou.taxAmount'), false, setFragments, removalFragments, changeFragments);
     }
@@ -538,7 +535,7 @@ function getForReportActionTemp({
     if (hasModifiedAmount) {
         const oldCurrency = reportActionOriginalMessage?.oldCurrency;
         const oldAmountValue = reportActionOriginalMessage?.oldAmount ?? 0;
-        const oldAmount = convertToDisplayString(oldAmountValue, oldCurrency);
+        const oldAmount = oldAmountValue ? convertToDisplayString(reportActionOriginalMessage?.oldAmount ?? 0, oldCurrency) : '';
 
         const currency = reportActionOriginalMessage?.currency;
         const amount = convertToDisplayString(reportActionOriginalMessage?.amount ?? 0, currency);
@@ -661,7 +658,7 @@ function getForReportActionTemp({
 
         const taxAmount = convertToDisplayString(getTaxAmountAbsValue(reportActionOriginalMessage?.taxAmount ?? 0), currency);
         const oldTaxAmountValue = getTaxAmountAbsValue(reportActionOriginalMessage?.oldTaxAmount ?? 0);
-        const oldTaxAmount = convertToDisplayString(oldTaxAmountValue, currency);
+        const oldTaxAmount = oldTaxAmountValue > 0 ? convertToDisplayString(oldTaxAmountValue, currency) : '';
         buildMessageFragmentForValue(translate, taxAmount, oldTaxAmount, translate('iou.taxAmount'), false, setFragments, removalFragments, changeFragments);
     }
 
diff --git a/src/libs/MoneyRequestReportUtils.ts b/src/libs/MoneyRequestReportUtils.ts
index bd3c60d3106c..264ecb724d63 100644
--- a/src/libs/MoneyRequestReportUtils.ts
+++ b/src/libs/MoneyRequestReportUtils.ts
@@ -128,11 +128,7 @@ function shouldDisplayReportTableView(report: OnyxEntry<Report>, transactions: T
     return !isReportTransactionThread(report) && !isSingleTransactionReport(report, transactions);
 }
 
-function shouldWaitForTransactions(report: OnyxEntry<Report>, transactions: Transaction[] | undefined, reportMetadata: OnyxEntry<ReportMetadata>, isOffline = false) {
-    if (isOffline) {
-        return false;
-    }
-
+function shouldWaitForTransactions(report: OnyxEntry<Report>, transactions: Transaction[] | undefined, reportMetadata: OnyxEntry<ReportMetadata>) {
     const isTransactionDataReady = transactions !== undefined;
     const isTransactionThreadView = isReportTransactionThread(report);
     const isStillLoadingData = transactions?.length === 0 && ((!!reportMetadata?.isLoadingInitialReportActions && !reportMetadata.hasOnceLoadedReportActions) || report?.total !== 0);
diff --git a/src/libs/MultifactorAuthentication/Biometrics/ED25519/index.ts b/src/libs/MultifactorAuthentication/Biometrics/ED25519/index.ts
deleted file mode 100644
index f5ba93e3e18a..000000000000
--- a/src/libs/MultifactorAuthentication/Biometrics/ED25519/index.ts
+++ /dev/null
@@ -1,148 +0,0 @@
-import {etc, hashes, keygen, sign, verify} from '@noble/ed25519';
-import type {Bytes} from '@noble/ed25519';
-import {sha256, sha512} from '@noble/hashes/sha2';
-import {utf8ToBytes} from '@noble/hashes/utils';
-import 'react-native-get-random-values';
-import VALUES from '@libs/MultifactorAuthentication/Biometrics/VALUES';
-import Base64URL from '@src/utils/Base64URL';
-import type {Base64URLString} from '@src/utils/Base64URL';
-import type {ChallengeFlags, MultifactorAuthenticationChallengeObject, SignedChallenge} from './types';
-
-/**
- * ED25519 helpers used to construct and sign multifactor authentication challenges.
- * Wraps `@noble/ed25519` to produce WebAuthn-like payloads that the server can verify.
- */
-
-/**
- * Required polyfills for React Native to support ED25519 cryptographic operations.
- * Provides implementations for getRandomValues and SHA-512 hashing.
- * It is required for internal operations, even if it is not explicitly used in the app code.
- * @see https://github.com/paulmillr/noble-ed25519?tab=readme-ov-file#react-native-polyfill-getrandomvalues-and-sha512
- */
-hashes.sha512 = sha512;
-hashes.sha512Async = (m: Uint8Array) => Promise.resolve(sha512(m));
-
-const {hexToBytes, concatBytes, bytesToHex, randomBytes} = etc;
-
-/**
- * Generates a new ED25519 key pair encoded as hex strings.
- */
-function generateKeyPair() {
-    const {secretKey, publicKey} = keygen();
-
-    return {
-        /**
-         * The public key is stored as url-encoded base64 because that is what the server expects.
-         * The encoding is arbitrary, and base64 was chosen because it is shorter than hex, so less
-         * overall data is stored and shipped across the wire. The private key is never exchanged with
-         * the server, so compatibility with the encoding format is not important. Hex is used instead
-         * because the @noble library ships with some convenience methods for converting between
-         * Hex<->Bytes, and the documented examples use those methods.
-         */
-        privateKey: bytesToHex(secretKey),
-
-        publicKey: Base64URL.encode(publicKey),
-    };
-}
-
-/* eslint-disable no-bitwise */
-/**
- * Builds the challenge flag bitmask describing user presence and verification.
- */
-function createFlag(up: boolean, uv: boolean): ChallengeFlags {
-    let flag = 0;
-
-    // Set bit 0
-    // (User Presence, user touched the security key or interacted with the authenticator)
-    if (up) {
-        flag |= 0x01;
-    }
-
-    // Set bit 2
-    // (User Verified, user has successfully authenticated with the authenticator)
-    if (uv) {
-        flag |= 0x04;
-    }
-
-    return flag;
-}
-/* eslint-enable no-bitwise */
-
-/**
- * Creates the binary authenticator data buffer for a Relying Party Identifier.
- * The result is in the form of concatBytes of the RPID, FLAGS, and SIGN_COUNT.
- *
- * RPID - Relying Party Identifier Hash (SHA-256 hash of the rpId)
- * FLAGS - Bitmask describing user presence and verification state
- *
- * SIGN_COUNT - This exists to support hardware authenticator devices.
- * It contains a monotonically increasing integer. The API currently will not validate this field.
- *
- * @see https://www.w3.org/TR/webauthn-2/#sctn-authenticator-data
- */
-function createAuthenticatorData(rpId: string): Bytes {
-    const rpIdBytes = utf8ToBytes(rpId);
-
-    // Per WebAuthn spec, RPID is hashed to guarantee a consistent length
-    const hashedRpId = sha256(rpIdBytes);
-
-    // User Presence (UP) is true, User Verification (UV) is true
-    // This is because we only create challenges after successful biometric verification
-    const flagsArray = new Uint8Array([createFlag(true, true)]);
-
-    const signCount = 0;
-
-    // Creating a 4-byte buffer for the signCount
-    const buffer = new ArrayBuffer(4);
-
-    const view = new DataView(buffer);
-
-    // Writing the signCount as a big-endian 32-bit integer because WebAuthn expects it in this format
-    view.setUint32(0, signCount, false);
-
-    // Creating a Uint8Array from the buffer to get the byte representation
-    const signCountArray = new Uint8Array(buffer);
-
-    // Concatenate hashedRpId, flagsArray, and signCountArray to form the final binary data
-    return concatBytes(hashedRpId, flagsArray, signCountArray);
-}
-
-/**
- * Signs a multifactor authentication challenge for the given account identifier and key.
- * Returns a WebAuthn-compatible signed challenge structure.
- */
-function signToken(credentialRequestOptions: MultifactorAuthenticationChallengeObject, privateKey: string): SignedChallenge {
-    const rawId: Base64URLString = Base64URL.encode(VALUES.KEY_ALIASES.PUBLIC_KEY);
-    const type = VALUES.ED25519_TYPE;
-
-    const authenticatorDataBytes = createAuthenticatorData(credentialRequestOptions.rpId);
-    const authenticatorData: Base64URLString = Base64URL.encode(authenticatorDataBytes);
-
-    const clientDataJSON = JSON.stringify({challenge: credentialRequestOptions.challenge});
-    const clientDataBytes = utf8ToBytes(clientDataJSON);
-
-    /**
-     * Since the token can be of variable length, it is hashed to guarantee that binaryData is always a fixed length.
-     * This comes from the WebAuthN spec, with which we maintain compatibility here for easier interoperability on the backend.
-     */
-    const clientDataHash = sha256(clientDataBytes);
-
-    // WebAuthn signature format: sign(authenticatorData || SHA-256(clientDataJSON))
-    const dataToSign = concatBytes(authenticatorDataBytes, clientDataHash);
-    const privateKeyBytes = hexToBytes(privateKey);
-
-    const signatureBytes = sign(dataToSign, privateKeyBytes);
-    const signature: Base64URLString = Base64URL.encode(signatureBytes);
-
-    return {
-        rawId,
-        type,
-        response: {
-            authenticatorData,
-            clientDataJSON: Base64URL.encode(clientDataJSON),
-            signature,
-        },
-    };
-}
-
-export {generateKeyPair, signToken, createAuthenticatorData, concatBytes, sha256, utf8ToBytes, verify, randomBytes};
diff --git a/src/libs/MultifactorAuthentication/Biometrics/ED25519/types.ts b/src/libs/MultifactorAuthentication/Biometrics/ED25519/types.ts
deleted file mode 100644
index ec3e65af97df..000000000000
--- a/src/libs/MultifactorAuthentication/Biometrics/ED25519/types.ts
+++ /dev/null
@@ -1,39 +0,0 @@
-import type {Base64URLString} from '@src/utils/Base64URL';
-
-/**
- * Bitmask flag describing user presence and verification state for a challenge.
- */
-type ChallengeFlags = number;
-
-/**
- * Signed multifactor authentication challenge matching the WebAuthn response shape.
- */
-type SignedChallenge = {
-    rawId: Base64URLString;
-    type: string;
-    response: {
-        authenticatorData: Base64URLString;
-        clientDataJSON: Base64URLString;
-        signature: Base64URLString;
-    };
-};
-
-/**
- * Challenge parameters required to initiate a multifactor authentication request.
- */
-type MultifactorAuthenticationChallengeObject = {
-    challenge: string;
-
-    rpId: string;
-
-    allowCredentials: Array<{
-        type: string;
-        id: string;
-    }>;
-
-    userVerification: string;
-
-    timeout: number;
-};
-
-export type {MultifactorAuthenticationChallengeObject, ChallengeFlags, SignedChallenge};
diff --git a/src/libs/MultifactorAuthentication/Biometrics/SecureStore/index.ts b/src/libs/MultifactorAuthentication/Biometrics/SecureStore/index.ts
deleted file mode 100644
index ec68f5c132de..000000000000
--- a/src/libs/MultifactorAuthentication/Biometrics/SecureStore/index.ts
+++ /dev/null
@@ -1,67 +0,0 @@
-import * as SecureStore from 'expo-secure-store';
-import type {SecureStoreMethods, SecureStoreValues} from './types';
-
-/**
- * Platform SecureStore constants used by the multifactor authentication biometrics flow.
- * Normalizes supported auth types and storage policies exposed by `expo-secure-store`.
- *
- * @see https://docs.expo.dev/versions/latest/sdk/securestore/
- */
-const SECURE_STORE_VALUES = {
-    AUTH_TYPE: {
-        UNKNOWN: {
-            CODE: SecureStore.AUTH_TYPE.UNKNOWN,
-            NAME: 'Unknown',
-        },
-        NONE: {
-            CODE: SecureStore.AUTH_TYPE.NONE,
-            NAME: 'None',
-        },
-        CREDENTIALS: {
-            CODE: SecureStore.AUTH_TYPE.CREDENTIALS,
-            NAME: 'Credentials',
-        },
-        BIOMETRICS: {
-            CODE: SecureStore.AUTH_TYPE.BIOMETRICS,
-            NAME: 'Biometrics',
-        },
-        FACE_ID: {
-            CODE: SecureStore.AUTH_TYPE.FACE_ID,
-            NAME: 'FaceID',
-        },
-        TOUCH_ID: {
-            CODE: SecureStore.AUTH_TYPE.TOUCH_ID,
-            NAME: 'TouchID',
-        },
-        /**
-         * OpticID is reserved by apple, used on Apple Vision Pro and not iOS.
-         * It is declared here for completeness but is not currently supported.
-         */
-        OPTIC_ID: {
-            CODE: SecureStore.AUTH_TYPE.OPTIC_ID,
-            NAME: 'OpticID',
-        },
-    },
-    /**
-     * A flag that ensures data is stored securely and is only accessible
-     * when the device has at least passcode set and is currently unlocked.
-     */
-    WHEN_PASSCODE_SET_THIS_DEVICE_ONLY: SecureStore.WHEN_PASSCODE_SET_THIS_DEVICE_ONLY,
-} as const satisfies SecureStoreValues;
-
-/**
- * Thin wrapper around SecureStore methods used by multifactor authentication.
- * Centralizes calls so they can be mocked or swapped on non-native platforms.
- */
-const SECURE_STORE_METHODS = {
-    canUseBiometricAuthentication: SecureStore.canUseBiometricAuthentication,
-    canUseDeviceCredentialsAuthentication: SecureStore.canUseDeviceCredentialsAuthentication,
-    getItemAsync: SecureStore.getItemAsync,
-    setItemAsync: SecureStore.setItemAsync,
-    deleteItemAsync: SecureStore.deleteItemAsync,
-} satisfies SecureStoreMethods;
-
-type SecureStoreOptions = SecureStore.SecureStoreOptions;
-
-export {SECURE_STORE_METHODS, SECURE_STORE_VALUES};
-export type {SecureStoreOptions};
diff --git a/src/libs/MultifactorAuthentication/Biometrics/SecureStore/index.web.ts b/src/libs/MultifactorAuthentication/Biometrics/SecureStore/index.web.ts
deleted file mode 100644
index 797467f72f8f..000000000000
--- a/src/libs/MultifactorAuthentication/Biometrics/SecureStore/index.web.ts
+++ /dev/null
@@ -1,56 +0,0 @@
-import type {SecureStoreMethods, SecureStoreValues} from './types';
-
-/**
- * Web polyfill values mirroring the native SecureStore API for multifactor authentication.
- * Provides stable auth type codes and configuration flags for non-native environments.
- */
-const SECURE_STORE_VALUES = {
-    AUTH_TYPE: {
-        UNKNOWN: {
-            CODE: -1,
-            NAME: 'Unknown',
-        },
-        NONE: {
-            CODE: 0,
-            NAME: 'None',
-        },
-        CREDENTIALS: {
-            CODE: 1,
-            NAME: 'Credentials',
-        },
-        BIOMETRICS: {
-            CODE: 2,
-            NAME: 'Biometrics',
-        },
-        FACE_ID: {
-            CODE: 3,
-            NAME: 'FaceID',
-        },
-        TOUCH_ID: {
-            CODE: 4,
-            NAME: 'TouchID',
-        },
-        OPTIC_ID: {
-            CODE: 5,
-            NAME: 'OpticID',
-        },
-    },
-    WHEN_PASSCODE_SET_THIS_DEVICE_ONLY: -1,
-} as const satisfies SecureStoreValues;
-
-/**
- * Web-safe polyfill implementations of SecureStore methods used by multifactor authentication.
- * Always report that secure auth is unavailable and operate on no-op async calls.
- */
-const SECURE_STORE_METHODS = {
-    canUseBiometricAuthentication: () => false,
-    canUseDeviceCredentialsAuthentication: () => false,
-    getItemAsync: async () => [null, 0],
-    setItemAsync: async () => 0,
-    deleteItemAsync: async () => {},
-} as const satisfies SecureStoreMethods;
-
-type SecureStoreOptions = Record<string, unknown>;
-
-export {SECURE_STORE_METHODS, SECURE_STORE_VALUES};
-export type {SecureStoreOptions};
diff --git a/src/libs/MultifactorAuthentication/Biometrics/SecureStore/types.ts b/src/libs/MultifactorAuthentication/Biometrics/SecureStore/types.ts
deleted file mode 100644
index ce41c29f71cf..000000000000
--- a/src/libs/MultifactorAuthentication/Biometrics/SecureStore/types.ts
+++ /dev/null
@@ -1,61 +0,0 @@
-/**
- * Common type definitions for SecureStore implementations used by multifactor authentication.
- * Shared between native and web polyfill implementations.
- */
-
-/**
- * Authentication type information containing both the numeric code and human-readable name.
- */
-type AuthTypeInfo = {
-    CODE: number;
-    NAME: string;
-};
-
-/**
- * Mapping of authentication type names to their corresponding codes and names.
- */
-type AuthTypeMap = {
-    UNKNOWN: AuthTypeInfo;
-    NONE: AuthTypeInfo;
-    CREDENTIALS: AuthTypeInfo;
-    BIOMETRICS: AuthTypeInfo;
-    FACE_ID: AuthTypeInfo;
-    TOUCH_ID: AuthTypeInfo;
-    OPTIC_ID: AuthTypeInfo;
-};
-
-/**
- * Exposed flags for the secure store.
- */
-type SecureStoreFlags = {
-    WHEN_PASSCODE_SET_THIS_DEVICE_ONLY: number;
-};
-
-/**
- * Object containing both the authentication type map and the flags for the secure store.
- */
-type SecureStoreValues = {
-    AUTH_TYPE: AuthTypeMap;
-} & SecureStoreFlags;
-
-/**
- * SecureStore configuration options.
- * On native platforms, this maps to expo-secure-store's SecureStoreOptions.
- * On web, this is a generic record for polyfill compatibility.
- */
-type SecureStoreOptions = Record<string, unknown>;
-
-/**
- * Methods for the secure store.
- * This type is used to satisfy both native and web polyfill implementations.
- * For details on the methods, see the expo-secure-store documentation.
- */
-type SecureStoreMethods = {
-    canUseBiometricAuthentication: () => boolean;
-    canUseDeviceCredentialsAuthentication: () => boolean;
-    getItemAsync: (key: string, options: SecureStoreOptions) => Promise<[string | null, number] | (string | null)>;
-    setItemAsync: (key: string, value: string, options: SecureStoreOptions) => Promise<number | void>;
-    deleteItemAsync: (key: string, options: SecureStoreOptions) => Promise<void>;
-};
-
-export type {SecureStoreValues, SecureStoreMethods};
diff --git a/src/libs/MultifactorAuthentication/Biometrics/VALUES.ts b/src/libs/MultifactorAuthentication/Biometrics/VALUES.ts
deleted file mode 100644
index 975ea9e9ae94..000000000000
--- a/src/libs/MultifactorAuthentication/Biometrics/VALUES.ts
+++ /dev/null
@@ -1,13 +0,0 @@
-/**
- * Centralized constants used by the multifactor authentication biometrics flow.
- * It is stored here instead of the CONST file to avoid circular dependencies.
- */
-const MULTIFACTOR_AUTHENTICATION_VALUES = {
-    /** Referred to as the EdDSA in the Auth */
-    ED25519_TYPE: 'biometric',
-    KEY_ALIASES: {
-        PUBLIC_KEY: '3DS_SCA_KEY_PUBLIC',
-    },
-} as const;
-
-export default MULTIFACTOR_AUTHENTICATION_VALUES;
diff --git a/src/libs/Navigation/AppNavigator/AuthScreens.tsx b/src/libs/Navigation/AppNavigator/AuthScreens.tsx
index 17ccde594eb0..2df277ec6da3 100644
--- a/src/libs/Navigation/AppNavigator/AuthScreens.tsx
+++ b/src/libs/Navigation/AppNavigator/AuthScreens.tsx
@@ -1,10 +1,8 @@
 import type {RouteProp} from '@react-navigation/native';
-import {useNavigationState} from '@react-navigation/native';
 import type {StackCardInterpolationProps} from '@react-navigation/stack';
 import React, {memo, useContext, useEffect, useRef, useState} from 'react';
 import ComposeProviders from '@components/ComposeProviders';
 import OpenConfirmNavigateExpensifyClassicModal from '@components/ConfirmNavigateExpensifyClassicModal';
-import {CurrencyListContextProvider} from '@components/CurrencyListContextProvider';
 import DelegateNoAccessModalProvider from '@components/DelegateNoAccessModalProvider';
 import FullScreenLoadingIndicator from '@components/FullscreenLoadingIndicator';
 import {InitialURLContext} from '@components/InitialURLContextProvider';
@@ -13,7 +11,7 @@ import OpenAppFailureModal from '@components/OpenAppFailureModal';
 import OptionsListContextProvider from '@components/OptionListContextProvider';
 import PriorityModeController from '@components/PriorityModeController';
 import {SearchContextProvider} from '@components/Search/SearchContext';
-import {useSearchRouterActions} from '@components/Search/SearchRouter/SearchRouterContext';
+import {useSearchRouterContext} from '@components/Search/SearchRouter/SearchRouterContext';
 import SearchRouterModal from '@components/Search/SearchRouter/SearchRouterModal';
 import SupportalPermissionDeniedModalProvider from '@components/SupportalPermissionDeniedModalProvider';
 import {WideRHPContext} from '@components/WideRHPContextProvider';
@@ -35,7 +33,7 @@ import KeyboardShortcut from '@libs/KeyboardShortcut';
 import Log from '@libs/Log';
 import NavBarManager from '@libs/NavBarManager';
 import getCurrentUrl from '@libs/Navigation/currentUrl';
-import Navigation, {getDeepestFocusedScreenName, isTwoFactorSetupScreen} from '@libs/Navigation/Navigation';
+import Navigation from '@libs/Navigation/Navigation';
 import Animations, {InternalPlatformAnimations} from '@libs/Navigation/PlatformStackNavigation/navigationOptions/animation';
 import type {AuthScreensParamList} from '@libs/Navigation/types';
 import NetworkConnection from '@libs/NetworkConnection';
@@ -145,7 +143,7 @@ function AuthScreens() {
     const {shouldUseNarrowLayout} = useResponsiveLayout();
     const rootNavigatorScreenOptions = useRootNavigatorScreenOptions();
     const currentUserPersonalDetails = useCurrentUserPersonalDetails();
-    const {toggleSearch} = useSearchRouterActions();
+    const {toggleSearch} = useSearchRouterContext();
     const currentUrl = getCurrentUrl();
     const delegatorEmail = getSearchParamFromUrl(currentUrl, 'delegatorEmail');
     const [credentials] = useOnyx(ONYXKEYS.CREDENTIALS, {canBeMissing: true});
@@ -159,13 +157,6 @@ function AuthScreens() {
     const {shouldRenderSecondaryOverlayForWideRHP, shouldRenderSecondaryOverlayForRHPOnWideRHP, shouldRenderSecondaryOverlayForRHPOnSuperWideRHP, shouldRenderTertiaryOverlay} =
         useContext(WideRHPContext);
 
-    // Check if the user is currently on a 2FA setup screen
-    // We can't rely on useRoute in this component because we're not a child of a Navigator, so we must sift through nav state by hand
-    const isIn2FASetupFlow = useNavigationState((state) => {
-        const focusedScreenName = getDeepestFocusedScreenName(state);
-        return isTwoFactorSetupScreen(focusedScreenName);
-    });
-
     // State to track whether the delegator's authentication is completed before displaying data
     const [isDelegatorFromOldDotIsReady, setIsDelegatorFromOldDotIsReady] = useState(false);
 
@@ -238,14 +229,7 @@ function AuthScreens() {
         // or returning from background. If so, we'll assume they have some app data already and we can call reconnectApp() instead of openApp() and connect() for delegator from OldDot.
         if (SessionUtils.didUserLogInDuringSession() || delegatorEmail) {
             if (delegatorEmail) {
-                connect({
-                    email: delegatorEmail,
-                    delegatedAccess: account?.delegatedAccess,
-                    credentials,
-                    session,
-                    activePolicyID,
-                    isFromOldDot: true,
-                })
+                connect({email: delegatorEmail, delegatedAccess: account?.delegatedAccess, credentials, session, activePolicyID, isFromOldDot: true})
                     ?.then((success) => {
                         App.setAppLoading(!!success);
                     })
@@ -275,7 +259,7 @@ function AuthScreens() {
             shortcutsOverviewShortcutConfig.shortcutKey,
             () => {
                 Modal.close(() => {
-                    if (Navigation.isOnboardingFlow() || shouldShowRequire2FAPage) {
+                    if (Navigation.isOnboardingFlow()) {
                         return;
                     }
 
@@ -297,7 +281,7 @@ function AuthScreens() {
             searchShortcutConfig.shortcutKey,
             () => {
                 Session.callFunctionIfActionIsAllowed(() => {
-                    if (Navigation.isOnboardingFlow() || shouldShowRequire2FAPage) {
+                    if (Navigation.isOnboardingFlow()) {
                         return;
                     }
                     toggleSearch();
@@ -311,7 +295,7 @@ function AuthScreens() {
         const unsubscribeChatShortcut = KeyboardShortcut.subscribe(
             chatShortcutConfig.shortcutKey,
             () => {
-                if (Navigation.isOnboardingFlow() || shouldShowRequire2FAPage) {
+                if (Navigation.isOnboardingFlow()) {
                     return;
                 }
                 Session.callFunctionIfActionIsAllowed(() => Modal.close(() => Navigation.navigate(ROUTES.NEW)))();
@@ -364,7 +348,12 @@ function AuthScreens() {
                     return;
                 }
 
-                if (shouldRenderSecondaryOverlayForRHPOnWideRHP || shouldRenderTertiaryOverlay) {
+                if (shouldRenderSecondaryOverlayForRHPOnWideRHP) {
+                    Navigation.dismissToPreviousRHP();
+                    return;
+                }
+
+                if (shouldRenderTertiaryOverlay) {
                     Navigation.dismissToPreviousRHP();
                     return;
                 }
@@ -493,7 +482,6 @@ function AuthScreens() {
     return (
         <ComposeProviders
             components={[
-                CurrencyListContextProvider,
                 OptionsListContextProvider,
                 SidebarOrderedReportsContextProvider,
                 SearchContextProvider,
@@ -672,6 +660,13 @@ function AuthScreens() {
                         }}
                     />
                 )}
+                {shouldShowRequire2FAPage && (
+                    <RootStack.Screen
+                        name={SCREENS.REQUIRE_TWO_FACTOR_AUTH}
+                        options={{...rootNavigatorScreenOptions.fullScreen, gestureEnabled: false}}
+                        component={RequireTwoFactorAuthenticationPage}
+                    />
+                )}
                 <RootStack.Screen
                     name={SCREENS.WORKSPACE_JOIN_USER}
                     options={{
@@ -711,8 +706,6 @@ function AuthScreens() {
                     listeners={modalScreenListeners}
                 />
             </RootStack.Navigator>
-            {/* Full-screen 2FA enforcement overlay - blocks all interaction until 2FA is set up */}
-            {shouldShowRequire2FAPage && !isIn2FASetupFlow && <RequireTwoFactorAuthenticationPage />}
             <SearchRouterModal />
             <OpenAppFailureModal />
             <PriorityModeController />
diff --git a/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx b/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx
index b37624a21574..8e70d3686499 100644
--- a/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx
+++ b/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx
@@ -17,7 +17,6 @@ import type {
     MergeTransactionNavigatorParamList,
     MissingPersonalDetailsParamList,
     MoneyRequestNavigatorParamList,
-    MultifactorAuthenticationParamList,
     NewChatNavigatorParamList,
     NewReportWorkspaceSelectionNavigatorParamList,
     NewTaskNavigatorParamList,
@@ -186,8 +185,6 @@ const MoneyRequestModalStackNavigator = createModalStackNavigator<MoneyRequestNa
     [SCREENS.MONEY_REQUEST.STEP_DISTANCE_GPS]: () => require<ReactComponentModule>('../../../../pages/iou/request/step/IOURequestStepDistanceGPS').default,
     [SCREENS.MONEY_REQUEST.STEP_DISTANCE_ODOMETER]: () => require<ReactComponentModule>('../../../../pages/iou/request/step/IOURequestStepDistanceOdometer').default,
     [SCREENS.SET_DEFAULT_WORKSPACE]: () => require<ReactComponentModule>('../../../../pages/SetDefaultWorkspacePage').default,
-    [SCREENS.MONEY_REQUEST.STEP_TIME_RATE]: () => require<ReactComponentModule>('../../../../pages/iou/request/step/IOURequestStepTimeRate').default,
-    [SCREENS.MONEY_REQUEST.STEP_HOURS]: () => require<ReactComponentModule>('../../../../pages/iou/request/step/IOURequestStepHours').default,
 });
 
 const TravelModalStackNavigator = createModalStackNavigator<TravelNavigatorParamList>({
@@ -262,7 +259,6 @@ const TaskModalStackNavigator = createModalStackNavigator<TaskDetailsNavigatorPa
 
 const ReportVerifyAccountModalStackNavigator = createModalStackNavigator<ReportVerifyAccountNavigatorParamList>({
     [SCREENS.REPORT_VERIFY_ACCOUNT]: () => require<ReactComponentModule>('../../../../pages/home/report/ReportVerifyAccountPage').default,
-    [SCREENS.EXPENSE_REPORT_VERIFY_ACCOUNT]: () => require<ReactComponentModule>('../../../../pages/home/report/ExpenseReportVerifyAccountPage').default,
     [SCREENS.SEARCH.REPORT_VERIFY_ACCOUNT]: () => require<ReactComponentModule>('../../../../pages/Search/SearchReportVerifyAccountPage').default,
 });
 
@@ -404,26 +400,6 @@ const SettingsModalStackNavigator = createModalStackNavigator<SettingsNavigatorP
     [SCREENS.SETTINGS.ADD_BANK_ACCOUNT_SELECT_COUNTRY_VERIFY_ACCOUNT]: () =>
         require<ReactComponentModule>('../../../../pages/settings/Wallet/InternationalDepositAccount/CountrySelectionVerifyAccountPage').default,
     [SCREENS.SETTINGS.RULES.ROOT]: () => require<ReactComponentModule>('../../../../pages/settings/Rules/ExpenseRulesPage').default,
-    [SCREENS.SETTINGS.RULES.ADD]: () => require<ReactComponentModule>('../../../../pages/settings/Rules/AddRulePage').default,
-    [SCREENS.SETTINGS.RULES.ADD_MERCHANT]: () => require<ReactComponentModule>('../../../../pages/settings/Rules/Fields/AddMerchantPage').default,
-    [SCREENS.SETTINGS.RULES.ADD_RENAME_MERCHANT]: () => require<ReactComponentModule>('../../../../pages/settings/Rules/Fields/AddRenameMerchantPage').default,
-    [SCREENS.SETTINGS.RULES.ADD_CATEGORY]: () => require<ReactComponentModule>('../../../../pages/settings/Rules/Fields/AddCategoryPage').default,
-    [SCREENS.SETTINGS.RULES.ADD_TAG]: () => require<ReactComponentModule>('../../../../pages/settings/Rules/Fields/AddTagPage').default,
-    [SCREENS.SETTINGS.RULES.ADD_TAX]: () => require<ReactComponentModule>('../../../../pages/settings/Rules/Fields/AddTaxRatePage').default,
-    [SCREENS.SETTINGS.RULES.ADD_DESCRIPTION]: () => require<ReactComponentModule>('../../../../pages/settings/Rules/Fields/AddDescriptionPage').default,
-    [SCREENS.SETTINGS.RULES.ADD_REIMBURSABLE]: () => require<ReactComponentModule>('../../../../pages/settings/Rules/Fields/AddReimbursablePage').default,
-    [SCREENS.SETTINGS.RULES.ADD_BILLABLE]: () => require<ReactComponentModule>('../../../../pages/settings/Rules/Fields/AddBillablePage').default,
-    [SCREENS.SETTINGS.RULES.ADD_REPORT]: () => require<ReactComponentModule>('../../../../pages/settings/Rules/Fields/AddReportPage').default,
-    [SCREENS.SETTINGS.RULES.EDIT]: () => require<ReactComponentModule>('../../../../pages/settings/Rules/EditRulePage').default,
-    [SCREENS.SETTINGS.RULES.EDIT_MERCHANT]: () => require<ReactComponentModule>('../../../../pages/settings/Rules/Fields/AddMerchantPage').default,
-    [SCREENS.SETTINGS.RULES.EDIT_RENAME_MERCHANT]: () => require<ReactComponentModule>('../../../../pages/settings/Rules/Fields/AddRenameMerchantPage').default,
-    [SCREENS.SETTINGS.RULES.EDIT_CATEGORY]: () => require<ReactComponentModule>('../../../../pages/settings/Rules/Fields/AddCategoryPage').default,
-    [SCREENS.SETTINGS.RULES.EDIT_TAG]: () => require<ReactComponentModule>('../../../../pages/settings/Rules/Fields/AddTagPage').default,
-    [SCREENS.SETTINGS.RULES.EDIT_TAX]: () => require<ReactComponentModule>('../../../../pages/settings/Rules/Fields/AddTaxRatePage').default,
-    [SCREENS.SETTINGS.RULES.EDIT_DESCRIPTION]: () => require<ReactComponentModule>('../../../../pages/settings/Rules/Fields/AddDescriptionPage').default,
-    [SCREENS.SETTINGS.RULES.EDIT_REIMBURSABLE]: () => require<ReactComponentModule>('../../../../pages/settings/Rules/Fields/AddReimbursablePage').default,
-    [SCREENS.SETTINGS.RULES.EDIT_BILLABLE]: () => require<ReactComponentModule>('../../../../pages/settings/Rules/Fields/AddBillablePage').default,
-    [SCREENS.SETTINGS.RULES.EDIT_REPORT]: () => require<ReactComponentModule>('../../../../pages/settings/Rules/Fields/AddReportPage').default,
     [SCREENS.SETTINGS.PROFILE.STATUS]: () => require<ReactComponentModule>('../../../../pages/settings/Profile/CustomStatus/StatusPage').default,
     [SCREENS.SETTINGS.PROFILE.STATUS_CLEAR_AFTER]: () => require<ReactComponentModule>('../../../../pages/settings/Profile/CustomStatus/StatusClearAfterPage').default,
     [SCREENS.SETTINGS.PROFILE.STATUS_CLEAR_AFTER_DATE]: () => require<ReactComponentModule>('../../../../pages/settings/Profile/CustomStatus/SetDatePage').default,
@@ -458,7 +434,6 @@ const SettingsModalStackNavigator = createModalStackNavigator<SettingsNavigatorP
     [SCREENS.WORKSPACE.SHARE]: () => require<ReactComponentModule>('../../../../pages/workspace/WorkspaceOverviewSharePage').default,
     [SCREENS.WORKSPACE.CURRENCY]: () => require<ReactComponentModule>('../../../../pages/workspace/WorkspaceOverviewCurrencyPage').default,
     [SCREENS.WORKSPACE.CATEGORY_SETTINGS]: () => require<ReactComponentModule>('../../../../pages/workspace/categories/CategorySettingsPage').default,
-    [SCREENS.WORKSPACE.CATEGORY_REQUIRED_FIELDS]: () => require<ReactComponentModule>('../../../../pages/workspace/categories/CategoryRequiredFieldsPage').default,
     [SCREENS.WORKSPACE.ADDRESS]: () => require<ReactComponentModule>('../../../../pages/workspace/WorkspaceOverviewAddressPage').default,
     [SCREENS.WORKSPACE.PLAN]: () => require<ReactComponentModule>('../../../../pages/workspace/WorkspaceOverviewPlanTypePage').default,
     [SCREENS.WORKSPACE.CATEGORIES_SETTINGS]: () => require<ReactComponentModule>('../../../../pages/workspace/categories/WorkspaceCategoriesSettingsPage').default,
@@ -836,7 +811,6 @@ const SettingsModalStackNavigator = createModalStackNavigator<SettingsNavigatorP
     [SCREENS.DOMAIN.ADD_PRIMARY_CONTACT]: () => require<ReactComponentModule>('../../../../pages/domain/Admins/DomainAddPrimaryContactPage').default,
     [SCREENS.DOMAIN.ADD_ADMIN]: () => require<ReactComponentModule>('../../../../pages/domain/Admins/DomainAddAdminPage').default,
     [SCREENS.DOMAIN.MEMBER_DETAILS]: () => require<ReactComponentModule>('../../../../pages/domain/Members/DomainMemberDetailsPage').default,
-    [SCREENS.DOMAIN.RESET_DOMAIN]: () => require<ReactComponentModule>('../../../../pages/domain/DomainResetPage').default,
 });
 
 const TwoFactorAuthenticatorStackNavigator = createModalStackNavigator<EnablePaymentsNavigatorParamList>({
@@ -1005,14 +979,6 @@ const WorkspacesDomainModalStackNavigator = createModalStackNavigator<Workspaces
     [SCREENS.WORKSPACES_DOMAIN_ACCESS_RESTRICTED]: () => require<ReactComponentModule>('../../../../pages/domain/DomainAccessRestrictedPage').default,
 });
 
-const MultifactorAuthenticationStackNavigator = createModalStackNavigator<MultifactorAuthenticationParamList>({
-    [SCREENS.MULTIFACTOR_AUTHENTICATION.MAGIC_CODE]: () => require<ReactComponentModule>('../../../../pages/MultifactorAuthentication/ValidateCodePage').default,
-    [SCREENS.MULTIFACTOR_AUTHENTICATION.BIOMETRICS_TEST]: () => require<ReactComponentModule>('../../../../pages/MultifactorAuthentication/BiometricsTestPage').default,
-    [SCREENS.MULTIFACTOR_AUTHENTICATION.NOTIFICATION]: () => require<ReactComponentModule>('../../../../pages/MultifactorAuthentication/NotificationPage').default,
-    [SCREENS.MULTIFACTOR_AUTHENTICATION.PROMPT]: () => require<ReactComponentModule>('../../../../pages/MultifactorAuthentication/PromptPage').default,
-    [SCREENS.MULTIFACTOR_AUTHENTICATION.NOT_FOUND]: () => require<ReactComponentModule>('../../../../pages/ErrorPage/NotFoundPage').default,
-});
-
 export {
     AddPersonalBankAccountModalStackNavigator,
     AddUnreportedExpenseModalStackNavigator,
@@ -1062,5 +1028,4 @@ export {
     WorkspaceConfirmationModalStackNavigator,
     WorkspaceDuplicateModalStackNavigator,
     WorkspacesDomainModalStackNavigator,
-    MultifactorAuthenticationStackNavigator,
 };
diff --git a/src/libs/Navigation/AppNavigator/Navigators/DomainSplitNavigator.tsx b/src/libs/Navigation/AppNavigator/Navigators/DomainSplitNavigator.tsx
index 3c19114a877d..649f911492e0 100644
--- a/src/libs/Navigation/AppNavigator/Navigators/DomainSplitNavigator.tsx
+++ b/src/libs/Navigation/AppNavigator/Navigators/DomainSplitNavigator.tsx
@@ -30,7 +30,7 @@ function DomainSplitNavigator({route, navigation}: PlatformStackScreenProps<Auth
                 <Split.Navigator
                     persistentScreens={[SCREENS.DOMAIN.INITIAL]}
                     sidebarScreen={SCREENS.DOMAIN.INITIAL}
-                    defaultCentralScreen={SCREENS.DOMAIN.ADMINS}
+                    defaultCentralScreen={SCREENS.DOMAIN.SAML}
                     parentRoute={route}
                     screenOptions={splitNavigatorScreenOptions.centralScreen}
                 >
diff --git a/src/libs/Navigation/AppNavigator/Navigators/RightModalNavigator.tsx b/src/libs/Navigation/AppNavigator/Navigators/RightModalNavigator.tsx
index 0b1bf503ee63..52d83ca526f6 100644
--- a/src/libs/Navigation/AppNavigator/Navigators/RightModalNavigator.tsx
+++ b/src/libs/Navigation/AppNavigator/Navigators/RightModalNavigator.tsx
@@ -84,7 +84,6 @@ function SecondaryOverlay() {
 }
 
 const loadRHPReportScreen = () => require<ReactComponentModule>('../../../../pages/home/RHPReportScreen').default;
-const loadSearchMoneyRequestReportPage = () => require<ReactComponentModule>('../../../../pages/Search/SearchMoneyRequestReportPage').default;
 
 function RightModalNavigator({navigation, route}: RightModalNavigatorProps) {
     // eslint-disable-next-line rulesdir/prefer-shouldUseNarrowLayout-instead-of-isSmallScreenWidth
@@ -344,6 +343,14 @@ function RightModalNavigator({navigation, route}: RightModalNavigatorProps) {
                             name={SCREENS.RIGHT_MODAL.SEARCH_REPORT_ACTIONS}
                             component={ModalStackNavigators.SearchReportActionsModalStackNavigator}
                         />
+                        <Stack.Screen
+                            name={SCREENS.RIGHT_MODAL.SEARCH_REPORT}
+                            getComponent={loadRHPReportScreen}
+                            options={(props) => {
+                                const options = modalStackScreenOptions(props);
+                                return {...options, animation: animationEnabledOnSearchReport ? Animations.SLIDE_FROM_RIGHT : Animations.NONE};
+                            }}
+                        />
                         <Stack.Screen
                             name={SCREENS.RIGHT_MODAL.RESTRICTED_ACTION}
                             component={ModalStackNavigators.RestrictedActionModalStackNavigator}
@@ -368,30 +375,6 @@ function RightModalNavigator({navigation, route}: RightModalNavigatorProps) {
                             name={SCREENS.RIGHT_MODAL.SCHEDULE_CALL}
                             component={ModalStackNavigators.ScheduleCallModalStackNavigator}
                         />
-                        <Stack.Screen
-                            name={SCREENS.RIGHT_MODAL.SEARCH_REPORT}
-                            getComponent={loadRHPReportScreen}
-                            options={(props) => {
-                                const options = modalStackScreenOptions(props);
-                                return {...options, animation: animationEnabledOnSearchReport ? Animations.SLIDE_FROM_RIGHT : Animations.NONE};
-                            }}
-                        />
-                        <Stack.Screen
-                            name={SCREENS.RIGHT_MODAL.EXPENSE_REPORT}
-                            getComponent={loadSearchMoneyRequestReportPage}
-                            options={(props) => {
-                                const options = modalStackScreenOptions(props);
-                                return {...options, animation: isSmallScreenWidth ? Animations.SLIDE_FROM_RIGHT : Animations.NONE};
-                            }}
-                        />
-                        <Stack.Screen
-                            name={SCREENS.RIGHT_MODAL.SEARCH_MONEY_REQUEST_REPORT}
-                            getComponent={loadSearchMoneyRequestReportPage}
-                            options={(props) => {
-                                const options = modalStackScreenOptions(props);
-                                return {...options, animation: isSmallScreenWidth ? Animations.SLIDE_FROM_RIGHT : Animations.NONE};
-                            }}
-                        />
                         <Stack.Screen
                             name={SCREENS.RIGHT_MODAL.DOMAIN}
                             component={ModalStackNavigators.WorkspacesDomainModalStackNavigator}
@@ -400,10 +383,6 @@ function RightModalNavigator({navigation, route}: RightModalNavigatorProps) {
                             name={SCREENS.RIGHT_MODAL.SEARCH_COLUMNS}
                             component={ModalStackNavigators.SearchColumnsModalStackNavigator}
                         />
-                        <Stack.Screen
-                            name={SCREENS.RIGHT_MODAL.MULTIFACTOR_AUTHENTICATION}
-                            component={ModalStackNavigators.MultifactorAuthenticationStackNavigator}
-                        />
                     </Stack.Navigator>
                 </Animated.View>
                 {/* The third and second overlays are displayed here to cover RHP screens wider than the currently focused screen. */}
diff --git a/src/libs/Navigation/AppNavigator/Navigators/SearchFullscreenNavigator.tsx b/src/libs/Navigation/AppNavigator/Navigators/SearchFullscreenNavigator.tsx
index 3a222c729d23..fc3c6f9face1 100644
--- a/src/libs/Navigation/AppNavigator/Navigators/SearchFullscreenNavigator.tsx
+++ b/src/libs/Navigation/AppNavigator/Navigators/SearchFullscreenNavigator.tsx
@@ -12,6 +12,7 @@ import SCREENS from '@src/SCREENS';
 import type ReactComponentModule from '@src/types/utils/ReactComponentModule';
 
 const loadSearchPage = () => require<ReactComponentModule>('@pages/Search/SearchPage').default;
+const loadSearchMoneyReportPage = () => require<ReactComponentModule>('@pages/Search/SearchMoneyRequestReportPage').default;
 
 const Stack = createSearchFullscreenNavigator<SearchFullscreenNavigatorParamList>();
 
@@ -35,6 +36,10 @@ function SearchFullscreenNavigator({route}: PlatformStackScreenProps<AuthScreens
                     initialParams={{q: SearchQueryUtils.buildSearchQueryString()}}
                     options={{animation: Animations.NONE}}
                 />
+                <Stack.Screen
+                    name={SCREENS.SEARCH.MONEY_REQUEST_REPORT}
+                    getComponent={loadSearchMoneyReportPage}
+                />
             </Stack.Navigator>
         </FreezeWrapper>
     );
diff --git a/src/libs/Navigation/Navigation.ts b/src/libs/Navigation/Navigation.ts
index 632b3c49e0fa..9f0bf092e5c6 100644
--- a/src/libs/Navigation/Navigation.ts
+++ b/src/libs/Navigation/Navigation.ts
@@ -1,5 +1,5 @@
 import {findFocusedRoute, getActionFromState} from '@react-navigation/core';
-import type {EventArg, NavigationAction, NavigationContainerEventMap, NavigationState, PartialState} from '@react-navigation/native';
+import type {EventArg, NavigationAction, NavigationContainerEventMap, NavigationState} from '@react-navigation/native';
 import {CommonActions, getPathFromState, StackActions} from '@react-navigation/native';
 import {Str} from 'expensify-common';
 // eslint-disable-next-line you-dont-need-lodash-underscore/omit
@@ -37,25 +37,14 @@ import setNavigationActionToMicrotaskQueue from './helpers/setNavigationActionTo
 import {linkingConfig} from './linkingConfig';
 import {SPLIT_TO_SIDEBAR} from './linkingConfig/RELATIONS';
 import navigationRef from './navigationRef';
-import type {
-    NavigationPartialRoute,
-    NavigationRef,
-    NavigationRoute,
-    NavigationStateRoute,
-    ReportsSplitNavigatorParamList,
-    RightModalNavigatorParamList,
-    RootNavigatorParamList,
-    State,
-} from './types';
-
-// Screens which are part of the 2FA setup flow - used to determine when to hide the RequireTwoFactorAuthOverlay
-const SET_UP_2FA_SCREENS = new Set<string>([
-    SCREENS.TWO_FACTOR_AUTH.ROOT,
-    SCREENS.TWO_FACTOR_AUTH.VERIFY,
-    SCREENS.TWO_FACTOR_AUTH.VERIFY_ACCOUNT,
-    SCREENS.TWO_FACTOR_AUTH.SUCCESS,
-    SCREENS.TWO_FACTOR_AUTH.DISABLED,
-    SCREENS.TWO_FACTOR_AUTH.DISABLE,
+import type {NavigationPartialRoute, NavigationRef, NavigationRoute, NavigationStateRoute, ReportsSplitNavigatorParamList, RootNavigatorParamList, State} from './types';
+
+// Routes which are part of the flow to set up 2FA
+const SET_UP_2FA_ROUTES = new Set<Route>([
+    ROUTES.REQUIRE_TWO_FACTOR_AUTH,
+    ROUTES.SETTINGS_2FA_ROOT.getRoute(ROUTES.REQUIRE_TWO_FACTOR_AUTH),
+    ROUTES.SETTINGS_2FA_VERIFY.getRoute(ROUTES.REQUIRE_TWO_FACTOR_AUTH),
+    ROUTES.SETTINGS_2FA_SUCCESS.getRoute(ROUTES.REQUIRE_TWO_FACTOR_AUTH),
 ]);
 
 let account: OnyxEntry<Account>;
@@ -77,10 +66,6 @@ Onyx.connectWithoutView({
     },
 });
 
-function isTwoFactorSetupScreen(screen: string | undefined): boolean {
-    return screen ? SET_UP_2FA_SCREENS.has(screen) : false;
-}
-
 function shouldShowRequire2FAPage() {
     return !!account?.needsTwoFactorAuthSetup && !account?.requiresTwoFactorAuth;
 }
@@ -109,56 +94,21 @@ function getShouldPopToSidebar() {
     return shouldPopToSidebar;
 }
 
-/**
- * Recursively get the deepest focused screen name from the navigation state.
- * Unlike findFocusedRoute, this also handles the case where the nested navigator
- * hasn't been mounted yet and the target screen is in params instead of state.
- */
-function getDeepestFocusedScreenName(route: NavigationRoute | NavigationState | PartialState<NavigationState> | undefined): string | undefined {
-    if (!route) {
-        return undefined;
-    }
-
-    // NavigationState case - has routes array
-    if ('routes' in route && Array.isArray(route.routes)) {
-        // When routes array is just one item, the index key is omitted
-        let focusedRoute = route.routes[0];
-        if ('index' in route && typeof route.index === 'number') {
-            focusedRoute = route.routes[route.index];
-        }
-        return getDeepestFocusedScreenName(focusedRoute);
-    }
-
-    // Route with nested state case
-    if ('state' in route && route.state) {
-        return getDeepestFocusedScreenName(route.state);
-    }
-
-    // Route with params.screen case (initial navigation before sidebar navigator mounts)
-    if ('params' in route && route.params && typeof route.params === 'object' && 'screen' in route.params) {
-        const params = route.params as {screen?: string; params?: Record<string, unknown>};
-        if (params.screen) {
-            return getDeepestFocusedScreenName({name: params.screen, params: params.params});
-        }
-    }
-
-    // Leaf route - return the name
-    if ('name' in route) {
-        return route.name;
-    }
-
-    return undefined;
-}
-
 type CanNavigateParams = {
     route?: Route;
     backToRoute?: Route;
 };
 
 /**
- * Checks if navigation is ready.
+ * Checks if the route can be navigated to based on whether the navigation ref is ready and if 2FA is required to be set up.
  */
 function canNavigate(methodName: string, params: CanNavigateParams = {}): boolean {
+    // Block navigation if 2FA is required and the targetRoute is not part of the flow to enable 2FA
+    const targetRoute = params.route ?? params.backToRoute;
+    if (shouldShowRequire2FAPage() && targetRoute && !SET_UP_2FA_ROUTES.has(targetRoute)) {
+        Log.info(`[Navigation] Blocked navigation because 2FA is required to be set up to access route: ${targetRoute}`);
+        return false;
+    }
     if (navigationRef.isReady()) {
         return true;
     }
@@ -277,20 +227,15 @@ function navigate(route: Route, options?: LinkToOptions) {
     }
 
     // Start a Sentry span for report navigation
-    if (route.startsWith('r/') || route.startsWith('search/r/') || route.startsWith('e/')) {
+    if (route.startsWith('r/') || route.startsWith('search/r/')) {
         const routePath = Str.cutAfter(route, '?');
-        const reportIDMatch = route.match(/^(?:search\/)?(?:r|e)\/(\w+)/);
+        const reportIDMatch = routePath.match(/^(?:search\/)?r\/(\d+)(?:\/\d+)?$/);
         const reportID = reportIDMatch?.at(1);
         if (reportID) {
             const spanId = `${CONST.TELEMETRY.SPAN_OPEN_REPORT}_${reportID}`;
             let span = getSpan(spanId);
             if (!span) {
-                let spanName = '/r/*';
-                if (route.startsWith('search/r/')) {
-                    spanName = '/search/r/*';
-                } else if (route.startsWith('e/')) {
-                    spanName = '/e/*';
-                }
+                const spanName = route.startsWith('r/') ? '/r/*' : '/search/r/*';
                 span = startSpan(spanId, {
                     name: spanName,
                     op: CONST.TELEMETRY.SPAN_OPEN_REPORT,
@@ -303,9 +248,11 @@ function navigate(route: Route, options?: LinkToOptions) {
             });
         }
     }
+
     linkTo(navigationRef.current, route, options);
     closeSidePanelOnNarrowScreen();
 }
+
 /**
  * When routes are compared to determine whether the fallback route passed to the goUp function is in the state,
  * these parameters shouldn't be included in the comparison.
@@ -649,38 +596,6 @@ function getReportRouteByID(reportID?: string, routes: NavigationRoute[] = navig
     return null;
 }
 
-function getTopmostSuperWideRHPReportParams(
-    state: NavigationState = navigationRef.getRootState(),
-): RightModalNavigatorParamList[typeof SCREENS.RIGHT_MODAL.SEARCH_MONEY_REQUEST_REPORT] | RightModalNavigatorParamList[typeof SCREENS.RIGHT_MODAL.EXPENSE_REPORT] | undefined {
-    if (!state) {
-        return;
-    }
-    const topmostRightModalNavigator = state.routes?.at(-1);
-
-    if (!topmostRightModalNavigator || topmostRightModalNavigator.name !== NAVIGATORS.RIGHT_MODAL_NAVIGATOR) {
-        return;
-    }
-
-    const topmostSuperWideRHP = topmostRightModalNavigator.state?.routes.findLast((route) => SUPER_WIDE_RIGHT_MODALS.has(route.name));
-
-    if (!topmostSuperWideRHP) {
-        return;
-    }
-
-    return topmostSuperWideRHP?.params as
-        | RightModalNavigatorParamList[typeof SCREENS.RIGHT_MODAL.SEARCH_MONEY_REQUEST_REPORT]
-        | RightModalNavigatorParamList[typeof SCREENS.RIGHT_MODAL.EXPENSE_REPORT]
-        | undefined;
-}
-
-/**
- * Get the report ID from the topmost Super Wide RHP modal in the navigation stack.
- */
-function getTopmostSuperWideRHPReportID(state: NavigationState = navigationRef.getRootState()): string | undefined {
-    const topmostReportParams = getTopmostSuperWideRHPReportParams(state);
-    return topmostReportParams?.reportID;
-}
-
 /**
  * Closes the modal navigator (RHP, onboarding).
  *
@@ -712,16 +627,8 @@ const dismissModal = ({ref = navigationRef, callback}: {ref?: NavigationRef; cal
  */
 const dismissModalWithReport = ({reportID, reportActionID, referrer, backTo}: ReportsSplitNavigatorParamList[typeof SCREENS.REPORT], ref = navigationRef) => {
     isNavigationReady().then(() => {
-        const topmostSuperWideRHPReportID = getTopmostSuperWideRHPReportID();
-        let areReportsIDsDefined = !!topmostSuperWideRHPReportID && !!reportID;
-
-        if (topmostSuperWideRHPReportID === reportID && areReportsIDsDefined) {
-            dismissToSuperWideRHP();
-            return;
-        }
-
         const topmostReportID = getTopmostReportId();
-        areReportsIDsDefined = !!topmostReportID && !!reportID;
+        const areReportsIDsDefined = !!topmostReportID && !!reportID;
         const isReportsSplitTopmostFullScreen = ref.getRootState().routes.findLast((route) => isFullScreenName(route.name))?.name === NAVIGATORS.REPORTS_SPLIT_NAVIGATOR;
         if (topmostReportID === reportID && areReportsIDsDefined && isReportsSplitTopmostFullScreen) {
             dismissModal();
@@ -845,7 +752,7 @@ function dismissToModalStack(modalStackNames: Set<string>) {
         return;
     }
 
-    const lastFoundModalStackIndex = rhpState.routes.slice(0, -1).findLastIndex((route) => modalStackNames.has(route.name));
+    const lastFoundModalStackIndex = rhpState.routes.findLastIndex((route) => modalStackNames.has(route.name));
     const routesToPop = rhpState.routes.length - lastFoundModalStackIndex - 1;
 
     if (routesToPop <= 0 || lastFoundModalStackIndex === -1) {
@@ -863,10 +770,6 @@ function dismissToPreviousRHP() {
     return dismissToModalStack(ALL_WIDE_RIGHT_MODALS);
 }
 
-function navigateBackToLastSuperWideRHPScreen() {
-    return dismissToModalStack(SUPER_WIDE_RIGHT_MODALS);
-}
-
 function dismissToSuperWideRHP() {
     // On narrow layouts (mobile), Super Wide RHP doesn't exist, so just dismiss the modal completely
     if (getIsNarrowLayout()) {
@@ -874,10 +777,10 @@ function dismissToSuperWideRHP() {
         return;
     }
     // On wide layouts, dismiss back to the Super Wide RHP modal stack
-    navigateBackToLastSuperWideRHPScreen();
+    return dismissToModalStack(SUPER_WIDE_RIGHT_MODALS);
 }
 
-function getTopmostSearchReportRouteParams(state = navigationRef.getRootState()): RightModalNavigatorParamList[typeof SCREENS.RIGHT_MODAL.SEARCH_REPORT] | undefined {
+function getTopmostReportIDInSearchRHP(state = navigationRef.getRootState()): string | undefined {
     if (!state) {
         return undefined;
     }
@@ -890,12 +793,10 @@ function getTopmostSearchReportRouteParams(state = navigationRef.getRootState())
     const nestedRoutes = lastRoute.state?.routes ?? [];
     const lastSearchReport = [...nestedRoutes].reverse().find((route) => route.name === SCREENS.RIGHT_MODAL.SEARCH_REPORT);
 
-    return lastSearchReport?.params as RightModalNavigatorParamList[typeof SCREENS.RIGHT_MODAL.SEARCH_REPORT] | undefined;
-}
+    const params = lastSearchReport?.params;
+    const reportID = params && 'reportID' in params ? params.reportID : undefined;
 
-function getTopmostSearchReportID(state = navigationRef.getRootState()): string | undefined {
-    const params = getTopmostSearchReportRouteParams(state);
-    return params?.reportID;
+    return typeof reportID === 'string' ? reportID : undefined;
 }
 
 export default {
@@ -935,11 +836,7 @@ export default {
     isValidateLoginFlow,
     dismissToPreviousRHP,
     dismissToSuperWideRHP,
-    getTopmostSearchReportID,
-    getTopmostSuperWideRHPReportParams,
-    getTopmostSuperWideRHPReportID,
-    getTopmostSearchReportRouteParams,
-    navigateBackToLastSuperWideRHPScreen,
+    getTopmostReportIDInSearchRHP,
 };
 
-export {navigationRef, getDeepestFocusedScreenName, isTwoFactorSetupScreen, shouldShowRequire2FAPage};
+export {navigationRef};
diff --git a/src/libs/Navigation/NavigationRoot.tsx b/src/libs/Navigation/NavigationRoot.tsx
index e44928d71cbc..0b3d9f29f4e4 100644
--- a/src/libs/Navigation/NavigationRoot.tsx
+++ b/src/libs/Navigation/NavigationRoot.tsx
@@ -126,6 +126,11 @@ function NavigationRoot({authenticated, lastVisitedPath, initialUrl, onReady}: N
             return;
         }
 
+        const shouldShowRequire2FAPage = !!account?.needsTwoFactorAuthSetup && !account.requiresTwoFactorAuth;
+        if (shouldShowRequire2FAPage) {
+            return getAdaptedStateFromPath(ROUTES.REQUIRE_TWO_FACTOR_AUTH, linkingConfig.config);
+        }
+
         const isTransitioning = path?.includes(ROUTES.TRANSITION_BETWEEN_APPS);
 
         // If we have a transition URL, don't restore last visited path - let React Navigation handle it
diff --git a/src/libs/Navigation/helpers/isReportOpenInRHP.ts b/src/libs/Navigation/helpers/isReportOpenInRHP.ts
index fde83327e71b..51e8a95bb66b 100644
--- a/src/libs/Navigation/helpers/isReportOpenInRHP.ts
+++ b/src/libs/Navigation/helpers/isReportOpenInRHP.ts
@@ -1,5 +1,4 @@
 import type {NavigationState} from '@react-navigation/native';
-import {ALL_WIDE_RIGHT_MODALS} from '@components/WideRHPContextProvider/WIDE_RIGHT_MODALS';
 import NAVIGATORS from '@src/NAVIGATORS';
 import SCREENS from '@src/SCREENS';
 
@@ -12,7 +11,7 @@ const isReportOpenInRHP = (state: NavigationState | undefined): boolean => {
     if (params && 'screen' in params && typeof params.screen === 'string' && params.screen === SCREENS.RIGHT_MODAL.SEARCH_REPORT) {
         return true;
     }
-    return !!(lastRoute.name === NAVIGATORS.RIGHT_MODAL_NAVIGATOR && lastRoute.state?.routes?.some((route) => ALL_WIDE_RIGHT_MODALS.has(route.name)));
+    return !!(lastRoute.name === NAVIGATORS.RIGHT_MODAL_NAVIGATOR && lastRoute.state?.routes?.some((route) => route?.name === SCREENS.RIGHT_MODAL.SEARCH_REPORT));
 };
 
 export default isReportOpenInRHP;
diff --git a/src/libs/Navigation/helpers/isReportOpenInSuperWideRHP.ts b/src/libs/Navigation/helpers/isReportOpenInSuperWideRHP.ts
deleted file mode 100644
index 8ddf6ba84aa1..000000000000
--- a/src/libs/Navigation/helpers/isReportOpenInSuperWideRHP.ts
+++ /dev/null
@@ -1,13 +0,0 @@
-import type {NavigationState} from '@react-navigation/native';
-import {SUPER_WIDE_RIGHT_MODALS} from '@components/WideRHPContextProvider/WIDE_RIGHT_MODALS';
-import NAVIGATORS from '@src/NAVIGATORS';
-
-const isReportOpenInSuperWideRHP = (state: NavigationState | undefined): boolean => {
-    const lastRoute = state?.routes?.at(-1);
-    if (!lastRoute) {
-        return false;
-    }
-    return !!(lastRoute.name === NAVIGATORS.RIGHT_MODAL_NAVIGATOR && lastRoute.state?.routes?.some((route) => SUPER_WIDE_RIGHT_MODALS.has(route.name)));
-};
-
-export default isReportOpenInSuperWideRHP;
diff --git a/src/libs/Navigation/linkingConfig/RELATIONS/DOMAIN_TO_RHP.ts b/src/libs/Navigation/linkingConfig/RELATIONS/DOMAIN_TO_RHP.ts
index 20cb613aa5b1..5a00d2e990fd 100755
--- a/src/libs/Navigation/linkingConfig/RELATIONS/DOMAIN_TO_RHP.ts
+++ b/src/libs/Navigation/linkingConfig/RELATIONS/DOMAIN_TO_RHP.ts
@@ -5,7 +5,7 @@ import SCREENS from '@src/SCREENS';
 const DOMAIN_TO_RHP: Partial<Record<keyof DomainSplitNavigatorParamList, string[]>> = {
     [SCREENS.DOMAIN.INITIAL]: [],
     [SCREENS.DOMAIN.SAML]: [SCREENS.DOMAIN.VERIFY, SCREENS.DOMAIN.VERIFIED],
-    [SCREENS.DOMAIN.ADMINS]: [SCREENS.DOMAIN.ADMIN_DETAILS, SCREENS.DOMAIN.ADMINS_SETTINGS, SCREENS.DOMAIN.ADD_PRIMARY_CONTACT, SCREENS.DOMAIN.ADD_ADMIN, SCREENS.DOMAIN.RESET_DOMAIN],
+    [SCREENS.DOMAIN.ADMINS]: [SCREENS.DOMAIN.ADMIN_DETAILS, SCREENS.DOMAIN.ADMINS_SETTINGS, SCREENS.DOMAIN.ADD_PRIMARY_CONTACT, SCREENS.DOMAIN.ADD_ADMIN],
     [SCREENS.DOMAIN.MEMBERS]: [SCREENS.DOMAIN.MEMBER_DETAILS],
 };
 
diff --git a/src/libs/Navigation/linkingConfig/RELATIONS/SEARCH_TO_RHP.ts b/src/libs/Navigation/linkingConfig/RELATIONS/SEARCH_TO_RHP.ts
index 9f36d76fd742..b6ba33cb8c56 100644
--- a/src/libs/Navigation/linkingConfig/RELATIONS/SEARCH_TO_RHP.ts
+++ b/src/libs/Navigation/linkingConfig/RELATIONS/SEARCH_TO_RHP.ts
@@ -50,7 +50,6 @@ const SEARCH_TO_RHP: Partial<Record<keyof SearchFullscreenNavigatorParamList, st
         SCREENS.SEARCH.ADVANCED_FILTERS_REPORT_FIELD_RHP,
         SCREENS.SEARCH.SAVED_SEARCH_RENAME_RHP,
         SCREENS.MONEY_REQUEST.SPLIT_EXPENSE_SEARCH,
-        SCREENS.RIGHT_MODAL.SEARCH_MONEY_REQUEST_REPORT,
         SCREENS.RIGHT_MODAL.SEARCH_REPORT,
     ],
 };
diff --git a/src/libs/Navigation/linkingConfig/RELATIONS/SETTINGS_TO_RHP.ts b/src/libs/Navigation/linkingConfig/RELATIONS/SETTINGS_TO_RHP.ts
index ab9ebbf187fb..95e867346e8a 100755
--- a/src/libs/Navigation/linkingConfig/RELATIONS/SETTINGS_TO_RHP.ts
+++ b/src/libs/Navigation/linkingConfig/RELATIONS/SETTINGS_TO_RHP.ts
@@ -50,28 +50,7 @@ const SETTINGS_TO_RHP: Partial<Record<keyof SettingsSplitNavigatorParamList, str
         SCREENS.SETTINGS.REPORT_CARD_LOST_OR_DAMAGED_CONFIRM_MAGIC_CODE,
         SCREENS.SETTINGS.ADD_BANK_ACCOUNT_VERIFY_ACCOUNT,
     ],
-    [SCREENS.SETTINGS.RULES.ROOT]: [
-        SCREENS.SETTINGS.RULES.ADD,
-        SCREENS.SETTINGS.RULES.ADD_MERCHANT,
-        SCREENS.SETTINGS.RULES.ADD_RENAME_MERCHANT,
-        SCREENS.SETTINGS.RULES.ADD_CATEGORY,
-        SCREENS.SETTINGS.RULES.ADD_TAG,
-        SCREENS.SETTINGS.RULES.ADD_TAX,
-        SCREENS.SETTINGS.RULES.ADD_DESCRIPTION,
-        SCREENS.SETTINGS.RULES.ADD_REIMBURSABLE,
-        SCREENS.SETTINGS.RULES.ADD_BILLABLE,
-        SCREENS.SETTINGS.RULES.ADD_REPORT,
-        SCREENS.SETTINGS.RULES.EDIT,
-        SCREENS.SETTINGS.RULES.EDIT_MERCHANT,
-        SCREENS.SETTINGS.RULES.EDIT_RENAME_MERCHANT,
-        SCREENS.SETTINGS.RULES.EDIT_CATEGORY,
-        SCREENS.SETTINGS.RULES.EDIT_TAG,
-        SCREENS.SETTINGS.RULES.EDIT_TAX,
-        SCREENS.SETTINGS.RULES.EDIT_DESCRIPTION,
-        SCREENS.SETTINGS.RULES.EDIT_REIMBURSABLE,
-        SCREENS.SETTINGS.RULES.EDIT_BILLABLE,
-        SCREENS.SETTINGS.RULES.EDIT_REPORT,
-    ],
+    [SCREENS.SETTINGS.RULES.ROOT]: [],
     [SCREENS.SETTINGS.SECURITY]: [
         SCREENS.TWO_FACTOR_AUTH.ROOT,
         SCREENS.TWO_FACTOR_AUTH.VERIFY_ACCOUNT,
diff --git a/src/libs/Navigation/linkingConfig/RELATIONS/WORKSPACE_TO_RHP.ts b/src/libs/Navigation/linkingConfig/RELATIONS/WORKSPACE_TO_RHP.ts
index 0beb9e8ba14f..6eae43d74ff2 100755
--- a/src/libs/Navigation/linkingConfig/RELATIONS/WORKSPACE_TO_RHP.ts
+++ b/src/libs/Navigation/linkingConfig/RELATIONS/WORKSPACE_TO_RHP.ts
@@ -213,7 +213,6 @@ const WORKSPACE_TO_RHP: Partial<Record<keyof WorkspaceSplitNavigatorParamList, s
         SCREENS.WORKSPACE.CATEGORY_DESCRIPTION_HINT,
         SCREENS.WORKSPACE.CATEGORY_APPROVER,
         SCREENS.WORKSPACE.CATEGORY_REQUIRE_RECEIPTS_OVER,
-        SCREENS.WORKSPACE.CATEGORY_REQUIRED_FIELDS,
     ],
     [SCREENS.WORKSPACE.DISTANCE_RATES]: [
         SCREENS.WORKSPACE.DISTANCE_RATES_SETTINGS,
diff --git a/src/libs/Navigation/linkingConfig/config.ts b/src/libs/Navigation/linkingConfig/config.ts
index 334c40f0d9dc..5dee953b2270 100644
--- a/src/libs/Navigation/linkingConfig/config.ts
+++ b/src/libs/Navigation/linkingConfig/config.ts
@@ -34,6 +34,7 @@ const config: LinkingOptions<RootNavigatorParamList>['config'] = {
         [SCREENS.TRANSACTION_RECEIPT]: ROUTES.TRANSACTION_RECEIPT.route,
         [SCREENS.MONEY_REQUEST.RECEIPT_PREVIEW]: ROUTES.MONEY_REQUEST_RECEIPT_PREVIEW.route,
         [SCREENS.WORKSPACE_JOIN_USER]: ROUTES.WORKSPACE_JOIN_USER.route,
+        [SCREENS.REQUIRE_TWO_FACTOR_AUTH]: ROUTES.REQUIRE_TWO_FACTOR_AUTH,
         [SCREENS.WORKSPACES_LIST]: {
             path: ROUTES.WORKSPACES_LIST.route,
             exact: true,
@@ -311,32 +312,6 @@ const config: LinkingOptions<RootNavigatorParamList>['config'] = {
                             path: ROUTES.SETTINGS_ADD_BANK_ACCOUNT_SELECT_COUNTRY_VERIFY_ACCOUNT,
                             exact: true,
                         },
-                        [SCREENS.SETTINGS.RULES.ADD]: {
-                            path: ROUTES.SETTINGS_RULES_ADD.route,
-                            exact: true,
-                        },
-                        [SCREENS.SETTINGS.RULES.ADD_MERCHANT]: ROUTES.SETTINGS_RULES_ADD.getRoute(CONST.EXPENSE_RULES.FIELDS.MERCHANT),
-                        [SCREENS.SETTINGS.RULES.ADD_RENAME_MERCHANT]: ROUTES.SETTINGS_RULES_ADD.getRoute(CONST.EXPENSE_RULES.FIELDS.RENAME_MERCHANT),
-                        [SCREENS.SETTINGS.RULES.ADD_CATEGORY]: ROUTES.SETTINGS_RULES_ADD.getRoute(CONST.EXPENSE_RULES.FIELDS.CATEGORY),
-                        [SCREENS.SETTINGS.RULES.ADD_TAG]: ROUTES.SETTINGS_RULES_ADD.getRoute(CONST.EXPENSE_RULES.FIELDS.TAG),
-                        [SCREENS.SETTINGS.RULES.ADD_TAX]: ROUTES.SETTINGS_RULES_ADD.getRoute(CONST.EXPENSE_RULES.FIELDS.TAX),
-                        [SCREENS.SETTINGS.RULES.ADD_DESCRIPTION]: ROUTES.SETTINGS_RULES_ADD.getRoute(CONST.EXPENSE_RULES.FIELDS.DESCRIPTION),
-                        [SCREENS.SETTINGS.RULES.ADD_REIMBURSABLE]: ROUTES.SETTINGS_RULES_ADD.getRoute(CONST.EXPENSE_RULES.FIELDS.REIMBURSABLE),
-                        [SCREENS.SETTINGS.RULES.ADD_BILLABLE]: ROUTES.SETTINGS_RULES_ADD.getRoute(CONST.EXPENSE_RULES.FIELDS.BILLABLE),
-                        [SCREENS.SETTINGS.RULES.ADD_REPORT]: ROUTES.SETTINGS_RULES_ADD.getRoute(CONST.EXPENSE_RULES.FIELDS.REPORT),
-                        [SCREENS.SETTINGS.RULES.EDIT]: {
-                            path: ROUTES.SETTINGS_RULES_EDIT.route,
-                            exact: true,
-                        },
-                        [SCREENS.SETTINGS.RULES.EDIT_MERCHANT]: ROUTES.SETTINGS_RULES_EDIT.getRoute(undefined, CONST.EXPENSE_RULES.FIELDS.MERCHANT),
-                        [SCREENS.SETTINGS.RULES.EDIT_RENAME_MERCHANT]: ROUTES.SETTINGS_RULES_EDIT.getRoute(undefined, CONST.EXPENSE_RULES.FIELDS.RENAME_MERCHANT),
-                        [SCREENS.SETTINGS.RULES.EDIT_CATEGORY]: ROUTES.SETTINGS_RULES_EDIT.getRoute(undefined, CONST.EXPENSE_RULES.FIELDS.CATEGORY),
-                        [SCREENS.SETTINGS.RULES.EDIT_TAG]: ROUTES.SETTINGS_RULES_EDIT.getRoute(undefined, CONST.EXPENSE_RULES.FIELDS.TAG),
-                        [SCREENS.SETTINGS.RULES.EDIT_TAX]: ROUTES.SETTINGS_RULES_EDIT.getRoute(undefined, CONST.EXPENSE_RULES.FIELDS.TAX),
-                        [SCREENS.SETTINGS.RULES.EDIT_DESCRIPTION]: ROUTES.SETTINGS_RULES_EDIT.getRoute(undefined, CONST.EXPENSE_RULES.FIELDS.DESCRIPTION),
-                        [SCREENS.SETTINGS.RULES.EDIT_REIMBURSABLE]: ROUTES.SETTINGS_RULES_EDIT.getRoute(undefined, CONST.EXPENSE_RULES.FIELDS.REIMBURSABLE),
-                        [SCREENS.SETTINGS.RULES.EDIT_BILLABLE]: ROUTES.SETTINGS_RULES_EDIT.getRoute(undefined, CONST.EXPENSE_RULES.FIELDS.BILLABLE),
-                        [SCREENS.SETTINGS.RULES.EDIT_REPORT]: ROUTES.SETTINGS_RULES_EDIT.getRoute(undefined, CONST.EXPENSE_RULES.FIELDS.REPORT),
                         [SCREENS.SETTINGS.PROFILE.PRONOUNS]: {
                             path: ROUTES.SETTINGS_PRONOUNS,
                             exact: true,
@@ -951,9 +926,6 @@ const config: LinkingOptions<RootNavigatorParamList>['config'] = {
                         [SCREENS.WORKSPACE.CATEGORY_REQUIRE_RECEIPTS_OVER]: {
                             path: ROUTES.WORKSPACE_CATEGORY_REQUIRE_RECEIPTS_OVER.route,
                         },
-                        [SCREENS.WORKSPACE.CATEGORY_REQUIRED_FIELDS]: {
-                            path: ROUTES.WORKSPACE_CATEGORY_REQUIRED_FIELDS.route,
-                        },
                         [SCREENS.WORKSPACE.CREATE_DISTANCE_RATE]: {
                             path: ROUTES.WORKSPACE_CREATE_DISTANCE_RATE.route,
                         },
@@ -1187,9 +1159,6 @@ const config: LinkingOptions<RootNavigatorParamList>['config'] = {
                         [SCREENS.DOMAIN.MEMBER_DETAILS]: {
                             path: ROUTES.DOMAIN_MEMBER_DETAILS.route,
                         },
-                        [SCREENS.DOMAIN.RESET_DOMAIN]: {
-                            path: ROUTES.DOMAIN_RESET_DOMAIN.route,
-                        },
                     },
                 },
                 [SCREENS.RIGHT_MODAL.TWO_FACTOR_AUTH]: {
@@ -1548,8 +1517,6 @@ const config: LinkingOptions<RootNavigatorParamList>['config'] = {
                         [SCREENS.MONEY_REQUEST.STEP_DESTINATION_EDIT]: ROUTES.MONEY_REQUEST_STEP_DESTINATION_EDIT.route,
                         [SCREENS.MONEY_REQUEST.STEP_TIME_EDIT]: ROUTES.MONEY_REQUEST_STEP_TIME_EDIT.route,
                         [SCREENS.MONEY_REQUEST.STEP_SUBRATE_EDIT]: ROUTES.MONEY_REQUEST_STEP_SUBRATE_EDIT.route,
-                        [SCREENS.MONEY_REQUEST.STEP_TIME_RATE]: ROUTES.MONEY_REQUEST_STEP_TIME_RATE.route,
-                        [SCREENS.MONEY_REQUEST.STEP_HOURS]: ROUTES.MONEY_REQUEST_STEP_HOURS.route,
                         [SCREENS.IOU_SEND.ENABLE_PAYMENTS]: ROUTES.IOU_SEND_ENABLE_PAYMENTS,
                         [SCREENS.IOU_SEND.ADD_BANK_ACCOUNT]: ROUTES.IOU_SEND_ADD_BANK_ACCOUNT,
                         [SCREENS.IOU_SEND.ADD_DEBIT_CARD]: ROUTES.IOU_SEND_ADD_DEBIT_CARD,
@@ -1693,7 +1660,6 @@ const config: LinkingOptions<RootNavigatorParamList>['config'] = {
                 [SCREENS.RIGHT_MODAL.REPORT_VERIFY_ACCOUNT]: {
                     screens: {
                         [SCREENS.REPORT_VERIFY_ACCOUNT]: ROUTES.REPORT_VERIFY_ACCOUNT.route,
-                        [SCREENS.EXPENSE_REPORT_VERIFY_ACCOUNT]: ROUTES.EXPENSE_REPORT_VERIFY_ACCOUNT.route,
                         [SCREENS.SEARCH.REPORT_VERIFY_ACCOUNT]: ROUTES.SEARCH_REPORT_VERIFY_ACCOUNT.route,
                     },
                 },
@@ -1904,8 +1870,6 @@ const config: LinkingOptions<RootNavigatorParamList>['config'] = {
                         [SCREENS.REPORT_CHANGE_APPROVER.ADD_APPROVER]: ROUTES.REPORT_CHANGE_APPROVER_ADD_APPROVER.route,
                     },
                 },
-                [SCREENS.RIGHT_MODAL.EXPENSE_REPORT]: ROUTES.EXPENSE_REPORT_RHP.route,
-                [SCREENS.RIGHT_MODAL.SEARCH_MONEY_REQUEST_REPORT]: ROUTES.SEARCH_MONEY_REQUEST_REPORT.route,
                 [SCREENS.RIGHT_MODAL.DOMAIN]: {
                     screens: {
                         [SCREENS.WORKSPACES_VERIFY_DOMAIN]: {
@@ -1928,15 +1892,6 @@ const config: LinkingOptions<RootNavigatorParamList>['config'] = {
                         },
                     },
                 },
-                [SCREENS.RIGHT_MODAL.MULTIFACTOR_AUTHENTICATION]: {
-                    screens: {
-                        [SCREENS.MULTIFACTOR_AUTHENTICATION.MAGIC_CODE]: ROUTES.MULTIFACTOR_AUTHENTICATION_MAGIC_CODE,
-                        [SCREENS.MULTIFACTOR_AUTHENTICATION.BIOMETRICS_TEST]: ROUTES.MULTIFACTOR_AUTHENTICATION_BIOMETRICS_TEST,
-                        [SCREENS.MULTIFACTOR_AUTHENTICATION.NOTIFICATION]: ROUTES.MULTIFACTOR_AUTHENTICATION_NOTIFICATION.route,
-                        [SCREENS.MULTIFACTOR_AUTHENTICATION.PROMPT]: ROUTES.MULTIFACTOR_AUTHENTICATION_PROMPT.route,
-                        [SCREENS.MULTIFACTOR_AUTHENTICATION.NOT_FOUND]: ROUTES.MULTIFACTOR_AUTHENTICATION_NOT_FOUND,
-                    },
-                },
             },
         },
 
@@ -2080,6 +2035,9 @@ const config: LinkingOptions<RootNavigatorParamList>['config'] = {
                 [SCREENS.SEARCH.ROOT]: {
                     path: ROUTES.SEARCH_ROOT.route,
                 },
+                [SCREENS.SEARCH.MONEY_REQUEST_REPORT]: {
+                    path: ROUTES.SEARCH_MONEY_REQUEST_REPORT.route,
+                },
             },
         },
         [NAVIGATORS.SHARE_MODAL_NAVIGATOR]: {
diff --git a/src/libs/Navigation/types.ts b/src/libs/Navigation/types.ts
index 107758857fcf..7854b8717bcd 100644
--- a/src/libs/Navigation/types.ts
+++ b/src/libs/Navigation/types.ts
@@ -88,9 +88,6 @@ type ReportVerifyAccountNavigatorParamList = {
     [SCREENS.REPORT_VERIFY_ACCOUNT]: {
         reportID: string;
     };
-    [SCREENS.EXPENSE_REPORT_VERIFY_ACCOUNT]: {
-        reportID: string;
-    };
 };
 
 type SettingsNavigatorParamList = {
@@ -223,47 +220,6 @@ type SettingsNavigatorParamList = {
     [SCREENS.SETTINGS.ADD_US_BANK_ACCOUNT]: undefined;
     [SCREENS.SETTINGS.ADD_US_BANK_ACCOUNT_ENTRY_POINT]: undefined;
     [SCREENS.SETTINGS.ADD_BANK_ACCOUNT_SELECT_COUNTRY_VERIFY_ACCOUNT]: undefined;
-    [SCREENS.SETTINGS.RULES.ADD]: undefined;
-    [SCREENS.SETTINGS.RULES.ADD_MERCHANT]: undefined;
-    [SCREENS.SETTINGS.RULES.ADD_RENAME_MERCHANT]: undefined;
-    [SCREENS.SETTINGS.RULES.ADD_CATEGORY]: undefined;
-    [SCREENS.SETTINGS.RULES.ADD_TAG]: undefined;
-    [SCREENS.SETTINGS.RULES.ADD_TAX]: undefined;
-    [SCREENS.SETTINGS.RULES.ADD_DESCRIPTION]: undefined;
-    [SCREENS.SETTINGS.RULES.ADD_REIMBURSABLE]: undefined;
-    [SCREENS.SETTINGS.RULES.ADD_BILLABLE]: undefined;
-    [SCREENS.SETTINGS.RULES.ADD_REPORT]: undefined;
-    [SCREENS.SETTINGS.RULES.EDIT]: {
-        hash: string;
-        field?: ValueOf<typeof CONST.EXPENSE_RULES.FIELDS>;
-    };
-    [SCREENS.SETTINGS.RULES.EDIT_MERCHANT]: {
-        hash: string;
-    };
-    [SCREENS.SETTINGS.RULES.EDIT_RENAME_MERCHANT]: {
-        hash: string;
-    };
-    [SCREENS.SETTINGS.RULES.EDIT_CATEGORY]: {
-        hash: string;
-    };
-    [SCREENS.SETTINGS.RULES.EDIT_TAG]: {
-        hash: string;
-    };
-    [SCREENS.SETTINGS.RULES.EDIT_TAX]: {
-        hash: string;
-    };
-    [SCREENS.SETTINGS.RULES.EDIT_DESCRIPTION]: {
-        hash: string;
-    };
-    [SCREENS.SETTINGS.RULES.EDIT_REIMBURSABLE]: {
-        hash: string;
-    };
-    [SCREENS.SETTINGS.RULES.EDIT_BILLABLE]: {
-        hash: string;
-    };
-    [SCREENS.SETTINGS.RULES.EDIT_REPORT]: {
-        hash: string;
-    };
     [SCREENS.SETTINGS.PROFILE.STATUS]: undefined;
     [SCREENS.SETTINGS.PROFILE.STATUS_CLEAR_AFTER]: undefined;
     [SCREENS.SETTINGS.PROFILE.STATUS_CLEAR_AFTER_DATE]: undefined;
@@ -383,10 +339,6 @@ type SettingsNavigatorParamList = {
         // 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.WORKSPACE.CATEGORY_REQUIRED_FIELDS]: {
-        policyID: string;
-        categoryName: string;
-    };
     [SCREENS.WORKSPACE.UPGRADE]: {
         policyID?: string;
         featureName?: string;
@@ -1792,6 +1744,8 @@ type MoneyRequestNavigatorParamList = {
         iouType: IOUType;
         transactionID: string;
         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;
         backToReport?: string;
         reportActionID?: string;
     };
@@ -1985,20 +1939,6 @@ type MoneyRequestNavigatorParamList = {
     [SCREENS.SET_DEFAULT_WORKSPACE]: {
         navigateTo?: Routes;
     };
-    [SCREENS.MONEY_REQUEST.STEP_TIME_RATE]: {
-        action: IOUAction;
-        iouType: Exclude<IOUType, typeof CONST.IOU.TYPE.REQUEST | typeof CONST.IOU.TYPE.SEND>;
-        transactionID: string;
-        reportID: string;
-        reportActionID: string;
-    };
-    [SCREENS.MONEY_REQUEST.STEP_HOURS]: {
-        action: IOUAction;
-        iouType: Exclude<IOUType, typeof CONST.IOU.TYPE.REQUEST | typeof CONST.IOU.TYPE.SEND>;
-        transactionID: string;
-        reportID: string;
-        reportActionID: string;
-    };
 };
 
 type WorkspaceConfirmationNavigatorParamList = {
@@ -2256,7 +2196,7 @@ type WorkspacesDomainModalNavigatorParamList = {
     [SCREENS.WORKSPACES_ADD_DOMAIN]: undefined;
     [SCREENS.WORKSPACES_ADD_DOMAIN_VERIFY_ACCOUNT]: undefined;
     [SCREENS.WORKSPACES_DOMAIN_ADDED]: {
-        domainAccountID: number;
+        accountID: number;
     };
     [SCREENS.WORKSPACES_DOMAIN_ACCESS_RESTRICTED]: {
         domainAccountID: number;
@@ -2312,25 +2252,14 @@ type RightModalNavigatorParamList = {
     [SCREENS.RIGHT_MODAL.SCHEDULE_CALL]: NavigatorScreenParams<ScheduleCallParamList>;
     [SCREENS.RIGHT_MODAL.REPORT_CHANGE_APPROVER]: NavigatorScreenParams<ReportChangeApproverParamList>;
     [SCREENS.RIGHT_MODAL.MERGE_TRANSACTION]: NavigatorScreenParams<MergeTransactionNavigatorParamList>;
-    [SCREENS.RIGHT_MODAL.EXPENSE_REPORT]: {
-        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;
-    };
-    [SCREENS.RIGHT_MODAL.SEARCH_MONEY_REQUEST_REPORT]: {
-        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;
-    };
+    [SCREENS.RIGHT_MODAL.DOMAIN]: NavigatorScreenParams<WorkspacesDomainModalNavigatorParamList>;
+    [SCREENS.RIGHT_MODAL.SEARCH_COLUMNS]: NavigatorScreenParams<SearchColumnsParamList>;
     [SCREENS.RIGHT_MODAL.SEARCH_REPORT]: {
         reportID: string;
         reportActionID?: 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;
     };
-    [SCREENS.RIGHT_MODAL.DOMAIN]: NavigatorScreenParams<WorkspacesDomainModalNavigatorParamList>;
-    [SCREENS.RIGHT_MODAL.SEARCH_COLUMNS]: NavigatorScreenParams<SearchColumnsParamList>;
-    [SCREENS.RIGHT_MODAL.MULTIFACTOR_AUTHENTICATION]: NavigatorScreenParams<MultifactorAuthenticationParamList>;
 };
 
 type TravelNavigatorParamList = {
@@ -2594,10 +2523,6 @@ type DomainSplitNavigatorParamList = {
     [SCREENS.DOMAIN.MEMBERS]: {
         domainAccountID: number;
     };
-    [SCREENS.DOMAIN.RESET_DOMAIN]: {
-        domainAccountID: number;
-        accountID: number;
-    };
 };
 
 type OnboardingModalNavigatorParamList = {
@@ -2864,6 +2789,11 @@ type SearchFullscreenNavigatorParamList = {
         name?: string;
         groupBy?: string;
     };
+    [SCREENS.SEARCH.MONEY_REQUEST_REPORT]: {
+        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;
+    };
 };
 
 type SearchAdvancedFiltersParamList = {
@@ -2981,17 +2911,6 @@ type TestToolsModalModalNavigatorParamList = {
     };
 };
 
-type MultifactorAuthenticationParamList = {
-    [SCREENS.MULTIFACTOR_AUTHENTICATION.MAGIC_CODE]: undefined;
-    [SCREENS.MULTIFACTOR_AUTHENTICATION.BIOMETRICS_TEST]: undefined;
-    [SCREENS.MULTIFACTOR_AUTHENTICATION.NOTIFICATION]: {
-        notificationType: ValueOf<typeof CONST.MULTIFACTOR_AUTHENTICATION_NOTIFICATION_TYPE>;
-    };
-    [SCREENS.MULTIFACTOR_AUTHENTICATION.PROMPT]: {
-        promptType: string;
-    };
-};
-
 type RootNavigatorParamList = PublicScreensParamList & AuthScreensParamList & SearchFullscreenNavigatorParamList;
 
 type OnboardingFlowName = keyof OnboardingModalNavigatorParamList;
@@ -3104,5 +3023,4 @@ export type {
     DomainSplitNavigatorParamList,
     DomainScreenName,
     SearchColumnsParamList,
-    MultifactorAuthenticationParamList,
 };
diff --git a/src/libs/Network/SequentialQueue.ts b/src/libs/Network/SequentialQueue.ts
index e78c84458d00..ed85e6662ac0 100644
--- a/src/libs/Network/SequentialQueue.ts
+++ b/src/libs/Network/SequentialQueue.ts
@@ -1,4 +1,4 @@
-import type {OnyxKey, OnyxUpdate} from 'react-native-onyx';
+import type {OnyxUpdate} from 'react-native-onyx';
 import Onyx from 'react-native-onyx';
 import {setIsOpenAppFailureModalOpen} from '@libs/actions/isOpenAppFailureModalOpen';
 import {
@@ -80,7 +80,7 @@ function flushOnyxUpdatesQueue() {
     return flushQueue();
 }
 
-let queueFlushedDataToStore: Array<OnyxUpdate<OnyxKey>> = [];
+let queueFlushedDataToStore: OnyxUpdate[] = [];
 
 // Use connectWithoutView since this is for network queue and don't affect to any UI
 Onyx.connectWithoutView({
@@ -93,7 +93,7 @@ Onyx.connectWithoutView({
     },
 });
 
-function saveQueueFlushedData(...onyxUpdates: Array<OnyxUpdate<OnyxKey>>) {
+function saveQueueFlushedData(...onyxUpdates: OnyxUpdate[]) {
     // @ts-expect-error - will be solved in https://github.com/Expensify/App/issues/73830
     const newValue = [...queueFlushedDataToStore, ...onyxUpdates];
     // eslint-disable-next-line rulesdir/prefer-actions-set-data
@@ -170,7 +170,7 @@ function process(): Promise<void> {
             // Duplicate records don't need to be retried as they just mean the record already exists on the server
             if (error.name === CONST.ERROR.REQUEST_CANCELLED || error.message === CONST.ERROR.DUPLICATE_RECORD || shouldFailAllRequests) {
                 if (shouldFailAllRequests) {
-                    const onyxUpdates = [...((requestToProcess.failureData ?? []) as never), ...((requestToProcess.finallyData ?? []) as never)] as Array<OnyxUpdate<OnyxKey>>;
+                    const onyxUpdates = [...(requestToProcess.failureData ?? []), ...(requestToProcess.finallyData ?? [])] as OnyxUpdate[];
                     Onyx.update(onyxUpdates);
                 }
                 Log.info("[SequentialQueue] Removing persisted request because it failed and doesn't need to be retried.", false, {error, request: requestToProcess});
diff --git a/src/libs/OptionsListUtils/index.ts b/src/libs/OptionsListUtils/index.ts
index 0a5f7f11b8e0..c5bcf6e6c279 100644
--- a/src/libs/OptionsListUtils/index.ts
+++ b/src/libs/OptionsListUtils/index.ts
@@ -7,7 +7,7 @@ import type {OnyxCollection, OnyxEntry} from 'react-native-onyx';
 import Onyx from 'react-native-onyx';
 import type {SetNonNullable} from 'type-fest';
 import {FallbackAvatar} from '@components/Icon/Expensicons';
-import type {LocaleContextProps, LocalizedTranslate} from '@components/LocaleContextProvider';
+import type {LocaleContextProps} from '@components/LocaleContextProvider';
 import {getEnabledCategoriesCount} from '@libs/CategoryUtils';
 import filterArrayByMatch from '@libs/filterArrayByMatch';
 import {isReportMessageAttachment} from '@libs/isReportMessageAttachment';
@@ -39,19 +39,14 @@ import {
     getCombinedReportActions,
     getDynamicExternalWorkflowRoutedMessage,
     getExportIntegrationLastMessageText,
-    getInvoiceCompanyNameUpdateMessage,
-    getInvoiceCompanyWebsiteUpdateMessage,
     getIOUReportIDFromReportActionPreview,
     getJoinRequestMessage,
-    getLastVisibleAction,
     getLastVisibleMessage,
     getMarkedReimbursedMessage,
     getMentionedAccountIDsFromAction,
     getMessageOfOldDotReportAction,
     getOneTransactionThreadReportID,
     getOriginalMessage,
-    getPolicyChangeLogMaxExpenseAgeMessage,
-    getPolicyChangeLogMaxExpenseAmountMessage,
     getRenamedAction,
     getReportActionActorAccountID,
     getReportActionHtml,
@@ -60,7 +55,6 @@ import {
     getRoomChangeLogMessage,
     getSortedReportActions,
     getTravelUpdateMessage,
-    getUpdateACHAccountMessage,
     getUpdateRoomDescriptionMessage,
     hasPendingDEWSubmit,
     isActionableAddPaymentCard,
@@ -83,11 +77,12 @@ import {
     isReimbursementDeQueuedOrCanceledAction,
     isReimbursementQueuedAction,
     isRenamedAction,
-    isReportActionVisible,
     isReportPreviewAction,
     isTaskAction,
     isThreadParentMessage,
     isUnapprovedAction,
+    isWhisperAction,
+    shouldReportActionBeVisible,
     withDEWRoutedActionsArray,
 } from '@libs/ReportActionsUtils';
 import {computeReportName} from '@libs/ReportNameUtils';
@@ -166,7 +161,6 @@ import type {
     ReportAttributesDerivedValue,
     ReportMetadata,
     ReportNameValuePairs,
-    VisibleReportActionsDerivedValue,
 } from '@src/types/onyx';
 import type {Attendee, Participant} from '@src/types/onyx/IOU';
 import {isEmptyObject} from '@src/types/utils/EmptyObject';
@@ -239,18 +233,19 @@ Onyx.connect({
     },
 });
 
-let allReportNameValuePairsOnyxConnect: OnyxCollection<ReportNameValuePairs>;
+let allReportNameValuePairs: OnyxCollection<ReportNameValuePairs>;
 Onyx.connect({
     key: ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS,
     waitForCollectionCallback: true,
     callback: (value) => {
-        allReportNameValuePairsOnyxConnect = value;
+        allReportNameValuePairs = value;
     },
 });
 
 const lastReportActions: ReportActions = {};
 const allSortedReportActions: Record<string, ReportAction[]> = {};
 let allReportActions: OnyxCollection<ReportActions>;
+const lastVisibleReportActions: ReportActions = {};
 Onyx.connect({
     key: ONYXKEYS.COLLECTION.REPORT_ACTIONS,
     waitForCollectionCallback: true,
@@ -261,7 +256,7 @@ Onyx.connect({
 
         allReportActions = actions ?? {};
 
-        // Iterate over the report actions to build the sorted report actions objects
+        // Iterate over the report actions to build the sorted and lastVisible report actions objects
         for (const reportActions of Object.entries(allReportActions)) {
             const reportID = reportActions[0].split('_').at(1);
             if (!reportID) {
@@ -280,7 +275,6 @@ Onyx.connect({
             if (transactionThreadReportID) {
                 const transactionThreadReportActionsArray = Object.values(actions[`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${transactionThreadReportID}`] ?? {});
                 sortedReportActions = getCombinedReportActions(sortedReportActions, transactionThreadReportID, transactionThreadReportActionsArray, reportID);
-                allSortedReportActions[reportID] = sortedReportActions;
             }
 
             const firstReportAction = sortedReportActions.at(0);
@@ -289,6 +283,26 @@ Onyx.connect({
             } else {
                 lastReportActions[reportID] = firstReportAction;
             }
+
+            const reportNameValuePairs = allReportNameValuePairs?.[`${ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS}${reportID}`];
+            const isReportArchived = !!reportNameValuePairs?.private_isArchived;
+            const isWriteActionAllowed = canUserPerformWriteAction(report, isReportArchived);
+
+            // The report is only visible if it is the last action not deleted that
+            // does not match a closed or created state.
+            const reportActionsForDisplay = sortedReportActions.filter(
+                (reportAction, actionKey) =>
+                    (!(isWhisperAction(reportAction) && !isReportPreviewAction(reportAction) && !isMoneyRequestAction(reportAction)) || isActionableMentionWhisper(reportAction)) &&
+                    shouldReportActionBeVisible(reportAction, actionKey, isWriteActionAllowed) &&
+                    reportAction.actionName !== CONST.REPORT.ACTIONS.TYPE.CREATED &&
+                    reportAction.pendingAction !== CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE,
+            );
+            const reportActionForDisplay = reportActionsForDisplay.at(0);
+            if (!reportActionForDisplay) {
+                delete lastVisibleReportActions[reportID];
+                continue;
+            }
+            lastVisibleReportActions[reportID] = reportActionForDisplay;
         }
     },
 });
@@ -394,7 +408,10 @@ function uniqFast(items: string[]): string[] {
     return result;
 }
 
-function getLastActorDisplayName(lastActorDetails: Partial<PersonalDetails> | null, currentUserAccountIDParam: number) {
+/**
+ * Get the last actor display name from last actor details.
+ */
+function getLastActorDisplayName(lastActorDetails: Partial<PersonalDetails> | null) {
     if (!lastActorDetails) {
         return '';
     }
@@ -403,38 +420,33 @@ function getLastActorDisplayName(lastActorDetails: Partial<PersonalDetails> | nu
         return CONST.CONCIERGE_DISPLAY_NAME;
     }
 
-    return lastActorDetails.accountID !== currentUserAccountIDParam
+    return lastActorDetails.accountID !== currentUserAccountID
         ? // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
           lastActorDetails.firstName || formatPhoneNumberPhoneUtils(getDisplayNameOrDefault(lastActorDetails))
         : // eslint-disable-next-line @typescript-eslint/no-deprecated
           translateLocal('common.you');
 }
 
-function shouldShowLastActorDisplayName(
-    report: OnyxEntry<Report>,
-    lastActorDetails: Partial<PersonalDetails> | null,
-    lastAction: OnyxEntry<ReportAction>,
-    currentUserAccountIDParam: number,
-) {
-    // Use lastAction directly instead of getLastVisibleReportAction to avoid using stale cache data
-    const lastReportAction = lastAction;
-
-    // Use report.lastActionType as fallback when report actions aren't loaded yet (e.g., on cold start)
-    const lastActionName = lastReportAction?.actionName ?? report?.lastActionType;
+/**
+ * Should show the last actor display name from last actor details.
+ */
+function shouldShowLastActorDisplayName(report: OnyxEntry<Report>, lastActorDetails: Partial<PersonalDetails> | null, lastAction: OnyxEntry<ReportAction>) {
+    const reportID = report?.reportID;
+    const lastReportAction = reportID ? lastVisibleReportActions[reportID] : lastAction;
 
     if (
-        !lastActionName ||
+        !lastReportAction ||
         !lastActorDetails ||
         reportUtilsIsSelfDM(report) ||
-        (isDM(report) && lastActorDetails.accountID !== currentUserAccountIDParam) ||
-        lastActionName === CONST.REPORT.ACTIONS.TYPE.IOU ||
-        (lastActionName === CONST.REPORT.ACTIONS.TYPE.REPORT_PREVIEW &&
+        (isDM(report) && lastActorDetails.accountID !== currentUserAccountID) ||
+        lastReportAction?.actionName === CONST.REPORT.ACTIONS.TYPE.IOU ||
+        (lastReportAction?.actionName === CONST.REPORT.ACTIONS.TYPE.REPORT_PREVIEW &&
             Object.keys(report?.participants ?? {})?.some((participantID) => participantID === CONST.ACCOUNT_ID.MANAGER_MCTEST.toString()))
     ) {
         return false;
     }
 
-    const lastActorDisplayName = getLastActorDisplayName(lastActorDetails, currentUserAccountIDParam);
+    const lastActorDisplayName = getLastActorDisplayName(lastActorDetails);
 
     if (!lastActorDisplayName) {
         return false;
@@ -451,34 +463,25 @@ function getAlternateText(
     {showChatPreviewLine = false, forcePolicyNamePreview = false}: PreviewConfig,
     isReportArchived: boolean | undefined,
     lastActorDetails: Partial<PersonalDetails> | null = {},
-    visibleReportActionsData: VisibleReportActionsDerivedValue = {},
-    translate?: LocalizedTranslate,
 ) {
     const report = getReportOrDraftReport(option.reportID);
     const isAdminRoom = reportUtilsIsAdminRoom(report);
     const isAnnounceRoom = reportUtilsIsAnnounceRoom(report);
     const isGroupChat = reportUtilsIsGroupChat(report);
     const isExpenseThread = isMoneyRequest(report);
-    // eslint-disable-next-line @typescript-eslint/no-deprecated
-    const translateFn = translate ?? translateLocal;
     const formattedLastMessageText =
-        formatReportLastMessageText(Parser.htmlToText(option.lastMessageText ?? '')) ||
-        getLastMessageTextForReport({
-            translate: translateFn,
-            report,
-            lastActorDetails,
-            isReportArchived,
-            visibleReportActionsDataParam: visibleReportActionsData,
-        });
+        formatReportLastMessageText(Parser.htmlToText(option.lastMessageText ?? '')) || getLastMessageTextForReport({report, lastActorDetails, isReportArchived});
     const reportPrefix = getReportSubtitlePrefix(report);
     const formattedLastMessageTextWithPrefix = reportPrefix + formattedLastMessageText;
 
     if (isExpenseThread || option.isMoneyRequestReport) {
-        return showChatPreviewLine && formattedLastMessageText ? formattedLastMessageTextWithPrefix : translateFn('iou.expense');
+        // eslint-disable-next-line @typescript-eslint/no-deprecated
+        return showChatPreviewLine && formattedLastMessageText ? formattedLastMessageTextWithPrefix : translateLocal('iou.expense');
     }
 
     if (option.isThread) {
-        return showChatPreviewLine && formattedLastMessageText ? formattedLastMessageTextWithPrefix : translateFn('threads.thread');
+        // eslint-disable-next-line @typescript-eslint/no-deprecated
+        return showChatPreviewLine && formattedLastMessageText ? formattedLastMessageTextWithPrefix : translateLocal('threads.thread');
     }
 
     if (option.isChatRoom && !isAdminRoom && !isAnnounceRoom) {
@@ -490,11 +493,13 @@ function getAlternateText(
     }
 
     if (option.isTaskReport) {
-        return showChatPreviewLine && formattedLastMessageText ? formattedLastMessageTextWithPrefix : translateFn('task.task');
+        // eslint-disable-next-line @typescript-eslint/no-deprecated
+        return showChatPreviewLine && formattedLastMessageText ? formattedLastMessageTextWithPrefix : translateLocal('task.task');
     }
 
     if (isGroupChat) {
-        return showChatPreviewLine && formattedLastMessageText ? formattedLastMessageTextWithPrefix : translateFn('common.group');
+        // eslint-disable-next-line @typescript-eslint/no-deprecated
+        return showChatPreviewLine && formattedLastMessageText ? formattedLastMessageTextWithPrefix : translateLocal('common.group');
     }
 
     return showChatPreviewLine && formattedLastMessageText
@@ -543,44 +548,29 @@ function isSearchStringMatchUserDetails(personalDetail: PersonalDetails, searchV
 /**
  * Get IOU report ID of report last action if the action is report action preview
  */
-function getIOUReportIDOfLastAction(report: OnyxEntry<Report>, visibleReportActionsData?: VisibleReportActionsDerivedValue, lastAction?: OnyxEntry<ReportAction>): string | undefined {
+function getIOUReportIDOfLastAction(report: OnyxEntry<Report>): string | undefined {
     if (!report?.reportID) {
         return;
     }
-    // Use lastAction if available (from useOnyx), otherwise fallback to getLastVisibleAction which uses isReportActionVisibleAsLastAction with proper filters
-    const reportNameValuePairs = allReportNameValuePairsOnyxConnect?.[`${ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS}${report.reportID}`];
-    const isReportArchived = !!reportNameValuePairs?.private_isArchived;
-    const canUserPerformWrite = canUserPerformWriteAction(report, isReportArchived);
-    const action = lastAction ?? getLastVisibleAction(report.reportID, canUserPerformWrite, {}, undefined, visibleReportActionsData);
-    if (!isReportPreviewAction(action)) {
+    const lastAction = lastVisibleReportActions[report.reportID];
+    if (!isReportPreviewAction(lastAction)) {
         return;
     }
-    return getReportOrDraftReport(getIOUReportIDFromReportActionPreview(action))?.reportID;
+    return getReportOrDraftReport(getIOUReportIDFromReportActionPreview(lastAction))?.reportID;
 }
 
 function hasHiddenDisplayNames(accountIDs: number[]) {
     return getPersonalDetailsByIDs({accountIDs, currentUserAccountID: 0}).some((personalDetail) => !getDisplayNameOrDefault(personalDetail, undefined, false));
 }
 
-function getLastActorDisplayNameFromLastVisibleActions(
-    report: OnyxEntry<Report>,
-    lastActorDetails: Partial<PersonalDetails> | null,
-    currentUserAccountIDParam: number,
-    personalDetails?: OnyxEntry<PersonalDetailsList>,
-    visibleReportActionsData?: VisibleReportActionsDerivedValue,
-    lastAction?: OnyxEntry<ReportAction>,
-): string {
+function getLastActorDisplayNameFromLastVisibleActions(report: OnyxEntry<Report>, lastActorDetails: Partial<PersonalDetails> | null): string {
     const reportID = report?.reportID;
-    // Use lastAction if available (from useOnyx), otherwise fallback to getLastVisibleAction which uses isReportActionVisibleAsLastAction with proper filters
-    const reportNameValuePairs = reportID ? allReportNameValuePairsOnyxConnect?.[`${ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS}${reportID}`] : undefined;
-    const isReportArchived = !!reportNameValuePairs?.private_isArchived;
-    const canUserPerformWrite = canUserPerformWriteAction(report, isReportArchived);
-    const lastReportAction = lastAction ?? getLastVisibleAction(reportID, canUserPerformWrite, {}, undefined, visibleReportActionsData);
+    const lastReportAction = reportID ? lastVisibleReportActions[reportID] : undefined;
 
     if (lastReportAction) {
         // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
         const lastActorAccountID = getReportActionActorAccountID(lastReportAction, undefined, undefined) || report?.lastActorAccountID;
-        let actorDetails: Partial<PersonalDetails> | null = lastActorAccountID ? ((personalDetails ?? allPersonalDetails)?.[lastActorAccountID] ?? null) : null;
+        let actorDetails: Partial<PersonalDetails> | null = lastActorAccountID ? (allPersonalDetails?.[lastActorAccountID] ?? null) : null;
 
         if (!actorDetails && lastReportAction.person?.at(0)?.text) {
             actorDetails = {
@@ -590,18 +580,17 @@ function getLastActorDisplayNameFromLastVisibleActions(
         }
 
         if (actorDetails) {
-            return getLastActorDisplayName(actorDetails, currentUserAccountIDParam);
+            return getLastActorDisplayName(actorDetails);
         }
     }
 
-    return getLastActorDisplayName(lastActorDetails, currentUserAccountIDParam);
+    return getLastActorDisplayName(lastActorDetails);
 }
 
 /**
  * Get the last message text from the report directly or from other sources for special cases.
  */
 function getLastMessageTextForReport({
-    translate,
     report,
     lastActorDetails,
     movedFromReport,
@@ -610,10 +599,7 @@ function getLastMessageTextForReport({
     isReportArchived = false,
     policyForMovingExpensesID,
     reportMetadata,
-    visibleReportActionsDataParam,
-    lastAction,
 }: {
-    translate: LocalizedTranslate;
     report: OnyxEntry<Report>;
     lastActorDetails: Partial<PersonalDetails> | null;
     movedFromReport?: OnyxEntry<Report>;
@@ -622,14 +608,10 @@ function getLastMessageTextForReport({
     isReportArchived?: boolean;
     policyForMovingExpensesID?: string;
     reportMetadata?: OnyxEntry<ReportMetadata>;
-    visibleReportActionsDataParam?: VisibleReportActionsDerivedValue;
-    lastAction?: OnyxEntry<ReportAction>;
 }): string {
     const reportID = report?.reportID;
-    // Use lastAction if available (from useOnyx), otherwise fallback to getLastVisibleAction which uses isReportActionVisibleAsLastAction with proper filters
-    const canUserPerformWrite = canUserPerformWriteAction(report, isReportArchived);
-    const lastReportAction = lastAction ?? getLastVisibleAction(reportID, canUserPerformWrite, {}, undefined, visibleReportActionsDataParam);
-    const lastVisibleMessage = getLastVisibleMessage(report?.reportID, undefined, {}, undefined, visibleReportActionsDataParam);
+    const lastReportAction = reportID ? lastVisibleReportActions[reportID] : undefined;
+    const lastVisibleMessage = getLastVisibleMessage(report?.reportID);
 
     // some types of actions are filtered out for lastReportAction, in some cases we need to check the actual last action
     const lastOriginalReportAction = reportID ? lastReportActions[reportID] : undefined;
@@ -643,18 +625,21 @@ function getLastMessageTextForReport({
             case CONST.REPORT.ARCHIVE_REASON.ACCOUNT_CLOSED:
             case CONST.REPORT.ARCHIVE_REASON.REMOVED_FROM_POLICY:
             case CONST.REPORT.ARCHIVE_REASON.POLICY_DELETED: {
-                lastMessageTextFromReport = translate(`reportArchiveReasons.${archiveReason}`, {
+                // eslint-disable-next-line @typescript-eslint/no-deprecated
+                lastMessageTextFromReport = translateLocal(`reportArchiveReasons.${archiveReason}`, {
                     displayName: formatPhoneNumberPhoneUtils(getDisplayNameOrDefault(lastActorDetails)),
                     policyName: getPolicyName({report, policy}),
                 });
                 break;
             }
             case CONST.REPORT.ARCHIVE_REASON.BOOKING_END_DATE_HAS_PASSED: {
-                lastMessageTextFromReport = translate(`reportArchiveReasons.${archiveReason}`);
+                // eslint-disable-next-line @typescript-eslint/no-deprecated
+                lastMessageTextFromReport = translateLocal(`reportArchiveReasons.${archiveReason}`);
                 break;
             }
             default: {
-                lastMessageTextFromReport = translate(`reportArchiveReasons.default`);
+                // eslint-disable-next-line @typescript-eslint/no-deprecated
+                lastMessageTextFromReport = translateLocal(`reportArchiveReasons.default`);
             }
         }
     } else if (isMoneyRequestAction(lastReportAction)) {
@@ -662,18 +647,17 @@ function getLastMessageTextForReport({
         lastMessageTextFromReport = formatReportLastMessageText(Parser.htmlToText(properSchemaForMoneyRequestMessage));
     } else if (isReportPreviewAction(lastReportAction)) {
         const iouReport = getReportOrDraftReport(getIOUReportIDFromReportActionPreview(lastReportAction));
-        const iouReportID = iouReport?.reportID;
-        const lastIOUMoneyReportAction = iouReportID
-            ? allSortedReportActions[iouReportID]?.find(
-                  (reportAction): reportAction is ReportAction<typeof CONST.REPORT.ACTIONS.TYPE.IOU> =>
-                      isReportActionVisible(reportAction, iouReportID, canUserPerformWriteAction(report, isReportArchived), visibleReportActionsDataParam) &&
+        const lastIOUMoneyReportAction = iouReport?.reportID
+            ? allSortedReportActions[iouReport.reportID]?.find(
+                  (reportAction, key): reportAction is ReportAction<typeof CONST.REPORT.ACTIONS.TYPE.IOU> =>
+                      shouldReportActionBeVisible(reportAction, key, canUserPerformWriteAction(report, isReportArchived)) &&
                       reportAction.pendingAction !== CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE &&
                       isMoneyRequestAction(reportAction),
               )
             : undefined;
         // For workspace chats, use the report title
         if (reportUtilsIsPolicyExpenseChat(report) && !isEmptyObject(iouReport)) {
-            const reportName = computeReportName(iouReport, undefined, undefined, undefined, undefined, undefined, undefined, currentUserAccountID);
+            const reportName = computeReportName(iouReport);
             lastMessageTextFromReport = formatReportLastMessageText(reportName);
         } else {
             const reportPreviewMessage = getReportPreviewMessage(
@@ -694,11 +678,14 @@ function getLastMessageTextForReport({
     } else if (isDeletedParentAction(lastReportAction) && reportUtilsIsChatReport(report)) {
         lastMessageTextFromReport = getDeletedParentActionMessageForChatReport(lastReportAction);
     } else if (isPendingRemove(lastReportAction) && report?.reportID && isThreadParentMessage(lastReportAction, report.reportID)) {
-        lastMessageTextFromReport = translate('parentReportAction.hiddenMessage');
+        // eslint-disable-next-line @typescript-eslint/no-deprecated
+        lastMessageTextFromReport = translateLocal('parentReportAction.hiddenMessage');
     } else if (isActionOfType(lastReportAction, CONST.REPORT.ACTIONS.TYPE.MARKED_REIMBURSED)) {
+        // eslint-disable-next-line @typescript-eslint/no-deprecated
         lastMessageTextFromReport = getMarkedReimbursedMessage(lastReportAction);
     } else if (isReportMessageAttachment({text: report?.lastMessageText ?? '', html: report?.lastMessageHtml, type: ''})) {
-        lastMessageTextFromReport = `[${translate('common.attachment')}]`;
+        // eslint-disable-next-line @typescript-eslint/no-deprecated
+        lastMessageTextFromReport = `[${translateLocal('common.attachment')}]`;
     } else if (isModifiedExpenseAction(lastReportAction)) {
         const properSchemaForModifiedExpenseMessage = getForReportAction({
             reportAction: lastReportAction,
@@ -711,9 +698,11 @@ function getLastMessageTextForReport({
     } else if (isMovedTransactionAction(lastReportAction)) {
         lastMessageTextFromReport = Parser.htmlToText(getMovedTransactionMessage(lastReportAction));
     } else if (isTaskAction(lastReportAction)) {
-        lastMessageTextFromReport = formatReportLastMessageText(getTaskReportActionMessage(translate, lastReportAction).text);
+        // eslint-disable-next-line @typescript-eslint/no-deprecated
+        lastMessageTextFromReport = formatReportLastMessageText(getTaskReportActionMessage(translateLocal, lastReportAction).text);
     } else if (isCreatedTaskReportAction(lastReportAction)) {
-        lastMessageTextFromReport = getTaskCreatedMessage(translate, lastReportAction, getReportOrDraftReport(lastReportAction?.childReportID));
+        // eslint-disable-next-line @typescript-eslint/no-deprecated
+        lastMessageTextFromReport = getTaskCreatedMessage(translateLocal, lastReportAction, getReportOrDraftReport(lastReportAction?.childReportID));
     } else if (
         isActionOfType(lastReportAction, CONST.REPORT.ACTIONS.TYPE.SUBMITTED) ||
         isActionOfType(lastReportAction, CONST.REPORT.ACTIONS.TYPE.SUBMITTED_AND_CLOSED) ||
@@ -724,29 +713,38 @@ function getLastMessageTextForReport({
         const isPendingAdd = lastReportAction.pendingAction === CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD;
 
         if (wasSubmittedViaHarvesting) {
-            lastMessageTextFromReport = Parser.htmlToText(translate('iou.automaticallySubmitted'));
+            // eslint-disable-next-line @typescript-eslint/no-deprecated
+            lastMessageTextFromReport = Parser.htmlToText(translateLocal('iou.automaticallySubmitted'));
         } else if (hasPendingDEWSubmit(reportMetadata, isDEWPolicy) && isPendingAdd) {
-            lastMessageTextFromReport = translate('iou.queuedToSubmitViaDEW');
+            // eslint-disable-next-line @typescript-eslint/no-deprecated
+            lastMessageTextFromReport = translateLocal('iou.queuedToSubmitViaDEW');
         } else {
-            lastMessageTextFromReport = translate('iou.submitted', {memo: getOriginalMessage(lastReportAction)?.message});
+            // eslint-disable-next-line @typescript-eslint/no-deprecated
+            lastMessageTextFromReport = translateLocal('iou.submitted', {memo: getOriginalMessage(lastReportAction)?.message});
         }
     } else if (isActionOfType(lastReportAction, CONST.REPORT.ACTIONS.TYPE.APPROVED)) {
         const {automaticAction} = getOriginalMessage(lastReportAction) ?? {};
         if (automaticAction) {
-            lastMessageTextFromReport = Parser.htmlToText(translate('iou.automaticallyApproved'));
+            // eslint-disable-next-line @typescript-eslint/no-deprecated
+            lastMessageTextFromReport = Parser.htmlToText(translateLocal('iou.automaticallyApproved'));
         } else {
-            lastMessageTextFromReport = translate('iou.approvedMessage');
+            // eslint-disable-next-line @typescript-eslint/no-deprecated
+            lastMessageTextFromReport = translateLocal('iou.approvedMessage');
         }
     } else if (isDynamicExternalWorkflowSubmitFailedAction(lastReportAction)) {
-        lastMessageTextFromReport = getOriginalMessage(lastReportAction)?.message ?? translate('iou.error.genericCreateFailureMessage');
+        // eslint-disable-next-line @typescript-eslint/no-deprecated
+        lastMessageTextFromReport = getOriginalMessage(lastReportAction)?.message ?? translateLocal('iou.error.genericCreateFailureMessage');
     } else if (isUnapprovedAction(lastReportAction)) {
-        lastMessageTextFromReport = translate('iou.unapproved');
+        // eslint-disable-next-line @typescript-eslint/no-deprecated
+        lastMessageTextFromReport = translateLocal('iou.unapproved');
     } else if (isActionOfType(lastReportAction, CONST.REPORT.ACTIONS.TYPE.FORWARDED)) {
         const {automaticAction} = getOriginalMessage(lastReportAction) ?? {};
         if (automaticAction) {
-            lastMessageTextFromReport = Parser.htmlToText(translate('iou.automaticallyForwarded'));
+            // eslint-disable-next-line @typescript-eslint/no-deprecated
+            lastMessageTextFromReport = Parser.htmlToText(translateLocal('iou.automaticallyForwarded'));
         } else {
-            lastMessageTextFromReport = translate('iou.forwarded');
+            // eslint-disable-next-line @typescript-eslint/no-deprecated
+            lastMessageTextFromReport = translateLocal('iou.forwarded');
         }
     } else if (lastReportAction?.actionName === CONST.REPORT.ACTIONS.TYPE.REJECTED) {
         lastMessageTextFromReport = getRejectedReportMessage();
@@ -759,65 +757,61 @@ function getLastMessageTextForReport({
     } else if (isActionableAddPaymentCard(lastReportAction)) {
         lastMessageTextFromReport = getReportActionMessageText(lastReportAction);
     } else if (lastReportAction?.actionName === CONST.REPORT.ACTIONS.TYPE.EXPORTED_TO_INTEGRATION) {
-        lastMessageTextFromReport = getExportIntegrationLastMessageText(translate, lastReportAction);
+        // eslint-disable-next-line @typescript-eslint/no-deprecated
+        lastMessageTextFromReport = getExportIntegrationLastMessageText(translateLocal, lastReportAction);
     } else if (lastReportAction?.actionName === CONST.REPORT.ACTIONS.TYPE.RECEIPT_SCAN_FAILED) {
-        lastMessageTextFromReport = translate('iou.receiptScanningFailed');
+        // eslint-disable-next-line @typescript-eslint/no-deprecated
+        lastMessageTextFromReport = translateLocal('iou.receiptScanningFailed');
     } else if (lastReportAction?.actionName && isOldDotReportAction(lastReportAction)) {
-        lastMessageTextFromReport = getMessageOfOldDotReportAction(translate, lastReportAction, false);
+        // eslint-disable-next-line @typescript-eslint/no-deprecated
+        lastMessageTextFromReport = getMessageOfOldDotReportAction(translateLocal, lastReportAction, false);
     } else if (isActionableJoinRequest(lastReportAction)) {
-        lastMessageTextFromReport = getJoinRequestMessage(translate, lastReportAction);
+        // eslint-disable-next-line @typescript-eslint/no-deprecated
+        lastMessageTextFromReport = getJoinRequestMessage(translateLocal, lastReportAction);
     } else if (lastReportAction?.actionName === CONST.REPORT.ACTIONS.TYPE.ROOM_CHANGE_LOG.LEAVE_ROOM) {
-        lastMessageTextFromReport = translate('report.actions.type.leftTheChat');
+        // eslint-disable-next-line @typescript-eslint/no-deprecated
+        lastMessageTextFromReport = translateLocal('report.actions.type.leftTheChat');
     } else if (lastReportAction?.actionName === CONST.REPORT.ACTIONS.TYPE.RESOLVED_DUPLICATES) {
-        lastMessageTextFromReport = translate('violations.resolvedDuplicates');
+        // eslint-disable-next-line @typescript-eslint/no-deprecated
+        lastMessageTextFromReport = translateLocal('violations.resolvedDuplicates');
     } else if (isActionOfType(lastReportAction, CONST.REPORT.ACTIONS.TYPE.ROOM_CHANGE_LOG.UPDATE_ROOM_DESCRIPTION)) {
-        lastMessageTextFromReport = Parser.htmlToText(getUpdateRoomDescriptionMessage(translate, lastReportAction));
+        // eslint-disable-next-line @typescript-eslint/no-deprecated
+        lastMessageTextFromReport = Parser.htmlToText(getUpdateRoomDescriptionMessage(translateLocal, lastReportAction));
     } else if (isActionOfType(lastReportAction, CONST.REPORT.ACTIONS.TYPE.ROOM_CHANGE_LOG.UPDATE_ROOM_AVATAR)) {
-        lastMessageTextFromReport = getRoomAvatarUpdatedMessage(translate, lastReportAction);
+        // eslint-disable-next-line @typescript-eslint/no-deprecated
+        lastMessageTextFromReport = getRoomAvatarUpdatedMessage(translateLocal, lastReportAction);
     } else if (isActionOfType(lastReportAction, CONST.REPORT.ACTIONS.TYPE.RETRACTED)) {
-        lastMessageTextFromReport = translate('iou.retracted');
+        // eslint-disable-next-line @typescript-eslint/no-deprecated
+        lastMessageTextFromReport = translateLocal('iou.retracted');
     } else if (isActionOfType(lastReportAction, CONST.REPORT.ACTIONS.TYPE.REOPENED)) {
-        lastMessageTextFromReport = translate('iou.reopened');
+        // eslint-disable-next-line @typescript-eslint/no-deprecated
+        lastMessageTextFromReport = translateLocal('iou.reopened');
     } else if (isActionOfType(lastReportAction, CONST.REPORT.ACTIONS.TYPE.CHANGE_POLICY)) {
         lastMessageTextFromReport = getPolicyChangeMessage(lastReportAction);
     } else if (isActionOfType(lastReportAction, CONST.REPORT.ACTIONS.TYPE.TRAVEL_UPDATE)) {
-        lastMessageTextFromReport = getTravelUpdateMessage(translate, lastReportAction);
+        // eslint-disable-next-line @typescript-eslint/no-deprecated
+        lastMessageTextFromReport = getTravelUpdateMessage(translateLocal, lastReportAction);
     } else if (isInviteOrRemovedAction(lastReportAction)) {
-        lastMessageTextFromReport = getRoomChangeLogMessage(translate, lastReportAction);
+        // eslint-disable-next-line @typescript-eslint/no-deprecated
+        lastMessageTextFromReport = getRoomChangeLogMessage(translateLocal, lastReportAction);
     } else if (isRenamedAction(lastReportAction)) {
-        lastMessageTextFromReport = getRenamedAction(translate, lastReportAction, isExpenseReport(report));
+        // eslint-disable-next-line @typescript-eslint/no-deprecated
+        lastMessageTextFromReport = getRenamedAction(translateLocal, lastReportAction, isExpenseReport(report));
     } else if (isActionOfType(lastReportAction, CONST.REPORT.ACTIONS.TYPE.DELETED_TRANSACTION)) {
         lastMessageTextFromReport = getDeletedTransactionMessage(lastReportAction);
     } else if (isActionOfType(lastReportAction, CONST.REPORT.ACTIONS.TYPE.TAKE_CONTROL) || isActionOfType(lastReportAction, CONST.REPORT.ACTIONS.TYPE.REROUTE)) {
-        lastMessageTextFromReport = Parser.htmlToText(getChangedApproverActionMessage(translate, lastReportAction));
+        // eslint-disable-next-line @typescript-eslint/no-deprecated
+        lastMessageTextFromReport = Parser.htmlToText(getChangedApproverActionMessage(translateLocal, lastReportAction));
     } else if (isMovedAction(lastReportAction)) {
         lastMessageTextFromReport = Parser.htmlToText(getMovedActionMessage(lastReportAction, report));
     } else if (isActionOfType(lastReportAction, CONST.REPORT.ACTIONS.TYPE.UNREPORTED_TRANSACTION)) {
         lastMessageTextFromReport = Parser.htmlToText(getUnreportedTransactionMessage(lastReportAction));
     } else if (isActionableMentionWhisper(lastReportAction)) {
-        lastMessageTextFromReport = Parser.htmlToText(getActionableMentionWhisperMessage(translate, lastReportAction));
-    } else if (isActionOfType(lastReportAction, CONST.REPORT.ACTIONS.TYPE.DYNAMIC_EXTERNAL_WORKFLOW_ROUTED)) {
-        lastMessageTextFromReport = getDynamicExternalWorkflowRoutedMessage(lastReportAction, translate);
-    }
-    if (isActionOfType(lastReportAction, CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_MAX_EXPENSE_AMOUNT)) {
-        // eslint-disable-next-line @typescript-eslint/no-deprecated
-        lastMessageTextFromReport = getPolicyChangeLogMaxExpenseAmountMessage(translateLocal, lastReportAction);
-    }
-    if (isActionOfType(lastReportAction, CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_MAX_EXPENSE_AGE)) {
-        // eslint-disable-next-line @typescript-eslint/no-deprecated
-        lastMessageTextFromReport = getPolicyChangeLogMaxExpenseAgeMessage(translateLocal, lastReportAction);
-    }
-    if (isActionOfType(lastReportAction, CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_ACH_ACCOUNT)) {
-        // eslint-disable-next-line @typescript-eslint/no-deprecated
-        lastMessageTextFromReport = getUpdateACHAccountMessage(translateLocal, lastReportAction);
-    }
-    if (isActionOfType(lastReportAction, CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_INVOICE_COMPANY_NAME)) {
         // eslint-disable-next-line @typescript-eslint/no-deprecated
-        lastMessageTextFromReport = getInvoiceCompanyNameUpdateMessage(translateLocal, lastReportAction);
-    }
-    if (isActionOfType(lastReportAction, CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_INVOICE_COMPANY_WEBSITE)) {
+        lastMessageTextFromReport = Parser.htmlToText(getActionableMentionWhisperMessage(translateLocal, lastReportAction));
+    } else if (isActionOfType(lastReportAction, CONST.REPORT.ACTIONS.TYPE.DYNAMIC_EXTERNAL_WORKFLOW_ROUTED)) {
         // eslint-disable-next-line @typescript-eslint/no-deprecated
-        lastMessageTextFromReport = getInvoiceCompanyWebsiteUpdateMessage(translateLocal, lastReportAction);
+        lastMessageTextFromReport = getDynamicExternalWorkflowRoutedMessage(lastReportAction, translateLocal);
     }
 
     // we do not want to show report closed in LHN for non archived report so use getReportLastMessage as fallback instead of lastMessageText from report
@@ -867,9 +861,6 @@ function createOption(
     report: OnyxInputOrEntry<Report>,
     config?: PreviewConfig,
     reportAttributesDerived?: ReportAttributesDerivedValue['reports'],
-    privateIsArchived?: string,
-    visibleReportActionsData: VisibleReportActionsDerivedValue = {},
-    translate?: LocalizedTranslate,
 ): SearchOptionData {
     const {showChatPreviewLine = false, forcePolicyNamePreview = false, showPersonalDetails = false, selected, isSelected, isDisabled} = config ?? {};
 
@@ -928,10 +919,10 @@ function createOption(
     result.participantsList = personalDetailList;
 
     if (report) {
-        const reportNameValuePairsForReport = allReportNameValuePairsOnyxConnect?.[`${ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS}${report.reportID}`];
+        const reportNameValuePairs = allReportNameValuePairs?.[`${ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS}${report.reportID}`];
 
         // Set properties that are used in SearchOption context
-        result.private_isArchived = privateIsArchived ?? reportNameValuePairsForReport?.private_isArchived;
+        result.private_isArchived = reportNameValuePairs?.private_isArchived;
         result.keyForList = String(report.reportID);
 
         // Type/category flags already set in initialization above, but update brickRoadIndicator
@@ -945,32 +936,14 @@ function createOption(
 
         // If displaying chat preview line is needed, let's overwrite the default alternate text
         const lastActorDetails = personalDetails?.[report?.lastActorAccountID ?? String(CONST.DEFAULT_NUMBER_ID)] ?? {};
-        // eslint-disable-next-line @typescript-eslint/no-deprecated
-        const translateFn = translate ?? translateLocal;
-        result.lastMessageText = getLastMessageTextForReport({
-            translate: translateFn,
-            report,
-            lastActorDetails,
-            isReportArchived: !!result.private_isArchived,
-            visibleReportActionsDataParam: visibleReportActionsData,
-        });
+        result.lastMessageText = getLastMessageTextForReport({report, lastActorDetails, isReportArchived: !!result.private_isArchived});
         result.alternateText =
             showPersonalDetails && personalDetail?.login
                 ? personalDetail.login
-                : getAlternateText(result, {showChatPreviewLine, forcePolicyNamePreview}, !!result.private_isArchived, lastActorDetails, visibleReportActionsData, translateFn);
+                : getAlternateText(result, {showChatPreviewLine, forcePolicyNamePreview}, !!result.private_isArchived, lastActorDetails);
 
         const personalDetailsForCompute: PersonalDetailsList | undefined = personalDetails ?? undefined;
-        const computedReportName = computeReportName(
-            report,
-            allReports,
-            allPolicies,
-            undefined,
-            undefined,
-            personalDetailsForCompute,
-            allReportActions,
-            currentUserAccountID,
-            result.private_isArchived,
-        );
+        const computedReportName = computeReportName(report, allReports, allPolicies, undefined, allReportNameValuePairs, personalDetailsForCompute, allReportActions);
         reportName = showPersonalDetails
             ? getDisplayNameForParticipant({accountID: accountIDs.at(0), formatPhoneNumber: formatPhoneNumberPhoneUtils}) || formatPhoneNumberPhoneUtils(personalDetail?.login ?? '')
             : computedReportName;
@@ -1012,14 +985,7 @@ function createOption(
 /**
  * Get the option for a given report.
  */
-function getReportOption(
-    participant: Participant,
-    privateIsArchived: string | undefined,
-    policy: OnyxEntry<Policy>,
-    reportAttributesDerived?: ReportAttributesDerivedValue['reports'],
-    reportDrafts?: OnyxCollection<Report>,
-    visibleReportActionsData: VisibleReportActionsDerivedValue = {},
-): OptionData {
+function getReportOption(participant: Participant, reportAttributesDerived?: ReportAttributesDerivedValue['reports'], reportDrafts?: OnyxCollection<Report>): OptionData {
     const report = getReportOrDraftReport(participant.reportID, undefined, undefined, reportDrafts);
     const visibleParticipantAccountIDs = getParticipantsAccountIDsForDisplay(report, true);
 
@@ -1032,8 +998,6 @@ function getReportOption(
             forcePolicyNamePreview: false,
         },
         reportAttributesDerived,
-        privateIsArchived,
-        visibleReportActionsData,
     );
 
     // Update text & alternateText because createOption returns workspace name only if report is owned by the user
@@ -1041,7 +1005,7 @@ function getReportOption(
         // eslint-disable-next-line @typescript-eslint/no-deprecated
         option.alternateText = translateLocal('reportActionsView.yourSpace');
     } else if (option.isInvoiceRoom) {
-        option.text = computeReportName(report, undefined, undefined, undefined, undefined, allPersonalDetails, undefined, currentUserAccountID, privateIsArchived);
+        option.text = computeReportName(report, undefined, undefined, undefined, allReportNameValuePairs, allPersonalDetails, undefined);
         // eslint-disable-next-line @typescript-eslint/no-deprecated
         option.alternateText = translateLocal('workspace.common.invoices');
     } else {
@@ -1050,6 +1014,7 @@ function getReportOption(
         option.alternateText = translateLocal('workspace.common.workspace');
 
         if (report?.policyID) {
+            const policy = allPolicies?.[`${ONYXKEYS.COLLECTION.POLICY}${report.policyID}`];
             const submitToAccountID = getSubmitToAccountID(policy, report);
             const submitsToAccountDetails = allPersonalDetails?.[submitToAccountID];
             const subtitle = submitsToAccountDetails?.displayName ?? submitsToAccountDetails?.login;
@@ -1070,27 +1035,18 @@ function getReportOption(
 /**
  * Get the display option for a given report.
  */
-function getReportDisplayOption(
-    report: OnyxEntry<Report>,
-    unknownUserDetails: OnyxEntry<Participant>,
-    personalDetails: OnyxEntry<PersonalDetailsList>,
-    privateIsArchived: string | undefined,
-    reportAttributesDerived?: ReportAttributesDerivedValue['reports'],
-    visibleReportActionsData: VisibleReportActionsDerivedValue = {},
-): OptionData {
+function getReportDisplayOption(report: OnyxEntry<Report>, unknownUserDetails: OnyxEntry<Participant>, reportAttributesDerived?: ReportAttributesDerivedValue['reports']): OptionData {
     const visibleParticipantAccountIDs = getParticipantsAccountIDsForDisplay(report, true);
 
     const option = createOption(
         visibleParticipantAccountIDs,
-        personalDetails ?? {},
+        allPersonalDetails ?? {},
         !isEmptyObject(report) ? report : undefined,
         {
             showChatPreviewLine: false,
             forcePolicyNamePreview: false,
         },
         reportAttributesDerived,
-        privateIsArchived,
-        visibleReportActionsData,
     );
 
     // Update text & alternateText because createOption returns workspace name only if report is owned by the user
@@ -1098,7 +1054,7 @@ function getReportDisplayOption(
         // eslint-disable-next-line @typescript-eslint/no-deprecated
         option.alternateText = translateLocal('reportActionsView.yourSpace');
     } else if (option.isInvoiceRoom) {
-        option.text = computeReportName(report, undefined, undefined, undefined, undefined, personalDetails, undefined, currentUserAccountID, privateIsArchived);
+        option.text = computeReportName(report, undefined, undefined, undefined, allReportNameValuePairs, allPersonalDetails, undefined);
         // eslint-disable-next-line @typescript-eslint/no-deprecated
         option.alternateText = translateLocal('workspace.common.invoices');
     } else if (unknownUserDetails) {
@@ -1119,11 +1075,7 @@ function getReportDisplayOption(
 /**
  * Get the option for a policy expense report.
  */
-function getPolicyExpenseReportOption(
-    participant: Participant | SearchOptionData,
-    reportAttributesDerived?: ReportAttributesDerivedValue['reports'],
-    visibleReportActionsData: VisibleReportActionsDerivedValue = {},
-): SearchOptionData {
+function getPolicyExpenseReportOption(participant: Participant | SearchOptionData, reportAttributesDerived?: ReportAttributesDerivedValue['reports']): SearchOptionData {
     const expenseReport = reportUtilsIsPolicyExpenseChat(participant) ? getReportOrDraftReport(participant.reportID) : null;
 
     const visibleParticipantAccountIDs = Object.entries(expenseReport?.participants ?? {})
@@ -1139,8 +1091,6 @@ function getPolicyExpenseReportOption(
             forcePolicyNamePreview: false,
         },
         reportAttributesDerived,
-        undefined,
-        visibleReportActionsData,
     );
 
     // Update text & alternateText because createOption returns workspace name only if report is owned by the user
@@ -1250,7 +1200,6 @@ function processReport(
     report: OnyxEntry<Report> | null,
     personalDetails: OnyxEntry<PersonalDetailsList>,
     reportAttributesDerived?: ReportAttributesDerivedValue['reports'],
-    visibleReportActionsData: VisibleReportActionsDerivedValue = {},
 ): {
     reportMapEntry?: [number, Report]; // The entry to add to reportMapForAccountIDs if applicable
     reportOption: SearchOption<Report> | null; // The report option to add to allReportOptions if applicable
@@ -1274,17 +1223,12 @@ function processReport(
         reportMapEntry,
         reportOption: {
             item: report,
-            ...createOption(accountIDs, personalDetails, report, undefined, reportAttributesDerived, undefined, visibleReportActionsData),
+            ...createOption(accountIDs, personalDetails, report, undefined, reportAttributesDerived),
         },
     };
 }
 
-function createOptionList(
-    personalDetails: OnyxEntry<PersonalDetailsList>,
-    reports?: OnyxCollection<Report>,
-    reportAttributesDerived?: ReportAttributesDerivedValue['reports'],
-    visibleReportActionsData: VisibleReportActionsDerivedValue = {},
-) {
+function createOptionList(personalDetails: OnyxEntry<PersonalDetailsList>, reports?: OnyxCollection<Report>, reportAttributesDerived?: ReportAttributesDerivedValue['reports']) {
     const span = Sentry.startInactiveSpan({name: 'createOptionList'});
 
     const reportMapForAccountIDs: Record<number, Report> = {};
@@ -1292,7 +1236,7 @@ function createOptionList(
 
     if (reports) {
         for (const report of Object.values(reports)) {
-            const {reportMapEntry, reportOption} = processReport(report, personalDetails, reportAttributesDerived, visibleReportActionsData);
+            const {reportMapEntry, reportOption} = processReport(report, personalDetails, reportAttributesDerived);
 
             if (reportMapEntry) {
                 const [accountID, reportValue] = reportMapEntry;
@@ -1315,8 +1259,6 @@ function createOptionList(
                 showPersonalDetails: true,
             },
             reportAttributesDerived,
-            undefined,
-            visibleReportActionsData,
         ),
     }));
 
@@ -1355,7 +1297,6 @@ function createFilteredOptionList(
         searchTerm?: string;
         betas?: OnyxEntry<Beta[]>;
     } = {},
-    visibleReportActionsData: VisibleReportActionsDerivedValue = {},
 ) {
     const {maxRecentReports = 500, includeP2P = true, searchTerm = ''} = options;
     const reportMapForAccountIDs: Record<number, Report> = {};
@@ -1405,7 +1346,7 @@ function createFilteredOptionList(
     // Step 5: Process the limited set of reports (performance optimization)
     const reportOptions: Array<SearchOption<Report>> = [];
     for (const report of limitedReports) {
-        const {reportMapEntry, reportOption} = processReport(report, personalDetails, reportAttributesDerived, visibleReportActionsData);
+        const {reportMapEntry, reportOption} = processReport(report, personalDetails, reportAttributesDerived);
 
         if (reportMapEntry) {
             const [accountID, reportValue] = reportMapEntry;
@@ -1435,7 +1376,7 @@ function createFilteredOptionList(
 
               return {
                   item: personalDetail,
-                  ...createOption([accountID], personalDetails, reportMapForAccountIDs[accountID], {showPersonalDetails: true}, reportAttributesDerived, undefined, visibleReportActionsData),
+                  ...createOption([accountID], personalDetails, reportMapForAccountIDs[accountID], {showPersonalDetails: true}, reportAttributesDerived),
               };
           })
         : [];
@@ -1446,18 +1387,12 @@ function createFilteredOptionList(
     };
 }
 
-function createOptionFromReport(
-    report: Report,
-    personalDetails: OnyxEntry<PersonalDetailsList>,
-    reportAttributesDerived?: ReportAttributesDerivedValue['reports'],
-    config?: PreviewConfig,
-    visibleReportActionsData: VisibleReportActionsDerivedValue = {},
-) {
+function createOptionFromReport(report: Report, personalDetails: OnyxEntry<PersonalDetailsList>, reportAttributesDerived?: ReportAttributesDerivedValue['reports'], config?: PreviewConfig) {
     const accountIDs = getParticipantsAccountIDsForDisplay(report);
 
     return {
         item: report,
-        ...createOption(accountIDs, personalDetails, report, config, reportAttributesDerived, undefined, visibleReportActionsData),
+        ...createOption(accountIDs, personalDetails, report, config, reportAttributesDerived),
     };
 }
 
@@ -1512,7 +1447,7 @@ function optionsOrderBy<T = SearchOptionData>(options: T[], comparator: (option:
             if (!peekedValue) {
                 throw new Error('Heap is empty, cannot peek value');
             }
-            if (reversed ? comparator(option) < comparator(peekedValue) : comparator(option) > comparator(peekedValue)) {
+            if (comparator(option) > comparator(peekedValue)) {
                 heap.pop();
                 heap.push(option);
             }
@@ -1742,8 +1677,7 @@ function getUserToInviteOption({
     shouldAcceptName = false,
     countryCode = CONST.DEFAULT_COUNTRY_CODE,
     loginList = {},
-    visibleReportActionsData = {},
-}: GetUserToInviteConfig & {visibleReportActionsData?: VisibleReportActionsDerivedValue}): SearchOptionData | null {
+}: GetUserToInviteConfig): SearchOptionData | null {
     if (!searchValue) {
         return null;
     }
@@ -1771,17 +1705,9 @@ function getUserToInviteOption({
             login: searchValue,
         },
     };
-    const userToInvite = createOption(
-        [optimisticAccountID],
-        personalDetailsExtended,
-        null,
-        {
-            showChatPreviewLine,
-        },
-        undefined,
-        undefined,
-        visibleReportActionsData,
-    );
+    const userToInvite = createOption([optimisticAccountID], personalDetailsExtended, null, {
+        showChatPreviewLine,
+    });
     userToInvite.isOptimisticAccount = true;
     userToInvite.login = searchValue;
     // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
@@ -1904,7 +1830,7 @@ function getUserToInviteContactOption({
     return userToInvite;
 }
 
-function isValidReport(option: SearchOption<Report>, policy: OnyxEntry<Policy>, config: IsValidReportsConfig, draftComment: string | undefined): boolean {
+function isValidReport(option: SearchOption<Report>, config: IsValidReportsConfig, draftComment: string | undefined): boolean {
     const {
         betas = [],
         includeMultipleParticipantReports = false,
@@ -1957,7 +1883,7 @@ function isValidReport(option: SearchOption<Report>, policy: OnyxEntry<Policy>,
     const isChatRoom = option.isChatRoom;
     const accountIDs = getParticipantsAccountIDsForDisplay(option.item);
 
-    if (excludeNonAdminWorkspaces && !isPolicyAdmin(policy)) {
+    if (excludeNonAdminWorkspaces && !isPolicyAdmin(option.policyID, policies)) {
         return false;
     }
 
@@ -2009,7 +1935,8 @@ function isValidReport(option: SearchOption<Report>, policy: OnyxEntry<Policy>,
     const isCurrentUserOwnedPolicyExpenseChatThatCouldShow =
         option.isPolicyExpenseChat && option.ownerAccountID === currentUserAccountID && includeOwnedWorkspaceChats && !option.private_isArchived;
 
-    const shouldShowInvoiceRoom = includeInvoiceRooms && isInvoiceRoom(option.item) && isPolicyAdmin(policy) && !option.private_isArchived && canSendInvoiceFromWorkspace(option.policyID);
+    const shouldShowInvoiceRoom =
+        includeInvoiceRooms && isInvoiceRoom(option.item) && isPolicyAdmin(option.policyID, policies) && !option.private_isArchived && canSendInvoiceFromWorkspace(option.policyID);
 
     /*
     Exclude the report option if it doesn't meet any of the following conditions:
@@ -2028,7 +1955,8 @@ function isValidReport(option: SearchOption<Report>, policy: OnyxEntry<Policy>,
     }
 
     if (action === CONST.IOU.ACTION.CATEGORIZE) {
-        if (!policy?.areCategoriesEnabled) {
+        const reportPolicy = allPolicies?.[`${ONYXKEYS.COLLECTION.POLICY}${option.policyID}`];
+        if (!reportPolicy?.areCategoriesEnabled) {
             return false;
         }
     }
@@ -2044,12 +1972,7 @@ function isValidReport(option: SearchOption<Report>, policy: OnyxEntry<Policy>,
  * @param config - Configuration object specifying display preferences and filtering criteria
  * @returns Array of enriched and filtered report options ready for UI display
  */
-function prepareReportOptionsForDisplay(
-    options: Array<SearchOption<Report>>,
-    policiesCollection: OnyxCollection<Policy>,
-    config: GetValidReportsConfig,
-    visibleReportActionsData: VisibleReportActionsDerivedValue = {},
-): Array<SearchOption<Report>> {
+function prepareReportOptionsForDisplay(options: Array<SearchOption<Report>>, config: GetValidReportsConfig): Array<SearchOption<Report>> {
     const {
         showChatPreviewLine = false,
         forcePolicyNamePreview = false,
@@ -2078,7 +2001,7 @@ function prepareReportOptionsForDisplay(
          * By default, generated options does not have the chat preview line enabled.
          * If showChatPreviewLine or forcePolicyNamePreview are true, let's generate and overwrite the alternate text.
          */
-        const alternateText = getAlternateText(option, {showChatPreviewLine, forcePolicyNamePreview}, !!option.private_isArchived, null, visibleReportActionsData);
+        const alternateText = getAlternateText(option, {showChatPreviewLine, forcePolicyNamePreview}, !!option.private_isArchived);
         const isSelected = isReportSelected(option, selectedOptions);
 
         let isOptionUnread = option.isUnread;
@@ -2129,7 +2052,7 @@ function prepareReportOptionsForDisplay(
             newReportOption.alternateText = translateLocal('workspace.common.workspace');
 
             if (report?.policyID) {
-                const policy = policiesCollection?.[`${ONYXKEYS.COLLECTION.POLICY}${report.policyID}`];
+                const policy = allPolicies?.[`${ONYXKEYS.COLLECTION.POLICY}${report.policyID}`];
                 const submitToAccountID = getSubmitToAccountID(policy, report);
                 const submitsToAccountDetails = allPersonalDetails?.[submitToAccountID];
                 const subtitle = submitsToAccountDetails?.displayName ?? submitsToAccountDetails?.login;
@@ -2191,7 +2114,6 @@ function getRestrictedLogins(
  */
 function getValidOptions(
     options: OptionList,
-    policiesCollection: OnyxCollection<Policy>,
     draftComments: OnyxCollection<string> | undefined,
     nvpDismissedProductTraining: OnyxEntry<DismissedProductTraining>,
     loginList: OnyxEntry<Login>,
@@ -2213,7 +2135,6 @@ function getValidOptions(
         ...config
     }: GetOptionsConfig = {},
     countryCode: number = CONST.DEFAULT_COUNTRY_CODE,
-    visibleReportActionsData: VisibleReportActionsDerivedValue = {},
 ): Options {
     const restrictedLogins = getRestrictedLogins(config, options, canShowManagerMcTest, nvpDismissedProductTraining);
 
@@ -2262,7 +2183,6 @@ function getValidOptions(
         };
 
         const filteringFunction = (report: SearchOption<Report>) => {
-            const policy = policiesCollection?.[`${ONYXKEYS.COLLECTION.POLICY}${report.policyID}`];
             if (!isSearchTermsFound(report)) {
                 return false;
             }
@@ -2271,7 +2191,6 @@ function getValidOptions(
 
             return isValidReport(
                 report,
-                policy,
                 {
                     ...getValidReportsConfig,
                     includeP2P,
@@ -2286,39 +2205,29 @@ function getValidOptions(
         [selfDMChats, workspaceChats, recentReportOptions] = optionsOrderAndGroupBy([isSelfDMChat, isWorkspaceChat], options.reports, recentReportComparator, maxElements, filteringFunction);
 
         if (selfDMChats.length > 0) {
-            selfDMChat = prepareReportOptionsForDisplay(
-                selfDMChats,
-                policiesCollection,
-                {
-                    ...getValidReportsConfig,
-                    selectedOptions,
-                    shouldBoldTitleByDefault,
-                    shouldSeparateSelfDMChat,
-                    shouldSeparateWorkspaceChat,
-                    shouldShowGBR,
-                },
-                visibleReportActionsData,
-            ).at(0);
-        }
-
-        if (maxRecentReportElements) {
-            recentReportOptions = recentReportOptions.splice(0, maxRecentReportElements);
-        }
-        recentReportOptions = prepareReportOptionsForDisplay(
-            recentReportOptions,
-            policiesCollection,
-            {
+            selfDMChat = prepareReportOptionsForDisplay(selfDMChats, {
                 ...getValidReportsConfig,
                 selectedOptions,
                 shouldBoldTitleByDefault,
                 shouldSeparateSelfDMChat,
                 shouldSeparateWorkspaceChat,
                 shouldShowGBR,
-            },
-            visibleReportActionsData,
-        );
+            }).at(0);
+        }
+
+        if (maxRecentReportElements) {
+            recentReportOptions = recentReportOptions.splice(0, maxRecentReportElements);
+        }
+        recentReportOptions = prepareReportOptionsForDisplay(recentReportOptions, {
+            ...getValidReportsConfig,
+            selectedOptions,
+            shouldBoldTitleByDefault,
+            shouldSeparateSelfDMChat,
+            shouldSeparateWorkspaceChat,
+            shouldShowGBR,
+        });
 
-        workspaceChats = prepareReportOptionsForDisplay(workspaceChats, policiesCollection, {
+        workspaceChats = prepareReportOptionsForDisplay(workspaceChats, {
             ...getValidReportsConfig,
             selectedOptions,
             shouldBoldTitleByDefault,
@@ -2440,7 +2349,6 @@ type SearchOptionsConfig = {
     shouldShowGBR?: boolean;
     shouldUnreadBeBold?: boolean;
     loginList: OnyxEntry<Login>;
-    visibleReportActionsData?: VisibleReportActionsDerivedValue;
 };
 
 /**
@@ -2462,14 +2370,12 @@ function getSearchOptions({
     shouldShowGBR = false,
     shouldUnreadBeBold = false,
     loginList,
-    visibleReportActionsData = {},
 }: SearchOptionsConfig): Options {
     Timing.start(CONST.TIMING.LOAD_SEARCH_OPTIONS);
     Performance.markStart(CONST.TIMING.LOAD_SEARCH_OPTIONS);
 
     const optionList = getValidOptions(
         options,
-        allPolicies,
         draftComments,
         nvpDismissedProductTraining,
         loginList,
@@ -2495,7 +2401,6 @@ function getSearchOptions({
             shouldUnreadBeBold,
         },
         countryCode,
-        visibleReportActionsData,
     );
 
     Timing.end(CONST.TIMING.LOAD_SEARCH_OPTIONS);
@@ -2593,11 +2498,9 @@ function getMemberInviteOptions(
     excludeLogins: Record<string, boolean> = {},
     includeSelectedOptions = false,
     countryCode: number = CONST.DEFAULT_COUNTRY_CODE,
-    visibleReportActionsData: VisibleReportActionsDerivedValue = {},
 ): Options {
     return getValidOptions(
         {personalDetails, reports: []},
-        allPolicies,
         undefined,
         nvpDismissedProductTraining,
         loginList,
@@ -2611,7 +2514,6 @@ function getMemberInviteOptions(
             maxElements: undefined,
         },
         countryCode,
-        visibleReportActionsData,
     );
 }
 
diff --git a/src/libs/PersonalDetailsUtils.ts b/src/libs/PersonalDetailsUtils.ts
index c068151e09ff..a60a9ef0079b 100644
--- a/src/libs/PersonalDetailsUtils.ts
+++ b/src/libs/PersonalDetailsUtils.ts
@@ -215,7 +215,7 @@ function getPersonalDetailsOnyxDataForOptimisticUsers(
     newLogins: string[],
     newAccountIDs: number[],
     formatPhoneNumber: LocaleContextProps['formatPhoneNumber'],
-): OnyxData<typeof ONYXKEYS.PERSONAL_DETAILS_LIST> {
+): Required<Pick<OnyxData, 'optimisticData' | 'finallyData'>> {
     const personalDetailsNew: PersonalDetailsList = {};
     const personalDetailsCleanup: PersonalDetailsList = {};
 
diff --git a/src/libs/PolicyDistanceRatesUtils.ts b/src/libs/PolicyDistanceRatesUtils.ts
index 056e4923d8e1..b4f43be51b9b 100644
--- a/src/libs/PolicyDistanceRatesUtils.ts
+++ b/src/libs/PolicyDistanceRatesUtils.ts
@@ -61,12 +61,7 @@ type PolicyDistanceRateUpdateField = keyof Pick<Rate, 'name' | 'rate'> | keyof T
  * @param fieldName - The field name being updated
  * @returns Object containing optimisticData, successData, and failureData arrays
  */
-function buildOnyxDataForPolicyDistanceRateUpdates(
-    policyID: string,
-    customUnit: CustomUnit,
-    customUnitRates: Rate[],
-    fieldName: PolicyDistanceRateUpdateField,
-): OnyxData<typeof ONYXKEYS.COLLECTION.POLICY> {
+function buildOnyxDataForPolicyDistanceRateUpdates(policyID: string, customUnit: CustomUnit, customUnitRates: Rate[], fieldName: PolicyDistanceRateUpdateField): OnyxData {
     const currentRates = customUnit.rates;
     const optimisticRates: Record<string, NullishDeep<Rate>> = {};
     const successRates: Record<string, NullishDeep<Rate>> = {};
diff --git a/src/libs/PolicyUtils.ts b/src/libs/PolicyUtils.ts
index 8ab0e8107bea..203735d086d5 100644
--- a/src/libs/PolicyUtils.ts
+++ b/src/libs/PolicyUtils.ts
@@ -536,27 +536,6 @@ function getTagLists(policyTagList: OnyxEntry<PolicyTagLists>): Array<ValueOf<Po
         .sort((tagA, tagB) => tagA.orderWeight - tagB.orderWeight);
 }
 
-/**
- * Checks if a policy has any tags
- */
-function hasTags(policyTagList: OnyxEntry<PolicyTagLists>): boolean {
-    const tagLists = getTagLists(policyTagList);
-    return tagLists.some((tagList) => Object.keys(tagList.tags ?? {}).length > 0);
-}
-
-/**
- * Checks if a policy has any custom categories (categories not in the default list)
- */
-function hasCustomCategories(policyCategories: OnyxEntry<PolicyCategories>): boolean {
-    if (!policyCategories) {
-        return false;
-    }
-
-    const defaultCategoryNames = new Set<string>(Object.values(CONST.POLICY.DEFAULT_CATEGORIES));
-
-    return Object.values(policyCategories).some((category) => category && category.pendingAction !== CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE && !defaultCategoryNames.has(category.name));
-}
-
 /**
  * Gets a tag list of a policy by a tag index
  */
@@ -687,19 +666,13 @@ function isCollectPolicy(policy: OnyxEntry<Policy>): boolean {
     return policy?.type === CONST.POLICY.TYPE.TEAM;
 }
 
-function isTaxTrackingEnabled(
-    isPolicyExpenseChatOrUnreportedExpense: boolean,
-    policy: OnyxEntry<Policy>,
-    isDistanceRequest: boolean,
-    isPerDiemRequest = false,
-    isTimeRequest = false,
-): boolean {
+function isTaxTrackingEnabled(isPolicyExpenseChat: boolean, policy: OnyxEntry<Policy>, isDistanceRequest: boolean, isPerDiemRequest = false, isTimeRequest = false): boolean {
     if (isPerDiemRequest || isTimeRequest) {
         return false;
     }
     const distanceUnit = getDistanceRateCustomUnit(policy);
     const customUnitID = distanceUnit?.customUnitID ?? CONST.DEFAULT_NUMBER_ID;
-    const isPolicyTaxTrackingEnabled = isPolicyExpenseChatOrUnreportedExpense && policy?.tax?.trackingEnabled;
+    const isPolicyTaxTrackingEnabled = isPolicyExpenseChat && policy?.tax?.trackingEnabled;
     const isTaxEnabledForDistance = isPolicyTaxTrackingEnabled && !!customUnitID && policy?.customUnits?.[customUnitID]?.attributes?.taxEnabled;
 
     return !!(isDistanceRequest ? isTaxEnabledForDistance : isPolicyTaxTrackingEnabled);
@@ -812,7 +785,7 @@ function getAllTaxRatesNamesAndKeys(policies: OnyxCollection<Policy>): Record<st
             continue;
         }
 
-        for (const [taxRateKey, taxRate] of Object.entries(policy?.taxRates?.taxes ?? {})) {
+        for (const [taxRateKey, taxRate] of Object.entries(policy?.taxRates?.taxes)) {
             if (!allTaxRates[taxRate.name]) {
                 allTaxRates[taxRate.name] = [taxRateKey];
                 continue;
@@ -827,25 +800,6 @@ function getAllTaxRatesNamesAndKeys(policies: OnyxCollection<Policy>): Record<st
     return allTaxRates;
 }
 
-/** Get a tax rate object built like Record<TaxID, TaxRate> */
-function getAllTaxRatesNamesAndValues(policies: OnyxCollection<Policy>): Record<string, TaxRate> {
-    const allTaxRates: Record<string, TaxRate> = {};
-
-    for (const policy of Object.values(policies ?? {})) {
-        if (!policy?.taxRates?.taxes) {
-            continue;
-        }
-
-        for (const [taxRateKey, taxRate] of Object.entries(policy?.taxRates?.taxes ?? {})) {
-            if (!allTaxRates[taxRateKey]) {
-                allTaxRates[taxRateKey] = taxRate;
-            }
-        }
-    }
-
-    return allTaxRates;
-}
-
 /**
  * Whether the tax rate can be deleted and disabled
  */
@@ -902,8 +856,7 @@ function getRuleApprovers(policy: OnyxEntry<Policy>, expenseReport: OnyxEntry<Re
         }
     }
 
-    // Return the unique approvers list
-    return [...new Set([...categoryApprovers, ...tagApprovers])];
+    return [...categoryApprovers, ...tagApprovers];
 }
 
 function getManagerAccountID(policy: OnyxEntry<Policy>, expenseReport: OnyxEntry<Report> | {ownerAccountID: number}) {
@@ -931,7 +884,7 @@ function getSubmitToAccountID(policy: OnyxEntry<Policy>, expenseReport: OnyxEntr
     const ruleApprovers = getRuleApprovers(policy, expenseReport);
     const employeeAccountID = expenseReport?.ownerAccountID ?? CONST.DEFAULT_NUMBER_ID;
     const employeeLogin = getLoginsByAccountIDs([employeeAccountID]).at(0) ?? '';
-    if (ruleApprovers.length > 0 && ruleApprovers.at(0) === employeeLogin) {
+    if (ruleApprovers.length > 0 && ruleApprovers.at(0) === employeeLogin && policy?.preventSelfApproval) {
         ruleApprovers.shift();
     }
     if (ruleApprovers.length > 0 && !isSubmitAndClose(policy)) {
@@ -1303,7 +1256,7 @@ function getNetSuiteImportCustomFieldLabel(
     const importedTypes = Array.from(mappingSet)
         .sort((a, b) => localeCompare(b, a))
         .map((mapping) => translate(`workspace.netsuite.import.importTypes.${mapping !== '' ? mapping : 'TAG'}.label`).toLowerCase());
-    return translate(`workspace.netsuite.import.importCustomFields.label`, importedTypes);
+    return translate(`workspace.netsuite.import.importCustomFields.label`, {importedTypes});
 }
 
 function isNetSuiteCustomSegmentRecord(customField: NetSuiteCustomList | NetSuiteCustomSegment): boolean {
@@ -1756,8 +1709,6 @@ export {
     getTagListByOrderWeight,
     getTagListName,
     getTagLists,
-    hasTags,
-    hasCustomCategories,
     getTaxByID,
     getUnitRateValue,
     getRateDisplayValue,
@@ -1858,7 +1809,6 @@ export {
     getForwardsToAccount,
     getSubmitToAccountID,
     getAllTaxRatesNamesAndKeys as getAllTaxRates,
-    getAllTaxRatesNamesAndValues,
     getTagNamesFromTagsLists,
     getTagApproverRule,
     getDomainNameForPolicy,
diff --git a/src/libs/ReceiptUploadRetryHandler/handleFileRetry.ts b/src/libs/ReceiptUploadRetryHandler/handleFileRetry.ts
index a8e7dae2cc1b..4bf3a4777edf 100644
--- a/src/libs/ReceiptUploadRetryHandler/handleFileRetry.ts
+++ b/src/libs/ReceiptUploadRetryHandler/handleFileRetry.ts
@@ -1,5 +1,4 @@
 import * as IOU from '@userActions/IOU';
-import {startSplitBill} from '@userActions/IOU/Split';
 import CONST from '@src/CONST';
 import type {ReceiptError} from '@src/types/onyx/Transaction';
 
@@ -22,7 +21,7 @@ export default function handleFileRetry(message: ReceiptError, file: File, dismi
             const startSplitBillParams = {...retryParams} as IOU.StartSplitBilActionParams;
             startSplitBillParams.receipt = file;
             startSplitBillParams.shouldPlaySound = false;
-            startSplitBill(startSplitBillParams);
+            IOU.startSplitBill(startSplitBillParams);
             break;
         }
         case CONST.IOU.ACTION_PARAMS.TRACK_EXPENSE: {
diff --git a/src/libs/ReportActionComposeFocusManager.ts b/src/libs/ReportActionComposeFocusManager.ts
index 435468cb8a0e..6f9194ac6065 100644
--- a/src/libs/ReportActionComposeFocusManager.ts
+++ b/src/libs/ReportActionComposeFocusManager.ts
@@ -42,7 +42,7 @@ function focus(shouldFocusForNonBlurInputOnTapOutside?: boolean) {
     /** Do not trigger the refocusing when the active route is not the report screen */
     const navigationState = navigationRef.getState();
     const focusedRoute = findFocusedRoute(navigationState);
-    if (!navigationState || (!isReportOpenInRHP(navigationState) && focusedRoute?.name !== SCREENS.REPORT)) {
+    if (!navigationState || (!isReportOpenInRHP(navigationState) && focusedRoute?.name !== SCREENS.REPORT && focusedRoute?.name !== SCREENS.SEARCH.MONEY_REQUEST_REPORT)) {
         return;
     }
 
diff --git a/src/libs/ReportActionsUtils.ts b/src/libs/ReportActionsUtils.ts
index e5a07cba6a7b..8c39e5eacc94 100644
--- a/src/libs/ReportActionsUtils.ts
+++ b/src/libs/ReportActionsUtils.ts
@@ -1,4 +1,3 @@
-/* eslint-disable max-lines */
 import {format} from 'date-fns';
 import {fastMerge, Str} from 'expensify-common';
 import clone from 'lodash/clone';
@@ -14,17 +13,7 @@ import IntlStore from '@src/languages/IntlStore';
 import type {TranslationPaths} from '@src/languages/types';
 import ONYXKEYS from '@src/ONYXKEYS';
 import ROUTES from '@src/ROUTES';
-import type {
-    Card,
-    OnyxInputOrEntry,
-    OriginalMessageIOU,
-    PersonalDetails,
-    Policy,
-    PrivatePersonalDetails,
-    ReportMetadata,
-    ReportNameValuePairs,
-    VisibleReportActionsDerivedValue,
-} from '@src/types/onyx';
+import type {Card, OnyxInputOrEntry, OriginalMessageIOU, PersonalDetails, Policy, PrivatePersonalDetails, ReportMetadata, ReportNameValuePairs} from '@src/types/onyx';
 import type {
     JoinWorkspaceResolution,
     OriginalMessageChangeLog,
@@ -224,7 +213,7 @@ function getHtmlWithAttachmentID(html: string, reportActionID: string | undefine
 }
 
 function getReportActionMessage(reportAction: PartialReportAction) {
-    return Array.isArray(reportAction?.message) ? reportAction?.message.at(0) : reportAction?.message;
+    return Array.isArray(reportAction?.message) ? reportAction.message.at(0) : reportAction?.message;
 }
 
 function isDeletedParentAction(reportAction: OnyxInputOrEntry<ReportAction>): boolean {
@@ -389,7 +378,7 @@ function getOriginalMessage<T extends ReportActionName>(reportAction: OnyxInputO
         return reportAction?.message ?? reportAction?.originalMessage;
     }
     // eslint-disable-next-line @typescript-eslint/no-deprecated
-    return reportAction?.originalMessage;
+    return reportAction.originalMessage;
 }
 
 function getMarkedReimbursedMessage(reportAction: OnyxInputOrEntry<ReportAction>): string {
@@ -1148,61 +1137,6 @@ function shouldReportActionBeVisibleAsLastAction(reportAction: OnyxInputOrEntry<
     );
 }
 
-/**
- * Checks if a report action is visible using the pre-computed derived value when available,
- * falling back to runtime calculation if not.
- */
-function isReportActionVisible(
-    reportAction: OnyxEntry<ReportAction>,
-    reportID: string,
-    canUserPerformWriteAction?: boolean,
-    visibleReportActions?: VisibleReportActionsDerivedValue,
-): boolean {
-    if (!reportAction?.reportActionID) {
-        return false;
-    }
-    if (visibleReportActions) {
-        const staticVisibility = visibleReportActions[reportID]?.[reportAction.reportActionID] ?? true;
-        if (!staticVisibility) {
-            return false;
-        }
-        if (!canUserPerformWriteAction && isActionableWhisperRequiringWritePermission(reportAction)) {
-            return false;
-        }
-        return true;
-    }
-    return shouldReportActionBeVisible(reportAction, reportAction.reportActionID, canUserPerformWriteAction);
-}
-
-/**
- * Checks if a report action is visible as last action using the pre-computed derived value when available,
- * falling back to runtime calculation if not.
- */
-function isReportActionVisibleAsLastAction(
-    reportAction: OnyxInputOrEntry<ReportAction>,
-    canUserPerformWriteAction?: boolean,
-    visibleReportActions?: VisibleReportActionsDerivedValue,
-): boolean {
-    if (!reportAction) {
-        return false;
-    }
-
-    if (Object.keys(reportAction.errors ?? {}).length > 0) {
-        return false;
-    }
-
-    const reportID = reportAction.reportID;
-    if (!reportID) {
-        return false;
-    }
-
-    return (
-        isReportActionVisible(reportAction, reportID, canUserPerformWriteAction, visibleReportActions) &&
-        (!(isWhisperAction(reportAction) && !isReportPreviewAction(reportAction) && !isMoneyRequestAction(reportAction)) || isActionableMentionWhisper(reportAction)) &&
-        !(isDeletedAction(reportAction) && !isDeletedParentAction(reportAction) && !isPendingHide(reportAction))
-    );
-}
-
 /**
  * For policy change logs, report URLs are generated in the server,
  * which includes a baseURL placeholder that's replaced in the client.
@@ -1234,7 +1168,6 @@ function getLastVisibleAction(
     canUserPerformWriteAction?: boolean,
     actionsToMerge: Record<string, NullishDeep<ReportAction> | null> = {},
     reportActionsParam: OnyxCollection<ReportActions> = allReportActions,
-    visibleReportActionsData?: VisibleReportActionsDerivedValue,
 ): OnyxEntry<ReportAction> {
     let reportActions: Array<ReportAction | null | undefined> = [];
     if (!isEmpty(actionsToMerge)) {
@@ -1242,17 +1175,9 @@ function getLastVisibleAction(
             ReportAction | null | undefined
         >;
     } else {
-        reportActions = Object.values(reportActionsParam?.[`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${reportID}`] ?? {});
+        reportActions = Object.values(allReportActions?.[`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${reportID}`] ?? {});
     }
-    const reportActionsWithReportID = reportActions.map((action) => {
-        if (action && !action.reportID && reportID) {
-            return {...action, reportID};
-        }
-        return action;
-    });
-    const visibleReportActions = reportActionsWithReportID.filter((action): action is ReportAction =>
-        isReportActionVisibleAsLastAction(action, canUserPerformWriteAction, visibleReportActionsData),
-    );
+    const visibleReportActions = reportActions.filter((action): action is ReportAction => shouldReportActionBeVisibleAsLastAction(action, canUserPerformWriteAction));
     const sortedReportActions = getSortedReportActions(visibleReportActions, true);
     if (sortedReportActions.length === 0) {
         return undefined;
@@ -1280,9 +1205,8 @@ function getLastVisibleMessage(
     canUserPerformWriteAction?: boolean,
     actionsToMerge: Record<string, NullishDeep<ReportAction> | null> = {},
     reportAction: OnyxInputOrEntry<ReportAction> | undefined = undefined,
-    visibleReportActionsData?: VisibleReportActionsDerivedValue,
 ): LastVisibleMessage {
-    const lastVisibleAction = reportAction ?? getLastVisibleAction(reportID, canUserPerformWriteAction, actionsToMerge, undefined, visibleReportActionsData);
+    const lastVisibleAction = reportAction ?? getLastVisibleAction(reportID, canUserPerformWriteAction, actionsToMerge);
     const message = getReportActionMessage(lastVisibleAction);
 
     if (message && isReportMessageAttachment(message)) {
@@ -1384,7 +1308,6 @@ function getSortedReportActionsForDisplay(
     reportActions: OnyxEntry<ReportActions> | ReportAction[],
     canUserPerformWriteAction?: boolean,
     shouldIncludeInvisibleActions = false,
-    visibleReportActionsData?: VisibleReportActionsDerivedValue,
 ): ReportAction[] {
     let filteredReportActions: ReportAction[] = [];
     if (!reportActions) {
@@ -1395,13 +1318,7 @@ function getSortedReportActionsForDisplay(
         filteredReportActions = Object.values(reportActions).filter(Boolean);
     } else {
         filteredReportActions = Object.entries(reportActions)
-            .filter(([, reportAction]) => {
-                const reportID = reportAction?.reportID;
-                if (!reportID) {
-                    return false;
-                }
-                return isReportActionVisible(reportAction, reportID, canUserPerformWriteAction, visibleReportActionsData);
-            })
+            .filter(([key, reportAction]) => shouldReportActionBeVisible(reportAction, key, canUserPerformWriteAction))
             .map(([, reportAction]) => reportAction);
     }
 
@@ -1700,14 +1617,9 @@ function getOneTransactionThreadReportID(...args: Parameters<typeof getOneTransa
  * When we delete certain reports, we want to check whether there are any visible actions left to display.
  * If there are no visible actions left (including system messages), we can hide the report from view entirely
  */
-function doesReportHaveVisibleActions(
-    reportID: string,
-    canUserPerformWriteAction?: boolean,
-    actionsToMerge: ReportActions = {},
-    visibleReportActionsData?: VisibleReportActionsDerivedValue,
-): boolean {
+function doesReportHaveVisibleActions(reportID: string, canUserPerformWriteAction?: boolean, actionsToMerge: ReportActions = {}): boolean {
     const reportActions = Object.values(fastMerge(allReportActions?.[`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${reportID}`] ?? {}, actionsToMerge, true));
-    const visibleReportActions = Object.values(reportActions ?? {}).filter((action) => isReportActionVisibleAsLastAction(action, canUserPerformWriteAction, visibleReportActionsData));
+    const visibleReportActions = Object.values(reportActions ?? {}).filter((action) => shouldReportActionBeVisibleAsLastAction(action, canUserPerformWriteAction));
 
     // Exclude the task system message and the created message
     const visibleReportActionsWithoutTaskSystemMessage = visibleReportActions.filter((action) => !isTaskAction(action) && !isCreatedAction(action));
@@ -1870,7 +1782,7 @@ function getMessageOfOldDotLegacyAction(legacyAction: PartialReportAction) {
     if (!Array.isArray(legacyAction?.message)) {
         return getReportActionText(legacyAction);
     }
-    if (legacyAction?.message.length !== 0) {
+    if (legacyAction.message.length !== 0) {
         // Sometime html can be an empty string
         // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
         return legacyAction?.message?.map((element) => getTextFromHtml(element?.html || element?.text)).join('') ?? '';
@@ -1950,23 +1862,37 @@ function getTravelUpdateMessage(
 
     switch (details?.operation) {
         case CONST.TRAVEL.UPDATE_OPERATION_TYPE.BOOKING_TICKETED:
-            return translate(
-                'travel.updates.bookingTicketed',
-                details.route?.airlineCode ?? '',
-                details.start.shortName ?? '',
-                details.end?.shortName ?? '',
-                formattedStartDate,
-                details.confirmations?.at(0)?.value,
-            );
+            return translate('travel.updates.bookingTicketed', {
+                airlineCode: details.route?.airlineCode ?? '',
+                origin: details.start.shortName ?? '',
+                destination: details.end?.shortName ?? '',
+                startDate: formattedStartDate,
+                confirmationID: details.confirmations?.at(0)?.value,
+            });
 
         case CONST.TRAVEL.UPDATE_OPERATION_TYPE.TICKET_VOIDED:
-            return translate('travel.updates.ticketVoided', details.route?.airlineCode ?? '', details.start.shortName ?? '', details.end?.shortName ?? '', formattedStartDate);
+            return translate('travel.updates.ticketVoided', {
+                airlineCode: details.route?.airlineCode ?? '',
+                origin: details.start.shortName ?? '',
+                destination: details.end?.shortName ?? '',
+                startDate: formattedStartDate,
+            });
 
         case CONST.TRAVEL.UPDATE_OPERATION_TYPE.TICKET_REFUNDED:
-            return translate('travel.updates.ticketRefunded', details.route?.airlineCode ?? '', details.start.shortName ?? '', details.end?.shortName ?? '', formattedStartDate);
+            return translate('travel.updates.ticketRefunded', {
+                airlineCode: details.route?.airlineCode ?? '',
+                origin: details.start.shortName ?? '',
+                destination: details.end?.shortName ?? '',
+                startDate: formattedStartDate,
+            });
 
         case CONST.TRAVEL.UPDATE_OPERATION_TYPE.FLIGHT_CANCELLED:
-            return translate('travel.updates.flightCancelled', details.route?.airlineCode ?? '', details.start.shortName ?? '', details.end?.shortName ?? '', formattedStartDate);
+            return translate('travel.updates.flightCancelled', {
+                airlineCode: details.route?.airlineCode ?? '',
+                origin: details.start.shortName ?? '',
+                destination: details.end?.shortName ?? '',
+                startDate: formattedStartDate,
+            });
 
         case CONST.TRAVEL.UPDATE_OPERATION_TYPE.FLIGHT_SCHEDULE_CHANGE_PENDING:
             return translate('travel.updates.flightScheduleChangePending', details.route?.airlineCode ?? '');
@@ -1975,7 +1901,12 @@ function getTravelUpdateMessage(
             return translate('travel.updates.flightScheduleChangeClosed', details.route?.airlineCode ?? '', formattedStartDate);
 
         case CONST.TRAVEL.UPDATE_OPERATION_TYPE.FLIGHT_CHANGED:
-            return translate('travel.updates.flightUpdated', details.route?.airlineCode ?? '', details.start.shortName ?? '', details.end?.shortName ?? '', formattedStartDate);
+            return translate('travel.updates.flightUpdated', {
+                airlineCode: details.route?.airlineCode ?? '',
+                origin: details.start.shortName ?? '',
+                destination: details.end?.shortName ?? '',
+                startDate: formattedStartDate,
+            });
 
         case CONST.TRAVEL.UPDATE_OPERATION_TYPE.FLIGHT_CABIN_CHANGED:
             return translate('travel.updates.flightCabinChanged', details.route?.airlineCode ?? '', details.route?.class ?? '');
@@ -2028,8 +1959,12 @@ function getTravelUpdateMessage(
                     startDate: formattedStartDate,
                 });
             }
-            return translate('travel.updates.flightUpdated', details.route?.airlineCode ?? '', details.start.shortName ?? '', details.end?.shortName ?? '', formattedStartDate);
-
+            return translate('travel.updates.flightUpdated', {
+                airlineCode: details.route?.airlineCode ?? '',
+                origin: details.start.shortName ?? '',
+                destination: details.end?.shortName ?? '',
+                startDate: formattedStartDate,
+            });
         case CONST.TRAVEL.UPDATE_OPERATION_TYPE.BOOKING_OTHER_UPDATE:
             if (details.type === CONST.RESERVATION_TYPE.CAR || details.type === CONST.RESERVATION_TYPE.HOTEL) {
                 return translate('travel.updates.defaultUpdate', {
@@ -2043,7 +1978,12 @@ function getTravelUpdateMessage(
                     startDate: formattedStartDate,
                 });
             }
-            return translate('travel.updates.flightUpdated', details.route?.airlineCode ?? '', details.start.shortName ?? '', details.end?.shortName ?? '', formattedStartDate);
+            return translate('travel.updates.flightUpdated', {
+                airlineCode: details.route?.airlineCode ?? '',
+                origin: details.start.shortName ?? '',
+                destination: details.end?.shortName ?? '',
+                startDate: formattedStartDate,
+            });
 
         case CONST.TRAVEL.UPDATE_OPERATION_TYPE.REFUND:
             return translate('travel.updates.railTicketRefund', {
@@ -2356,22 +2296,6 @@ function isActionableCardFraudAlert(reportAction: OnyxInputOrEntry<ReportAction>
     return reportAction?.actionName === CONST.REPORT.ACTIONS.TYPE.ACTIONABLE_CARD_FRAUD_ALERT;
 }
 
-/**
- * Checks if a report action is an actionable whisper that requires write permission to be visible.
- */
-function isActionableWhisperRequiringWritePermission(reportAction: OnyxEntry<ReportAction>): boolean {
-    if (!reportAction) {
-        return false;
-    }
-
-    return (
-        isActionableReportMentionWhisper(reportAction) ||
-        isActionableJoinRequestPendingReportAction(reportAction) ||
-        isActionableMentionWhisper(reportAction) ||
-        isActionableCardFraudAlert(reportAction)
-    );
-}
-
 function getExportIntegrationLastMessageText(translate: LocalizedTranslate, reportAction: OnyxEntry<ReportAction>): string {
     const fragments = getExportIntegrationActionFragments(translate, reportAction);
     return fragments.reduce((acc, fragment) => `${acc} ${fragment.text}`, '');
@@ -2991,27 +2915,11 @@ function getWorkspaceUpdateFieldMessage(translate: LocalizedTranslate, action: R
         });
     }
 
-    if (
-        updatedField &&
-        updatedField === CONST.POLICY.EXPENSE_REPORT_RULES.MAX_EXPENSE_AGE &&
-        ((typeof oldValue === 'string' && typeof newValue === 'string') || (typeof oldValue === 'number' && typeof newValue === 'number'))
-    ) {
-        const isDisabled = (value: string | number): boolean => {
-            return value === String(CONST.POLICY.DISABLED_MAX_EXPENSE_AGE) || value === CONST.POLICY.DISABLED_MAX_EXPENSE_AGE || value === 'false';
-        };
-        const oldIsDisabled = isDisabled(oldValue);
-        const newIsDisabled = isDisabled(newValue);
-        const oldFormatted = oldIsDisabled ? '' : String(oldValue);
-        const newFormatted = newIsDisabled ? '' : String(newValue);
-
-        if (oldIsDisabled && !newIsDisabled) {
-            return translate('workspaceActions.setMaxExpenseAge', {oldValue: oldFormatted, newValue: newFormatted});
-        }
-
-        if (!oldIsDisabled && newIsDisabled) {
-            return translate('workspaceActions.removedMaxExpenseAge', {oldValue: oldFormatted, newValue: newFormatted});
-        }
-        return translate('workspaceActions.changedMaxExpenseAge', {oldValue: oldFormatted, newValue: newFormatted});
+    if (updatedField && updatedField === CONST.POLICY.EXPENSE_REPORT_RULES.MAX_EXPENSE_AGE && typeof oldValue === 'string' && typeof newValue === 'string') {
+        return translate('workspaceActions.updateMaxExpenseAge', {
+            oldValue,
+            newValue,
+        });
     }
     if (
         updatedField &&
@@ -3212,39 +3120,6 @@ function getForwardsToUpdateMessage(translate: LocalizedTranslate, action: Repor
     return translate('workspaceActions.changedForwardsTo', {approver: approvers, forwardsTo: forwardsToEmail, previousForwardsTo});
 }
 
-function getInvoiceCompanyNameUpdateMessage(translate: LocalizedTranslate, action: ReportAction): string {
-    const {newValue, oldValue} = getOriginalMessage(action as ReportAction<typeof CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_INVOICE_COMPANY_NAME>) ?? {};
-
-    if (typeof newValue === 'string') {
-        return translate('workspaceActions.changedInvoiceCompanyName', {newValue, oldValue: typeof oldValue === 'string' ? oldValue : undefined});
-    }
-
-    return getReportActionText(action);
-}
-
-function getInvoiceCompanyWebsiteUpdateMessage(translate: LocalizedTranslate, action: ReportAction): string {
-    const {newValue, oldValue} = getOriginalMessage(action as ReportAction<typeof CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_INVOICE_COMPANY_WEBSITE>) ?? {};
-
-    if (typeof newValue === 'string') {
-        return translate('workspaceActions.changedInvoiceCompanyWebsite', {newValue, oldValue: typeof oldValue === 'string' ? oldValue : undefined});
-    }
-
-    return getReportActionText(action);
-}
-
-function getReimburserUpdateMessage(translate: LocalizedTranslate, action: ReportAction): string {
-    const originalMessage = getOriginalMessage(action as ReportAction<typeof CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_REIMBURSER>);
-
-    if (originalMessage?.reimburser?.email && originalMessage?.previousReimburser?.email) {
-        const newReimburser = formatPhoneNumber(originalMessage.reimburser.email);
-        const previousReimburser = formatPhoneNumber(originalMessage.previousReimburser.email);
-
-        return translate('workspaceActions.changedReimburser', {newReimburser, previousReimburser});
-    }
-
-    return getReportActionText(action);
-}
-
 function getWorkspaceReimbursementUpdateMessage(translate: LocalizedTranslate, action: ReportAction): string {
     const {enabled} = getOriginalMessage(action as ReportAction<typeof CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_REIMBURSEMENT_ENABLED>) ?? {};
 
@@ -3255,55 +3130,15 @@ function getWorkspaceReimbursementUpdateMessage(translate: LocalizedTranslate, a
     return getReportActionText(action);
 }
 
-type UpdateACHAccountOriginalMessage = {
-    bankAccountName?: string;
-    maskedBankAccountNumber?: string;
-    oldBankAccountName?: string;
-    oldMaskedBankAccountNumber?: string;
-};
-
-function getUpdateACHAccountMessage(translate: LocalizedTranslate, action: ReportAction): string {
-    const {bankAccountName, maskedBankAccountNumber, oldBankAccountName, oldMaskedBankAccountNumber} =
-        (getOriginalMessage(action as ReportAction<typeof CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_ACH_ACCOUNT>) as UpdateACHAccountOriginalMessage | undefined) ?? {};
-
-    if (!!maskedBankAccountNumber && !oldMaskedBankAccountNumber) {
-        return translate('workspaceActions.setDefaultBankAccount', {bankAccountName: bankAccountName ?? '', maskedBankAccountNumber});
-    }
-    if (!maskedBankAccountNumber && oldMaskedBankAccountNumber) {
-        return translate('workspaceActions.removedDefaultBankAccount', {bankAccountName: oldBankAccountName ?? '', maskedBankAccountNumber: oldMaskedBankAccountNumber});
-    }
-
-    if (!!maskedBankAccountNumber && !!oldMaskedBankAccountNumber) {
-        return translate('workspaceActions.changedDefaultBankAccount', {
-            bankAccountName: bankAccountName ?? '',
-            maskedBankAccountNumber,
-            oldBankAccountName: oldBankAccountName ?? '',
-            oldMaskedBankAccountNumber,
-        });
-    }
-
-    return getReportActionText(action);
-}
-
 function getPolicyChangeLogMaxExpenseAmountNoReceiptMessage(translate: LocalizedTranslate, action: ReportAction): string {
     const {oldMaxExpenseAmountNoReceipt, newMaxExpenseAmountNoReceipt, currency} =
         getOriginalMessage(action as ReportAction<typeof CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_MAX_EXPENSE_AMOUNT_NO_RECEIPT>) ?? {};
 
     if (typeof oldMaxExpenseAmountNoReceipt === 'number' && typeof newMaxExpenseAmountNoReceipt === 'number') {
-        const oldIsDisabled = oldMaxExpenseAmountNoReceipt === CONST.DISABLED_MAX_EXPENSE_VALUE;
-        const newIsDisabled = newMaxExpenseAmountNoReceipt === CONST.DISABLED_MAX_EXPENSE_VALUE;
-        const oldValue = oldIsDisabled ? '' : convertToDisplayString(oldMaxExpenseAmountNoReceipt, currency);
-        const newValue = newIsDisabled ? '' : convertToDisplayString(newMaxExpenseAmountNoReceipt, currency);
-
-        if (oldIsDisabled && !newIsDisabled) {
-            return translate('workspaceActions.setReceiptRequiredAmount', {oldValue, newValue});
-        }
-
-        if (!oldIsDisabled && newIsDisabled) {
-            return translate('workspaceActions.removedReceiptRequiredAmount', {oldValue, newValue});
-        }
-
-        return translate('workspaceActions.changedReceiptRequiredAmount', {oldValue, newValue});
+        return translate('workspaceActions.updateMaxExpenseAmountNoReceipt', {
+            oldValue: convertToDisplayString(oldMaxExpenseAmountNoReceipt, currency),
+            newValue: convertToDisplayString(newMaxExpenseAmountNoReceipt, currency),
+        });
     }
 
     return getReportActionText(action);
@@ -3314,43 +3149,10 @@ function getPolicyChangeLogMaxExpenseAmountMessage(translate: LocalizedTranslate
         getOriginalMessage(action as ReportAction<typeof CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_MAX_EXPENSE_AMOUNT>) ?? {};
 
     if (typeof oldMaxExpenseAmount === 'number' && typeof newMaxExpenseAmount === 'number') {
-        const oldIsDisabled = oldMaxExpenseAmount === CONST.DISABLED_MAX_EXPENSE_VALUE;
-        const newIsDisabled = newMaxExpenseAmount === CONST.DISABLED_MAX_EXPENSE_VALUE;
-        const oldValue = oldIsDisabled ? '' : convertToDisplayString(oldMaxExpenseAmount, currency);
-        const newValue = newIsDisabled ? '' : convertToDisplayString(newMaxExpenseAmount, currency);
-
-        if (oldIsDisabled && !newIsDisabled) {
-            return translate('workspaceActions.setMaxExpenseAmount', {oldValue, newValue});
-        }
-
-        if (!oldIsDisabled && newIsDisabled) {
-            return translate('workspaceActions.removedMaxExpenseAmount', {oldValue, newValue});
-        }
-
-        return translate('workspaceActions.changedMaxExpenseAmount', {oldValue, newValue});
-    }
-
-    return getReportActionText(action);
-}
-
-function getPolicyChangeLogMaxExpenseAgeMessage(translate: LocalizedTranslate, action: ReportAction): string {
-    const {oldMaxExpenseAge, newMaxExpenseAge} = getOriginalMessage(action as ReportAction<typeof CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_MAX_EXPENSE_AGE>) ?? {};
-
-    if (typeof oldMaxExpenseAge === 'number' && typeof newMaxExpenseAge === 'number') {
-        const oldIsDisabled = oldMaxExpenseAge === CONST.POLICY.DISABLED_MAX_EXPENSE_AGE;
-        const newIsDisabled = newMaxExpenseAge === CONST.POLICY.DISABLED_MAX_EXPENSE_AGE;
-        const oldValue = oldIsDisabled ? '' : String(oldMaxExpenseAge);
-        const newValue = newIsDisabled ? '' : String(newMaxExpenseAge);
-
-        if (oldIsDisabled && !newIsDisabled) {
-            return translate('workspaceActions.setMaxExpenseAge', {oldValue, newValue});
-        }
-
-        if (!oldIsDisabled && newIsDisabled) {
-            return translate('workspaceActions.removedMaxExpenseAge', {oldValue, newValue});
-        }
-
-        return translate('workspaceActions.changedMaxExpenseAge', {oldValue, newValue});
+        return translate('workspaceActions.updateMaxExpenseAmount', {
+            oldValue: convertToDisplayString(oldMaxExpenseAmount, currency),
+            newValue: convertToDisplayString(newMaxExpenseAmount, currency),
+        });
     }
 
     return getReportActionText(action);
@@ -3579,7 +3381,7 @@ function getChangedApproverActionMessage<T extends typeof CONST.REPORT.ACTIONS.T
 
 function getHarvestCreatedExpenseReportMessage(reportID: string | undefined, reportName: string, translate: LocalizedTranslate) {
     const reportUrl = getReportURLForCurrentContext(reportID);
-    return translate('reportAction.harvestCreatedExpenseReport', reportUrl, reportName);
+    return translate('reportAction.harvestCreatedExpenseReport', {reportUrl, reportName});
 }
 
 function getCreatedReportForUnapprovedTransactionsMessage(reportID: string | undefined, reportName: string, translate: LocalizedTranslate): string {
@@ -3855,7 +3657,6 @@ export {
     isActionableWhisper,
     isActionableJoinRequest,
     isActionableJoinRequestPending,
-    isActionableJoinRequestPendingReportAction,
     isActionableMentionWhisper,
     isActionableMentionInviteToSubmitExpenseConfirmWhisper,
     isActionableReportMentionWhisper,
@@ -3910,7 +3711,6 @@ export {
     isTrackExpenseAction,
     isTransactionThread,
     isTripPreview,
-    isTravelUpdate,
     isHoldAction,
     isWhisperAction,
     isSubmittedAction,
@@ -3928,18 +3728,14 @@ export {
     isTagModificationAction,
     isIOUActionMatchingTransactionList,
     isResolvedActionableWhisper,
-    isVisiblePreviewOrMoneyRequest,
     isReimbursementDirectionInformationRequiredAction,
     shouldHideNewMarker,
     shouldReportActionBeVisible,
     shouldReportActionBeVisibleAsLastAction,
-    isReportActionVisible,
-    isReportActionVisibleAsLastAction,
     wasActionTakenByCurrentUser,
     isInviteOrRemovedAction,
     isActionableAddPaymentCard,
     isActionableCardFraudAlert,
-    isActionableWhisperRequiringWritePermission,
     getExportIntegrationActionFragments,
     getExportIntegrationLastMessageText,
     getExportIntegrationMessageHTML,
@@ -3969,17 +3765,12 @@ export {
     getDefaultApproverUpdateMessage,
     getSubmitsToUpdateMessage,
     getForwardsToUpdateMessage,
-    getInvoiceCompanyNameUpdateMessage,
-    getInvoiceCompanyWebsiteUpdateMessage,
-    getReimburserUpdateMessage,
     getWorkspaceReimbursementUpdateMessage,
-    getUpdateACHAccountMessage,
     getWorkspaceCurrencyUpdateMessage,
     getWorkspaceTaxUpdateMessage,
     getWorkspaceFrequencyUpdateMessage,
     getPolicyChangeLogMaxExpenseAmountNoReceiptMessage,
     getPolicyChangeLogMaxExpenseAmountMessage,
-    getPolicyChangeLogMaxExpenseAgeMessage,
     getPolicyChangeLogDefaultBillableMessage,
     getPolicyChangeLogDefaultTitleMessage,
     getPolicyChangeLogDefaultTitleEnforcedMessage,
diff --git a/src/libs/ReportNameUtils.ts b/src/libs/ReportNameUtils.ts
index 8516817f19d6..c9b15e8e6bf3 100644
--- a/src/libs/ReportNameUtils.ts
+++ b/src/libs/ReportNameUtils.ts
@@ -4,7 +4,7 @@
 import {Str} from 'expensify-common';
 import Onyx from 'react-native-onyx';
 import type {OnyxCollection, OnyxEntry} from 'react-native-onyx';
-import type {LocaleContextProps, LocalizedTranslate} from '@components/LocaleContextProvider';
+import type {LocaleContextProps} from '@components/LocaleContextProvider';
 import CONST from '@src/CONST';
 import ONYXKEYS from '@src/ONYXKEYS';
 import type {
@@ -36,8 +36,6 @@ import {
     getChangedApproverActionMessage,
     getCompanyCardConnectionBrokenMessage,
     getIntegrationSyncFailedMessage,
-    getInvoiceCompanyNameUpdateMessage,
-    getInvoiceCompanyWebsiteUpdateMessage,
     getJoinRequestMessage,
     getMarkedReimbursedMessage,
     getMessageOfOldDotReportAction,
@@ -46,14 +44,11 @@ import {
     getPolicyChangeLogDefaultReimbursableMessage,
     getPolicyChangeLogDefaultTitleEnforcedMessage,
     getPolicyChangeLogDefaultTitleMessage,
-    getPolicyChangeLogMaxExpenseAgeMessage,
-    getPolicyChangeLogMaxExpenseAmountMessage,
     getPolicyChangeLogMaxExpenseAmountNoReceiptMessage,
     getRenamedAction,
     getReportActionMessage as getReportActionMessageFromActionsUtils,
     getReportActionText,
     getTravelUpdateMessage,
-    getUpdateACHAccountMessage,
     getWorkspaceCurrencyUpdateMessage,
     getWorkspaceCustomUnitRateAddedMessage,
     getWorkspaceCustomUnitRateDeletedMessage,
@@ -122,8 +117,16 @@ import {
     isUserCreatedPolicyRoom,
 } from './ReportUtils';
 
+let currentUserAccountID: number | undefined;
 let allPersonalDetails: OnyxEntry<PersonalDetailsList>;
 
+Onyx.connect({
+    key: ONYXKEYS.SESSION,
+    callback: (value) => {
+        currentUserAccountID = value?.accountID;
+    },
+});
+
 Onyx.connect({
     key: ONYXKEYS.PERSONAL_DETAILS_LIST,
     callback: (value) => {
@@ -141,15 +144,7 @@ function generateArchivedReportName(reportName: string): string {
  * This function is useful in contexts such as 1:1 direct messages (DMs) or other group chats.
  * It limits to a maximum of 5 participants for the title and uses short names unless there is only one participant.
  */
-const buildReportNameFromParticipantNames = ({
-    report,
-    personalDetailsList: personalDetailsData,
-    currentUserAccountID,
-}: {
-    report: OnyxEntry<Report>;
-    personalDetailsList?: Partial<PersonalDetailsList>;
-    currentUserAccountID?: number;
-}) =>
+const buildReportNameFromParticipantNames = ({report, personalDetailsList: personalDetailsData}: {report: OnyxEntry<Report>; personalDetailsList?: Partial<PersonalDetailsList>}) =>
     Object.keys(report?.participants ?? {})
         .map(Number)
         .filter((id) => id !== currentUserAccountID)
@@ -258,13 +253,11 @@ function getInvoicesChatName({
     receiverPolicy,
     personalDetails,
     policies,
-    currentUserAccountID,
 }: {
     report: OnyxEntry<Report>;
     receiverPolicy: OnyxEntry<Policy>;
     personalDetails?: Partial<PersonalDetailsList>;
     policies?: Policy[];
-    currentUserAccountID?: number;
 }): string {
     const invoiceReceiver = report?.invoiceReceiver;
     const isIndividual = invoiceReceiver?.type === CONST.REPORT.INVOICE_RECEIVER_TYPE.INDIVIDUAL;
@@ -360,13 +353,7 @@ function getMoneyRequestReportName({report, policy, invoiceReceiverPolicy}: {rep
     return payerPaidAmountMessage;
 }
 
-function computeReportNameBasedOnReportAction(
-    translate: LocalizedTranslate,
-    parentReportAction?: ReportAction,
-    report?: Report,
-    reportPolicy?: Policy,
-    parentReport?: Report,
-): string | undefined {
+function computeReportNameBasedOnReportAction(parentReportAction?: ReportAction, report?: Report, reportPolicy?: Policy, parentReport?: Report): string | undefined {
     if (!parentReportAction) {
         return undefined;
     }
@@ -377,26 +364,32 @@ function computeReportNameBasedOnReportAction(
     ) {
         const harvesting = !isMarkAsClosedAction(parentReportAction) ? (getOriginalMessage(parentReportAction)?.harvesting ?? false) : false;
         if (harvesting) {
-            return translate('iou.automaticallySubmitted');
+            // eslint-disable-next-line @typescript-eslint/no-deprecated
+            return translateLocal('iou.automaticallySubmitted');
         }
-        return translate('iou.submitted', {memo: getOriginalMessage(parentReportAction)?.message});
+        // eslint-disable-next-line @typescript-eslint/no-deprecated
+        return translateLocal('iou.submitted', {memo: getOriginalMessage(parentReportAction)?.message});
     }
 
     if (isActionOfType(parentReportAction, CONST.REPORT.ACTIONS.TYPE.FORWARDED)) {
         const {automaticAction} = getOriginalMessage(parentReportAction) ?? {};
         if (automaticAction) {
-            return translate('iou.automaticallyForwarded');
+            // eslint-disable-next-line @typescript-eslint/no-deprecated
+            return translateLocal('iou.automaticallyForwarded');
         }
-        return translate('iou.forwarded');
+        // eslint-disable-next-line @typescript-eslint/no-deprecated
+        return translateLocal('iou.forwarded');
     }
     if (parentReportAction?.actionName === CONST.REPORT.ACTIONS.TYPE.REJECTED) {
         return getRejectedReportMessage();
     }
     if (parentReportAction?.actionName === CONST.REPORT.ACTIONS.TYPE.RETRACTED) {
-        return translate('iou.retracted');
+        // eslint-disable-next-line @typescript-eslint/no-deprecated
+        return translateLocal('iou.retracted');
     }
     if (parentReportAction?.actionName === CONST.REPORT.ACTIONS.TYPE.REOPENED) {
-        return translate('iou.reopened');
+        // eslint-disable-next-line @typescript-eslint/no-deprecated
+        return translateLocal('iou.reopened');
     }
     if (parentReportAction?.actionName === CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.CORPORATE_UPGRADE) {
         return getUpgradeWorkspaceMessage();
@@ -405,72 +398,66 @@ function computeReportNameBasedOnReportAction(
         return getDowngradeWorkspaceMessage();
     }
     if (parentReportAction?.actionName === CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_CURRENCY) {
-        return getWorkspaceCurrencyUpdateMessage(translate, parentReportAction);
+        // eslint-disable-next-line @typescript-eslint/no-deprecated
+        return getWorkspaceCurrencyUpdateMessage(translateLocal, parentReportAction);
     }
     if (parentReportAction?.actionName === CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_FIELD) {
-        return getWorkspaceUpdateFieldMessage(translate, parentReportAction);
+        // eslint-disable-next-line @typescript-eslint/no-deprecated
+        return getWorkspaceUpdateFieldMessage(translateLocal, parentReportAction);
     }
     if (parentReportAction?.actionName === CONST.REPORT.ACTIONS.TYPE.MERGED_WITH_CASH_TRANSACTION) {
-        return translate('systemMessage.mergedWithCashTransaction');
+        // eslint-disable-next-line @typescript-eslint/no-deprecated
+        return translateLocal('systemMessage.mergedWithCashTransaction');
     }
     if (parentReportAction?.actionName === CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_NAME) {
         return Str.htmlDecode(getWorkspaceNameUpdatedMessage(parentReportAction));
     }
     if (parentReportAction?.actionName === CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_AUTO_REPORTING_FREQUENCY) {
-        return getWorkspaceFrequencyUpdateMessage(translate, parentReportAction);
+        // eslint-disable-next-line @typescript-eslint/no-deprecated
+        return getWorkspaceFrequencyUpdateMessage(translateLocal, parentReportAction);
     }
     if (parentReportAction?.actionName === CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.ADD_REPORT_FIELD) {
-        return getWorkspaceReportFieldAddMessage(translate, parentReportAction);
+        // eslint-disable-next-line @typescript-eslint/no-deprecated
+        return getWorkspaceReportFieldAddMessage(translateLocal, parentReportAction);
     }
     if (parentReportAction?.actionName === CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_REPORT_FIELD) {
-        return getWorkspaceReportFieldUpdateMessage(translate, parentReportAction);
+        // eslint-disable-next-line @typescript-eslint/no-deprecated
+        return getWorkspaceReportFieldUpdateMessage(translateLocal, parentReportAction);
     }
     if (parentReportAction?.actionName === CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.DELETE_REPORT_FIELD) {
-        return getWorkspaceReportFieldDeleteMessage(translate, parentReportAction);
+        // eslint-disable-next-line @typescript-eslint/no-deprecated
+        return getWorkspaceReportFieldDeleteMessage(translateLocal, parentReportAction);
     }
 
     if (isActionOfType(parentReportAction, CONST.REPORT.ACTIONS.TYPE.UNREPORTED_TRANSACTION)) {
-        return Parser.htmlToText(getUnreportedTransactionMessage(parentReportAction));
+        return getUnreportedTransactionMessage(parentReportAction);
     }
 
     if (isActionOfType(parentReportAction, CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_MAX_EXPENSE_AMOUNT_NO_RECEIPT)) {
-        return getPolicyChangeLogMaxExpenseAmountNoReceiptMessage(translate, parentReportAction);
+        // eslint-disable-next-line @typescript-eslint/no-deprecated
+        return getPolicyChangeLogMaxExpenseAmountNoReceiptMessage(translateLocal, parentReportAction);
     }
 
     if (isActionOfType(parentReportAction, CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_DEFAULT_BILLABLE)) {
-        return getPolicyChangeLogDefaultBillableMessage(translate, parentReportAction);
-    }
-    if (isActionOfType(parentReportAction, CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_DEFAULT_REIMBURSABLE)) {
-        return getPolicyChangeLogDefaultReimbursableMessage(translate, parentReportAction);
-    }
-    if (isActionOfType(parentReportAction, CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_MAX_EXPENSE_AMOUNT)) {
         // eslint-disable-next-line @typescript-eslint/no-deprecated
-        return getPolicyChangeLogMaxExpenseAmountMessage(translateLocal, parentReportAction);
+        return getPolicyChangeLogDefaultBillableMessage(translateLocal, parentReportAction);
     }
-    if (isActionOfType(parentReportAction, CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_MAX_EXPENSE_AGE)) {
+    if (isActionOfType(parentReportAction, CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_DEFAULT_REIMBURSABLE)) {
         // eslint-disable-next-line @typescript-eslint/no-deprecated
-        return getPolicyChangeLogMaxExpenseAgeMessage(translateLocal, parentReportAction);
+        return getPolicyChangeLogDefaultReimbursableMessage(translateLocal, parentReportAction);
     }
     if (isActionOfType(parentReportAction, CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_DEFAULT_TITLE_ENFORCED)) {
-        return getPolicyChangeLogDefaultTitleEnforcedMessage(translate, parentReportAction);
-    }
-    if (isActionOfType(parentReportAction, CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_DEFAULT_TITLE)) {
-        return getPolicyChangeLogDefaultTitleMessage(translate, parentReportAction);
-    }
-    if (isActionOfType(parentReportAction, CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_ACH_ACCOUNT)) {
-        return getUpdateACHAccountMessage(translate, parentReportAction);
-    }
-    if (isActionOfType(parentReportAction, CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_INVOICE_COMPANY_NAME)) {
         // eslint-disable-next-line @typescript-eslint/no-deprecated
-        return getInvoiceCompanyNameUpdateMessage(translateLocal, parentReportAction);
+        return getPolicyChangeLogDefaultTitleEnforcedMessage(translateLocal, parentReportAction);
     }
-    if (isActionOfType(parentReportAction, CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_INVOICE_COMPANY_WEBSITE)) {
+    if (isActionOfType(parentReportAction, CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_DEFAULT_TITLE)) {
         // eslint-disable-next-line @typescript-eslint/no-deprecated
-        return getInvoiceCompanyWebsiteUpdateMessage(translateLocal, parentReportAction);
+        return getPolicyChangeLogDefaultTitleMessage(translateLocal, parentReportAction);
     }
 
     if (isActionOfType(parentReportAction, CONST.REPORT.ACTIONS.TYPE.ACTIONABLE_CARD_FRAUD_ALERT) && getOriginalMessage(parentReportAction)?.resolution) {
-        return getActionableCardFraudAlertResolutionMessage(translate, parentReportAction);
+        // eslint-disable-next-line @typescript-eslint/no-deprecated
+        return getActionableCardFraudAlertResolutionMessage(translateLocal, parentReportAction);
     }
 
     if (isActionOfType(parentReportAction, CONST.REPORT.ACTIONS.TYPE.MARKED_REIMBURSED)) {
@@ -483,7 +470,7 @@ function computeReportNameBasedOnReportAction(
 
     if (isActionOfType(parentReportAction, CONST.REPORT.ACTIONS.TYPE.TAKE_CONTROL) || isActionOfType(parentReportAction, CONST.REPORT.ACTIONS.TYPE.REROUTE)) {
         // eslint-disable-next-line @typescript-eslint/no-deprecated
-        return Parser.htmlToText(getChangedApproverActionMessage(translateLocal, parentReportAction));
+        return getChangedApproverActionMessage(translateLocal, parentReportAction);
     }
 
     if (parentReportAction?.actionName && isTagModificationAction(parentReportAction?.actionName)) {
@@ -501,19 +488,24 @@ function computeReportNameBasedOnReportAction(
 
         if (originalMessage?.type === CONST.IOU.REPORT_ACTION_TYPE.PAY) {
             if (originalMessage.paymentType === CONST.IOU.PAYMENT_TYPE.ELSEWHERE) {
-                return translate('iou.paidElsewhere');
+                // eslint-disable-next-line @typescript-eslint/no-deprecated
+                return translateLocal('iou.paidElsewhere');
             }
             if (originalMessage.paymentType === CONST.IOU.PAYMENT_TYPE.VBBA) {
                 if (originalMessage.automaticAction) {
-                    return translate('iou.automaticallyPaidWithBusinessBankAccount', undefined, last4Digits);
+                    // eslint-disable-next-line @typescript-eslint/no-deprecated
+                    return translateLocal('iou.automaticallyPaidWithBusinessBankAccount', undefined, last4Digits);
                 }
-                return translate('iou.businessBankAccount', undefined, last4Digits);
+                // eslint-disable-next-line @typescript-eslint/no-deprecated
+                return translateLocal('iou.businessBankAccount', undefined, last4Digits);
             }
             if (originalMessage.paymentType === CONST.IOU.PAYMENT_TYPE.EXPENSIFY) {
                 if (originalMessage.automaticAction) {
-                    return translate('iou.automaticallyPaidWithExpensify');
+                    // eslint-disable-next-line @typescript-eslint/no-deprecated
+                    return translateLocal('iou.automaticallyPaidWithExpensify');
                 }
-                return translate('iou.paidWithExpensify');
+                // eslint-disable-next-line @typescript-eslint/no-deprecated
+                return translateLocal('iou.paidWithExpensify');
             }
         }
     }
@@ -521,55 +513,60 @@ function computeReportNameBasedOnReportAction(
     if (isActionOfType(parentReportAction, CONST.REPORT.ACTIONS.TYPE.APPROVED)) {
         const {automaticAction} = getOriginalMessage(parentReportAction) ?? {};
         if (automaticAction) {
-            return translate('iou.automaticallyApproved');
+            // eslint-disable-next-line @typescript-eslint/no-deprecated
+            return translateLocal('iou.automaticallyApproved');
         }
-        return translate('iou.approvedMessage');
+        // eslint-disable-next-line @typescript-eslint/no-deprecated
+        return translateLocal('iou.approvedMessage');
     }
 
     if (isUnapprovedAction(parentReportAction)) {
-        return translate('iou.unapproved');
+        // eslint-disable-next-line @typescript-eslint/no-deprecated
+        return translateLocal('iou.unapproved');
     }
 
     if (isActionableJoinRequest(parentReportAction)) {
-        return getJoinRequestMessage(translate, parentReportAction);
+        // eslint-disable-next-line @typescript-eslint/no-deprecated
+        return getJoinRequestMessage(translateLocal, parentReportAction);
     }
 
     if (isTaskReport(report) && isCanceledTaskReport(report, parentReportAction)) {
-        return translate('parentReportAction.deletedTask');
+        // eslint-disable-next-line @typescript-eslint/no-deprecated
+        return translateLocal('parentReportAction.deletedTask');
     }
 
     if (isActionOfType(parentReportAction, CONST.REPORT.ACTIONS.TYPE.INTEGRATION_SYNC_FAILED)) {
-        return Parser.htmlToText(getIntegrationSyncFailedMessage(translate, parentReportAction, report?.policyID));
+        // eslint-disable-next-line @typescript-eslint/no-deprecated
+        return getIntegrationSyncFailedMessage(translateLocal, parentReportAction, report?.policyID);
     }
 
     if (isActionOfType(parentReportAction, CONST.REPORT.ACTIONS.TYPE.COMPANY_CARD_CONNECTION_BROKEN)) {
-        return getCompanyCardConnectionBrokenMessage(translate, parentReportAction);
+        // eslint-disable-next-line @typescript-eslint/no-deprecated
+        return getCompanyCardConnectionBrokenMessage(translateLocal, parentReportAction);
     }
 
     if (isActionOfType(parentReportAction, CONST.REPORT.ACTIONS.TYPE.TRAVEL_UPDATE)) {
-        return getTravelUpdateMessage(translate, parentReportAction);
+        // eslint-disable-next-line @typescript-eslint/no-deprecated
+        return getTravelUpdateMessage(translateLocal, parentReportAction);
     }
 
     if (isActionOfType(parentReportAction, CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.ADD_CUSTOM_UNIT_RATE)) {
-        return getWorkspaceCustomUnitRateAddedMessage(translate, parentReportAction);
+        // eslint-disable-next-line @typescript-eslint/no-deprecated
+        return getWorkspaceCustomUnitRateAddedMessage(translateLocal, parentReportAction);
     }
     if (isActionOfType(parentReportAction, CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_CUSTOM_UNIT_RATE)) {
-        return getWorkspaceCustomUnitRateUpdatedMessage(translate, parentReportAction);
+        // eslint-disable-next-line @typescript-eslint/no-deprecated
+        return getWorkspaceCustomUnitRateUpdatedMessage(translateLocal, parentReportAction);
     }
     if (isActionOfType(parentReportAction, CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.DELETE_CUSTOM_UNIT_RATE)) {
-        return getWorkspaceCustomUnitRateDeletedMessage(translate, parentReportAction);
+        // eslint-disable-next-line @typescript-eslint/no-deprecated
+        return getWorkspaceCustomUnitRateDeletedMessage(translateLocal, parentReportAction);
     }
 
     return undefined;
 }
 
-function computeChatThreadReportName(
-    translate: LocalizedTranslate,
-    isArchived: boolean,
-    report: Report,
-    reports: OnyxCollection<Report>,
-    parentReportAction?: ReportAction,
-): string | undefined {
+function computeChatThreadReportName(report: Report, reportNameValuePairs: ReportNameValuePairs, reports: OnyxCollection<Report>, parentReportAction?: ReportAction): string | undefined {
     if (!isChatThread(report)) {
         return undefined;
     }
@@ -578,7 +575,7 @@ function computeChatThreadReportName(
     }
 
     const parentReportActionMessage = getReportActionMessageFromActionsUtils(parentReportAction);
-    const isArchivedNonExpense = isArchivedNonExpenseReport(report, isArchived);
+    const isArchivedNonExpense = isArchivedNonExpenseReport(report, !!reportNameValuePairs?.private_isArchived);
 
     if (!isEmptyObject(parentReportAction) && isTransactionThread(parentReportAction)) {
         let formattedName = getTransactionReportName({reportAction: parentReportAction});
@@ -590,33 +587,39 @@ function computeChatThreadReportName(
     }
 
     if (!isEmptyObject(parentReportAction) && isOldDotReportAction(parentReportAction)) {
-        return getMessageOfOldDotReportAction(translate, parentReportAction);
+        // eslint-disable-next-line @typescript-eslint/no-deprecated
+        return getMessageOfOldDotReportAction(translateLocal, parentReportAction);
     }
 
     if (isRenamedAction(parentReportAction)) {
         const parent = reports?.[`${ONYXKEYS.COLLECTION.REPORT}${report?.parentReportID}`];
-        return getRenamedAction(translate, parentReportAction, isExpenseReport(parent));
+        // eslint-disable-next-line @typescript-eslint/no-deprecated
+        return getRenamedAction(translateLocal, parentReportAction, isExpenseReport(parent));
     }
 
     if (parentReportActionMessage?.isDeletedParentAction) {
-        return translate('parentReportAction.deletedMessage');
+        // eslint-disable-next-line @typescript-eslint/no-deprecated
+        return translateLocal('parentReportAction.deletedMessage');
     }
 
     if (parentReportAction?.actionName === CONST.REPORT.ACTIONS.TYPE.RESOLVED_DUPLICATES) {
-        return translate('violations.resolvedDuplicates');
+        // eslint-disable-next-line @typescript-eslint/no-deprecated
+        return translateLocal('violations.resolvedDuplicates');
     }
 
     const isAttachment = isReportActionAttachment(!isEmptyObject(parentReportAction) ? parentReportAction : undefined);
     const reportActionMessage = getReportActionText(parentReportAction).replaceAll(/(\n+|\r\n|\n|\r)/gm, ' ');
     if (isAttachment && reportActionMessage) {
-        return `[${translate('common.attachment')}]`;
+        // eslint-disable-next-line @typescript-eslint/no-deprecated
+        return `[${translateLocal('common.attachment')}]`;
     }
     if (
         parentReportActionMessage?.moderationDecision?.decision === CONST.MODERATION.MODERATOR_DECISION_PENDING_HIDE ||
         parentReportActionMessage?.moderationDecision?.decision === CONST.MODERATION.MODERATOR_DECISION_HIDDEN ||
         parentReportActionMessage?.moderationDecision?.decision === CONST.MODERATION.MODERATOR_DECISION_PENDING_REMOVE
     ) {
-        return translate('parentReportAction.hiddenMessage');
+        // eslint-disable-next-line @typescript-eslint/no-deprecated
+        return translateLocal('parentReportAction.hiddenMessage');
     }
     if (isAdminRoom(report) || isUserCreatedPolicyRoom(report)) {
         return reportActionMessage;
@@ -642,7 +645,8 @@ function computeChatThreadReportName(
         return report?.reportName ?? '';
     }
     if (isCardIssuedAction(parentReportAction)) {
-        return getCardIssuedMessage({reportAction: parentReportAction, translate});
+        // eslint-disable-next-line @typescript-eslint/no-deprecated
+        return getCardIssuedMessage({reportAction: parentReportAction, translate: translateLocal});
     }
     return reportActionMessage;
 }
@@ -655,23 +659,20 @@ function computeReportName(
     allReportNameValuePairs?: OnyxCollection<ReportNameValuePairs>,
     personalDetailsList?: PersonalDetailsList,
     reportActions?: OnyxCollection<ReportActions>,
-    currentUserAccountID?: number,
-    privateIsArchived?: string,
 ): string {
     if (!report || !report.reportID) {
         return '';
     }
 
-    const privateIsArchivedValue = privateIsArchived ?? allReportNameValuePairs?.[`${ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS}${report.reportID}`]?.private_isArchived;
+    const reportNameValuePairs = allReportNameValuePairs?.[`${ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS}${report.reportID}`];
     const reportPolicy = policies?.[`${ONYXKEYS.COLLECTION.POLICY}${report.policyID}`];
 
-    const isArchivedNonExpense = isArchivedNonExpenseReport(report, !!privateIsArchivedValue);
+    const isArchivedNonExpense = isArchivedNonExpenseReport(report, !!reportNameValuePairs?.private_isArchived);
 
     const parentReport = reports?.[`${ONYXKEYS.COLLECTION.REPORT}${report?.parentReportID}`];
     const parentReportAction = isThread(report) ? reportActions?.[`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${report?.parentReportID}`]?.[report.parentReportActionID] : undefined;
 
-    // eslint-disable-next-line @typescript-eslint/no-deprecated
-    const parentReportActionBasedName = computeReportNameBasedOnReportAction(translateLocal, parentReportAction, report, reportPolicy, parentReport);
+    const parentReportActionBasedName = computeReportNameBasedOnReportAction(parentReportAction, report, reportPolicy, parentReport);
 
     if (parentReportActionBasedName) {
         return parentReportActionBasedName;
@@ -681,8 +682,7 @@ function computeReportName(
         return Parser.htmlToText(report?.reportName ?? '').trim();
     }
 
-    // eslint-disable-next-line @typescript-eslint/no-deprecated
-    const chatThreadReportName = computeChatThreadReportName(translateLocal, !!privateIsArchivedValue, report, reports ?? {}, parentReportAction);
+    const chatThreadReportName = computeChatThreadReportName(report, reportNameValuePairs ?? {}, reports ?? {}, parentReportAction);
     if (chatThreadReportName) {
         return chatThreadReportName;
     }
@@ -730,7 +730,7 @@ function computeReportName(
             receiverPolicyID = (receiver as {policyID: string}).policyID;
         }
         const invoiceReceiverPolicy = receiverPolicyID ? policies?.[`${ONYXKEYS.COLLECTION.POLICY}${receiverPolicyID}`] : undefined;
-        formattedName = getInvoicesChatName({report, receiverPolicy: invoiceReceiverPolicy, personalDetails: personalDetailsList, currentUserAccountID});
+        formattedName = getInvoicesChatName({report, receiverPolicy: invoiceReceiverPolicy, personalDetails: personalDetailsList});
     }
 
     if (isSelfDM(report)) {
@@ -751,7 +751,7 @@ function computeReportName(
     }
 
     // Not a room or PolicyExpenseChat, generate title from first 5 other participants
-    formattedName = buildReportNameFromParticipantNames({report, personalDetailsList, currentUserAccountID});
+    formattedName = buildReportNameFromParticipantNames({report, personalDetailsList});
 
     const finalName = formattedName ?? report?.reportName ?? '';
 
diff --git a/src/libs/ReportPreviewActionUtils.ts b/src/libs/ReportPreviewActionUtils.ts
index a2d56162c8f1..75bd7dd8e16f 100644
--- a/src/libs/ReportPreviewActionUtils.ts
+++ b/src/libs/ReportPreviewActionUtils.ts
@@ -19,7 +19,7 @@ import {
     isReportApproved,
     isSettled,
 } from './ReportUtils';
-import {hasSmartScanFailedOrNoRouteViolation, isPending, isScanning} from './TransactionUtils';
+import {hasSmartScanFailedViolation, isPending, isScanning} from './TransactionUtils';
 
 function canSubmit(
     report: Report,
@@ -46,7 +46,7 @@ function canSubmit(
 
     const isAnyReceiptBeingScanned = transactions?.some((transaction) => isScanning(transaction));
 
-    if (transactions?.some((transaction) => hasSmartScanFailedOrNoRouteViolation(transaction, violations, currentUserEmail, currentUserAccountID, report, policy))) {
+    if (transactions?.some((transaction) => hasSmartScanFailedViolation(transaction, violations, currentUserEmail, currentUserAccountID, report, policy))) {
         return false;
     }
 
diff --git a/src/libs/ReportPrimaryActionUtils.ts b/src/libs/ReportPrimaryActionUtils.ts
index 3be69e41d65e..4722e735515d 100644
--- a/src/libs/ReportPrimaryActionUtils.ts
+++ b/src/libs/ReportPrimaryActionUtils.ts
@@ -4,6 +4,7 @@ import CONST from '@src/CONST';
 import ONYXKEYS from '@src/ONYXKEYS';
 import type {BankAccountList, Policy, Report, ReportAction, ReportMetadata, ReportNameValuePairs, Transaction, TransactionViolation} from '@src/types/onyx';
 import {isApprover as isApproverUtils} from './actions/Policy/Member';
+import {getCurrentUserAccountID} from './actions/Report';
 import {
     arePaymentsEnabled as arePaymentsEnabledUtils,
     getSubmitToAccountID,
@@ -41,7 +42,7 @@ import {
     allHavePendingRTERViolation,
     getTransactionViolations,
     hasPendingRTERViolation as hasPendingRTERViolationTransactionUtils,
-    hasSmartScanFailedOrNoRouteViolation,
+    hasSmartScanFailedViolation,
     isDuplicate,
     isOnHold as isOnHoldTransactionUtils,
     isPending,
@@ -114,7 +115,7 @@ function isSubmitAction(
     }
 
     if (violations && currentUserEmail && currentUserAccountID !== undefined) {
-        if (reportTransactions.some((transaction) => hasSmartScanFailedOrNoRouteViolation(transaction, violations, currentUserEmail, currentUserAccountID, report, policy))) {
+        if (reportTransactions.some((transaction) => hasSmartScanFailedViolation(transaction, violations, currentUserEmail, currentUserAccountID, report, policy))) {
             return false;
         }
     }
@@ -128,12 +129,14 @@ function isSubmitAction(
     return isExpenseReport && isReportSubmitter && isOpenReport && reportTransactions.length !== 0 && transactionAreComplete;
 }
 
-function isApproveAction(report: Report, reportTransactions: Transaction[], currentUserAccountID: number, policy?: Policy) {
+function isApproveAction(report: Report, reportTransactions: Transaction[], policy?: Policy) {
     const isAnyReceiptBeingScanned = reportTransactions?.some((transaction) => isScanning(transaction));
 
     if (isAnyReceiptBeingScanned) {
         return false;
     }
+
+    const currentUserAccountID = getCurrentUserAccountID();
     const managerID = report?.managerID ?? CONST.DEFAULT_NUMBER_ID;
     const isCurrentUserManager = managerID === currentUserAccountID;
     if (!isCurrentUserManager) {
@@ -206,7 +209,7 @@ function isPrimaryPayAction(
 
     const parentReport = getParentReport(report);
     if (parentReport?.invoiceReceiver?.type === CONST.REPORT.INVOICE_RECEIVER_TYPE.INDIVIDUAL && reimbursableSpend > 0) {
-        return parentReport?.invoiceReceiver?.accountID === currentUserAccountID;
+        return parentReport?.invoiceReceiver?.accountID === getCurrentUserAccountID();
     }
 
     return invoiceReceiverPolicy?.role === CONST.POLICY.ROLE.ADMIN && reimbursableSpend > 0;
@@ -446,7 +449,7 @@ function getReportPrimaryAction(params: GetReportPrimaryActionParams): ValueOf<t
         return CONST.REPORT.PRIMARY_ACTIONS.REVIEW_DUPLICATES;
     }
 
-    if (isApproveAction(report, reportTransactions, currentUserAccountID, policy)) {
+    if (isApproveAction(report, reportTransactions, policy)) {
         return CONST.REPORT.PRIMARY_ACTIONS.APPROVE;
     }
 
diff --git a/src/libs/ReportSecondaryActionUtils.ts b/src/libs/ReportSecondaryActionUtils.ts
index ff7ef7ca94aa..b35082415cd6 100644
--- a/src/libs/ReportSecondaryActionUtils.ts
+++ b/src/libs/ReportSecondaryActionUtils.ts
@@ -4,6 +4,7 @@ import CONST from '@src/CONST';
 import ONYXKEYS from '@src/ONYXKEYS';
 import type {BankAccountList, ExportTemplate, Policy, Report, ReportAction, ReportMetadata, ReportNameValuePairs, Transaction, TransactionViolation} from '@src/types/onyx';
 import {isApprover as isApproverUtils} from './actions/Policy/Member';
+import {getCurrentUserAccountID} from './actions/Report';
 import {areTransactionsEligibleForMerge} from './MergeTransactionUtils';
 import {getLoginByAccountID} from './PersonalDetailsUtils';
 import {
@@ -67,7 +68,7 @@ import {
     allHavePendingRTERViolation,
     getOriginalTransactionWithSplitInfo,
     hasReceipt as hasReceiptTransactionUtils,
-    hasSmartScanFailedOrNoRouteViolation,
+    hasSmartScanFailedViolation,
     isDistanceRequest as isDistanceRequestTransactionUtils,
     isDuplicate,
     isManagedCardTransaction as isManagedCardTransactionTransactionUtils,
@@ -94,7 +95,6 @@ function isSplitAction(
     reportTransactions: Array<OnyxEntry<Transaction>>,
     originalTransaction: OnyxEntry<Transaction>,
     currentUserLogin: string,
-    currentUserAccountID: number,
     policy?: OnyxEntry<Policy>,
 ): boolean {
     if (Number(reportTransactions?.length) !== 1 || !report) {
@@ -132,7 +132,7 @@ function isSplitAction(
 
     const isSubmitter = isCurrentUserSubmitter(report);
     const isAdmin = policy?.role === CONST.POLICY.ROLE.ADMIN;
-    const isManager = (report.managerID ?? CONST.DEFAULT_NUMBER_ID) === currentUserAccountID;
+    const isManager = (report.managerID ?? CONST.DEFAULT_NUMBER_ID) === getCurrentUserAccountID();
     const isOpenReport = isOpenReportUtils(report);
     const isPolicyExpenseChat = !!policy?.isPolicyExpenseChatEnabled;
     const userIsPolicyMember = isPolicyMember(policy, currentUserLogin);
@@ -172,7 +172,7 @@ function isSubmitAction({
     primaryAction?: ValueOf<typeof CONST.REPORT.PRIMARY_ACTIONS> | '';
     violations?: OnyxCollection<TransactionViolation[]>;
     currentUserLogin?: string;
-    currentUserAccountID: number;
+    currentUserAccountID?: number;
 }): boolean {
     if (isArchivedReport(reportNameValuePairs) || isChatReportArchived) {
         return false;
@@ -195,7 +195,7 @@ function isSubmitAction({
     }
 
     if (violations && currentUserLogin && currentUserAccountID !== undefined) {
-        if (reportTransactions.some((transaction) => hasSmartScanFailedOrNoRouteViolation(transaction, violations, currentUserLogin, currentUserAccountID, report, policy))) {
+        if (reportTransactions.some((transaction) => hasSmartScanFailedViolation(transaction, violations, currentUserLogin, currentUserAccountID, report, policy))) {
             return false;
         }
     }
@@ -216,8 +216,7 @@ function isSubmitAction({
 
     const isReportSubmitter = isCurrentUserSubmitter(report);
     const isAdmin = policy?.role === CONST.POLICY.ROLE.ADMIN;
-
-    const isManager = report.managerID === currentUserAccountID;
+    const isManager = report.managerID === getCurrentUserAccountID();
     if (!isReportSubmitter && !isAdmin && !isManager) {
         return false;
     }
@@ -254,20 +253,14 @@ function isSubmitAction({
     return !!isScheduledSubmitEnabled || !isPrimarySubmitAction;
 }
 
-function isApproveAction(
-    currentUserLogin: string,
-    currentUserAccountID: number,
-    report: Report,
-    reportTransactions: Transaction[],
-    violations: OnyxCollection<TransactionViolation[]>,
-    policy?: Policy,
-): boolean {
+function isApproveAction(currentUserLogin: string, report: Report, reportTransactions: Transaction[], violations: OnyxCollection<TransactionViolation[]>, policy?: Policy): boolean {
     const isAnyReceiptBeingScanned = reportTransactions?.some((transaction) => isReceiptBeingScanned(transaction));
 
     if (isAnyReceiptBeingScanned) {
         return false;
     }
 
+    const currentUserAccountID = getCurrentUserAccountID();
     const managerID = report?.managerID ?? CONST.DEFAULT_NUMBER_ID;
     const isCurrentUserManager = managerID === currentUserAccountID;
     if (!isCurrentUserManager) {
@@ -318,14 +311,14 @@ function isApproveAction(
     return userControlsReport && shouldShowBrokenConnectionViolation;
 }
 
-function isUnapproveAction(currentUserLogin: string, currentUserAccountID: number, report: Report, policy?: Policy): boolean {
+function isUnapproveAction(currentUserLogin: string, report: Report, policy?: Policy): boolean {
     const isExpenseReport = isExpenseReportUtils(report);
     const isReportApprover = isApproverUtils(policy, currentUserLogin);
     const isReportApproved = isReportApprovedUtils({report});
     const isReportSettled = isSettled(report);
     const isPaymentProcessing = report.isWaitingOnBankAccount && report.statusNum === CONST.REPORT.STATUS_NUM.APPROVED;
     const isAdmin = policy?.role === CONST.POLICY.ROLE.ADMIN;
-    const isManager = report.managerID === currentUserAccountID;
+    const isManager = report.managerID === getCurrentUserAccountID();
 
     if (isReportSettled || !isExpenseReport || !isReportApproved || isPaymentProcessing) {
         return false;
@@ -859,11 +852,11 @@ function getSecondaryReportActions({
         options.push(CONST.REPORT.SECONDARY_ACTIONS.SUBMIT);
     }
 
-    if (isApproveAction(currentUserLogin, currentUserAccountID, report, reportTransactions, violations, policy)) {
+    if (isApproveAction(currentUserLogin, report, reportTransactions, violations, policy)) {
         options.push(CONST.REPORT.SECONDARY_ACTIONS.APPROVE);
     }
 
-    if (isUnapproveAction(currentUserLogin, currentUserAccountID, report, policy)) {
+    if (isUnapproveAction(currentUserLogin, report, policy)) {
         options.push(CONST.REPORT.SECONDARY_ACTIONS.UNAPPROVE);
     }
 
@@ -891,7 +884,7 @@ function getSecondaryReportActions({
         options.push(CONST.REPORT.SECONDARY_ACTIONS.REJECT);
     }
 
-    if (isSplitAction(report, reportTransactions, originalTransaction, currentUserLogin, currentUserAccountID, policy)) {
+    if (isSplitAction(report, reportTransactions, originalTransaction, currentUserLogin, policy)) {
         options.push(CONST.REPORT.SECONDARY_ACTIONS.SPLIT);
     }
 
@@ -958,7 +951,6 @@ function getSecondaryExportReportActions(
 
 function getSecondaryTransactionThreadActions(
     currentUserLogin: string,
-    currentUserAccountID: number,
     parentReport: Report,
     reportTransaction: Transaction,
     reportAction: ReportAction | undefined,
@@ -980,7 +972,7 @@ function getSecondaryTransactionThreadActions(
         options.push(CONST.REPORT.TRANSACTION_SECONDARY_ACTIONS.REJECT);
     }
 
-    if (isSplitAction(parentReport, [reportTransaction], originalTransaction, currentUserLogin, currentUserAccountID, policy)) {
+    if (isSplitAction(parentReport, [reportTransaction], originalTransaction, currentUserLogin, policy)) {
         options.push(CONST.REPORT.TRANSACTION_SECONDARY_ACTIONS.SPLIT);
     }
 
diff --git a/src/libs/ReportTitleUtils.ts b/src/libs/ReportTitleUtils.ts
index b865def86ff8..fb7482d684a3 100644
--- a/src/libs/ReportTitleUtils.ts
+++ b/src/libs/ReportTitleUtils.ts
@@ -52,7 +52,7 @@ function getTitleFieldFromRNVP(reportID: string) {
  * Update title field in report's rNVP to match the policy's title field configuration
  * This is the JavaScript equivalent of the backend updateTitleFieldToMatchPolicy function
  */
-function updateTitleFieldToMatchPolicy(reportID: string, policy?: Policy): Array<OnyxUpdate<typeof ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS>> {
+function updateTitleFieldToMatchPolicy(reportID: string, policy?: Policy): OnyxUpdate[] {
     if (!Permissions.isBetaEnabled(CONST.BETAS.CUSTOM_REPORT_NAMES, betas, betaConfiguration)) {
         return [];
     }
@@ -86,7 +86,7 @@ function updateTitleFieldToMatchPolicy(reportID: string, policy?: Policy): Array
 /**
  * Remove title field from report's rNVP when report is manually renamed to indicate that the manual name should be preserved, and the custom report name formula should no longer update the name.
  */
-function removeTitleFieldFromReport(reportID: string): Array<OnyxUpdate<typeof ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS>> {
+function removeTitleFieldFromReport(reportID: string): OnyxUpdate[] {
     if (!Permissions.isBetaEnabled(CONST.BETAS.CUSTOM_REPORT_NAMES, betas, betaConfiguration)) {
         return [];
     }
diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts
index 5a175810170b..416ac9d0430e 100644
--- a/src/libs/ReportUtils.ts
+++ b/src/libs/ReportUtils.ts
@@ -59,8 +59,6 @@ import type {
     Task,
     Transaction,
     TransactionViolation,
-    TransactionViolations,
-    VisibleReportActionsDerivedValue,
 } from '@src/types/onyx';
 import type {ReportTransactionsAndViolations} from '@src/types/onyx/DerivedValues';
 import type {Attendee, Participant} from '@src/types/onyx/IOU';
@@ -187,8 +185,6 @@ import {
     getExportIntegrationLastMessageText,
     getForwardsToUpdateMessage,
     getIntegrationSyncFailedMessage,
-    getInvoiceCompanyNameUpdateMessage,
-    getInvoiceCompanyWebsiteUpdateMessage,
     getIOUActionForTransactionID,
     getIOUReportIDFromReportActionPreview,
     getJoinRequestMessage,
@@ -206,10 +202,7 @@ import {
     getPolicyChangeLogDefaultReimbursableMessage,
     getPolicyChangeLogDefaultTitleEnforcedMessage,
     getPolicyChangeLogDefaultTitleMessage,
-    getPolicyChangeLogMaxExpenseAgeMessage,
-    getPolicyChangeLogMaxExpenseAmountMessage,
     getPolicyChangeLogMaxExpenseAmountNoReceiptMessage,
-    getReimburserUpdateMessage,
     getRenamedAction,
     getReportAction,
     getReportActionActorAccountID,
@@ -220,7 +213,6 @@ import {
     getSortedReportActions,
     getSubmitsToUpdateMessage,
     getTravelUpdateMessage,
-    getUpdateACHAccountMessage,
     getWorkspaceAttendeeTrackingUpdateMessage,
     getWorkspaceCurrencyUpdateMessage,
     getWorkspaceCustomUnitRateAddedMessage,
@@ -261,7 +253,6 @@ import {
     isRenamedAction,
     isReopenedAction,
     isReportActionAttachment,
-    isReportActionVisible,
     isReportPreviewAction,
     isRetractedAction,
     isReversedTransaction,
@@ -276,6 +267,7 @@ import {
     isTripPreview,
     isUnapprovedAction,
     isWhisperAction,
+    shouldReportActionBeVisible,
     wasActionTakenByCurrentUser,
 } from './ReportActionsUtils';
 import type {LastVisibleMessage} from './ReportActionsUtils';
@@ -304,7 +296,6 @@ import {
     getConvertedAmount,
     getCurrency,
     getDescription,
-    getDistanceInMeters,
     getFormattedCreated,
     getFormattedPostedDate,
     getMCCGroup,
@@ -319,6 +310,7 @@ import {
     getTaxAmount,
     getTaxCode,
     getAmount as getTransactionAmount,
+    getTransactionViolationsOfTransaction,
     getWaypoints,
     hasMissingSmartscanFields as hasMissingSmartscanFieldsTransactionUtils,
     hasNoticeTypeViolation,
@@ -330,9 +322,7 @@ import {
     isDistanceRequest,
     isExpensifyCardTransaction,
     isFetchingWaypointsFromServer,
-    isManagedCardTransaction,
     isManualDistanceRequest as isManualDistanceRequestTransactionUtils,
-    isMapDistanceRequest,
     isOnHold as isOnHoldTransactionUtils,
     isPayAtEndExpense,
     isPending,
@@ -692,9 +682,9 @@ type OptimisticTaskReportAction = Pick<
 >;
 
 type AnnounceRoomOnyxData = {
-    onyxOptimisticData: Array<OnyxUpdate<typeof ONYXKEYS.COLLECTION.REPORT | typeof ONYXKEYS.COLLECTION.REPORT_DRAFT | typeof ONYXKEYS.COLLECTION.REPORT_ACTIONS>>;
-    onyxSuccessData: Array<OnyxUpdate<typeof ONYXKEYS.COLLECTION.REPORT | typeof ONYXKEYS.COLLECTION.REPORT_METADATA | typeof ONYXKEYS.COLLECTION.REPORT_ACTIONS>>;
-    onyxFailureData: Array<OnyxUpdate<typeof ONYXKEYS.COLLECTION.REPORT | typeof ONYXKEYS.COLLECTION.REPORT_METADATA | typeof ONYXKEYS.COLLECTION.REPORT_ACTIONS>>;
+    onyxOptimisticData: OnyxUpdate[];
+    onyxSuccessData: OnyxUpdate[];
+    onyxFailureData: OnyxUpdate[];
 };
 
 type OptimisticAnnounceChat = {
@@ -910,11 +900,9 @@ type OptionData = {
     ReportNameValuePairs;
 
 type OnyxDataTaskAssigneeChat = {
-    optimisticData: Array<OnyxUpdate<typeof ONYXKEYS.COLLECTION.REPORT | typeof ONYXKEYS.COLLECTION.REPORT_METADATA | typeof ONYXKEYS.COLLECTION.REPORT_ACTIONS>>;
-    successData: Array<
-        OnyxUpdate<typeof ONYXKEYS.COLLECTION.REPORT | typeof ONYXKEYS.COLLECTION.REPORT_METADATA | typeof ONYXKEYS.PERSONAL_DETAILS_LIST | typeof ONYXKEYS.COLLECTION.REPORT_ACTIONS>
-    >;
-    failureData: Array<OnyxUpdate<typeof ONYXKEYS.COLLECTION.REPORT | typeof ONYXKEYS.COLLECTION.REPORT_ACTIONS | typeof ONYXKEYS.PERSONAL_DETAILS_LIST>>;
+    optimisticData: OnyxUpdate[];
+    successData: OnyxUpdate[];
+    failureData: OnyxUpdate[];
     optimisticAssigneeAddComment?: OptimisticReportAction;
     optimisticChatCreatedReportAction?: OptimisticCreatedReportAction;
 };
@@ -937,6 +925,12 @@ type OutstandingChildRequest = {
 };
 
 type ParsingDetails = {
+    /**
+     * this param is deprecated
+     * Currently there are no calls/reference that use this param
+     * This should be removed after https://github.com/Expensify/App/issues/50724 as a followup
+     */
+    shouldEscapeText?: boolean;
     reportID?: string;
     policyID?: string;
 };
@@ -1006,11 +1000,11 @@ getEnvironment().then((env) => {
 // Example case: when we need to get a report name of a thread which is dependent on a report action message.
 const parsedReportActionMessageCache: Record<string, string> = {};
 
-let conciergeReportIDOnyxConnect: OnyxEntry<string>;
+let conciergeReportID: OnyxEntry<string>;
 Onyx.connectWithoutView({
     key: ONYXKEYS.CONCIERGE_REPORT_ID,
     callback: (value) => {
-        conciergeReportIDOnyxConnect = value;
+        conciergeReportID = value;
     },
 });
 
@@ -1325,17 +1319,6 @@ function getParentReport(report: OnyxEntry<Report>): OnyxEntry<Report> {
     return getReport(report.parentReportID, allReports);
 }
 
-/**
- * Returns the appropriate report to use for display.
- * For invoice chat threads, returns the parent invoice report.
- * For other cases, returns the provided report.
- */
-function getReportForHeader(report: OnyxEntry<Report>): OnyxEntry<Report> {
-    const parentReport = getParentReport(report);
-    const isParentInvoiceAndIsChatThread = isChatThread(report) && isInvoiceReport(parentReport);
-    return isParentInvoiceAndIsChatThread ? parentReport : report;
-}
-
 /**
  * Returns the root parentReport if the given report is nested.
  * Uses recursion to iterate any depth of nested reports.
@@ -1898,8 +1881,8 @@ function getReportNotificationPreference(report: OnyxEntry<Report>): ValueOf<typ
 /**
  * Only returns true if this is our main 1:1 DM report with Concierge.
  */
-function isConciergeChatReport(report: OnyxInputOrEntry<Report>, conciergeReportID?: string): boolean {
-    return !!report && report?.reportID === (conciergeReportID ?? conciergeReportIDOnyxConnect);
+function isConciergeChatReport(report: OnyxInputOrEntry<Report>): boolean {
+    return !!report && report?.reportID === conciergeReportID;
 }
 
 function findSelfDMReportID(): string | undefined {
@@ -1925,9 +1908,9 @@ function isPolicyRelatedReport(report: OnyxEntry<Report>, policyID?: string) {
  * Checks if the supplied report belongs to workspace based on the provided params. If the report's policyID is _FAKE_ or has no value, it means this report is a DM.
  * In this case report and workspace members must be compared to determine whether the report belongs to the workspace.
  */
-function doesReportBelongToWorkspace(report: OnyxEntry<Report>, policyMemberAccountIDs: number[], policyID: string | undefined, conciergeReportID: string) {
+function doesReportBelongToWorkspace(report: OnyxEntry<Report>, policyMemberAccountIDs: number[], policyID?: string) {
     return (
-        isConciergeChatReport(report, conciergeReportID) ||
+        isConciergeChatReport(report) ||
         (report?.policyID === CONST.POLICY.ID_FAKE || !report?.policyID ? hasParticipantInArray(report, policyMemberAccountIDs) : isPolicyRelatedReport(report, policyID))
     );
 }
@@ -1990,7 +1973,7 @@ function shouldEnableNegative(report: OnyxEntry<Report>, policy?: OnyxEntry<Poli
  * Given an array of reports, return them filtered by a policyID and policyMemberAccountIDs.
  */
 function filterReportsByPolicyIDAndMemberAccountIDs(reports: Array<OnyxEntry<Report>>, policyMemberAccountIDs: number[] = [], policyID?: string) {
-    return reports.filter((report) => !!report && doesReportBelongToWorkspace(report, policyMemberAccountIDs, policyID, conciergeReportIDOnyxConnect ?? ''));
+    return reports.filter((report) => !!report && doesReportBelongToWorkspace(report, policyMemberAccountIDs, policyID));
 }
 
 /**
@@ -2036,9 +2019,7 @@ function isAwaitingFirstLevelApproval(report: OnyxEntry<Report>): boolean {
  * @param tagListsUpdate - Changed tag properties, if none pass empty object
  */
 function pushTransactionViolationsOnyxData(
-    onyxData: OnyxData<
-        typeof ONYXKEYS.COLLECTION.POLICY_CATEGORIES | typeof ONYXKEYS.COLLECTION.POLICY | typeof ONYXKEYS.COLLECTION.POLICY_TAGS | typeof ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS
-    >,
+    onyxData: OnyxData,
     policyData: PolicyData,
     policyUpdate: Partial<Policy> = {},
     categoriesUpdate: Record<string, Partial<PolicyCategory>> = {},
@@ -2482,12 +2463,12 @@ function isPolicyExpenseChatAdmin(report: OnyxEntry<Report>, policies: OnyxColle
 /**
  * Checks if the current user is the admin of the policy.
  */
-function isPolicyAdmin(policy: OnyxEntry<Policy>): boolean {
-    if (!policy || !policy.id) {
+function isPolicyAdmin(policyID: string | undefined, policies: OnyxCollection<Policy>): boolean {
+    if (!policyID) {
         return false;
     }
 
-    const policyRole = policy?.role;
+    const policyRole = policies?.[`${ONYXKEYS.COLLECTION.POLICY}${policyID}`]?.role;
 
     return policyRole === CONST.POLICY.ROLE.ADMIN;
 }
@@ -2590,12 +2571,12 @@ function isMoneyRequestReport(reportOrID: OnyxInputOrEntry<Report> | string, rep
 /**
  * Determines the Help Panel report type based on the given report.
  */
-function getHelpPaneReportType(report: OnyxEntry<Report>, conciergeReportID: string): ValueOf<typeof CONST.REPORT.HELP_TYPE> | undefined {
+function getHelpPaneReportType(report: OnyxEntry<Report>): ValueOf<typeof CONST.REPORT.HELP_TYPE> | undefined {
     if (!report) {
         return undefined;
     }
 
-    if (isConciergeChatReport(report, conciergeReportID)) {
+    if (isConciergeChatReport(report)) {
         return CONST.REPORT.HELP_TYPE.CHAT_CONCIERGE;
     }
 
@@ -2877,13 +2858,7 @@ function isMoneyRequestReportEligibleForMerge(reportOrReportID: Report | string,
     return isManager && isExpenseReport(report) && isProcessingReport(report);
 }
 
-function hasOutstandingChildRequest(
-    chatReport: Report,
-    iouReportOrID: OnyxEntry<Report> | string,
-    currentUserEmailParam: string,
-    allTransactionViolations: OnyxCollection<TransactionViolations>,
-    bankAccountList: OnyxEntry<BankAccountList>,
-) {
+function hasOutstandingChildRequest(chatReport: Report, iouReportOrID: OnyxEntry<Report> | string, currentUserEmailParam: string, bankAccountList: OnyxEntry<BankAccountList>) {
     const reportActions = getAllReportActions(chatReport.reportID);
     // This will be fixed as part of https://github.com/Expensify/Expensify/issues/507850
     // eslint-disable-next-line @typescript-eslint/no-deprecated
@@ -2911,7 +2886,7 @@ function hasOutstandingChildRequest(
                 if (!transactionID) {
                     return false;
                 }
-                const transactionViolations = allTransactionViolations?.[`${ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS}${transactionID}`] ?? [];
+                const transactionViolations = getTransactionViolationsOfTransaction(transactionID);
                 return transactionViolations.some((violation) => violation.name === CONST.VIOLATIONS.AUTO_REPORTED_REJECTED_EXPENSE);
             });
         const canSubmit = !hasAutoRejectedTransactionsForManager && canSubmitReport(iouReport, policy, transactions, undefined, false, currentUserEmailParam);
@@ -4349,7 +4324,7 @@ function isReportFieldDisabled(report: OnyxEntry<Report>, reportField: OnyxEntry
     const isReportSettled = isSettled(report?.reportID);
     const isReportClosed = isClosedReport(report);
     const isTitleField = isReportFieldOfTypeTitle(reportField);
-    const isAdmin = isPolicyAdmin(policy);
+    const isAdmin = isPolicyAdmin(report?.policyID, {[`${ONYXKEYS.COLLECTION.POLICY}${policy?.id}`]: policy});
     const isApproved = isReportApproved({report});
     if (!isAdmin && (isReportSettled || isReportClosed || isApproved)) {
         return true;
@@ -4555,11 +4530,6 @@ function canEditMoneyRequest(
         return false;
     }
 
-    // Domain admins can report unreported managed card transactions
-    if (transaction.reportID === CONST.REPORT.UNREPORTED_REPORT_ID && isManagedCardTransaction(transaction)) {
-        return true;
-    }
-
     const moneyRequestReportID = originalMessage?.IOUReportID;
     const isRequestor = currentUserAccountID === reportAction?.actorAccountID;
 
@@ -4842,7 +4812,7 @@ function canModifyHoldStatus(report: Report, reportAction: ReportAction): boolea
     if (!isMoneyRequestReport(report) || isTrackExpenseReport(report)) {
         return false;
     }
-    const isAdmin = isPolicyAdmin(allPolicies?.[`${ONYXKEYS.COLLECTION.POLICY}${report.policyID}`]);
+    const isAdmin = isPolicyAdmin(report.policyID, allPolicies);
     const isActionOwner = isActionCreator(reportAction);
     const isManager = isMoneyRequestReport(report) && report?.managerID !== null && currentUserPersonalDetails?.accountID === report?.managerID;
 
@@ -4985,10 +4955,19 @@ function getLinkedTransaction(reportAction: OnyxEntry<ReportAction | OptimisticI
     return transactions ? transactions.find((transaction) => transaction.transactionID === transactionID) : allTransactions?.[`${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`];
 }
 
+/**
+ * Check if any of the transactions in the report has required missing fields
+ */
+function hasMissingSmartscanFields(iouReportID: string | undefined, transactions?: Transaction[]): boolean {
+    const reportTransactions = transactions ?? getReportTransactions(iouReportID);
+
+    return reportTransactions.some((transaction) => hasMissingSmartscanFieldsTransactionUtils(transaction));
+}
+
 /**
  * Get report action which is missing smartscan fields
  */
-function getReportActionWithMissingSmartscanFields(report: OnyxEntry<Report>, iouReportID: string | undefined): ReportAction | undefined {
+function getReportActionWithMissingSmartscanFields(iouReportID: string | undefined): ReportAction | undefined {
     const reportActions = Object.values(getAllReportActions(iouReportID));
     return reportActions.find((action) => {
         if (!isMoneyRequestAction(action)) {
@@ -5001,15 +4980,15 @@ function getReportActionWithMissingSmartscanFields(report: OnyxEntry<Report>, io
         if (!wasActionTakenByCurrentUser(action)) {
             return false;
         }
-        return hasMissingSmartscanFieldsTransactionUtils(transaction, report);
+        return hasMissingSmartscanFieldsTransactionUtils(transaction);
     });
 }
 
 /**
  * Check if iouReportID has required missing fields
  */
-function shouldShowRBRForMissingSmartscanFields(report: OnyxEntry<Report>, iouReportID: string | undefined): boolean {
-    return !!getReportActionWithMissingSmartscanFields(report, iouReportID);
+function shouldShowRBRForMissingSmartscanFields(iouReportID: string | undefined): boolean {
+    return !!getReportActionWithMissingSmartscanFields(iouReportID);
 }
 
 /**
@@ -5047,8 +5026,7 @@ function getTransactionReportName({
         return translateLocal('iou.receiptScanning', {count: 1});
     }
 
-    const report = getReportOrDraftReport(transaction?.reportID, reports);
-    if (hasMissingSmartscanFieldsTransactionUtils(transaction, report)) {
+    if (hasMissingSmartscanFieldsTransactionUtils(transaction)) {
         // eslint-disable-next-line @typescript-eslint/no-deprecated
         return translateLocal('iou.receiptMissingDetails');
     }
@@ -5058,16 +5036,11 @@ function getTransactionReportName({
         return translateLocal('iou.fieldPending');
     }
 
-    // The unit does not matter as we are only interested in whether the distance is zero or not
-    if (isMapDistanceRequest(transaction) && !getDistanceInMeters(transaction, CONST.CUSTOM_UNITS.DISTANCE_UNIT_KILOMETERS)) {
-        // eslint-disable-next-line @typescript-eslint/no-deprecated
-        return translateLocal('violations.noRoute');
-    }
-
     if (isSentMoneyReportAction(reportAction)) {
         return getIOUReportActionDisplayMessage(reportAction as ReportAction, transaction);
     }
 
+    const report = getReportOrDraftReport(transaction?.reportID, reports);
     const amount = getTransactionAmount(transaction, !isEmptyObject(report) && isExpenseReport(report), transaction?.reportID === CONST.REPORT.UNREPORTED_REPORT_ID) ?? 0;
     const formattedAmount = convertToDisplayString(amount, getCurrency(transaction)) ?? '';
     const comment = getMerchantOrDescription(transaction);
@@ -5125,7 +5098,7 @@ function getReportPreviewMessage(
                 return translateLocal('iou.receiptScanning', {count: 1});
             }
 
-            if (hasMissingSmartscanFieldsTransactionUtils(linkedTransaction, report)) {
+            if (hasMissingSmartscanFieldsTransactionUtils(linkedTransaction)) {
                 // eslint-disable-next-line @typescript-eslint/no-deprecated
                 return translateLocal('iou.receiptMissingDetails');
             }
@@ -5161,7 +5134,7 @@ function getReportPreviewMessage(
                 return translateLocal('iou.receiptScanning', {count: 1});
             }
 
-            if (hasMissingSmartscanFieldsTransactionUtils(linkedTransaction, report)) {
+            if (hasMissingSmartscanFieldsTransactionUtils(linkedTransaction)) {
                 // eslint-disable-next-line @typescript-eslint/no-deprecated
                 return translateLocal('iou.receiptMissingDetails');
             }
@@ -5262,7 +5235,7 @@ function getReportPreviewMessage(
         }
         if (translatePhraseKey === 'iou.payerPaidAmount') {
             // eslint-disable-next-line @typescript-eslint/no-deprecated
-            return translateLocal(translatePhraseKey, formattedAmount, payerDisplayName ?? '');
+            return translateLocal(translatePhraseKey, '', payerDisplayName ?? '');
         }
     }
 
@@ -5407,7 +5380,7 @@ function getModifiedExpenseOriginalMessage(
         originalMessage.oldMerchant = getMerchant(oldTransaction);
 
         // For the originalMessage, we should use the non-negative amount, similar to what getAmount does for oldAmount
-        originalMessage.amount = Math.abs(Number(updatedTransaction?.modifiedAmount ?? 0));
+        originalMessage.amount = Math.abs(updatedTransaction?.modifiedAmount ?? 0);
         originalMessage.currency = updatedTransaction?.modifiedCurrency ?? CONST.CURRENCY.USD;
         originalMessage.merchant = updatedTransaction?.modifiedMerchant;
     }
@@ -5676,10 +5649,6 @@ function getReportName(
         // eslint-disable-next-line @typescript-eslint/no-deprecated
         return getWorkspaceFeatureEnabledMessage(translateLocal, parentReportAction);
     }
-    if (parentReportAction?.actionName === CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_ACH_ACCOUNT) {
-        // eslint-disable-next-line @typescript-eslint/no-deprecated
-        return getUpdateACHAccountMessage(translateLocal, parentReportAction);
-    }
     if (parentReportAction?.actionName === CONST.REPORT.ACTIONS.TYPE.MERGED_WITH_CASH_TRANSACTION) {
         // eslint-disable-next-line @typescript-eslint/no-deprecated
         return translateLocal('systemMessage.mergedWithCashTransaction');
@@ -5711,14 +5680,7 @@ function getReportName(
     if (isActionOfType(parentReportAction, CONST.REPORT.ACTIONS.TYPE.MOVED_TRANSACTION)) {
         return Parser.htmlToText(getMovedTransactionMessage(parentReportAction));
     }
-    if (isActionOfType(parentReportAction, CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_MAX_EXPENSE_AMOUNT)) {
-        // eslint-disable-next-line @typescript-eslint/no-deprecated
-        return getPolicyChangeLogMaxExpenseAmountMessage(translateLocal, parentReportAction);
-    }
-    if (isActionOfType(parentReportAction, CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_MAX_EXPENSE_AGE)) {
-        // eslint-disable-next-line @typescript-eslint/no-deprecated
-        return getPolicyChangeLogMaxExpenseAgeMessage(translateLocal, parentReportAction);
-    }
+
     if (isActionOfType(parentReportAction, CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_MAX_EXPENSE_AMOUNT_NO_RECEIPT)) {
         // eslint-disable-next-line @typescript-eslint/no-deprecated
         return getPolicyChangeLogMaxExpenseAmountNoReceiptMessage(translateLocal, parentReportAction);
@@ -5760,18 +5722,6 @@ function getReportName(
         // eslint-disable-next-line @typescript-eslint/no-deprecated
         return getForwardsToUpdateMessage(translateLocal, parentReportAction);
     }
-    if (isActionOfType(parentReportAction, CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_INVOICE_COMPANY_NAME)) {
-        // eslint-disable-next-line @typescript-eslint/no-deprecated
-        return getInvoiceCompanyNameUpdateMessage(translateLocal, parentReportAction);
-    }
-    if (isActionOfType(parentReportAction, CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_INVOICE_COMPANY_WEBSITE)) {
-        // eslint-disable-next-line @typescript-eslint/no-deprecated
-        return getInvoiceCompanyWebsiteUpdateMessage(translateLocal, parentReportAction);
-    }
-    if (isActionOfType(parentReportAction, CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_REIMBURSER)) {
-        // eslint-disable-next-line @typescript-eslint/no-deprecated
-        return getReimburserUpdateMessage(translateLocal, parentReportAction);
-    }
 
     if (isActionOfType(parentReportAction, CONST.REPORT.ACTIONS.TYPE.ACTIONABLE_CARD_FRAUD_ALERT) && getOriginalMessage(parentReportAction)?.resolution) {
         // eslint-disable-next-line @typescript-eslint/no-deprecated
@@ -6021,13 +5971,7 @@ function getReportName(
     }
 
     if (isInvoiceRoom(report)) {
-        formattedName = getInvoicesChatName({
-            report,
-            receiverPolicy: invoiceReceiverPolicy,
-            personalDetails,
-            policies,
-            currentUserAccountID,
-        });
+        formattedName = getInvoicesChatName({report, receiverPolicy: invoiceReceiverPolicy, personalDetails, policies});
     }
 
     if (isSelfDM(report)) {
@@ -6048,7 +5992,7 @@ function getReportName(
     }
 
     // Not a room or PolicyExpenseChat, generate title from first 5 other participants
-    formattedName = buildReportNameFromParticipantNames({report, personalDetailsList: personalDetails, currentUserAccountID});
+    formattedName = buildReportNameFromParticipantNames({report, personalDetailsList: personalDetails});
 
     const finalName = formattedName || (report?.reportName ?? '');
 
@@ -6063,40 +6007,6 @@ function getReportName(
 function getSearchReportName(props: GetReportNameParams): string {
     const {report, policy} = props;
     if (isChatThread(report) && policy?.name) {
-        // Traverse up the parent chain to find the first expense report
-        // If found, return the expense report name instead of workspace name
-        let currentParent = getParentReport(report);
-        const visitedReportIDs = new Set<string>();
-
-        while (currentParent) {
-            if (!currentParent.reportID) {
-                break;
-            }
-            if (visitedReportIDs.has(currentParent.reportID)) {
-                break;
-            }
-            visitedReportIDs.add(currentParent.reportID);
-
-            if (isExpenseReport(currentParent)) {
-                // eslint-disable-next-line @typescript-eslint/no-deprecated
-                return getReportName(
-                    currentParent,
-                    policy,
-                    props.parentReportActionParam,
-                    props.personalDetails,
-                    props.invoiceReceiverPolicy,
-                    undefined,
-                    props.transactions,
-                    props.isReportArchived,
-                    props.reports,
-                    props.policies,
-                );
-            }
-
-            // Continue traversing up the parent chain
-            currentParent = getParentReport(currentParent);
-        }
-
         return policy.name;
     }
     // This will be fixed as follow up https://github.com/Expensify/App/pull/75357
@@ -6291,7 +6201,7 @@ function goBackToDetailsPage(report: OnyxEntry<Report>, backTo?: string, shouldG
     }
 }
 
-function navigateBackOnDeleteTransaction(backRoute: Route | undefined) {
+function navigateBackOnDeleteTransaction(backRoute: Route | undefined, isFromRHP?: boolean) {
     if (!backRoute) {
         return;
     }
@@ -6299,10 +6209,25 @@ function navigateBackOnDeleteTransaction(backRoute: Route | undefined) {
     const rootState = navigationRef.current?.getRootState();
     const lastFullScreenRoute = rootState?.routes.findLast((route) => isFullScreenName(route.name));
     if (lastFullScreenRoute?.name === NAVIGATORS.SEARCH_FULLSCREEN_NAVIGATOR) {
-        Navigation.dismissToSuperWideRHP();
+        const searchFullScreenRoutes = rootState?.routes.findLast((route) => route.name === NAVIGATORS.SEARCH_FULLSCREEN_NAVIGATOR);
+        const lastRoute = searchFullScreenRoutes?.state?.routes?.at(-1);
+        if (lastRoute?.name === SCREENS.SEARCH.MONEY_REQUEST_REPORT) {
+            const lastRouteParams = lastRoute?.params;
+            const newBackRoute = lastRouteParams && 'backTo' in lastRouteParams ? lastRouteParams?.backTo : undefined;
+            if (isFromRHP) {
+                Navigation.dismissModal();
+            }
+            Navigation.isNavigationReady().then(() => {
+                Navigation.goBack(newBackRoute as Route);
+            });
+            return;
+        }
+        Navigation.dismissModal();
         return;
     }
-    Navigation.dismissToSuperWideRHP();
+    if (isFromRHP) {
+        Navigation.dismissModal();
+    }
     Navigation.isNavigationReady().then(() => {
         Navigation.goBack(backRoute);
     });
@@ -6444,15 +6369,20 @@ function getPolicyDescriptionText(policy: OnyxEntry<Policy>): string {
     return Parser.htmlToText(policy.description);
 }
 
+/**
+ * Fixme the `shouldEscapeText` arg is never used (it's always set to undefined)
+ * it should be removed after https://github.com/Expensify/App/issues/50724 gets fixed as a followup
+ */
 function buildOptimisticAddCommentReportAction(
     text?: string,
     file?: FileObject,
     actorAccountID?: number,
     createdOffset = 0,
+    shouldEscapeText?: boolean,
     reportID?: string,
     reportActionID: string = rand64(),
 ): OptimisticReportAction {
-    const commentText = getParsedComment(text ?? '', {reportID});
+    const commentText = getParsedComment(text ?? '', {shouldEscapeText, reportID});
     const attachmentHtml = getUploadingAttachmentHtml(file);
 
     const htmlForNewComment = `${commentText}${commentText && attachmentHtml ? '<br /><br />' : ''}${attachmentHtml}`;
@@ -6564,7 +6494,7 @@ function buildOptimisticTaskCommentReportAction(
     actorAccountID?: number,
     createdOffset = 0,
 ): OptimisticReportAction {
-    const reportAction = buildOptimisticAddCommentReportAction(text, undefined, undefined, createdOffset, taskReportID);
+    const reportAction = buildOptimisticAddCommentReportAction(text, undefined, undefined, createdOffset, undefined, taskReportID);
     if (Array.isArray(reportAction.reportAction.message)) {
         const message = reportAction.reportAction.message.at(0);
         if (message) {
@@ -7134,14 +7064,17 @@ function getIOUReportActionMessage(
             if (isInvoice && isSettlingUp) {
                 iouMessage =
                     paymentType === CONST.IOU.PAYMENT_TYPE.ELSEWHERE
-                        ? `Mark ${amount} as paid`
-                        : `paid ${amount} with ${payAsBusiness ? 'business' : 'personal'} account ${String(bankAccountID).slice(-4)}`;
+                        ? // eslint-disable-next-line @typescript-eslint/no-deprecated
+                          translateLocal('iou.payElsewhere', {formattedAmount: amount})
+                        : // eslint-disable-next-line @typescript-eslint/no-deprecated
+                          translateLocal(payAsBusiness ? 'iou.settleInvoiceBusiness' : 'iou.settleInvoicePersonal', amount, String(bankAccountID).slice(-4));
             } else {
                 iouMessage = isSettlingUp ? `paid ${amount}${paymentMethodMessage}` : `sent ${amount}${comment && ` for ${comment}`}${paymentMethodMessage}`;
             }
             break;
         case CONST.REPORT.ACTIONS.TYPE.SUBMITTED:
-            iouMessage = amount;
+            // eslint-disable-next-line @typescript-eslint/no-deprecated
+            iouMessage = translateLocal('iou.expenseAmount', amount);
             break;
         default:
             break;
@@ -8143,7 +8076,8 @@ function buildOptimisticHoldReportAction(created = DateUtils.getDBTime()): Optim
             {
                 type: CONST.REPORT.MESSAGE.TYPE.TEXT,
                 style: 'normal',
-                text: 'held this expense',
+                // eslint-disable-next-line @typescript-eslint/no-deprecated
+                text: translateLocal('iou.heldExpense'),
             },
         ],
         person: [
@@ -8205,7 +8139,8 @@ function buildOptimisticUnHoldReportAction(created = DateUtils.getDBTime()): Opt
             {
                 type: CONST.REPORT.MESSAGE.TYPE.TEXT,
                 style: 'normal',
-                text: 'unheld this expense',
+                // eslint-disable-next-line @typescript-eslint/no-deprecated
+                text: translateLocal('iou.unheldExpense'),
             },
         ],
         person: [
@@ -8426,12 +8361,6 @@ function buildOptimisticClosedReportAction(
 function buildOptimisticDismissedViolationReportAction(
     originalMessage: ReportAction<typeof CONST.REPORT.ACTIONS.TYPE.DISMISSED_VIOLATION>['originalMessage'],
 ): OptimisticDismissedViolationReportAction {
-    let text = '';
-    if (originalMessage) {
-        const violationName = originalMessage.violationName as keyof typeof CONST.VIOLATION_DISMISSAL;
-        const reason = originalMessage.reason as keyof (typeof CONST.VIOLATION_DISMISSAL)[typeof violationName];
-        text = CONST.VIOLATION_DISMISSAL[violationName][reason];
-    }
     return {
         actionName: CONST.REPORT.ACTIONS.TYPE.DISMISSED_VIOLATION,
         actorAccountID: currentUserAccountID,
@@ -8441,7 +8370,8 @@ function buildOptimisticDismissedViolationReportAction(
             {
                 type: CONST.REPORT.MESSAGE.TYPE.TEXT,
                 style: 'normal',
-                text,
+                // eslint-disable-next-line @typescript-eslint/no-deprecated
+                text: getDismissedViolationMessageText(translateLocal, originalMessage),
             },
         ],
         originalMessage,
@@ -8468,7 +8398,8 @@ function buildOptimisticResolvedDuplicatesReportAction(): OptimisticDismissedVio
             {
                 type: CONST.REPORT.MESSAGE.TYPE.TEXT,
                 style: 'normal',
-                text: 'resolved the duplicate',
+                // eslint-disable-next-line @typescript-eslint/no-deprecated
+                text: translateLocal('violations.resolvedDuplicates'),
             },
         ],
         pendingAction: CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD,
@@ -9125,23 +9056,14 @@ function isReportNotFound(report: OnyxEntry<Report>): boolean {
 /**
  * Check if the report is the parent report of the currently viewed report or at least one child report has report action
  */
-function shouldHideReport(
-    report: OnyxEntry<Report>,
-    currentReportId: string | undefined,
-    isReportArchived: boolean | undefined,
-    visibleReportActionsData?: VisibleReportActionsDerivedValue,
-): boolean {
+function shouldHideReport(report: OnyxEntry<Report>, currentReportId: string | undefined, isReportArchived: boolean | undefined): boolean {
     const currentReport = getReportOrDraftReport(currentReportId);
     const parentReport = getParentReport(!isEmptyObject(currentReport) ? currentReport : undefined);
     const reportActions = allReportActions?.[`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${report?.reportID}`] ?? {};
-    const reportID = report?.reportID;
-    const isChildReportHasComment =
-        !!reportID &&
-        Object.values(reportActions ?? {})?.some(
-            (reportAction) =>
-                (reportAction?.childVisibleActionCount ?? 0) > 0 &&
-                isReportActionVisible(reportAction, reportID, canUserPerformWriteAction(report, isReportArchived), visibleReportActionsData),
-        );
+    const isChildReportHasComment = Object.values(reportActions ?? {})?.some(
+        (reportAction) =>
+            (reportAction?.childVisibleActionCount ?? 0) > 0 && shouldReportActionBeVisible(reportAction, reportAction.reportActionID, canUserPerformWriteAction(report, isReportArchived)),
+    );
     return parentReport?.reportID !== report?.reportID && !isChildReportHasComment;
 }
 
@@ -9363,9 +9285,9 @@ function getAllReportActionsErrorsAndReportActionThatRequiresAttention(
         }
     }
 
-    if (!isReportArchived && hasSmartscanError(reportActionsArray, report)) {
+    if (!isReportArchived && hasSmartscanError(reportActionsArray)) {
         reportActionErrors.smartscan = getMicroSecondOnyxErrorWithTranslationKey('iou.error.genericSmartscanFailureMessage');
-        reportAction = getReportActionWithSmartscanError(reportActionsArray, report);
+        reportAction = getReportActionWithSmartscanError(reportActionsArray);
     }
 
     if (!isReportArchived && report?.statusNum === CONST.REPORT.STATUS_NUM.OPEN) {
@@ -9929,7 +9851,7 @@ function getMoneyRequestOptions(
     }
 
     if (isInvoiceRoom(report)) {
-        if (canSendInvoiceFromWorkspace(policy?.id) && isPolicyAdmin(allPolicies?.[`${ONYXKEYS.COLLECTION.POLICY}${report?.policyID}`])) {
+        if (canSendInvoiceFromWorkspace(policy?.id) && isPolicyAdmin(report?.policyID, allPolicies)) {
             return [CONST.IOU.TYPE.INVOICE];
         }
         return [];
@@ -10170,13 +10092,7 @@ function isMoneyRequestReportPendingDeletion(reportOrID: OnyxEntry<Report> | str
     return parentReportAction?.pendingAction === CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE;
 }
 
-function navigateToLinkedReportAction(
-    ancestor: Ancestor,
-    isInNarrowPaneModal: boolean,
-    canUserPerformWrite: boolean | undefined,
-    isOffline: boolean,
-    visibleReportActionsData?: VisibleReportActionsDerivedValue,
-) {
+function navigateToLinkedReportAction(ancestor: Ancestor, isInNarrowPaneModal: boolean, canUserPerformWrite: boolean | undefined, isOffline: boolean) {
     if (isInNarrowPaneModal) {
         Navigation.navigate(
             ROUTES.SEARCH_REPORT.getRoute({
@@ -10191,8 +10107,7 @@ function navigateToLinkedReportAction(
     // Pop the thread report screen before navigating to the chat report.
     Navigation.goBack(ROUTES.REPORT_WITH_ID.getRoute(ancestor.report.reportID));
 
-    const reportID = ancestor.report.reportID;
-    const isVisibleAction = !!reportID && isReportActionVisible(ancestor.reportAction, reportID, canUserPerformWrite, visibleReportActionsData);
+    const isVisibleAction = shouldReportActionBeVisible(ancestor.reportAction, ancestor.reportAction.reportActionID, canUserPerformWrite);
 
     if (isVisibleAction && !isOffline) {
         // Pop the chat report screen before navigating to the linked report action.
@@ -10660,7 +10575,7 @@ function canEditReportDescription(report: OnyxEntry<Report>, policy: OnyxEntry<P
     );
 }
 
-function getReportActionWithSmartscanError(reportActions: ReportAction[], report: OnyxEntry<Report>): ReportAction | undefined {
+function getReportActionWithSmartscanError(reportActions: ReportAction[]): ReportAction | undefined {
     return reportActions.find((action) => {
         const isReportPreview = isReportPreviewAction(action);
         const isSplitOrTrackAction = isSplitBillReportAction(action) || isTrackExpenseAction(action);
@@ -10668,14 +10583,14 @@ function getReportActionWithSmartscanError(reportActions: ReportAction[], report
             return false;
         }
         const IOUReportID = getIOUReportIDFromReportActionPreview(action);
-        const isReportPreviewError = isReportPreview && shouldShowRBRForMissingSmartscanFields(report, IOUReportID) && !isSettled(IOUReportID);
+        const isReportPreviewError = isReportPreview && shouldShowRBRForMissingSmartscanFields(IOUReportID) && !isSettled(IOUReportID);
         if (isReportPreviewError) {
             return true;
         }
 
         const transactionID = isSplitOrTrackAction ? getOriginalMessage(action)?.IOUTransactionID : undefined;
         const transaction = allTransactions?.[`${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`] ?? {};
-        const isTransactionThreadError = isSplitOrTrackAction && hasMissingSmartscanFieldsTransactionUtils(transaction as Transaction, report);
+        const isTransactionThreadError = isSplitOrTrackAction && hasMissingSmartscanFieldsTransactionUtils(transaction as Transaction);
 
         return isTransactionThreadError;
     });
@@ -10684,8 +10599,8 @@ function getReportActionWithSmartscanError(reportActions: ReportAction[], report
 /**
  * Checks if report action has error when smart scanning
  */
-function hasSmartscanError(reportActions: ReportAction[], report: OnyxEntry<Report>): boolean {
-    return !!getReportActionWithSmartscanError(reportActions, report);
+function hasSmartscanError(reportActions: ReportAction[]): boolean {
+    return !!getReportActionWithSmartscanError(reportActions);
 }
 
 function shouldAutoFocusOnKeyPress(event: KeyboardEvent): boolean {
@@ -10790,10 +10705,10 @@ function getNonHeldAndFullAmount(iouReport: OnyxEntry<Report>, shouldExcludeNonR
     const adjustedTotal = total * coefficient;
 
     // For the "approve unheld" option to be valid, we need:
-    // 1. There should be held expenses
+    // 1. There should be held expenses (unheld amount != total amount)
     // 2. For expense reports with negative totals, we need to ensure the unheld amount is valid
     //    by checking that the absolute values are meaningful and different
-    const hasHeldExpensesLocal = hasHeldExpenses(iouReport?.reportID);
+    const hasHeldExpensesLocal = unheldTotal !== total;
     const hasValidNonHeldAmount =
         hasHeldExpensesLocal &&
         // For normal cases (positive amounts or IOU reports)
@@ -10997,7 +10912,7 @@ function getOptimisticDataForParentReportAction(report: Report | undefined, last
  * @param lastVisibleActionCreated Last visible action created of the child report
  * @param type The type of action in the child report
  */
-function getOptimisticDataForAncestors(ancestors: Ancestor[], lastVisibleActionCreated: string, type: string): Array<OnyxUpdate<typeof ONYXKEYS.COLLECTION.REPORT_ACTIONS>> {
+function getOptimisticDataForAncestors(ancestors: Ancestor[], lastVisibleActionCreated: string, type: string): OnyxUpdate[] {
     let previousActionDeleted = false;
     return ancestors.map(({report: ancestorReport, reportAction: ancestorReportAction}, index) => {
         const updatedReportAction = updateOptimisticParentReportAction(ancestorReportAction, lastVisibleActionCreated, type, previousActionDeleted ? index + 1 : undefined);
@@ -11143,12 +11058,6 @@ function isAdminOwnerApproverOrReportOwner(report: OnyxEntry<Report>, policy: On
     return isPolicyAdminPolicyUtils(policy) || isPolicyOwner(policy, currentUserAccountID) || isReportOwner(report) || isApprover;
 }
 
-function isNonOwnerMangerOfIOUReport(report: OnyxEntry<Report>): boolean {
-    const isOwner = report?.ownerAccountID === currentUserPersonalDetails?.accountID;
-    const isManager = report?.managerID === currentUserPersonalDetails?.accountID;
-    return isIOUReport(report) && !isOwner && !isManager;
-}
-
 /**
  * Whether the user can join a report
  */
@@ -11227,12 +11136,7 @@ function canLeaveChat(report: OnyxEntry<Report>, policy: OnyxEntry<Policy>, isRe
         return canLeaveInvoiceRoom(report);
     }
 
-    return (
-        (isChatThread(report) && !!getReportNotificationPreference(report)) ||
-        isUserCreatedPolicyRoom(report) ||
-        isNonAdminOrOwnerOfPolicyExpenseChat(report, policy) ||
-        isNonOwnerMangerOfIOUReport(report)
-    );
+    return (isChatThread(report) && !!getReportNotificationPreference(report)) || isUserCreatedPolicyRoom(report) || isNonAdminOrOwnerOfPolicyExpenseChat(report, policy);
 }
 
 function createDraftWorkspaceAndNavigateToConfirmationScreen(introSelected: OnyxEntry<IntroSelected>, transactionID: string, actionName: IOUAction): void {
@@ -11262,7 +11166,6 @@ function createDraftTransactionAndNavigateToParticipantSelector(
     actionName: IOUAction,
     reportActionID: string | undefined,
     introSelected: OnyxEntry<IntroSelected>,
-    allTransactionDrafts: OnyxCollection<Transaction>,
     activePolicy: OnyxEntry<Policy>,
     isRestrictedToPreferredPolicy = false,
     preferredPolicyID?: string,
@@ -11283,14 +11186,9 @@ function createDraftTransactionAndNavigateToParticipantSelector(
         .find((action) => isMoneyRequestAction(action) && getOriginalMessage(action)?.IOUTransactionID === transactionID);
 
     const {created, amount, currency, merchant, mccGroup} = getTransactionDetails(transaction) ?? {};
-    const baseComment = getTransactionCommentObject(transaction);
-    // Use modifiedAttendees if present (for edited transactions), otherwise use the attendees from comment
-    const comment = {
-        ...baseComment,
-        attendees: transaction?.modifiedAttendees ?? baseComment.attendees,
-    };
+    const comment = getTransactionCommentObject(transaction);
 
-    removeDraftTransactions(false, allTransactionDrafts);
+    removeDraftTransactions();
 
     createDraftTransaction({
         ...transaction,
@@ -11306,7 +11204,6 @@ function createDraftTransactionAndNavigateToParticipantSelector(
         comment,
         merchant,
         modifiedMerchant: '',
-        modifiedAttendees: undefined,
         mccGroup,
     } as Transaction);
 
@@ -11628,8 +11525,6 @@ function prepareOnboardingOnyxData({
 
     let createWorkspaceTaskReportID;
     let addExpenseApprovalsTaskReportID;
-    let setupTagsTaskReportID;
-    let setupCategoriesAndTagsTaskReportID;
     const tasksData = onboardingMessage.tasks
         .filter((task) => {
             if (engagementChoice === CONST.ONBOARDING_CHOICES.MANAGE_TEAM) {
@@ -11711,12 +11606,6 @@ function prepareOnboardingOnyxData({
             if (task.type === CONST.ONBOARDING_TASK_TYPE.ADD_EXPENSE_APPROVALS) {
                 addExpenseApprovalsTaskReportID = currentTask.reportID;
             }
-            if (task.type === CONST.ONBOARDING_TASK_TYPE.SETUP_TAGS) {
-                setupTagsTaskReportID = currentTask.reportID;
-            }
-            if (task.type === CONST.ONBOARDING_TASK_TYPE.SETUP_CATEGORIES_AND_TAGS) {
-                setupCategoriesAndTagsTaskReportID = currentTask.reportID;
-            }
 
             return {
                 task,
@@ -11754,17 +11643,7 @@ function prepareOnboardingOnyxData({
 
     const hasOutstandingChildTask = tasksData.some((task) => !task.completedTaskReportAction);
 
-    const tasksForOptimisticData = tasksData.reduce<
-        Array<
-            OnyxUpdate<
-                | typeof ONYXKEYS.COLLECTION.REPORT
-                | typeof ONYXKEYS.COLLECTION.REPORT_METADATA
-                | typeof ONYXKEYS.NVP_INTRO_SELECTED
-                | typeof ONYXKEYS.COLLECTION.REPORT_ACTIONS
-                | typeof ONYXKEYS.NVP_ONBOARDING
-            >
-        >
-    >((acc, {currentTask, taskCreatedAction, taskReportAction, taskDescription, completedTaskReportAction}) => {
+    const tasksForOptimisticData = tasksData.reduce<OnyxUpdate[]>((acc, {currentTask, taskCreatedAction, taskReportAction, taskDescription, completedTaskReportAction}) => {
         acc.push(
             {
                 onyxMethod: Onyx.METHOD.MERGE,
@@ -11827,7 +11706,7 @@ function prepareOnboardingOnyxData({
         return acc;
     }, []);
 
-    const tasksForFailureData = tasksData.reduce<Array<OnyxUpdate<typeof ONYXKEYS.COLLECTION.REPORT_ACTIONS | typeof ONYXKEYS.COLLECTION.REPORT>>>((acc, {currentTask, taskReportAction}) => {
+    const tasksForFailureData = tasksData.reduce<OnyxUpdate[]>((acc, {currentTask, taskReportAction}) => {
         acc.push(
             {
                 onyxMethod: Onyx.METHOD.MERGE,
@@ -11853,9 +11732,7 @@ function prepareOnboardingOnyxData({
         return acc;
     }, []);
 
-    const tasksForSuccessData = tasksData.reduce<
-        Array<OnyxUpdate<typeof ONYXKEYS.COLLECTION.REPORT_ACTIONS | typeof ONYXKEYS.COLLECTION.REPORT | typeof ONYXKEYS.COLLECTION.REPORT_METADATA>>
-    >((acc, {currentTask, taskCreatedAction, taskReportAction, completedTaskReportAction}) => {
+    const tasksForSuccessData = tasksData.reduce<OnyxUpdate[]>((acc, {currentTask, taskCreatedAction, taskReportAction, completedTaskReportAction}) => {
         acc.push(
             {
                 onyxMethod: Onyx.METHOD.MERGE,
@@ -11905,7 +11782,7 @@ function prepareOnboardingOnyxData({
         return acc;
     }, []);
 
-    const optimisticData: Array<TupleToUnion<typeof tasksForOptimisticData> | OnyxUpdate<typeof ONYXKEYS.COLLECTION.POLICY>> = [...tasksForOptimisticData];
+    const optimisticData: OnyxUpdate[] = [...tasksForOptimisticData];
     const lastVisibleActionCreated = welcomeSignOffCommentAction.created;
     optimisticData.push(
         {
@@ -11924,8 +11801,6 @@ function prepareOnboardingOnyxData({
                 choice: engagementChoice,
                 createWorkspace: createWorkspaceTaskReportID,
                 addExpenseApprovals: addExpenseApprovalsTaskReportID,
-                setupTags: setupTagsTaskReportID,
-                setupCategoriesAndTags: setupCategoriesAndTagsTaskReportID,
             },
         },
     );
@@ -11946,9 +11821,7 @@ function prepareOnboardingOnyxData({
         });
     }
 
-    const successData: Array<
-        TupleToUnion<typeof tasksForSuccessData> | OnyxUpdate<typeof ONYXKEYS.COLLECTION.POLICY | typeof ONYXKEYS.PERSONAL_DETAILS_LIST | typeof ONYXKEYS.NVP_ONBOARDING>
-    > = [...tasksForSuccessData];
+    const successData: OnyxUpdate[] = [...tasksForSuccessData];
 
     successData.push({
         onyxMethod: Onyx.METHOD.MERGE,
@@ -11977,10 +11850,7 @@ function prepareOnboardingOnyxData({
         };
     }
 
-    const failureData: Array<
-        | TupleToUnion<typeof tasksForFailureData>
-        | OnyxUpdate<typeof ONYXKEYS.NVP_INTRO_SELECTED | typeof ONYXKEYS.NVP_ONBOARDING | typeof ONYXKEYS.COLLECTION.POLICY | typeof ONYXKEYS.PERSONAL_DETAILS_LIST>
-    > = [...tasksForFailureData];
+    const failureData: OnyxUpdate[] = [...tasksForFailureData];
     failureData.push(
         {
             onyxMethod: Onyx.METHOD.MERGE,
@@ -11995,8 +11865,6 @@ function prepareOnboardingOnyxData({
                 choice: null,
                 createWorkspace: null,
                 addExpenseApprovals: null,
-                setupCategoriesAndTags: null,
-                setupTags: null,
             },
         },
     );
@@ -12444,10 +12312,7 @@ function hasExportError(reportActions: OnyxEntry<ReportActions> | ReportAction[]
 function doesReportContainRequestsFromMultipleUsers(iouReport: OnyxEntry<Report>): boolean {
     const transactions = getReportTransactions(iouReport?.reportID);
     // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
-    if (Permissions.isBetaEnabled(CONST.BETAS.ZERO_EXPENSES, allBetas)) {
-        return isIOUReport(iouReport) && transactions.some((transaction) => (Number(transaction?.modifiedAmount) || transaction?.amount) <= 0);
-    }
-    return isIOUReport(iouReport) && transactions.some((transaction) => (Number(transaction?.modifiedAmount) || transaction?.amount) < 0);
+    return isIOUReport(iouReport) && transactions.some((transaction) => (transaction?.modifiedAmount || transaction?.amount) < 0);
 }
 
 /**
@@ -12780,7 +12645,8 @@ function buildOptimisticRejectReportAction(created = DateUtils.getDBTime()): Opt
             {
                 type: CONST.REPORT.MESSAGE.TYPE.TEXT,
                 style: 'normal',
-                text: 'rejected this expense',
+                // eslint-disable-next-line @typescript-eslint/no-deprecated
+                text: translateLocal('iou.reject.reportActions.rejectedExpense'),
             },
         ],
         person: [
@@ -12842,7 +12708,8 @@ function buildOptimisticMarkedAsResolvedReportAction(created = DateUtils.getDBTi
             {
                 type: CONST.REPORT.MESSAGE.TYPE.TEXT,
                 style: 'normal',
-                text: 'marked the rejection reason as resolved',
+                // eslint-disable-next-line @typescript-eslint/no-deprecated
+                text: translateLocal('iou.reject.reportActions.markedAsResolved'),
             },
         ],
         person: [
@@ -12997,25 +12864,6 @@ function shouldHideSingleReportField(reportField: PolicyReportField) {
     return isReportFieldOfTypeTitle(reportField) || !hasEnableOption;
 }
 
-/**
- * Get both field values map and fields-by-name map in a single pass
- */
-function getReportFieldMaps(report: OnyxEntry<Report>, fieldList: Record<string, PolicyReportField>): {fieldValues: Record<string, string>; fieldsByName: Record<string, PolicyReportField>} {
-    const fields = getAvailableReportFields(report, Object.values(fieldList ?? {}));
-    const fieldValues: Record<string, string> = {};
-    const fieldsByName: Record<string, PolicyReportField> = {};
-
-    for (const field of fields) {
-        if (field.name) {
-            const key = field.name.toLowerCase();
-            fieldValues[key] = field.value ?? field.defaultValue ?? '';
-            fieldsByName[key] = field;
-        }
-    }
-
-    return {fieldValues, fieldsByName};
-}
-
 export {
     areAllRequestsBeingSmartScanned,
     buildOptimisticAddCommentReportAction,
@@ -13152,7 +13000,6 @@ export {
     getReimbursementQueuedActionMessage,
     getReportDescription,
     getReportFieldKey,
-    getReportFieldMaps,
     getReportIDFromLink,
     // This will be fixed as follow up https://github.com/Expensify/App/pull/75357
     // eslint-disable-next-line @typescript-eslint/no-deprecated
@@ -13194,6 +13041,7 @@ export {
     hasHeldExpenses,
     hasIOUWaitingOnCurrentUserBankAccount,
     hasMissingPaymentMethod,
+    hasMissingSmartscanFields,
     hasNonReimbursableTransactions,
     hasOnlyHeldExpenses,
     hasOnlyTransactionsWithPendingRoutes,
@@ -13325,6 +13173,8 @@ export {
     shouldReportShowSubscript,
     shouldShowFlagComment,
     sortOutstandingReportsBySelected,
+    getReportActionWithMissingSmartscanFields,
+    shouldShowRBRForMissingSmartscanFields,
     shouldUseFullTitleToDisplay,
     updateOptimisticParentReportAction,
     updateReportPreview,
@@ -13425,7 +13275,6 @@ export {
     isOneTransactionReport,
     isTrackExpenseReportNew,
     shouldHideSingleReportField,
-    getReportForHeader,
 };
 
 export type {
diff --git a/src/libs/SearchAutocompleteUtils.ts b/src/libs/SearchAutocompleteUtils.ts
index 11a0b8db52da..633869f628e2 100644
--- a/src/libs/SearchAutocompleteUtils.ts
+++ b/src/libs/SearchAutocompleteUtils.ts
@@ -1,8 +1,9 @@
 import type {MarkdownRange} from '@expensify/react-native-live-markdown';
 import type {OnyxCollection} from 'react-native-onyx';
 import type {SharedValue} from 'react-native-reanimated/lib/typescript/commonTypes';
+import type {ValueOf} from 'type-fest';
 import type {SubstitutionMap} from '@components/Search/SearchRouter/getQueryWithSubstitutions';
-import type {SearchAutocompleteQueryRange, SearchAutocompleteResult, SearchColumnType} from '@components/Search/types';
+import type {SearchAutocompleteQueryRange, SearchAutocompleteResult} from '@components/Search/types';
 import CONST from '@src/CONST';
 import type {PolicyCategories, PolicyTagLists, RecentlyUsedCategories, RecentlyUsedTags} from '@src/types/onyx';
 import {getTagNamesFromTagsLists} from './PolicyUtils';
@@ -134,12 +135,6 @@ const userFriendlyStatusList = Object.values({
     ...CONST.SEARCH.STATUS.TASK,
 }).map((value) => getUserFriendlyValue(value));
 
-const userFriendlyColumnList = new Set(
-    Object.entries(CONST.SEARCH.SEARCH_USER_FRIENDLY_VALUES_MAP)
-        .filter(([key]) => Object.values(CONST.SEARCH.TABLE_COLUMNS).includes(key as SearchColumnType))
-        .map(([, value]) => value),
-);
-
 /**
  * @private
  * Determines if a specific value in the search syntax can/should be highlighted as valid or not
@@ -234,7 +229,7 @@ function filterOutRangesWithCorrectValue(
             // This uses the same regex as the AmountWithoutCurrencyInput component (allowing for 3 digit decimals as some currencies support that)
             return /^-?(?!.*[.,].*[.,])\d{0,8}(?:[.,]\d{0,2})?$/.test(range.value);
         case CONST.SEARCH.SYNTAX_ROOT_KEYS.COLUMNS:
-            return userFriendlyColumnList.has(range.value);
+            return Object.values(CONST.SEARCH.TYPE_CUSTOM_COLUMNS).includes(range.value as ValueOf<typeof CONST.SEARCH.TYPE_CUSTOM_COLUMNS>);
         case CONST.SEARCH.SYNTAX_FILTER_KEYS.IS:
             return isList.includes(range.value);
         default:
diff --git a/src/libs/SearchParser/autocompleteParser.js b/src/libs/SearchParser/autocompleteParser.js
index 73a708820759..742f854ddcef 100644
--- a/src/libs/SearchParser/autocompleteParser.js
+++ b/src/libs/SearchParser/autocompleteParser.js
@@ -247,34 +247,18 @@ function peg$parse(input, options) {
   var peg$c61 = "purchasecurrency";
   var peg$c62 = "purchase-currency";
   var peg$c63 = "columns";
-  var peg$c64 = "per-diem";
-  var peg$c65 = "drafts";
-  var peg$c66 = "draft";
-  var peg$c67 = "original-amount";
-  var peg$c68 = "tax";
-  var peg$c69 = "policy-name";
-  var peg$c70 = "bank-account";
-  var peg$c71 = "long-report-id";
-  var peg$c72 = "exported-to";
-  var peg$c73 = "exchange-rate";
-  var peg$c74 = "reimbursable-total";
-  var peg$c75 = "non-reimbursable-total";
-  var peg$c76 = "group-from";
-  var peg$c77 = "group-expenses";
-  var peg$c78 = "group-total";
-  var peg$c79 = "group-card";
-  var peg$c80 = "group-feed";
-  var peg$c81 = "group-bank-account";
-  var peg$c82 = "group-withdrawn";
-  var peg$c83 = "group-withdrawal-id";
-  var peg$c84 = "!=";
-  var peg$c85 = ">=";
-  var peg$c86 = ">";
-  var peg$c87 = "<=";
-  var peg$c88 = "<";
-  var peg$c89 = "\u201C";
-  var peg$c90 = "\u201D";
-  var peg$c91 = "\"";
+  var peg$c64 = "perdiem";
+  var peg$c65 = "per-diem";
+  var peg$c66 = "drafts";
+  var peg$c67 = "draft";
+  var peg$c68 = "!=";
+  var peg$c69 = ">=";
+  var peg$c70 = ">";
+  var peg$c71 = "<=";
+  var peg$c72 = "<";
+  var peg$c73 = "\u201C";
+  var peg$c74 = "\u201D";
+  var peg$c75 = "\"";
 
   var peg$r0 = /^[ \t\r\n\xA0,:=<>!]/;
   var peg$r1 = /^[:=]/;
@@ -288,7 +272,6 @@ function peg$parse(input, options) {
   var peg$r9 = /^[ \t\n\r\xA0]/;
   var peg$r10 = /^[ \t\n\r\xA0a-zA-Z]/;
   var peg$r11 = /^[,]/;
-  var peg$r12 = /^[ \t\n\r\xA0,]/;
 
   var peg$e0 = peg$literalExpectation("-", false);
   var peg$e1 = peg$literalExpectation("report-field", true);
@@ -357,50 +340,33 @@ function peg$parse(input, options) {
   var peg$e64 = peg$literalExpectation("purchaseCurrency", true);
   var peg$e65 = peg$literalExpectation("purchase-currency", true);
   var peg$e66 = peg$literalExpectation("columns", true);
-  var peg$e67 = peg$literalExpectation("per-diem", true);
-  var peg$e68 = peg$literalExpectation("drafts", true);
-  var peg$e69 = peg$literalExpectation("draft", true);
-  var peg$e70 = peg$literalExpectation("original-amount", true);
-  var peg$e71 = peg$literalExpectation("tax", true);
-  var peg$e72 = peg$literalExpectation("policy-name", true);
-  var peg$e73 = peg$literalExpectation("bank-account", true);
-  var peg$e74 = peg$literalExpectation("long-report-id", true);
-  var peg$e75 = peg$literalExpectation("exported-to", true);
-  var peg$e76 = peg$literalExpectation("exchange-rate", true);
-  var peg$e77 = peg$literalExpectation("reimbursable-total", true);
-  var peg$e78 = peg$literalExpectation("non-reimbursable-total", true);
-  var peg$e79 = peg$literalExpectation("group-from", true);
-  var peg$e80 = peg$literalExpectation("group-expenses", true);
-  var peg$e81 = peg$literalExpectation("group-total", true);
-  var peg$e82 = peg$literalExpectation("group-card", true);
-  var peg$e83 = peg$literalExpectation("group-feed", true);
-  var peg$e84 = peg$literalExpectation("group-bank-account", true);
-  var peg$e85 = peg$literalExpectation("group-withdrawn", true);
-  var peg$e86 = peg$literalExpectation("group-withdrawal-id", true);
-  var peg$e87 = peg$otherExpectation("operator");
-  var peg$e88 = peg$classExpectation([":", "="], false, false);
-  var peg$e89 = peg$literalExpectation("!=", false);
-  var peg$e90 = peg$literalExpectation(">=", false);
-  var peg$e91 = peg$literalExpectation(">", false);
-  var peg$e92 = peg$literalExpectation("<=", false);
-  var peg$e93 = peg$literalExpectation("<", false);
-  var peg$e94 = peg$otherExpectation("word");
-  var peg$e95 = peg$classExpectation([" ", ",", "\t", "\n", "\r", "\xA0"], true, false);
-  var peg$e96 = peg$otherExpectation("whitespace");
-  var peg$e97 = peg$classExpectation([" ", "\t", "\r", "\n", "\xA0"], false, false);
-  var peg$e98 = peg$otherExpectation("quote");
-  var peg$e99 = peg$classExpectation([" ", ",", "\"", "\u201D", "\u201C", "\t", "\n", "\r", "\xA0"], true, false);
-  var peg$e100 = peg$classExpectation(["\"", ["\u201C", "\u201D"]], false, false);
-  var peg$e101 = peg$classExpectation(["\"", "\u201D", "\u201C", "\r", "\n"], true, false);
-  var peg$e102 = peg$literalExpectation("\u201C", false);
-  var peg$e103 = peg$literalExpectation("\u201D", false);
-  var peg$e104 = peg$literalExpectation("\"", false);
-  var peg$e105 = peg$classExpectation([" ", "\t", "\n", "\r", "\xA0", ["a", "z"], ["A", "Z"], ["0", "9"]], false, false);
-  var peg$e106 = peg$classExpectation([["a", "z"], ["A", "Z"], ["0", "9"]], false, false);
-  var peg$e107 = peg$classExpectation([" ", "\t", "\n", "\r", "\xA0"], false, false);
-  var peg$e108 = peg$classExpectation([" ", "\t", "\n", "\r", "\xA0", ["a", "z"], ["A", "Z"]], false, false);
-  var peg$e109 = peg$classExpectation([","], false, false);
-  var peg$e110 = peg$classExpectation([" ", "\t", "\n", "\r", "\xA0", ","], false, false);
+  var peg$e67 = peg$literalExpectation("perDiem", true);
+  var peg$e68 = peg$literalExpectation("per-diem", true);
+  var peg$e69 = peg$literalExpectation("drafts", true);
+  var peg$e70 = peg$literalExpectation("draft", true);
+  var peg$e71 = peg$otherExpectation("operator");
+  var peg$e72 = peg$classExpectation([":", "="], false, false);
+  var peg$e73 = peg$literalExpectation("!=", false);
+  var peg$e74 = peg$literalExpectation(">=", false);
+  var peg$e75 = peg$literalExpectation(">", false);
+  var peg$e76 = peg$literalExpectation("<=", false);
+  var peg$e77 = peg$literalExpectation("<", false);
+  var peg$e78 = peg$otherExpectation("word");
+  var peg$e79 = peg$classExpectation([" ", ",", "\t", "\n", "\r", "\xA0"], true, false);
+  var peg$e80 = peg$otherExpectation("whitespace");
+  var peg$e81 = peg$classExpectation([" ", "\t", "\r", "\n", "\xA0"], false, false);
+  var peg$e82 = peg$otherExpectation("quote");
+  var peg$e83 = peg$classExpectation([" ", ",", "\"", "\u201D", "\u201C", "\t", "\n", "\r", "\xA0"], true, false);
+  var peg$e84 = peg$classExpectation(["\"", ["\u201C", "\u201D"]], false, false);
+  var peg$e85 = peg$classExpectation(["\"", "\u201D", "\u201C", "\r", "\n"], true, false);
+  var peg$e86 = peg$literalExpectation("\u201C", false);
+  var peg$e87 = peg$literalExpectation("\u201D", false);
+  var peg$e88 = peg$literalExpectation("\"", false);
+  var peg$e89 = peg$classExpectation([" ", "\t", "\n", "\r", "\xA0", ["a", "z"], ["A", "Z"], ["0", "9"]], false, false);
+  var peg$e90 = peg$classExpectation([["a", "z"], ["A", "Z"], ["0", "9"]], false, false);
+  var peg$e91 = peg$classExpectation([" ", "\t", "\n", "\r", "\xA0"], false, false);
+  var peg$e92 = peg$classExpectation([" ", "\t", "\n", "\r", "\xA0", ["a", "z"], ["A", "Z"]], false, false);
+  var peg$e93 = peg$classExpectation([","], false, false);
 
   var peg$f0 = function(ranges) { return { autocomplete, ranges }; };
   var peg$f1 = function(filters) { return filters.filter(Boolean).flat(); };
@@ -509,59 +475,31 @@ function peg$parse(input, options) {
   var peg$f49 = function() {return "is"; };
   var peg$f50 = function() {return "purchaseAmount"};
   var peg$f51 = function() {return "purchaseCurrency"};
-  var peg$f52 = function() { 
-  isColumnsContext = true;
-  return "columns";
-};
-  var peg$f53 = function() { return isColumnsContext; };
-  var peg$f54 = function() { return "perDiem"; };
-  var peg$f55 = function() { return "drafts"; };
-  var peg$f56 = function() { return "originalamount"; };
-  var peg$f57 = function() { return "taxAmount"; };
-  var peg$f58 = function() { return "taxrate"; };
-  var peg$f59 = function() { return "policyname"; };
-  var peg$f60 = function() { return "withdrawalID"; };
-  var peg$f61 = function() { return "bankAccount"; };
-  var peg$f62 = function() { return "reportID"; };
-  var peg$f63 = function() { return "base62ReportID"; };
-  var peg$f64 = function() { return "exportedto"; };
-  var peg$f65 = function() { return "exchangeRate"; };
-  var peg$f66 = function() { return "reimbursableTotal"; };
-  var peg$f67 = function() { return "nonReimbursableTotal"; };
-  var peg$f68 = function() { return "groupFrom"; };
-  var peg$f69 = function() { return "groupExpenses"; };
-  var peg$f70 = function() { return "groupTotal"; };
-  var peg$f71 = function() { return "groupCard"; };
-  var peg$f72 = function() { return "groupFeed"; };
-  var peg$f73 = function() { return "groupBankAccount"; };
-  var peg$f74 = function() { return "groupWithdrawn"; };
-  var peg$f75 = function() { return "groupWithdrawalID"; };
-  var peg$f76 = function() { return "eq"; };
-  var peg$f77 = function() { return "neq"; };
-  var peg$f78 = function() { return "gte"; };
-  var peg$f79 = function() { return "gt"; };
-  var peg$f80 = function() { return "lte"; };
-  var peg$f81 = function() { return "lt"; };
-  var peg$f82 = function(o) {
+  var peg$f52 = function() {return "columns"};
+  var peg$f53 = function() { return "perDiem"; };
+  var peg$f54 = function() {return "drafts"; };
+  var peg$f55 = function() { return "eq"; };
+  var peg$f56 = function() { return "neq"; };
+  var peg$f57 = function() { return "gte"; };
+  var peg$f58 = function() { return "gt"; };
+  var peg$f59 = function() { return "lte"; };
+  var peg$f60 = function() { return "lt"; };
+  var peg$f61 = function(o) {
       if (nameOperator) {
         expectingNestedQuote = (o === "eq"); // Use simple parser if no valid operator is found
       }
-      isColumnsContext = false;
       return o;
   };
-  var peg$f83 = function(chars) { return chars.join("").trim(); };
-  var peg$f84 = function() { 
-  isColumnsContext = false;
-  return "and";
-};
-  var peg$f85 = function() { return expectingNestedQuote; };
-  var peg$f86 = function(start, inner, end) { //handle no-breaking space
+  var peg$f62 = function(chars) { return chars.join("").trim(); };
+  var peg$f63 = function() { return "and"; };
+  var peg$f64 = function() { return expectingNestedQuote; };
+  var peg$f65 = function(start, inner, end) { //handle no-breaking space
       return [...start, '"', ...inner, '"', ...end].join("");
     };
-  var peg$f87 = function(start) {return "“"};
-  var peg$f88 = function(start) {return "”"};
-  var peg$f89 = function(start) {return "\""};
-  var peg$f90 = function(start, inner, end) {
+  var peg$f66 = function(start) {return "“"};
+  var peg$f67 = function(start) {return "”"};
+  var peg$f68 = function(start) {return "\""};
+  var peg$f69 = function(start, inner, end) {
     return [...start, '"', ...inner, '"'].join("");
 };
   var peg$currPos = options.peg$currPos | 0;
@@ -2242,1078 +2180,225 @@ function peg$parse(input, options) {
   }
 
   function peg$parsevalues() {
-    var s0, s1, s2;
-
-    s0 = peg$currPos;
-    peg$savedPos = peg$currPos;
-    s1 = peg$f53();
-    if (s1) {
-      s1 = undefined;
-    } else {
-      s1 = peg$FAILED;
-    }
-    if (s1 !== peg$FAILED) {
-      s2 = peg$parsecolumnsValues();
-      if (s2 !== peg$FAILED) {
-        s1 = [s1, s2];
-        s0 = s1;
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-    if (s0 === peg$FAILED) {
-      s0 = peg$parseperDiem();
-      if (s0 === peg$FAILED) {
-        s0 = peg$parsedraft();
-      }
-    }
-
-    return s0;
-  }
-
-  function peg$parsecolumnsValues() {
     var s0;
 
-    s0 = peg$parseoriginalAmount();
+    s0 = peg$parseperDiem();
     if (s0 === peg$FAILED) {
-      s0 = peg$parsetaxRateValue();
-      if (s0 === peg$FAILED) {
-        s0 = peg$parsetaxAmount();
-        if (s0 === peg$FAILED) {
-          s0 = peg$parsepolicyName();
-          if (s0 === peg$FAILED) {
-            s0 = peg$parsewithdrawalId();
-            if (s0 === peg$FAILED) {
-              s0 = peg$parsebankAccount();
-              if (s0 === peg$FAILED) {
-                s0 = peg$parsereportId();
-                if (s0 === peg$FAILED) {
-                  s0 = peg$parsebase62ReportId();
-                  if (s0 === peg$FAILED) {
-                    s0 = peg$parseexportedTo();
-                    if (s0 === peg$FAILED) {
-                      s0 = peg$parseexchangeRate();
-                      if (s0 === peg$FAILED) {
-                        s0 = peg$parsereimbursableTotal();
-                        if (s0 === peg$FAILED) {
-                          s0 = peg$parsenonReimbursableTotal();
-                          if (s0 === peg$FAILED) {
-                            s0 = peg$parsegroupFrom();
-                            if (s0 === peg$FAILED) {
-                              s0 = peg$parsegroupExpenses();
-                              if (s0 === peg$FAILED) {
-                                s0 = peg$parsegroupTotal();
-                                if (s0 === peg$FAILED) {
-                                  s0 = peg$parsegroupCard();
-                                  if (s0 === peg$FAILED) {
-                                    s0 = peg$parsegroupFeed();
-                                    if (s0 === peg$FAILED) {
-                                      s0 = peg$parsegroupBankAccount();
-                                      if (s0 === peg$FAILED) {
-                                        s0 = peg$parsegroupWithdrawn();
-                                        if (s0 === peg$FAILED) {
-                                          s0 = peg$parsegroupWithdrawalId();
-                                        }
-                                      }
-                                    }
-                                  }
-                                }
-                              }
-                            }
-                          }
-                        }
-                      }
-                    }
-                  }
-                }
-              }
-            }
-          }
-        }
-      }
+      s0 = peg$parsedraft();
     }
 
     return s0;
   }
 
   function peg$parseperDiem() {
-    var s0, s1, s2, s3;
+    var s0, s1;
 
-    s0 = peg$currPos;
-    s1 = input.substr(peg$currPos, 8);
-    if (s1.toLowerCase() === peg$c64) {
-      peg$currPos += 8;
+    s0 = input.substr(peg$currPos, 7);
+    if (s0.toLowerCase() === peg$c64) {
+      peg$currPos += 7;
     } else {
-      s1 = peg$FAILED;
+      s0 = peg$FAILED;
       if (peg$silentFails === 0) { peg$fail(peg$e67); }
     }
-    if (s1 !== peg$FAILED) {
-      s2 = peg$currPos;
-      peg$silentFails++;
-      s3 = peg$parsewordBoundary();
-      peg$silentFails--;
-      if (s3 !== peg$FAILED) {
-        peg$currPos = s2;
-        s2 = undefined;
+    if (s0 === peg$FAILED) {
+      s0 = peg$currPos;
+      s1 = input.substr(peg$currPos, 8);
+      if (s1.toLowerCase() === peg$c65) {
+        peg$currPos += 8;
       } else {
-        s2 = peg$FAILED;
+        s1 = peg$FAILED;
+        if (peg$silentFails === 0) { peg$fail(peg$e68); }
       }
-      if (s2 !== peg$FAILED) {
+      if (s1 !== peg$FAILED) {
         peg$savedPos = s0;
-        s0 = peg$f54();
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
+        s1 = peg$f53();
       }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
+      s0 = s1;
     }
 
     return s0;
   }
 
   function peg$parsedraft() {
-    var s0, s1, s2, s3;
+    var s0, s1;
 
-    s0 = peg$currPos;
-    s1 = input.substr(peg$currPos, 6);
-    if (s1.toLowerCase() === peg$c65) {
+    s0 = input.substr(peg$currPos, 6);
+    if (s0.toLowerCase() === peg$c66) {
       peg$currPos += 6;
     } else {
-      s1 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$e68); }
+      s0 = peg$FAILED;
+      if (peg$silentFails === 0) { peg$fail(peg$e69); }
     }
-    if (s1 === peg$FAILED) {
+    if (s0 === peg$FAILED) {
+      s0 = peg$currPos;
       s1 = input.substr(peg$currPos, 5);
-      if (s1.toLowerCase() === peg$c66) {
+      if (s1.toLowerCase() === peg$c67) {
         peg$currPos += 5;
       } else {
         s1 = peg$FAILED;
-        if (peg$silentFails === 0) { peg$fail(peg$e69); }
-      }
-    }
-    if (s1 !== peg$FAILED) {
-      s2 = peg$currPos;
-      peg$silentFails++;
-      s3 = peg$parsewordBoundary();
-      peg$silentFails--;
-      if (s3 !== peg$FAILED) {
-        peg$currPos = s2;
-        s2 = undefined;
-      } else {
-        s2 = peg$FAILED;
+        if (peg$silentFails === 0) { peg$fail(peg$e70); }
       }
-      if (s2 !== peg$FAILED) {
+      if (s1 !== peg$FAILED) {
         peg$savedPos = s0;
-        s0 = peg$f55();
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
+        s1 = peg$f54();
       }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
+      s0 = s1;
     }
 
     return s0;
   }
 
-  function peg$parseoriginalAmount() {
-    var s0, s1, s2, s3;
+  function peg$parseoperator() {
+    var s0, s1;
 
+    peg$silentFails++;
     s0 = peg$currPos;
-    s1 = input.substr(peg$currPos, 15);
-    if (s1.toLowerCase() === peg$c67) {
-      peg$currPos += 15;
+    s1 = input.charAt(peg$currPos);
+    if (peg$r1.test(s1)) {
+      peg$currPos++;
     } else {
       s1 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$e70); }
+      if (peg$silentFails === 0) { peg$fail(peg$e72); }
     }
     if (s1 !== peg$FAILED) {
-      s2 = peg$currPos;
-      peg$silentFails++;
-      s3 = peg$parsewordBoundary();
-      peg$silentFails--;
-      if (s3 !== peg$FAILED) {
-        peg$currPos = s2;
-        s2 = undefined;
+      peg$savedPos = s0;
+      s1 = peg$f55();
+    }
+    s0 = s1;
+    if (s0 === peg$FAILED) {
+      s0 = peg$currPos;
+      if (input.substr(peg$currPos, 2) === peg$c68) {
+        s1 = peg$c68;
+        peg$currPos += 2;
       } else {
-        s2 = peg$FAILED;
+        s1 = peg$FAILED;
+        if (peg$silentFails === 0) { peg$fail(peg$e73); }
       }
-      if (s2 !== peg$FAILED) {
+      if (s1 !== peg$FAILED) {
         peg$savedPos = s0;
-        s0 = peg$f56();
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
+        s1 = peg$f56();
       }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
+      s0 = s1;
+      if (s0 === peg$FAILED) {
+        s0 = peg$currPos;
+        if (input.substr(peg$currPos, 2) === peg$c69) {
+          s1 = peg$c69;
+          peg$currPos += 2;
+        } else {
+          s1 = peg$FAILED;
+          if (peg$silentFails === 0) { peg$fail(peg$e74); }
+        }
+        if (s1 !== peg$FAILED) {
+          peg$savedPos = s0;
+          s1 = peg$f57();
+        }
+        s0 = s1;
+        if (s0 === peg$FAILED) {
+          s0 = peg$currPos;
+          if (input.charCodeAt(peg$currPos) === 62) {
+            s1 = peg$c70;
+            peg$currPos++;
+          } else {
+            s1 = peg$FAILED;
+            if (peg$silentFails === 0) { peg$fail(peg$e75); }
+          }
+          if (s1 !== peg$FAILED) {
+            peg$savedPos = s0;
+            s1 = peg$f58();
+          }
+          s0 = s1;
+          if (s0 === peg$FAILED) {
+            s0 = peg$currPos;
+            if (input.substr(peg$currPos, 2) === peg$c71) {
+              s1 = peg$c71;
+              peg$currPos += 2;
+            } else {
+              s1 = peg$FAILED;
+              if (peg$silentFails === 0) { peg$fail(peg$e76); }
+            }
+            if (s1 !== peg$FAILED) {
+              peg$savedPos = s0;
+              s1 = peg$f59();
+            }
+            s0 = s1;
+            if (s0 === peg$FAILED) {
+              s0 = peg$currPos;
+              if (input.charCodeAt(peg$currPos) === 60) {
+                s1 = peg$c72;
+                peg$currPos++;
+              } else {
+                s1 = peg$FAILED;
+                if (peg$silentFails === 0) { peg$fail(peg$e77); }
+              }
+              if (s1 !== peg$FAILED) {
+                peg$savedPos = s0;
+                s1 = peg$f60();
+              }
+              s0 = s1;
+            }
+          }
+        }
+      }
+    }
+    peg$silentFails--;
+    if (s0 === peg$FAILED) {
+      s1 = peg$FAILED;
+      if (peg$silentFails === 0) { peg$fail(peg$e71); }
     }
 
     return s0;
   }
 
-  function peg$parsetaxAmount() {
-    var s0, s1, s2, s3;
+  function peg$parsefilterOperator() {
+    var s0, s1;
 
     s0 = peg$currPos;
-    s1 = input.substr(peg$currPos, 3);
-    if (s1.toLowerCase() === peg$c68) {
-      peg$currPos += 3;
-    } else {
-      s1 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$e71); }
-    }
+    s1 = peg$parseoperator();
     if (s1 !== peg$FAILED) {
-      s2 = peg$currPos;
-      peg$silentFails++;
-      s3 = peg$parsewordBoundary();
-      peg$silentFails--;
-      if (s3 !== peg$FAILED) {
-        peg$currPos = s2;
-        s2 = undefined;
-      } else {
-        s2 = peg$FAILED;
-      }
-      if (s2 !== peg$FAILED) {
-        peg$savedPos = s0;
-        s0 = peg$f57();
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
+      peg$savedPos = s0;
+      s1 = peg$f61(s1);
     }
+    s0 = s1;
 
     return s0;
   }
 
-  function peg$parsetaxRateValue() {
-    var s0, s1, s2, s3;
+  function peg$parsealphanumeric() {
+    var s0, s1, s2;
 
+    peg$silentFails++;
     s0 = peg$currPos;
-    s1 = input.substr(peg$currPos, 8);
-    if (s1.toLowerCase() === peg$c21) {
-      peg$currPos += 8;
-    } else {
-      s1 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$e24); }
-    }
-    if (s1 !== peg$FAILED) {
-      s2 = peg$currPos;
-      peg$silentFails++;
-      s3 = peg$parsewordBoundary();
-      peg$silentFails--;
-      if (s3 !== peg$FAILED) {
-        peg$currPos = s2;
-        s2 = undefined;
-      } else {
-        s2 = peg$FAILED;
-      }
-      if (s2 !== peg$FAILED) {
-        peg$savedPos = s0;
-        s0 = peg$f58();
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-
-    return s0;
-  }
-
-  function peg$parsepolicyName() {
-    var s0, s1, s2, s3;
-
-    s0 = peg$currPos;
-    s1 = input.substr(peg$currPos, 11);
-    if (s1.toLowerCase() === peg$c69) {
-      peg$currPos += 11;
-    } else {
-      s1 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$e72); }
-    }
-    if (s1 !== peg$FAILED) {
-      s2 = peg$currPos;
-      peg$silentFails++;
-      s3 = peg$parsewordBoundary();
-      peg$silentFails--;
-      if (s3 !== peg$FAILED) {
-        peg$currPos = s2;
-        s2 = undefined;
-      } else {
-        s2 = peg$FAILED;
-      }
-      if (s2 !== peg$FAILED) {
-        peg$savedPos = s0;
-        s0 = peg$f59();
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-
-    return s0;
-  }
-
-  function peg$parsewithdrawalId() {
-    var s0, s1, s2, s3;
-
-    s0 = peg$currPos;
-    s1 = input.substr(peg$currPos, 13);
-    if (s1.toLowerCase() === peg$c31) {
-      peg$currPos += 13;
-    } else {
-      s1 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$e34); }
-    }
-    if (s1 !== peg$FAILED) {
-      s2 = peg$currPos;
-      peg$silentFails++;
-      s3 = peg$parsewordBoundary();
-      peg$silentFails--;
-      if (s3 !== peg$FAILED) {
-        peg$currPos = s2;
-        s2 = undefined;
-      } else {
-        s2 = peg$FAILED;
-      }
-      if (s2 !== peg$FAILED) {
-        peg$savedPos = s0;
-        s0 = peg$f60();
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-
-    return s0;
-  }
-
-  function peg$parsebankAccount() {
-    var s0, s1, s2, s3;
-
-    s0 = peg$currPos;
-    s1 = input.substr(peg$currPos, 12);
-    if (s1.toLowerCase() === peg$c70) {
-      peg$currPos += 12;
-    } else {
-      s1 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$e73); }
-    }
-    if (s1 !== peg$FAILED) {
-      s2 = peg$currPos;
-      peg$silentFails++;
-      s3 = peg$parsewordBoundary();
-      peg$silentFails--;
-      if (s3 !== peg$FAILED) {
-        peg$currPos = s2;
-        s2 = undefined;
-      } else {
-        s2 = peg$FAILED;
-      }
-      if (s2 !== peg$FAILED) {
-        peg$savedPos = s0;
-        s0 = peg$f61();
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-
-    return s0;
-  }
-
-  function peg$parsereportId() {
-    var s0, s1, s2, s3;
-
-    s0 = peg$currPos;
-    s1 = input.substr(peg$currPos, 14);
-    if (s1.toLowerCase() === peg$c71) {
-      peg$currPos += 14;
-    } else {
-      s1 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$e74); }
-    }
-    if (s1 !== peg$FAILED) {
-      s2 = peg$currPos;
-      peg$silentFails++;
-      s3 = peg$parsewordBoundary();
-      peg$silentFails--;
-      if (s3 !== peg$FAILED) {
-        peg$currPos = s2;
-        s2 = undefined;
-      } else {
-        s2 = peg$FAILED;
-      }
-      if (s2 !== peg$FAILED) {
-        peg$savedPos = s0;
-        s0 = peg$f62();
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-
-    return s0;
-  }
-
-  function peg$parsebase62ReportId() {
-    var s0, s1, s2, s3;
-
-    s0 = peg$currPos;
-    s1 = input.substr(peg$currPos, 9);
-    if (s1.toLowerCase() === peg$c9) {
-      peg$currPos += 9;
-    } else {
-      s1 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$e12); }
-    }
-    if (s1 !== peg$FAILED) {
-      s2 = peg$currPos;
-      peg$silentFails++;
-      s3 = peg$parsewordBoundary();
-      peg$silentFails--;
-      if (s3 !== peg$FAILED) {
-        peg$currPos = s2;
-        s2 = undefined;
-      } else {
-        s2 = peg$FAILED;
-      }
-      if (s2 !== peg$FAILED) {
-        peg$savedPos = s0;
-        s0 = peg$f63();
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-
-    return s0;
-  }
-
-  function peg$parseexportedTo() {
-    var s0, s1, s2, s3;
-
-    s0 = peg$currPos;
-    s1 = input.substr(peg$currPos, 11);
-    if (s1.toLowerCase() === peg$c72) {
-      peg$currPos += 11;
-    } else {
-      s1 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$e75); }
-    }
-    if (s1 !== peg$FAILED) {
-      s2 = peg$currPos;
-      peg$silentFails++;
-      s3 = peg$parsewordBoundary();
-      peg$silentFails--;
-      if (s3 !== peg$FAILED) {
-        peg$currPos = s2;
-        s2 = undefined;
-      } else {
-        s2 = peg$FAILED;
-      }
-      if (s2 !== peg$FAILED) {
-        peg$savedPos = s0;
-        s0 = peg$f64();
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-
-    return s0;
-  }
-
-  function peg$parseexchangeRate() {
-    var s0, s1, s2, s3;
-
-    s0 = peg$currPos;
-    s1 = input.substr(peg$currPos, 13);
-    if (s1.toLowerCase() === peg$c73) {
-      peg$currPos += 13;
-    } else {
-      s1 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$e76); }
-    }
-    if (s1 !== peg$FAILED) {
-      s2 = peg$currPos;
-      peg$silentFails++;
-      s3 = peg$parsewordBoundary();
-      peg$silentFails--;
-      if (s3 !== peg$FAILED) {
-        peg$currPos = s2;
-        s2 = undefined;
-      } else {
-        s2 = peg$FAILED;
-      }
-      if (s2 !== peg$FAILED) {
-        peg$savedPos = s0;
-        s0 = peg$f65();
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-
-    return s0;
-  }
-
-  function peg$parsereimbursableTotal() {
-    var s0, s1, s2, s3;
-
-    s0 = peg$currPos;
-    s1 = input.substr(peg$currPos, 18);
-    if (s1.toLowerCase() === peg$c74) {
-      peg$currPos += 18;
-    } else {
-      s1 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$e77); }
-    }
-    if (s1 !== peg$FAILED) {
-      s2 = peg$currPos;
-      peg$silentFails++;
-      s3 = peg$parsewordBoundary();
-      peg$silentFails--;
-      if (s3 !== peg$FAILED) {
-        peg$currPos = s2;
-        s2 = undefined;
-      } else {
-        s2 = peg$FAILED;
-      }
-      if (s2 !== peg$FAILED) {
-        peg$savedPos = s0;
-        s0 = peg$f66();
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-
-    return s0;
-  }
-
-  function peg$parsenonReimbursableTotal() {
-    var s0, s1, s2, s3;
-
-    s0 = peg$currPos;
-    s1 = input.substr(peg$currPos, 22);
-    if (s1.toLowerCase() === peg$c75) {
-      peg$currPos += 22;
-    } else {
-      s1 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$e78); }
-    }
-    if (s1 !== peg$FAILED) {
-      s2 = peg$currPos;
-      peg$silentFails++;
-      s3 = peg$parsewordBoundary();
-      peg$silentFails--;
-      if (s3 !== peg$FAILED) {
-        peg$currPos = s2;
-        s2 = undefined;
-      } else {
-        s2 = peg$FAILED;
-      }
-      if (s2 !== peg$FAILED) {
-        peg$savedPos = s0;
-        s0 = peg$f67();
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-
-    return s0;
-  }
-
-  function peg$parsegroupFrom() {
-    var s0, s1, s2, s3;
-
-    s0 = peg$currPos;
-    s1 = input.substr(peg$currPos, 10);
-    if (s1.toLowerCase() === peg$c76) {
-      peg$currPos += 10;
-    } else {
-      s1 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$e79); }
-    }
-    if (s1 !== peg$FAILED) {
-      s2 = peg$currPos;
-      peg$silentFails++;
-      s3 = peg$parsewordBoundary();
-      peg$silentFails--;
-      if (s3 !== peg$FAILED) {
-        peg$currPos = s2;
-        s2 = undefined;
-      } else {
-        s2 = peg$FAILED;
-      }
-      if (s2 !== peg$FAILED) {
-        peg$savedPos = s0;
-        s0 = peg$f68();
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-
-    return s0;
-  }
-
-  function peg$parsegroupExpenses() {
-    var s0, s1, s2, s3;
-
-    s0 = peg$currPos;
-    s1 = input.substr(peg$currPos, 14);
-    if (s1.toLowerCase() === peg$c77) {
-      peg$currPos += 14;
-    } else {
-      s1 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$e80); }
-    }
-    if (s1 !== peg$FAILED) {
-      s2 = peg$currPos;
-      peg$silentFails++;
-      s3 = peg$parsewordBoundary();
-      peg$silentFails--;
-      if (s3 !== peg$FAILED) {
-        peg$currPos = s2;
-        s2 = undefined;
-      } else {
-        s2 = peg$FAILED;
-      }
-      if (s2 !== peg$FAILED) {
-        peg$savedPos = s0;
-        s0 = peg$f69();
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-
-    return s0;
-  }
-
-  function peg$parsegroupTotal() {
-    var s0, s1, s2, s3;
-
-    s0 = peg$currPos;
-    s1 = input.substr(peg$currPos, 11);
-    if (s1.toLowerCase() === peg$c78) {
-      peg$currPos += 11;
-    } else {
-      s1 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$e81); }
-    }
-    if (s1 !== peg$FAILED) {
-      s2 = peg$currPos;
-      peg$silentFails++;
-      s3 = peg$parsewordBoundary();
-      peg$silentFails--;
-      if (s3 !== peg$FAILED) {
-        peg$currPos = s2;
-        s2 = undefined;
-      } else {
-        s2 = peg$FAILED;
-      }
-      if (s2 !== peg$FAILED) {
-        peg$savedPos = s0;
-        s0 = peg$f70();
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-
-    return s0;
-  }
-
-  function peg$parsegroupCard() {
-    var s0, s1, s2, s3;
-
-    s0 = peg$currPos;
-    s1 = input.substr(peg$currPos, 10);
-    if (s1.toLowerCase() === peg$c79) {
-      peg$currPos += 10;
-    } else {
-      s1 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$e82); }
-    }
-    if (s1 !== peg$FAILED) {
-      s2 = peg$currPos;
-      peg$silentFails++;
-      s3 = peg$parsewordBoundary();
-      peg$silentFails--;
-      if (s3 !== peg$FAILED) {
-        peg$currPos = s2;
-        s2 = undefined;
-      } else {
-        s2 = peg$FAILED;
-      }
-      if (s2 !== peg$FAILED) {
-        peg$savedPos = s0;
-        s0 = peg$f71();
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-
-    return s0;
-  }
-
-  function peg$parsegroupFeed() {
-    var s0, s1, s2, s3;
-
-    s0 = peg$currPos;
-    s1 = input.substr(peg$currPos, 10);
-    if (s1.toLowerCase() === peg$c80) {
-      peg$currPos += 10;
-    } else {
-      s1 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$e83); }
-    }
-    if (s1 !== peg$FAILED) {
-      s2 = peg$currPos;
-      peg$silentFails++;
-      s3 = peg$parsewordBoundary();
-      peg$silentFails--;
-      if (s3 !== peg$FAILED) {
-        peg$currPos = s2;
-        s2 = undefined;
-      } else {
-        s2 = peg$FAILED;
-      }
-      if (s2 !== peg$FAILED) {
-        peg$savedPos = s0;
-        s0 = peg$f72();
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-
-    return s0;
-  }
-
-  function peg$parsegroupBankAccount() {
-    var s0, s1, s2, s3;
-
-    s0 = peg$currPos;
-    s1 = input.substr(peg$currPos, 18);
-    if (s1.toLowerCase() === peg$c81) {
-      peg$currPos += 18;
-    } else {
-      s1 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$e84); }
-    }
-    if (s1 !== peg$FAILED) {
-      s2 = peg$currPos;
-      peg$silentFails++;
-      s3 = peg$parsewordBoundary();
-      peg$silentFails--;
-      if (s3 !== peg$FAILED) {
-        peg$currPos = s2;
-        s2 = undefined;
-      } else {
-        s2 = peg$FAILED;
-      }
-      if (s2 !== peg$FAILED) {
-        peg$savedPos = s0;
-        s0 = peg$f73();
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-
-    return s0;
-  }
-
-  function peg$parsegroupWithdrawn() {
-    var s0, s1, s2, s3;
-
-    s0 = peg$currPos;
-    s1 = input.substr(peg$currPos, 15);
-    if (s1.toLowerCase() === peg$c82) {
-      peg$currPos += 15;
-    } else {
-      s1 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$e85); }
-    }
-    if (s1 !== peg$FAILED) {
-      s2 = peg$currPos;
-      peg$silentFails++;
-      s3 = peg$parsewordBoundary();
-      peg$silentFails--;
-      if (s3 !== peg$FAILED) {
-        peg$currPos = s2;
-        s2 = undefined;
-      } else {
-        s2 = peg$FAILED;
-      }
-      if (s2 !== peg$FAILED) {
-        peg$savedPos = s0;
-        s0 = peg$f74();
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-
-    return s0;
-  }
-
-  function peg$parsegroupWithdrawalId() {
-    var s0, s1, s2, s3;
-
-    s0 = peg$currPos;
-    s1 = input.substr(peg$currPos, 19);
-    if (s1.toLowerCase() === peg$c83) {
-      peg$currPos += 19;
-    } else {
-      s1 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$e86); }
-    }
-    if (s1 !== peg$FAILED) {
-      s2 = peg$currPos;
-      peg$silentFails++;
-      s3 = peg$parsewordBoundary();
-      peg$silentFails--;
-      if (s3 !== peg$FAILED) {
-        peg$currPos = s2;
-        s2 = undefined;
-      } else {
-        s2 = peg$FAILED;
-      }
-      if (s2 !== peg$FAILED) {
-        peg$savedPos = s0;
-        s0 = peg$f75();
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-
-    return s0;
-  }
-
-  function peg$parseoperator() {
-    var s0, s1;
-
-    peg$silentFails++;
-    s0 = peg$currPos;
-    s1 = input.charAt(peg$currPos);
-    if (peg$r1.test(s1)) {
-      peg$currPos++;
-    } else {
-      s1 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$e88); }
-    }
-    if (s1 !== peg$FAILED) {
-      peg$savedPos = s0;
-      s1 = peg$f76();
-    }
-    s0 = s1;
-    if (s0 === peg$FAILED) {
-      s0 = peg$currPos;
-      if (input.substr(peg$currPos, 2) === peg$c84) {
-        s1 = peg$c84;
-        peg$currPos += 2;
-      } else {
-        s1 = peg$FAILED;
-        if (peg$silentFails === 0) { peg$fail(peg$e89); }
-      }
-      if (s1 !== peg$FAILED) {
-        peg$savedPos = s0;
-        s1 = peg$f77();
-      }
-      s0 = s1;
-      if (s0 === peg$FAILED) {
-        s0 = peg$currPos;
-        if (input.substr(peg$currPos, 2) === peg$c85) {
-          s1 = peg$c85;
-          peg$currPos += 2;
-        } else {
-          s1 = peg$FAILED;
-          if (peg$silentFails === 0) { peg$fail(peg$e90); }
-        }
-        if (s1 !== peg$FAILED) {
-          peg$savedPos = s0;
-          s1 = peg$f78();
-        }
-        s0 = s1;
-        if (s0 === peg$FAILED) {
-          s0 = peg$currPos;
-          if (input.charCodeAt(peg$currPos) === 62) {
-            s1 = peg$c86;
-            peg$currPos++;
-          } else {
-            s1 = peg$FAILED;
-            if (peg$silentFails === 0) { peg$fail(peg$e91); }
-          }
-          if (s1 !== peg$FAILED) {
-            peg$savedPos = s0;
-            s1 = peg$f79();
-          }
-          s0 = s1;
-          if (s0 === peg$FAILED) {
-            s0 = peg$currPos;
-            if (input.substr(peg$currPos, 2) === peg$c87) {
-              s1 = peg$c87;
-              peg$currPos += 2;
-            } else {
-              s1 = peg$FAILED;
-              if (peg$silentFails === 0) { peg$fail(peg$e92); }
-            }
-            if (s1 !== peg$FAILED) {
-              peg$savedPos = s0;
-              s1 = peg$f80();
-            }
-            s0 = s1;
-            if (s0 === peg$FAILED) {
-              s0 = peg$currPos;
-              if (input.charCodeAt(peg$currPos) === 60) {
-                s1 = peg$c88;
-                peg$currPos++;
-              } else {
-                s1 = peg$FAILED;
-                if (peg$silentFails === 0) { peg$fail(peg$e93); }
-              }
-              if (s1 !== peg$FAILED) {
-                peg$savedPos = s0;
-                s1 = peg$f81();
-              }
-              s0 = s1;
-            }
-          }
-        }
-      }
-    }
-    peg$silentFails--;
-    if (s0 === peg$FAILED) {
-      s1 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$e87); }
-    }
-
-    return s0;
-  }
-
-  function peg$parsefilterOperator() {
-    var s0, s1;
-
-    s0 = peg$currPos;
-    s1 = peg$parseoperator();
-    if (s1 !== peg$FAILED) {
-      peg$savedPos = s0;
-      s1 = peg$f82(s1);
-    }
-    s0 = s1;
-
-    return s0;
-  }
-
-  function peg$parsealphanumeric() {
-    var s0, s1, s2;
-
-    peg$silentFails++;
-    s0 = peg$currPos;
-    s1 = [];
-    s2 = input.charAt(peg$currPos);
-    if (peg$r2.test(s2)) {
-      peg$currPos++;
-    } else {
-      s2 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$e95); }
-    }
-    if (s2 !== peg$FAILED) {
-      while (s2 !== peg$FAILED) {
-        s1.push(s2);
-        s2 = input.charAt(peg$currPos);
-        if (peg$r2.test(s2)) {
-          peg$currPos++;
-        } else {
-          s2 = peg$FAILED;
-          if (peg$silentFails === 0) { peg$fail(peg$e95); }
-        }
-      }
+    s1 = [];
+    s2 = input.charAt(peg$currPos);
+    if (peg$r2.test(s2)) {
+      peg$currPos++;
+    } else {
+      s2 = peg$FAILED;
+      if (peg$silentFails === 0) { peg$fail(peg$e79); }
+    }
+    if (s2 !== peg$FAILED) {
+      while (s2 !== peg$FAILED) {
+        s1.push(s2);
+        s2 = input.charAt(peg$currPos);
+        if (peg$r2.test(s2)) {
+          peg$currPos++;
+        } else {
+          s2 = peg$FAILED;
+          if (peg$silentFails === 0) { peg$fail(peg$e79); }
+        }
+      }
     } else {
       s1 = peg$FAILED;
     }
     if (s1 !== peg$FAILED) {
       peg$savedPos = s0;
-      s1 = peg$f83(s1);
+      s1 = peg$f62(s1);
     }
     s0 = s1;
     peg$silentFails--;
     if (s0 === peg$FAILED) {
       s1 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$e94); }
+      if (peg$silentFails === 0) { peg$fail(peg$e78); }
     }
 
     return s0;
@@ -3325,7 +2410,7 @@ function peg$parse(input, options) {
     s0 = peg$currPos;
     s1 = peg$parse_();
     peg$savedPos = s0;
-    s1 = peg$f84();
+    s1 = peg$f63();
     s0 = s1;
 
     return s0;
@@ -3341,7 +2426,7 @@ function peg$parse(input, options) {
       peg$currPos++;
     } else {
       s1 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$e97); }
+      if (peg$silentFails === 0) { peg$fail(peg$e81); }
     }
     while (s1 !== peg$FAILED) {
       s0.push(s1);
@@ -3350,12 +2435,12 @@ function peg$parse(input, options) {
         peg$currPos++;
       } else {
         s1 = peg$FAILED;
-        if (peg$silentFails === 0) { peg$fail(peg$e97); }
+        if (peg$silentFails === 0) { peg$fail(peg$e81); }
       }
     }
     peg$silentFails--;
     s1 = peg$FAILED;
-    if (peg$silentFails === 0) { peg$fail(peg$e96); }
+    if (peg$silentFails === 0) { peg$fail(peg$e80); }
 
     return s0;
   }
@@ -3365,7 +2450,7 @@ function peg$parse(input, options) {
 
     s0 = peg$currPos;
     peg$savedPos = peg$currPos;
-    s1 = peg$f85();
+    s1 = peg$f64();
     if (s1) {
       s1 = undefined;
     } else {
@@ -3402,7 +2487,7 @@ function peg$parse(input, options) {
       peg$currPos++;
     } else {
       s2 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$e99); }
+      if (peg$silentFails === 0) { peg$fail(peg$e83); }
     }
     while (s2 !== peg$FAILED) {
       s1.push(s2);
@@ -3411,7 +2496,7 @@ function peg$parse(input, options) {
         peg$currPos++;
       } else {
         s2 = peg$FAILED;
-        if (peg$silentFails === 0) { peg$fail(peg$e99); }
+        if (peg$silentFails === 0) { peg$fail(peg$e83); }
       }
     }
     s2 = input.charAt(peg$currPos);
@@ -3419,7 +2504,7 @@ function peg$parse(input, options) {
       peg$currPos++;
     } else {
       s2 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$e100); }
+      if (peg$silentFails === 0) { peg$fail(peg$e84); }
     }
     if (s2 !== peg$FAILED) {
       s3 = [];
@@ -3428,7 +2513,7 @@ function peg$parse(input, options) {
         peg$currPos++;
       } else {
         s4 = peg$FAILED;
-        if (peg$silentFails === 0) { peg$fail(peg$e101); }
+        if (peg$silentFails === 0) { peg$fail(peg$e85); }
       }
       while (s4 !== peg$FAILED) {
         s3.push(s4);
@@ -3437,7 +2522,7 @@ function peg$parse(input, options) {
           peg$currPos++;
         } else {
           s4 = peg$FAILED;
-          if (peg$silentFails === 0) { peg$fail(peg$e101); }
+          if (peg$silentFails === 0) { peg$fail(peg$e85); }
         }
       }
       s4 = input.charAt(peg$currPos);
@@ -3445,7 +2530,7 @@ function peg$parse(input, options) {
         peg$currPos++;
       } else {
         s4 = peg$FAILED;
-        if (peg$silentFails === 0) { peg$fail(peg$e100); }
+        if (peg$silentFails === 0) { peg$fail(peg$e84); }
       }
       if (s4 !== peg$FAILED) {
         s5 = [];
@@ -3454,7 +2539,7 @@ function peg$parse(input, options) {
           peg$currPos++;
         } else {
           s6 = peg$FAILED;
-          if (peg$silentFails === 0) { peg$fail(peg$e95); }
+          if (peg$silentFails === 0) { peg$fail(peg$e79); }
         }
         while (s6 !== peg$FAILED) {
           s5.push(s6);
@@ -3463,11 +2548,11 @@ function peg$parse(input, options) {
             peg$currPos++;
           } else {
             s6 = peg$FAILED;
-            if (peg$silentFails === 0) { peg$fail(peg$e95); }
+            if (peg$silentFails === 0) { peg$fail(peg$e79); }
           }
         }
         peg$savedPos = s0;
-        s0 = peg$f86(s1, s3, s5);
+        s0 = peg$f65(s1, s3, s5);
       } else {
         peg$currPos = s0;
         s0 = peg$FAILED;
@@ -3479,7 +2564,7 @@ function peg$parse(input, options) {
     peg$silentFails--;
     if (s0 === peg$FAILED) {
       s1 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$e98); }
+      if (peg$silentFails === 0) { peg$fail(peg$e82); }
     }
 
     return s0;
@@ -3496,7 +2581,7 @@ function peg$parse(input, options) {
       peg$currPos++;
     } else {
       s2 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$e99); }
+      if (peg$silentFails === 0) { peg$fail(peg$e83); }
     }
     while (s2 !== peg$FAILED) {
       s1.push(s2);
@@ -3505,7 +2590,7 @@ function peg$parse(input, options) {
         peg$currPos++;
       } else {
         s2 = peg$FAILED;
-        if (peg$silentFails === 0) { peg$fail(peg$e99); }
+        if (peg$silentFails === 0) { peg$fail(peg$e83); }
       }
     }
     s2 = input.charAt(peg$currPos);
@@ -3513,7 +2598,7 @@ function peg$parse(input, options) {
       peg$currPos++;
     } else {
       s2 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$e100); }
+      if (peg$silentFails === 0) { peg$fail(peg$e84); }
     }
     if (s2 !== peg$FAILED) {
       s3 = [];
@@ -3522,7 +2607,7 @@ function peg$parse(input, options) {
         peg$currPos++;
       } else {
         s4 = peg$FAILED;
-        if (peg$silentFails === 0) { peg$fail(peg$e101); }
+        if (peg$silentFails === 0) { peg$fail(peg$e85); }
       }
       if (s4 === peg$FAILED) {
         s4 = peg$currPos;
@@ -3538,15 +2623,15 @@ function peg$parse(input, options) {
         }
         if (s5 !== peg$FAILED) {
           if (input.charCodeAt(peg$currPos) === 8220) {
-            s6 = peg$c89;
+            s6 = peg$c73;
             peg$currPos++;
           } else {
             s6 = peg$FAILED;
-            if (peg$silentFails === 0) { peg$fail(peg$e102); }
+            if (peg$silentFails === 0) { peg$fail(peg$e86); }
           }
           if (s6 !== peg$FAILED) {
             peg$savedPos = s4;
-            s4 = peg$f87(s1);
+            s4 = peg$f66(s1);
           } else {
             peg$currPos = s4;
             s4 = peg$FAILED;
@@ -3569,15 +2654,15 @@ function peg$parse(input, options) {
           }
           if (s5 !== peg$FAILED) {
             if (input.charCodeAt(peg$currPos) === 8221) {
-              s6 = peg$c90;
+              s6 = peg$c74;
               peg$currPos++;
             } else {
               s6 = peg$FAILED;
-              if (peg$silentFails === 0) { peg$fail(peg$e103); }
+              if (peg$silentFails === 0) { peg$fail(peg$e87); }
             }
             if (s6 !== peg$FAILED) {
               peg$savedPos = s4;
-              s4 = peg$f88(s1);
+              s4 = peg$f67(s1);
             } else {
               peg$currPos = s4;
               s4 = peg$FAILED;
@@ -3600,15 +2685,15 @@ function peg$parse(input, options) {
             }
             if (s5 !== peg$FAILED) {
               if (input.charCodeAt(peg$currPos) === 34) {
-                s6 = peg$c91;
+                s6 = peg$c75;
                 peg$currPos++;
               } else {
                 s6 = peg$FAILED;
-                if (peg$silentFails === 0) { peg$fail(peg$e104); }
+                if (peg$silentFails === 0) { peg$fail(peg$e88); }
               }
               if (s6 !== peg$FAILED) {
                 peg$savedPos = s4;
-                s4 = peg$f89(s1);
+                s4 = peg$f68(s1);
               } else {
                 peg$currPos = s4;
                 s4 = peg$FAILED;
@@ -3627,7 +2712,7 @@ function peg$parse(input, options) {
           peg$currPos++;
         } else {
           s4 = peg$FAILED;
-          if (peg$silentFails === 0) { peg$fail(peg$e101); }
+          if (peg$silentFails === 0) { peg$fail(peg$e85); }
         }
         if (s4 === peg$FAILED) {
           s4 = peg$currPos;
@@ -3643,15 +2728,15 @@ function peg$parse(input, options) {
           }
           if (s5 !== peg$FAILED) {
             if (input.charCodeAt(peg$currPos) === 8220) {
-              s6 = peg$c89;
+              s6 = peg$c73;
               peg$currPos++;
             } else {
               s6 = peg$FAILED;
-              if (peg$silentFails === 0) { peg$fail(peg$e102); }
+              if (peg$silentFails === 0) { peg$fail(peg$e86); }
             }
             if (s6 !== peg$FAILED) {
               peg$savedPos = s4;
-              s4 = peg$f87(s1);
+              s4 = peg$f66(s1);
             } else {
               peg$currPos = s4;
               s4 = peg$FAILED;
@@ -3674,15 +2759,15 @@ function peg$parse(input, options) {
             }
             if (s5 !== peg$FAILED) {
               if (input.charCodeAt(peg$currPos) === 8221) {
-                s6 = peg$c90;
+                s6 = peg$c74;
                 peg$currPos++;
               } else {
                 s6 = peg$FAILED;
-                if (peg$silentFails === 0) { peg$fail(peg$e103); }
+                if (peg$silentFails === 0) { peg$fail(peg$e87); }
               }
               if (s6 !== peg$FAILED) {
                 peg$savedPos = s4;
-                s4 = peg$f88(s1);
+                s4 = peg$f67(s1);
               } else {
                 peg$currPos = s4;
                 s4 = peg$FAILED;
@@ -3705,15 +2790,15 @@ function peg$parse(input, options) {
               }
               if (s5 !== peg$FAILED) {
                 if (input.charCodeAt(peg$currPos) === 34) {
-                  s6 = peg$c91;
+                  s6 = peg$c75;
                   peg$currPos++;
                 } else {
                   s6 = peg$FAILED;
-                  if (peg$silentFails === 0) { peg$fail(peg$e104); }
+                  if (peg$silentFails === 0) { peg$fail(peg$e88); }
                 }
                 if (s6 !== peg$FAILED) {
                   peg$savedPos = s4;
-                  s4 = peg$f89(s1);
+                  s4 = peg$f68(s1);
                 } else {
                   peg$currPos = s4;
                   s4 = peg$FAILED;
@@ -3729,7 +2814,7 @@ function peg$parse(input, options) {
       s4 = peg$parseclosingQuote();
       if (s4 !== peg$FAILED) {
         peg$savedPos = s0;
-        s0 = peg$f90(s1, s3, s4);
+        s0 = peg$f69(s1, s3, s4);
       } else {
         peg$currPos = s0;
         s0 = peg$FAILED;
@@ -3741,7 +2826,7 @@ function peg$parse(input, options) {
     peg$silentFails--;
     if (s0 === peg$FAILED) {
       s1 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$e98); }
+      if (peg$silentFails === 0) { peg$fail(peg$e82); }
     }
 
     return s0;
@@ -3756,7 +2841,7 @@ function peg$parse(input, options) {
       peg$currPos++;
     } else {
       s1 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$e100); }
+      if (peg$silentFails === 0) { peg$fail(peg$e84); }
     }
     if (s1 !== peg$FAILED) {
       s2 = peg$currPos;
@@ -3794,7 +2879,7 @@ function peg$parse(input, options) {
       peg$currPos++;
     } else {
       s2 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$e105); }
+      if (peg$silentFails === 0) { peg$fail(peg$e89); }
     }
     while (s2 !== peg$FAILED) {
       s1.push(s2);
@@ -3803,7 +2888,7 @@ function peg$parse(input, options) {
         peg$currPos++;
       } else {
         s2 = peg$FAILED;
-        if (peg$silentFails === 0) { peg$fail(peg$e105); }
+        if (peg$silentFails === 0) { peg$fail(peg$e89); }
       }
     }
     s2 = [];
@@ -3812,7 +2897,7 @@ function peg$parse(input, options) {
       peg$currPos++;
     } else {
       s3 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$e106); }
+      if (peg$silentFails === 0) { peg$fail(peg$e90); }
     }
     while (s3 !== peg$FAILED) {
       s2.push(s3);
@@ -3821,7 +2906,7 @@ function peg$parse(input, options) {
         peg$currPos++;
       } else {
         s3 = peg$FAILED;
-        if (peg$silentFails === 0) { peg$fail(peg$e106); }
+        if (peg$silentFails === 0) { peg$fail(peg$e90); }
       }
     }
     s3 = [];
@@ -3830,7 +2915,7 @@ function peg$parse(input, options) {
       peg$currPos++;
     } else {
       s4 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$e107); }
+      if (peg$silentFails === 0) { peg$fail(peg$e91); }
     }
     while (s4 !== peg$FAILED) {
       s3.push(s4);
@@ -3839,7 +2924,7 @@ function peg$parse(input, options) {
         peg$currPos++;
       } else {
         s4 = peg$FAILED;
-        if (peg$silentFails === 0) { peg$fail(peg$e107); }
+        if (peg$silentFails === 0) { peg$fail(peg$e91); }
       }
     }
     s4 = peg$parseoperator();
@@ -3858,7 +2943,7 @@ function peg$parse(input, options) {
         peg$currPos++;
       } else {
         s2 = peg$FAILED;
-        if (peg$silentFails === 0) { peg$fail(peg$e108); }
+        if (peg$silentFails === 0) { peg$fail(peg$e92); }
       }
       while (s2 !== peg$FAILED) {
         s1.push(s2);
@@ -3867,7 +2952,7 @@ function peg$parse(input, options) {
           peg$currPos++;
         } else {
           s2 = peg$FAILED;
-          if (peg$silentFails === 0) { peg$fail(peg$e108); }
+          if (peg$silentFails === 0) { peg$fail(peg$e92); }
         }
       }
       s2 = peg$currPos;
@@ -3914,7 +2999,7 @@ function peg$parse(input, options) {
           peg$currPos++;
         } else {
           s0 = peg$FAILED;
-          if (peg$silentFails === 0) { peg$fail(peg$e109); }
+          if (peg$silentFails === 0) { peg$fail(peg$e93); }
         }
       }
     }
@@ -3922,38 +3007,6 @@ function peg$parse(input, options) {
     return s0;
   }
 
-  function peg$parsewordBoundary() {
-    var s0, s1;
-
-    s0 = input.charAt(peg$currPos);
-    if (peg$r12.test(s0)) {
-      peg$currPos++;
-    } else {
-      s0 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$e110); }
-    }
-    if (s0 === peg$FAILED) {
-      s0 = peg$currPos;
-      peg$silentFails++;
-      if (input.length > peg$currPos) {
-        s1 = input.charAt(peg$currPos);
-        peg$currPos++;
-      } else {
-        s1 = peg$FAILED;
-        if (peg$silentFails === 0) { peg$fail(peg$e4); }
-      }
-      peg$silentFails--;
-      if (s1 === peg$FAILED) {
-        s0 = undefined;
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    }
-
-    return s0;
-  }
-
  
   let autocomplete = null; 
 
@@ -3965,7 +3018,6 @@ function peg$parse(input, options) {
  
   let nameOperator = false;
   let expectingNestedQuote = false;
-  let isColumnsContext = false;
 
   peg$result = peg$startRuleFunction();
 
diff --git a/src/libs/SearchParser/baseRules.peggy b/src/libs/SearchParser/baseRules.peggy
index 117d06056cdc..d9662ad6d2d9 100644
--- a/src/libs/SearchParser/baseRules.peggy
+++ b/src/libs/SearchParser/baseRules.peggy
@@ -12,7 +12,6 @@
 { 
   let nameOperator = false;
   let expectingNestedQuote = false;
-  let isColumnsContext = false;
 }
 
 // rules to match re-defined search syntax keys.
@@ -79,62 +78,15 @@ has = "has"i {return "has"; }
 is = "is"i {return "is"; }
 purchaseAmount = "purchaseAmount"i / "purchase-amount"i {return "purchaseAmount"}
 purchaseCurrency = "purchaseCurrency"i / "purchase-currency"i {return "purchaseCurrency"}
-columns = "columns"i { 
-  isColumnsContext = true;
-  return "columns";
-}
+columns = "columns"i {return "columns"}
 
 // Value transformation rules
 values
-  = &{ return isColumnsContext; } columnsValues
-  / perDiem
+  = perDiem
   / draft
 
-columnsValues
-  = originalAmount
-  / taxRateValue
-  / taxAmount
-  / policyName
-  / withdrawalId
-  / bankAccount
-  / reportId
-  / base62ReportId
-  / exportedTo
-  / exchangeRate
-  / reimbursableTotal
-  / nonReimbursableTotal
-  / groupFrom
-  / groupExpenses
-  / groupTotal
-  / groupCard
-  / groupFeed
-  / groupBankAccount
-  / groupWithdrawn
-  / groupWithdrawalId
-
-perDiem                 = "per-diem"i &wordBoundary                 { return "perDiem"; }
-draft                  = ("drafts"i / "draft"i) &wordBoundary       { return "drafts"; }
-originalAmount          = "original-amount"i &wordBoundary          { return "originalamount"; }
-taxAmount               = "tax"i &wordBoundary                      { return "taxAmount"; }
-taxRateValue            = "tax-rate"i &wordBoundary                 { return "taxrate"; }
-policyName              = "policy-name"i &wordBoundary              { return "policyname"; }
-withdrawalId            = "withdrawal-id"i &wordBoundary            { return "withdrawalID"; }
-bankAccount             = "bank-account"i &wordBoundary             { return "bankAccount"; }
-reportId                = "long-report-id"i &wordBoundary           { return "reportID"; }
-base62ReportId          = "report-id"i &wordBoundary                { return "base62ReportID"; }
-exportedTo              = "exported-to"i &wordBoundary              { return "exportedto"; }
-exchangeRate            = "exchange-rate"i &wordBoundary            { return "exchangeRate"; }
-reimbursableTotal       = "reimbursable-total"i &wordBoundary       { return "reimbursableTotal"; }
-nonReimbursableTotal    = "non-reimbursable-total"i &wordBoundary   { return "nonReimbursableTotal"; }
-groupFrom               = "group-from"i &wordBoundary               { return "groupFrom"; }
-groupExpenses           = "group-expenses"i &wordBoundary           { return "groupExpenses"; }
-groupTotal              = "group-total"i &wordBoundary              { return "groupTotal"; }
-groupCard               = "group-card"i &wordBoundary               { return "groupCard"; }
-groupFeed               = "group-feed"i &wordBoundary               { return "groupFeed"; }
-groupBankAccount        = "group-bank-account"i &wordBoundary       { return "groupBankAccount"; }
-groupWithdrawn          = "group-withdrawn"i &wordBoundary          { return "groupWithdrawn"; }
-groupWithdrawalId       = "group-withdrawal-id"i &wordBoundary      { return "groupWithdrawalID"; }
-
+perDiem = "perDiem"i / "per-diem"i { return "perDiem"; }
+draft = "drafts"i / "draft"i {return "drafts"; }
 
 operator "operator"
   = (":" / "=") { return "eq"; }
@@ -149,16 +101,12 @@ filterOperator
       if (nameOperator) {
         expectingNestedQuote = (o === "eq"); // Use simple parser if no valid operator is found
       }
-      isColumnsContext = false;
       return o;
   }
 
 alphanumeric "word" = chars:[^ ,\t\n\r\xA0]+ { return chars.join("").trim(); } //handle no-breaking space
 
-logicalAnd = _ { 
-  isColumnsContext = false;
-  return "and";
-}
+logicalAnd = _ { return "and"; }
 
 _ "whitespace" = [ \t\r\n\xA0]* //handle no-breaking space
 
@@ -189,7 +137,3 @@ validClosingCondition
   = [ \t\n\r\xA0a-zA-Z0-9]* [a-zA-Z0-9]* [ \t\n\r\xA0]* operator  // Case 1: Followed by WORD + OPERATOR (new key-value pair)
   / [ \t\n\r\xA0a-zA-Z]* !operator !.  // Case 2: Followed by any number of spaces, or words, with no operator, and then an END OF INPUT.
   / [,] // Case 3: Followed by a comma
-
-wordBoundary
-  = [ \t\n\r\xA0,]  // whitespace or comma
-  / !.              // or end of input
diff --git a/src/libs/SearchParser/searchParser.js b/src/libs/SearchParser/searchParser.js
index 4c74ad6062d8..020427d414a9 100644
--- a/src/libs/SearchParser/searchParser.js
+++ b/src/libs/SearchParser/searchParser.js
@@ -248,34 +248,18 @@ function peg$parse(input, options) {
   var peg$c61 = "purchasecurrency";
   var peg$c62 = "purchase-currency";
   var peg$c63 = "columns";
-  var peg$c64 = "per-diem";
-  var peg$c65 = "drafts";
-  var peg$c66 = "draft";
-  var peg$c67 = "original-amount";
-  var peg$c68 = "tax";
-  var peg$c69 = "policy-name";
-  var peg$c70 = "bank-account";
-  var peg$c71 = "long-report-id";
-  var peg$c72 = "exported-to";
-  var peg$c73 = "exchange-rate";
-  var peg$c74 = "reimbursable-total";
-  var peg$c75 = "non-reimbursable-total";
-  var peg$c76 = "group-from";
-  var peg$c77 = "group-expenses";
-  var peg$c78 = "group-total";
-  var peg$c79 = "group-card";
-  var peg$c80 = "group-feed";
-  var peg$c81 = "group-bank-account";
-  var peg$c82 = "group-withdrawn";
-  var peg$c83 = "group-withdrawal-id";
-  var peg$c84 = "!=";
-  var peg$c85 = ">=";
-  var peg$c86 = ">";
-  var peg$c87 = "<=";
-  var peg$c88 = "<";
-  var peg$c89 = "\u201C";
-  var peg$c90 = "\u201D";
-  var peg$c91 = "\"";
+  var peg$c64 = "perdiem";
+  var peg$c65 = "per-diem";
+  var peg$c66 = "drafts";
+  var peg$c67 = "draft";
+  var peg$c68 = "!=";
+  var peg$c69 = ">=";
+  var peg$c70 = ">";
+  var peg$c71 = "<=";
+  var peg$c72 = "<";
+  var peg$c73 = "\u201C";
+  var peg$c74 = "\u201D";
+  var peg$c75 = "\"";
 
   var peg$r0 = /^[^ \t\r\n\xA0]/;
   var peg$r1 = /^[ \t\r\n\xA0,:=<>!]/;
@@ -290,7 +274,6 @@ function peg$parse(input, options) {
   var peg$r10 = /^[ \t\n\r\xA0]/;
   var peg$r11 = /^[ \t\n\r\xA0a-zA-Z]/;
   var peg$r12 = /^[,]/;
-  var peg$r13 = /^[ \t\n\r\xA0,]/;
 
   var peg$e0 = peg$classExpectation([" ", "\t", "\r", "\n", "\xA0"], true, false);
   var peg$e1 = peg$literalExpectation("-", false);
@@ -361,50 +344,33 @@ function peg$parse(input, options) {
   var peg$e66 = peg$literalExpectation("purchaseCurrency", true);
   var peg$e67 = peg$literalExpectation("purchase-currency", true);
   var peg$e68 = peg$literalExpectation("columns", true);
-  var peg$e69 = peg$literalExpectation("per-diem", true);
-  var peg$e70 = peg$literalExpectation("drafts", true);
-  var peg$e71 = peg$literalExpectation("draft", true);
-  var peg$e72 = peg$literalExpectation("original-amount", true);
-  var peg$e73 = peg$literalExpectation("tax", true);
-  var peg$e74 = peg$literalExpectation("policy-name", true);
-  var peg$e75 = peg$literalExpectation("bank-account", true);
-  var peg$e76 = peg$literalExpectation("long-report-id", true);
-  var peg$e77 = peg$literalExpectation("exported-to", true);
-  var peg$e78 = peg$literalExpectation("exchange-rate", true);
-  var peg$e79 = peg$literalExpectation("reimbursable-total", true);
-  var peg$e80 = peg$literalExpectation("non-reimbursable-total", true);
-  var peg$e81 = peg$literalExpectation("group-from", true);
-  var peg$e82 = peg$literalExpectation("group-expenses", true);
-  var peg$e83 = peg$literalExpectation("group-total", true);
-  var peg$e84 = peg$literalExpectation("group-card", true);
-  var peg$e85 = peg$literalExpectation("group-feed", true);
-  var peg$e86 = peg$literalExpectation("group-bank-account", true);
-  var peg$e87 = peg$literalExpectation("group-withdrawn", true);
-  var peg$e88 = peg$literalExpectation("group-withdrawal-id", true);
-  var peg$e89 = peg$otherExpectation("operator");
-  var peg$e90 = peg$classExpectation([":", "="], false, false);
-  var peg$e91 = peg$literalExpectation("!=", false);
-  var peg$e92 = peg$literalExpectation(">=", false);
-  var peg$e93 = peg$literalExpectation(">", false);
-  var peg$e94 = peg$literalExpectation("<=", false);
-  var peg$e95 = peg$literalExpectation("<", false);
-  var peg$e96 = peg$otherExpectation("word");
-  var peg$e97 = peg$classExpectation([" ", ",", "\t", "\n", "\r", "\xA0"], true, false);
-  var peg$e98 = peg$otherExpectation("whitespace");
-  var peg$e99 = peg$classExpectation([" ", "\t", "\r", "\n", "\xA0"], false, false);
-  var peg$e100 = peg$otherExpectation("quote");
-  var peg$e101 = peg$classExpectation([" ", ",", "\"", "\u201D", "\u201C", "\t", "\n", "\r", "\xA0"], true, false);
-  var peg$e102 = peg$classExpectation(["\"", ["\u201C", "\u201D"]], false, false);
-  var peg$e103 = peg$classExpectation(["\"", "\u201D", "\u201C", "\r", "\n"], true, false);
-  var peg$e104 = peg$literalExpectation("\u201C", false);
-  var peg$e105 = peg$literalExpectation("\u201D", false);
-  var peg$e106 = peg$literalExpectation("\"", false);
-  var peg$e107 = peg$classExpectation([" ", "\t", "\n", "\r", "\xA0", ["a", "z"], ["A", "Z"], ["0", "9"]], false, false);
-  var peg$e108 = peg$classExpectation([["a", "z"], ["A", "Z"], ["0", "9"]], false, false);
-  var peg$e109 = peg$classExpectation([" ", "\t", "\n", "\r", "\xA0"], false, false);
-  var peg$e110 = peg$classExpectation([" ", "\t", "\n", "\r", "\xA0", ["a", "z"], ["A", "Z"]], false, false);
-  var peg$e111 = peg$classExpectation([","], false, false);
-  var peg$e112 = peg$classExpectation([" ", "\t", "\n", "\r", "\xA0", ","], false, false);
+  var peg$e69 = peg$literalExpectation("perDiem", true);
+  var peg$e70 = peg$literalExpectation("per-diem", true);
+  var peg$e71 = peg$literalExpectation("drafts", true);
+  var peg$e72 = peg$literalExpectation("draft", true);
+  var peg$e73 = peg$otherExpectation("operator");
+  var peg$e74 = peg$classExpectation([":", "="], false, false);
+  var peg$e75 = peg$literalExpectation("!=", false);
+  var peg$e76 = peg$literalExpectation(">=", false);
+  var peg$e77 = peg$literalExpectation(">", false);
+  var peg$e78 = peg$literalExpectation("<=", false);
+  var peg$e79 = peg$literalExpectation("<", false);
+  var peg$e80 = peg$otherExpectation("word");
+  var peg$e81 = peg$classExpectation([" ", ",", "\t", "\n", "\r", "\xA0"], true, false);
+  var peg$e82 = peg$otherExpectation("whitespace");
+  var peg$e83 = peg$classExpectation([" ", "\t", "\r", "\n", "\xA0"], false, false);
+  var peg$e84 = peg$otherExpectation("quote");
+  var peg$e85 = peg$classExpectation([" ", ",", "\"", "\u201D", "\u201C", "\t", "\n", "\r", "\xA0"], true, false);
+  var peg$e86 = peg$classExpectation(["\"", ["\u201C", "\u201D"]], false, false);
+  var peg$e87 = peg$classExpectation(["\"", "\u201D", "\u201C", "\r", "\n"], true, false);
+  var peg$e88 = peg$literalExpectation("\u201C", false);
+  var peg$e89 = peg$literalExpectation("\u201D", false);
+  var peg$e90 = peg$literalExpectation("\"", false);
+  var peg$e91 = peg$classExpectation([" ", "\t", "\n", "\r", "\xA0", ["a", "z"], ["A", "Z"], ["0", "9"]], false, false);
+  var peg$e92 = peg$classExpectation([["a", "z"], ["A", "Z"], ["0", "9"]], false, false);
+  var peg$e93 = peg$classExpectation([" ", "\t", "\n", "\r", "\xA0"], false, false);
+  var peg$e94 = peg$classExpectation([" ", "\t", "\n", "\r", "\xA0", ["a", "z"], ["A", "Z"]], false, false);
+  var peg$e95 = peg$classExpectation([","], false, false);
 
   var peg$f0 = function(filters) { return applyDefaults(filters); };
   var peg$f1 = function(head, tail) {
@@ -536,59 +502,31 @@ function peg$parse(input, options) {
   var peg$f50 = function() {return "is"; };
   var peg$f51 = function() {return "purchaseAmount"};
   var peg$f52 = function() {return "purchaseCurrency"};
-  var peg$f53 = function() { 
-  isColumnsContext = true;
-  return "columns";
-};
-  var peg$f54 = function() { return isColumnsContext; };
-  var peg$f55 = function() { return "perDiem"; };
-  var peg$f56 = function() { return "drafts"; };
-  var peg$f57 = function() { return "originalamount"; };
-  var peg$f58 = function() { return "taxAmount"; };
-  var peg$f59 = function() { return "taxrate"; };
-  var peg$f60 = function() { return "policyname"; };
-  var peg$f61 = function() { return "withdrawalID"; };
-  var peg$f62 = function() { return "bankAccount"; };
-  var peg$f63 = function() { return "reportID"; };
-  var peg$f64 = function() { return "base62ReportID"; };
-  var peg$f65 = function() { return "exportedto"; };
-  var peg$f66 = function() { return "exchangeRate"; };
-  var peg$f67 = function() { return "reimbursableTotal"; };
-  var peg$f68 = function() { return "nonReimbursableTotal"; };
-  var peg$f69 = function() { return "groupFrom"; };
-  var peg$f70 = function() { return "groupExpenses"; };
-  var peg$f71 = function() { return "groupTotal"; };
-  var peg$f72 = function() { return "groupCard"; };
-  var peg$f73 = function() { return "groupFeed"; };
-  var peg$f74 = function() { return "groupBankAccount"; };
-  var peg$f75 = function() { return "groupWithdrawn"; };
-  var peg$f76 = function() { return "groupWithdrawalID"; };
-  var peg$f77 = function() { return "eq"; };
-  var peg$f78 = function() { return "neq"; };
-  var peg$f79 = function() { return "gte"; };
-  var peg$f80 = function() { return "gt"; };
-  var peg$f81 = function() { return "lte"; };
-  var peg$f82 = function() { return "lt"; };
-  var peg$f83 = function(o) {
+  var peg$f53 = function() {return "columns"};
+  var peg$f54 = function() { return "perDiem"; };
+  var peg$f55 = function() {return "drafts"; };
+  var peg$f56 = function() { return "eq"; };
+  var peg$f57 = function() { return "neq"; };
+  var peg$f58 = function() { return "gte"; };
+  var peg$f59 = function() { return "gt"; };
+  var peg$f60 = function() { return "lte"; };
+  var peg$f61 = function() { return "lt"; };
+  var peg$f62 = function(o) {
       if (nameOperator) {
         expectingNestedQuote = (o === "eq"); // Use simple parser if no valid operator is found
       }
-      isColumnsContext = false;
       return o;
   };
-  var peg$f84 = function(chars) { return chars.join("").trim(); };
-  var peg$f85 = function() { 
-  isColumnsContext = false;
-  return "and";
-};
-  var peg$f86 = function() { return expectingNestedQuote; };
-  var peg$f87 = function(start, inner, end) { //handle no-breaking space
+  var peg$f63 = function(chars) { return chars.join("").trim(); };
+  var peg$f64 = function() { return "and"; };
+  var peg$f65 = function() { return expectingNestedQuote; };
+  var peg$f66 = function(start, inner, end) { //handle no-breaking space
       return [...start, '"', ...inner, '"', ...end].join("");
     };
-  var peg$f88 = function(start) {return "“"};
-  var peg$f89 = function(start) {return "”"};
-  var peg$f90 = function(start) {return "\""};
-  var peg$f91 = function(start, inner, end) {
+  var peg$f67 = function(start) {return "“"};
+  var peg$f68 = function(start) {return "”"};
+  var peg$f69 = function(start) {return "\""};
+  var peg$f70 = function(start, inner, end) {
     return [...start, '"', ...inner, '"'].join("");
 };
   var peg$currPos = options.peg$currPos | 0;
@@ -2426,1078 +2364,225 @@ function peg$parse(input, options) {
   }
 
   function peg$parsevalues() {
-    var s0, s1, s2;
-
-    s0 = peg$currPos;
-    peg$savedPos = peg$currPos;
-    s1 = peg$f54();
-    if (s1) {
-      s1 = undefined;
-    } else {
-      s1 = peg$FAILED;
-    }
-    if (s1 !== peg$FAILED) {
-      s2 = peg$parsecolumnsValues();
-      if (s2 !== peg$FAILED) {
-        s1 = [s1, s2];
-        s0 = s1;
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-    if (s0 === peg$FAILED) {
-      s0 = peg$parseperDiem();
-      if (s0 === peg$FAILED) {
-        s0 = peg$parsedraft();
-      }
-    }
-
-    return s0;
-  }
-
-  function peg$parsecolumnsValues() {
     var s0;
 
-    s0 = peg$parseoriginalAmount();
+    s0 = peg$parseperDiem();
     if (s0 === peg$FAILED) {
-      s0 = peg$parsetaxRateValue();
-      if (s0 === peg$FAILED) {
-        s0 = peg$parsetaxAmount();
-        if (s0 === peg$FAILED) {
-          s0 = peg$parsepolicyName();
-          if (s0 === peg$FAILED) {
-            s0 = peg$parsewithdrawalId();
-            if (s0 === peg$FAILED) {
-              s0 = peg$parsebankAccount();
-              if (s0 === peg$FAILED) {
-                s0 = peg$parsereportId();
-                if (s0 === peg$FAILED) {
-                  s0 = peg$parsebase62ReportId();
-                  if (s0 === peg$FAILED) {
-                    s0 = peg$parseexportedTo();
-                    if (s0 === peg$FAILED) {
-                      s0 = peg$parseexchangeRate();
-                      if (s0 === peg$FAILED) {
-                        s0 = peg$parsereimbursableTotal();
-                        if (s0 === peg$FAILED) {
-                          s0 = peg$parsenonReimbursableTotal();
-                          if (s0 === peg$FAILED) {
-                            s0 = peg$parsegroupFrom();
-                            if (s0 === peg$FAILED) {
-                              s0 = peg$parsegroupExpenses();
-                              if (s0 === peg$FAILED) {
-                                s0 = peg$parsegroupTotal();
-                                if (s0 === peg$FAILED) {
-                                  s0 = peg$parsegroupCard();
-                                  if (s0 === peg$FAILED) {
-                                    s0 = peg$parsegroupFeed();
-                                    if (s0 === peg$FAILED) {
-                                      s0 = peg$parsegroupBankAccount();
-                                      if (s0 === peg$FAILED) {
-                                        s0 = peg$parsegroupWithdrawn();
-                                        if (s0 === peg$FAILED) {
-                                          s0 = peg$parsegroupWithdrawalId();
-                                        }
-                                      }
-                                    }
-                                  }
-                                }
-                              }
-                            }
-                          }
-                        }
-                      }
-                    }
-                  }
-                }
-              }
-            }
-          }
-        }
-      }
+      s0 = peg$parsedraft();
     }
 
     return s0;
   }
 
   function peg$parseperDiem() {
-    var s0, s1, s2, s3;
+    var s0, s1;
 
-    s0 = peg$currPos;
-    s1 = input.substr(peg$currPos, 8);
-    if (s1.toLowerCase() === peg$c64) {
-      peg$currPos += 8;
+    s0 = input.substr(peg$currPos, 7);
+    if (s0.toLowerCase() === peg$c64) {
+      peg$currPos += 7;
     } else {
-      s1 = peg$FAILED;
+      s0 = peg$FAILED;
       if (peg$silentFails === 0) { peg$fail(peg$e69); }
     }
-    if (s1 !== peg$FAILED) {
-      s2 = peg$currPos;
-      peg$silentFails++;
-      s3 = peg$parsewordBoundary();
-      peg$silentFails--;
-      if (s3 !== peg$FAILED) {
-        peg$currPos = s2;
-        s2 = undefined;
+    if (s0 === peg$FAILED) {
+      s0 = peg$currPos;
+      s1 = input.substr(peg$currPos, 8);
+      if (s1.toLowerCase() === peg$c65) {
+        peg$currPos += 8;
       } else {
-        s2 = peg$FAILED;
+        s1 = peg$FAILED;
+        if (peg$silentFails === 0) { peg$fail(peg$e70); }
       }
-      if (s2 !== peg$FAILED) {
+      if (s1 !== peg$FAILED) {
         peg$savedPos = s0;
-        s0 = peg$f55();
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
+        s1 = peg$f54();
       }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
+      s0 = s1;
     }
 
     return s0;
   }
 
   function peg$parsedraft() {
-    var s0, s1, s2, s3;
+    var s0, s1;
 
-    s0 = peg$currPos;
-    s1 = input.substr(peg$currPos, 6);
-    if (s1.toLowerCase() === peg$c65) {
+    s0 = input.substr(peg$currPos, 6);
+    if (s0.toLowerCase() === peg$c66) {
       peg$currPos += 6;
     } else {
-      s1 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$e70); }
+      s0 = peg$FAILED;
+      if (peg$silentFails === 0) { peg$fail(peg$e71); }
     }
-    if (s1 === peg$FAILED) {
+    if (s0 === peg$FAILED) {
+      s0 = peg$currPos;
       s1 = input.substr(peg$currPos, 5);
-      if (s1.toLowerCase() === peg$c66) {
+      if (s1.toLowerCase() === peg$c67) {
         peg$currPos += 5;
       } else {
         s1 = peg$FAILED;
-        if (peg$silentFails === 0) { peg$fail(peg$e71); }
-      }
-    }
-    if (s1 !== peg$FAILED) {
-      s2 = peg$currPos;
-      peg$silentFails++;
-      s3 = peg$parsewordBoundary();
-      peg$silentFails--;
-      if (s3 !== peg$FAILED) {
-        peg$currPos = s2;
-        s2 = undefined;
-      } else {
-        s2 = peg$FAILED;
+        if (peg$silentFails === 0) { peg$fail(peg$e72); }
       }
-      if (s2 !== peg$FAILED) {
+      if (s1 !== peg$FAILED) {
         peg$savedPos = s0;
-        s0 = peg$f56();
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
+        s1 = peg$f55();
       }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
+      s0 = s1;
     }
 
     return s0;
   }
 
-  function peg$parseoriginalAmount() {
-    var s0, s1, s2, s3;
+  function peg$parseoperator() {
+    var s0, s1;
 
+    peg$silentFails++;
     s0 = peg$currPos;
-    s1 = input.substr(peg$currPos, 15);
-    if (s1.toLowerCase() === peg$c67) {
-      peg$currPos += 15;
+    s1 = input.charAt(peg$currPos);
+    if (peg$r2.test(s1)) {
+      peg$currPos++;
     } else {
       s1 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$e72); }
+      if (peg$silentFails === 0) { peg$fail(peg$e74); }
     }
     if (s1 !== peg$FAILED) {
-      s2 = peg$currPos;
-      peg$silentFails++;
-      s3 = peg$parsewordBoundary();
-      peg$silentFails--;
-      if (s3 !== peg$FAILED) {
-        peg$currPos = s2;
-        s2 = undefined;
+      peg$savedPos = s0;
+      s1 = peg$f56();
+    }
+    s0 = s1;
+    if (s0 === peg$FAILED) {
+      s0 = peg$currPos;
+      if (input.substr(peg$currPos, 2) === peg$c68) {
+        s1 = peg$c68;
+        peg$currPos += 2;
       } else {
-        s2 = peg$FAILED;
+        s1 = peg$FAILED;
+        if (peg$silentFails === 0) { peg$fail(peg$e75); }
       }
-      if (s2 !== peg$FAILED) {
+      if (s1 !== peg$FAILED) {
         peg$savedPos = s0;
-        s0 = peg$f57();
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
+        s1 = peg$f57();
       }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
+      s0 = s1;
+      if (s0 === peg$FAILED) {
+        s0 = peg$currPos;
+        if (input.substr(peg$currPos, 2) === peg$c69) {
+          s1 = peg$c69;
+          peg$currPos += 2;
+        } else {
+          s1 = peg$FAILED;
+          if (peg$silentFails === 0) { peg$fail(peg$e76); }
+        }
+        if (s1 !== peg$FAILED) {
+          peg$savedPos = s0;
+          s1 = peg$f58();
+        }
+        s0 = s1;
+        if (s0 === peg$FAILED) {
+          s0 = peg$currPos;
+          if (input.charCodeAt(peg$currPos) === 62) {
+            s1 = peg$c70;
+            peg$currPos++;
+          } else {
+            s1 = peg$FAILED;
+            if (peg$silentFails === 0) { peg$fail(peg$e77); }
+          }
+          if (s1 !== peg$FAILED) {
+            peg$savedPos = s0;
+            s1 = peg$f59();
+          }
+          s0 = s1;
+          if (s0 === peg$FAILED) {
+            s0 = peg$currPos;
+            if (input.substr(peg$currPos, 2) === peg$c71) {
+              s1 = peg$c71;
+              peg$currPos += 2;
+            } else {
+              s1 = peg$FAILED;
+              if (peg$silentFails === 0) { peg$fail(peg$e78); }
+            }
+            if (s1 !== peg$FAILED) {
+              peg$savedPos = s0;
+              s1 = peg$f60();
+            }
+            s0 = s1;
+            if (s0 === peg$FAILED) {
+              s0 = peg$currPos;
+              if (input.charCodeAt(peg$currPos) === 60) {
+                s1 = peg$c72;
+                peg$currPos++;
+              } else {
+                s1 = peg$FAILED;
+                if (peg$silentFails === 0) { peg$fail(peg$e79); }
+              }
+              if (s1 !== peg$FAILED) {
+                peg$savedPos = s0;
+                s1 = peg$f61();
+              }
+              s0 = s1;
+            }
+          }
+        }
+      }
+    }
+    peg$silentFails--;
+    if (s0 === peg$FAILED) {
+      s1 = peg$FAILED;
+      if (peg$silentFails === 0) { peg$fail(peg$e73); }
     }
 
     return s0;
   }
 
-  function peg$parsetaxAmount() {
-    var s0, s1, s2, s3;
+  function peg$parsefilterOperator() {
+    var s0, s1;
 
     s0 = peg$currPos;
-    s1 = input.substr(peg$currPos, 3);
-    if (s1.toLowerCase() === peg$c68) {
-      peg$currPos += 3;
-    } else {
-      s1 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$e73); }
-    }
+    s1 = peg$parseoperator();
     if (s1 !== peg$FAILED) {
-      s2 = peg$currPos;
-      peg$silentFails++;
-      s3 = peg$parsewordBoundary();
-      peg$silentFails--;
-      if (s3 !== peg$FAILED) {
-        peg$currPos = s2;
-        s2 = undefined;
-      } else {
-        s2 = peg$FAILED;
-      }
-      if (s2 !== peg$FAILED) {
-        peg$savedPos = s0;
-        s0 = peg$f58();
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
+      peg$savedPos = s0;
+      s1 = peg$f62(s1);
     }
+    s0 = s1;
 
     return s0;
   }
 
-  function peg$parsetaxRateValue() {
-    var s0, s1, s2, s3;
+  function peg$parsealphanumeric() {
+    var s0, s1, s2;
 
+    peg$silentFails++;
     s0 = peg$currPos;
-    s1 = input.substr(peg$currPos, 8);
-    if (s1.toLowerCase() === peg$c21) {
-      peg$currPos += 8;
-    } else {
-      s1 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$e26); }
-    }
-    if (s1 !== peg$FAILED) {
-      s2 = peg$currPos;
-      peg$silentFails++;
-      s3 = peg$parsewordBoundary();
-      peg$silentFails--;
-      if (s3 !== peg$FAILED) {
-        peg$currPos = s2;
-        s2 = undefined;
-      } else {
-        s2 = peg$FAILED;
-      }
-      if (s2 !== peg$FAILED) {
-        peg$savedPos = s0;
-        s0 = peg$f59();
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-
-    return s0;
-  }
-
-  function peg$parsepolicyName() {
-    var s0, s1, s2, s3;
-
-    s0 = peg$currPos;
-    s1 = input.substr(peg$currPos, 11);
-    if (s1.toLowerCase() === peg$c69) {
-      peg$currPos += 11;
-    } else {
-      s1 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$e74); }
-    }
-    if (s1 !== peg$FAILED) {
-      s2 = peg$currPos;
-      peg$silentFails++;
-      s3 = peg$parsewordBoundary();
-      peg$silentFails--;
-      if (s3 !== peg$FAILED) {
-        peg$currPos = s2;
-        s2 = undefined;
-      } else {
-        s2 = peg$FAILED;
-      }
-      if (s2 !== peg$FAILED) {
-        peg$savedPos = s0;
-        s0 = peg$f60();
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-
-    return s0;
-  }
-
-  function peg$parsewithdrawalId() {
-    var s0, s1, s2, s3;
-
-    s0 = peg$currPos;
-    s1 = input.substr(peg$currPos, 13);
-    if (s1.toLowerCase() === peg$c31) {
-      peg$currPos += 13;
-    } else {
-      s1 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$e36); }
-    }
-    if (s1 !== peg$FAILED) {
-      s2 = peg$currPos;
-      peg$silentFails++;
-      s3 = peg$parsewordBoundary();
-      peg$silentFails--;
-      if (s3 !== peg$FAILED) {
-        peg$currPos = s2;
-        s2 = undefined;
-      } else {
-        s2 = peg$FAILED;
-      }
-      if (s2 !== peg$FAILED) {
-        peg$savedPos = s0;
-        s0 = peg$f61();
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-
-    return s0;
-  }
-
-  function peg$parsebankAccount() {
-    var s0, s1, s2, s3;
-
-    s0 = peg$currPos;
-    s1 = input.substr(peg$currPos, 12);
-    if (s1.toLowerCase() === peg$c70) {
-      peg$currPos += 12;
-    } else {
-      s1 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$e75); }
-    }
-    if (s1 !== peg$FAILED) {
-      s2 = peg$currPos;
-      peg$silentFails++;
-      s3 = peg$parsewordBoundary();
-      peg$silentFails--;
-      if (s3 !== peg$FAILED) {
-        peg$currPos = s2;
-        s2 = undefined;
-      } else {
-        s2 = peg$FAILED;
-      }
-      if (s2 !== peg$FAILED) {
-        peg$savedPos = s0;
-        s0 = peg$f62();
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-
-    return s0;
-  }
-
-  function peg$parsereportId() {
-    var s0, s1, s2, s3;
-
-    s0 = peg$currPos;
-    s1 = input.substr(peg$currPos, 14);
-    if (s1.toLowerCase() === peg$c71) {
-      peg$currPos += 14;
-    } else {
-      s1 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$e76); }
-    }
-    if (s1 !== peg$FAILED) {
-      s2 = peg$currPos;
-      peg$silentFails++;
-      s3 = peg$parsewordBoundary();
-      peg$silentFails--;
-      if (s3 !== peg$FAILED) {
-        peg$currPos = s2;
-        s2 = undefined;
-      } else {
-        s2 = peg$FAILED;
-      }
-      if (s2 !== peg$FAILED) {
-        peg$savedPos = s0;
-        s0 = peg$f63();
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-
-    return s0;
-  }
-
-  function peg$parsebase62ReportId() {
-    var s0, s1, s2, s3;
-
-    s0 = peg$currPos;
-    s1 = input.substr(peg$currPos, 9);
-    if (s1.toLowerCase() === peg$c9) {
-      peg$currPos += 9;
-    } else {
-      s1 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$e14); }
-    }
-    if (s1 !== peg$FAILED) {
-      s2 = peg$currPos;
-      peg$silentFails++;
-      s3 = peg$parsewordBoundary();
-      peg$silentFails--;
-      if (s3 !== peg$FAILED) {
-        peg$currPos = s2;
-        s2 = undefined;
-      } else {
-        s2 = peg$FAILED;
-      }
-      if (s2 !== peg$FAILED) {
-        peg$savedPos = s0;
-        s0 = peg$f64();
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-
-    return s0;
-  }
-
-  function peg$parseexportedTo() {
-    var s0, s1, s2, s3;
-
-    s0 = peg$currPos;
-    s1 = input.substr(peg$currPos, 11);
-    if (s1.toLowerCase() === peg$c72) {
-      peg$currPos += 11;
-    } else {
-      s1 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$e77); }
-    }
-    if (s1 !== peg$FAILED) {
-      s2 = peg$currPos;
-      peg$silentFails++;
-      s3 = peg$parsewordBoundary();
-      peg$silentFails--;
-      if (s3 !== peg$FAILED) {
-        peg$currPos = s2;
-        s2 = undefined;
-      } else {
-        s2 = peg$FAILED;
-      }
-      if (s2 !== peg$FAILED) {
-        peg$savedPos = s0;
-        s0 = peg$f65();
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-
-    return s0;
-  }
-
-  function peg$parseexchangeRate() {
-    var s0, s1, s2, s3;
-
-    s0 = peg$currPos;
-    s1 = input.substr(peg$currPos, 13);
-    if (s1.toLowerCase() === peg$c73) {
-      peg$currPos += 13;
-    } else {
-      s1 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$e78); }
-    }
-    if (s1 !== peg$FAILED) {
-      s2 = peg$currPos;
-      peg$silentFails++;
-      s3 = peg$parsewordBoundary();
-      peg$silentFails--;
-      if (s3 !== peg$FAILED) {
-        peg$currPos = s2;
-        s2 = undefined;
-      } else {
-        s2 = peg$FAILED;
-      }
-      if (s2 !== peg$FAILED) {
-        peg$savedPos = s0;
-        s0 = peg$f66();
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-
-    return s0;
-  }
-
-  function peg$parsereimbursableTotal() {
-    var s0, s1, s2, s3;
-
-    s0 = peg$currPos;
-    s1 = input.substr(peg$currPos, 18);
-    if (s1.toLowerCase() === peg$c74) {
-      peg$currPos += 18;
-    } else {
-      s1 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$e79); }
-    }
-    if (s1 !== peg$FAILED) {
-      s2 = peg$currPos;
-      peg$silentFails++;
-      s3 = peg$parsewordBoundary();
-      peg$silentFails--;
-      if (s3 !== peg$FAILED) {
-        peg$currPos = s2;
-        s2 = undefined;
-      } else {
-        s2 = peg$FAILED;
-      }
-      if (s2 !== peg$FAILED) {
-        peg$savedPos = s0;
-        s0 = peg$f67();
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-
-    return s0;
-  }
-
-  function peg$parsenonReimbursableTotal() {
-    var s0, s1, s2, s3;
-
-    s0 = peg$currPos;
-    s1 = input.substr(peg$currPos, 22);
-    if (s1.toLowerCase() === peg$c75) {
-      peg$currPos += 22;
-    } else {
-      s1 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$e80); }
-    }
-    if (s1 !== peg$FAILED) {
-      s2 = peg$currPos;
-      peg$silentFails++;
-      s3 = peg$parsewordBoundary();
-      peg$silentFails--;
-      if (s3 !== peg$FAILED) {
-        peg$currPos = s2;
-        s2 = undefined;
-      } else {
-        s2 = peg$FAILED;
-      }
-      if (s2 !== peg$FAILED) {
-        peg$savedPos = s0;
-        s0 = peg$f68();
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-
-    return s0;
-  }
-
-  function peg$parsegroupFrom() {
-    var s0, s1, s2, s3;
-
-    s0 = peg$currPos;
-    s1 = input.substr(peg$currPos, 10);
-    if (s1.toLowerCase() === peg$c76) {
-      peg$currPos += 10;
-    } else {
-      s1 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$e81); }
-    }
-    if (s1 !== peg$FAILED) {
-      s2 = peg$currPos;
-      peg$silentFails++;
-      s3 = peg$parsewordBoundary();
-      peg$silentFails--;
-      if (s3 !== peg$FAILED) {
-        peg$currPos = s2;
-        s2 = undefined;
-      } else {
-        s2 = peg$FAILED;
-      }
-      if (s2 !== peg$FAILED) {
-        peg$savedPos = s0;
-        s0 = peg$f69();
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-
-    return s0;
-  }
-
-  function peg$parsegroupExpenses() {
-    var s0, s1, s2, s3;
-
-    s0 = peg$currPos;
-    s1 = input.substr(peg$currPos, 14);
-    if (s1.toLowerCase() === peg$c77) {
-      peg$currPos += 14;
-    } else {
-      s1 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$e82); }
-    }
-    if (s1 !== peg$FAILED) {
-      s2 = peg$currPos;
-      peg$silentFails++;
-      s3 = peg$parsewordBoundary();
-      peg$silentFails--;
-      if (s3 !== peg$FAILED) {
-        peg$currPos = s2;
-        s2 = undefined;
-      } else {
-        s2 = peg$FAILED;
-      }
-      if (s2 !== peg$FAILED) {
-        peg$savedPos = s0;
-        s0 = peg$f70();
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-
-    return s0;
-  }
-
-  function peg$parsegroupTotal() {
-    var s0, s1, s2, s3;
-
-    s0 = peg$currPos;
-    s1 = input.substr(peg$currPos, 11);
-    if (s1.toLowerCase() === peg$c78) {
-      peg$currPos += 11;
-    } else {
-      s1 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$e83); }
-    }
-    if (s1 !== peg$FAILED) {
-      s2 = peg$currPos;
-      peg$silentFails++;
-      s3 = peg$parsewordBoundary();
-      peg$silentFails--;
-      if (s3 !== peg$FAILED) {
-        peg$currPos = s2;
-        s2 = undefined;
-      } else {
-        s2 = peg$FAILED;
-      }
-      if (s2 !== peg$FAILED) {
-        peg$savedPos = s0;
-        s0 = peg$f71();
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-
-    return s0;
-  }
-
-  function peg$parsegroupCard() {
-    var s0, s1, s2, s3;
-
-    s0 = peg$currPos;
-    s1 = input.substr(peg$currPos, 10);
-    if (s1.toLowerCase() === peg$c79) {
-      peg$currPos += 10;
-    } else {
-      s1 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$e84); }
-    }
-    if (s1 !== peg$FAILED) {
-      s2 = peg$currPos;
-      peg$silentFails++;
-      s3 = peg$parsewordBoundary();
-      peg$silentFails--;
-      if (s3 !== peg$FAILED) {
-        peg$currPos = s2;
-        s2 = undefined;
-      } else {
-        s2 = peg$FAILED;
-      }
-      if (s2 !== peg$FAILED) {
-        peg$savedPos = s0;
-        s0 = peg$f72();
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-
-    return s0;
-  }
-
-  function peg$parsegroupFeed() {
-    var s0, s1, s2, s3;
-
-    s0 = peg$currPos;
-    s1 = input.substr(peg$currPos, 10);
-    if (s1.toLowerCase() === peg$c80) {
-      peg$currPos += 10;
-    } else {
-      s1 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$e85); }
-    }
-    if (s1 !== peg$FAILED) {
-      s2 = peg$currPos;
-      peg$silentFails++;
-      s3 = peg$parsewordBoundary();
-      peg$silentFails--;
-      if (s3 !== peg$FAILED) {
-        peg$currPos = s2;
-        s2 = undefined;
-      } else {
-        s2 = peg$FAILED;
-      }
-      if (s2 !== peg$FAILED) {
-        peg$savedPos = s0;
-        s0 = peg$f73();
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-
-    return s0;
-  }
-
-  function peg$parsegroupBankAccount() {
-    var s0, s1, s2, s3;
-
-    s0 = peg$currPos;
-    s1 = input.substr(peg$currPos, 18);
-    if (s1.toLowerCase() === peg$c81) {
-      peg$currPos += 18;
-    } else {
-      s1 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$e86); }
-    }
-    if (s1 !== peg$FAILED) {
-      s2 = peg$currPos;
-      peg$silentFails++;
-      s3 = peg$parsewordBoundary();
-      peg$silentFails--;
-      if (s3 !== peg$FAILED) {
-        peg$currPos = s2;
-        s2 = undefined;
-      } else {
-        s2 = peg$FAILED;
-      }
-      if (s2 !== peg$FAILED) {
-        peg$savedPos = s0;
-        s0 = peg$f74();
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-
-    return s0;
-  }
-
-  function peg$parsegroupWithdrawn() {
-    var s0, s1, s2, s3;
-
-    s0 = peg$currPos;
-    s1 = input.substr(peg$currPos, 15);
-    if (s1.toLowerCase() === peg$c82) {
-      peg$currPos += 15;
-    } else {
-      s1 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$e87); }
-    }
-    if (s1 !== peg$FAILED) {
-      s2 = peg$currPos;
-      peg$silentFails++;
-      s3 = peg$parsewordBoundary();
-      peg$silentFails--;
-      if (s3 !== peg$FAILED) {
-        peg$currPos = s2;
-        s2 = undefined;
-      } else {
-        s2 = peg$FAILED;
-      }
-      if (s2 !== peg$FAILED) {
-        peg$savedPos = s0;
-        s0 = peg$f75();
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-
-    return s0;
-  }
-
-  function peg$parsegroupWithdrawalId() {
-    var s0, s1, s2, s3;
-
-    s0 = peg$currPos;
-    s1 = input.substr(peg$currPos, 19);
-    if (s1.toLowerCase() === peg$c83) {
-      peg$currPos += 19;
-    } else {
-      s1 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$e88); }
-    }
-    if (s1 !== peg$FAILED) {
-      s2 = peg$currPos;
-      peg$silentFails++;
-      s3 = peg$parsewordBoundary();
-      peg$silentFails--;
-      if (s3 !== peg$FAILED) {
-        peg$currPos = s2;
-        s2 = undefined;
-      } else {
-        s2 = peg$FAILED;
-      }
-      if (s2 !== peg$FAILED) {
-        peg$savedPos = s0;
-        s0 = peg$f76();
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-
-    return s0;
-  }
-
-  function peg$parseoperator() {
-    var s0, s1;
-
-    peg$silentFails++;
-    s0 = peg$currPos;
-    s1 = input.charAt(peg$currPos);
-    if (peg$r2.test(s1)) {
-      peg$currPos++;
-    } else {
-      s1 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$e90); }
-    }
-    if (s1 !== peg$FAILED) {
-      peg$savedPos = s0;
-      s1 = peg$f77();
-    }
-    s0 = s1;
-    if (s0 === peg$FAILED) {
-      s0 = peg$currPos;
-      if (input.substr(peg$currPos, 2) === peg$c84) {
-        s1 = peg$c84;
-        peg$currPos += 2;
-      } else {
-        s1 = peg$FAILED;
-        if (peg$silentFails === 0) { peg$fail(peg$e91); }
-      }
-      if (s1 !== peg$FAILED) {
-        peg$savedPos = s0;
-        s1 = peg$f78();
-      }
-      s0 = s1;
-      if (s0 === peg$FAILED) {
-        s0 = peg$currPos;
-        if (input.substr(peg$currPos, 2) === peg$c85) {
-          s1 = peg$c85;
-          peg$currPos += 2;
-        } else {
-          s1 = peg$FAILED;
-          if (peg$silentFails === 0) { peg$fail(peg$e92); }
-        }
-        if (s1 !== peg$FAILED) {
-          peg$savedPos = s0;
-          s1 = peg$f79();
-        }
-        s0 = s1;
-        if (s0 === peg$FAILED) {
-          s0 = peg$currPos;
-          if (input.charCodeAt(peg$currPos) === 62) {
-            s1 = peg$c86;
-            peg$currPos++;
-          } else {
-            s1 = peg$FAILED;
-            if (peg$silentFails === 0) { peg$fail(peg$e93); }
-          }
-          if (s1 !== peg$FAILED) {
-            peg$savedPos = s0;
-            s1 = peg$f80();
-          }
-          s0 = s1;
-          if (s0 === peg$FAILED) {
-            s0 = peg$currPos;
-            if (input.substr(peg$currPos, 2) === peg$c87) {
-              s1 = peg$c87;
-              peg$currPos += 2;
-            } else {
-              s1 = peg$FAILED;
-              if (peg$silentFails === 0) { peg$fail(peg$e94); }
-            }
-            if (s1 !== peg$FAILED) {
-              peg$savedPos = s0;
-              s1 = peg$f81();
-            }
-            s0 = s1;
-            if (s0 === peg$FAILED) {
-              s0 = peg$currPos;
-              if (input.charCodeAt(peg$currPos) === 60) {
-                s1 = peg$c88;
-                peg$currPos++;
-              } else {
-                s1 = peg$FAILED;
-                if (peg$silentFails === 0) { peg$fail(peg$e95); }
-              }
-              if (s1 !== peg$FAILED) {
-                peg$savedPos = s0;
-                s1 = peg$f82();
-              }
-              s0 = s1;
-            }
-          }
-        }
-      }
-    }
-    peg$silentFails--;
-    if (s0 === peg$FAILED) {
-      s1 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$e89); }
-    }
-
-    return s0;
-  }
-
-  function peg$parsefilterOperator() {
-    var s0, s1;
-
-    s0 = peg$currPos;
-    s1 = peg$parseoperator();
-    if (s1 !== peg$FAILED) {
-      peg$savedPos = s0;
-      s1 = peg$f83(s1);
-    }
-    s0 = s1;
-
-    return s0;
-  }
-
-  function peg$parsealphanumeric() {
-    var s0, s1, s2;
-
-    peg$silentFails++;
-    s0 = peg$currPos;
-    s1 = [];
-    s2 = input.charAt(peg$currPos);
-    if (peg$r3.test(s2)) {
-      peg$currPos++;
-    } else {
-      s2 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$e97); }
-    }
-    if (s2 !== peg$FAILED) {
-      while (s2 !== peg$FAILED) {
-        s1.push(s2);
-        s2 = input.charAt(peg$currPos);
-        if (peg$r3.test(s2)) {
-          peg$currPos++;
-        } else {
-          s2 = peg$FAILED;
-          if (peg$silentFails === 0) { peg$fail(peg$e97); }
-        }
-      }
+    s1 = [];
+    s2 = input.charAt(peg$currPos);
+    if (peg$r3.test(s2)) {
+      peg$currPos++;
+    } else {
+      s2 = peg$FAILED;
+      if (peg$silentFails === 0) { peg$fail(peg$e81); }
+    }
+    if (s2 !== peg$FAILED) {
+      while (s2 !== peg$FAILED) {
+        s1.push(s2);
+        s2 = input.charAt(peg$currPos);
+        if (peg$r3.test(s2)) {
+          peg$currPos++;
+        } else {
+          s2 = peg$FAILED;
+          if (peg$silentFails === 0) { peg$fail(peg$e81); }
+        }
+      }
     } else {
       s1 = peg$FAILED;
     }
     if (s1 !== peg$FAILED) {
       peg$savedPos = s0;
-      s1 = peg$f84(s1);
+      s1 = peg$f63(s1);
     }
     s0 = s1;
     peg$silentFails--;
     if (s0 === peg$FAILED) {
       s1 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$e96); }
+      if (peg$silentFails === 0) { peg$fail(peg$e80); }
     }
 
     return s0;
@@ -3509,7 +2594,7 @@ function peg$parse(input, options) {
     s0 = peg$currPos;
     s1 = peg$parse_();
     peg$savedPos = s0;
-    s1 = peg$f85();
+    s1 = peg$f64();
     s0 = s1;
 
     return s0;
@@ -3525,7 +2610,7 @@ function peg$parse(input, options) {
       peg$currPos++;
     } else {
       s1 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$e99); }
+      if (peg$silentFails === 0) { peg$fail(peg$e83); }
     }
     while (s1 !== peg$FAILED) {
       s0.push(s1);
@@ -3534,12 +2619,12 @@ function peg$parse(input, options) {
         peg$currPos++;
       } else {
         s1 = peg$FAILED;
-        if (peg$silentFails === 0) { peg$fail(peg$e99); }
+        if (peg$silentFails === 0) { peg$fail(peg$e83); }
       }
     }
     peg$silentFails--;
     s1 = peg$FAILED;
-    if (peg$silentFails === 0) { peg$fail(peg$e98); }
+    if (peg$silentFails === 0) { peg$fail(peg$e82); }
 
     return s0;
   }
@@ -3549,7 +2634,7 @@ function peg$parse(input, options) {
 
     s0 = peg$currPos;
     peg$savedPos = peg$currPos;
-    s1 = peg$f86();
+    s1 = peg$f65();
     if (s1) {
       s1 = undefined;
     } else {
@@ -3586,7 +2671,7 @@ function peg$parse(input, options) {
       peg$currPos++;
     } else {
       s2 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$e101); }
+      if (peg$silentFails === 0) { peg$fail(peg$e85); }
     }
     while (s2 !== peg$FAILED) {
       s1.push(s2);
@@ -3595,7 +2680,7 @@ function peg$parse(input, options) {
         peg$currPos++;
       } else {
         s2 = peg$FAILED;
-        if (peg$silentFails === 0) { peg$fail(peg$e101); }
+        if (peg$silentFails === 0) { peg$fail(peg$e85); }
       }
     }
     s2 = input.charAt(peg$currPos);
@@ -3603,7 +2688,7 @@ function peg$parse(input, options) {
       peg$currPos++;
     } else {
       s2 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$e102); }
+      if (peg$silentFails === 0) { peg$fail(peg$e86); }
     }
     if (s2 !== peg$FAILED) {
       s3 = [];
@@ -3612,7 +2697,7 @@ function peg$parse(input, options) {
         peg$currPos++;
       } else {
         s4 = peg$FAILED;
-        if (peg$silentFails === 0) { peg$fail(peg$e103); }
+        if (peg$silentFails === 0) { peg$fail(peg$e87); }
       }
       while (s4 !== peg$FAILED) {
         s3.push(s4);
@@ -3621,7 +2706,7 @@ function peg$parse(input, options) {
           peg$currPos++;
         } else {
           s4 = peg$FAILED;
-          if (peg$silentFails === 0) { peg$fail(peg$e103); }
+          if (peg$silentFails === 0) { peg$fail(peg$e87); }
         }
       }
       s4 = input.charAt(peg$currPos);
@@ -3629,7 +2714,7 @@ function peg$parse(input, options) {
         peg$currPos++;
       } else {
         s4 = peg$FAILED;
-        if (peg$silentFails === 0) { peg$fail(peg$e102); }
+        if (peg$silentFails === 0) { peg$fail(peg$e86); }
       }
       if (s4 !== peg$FAILED) {
         s5 = [];
@@ -3638,7 +2723,7 @@ function peg$parse(input, options) {
           peg$currPos++;
         } else {
           s6 = peg$FAILED;
-          if (peg$silentFails === 0) { peg$fail(peg$e97); }
+          if (peg$silentFails === 0) { peg$fail(peg$e81); }
         }
         while (s6 !== peg$FAILED) {
           s5.push(s6);
@@ -3647,11 +2732,11 @@ function peg$parse(input, options) {
             peg$currPos++;
           } else {
             s6 = peg$FAILED;
-            if (peg$silentFails === 0) { peg$fail(peg$e97); }
+            if (peg$silentFails === 0) { peg$fail(peg$e81); }
           }
         }
         peg$savedPos = s0;
-        s0 = peg$f87(s1, s3, s5);
+        s0 = peg$f66(s1, s3, s5);
       } else {
         peg$currPos = s0;
         s0 = peg$FAILED;
@@ -3663,7 +2748,7 @@ function peg$parse(input, options) {
     peg$silentFails--;
     if (s0 === peg$FAILED) {
       s1 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$e100); }
+      if (peg$silentFails === 0) { peg$fail(peg$e84); }
     }
 
     return s0;
@@ -3680,7 +2765,7 @@ function peg$parse(input, options) {
       peg$currPos++;
     } else {
       s2 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$e101); }
+      if (peg$silentFails === 0) { peg$fail(peg$e85); }
     }
     while (s2 !== peg$FAILED) {
       s1.push(s2);
@@ -3689,7 +2774,7 @@ function peg$parse(input, options) {
         peg$currPos++;
       } else {
         s2 = peg$FAILED;
-        if (peg$silentFails === 0) { peg$fail(peg$e101); }
+        if (peg$silentFails === 0) { peg$fail(peg$e85); }
       }
     }
     s2 = input.charAt(peg$currPos);
@@ -3697,7 +2782,7 @@ function peg$parse(input, options) {
       peg$currPos++;
     } else {
       s2 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$e102); }
+      if (peg$silentFails === 0) { peg$fail(peg$e86); }
     }
     if (s2 !== peg$FAILED) {
       s3 = [];
@@ -3706,7 +2791,7 @@ function peg$parse(input, options) {
         peg$currPos++;
       } else {
         s4 = peg$FAILED;
-        if (peg$silentFails === 0) { peg$fail(peg$e103); }
+        if (peg$silentFails === 0) { peg$fail(peg$e87); }
       }
       if (s4 === peg$FAILED) {
         s4 = peg$currPos;
@@ -3722,15 +2807,15 @@ function peg$parse(input, options) {
         }
         if (s5 !== peg$FAILED) {
           if (input.charCodeAt(peg$currPos) === 8220) {
-            s6 = peg$c89;
+            s6 = peg$c73;
             peg$currPos++;
           } else {
             s6 = peg$FAILED;
-            if (peg$silentFails === 0) { peg$fail(peg$e104); }
+            if (peg$silentFails === 0) { peg$fail(peg$e88); }
           }
           if (s6 !== peg$FAILED) {
             peg$savedPos = s4;
-            s4 = peg$f88(s1);
+            s4 = peg$f67(s1);
           } else {
             peg$currPos = s4;
             s4 = peg$FAILED;
@@ -3753,15 +2838,15 @@ function peg$parse(input, options) {
           }
           if (s5 !== peg$FAILED) {
             if (input.charCodeAt(peg$currPos) === 8221) {
-              s6 = peg$c90;
+              s6 = peg$c74;
               peg$currPos++;
             } else {
               s6 = peg$FAILED;
-              if (peg$silentFails === 0) { peg$fail(peg$e105); }
+              if (peg$silentFails === 0) { peg$fail(peg$e89); }
             }
             if (s6 !== peg$FAILED) {
               peg$savedPos = s4;
-              s4 = peg$f89(s1);
+              s4 = peg$f68(s1);
             } else {
               peg$currPos = s4;
               s4 = peg$FAILED;
@@ -3784,15 +2869,15 @@ function peg$parse(input, options) {
             }
             if (s5 !== peg$FAILED) {
               if (input.charCodeAt(peg$currPos) === 34) {
-                s6 = peg$c91;
+                s6 = peg$c75;
                 peg$currPos++;
               } else {
                 s6 = peg$FAILED;
-                if (peg$silentFails === 0) { peg$fail(peg$e106); }
+                if (peg$silentFails === 0) { peg$fail(peg$e90); }
               }
               if (s6 !== peg$FAILED) {
                 peg$savedPos = s4;
-                s4 = peg$f90(s1);
+                s4 = peg$f69(s1);
               } else {
                 peg$currPos = s4;
                 s4 = peg$FAILED;
@@ -3811,7 +2896,7 @@ function peg$parse(input, options) {
           peg$currPos++;
         } else {
           s4 = peg$FAILED;
-          if (peg$silentFails === 0) { peg$fail(peg$e103); }
+          if (peg$silentFails === 0) { peg$fail(peg$e87); }
         }
         if (s4 === peg$FAILED) {
           s4 = peg$currPos;
@@ -3827,15 +2912,15 @@ function peg$parse(input, options) {
           }
           if (s5 !== peg$FAILED) {
             if (input.charCodeAt(peg$currPos) === 8220) {
-              s6 = peg$c89;
+              s6 = peg$c73;
               peg$currPos++;
             } else {
               s6 = peg$FAILED;
-              if (peg$silentFails === 0) { peg$fail(peg$e104); }
+              if (peg$silentFails === 0) { peg$fail(peg$e88); }
             }
             if (s6 !== peg$FAILED) {
               peg$savedPos = s4;
-              s4 = peg$f88(s1);
+              s4 = peg$f67(s1);
             } else {
               peg$currPos = s4;
               s4 = peg$FAILED;
@@ -3858,15 +2943,15 @@ function peg$parse(input, options) {
             }
             if (s5 !== peg$FAILED) {
               if (input.charCodeAt(peg$currPos) === 8221) {
-                s6 = peg$c90;
+                s6 = peg$c74;
                 peg$currPos++;
               } else {
                 s6 = peg$FAILED;
-                if (peg$silentFails === 0) { peg$fail(peg$e105); }
+                if (peg$silentFails === 0) { peg$fail(peg$e89); }
               }
               if (s6 !== peg$FAILED) {
                 peg$savedPos = s4;
-                s4 = peg$f89(s1);
+                s4 = peg$f68(s1);
               } else {
                 peg$currPos = s4;
                 s4 = peg$FAILED;
@@ -3889,15 +2974,15 @@ function peg$parse(input, options) {
               }
               if (s5 !== peg$FAILED) {
                 if (input.charCodeAt(peg$currPos) === 34) {
-                  s6 = peg$c91;
+                  s6 = peg$c75;
                   peg$currPos++;
                 } else {
                   s6 = peg$FAILED;
-                  if (peg$silentFails === 0) { peg$fail(peg$e106); }
+                  if (peg$silentFails === 0) { peg$fail(peg$e90); }
                 }
                 if (s6 !== peg$FAILED) {
                   peg$savedPos = s4;
-                  s4 = peg$f90(s1);
+                  s4 = peg$f69(s1);
                 } else {
                   peg$currPos = s4;
                   s4 = peg$FAILED;
@@ -3913,7 +2998,7 @@ function peg$parse(input, options) {
       s4 = peg$parseclosingQuote();
       if (s4 !== peg$FAILED) {
         peg$savedPos = s0;
-        s0 = peg$f91(s1, s3, s4);
+        s0 = peg$f70(s1, s3, s4);
       } else {
         peg$currPos = s0;
         s0 = peg$FAILED;
@@ -3925,7 +3010,7 @@ function peg$parse(input, options) {
     peg$silentFails--;
     if (s0 === peg$FAILED) {
       s1 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$e100); }
+      if (peg$silentFails === 0) { peg$fail(peg$e84); }
     }
 
     return s0;
@@ -3940,7 +3025,7 @@ function peg$parse(input, options) {
       peg$currPos++;
     } else {
       s1 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$e102); }
+      if (peg$silentFails === 0) { peg$fail(peg$e86); }
     }
     if (s1 !== peg$FAILED) {
       s2 = peg$currPos;
@@ -3978,7 +3063,7 @@ function peg$parse(input, options) {
       peg$currPos++;
     } else {
       s2 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$e107); }
+      if (peg$silentFails === 0) { peg$fail(peg$e91); }
     }
     while (s2 !== peg$FAILED) {
       s1.push(s2);
@@ -3987,7 +3072,7 @@ function peg$parse(input, options) {
         peg$currPos++;
       } else {
         s2 = peg$FAILED;
-        if (peg$silentFails === 0) { peg$fail(peg$e107); }
+        if (peg$silentFails === 0) { peg$fail(peg$e91); }
       }
     }
     s2 = [];
@@ -3996,7 +3081,7 @@ function peg$parse(input, options) {
       peg$currPos++;
     } else {
       s3 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$e108); }
+      if (peg$silentFails === 0) { peg$fail(peg$e92); }
     }
     while (s3 !== peg$FAILED) {
       s2.push(s3);
@@ -4005,7 +3090,7 @@ function peg$parse(input, options) {
         peg$currPos++;
       } else {
         s3 = peg$FAILED;
-        if (peg$silentFails === 0) { peg$fail(peg$e108); }
+        if (peg$silentFails === 0) { peg$fail(peg$e92); }
       }
     }
     s3 = [];
@@ -4014,7 +3099,7 @@ function peg$parse(input, options) {
       peg$currPos++;
     } else {
       s4 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$e109); }
+      if (peg$silentFails === 0) { peg$fail(peg$e93); }
     }
     while (s4 !== peg$FAILED) {
       s3.push(s4);
@@ -4023,7 +3108,7 @@ function peg$parse(input, options) {
         peg$currPos++;
       } else {
         s4 = peg$FAILED;
-        if (peg$silentFails === 0) { peg$fail(peg$e109); }
+        if (peg$silentFails === 0) { peg$fail(peg$e93); }
       }
     }
     s4 = peg$parseoperator();
@@ -4042,7 +3127,7 @@ function peg$parse(input, options) {
         peg$currPos++;
       } else {
         s2 = peg$FAILED;
-        if (peg$silentFails === 0) { peg$fail(peg$e110); }
+        if (peg$silentFails === 0) { peg$fail(peg$e94); }
       }
       while (s2 !== peg$FAILED) {
         s1.push(s2);
@@ -4051,7 +3136,7 @@ function peg$parse(input, options) {
           peg$currPos++;
         } else {
           s2 = peg$FAILED;
-          if (peg$silentFails === 0) { peg$fail(peg$e110); }
+          if (peg$silentFails === 0) { peg$fail(peg$e94); }
         }
       }
       s2 = peg$currPos;
@@ -4098,7 +3183,7 @@ function peg$parse(input, options) {
           peg$currPos++;
         } else {
           s0 = peg$FAILED;
-          if (peg$silentFails === 0) { peg$fail(peg$e111); }
+          if (peg$silentFails === 0) { peg$fail(peg$e95); }
         }
       }
     }
@@ -4106,38 +3191,6 @@ function peg$parse(input, options) {
     return s0;
   }
 
-  function peg$parsewordBoundary() {
-    var s0, s1;
-
-    s0 = input.charAt(peg$currPos);
-    if (peg$r13.test(s0)) {
-      peg$currPos++;
-    } else {
-      s0 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$e112); }
-    }
-    if (s0 === peg$FAILED) {
-      s0 = peg$currPos;
-      peg$silentFails++;
-      if (input.length > peg$currPos) {
-        s1 = input.charAt(peg$currPos);
-        peg$currPos++;
-      } else {
-        s1 = peg$FAILED;
-        if (peg$silentFails === 0) { peg$fail(peg$e5); }
-      }
-      peg$silentFails--;
-      if (s1 === peg$FAILED) {
-        s0 = undefined;
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    }
-
-    return s0;
-  }
-
   
   const GROUP_BY_DEFAULT_SORT = {
     from: "from",
@@ -4241,7 +3294,6 @@ function peg$parse(input, options) {
  
   let nameOperator = false;
   let expectingNestedQuote = false;
-  let isColumnsContext = false;
 
   peg$result = peg$startRuleFunction();
 
diff --git a/src/libs/SearchQueryUtils.ts b/src/libs/SearchQueryUtils.ts
index 423ac9c35bfa..d9242bb1d300 100644
--- a/src/libs/SearchQueryUtils.ts
+++ b/src/libs/SearchQueryUtils.ts
@@ -35,8 +35,6 @@ import arraysEqual from '@src/utils/arraysEqual';
 import {getCardFeedsForDisplay} from './CardFeedUtils';
 import {getCardDescription} from './CardUtils';
 import {convertToBackendAmount, convertToFrontendAmountAsInteger} from './CurrencyUtils';
-// eslint-disable-next-line @typescript-eslint/no-deprecated
-import {translateLocal} from './Localize';
 import Log from './Log';
 import {validateAmount} from './MoneyRequestUtils';
 import {getPreservedNavigatorState} from './Navigation/AppNavigator/createSplitNavigator/usePreserveNavigatorState';
@@ -340,10 +338,6 @@ function getQueryHashes(query: SearchQueryJSON): {primaryHash: number; recentSea
     orderedQuery += ` ${CONST.SEARCH.SYNTAX_ROOT_KEYS.STATUS}:${Array.isArray(query.status) ? query.status.join(',') : query.status}`;
     orderedQuery += ` ${CONST.SEARCH.SYNTAX_ROOT_KEYS.GROUP_BY}:${query.groupBy}`;
 
-    if (query.policyID) {
-        orderedQuery += ` ${CONST.SEARCH.SYNTAX_FILTER_KEYS.POLICY_ID}:${Array.isArray(query.policyID) ? query.policyID.join(',') : query.policyID} `;
-    }
-
     const filterSet = new Set<string>(orderedQuery);
 
     // Certain filters shouldn't affect whether two searchers are similar or not, since they dont
@@ -382,6 +376,9 @@ function getQueryHashes(query: SearchQueryJSON): {primaryHash: number; recentSea
     orderedQuery += ` ${CONST.SEARCH.SYNTAX_ROOT_KEYS.SORT_ORDER}:${query.sortOrder}`;
     orderedQuery += ` ${CONST.SEARCH.SYNTAX_ROOT_KEYS.COLUMNS}:${Array.isArray(query.columns) ? query.columns.join(',') : query.columns}`;
 
+    if (query.policyID) {
+        orderedQuery += ` ${CONST.SEARCH.SYNTAX_FILTER_KEYS.POLICY_ID}:${Array.isArray(query.policyID) ? query.policyID.join(',') : query.policyID} `;
+    }
     const primaryHash = hashText(orderedQuery, 2 ** 32);
 
     return {primaryHash, recentSearchHash, similarSearchHash};
@@ -1040,8 +1037,7 @@ function getFilterDisplayValue(
         if (Number.isNaN(cardID)) {
             return filterValue;
         }
-        // eslint-disable-next-line @typescript-eslint/no-deprecated
-        return getCardDescription(cardList?.[cardID], translateLocal) || filterValue;
+        return getCardDescription(cardList?.[cardID]) || filterValue;
     }
     if (filterName === CONST.SEARCH.SYNTAX_FILTER_KEYS.IN) {
         // eslint-disable-next-line @typescript-eslint/no-deprecated
@@ -1124,8 +1120,7 @@ function getDisplayQueryFiltersForKey(
                 if (Number.isNaN(cardID)) {
                     acc.push({operator: filter.operator, value: cardID});
                 } else {
-                    // eslint-disable-next-line @typescript-eslint/no-deprecated
-                    acc.push({operator: filter.operator, value: getCardDescription(cardList?.[cardID], translateLocal) || cardID});
+                    acc.push({operator: filter.operator, value: getCardDescription(cardList?.[cardID]) || cardID});
                 }
             }
             return acc;
@@ -1208,7 +1203,7 @@ function buildUserReadableQueryString(
     currentUserAccountID: number,
     autoCompleteWithSpace = false,
 ) {
-    const {type, status, groupBy, columns, policyID, rawFilterList, flatFilters: filters = []} = queryJSON;
+    const {type, status, groupBy, policyID, rawFilterList, flatFilters: filters = []} = queryJSON;
 
     if (rawFilterList && rawFilterList.length > 0) {
         const segments: string[] = [];
@@ -1218,6 +1213,10 @@ function buildUserReadableQueryString(
                 continue;
             }
 
+            if (rawFilter.key === CONST.SEARCH.SYNTAX_ROOT_KEYS.COLUMNS) {
+                continue;
+            }
+
             if (rawFilter.isDefault) {
                 const defaultSegment = formatDefaultRawFilterSegment(rawFilter, policies, reports);
                 if (defaultSegment) {
@@ -1269,11 +1268,6 @@ function buildUserReadableQueryString(
         title += ` workspace:${policyID.map((id) => sanitizeSearchValue(getPolicyNameWithFallback(id, policies, reports))).join(',')}`;
     }
 
-    if (columns && columns.length > 0) {
-        const columnValue = Array.isArray(columns) ? columns.map((column) => getUserFriendlyValue(column)).join(',') : getUserFriendlyValue(columns);
-        title += ` columns:${columnValue}`;
-    }
-
     for (const filterObject of filters) {
         const key = filterObject.key;
         const displayQueryFilters = getDisplayQueryFiltersForKey(key, filterObject.filters, PersonalDetails, reports, taxRates, cardList, cardFeeds, policies, currentUserAccountID);
@@ -1335,7 +1329,7 @@ function buildCannedSearchQuery({
  * For example: "type:trip" is a canned query.
  */
 function isCannedSearchQuery(queryJSON: SearchQueryJSON) {
-    const selectedColumns = [queryJSON.columns ?? []].flat();
+    const selectedColumns = queryJSON.columns ?? [];
     const defaultColumns = Object.values(CONST.SEARCH.TYPE_DEFAULT_COLUMNS.EXPENSE_REPORT);
     const hasCustomColumns = !arraysEqual(defaultColumns, selectedColumns) && selectedColumns.length > 0;
     return !queryJSON.filters && !queryJSON.policyID && !queryJSON.status && !hasCustomColumns;
diff --git a/src/libs/SearchUIUtils.ts b/src/libs/SearchUIUtils.ts
index 48fd655f77f2..270afceb7406 100644
--- a/src/libs/SearchUIUtils.ts
+++ b/src/libs/SearchUIUtils.ts
@@ -1,7 +1,6 @@
 import type {TextStyle, ViewStyle} from 'react-native';
 import type {OnyxCollection, OnyxEntry} from 'react-native-onyx';
 import type {ValueOf} from 'type-fest';
-import type {CurrencyListContextProps} from '@components/CurrencyListContextProvider';
 import type {ExpensifyIconName} from '@components/Icon/ExpensifyIconLoader';
 import type {LocaleContextProps, LocalizedTranslate} from '@components/LocaleContextProvider';
 import type {MenuItemWithLink} from '@components/MenuItemList';
@@ -69,7 +68,7 @@ import {setOptimisticDataForTransactionThreadPreview} from './actions/Search';
 import type {CardFeedForDisplay} from './CardFeedUtils';
 import {getCardFeedsForDisplay} from './CardFeedUtils';
 import {getCardDescription, getCustomOrFormattedFeedName} from './CardUtils';
-import {convertToDisplayString} from './CurrencyUtils';
+import {convertToDisplayString, getCurrencySymbol} from './CurrencyUtils';
 import DateUtils from './DateUtils';
 import interceptAnonymousUser from './interceptAnonymousUser';
 import Navigation from './Navigation/Navigation';
@@ -83,9 +82,9 @@ import {
     isDeletedAction,
     isHoldAction,
     isMoneyRequestAction,
-    isReportActionVisible,
     isResolvedActionableWhisper,
     isWhisperActionTargetedToOthers,
+    shouldReportActionBeVisible,
 } from './ReportActionsUtils';
 import {isExportAction} from './ReportPrimaryActionUtils';
 import {
@@ -148,7 +147,6 @@ type TransactionWithdrawalIDGroupSorting = ColumnSortMapping<TransactionWithdraw
 
 type GetReportSectionsParams = {
     data: OnyxTypes.SearchResults['data'];
-    policies: OnyxCollection<OnyxTypes.Policy>;
     currentSearch: SearchKey;
     currentAccountID: number | undefined;
     currentUserEmail: string;
@@ -158,6 +156,7 @@ type GetReportSectionsParams = {
     allTransactionViolations: OnyxCollection<OnyxTypes.TransactionViolation[]>;
     bankAccountList: OnyxEntry<OnyxTypes.BankAccountList>;
     reportActions?: Record<string, OnyxTypes.ReportAction[]>;
+    shouldSkipActionFiltering?: boolean;
 };
 
 const transactionColumnNamesToSortingProperty: TransactionSorting = {
@@ -244,10 +243,21 @@ const expenseStatusActionMapping = {
     [CONST.SEARCH.STATUS.EXPENSE.ALL]: () => true,
 };
 
+const actionFilterMapping = {
+    [CONST.SEARCH.ACTION_FILTERS.SUBMIT]: expenseStatusActionMapping[CONST.SEARCH.STATUS.EXPENSE.DRAFTS],
+    [CONST.SEARCH.ACTION_FILTERS.APPROVE]: expenseStatusActionMapping[CONST.SEARCH.STATUS.EXPENSE.OUTSTANDING],
+    [CONST.SEARCH.ACTION_FILTERS.PAY]: expenseStatusActionMapping[CONST.SEARCH.STATUS.EXPENSE.APPROVED],
+    [CONST.SEARCH.ACTION_FILTERS.EXPORT]: () => true,
+};
+
 function isValidExpenseStatus(status: unknown): status is ValueOf<typeof CONST.SEARCH.STATUS.EXPENSE> {
     return typeof status === 'string' && status in expenseStatusActionMapping;
 }
 
+function isValidActionFilter(action: unknown): action is ValueOf<typeof CONST.SEARCH.ACTION_FILTERS> {
+    return typeof action === 'string' && action in actionFilterMapping;
+}
+
 function getExpenseStatusOptions(translate: LocalizedTranslate): Array<MultiSelectItem<SingularSearchStatus>> {
     return [
         {text: translate('common.unreported'), value: CONST.SEARCH.STATUS.EXPENSE.UNREPORTED},
@@ -354,7 +364,6 @@ type ArchivedReportsIDSet = ReadonlySet<string>;
 type GetSectionsParams = {
     type: SearchDataTypes;
     data: OnyxTypes.SearchResults['data'];
-    policies?: OnyxCollection<OnyxTypes.Policy>;
     currentAccountID: number | undefined;
     currentUserEmail: string;
     translate: LocalizedTranslate;
@@ -368,7 +377,7 @@ type GetSectionsParams = {
     isActionLoadingSet?: ReadonlySet<string>;
     cardFeeds?: OnyxCollection<OnyxTypes.CardFeeds>;
     allTransactionViolations?: OnyxCollection<OnyxTypes.TransactionViolation[]>;
-    visibleReportActionsData?: OnyxTypes.VisibleReportActionsDerivedValue;
+    shouldSkipActionFiltering?: boolean;
 };
 
 /**
@@ -759,7 +768,7 @@ function getTransactionItemCommonFormattedProperties(
     const formattedTotal = getTransactionAmount(transactionItem, isExpenseReport);
     const date = transactionItem?.modifiedCreated ? transactionItem.modifiedCreated : transactionItem?.created;
     const merchant = getTransactionMerchant(transactionItem, policy);
-    const formattedMerchant = merchant === CONST.TRANSACTION.PARTIAL_TRANSACTION_MERCHANT || merchant === CONST.TRANSACTION.DEFAULT_MERCHANT ? '' : merchant;
+    const formattedMerchant = merchant === CONST.TRANSACTION.PARTIAL_TRANSACTION_MERCHANT ? '' : merchant;
     const submitted = report?.submitted;
     const approved = report?.approved;
 
@@ -825,7 +834,7 @@ function getShouldShowMerchant(data: OnyxTypes.SearchResults['data']): boolean {
         if (isTransactionEntry(key)) {
             const item = data[key];
             const merchant = item.modifiedMerchant ? item.modifiedMerchant : (item.merchant ?? '');
-            return merchant !== '' && merchant !== CONST.TRANSACTION.PARTIAL_TRANSACTION_MERCHANT && merchant !== CONST.TRANSACTION.DEFAULT_MERCHANT;
+            return merchant !== '' && merchant !== CONST.TRANSACTION.PARTIAL_TRANSACTION_MERCHANT;
         }
         return false;
     });
@@ -895,7 +904,7 @@ function isAmountTooLong(amount: number, maxLength = 8): boolean {
 
 function isTransactionAmountTooLong(transactionItem: TransactionListItemType | OnyxTypes.Transaction) {
     // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
-    const amount = Math.abs(Number(transactionItem.modifiedAmount) || transactionItem.amount);
+    const amount = Math.abs(transactionItem.modifiedAmount || transactionItem.amount);
     return isAmountTooLong(amount);
 }
 
@@ -1623,14 +1632,9 @@ function createAndOpenSearchTransactionThread(
         // For legacy transactions without an IOU action in the backend, pass transaction data
         // This allows OpenReport to create the IOU action and transaction thread on the backend
         const reportActionID = moneyRequestReportActionID ?? iouReportAction?.reportActionID;
-        // Pass transaction data when there's no reportActionID OR when the item is from self DM
-        // (unreported transactions have a valid reportActionID but still need transaction data for proper detection)
-        const shouldPassTransactionData = !reportActionID || isFromSelfDM;
-        const transaction = shouldPassTransactionData ? getTransactionFromTransactionListItem(item) : undefined;
-        const transactionViolations = shouldPassTransactionData ? item.violations : undefined;
-        // Use the full reportAction to preserve originalMessage.type (e.g., "track") for proper expense type detection
-        const reportActionToPass = iouReportAction ?? item.reportAction ?? ({reportActionID} as OnyxTypes.ReportAction);
-        transactionThreadReport = createTransactionThreadReport(item.report, reportActionToPass, transaction, transactionViolations);
+        const transaction = !reportActionID ? getTransactionFromTransactionListItem(item) : undefined;
+        const transactionViolations = !reportActionID ? item.violations : undefined;
+        transactionThreadReport = createTransactionThreadReport(item.report, {reportActionID} as OnyxTypes.ReportAction, transaction, transactionViolations);
     }
 
     if (shouldNavigate) {
@@ -1639,7 +1643,7 @@ function createAndOpenSearchTransactionThread(
         const shouldNavigateToTransactionThread = (!isFromOneTransactionReport || isFromSelfDM) && transactionThreadReport?.reportID !== CONST.REPORT.UNREPORTED_REPORT_ID;
         const targetReportID = shouldNavigateToTransactionThread ? transactionThreadReport?.reportID : item.reportID;
 
-        Navigation.setNavigationActionToMicrotaskQueue(() => Navigation.navigate(ROUTES.SEARCH_REPORT.getRoute({reportID: targetReportID, backTo})));
+        Navigation.navigate(ROUTES.SEARCH_REPORT.getRoute({reportID: targetReportID, backTo}));
     }
 }
 
@@ -1649,7 +1653,7 @@ function createAndOpenSearchTransactionThread(
  *
  * Do not use directly, use only via `getSections()` facade.
  */
-function getReportActionsSections(data: OnyxTypes.SearchResults['data'], visibleReportActionsData?: OnyxTypes.VisibleReportActionsDerivedValue): [ReportActionListItemType[], number] {
+function getReportActionsSections(data: OnyxTypes.SearchResults['data']): [ReportActionListItemType[], number] {
     const reportActionItems: ReportActionListItemType[] = [];
 
     const transactions = Object.keys(data)
@@ -1679,10 +1683,8 @@ function getReportActionsSections(data: OnyxTypes.SearchResults['data'], visible
                 const isReportArchived = isArchivedReport(data[`${ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS}${report.reportID}`]);
                 const invoiceReceiverPolicy: OnyxTypes.Policy | undefined =
                     report?.invoiceReceiver?.type === CONST.REPORT.INVOICE_RECEIVER_TYPE.BUSINESS ? data[`${ONYXKEYS.COLLECTION.POLICY}${report.invoiceReceiver.policyID}`] : undefined;
-                const reportID = reportAction.reportID;
                 if (
-                    !reportID ||
-                    !isReportActionVisible(reportAction, reportID, canUserPerformWriteAction(report, isReportArchived), visibleReportActionsData) ||
+                    !shouldReportActionBeVisible(reportAction, reportAction.reportActionID, canUserPerformWriteAction(report, isReportArchived)) ||
                     isDeletedAction(reportAction) ||
                     isResolvedActionableWhisper(reportAction) ||
                     reportAction.actionName === CONST.REPORT.ACTIONS.TYPE.CLOSED ||
@@ -1716,7 +1718,6 @@ function getReportActionsSections(data: OnyxTypes.SearchResults['data'], visible
  */
 function getReportSections({
     data,
-    policies,
     currentSearch,
     currentAccountID,
     currentUserEmail,
@@ -1726,6 +1727,7 @@ function getReportSections({
     allTransactionViolations,
     bankAccountList,
     reportActions = {},
+    shouldSkipActionFiltering = false,
 }: GetReportSectionsParams): [TransactionGroupListItemType[], number] {
     const shouldShowMerchant = getShouldShowMerchant(data);
 
@@ -1790,6 +1792,11 @@ function getReportSections({
                         shouldShow = isValidExpenseStatus(status) ? expenseStatusActionMapping[status](reportItem) : false;
                     }
                 }
+                const actionFromQuery = queryJSON?.flatFilters?.find((filter) => filter.key === CONST.SEARCH.SYNTAX_FILTER_KEYS.ACTION)?.filters?.at(0)?.value;
+
+                if (!shouldSkipActionFiltering && actionFromQuery && isValidActionFilter(actionFromQuery)) {
+                    shouldShow = shouldShow && actionFilterMapping[actionFromQuery](reportItem);
+                }
             }
 
             if (shouldShow) {
@@ -1809,8 +1816,7 @@ function getReportSections({
                 const formattedStatus = getReportStatusTranslation({stateNum: reportItem.stateNum, statusNum: reportItem.statusNum, translate});
 
                 const allReportTransactions = getTransactionsForReport(data, reportItem.reportID);
-                const policyFromKey = getPolicyFromKey(data, reportItem);
-                const policy = policies?.[`${ONYXKEYS.COLLECTION.POLICY}${reportItem?.policyID ?? String(CONST.DEFAULT_NUMBER_ID)}`] ?? policyFromKey;
+                const policy = getPolicyFromKey(data, reportItem);
 
                 const hasAnyViolationsForReport = hasAnyViolations(
                     reportItem.reportID,
@@ -1972,7 +1978,6 @@ function getMemberSections(
 function getCardSections(
     data: OnyxTypes.SearchResults['data'],
     queryJSON: SearchQueryJSON | undefined,
-    translate: LocalizedTranslate,
     cardFeeds?: OnyxCollection<OnyxTypes.CardFeeds>,
 ): [TransactionCardGroupListItemType[], number] {
     const cardSections: Record<string, TransactionCardGroupListItemType> = {};
@@ -2012,16 +2017,13 @@ function getCardSections(
                 transactionsQueryJSON,
                 ...personalDetails,
                 ...cardGroup,
-                formattedCardName: getCardDescription(
-                    {
-                        cardID: cardGroup.cardID,
-                        bank: cardGroup.bank,
-                        cardName: cardGroup.cardName,
-                        lastFourPAN: cardGroup.lastFourPAN,
-                    } as OnyxTypes.Card,
-                    translate,
-                ),
-                formattedFeedName: getCustomOrFormattedFeedName(translate, cardGroup.bank as OnyxTypes.CompanyCardFeed, customFeedName) ?? '',
+                formattedCardName: getCardDescription({
+                    cardID: cardGroup.cardID,
+                    bank: cardGroup.bank,
+                    cardName: cardGroup.cardName,
+                    lastFourPAN: cardGroup.lastFourPAN,
+                } as OnyxTypes.Card),
+                formattedFeedName: getCustomOrFormattedFeedName(cardGroup.bank as OnyxTypes.CompanyCardFeed, customFeedName) ?? '',
             };
         }
     }
@@ -2094,7 +2096,6 @@ function getListItem(type: SearchDataTypes, status: SearchStatus, groupBy?: Sear
 function getSections({
     type,
     data,
-    policies,
     currentAccountID,
     currentUserEmail,
     translate,
@@ -2108,10 +2109,10 @@ function getSections({
     isActionLoadingSet,
     cardFeeds,
     allTransactionViolations,
-    visibleReportActionsData,
+    shouldSkipActionFiltering,
 }: GetSectionsParams) {
     if (type === CONST.SEARCH.DATA_TYPES.CHAT) {
-        return getReportActionsSections(data, visibleReportActionsData);
+        return getReportActionsSections(data);
     }
     if (type === CONST.SEARCH.DATA_TYPES.TASK) {
         return getTaskSections(data, formatPhoneNumber, archivedReportsIDList);
@@ -2120,7 +2121,6 @@ function getSections({
     if (type === CONST.SEARCH.DATA_TYPES.EXPENSE_REPORT) {
         return getReportSections({
             data,
-            policies,
             currentSearch,
             currentAccountID,
             currentUserEmail,
@@ -2130,6 +2130,7 @@ function getSections({
             allTransactionViolations,
             bankAccountList,
             reportActions,
+            shouldSkipActionFiltering,
         });
     }
 
@@ -2140,7 +2141,7 @@ function getSections({
             case CONST.SEARCH.GROUP_BY.FROM:
                 return getMemberSections(data, queryJSON, formatPhoneNumber);
             case CONST.SEARCH.GROUP_BY.CARD:
-                return getCardSections(data, queryJSON, translate, cardFeeds);
+                return getCardSections(data, queryJSON, cardFeeds);
             case CONST.SEARCH.GROUP_BY.WITHDRAWAL_ID:
                 return getWithdrawalIDSections(data, queryJSON);
         }
@@ -2562,6 +2563,13 @@ function isSearchResultsEmpty(searchResults: SearchResults, groupBy?: SearchGrou
     if (groupBy) {
         return !Object.keys(searchResults?.data).some((key) => isGroupEntry(key));
     }
+
+    if (searchResults?.search?.type === CONST.SEARCH.DATA_TYPES.EXPENSE_REPORT) {
+        return !Object.keys(searchResults?.data).some(
+            (key) => isReportEntry(key) && (searchResults?.data[key as keyof typeof searchResults.data] as OnyxTypes.Report)?.pendingAction !== CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE,
+        );
+    }
+
     return !Object.keys(searchResults?.data).some(
         (key) =>
             key.startsWith(ONYXKEYS.COLLECTION.TRANSACTION) &&
@@ -3058,7 +3066,7 @@ function getGroupByOptions(translate: LocalizedTranslate) {
     return Object.values(CONST.SEARCH.GROUP_BY).map<SingleSelectItem<SearchGroupBy>>((value) => ({text: translate(`search.filters.groupBy.${value}`), value}));
 }
 
-function getGroupCurrencyOptions(currencyList: OnyxTypes.CurrencyList, getCurrencySymbol: CurrencyListContextProps['getCurrencySymbol']) {
+function getGroupCurrencyOptions(currencyList: OnyxTypes.CurrencyList) {
     return Object.keys(currencyList).reduce(
         (options, currencyCode) => {
             if (!currencyList?.[currencyCode]?.retired) {
@@ -3288,7 +3296,7 @@ function getColumnsToShow(
     });
 
     if (!arraysEqual(Object.values(CONST.SEARCH.TYPE_DEFAULT_COLUMNS.EXPENSE), filteredVisibleColumns) && filteredVisibleColumns.length > 0) {
-        const requiredColumns = new Set<SearchColumnType>([CONST.SEARCH.TABLE_COLUMNS.AVATAR, CONST.SEARCH.TABLE_COLUMNS.TYPE, CONST.SEARCH.TABLE_COLUMNS.TOTAL_AMOUNT]);
+        const requiredColumns = new Set<SearchColumnType>([CONST.SEARCH.TABLE_COLUMNS.AVATAR, CONST.SEARCH.TABLE_COLUMNS.TOTAL_AMOUNT, CONST.SEARCH.TABLE_COLUMNS.TYPE]);
         const result: SearchColumnType[] = [];
 
         // Add required columns that aren't in visibleColumns at the start
@@ -3308,7 +3316,7 @@ function getColumnsToShow(
     const {moneyRequestReportActionsByTransactionID} = Array.isArray(data) ? {} : createReportActionsLookupMaps(data);
     const updateColumns = (transaction: OnyxTypes.Transaction) => {
         const merchant = transaction.modifiedMerchant ? transaction.modifiedMerchant : (transaction.merchant ?? '');
-        if ((merchant !== '' && merchant !== CONST.TRANSACTION.PARTIAL_TRANSACTION_MERCHANT && merchant !== CONST.TRANSACTION.DEFAULT_MERCHANT) || isScanning(transaction)) {
+        if ((merchant !== '' && merchant !== CONST.TRANSACTION.PARTIAL_TRANSACTION_MERCHANT) || isScanning(transaction)) {
             columns[CONST.SEARCH.TABLE_COLUMNS.MERCHANT] = true;
         }
 
diff --git a/src/libs/SettlementButtonUtils.ts b/src/libs/SettlementButtonUtils.ts
index 34d870abb86c..246f9d985676 100644
--- a/src/libs/SettlementButtonUtils.ts
+++ b/src/libs/SettlementButtonUtils.ts
@@ -43,10 +43,6 @@ const getRouteMappings = (chatReportID: string, reportID?: string): RouteMapping
             check: (activeRoute: string) => activeRoute.includes(ROUTES.SEARCH_REPORT.getRoute({reportID: chatReportID})),
             navigate: () => Navigation.navigate(ROUTES.SEARCH_REPORT_VERIFY_ACCOUNT.getRoute(chatReportID)),
         },
-        {
-            check: (activeRoute: string) => activeRoute.includes(ROUTES.EXPENSE_REPORT_RHP.getRoute({reportID: chatReportID})),
-            navigate: () => Navigation.navigate(ROUTES.REPORT_VERIFY_ACCOUNT.getRoute(chatReportID)),
-        },
     ];
 
     if (reportID === undefined) {
@@ -66,10 +62,6 @@ const getRouteMappings = (chatReportID: string, reportID?: string): RouteMapping
             check: (activeRoute: string) => activeRoute.includes(ROUTES.REPORT_WITH_ID.getRoute(reportID)),
             navigate: () => Navigation.navigate(ROUTES.REPORT_VERIFY_ACCOUNT.getRoute(reportID)),
         },
-        {
-            check: (activeRoute: string) => activeRoute.includes(ROUTES.EXPENSE_REPORT_RHP.getRoute({reportID})),
-            navigate: () => Navigation.navigate(ROUTES.EXPENSE_REPORT_VERIFY_ACCOUNT.getRoute(reportID)),
-        },
     ];
 
     return [...nonReportIdRouteMappings, ...reportIdRouteMappings];
diff --git a/src/libs/SidebarUtils.ts b/src/libs/SidebarUtils.ts
index 0d6804ab1ab1..6cd400638292 100644
--- a/src/libs/SidebarUtils.ts
+++ b/src/libs/SidebarUtils.ts
@@ -5,17 +5,7 @@ import type {LocaleContextProps, LocalizedTranslate} from '@components/LocaleCon
 import type {PartialPolicyForSidebar, ReportsToDisplayInLHN} from '@hooks/useSidebarOrderedReports';
 import CONST from '@src/CONST';
 import ONYXKEYS from '@src/ONYXKEYS';
-import type {
-    Card,
-    PersonalDetails,
-    PersonalDetailsList,
-    ReportActions,
-    ReportAttributesDerivedValue,
-    ReportNameValuePairs,
-    Transaction,
-    TransactionViolation,
-    VisibleReportActionsDerivedValue,
-} from '@src/types/onyx';
+import type {Card, PersonalDetails, PersonalDetailsList, ReportActions, ReportAttributesDerivedValue, ReportNameValuePairs, Transaction, TransactionViolation} from '@src/types/onyx';
 import type Beta from '@src/types/onyx/Beta';
 import type {ReportAttributes} from '@src/types/onyx/DerivedValues';
 import type {Errors} from '@src/types/onyx/OnyxCommon';
@@ -47,8 +37,6 @@ import {
     getDeletedApprovalRuleMessage,
     getForwardsToUpdateMessage,
     getIntegrationSyncFailedMessage,
-    getInvoiceCompanyNameUpdateMessage,
-    getInvoiceCompanyWebsiteUpdateMessage,
     getLastVisibleMessage,
     getMessageOfOldDotReportAction,
     getOneTransactionThreadReportAction,
@@ -60,11 +48,9 @@ import {
     getPolicyChangeLogDefaultTitleMessage,
     getPolicyChangeLogDeleteMemberMessage,
     getPolicyChangeLogEmployeeLeftMessage,
-    getPolicyChangeLogMaxExpenseAgeMessage,
     getPolicyChangeLogMaxExpenseAmountMessage,
     getPolicyChangeLogMaxExpenseAmountNoReceiptMessage,
     getPolicyChangeLogUpdateEmployee,
-    getReimburserUpdateMessage,
     getRemovedConnectionMessage,
     getRenamedAction,
     getReportAction,
@@ -74,7 +60,6 @@ import {
     getSubmitsToUpdateMessage,
     getTagListNameUpdatedMessage,
     getTravelUpdateMessage,
-    getUpdateACHAccountMessage,
     getUpdatedApprovalRuleMessage,
     getUpdatedAuditRateMessage,
     getUpdatedManualApprovalThresholdMessage,
@@ -292,9 +277,7 @@ function getReportsToDisplayInLHN(
         );
 
         if (shouldDisplay) {
-            const requiresAttention = reportAttributes?.[report?.reportID]?.requiresAttention ?? false;
-            const hasAttentionOrError = requiresAttention || hasErrorsOtherThanFailedReceipt;
-            reportsToDisplay[reportID] = hasAttentionOrError ? {...report, requiresAttention, hasErrorsOtherThanFailedReceipt} : report;
+            reportsToDisplay[reportID] = hasErrorsOtherThanFailedReceipt ? {...report, hasErrorsOtherThanFailedReceipt: true} : report;
         }
     }
 
@@ -351,9 +334,7 @@ function updateReportsToDisplayInLHN({
         );
 
         if (shouldDisplay) {
-            const requiresAttention = reportAttributes?.[report?.reportID]?.requiresAttention ?? false;
-            const hasAttentionOrError = requiresAttention || hasErrorsOtherThanFailedReceipt;
-            displayedReportsCopy[reportID] = hasAttentionOrError ? {...report, requiresAttention, hasErrorsOtherThanFailedReceipt} : report;
+            displayedReportsCopy[reportID] = hasErrorsOtherThanFailedReceipt ? {...report, hasErrorsOtherThanFailedReceipt: true} : report;
         } else {
             delete displayedReportsCopy[reportID];
         }
@@ -364,7 +345,12 @@ function updateReportsToDisplayInLHN({
 /**
  * Categorizes reports into their respective LHN groups
  */
-function categorizeReportsForLHN(reportsToDisplay: ReportsToDisplayInLHN, reportsDrafts: OnyxCollection<string> | undefined, reportNameValuePairs?: OnyxCollection<ReportNameValuePairs>) {
+function categorizeReportsForLHN(
+    reportsToDisplay: ReportsToDisplayInLHN,
+    reportsDrafts: OnyxCollection<string> | undefined,
+    reportNameValuePairs?: OnyxCollection<ReportNameValuePairs>,
+    reportAttributes?: ReportAttributesDerivedValue['reports'],
+) {
     const pinnedAndGBRReports: MiniReport[] = [];
     const errorReports: MiniReport[] = [];
     const draftReports: MiniReport[] = [];
@@ -398,7 +384,7 @@ function categorizeReportsForLHN(reportsToDisplay: ReportsToDisplayInLHN, report
         };
 
         const isPinned = !!report.isPinned;
-        const requiresAttention = !!report?.requiresAttention;
+        const requiresAttention = !!reportAttributes?.[reportID]?.requiresAttention;
         const draftComment = reportsDrafts?.[`${ONYXKEYS.COLLECTION.REPORT_DRAFT_COMMENT}${reportID}`];
         const hasDraft = !!draftComment;
         const reportNameValuePairsKey = `${ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS}${reportID}`;
@@ -526,6 +512,7 @@ function sortReportsToDisplayInLHN(
     localeCompare: LocaleContextProps['localeCompare'],
     reportsDrafts: OnyxCollection<string> | undefined,
     reportNameValuePairs?: OnyxCollection<ReportNameValuePairs>,
+    reportAttributes?: ReportAttributesDerivedValue['reports'],
 ): string[] {
     Performance.markStart(CONST.TIMING.GET_ORDERED_REPORT_IDS);
 
@@ -543,7 +530,7 @@ function sortReportsToDisplayInLHN(
     //      - Sorted by reportDisplayName in GSD (focus) view mode
 
     // Step 1: Categorize reports
-    const categories = categorizeReportsForLHN(reportsToDisplay, reportsDrafts, reportNameValuePairs);
+    const categories = categorizeReportsForLHN(reportsToDisplay, reportsDrafts, reportNameValuePairs, reportAttributes);
 
     // Step 2: Sort each category
     const sortedCategories = sortCategorizedReports(categories, isInDefaultMode, localeCompare);
@@ -659,8 +646,6 @@ function getOptionData({
     lastActionReport,
     movedFromReport,
     movedToReport,
-    currentUserAccountID,
-    visibleReportActionsData,
 }: {
     report: OnyxEntry<Report>;
     oneTransactionThreadReport: OnyxEntry<Report>;
@@ -679,8 +664,6 @@ function getOptionData({
     lastActionReport: OnyxEntry<Report> | undefined;
     movedFromReport?: OnyxEntry<Report>;
     movedToReport?: OnyxEntry<Report>;
-    currentUserAccountID: number;
-    visibleReportActionsData?: VisibleReportActionsDerivedValue;
 }): OptionData | undefined {
     // When a user signs out, Onyx is cleared. Due to the lazy rendering with a virtual list, it's possible for
     // this method to be called after the Onyx data has been cleared out. In that case, it's fine to do
@@ -808,20 +791,10 @@ function getOptionData({
             : null;
     }
 
-    const lastActorDisplayName = getLastActorDisplayName(lastActorDetails, currentUserAccountID);
+    const lastActorDisplayName = getLastActorDisplayName(lastActorDetails);
     let lastMessageTextFromReport = lastMessageTextFromReportProp;
     if (!lastMessageTextFromReport) {
-        lastMessageTextFromReport = getLastMessageTextForReport({
-            translate,
-            report,
-            lastActorDetails,
-            movedFromReport,
-            movedToReport,
-            policy,
-            isReportArchived,
-            visibleReportActionsDataParam: visibleReportActionsData,
-            lastAction,
-        });
+        lastMessageTextFromReport = getLastMessageTextForReport({report, lastActorDetails, movedFromReport, movedToReport, policy, isReportArchived});
     }
 
     // We need to remove sms domain in case the last message text has a phone number mention with sms domain.
@@ -853,7 +826,7 @@ function getOptionData({
                     accountID: lastAction.actorAccountID,
                 };
             }
-            actorDisplayName = actorDetails ? getLastActorDisplayName(actorDetails, currentUserAccountID) : undefined;
+            actorDisplayName = actorDetails ? getLastActorDisplayName(actorDetails) : undefined;
             const lastActionOriginalMessage = lastAction?.actionName ? getOriginalMessage(lastAction) : null;
             const targetAccountIDs = lastActionOriginalMessage?.targetAccountIDs ?? [];
             const targetAccountIDsLength = targetAccountIDs.length !== 0 ? targetAccountIDs.length : (report.lastMessageHtml?.match(/<mention-user[^>]*><\/mention-user>/g)?.length ?? 0);
@@ -935,24 +908,14 @@ function getOptionData({
             result.alternateText = getSubmitsToUpdateMessage(translate, lastAction);
         } else if (lastAction?.actionName === CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_FORWARDS_TO) {
             result.alternateText = getForwardsToUpdateMessage(translate, lastAction);
-        } else if (lastAction?.actionName === CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_INVOICE_COMPANY_NAME) {
-            result.alternateText = getInvoiceCompanyNameUpdateMessage(translate, lastAction);
-        } else if (lastAction?.actionName === CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_INVOICE_COMPANY_WEBSITE) {
-            result.alternateText = getInvoiceCompanyWebsiteUpdateMessage(translate, lastAction);
-        } else if (lastAction?.actionName === CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_REIMBURSER) {
-            result.alternateText = getReimburserUpdateMessage(translate, lastAction);
         } else if (lastAction?.actionName === CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_REIMBURSEMENT_ENABLED) {
             result.alternateText = getWorkspaceReimbursementUpdateMessage(translate, lastAction);
-        } else if (lastAction?.actionName === CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_ACH_ACCOUNT) {
-            result.alternateText = getUpdateACHAccountMessage(translate, lastAction);
         } else if (lastAction?.actionName === CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_ADDRESS) {
             result.alternateText = getCompanyAddressUpdateMessage(translate, lastAction);
         } else if (lastAction?.actionName === CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_MAX_EXPENSE_AMOUNT_NO_RECEIPT) {
             result.alternateText = getPolicyChangeLogMaxExpenseAmountNoReceiptMessage(translate, lastAction);
         } else if (lastAction?.actionName === CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_MAX_EXPENSE_AMOUNT) {
             result.alternateText = getPolicyChangeLogMaxExpenseAmountMessage(translate, lastAction);
-        } else if (lastAction?.actionName === CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_MAX_EXPENSE_AGE) {
-            result.alternateText = getPolicyChangeLogMaxExpenseAgeMessage(translate, lastAction);
         } else if (lastAction?.actionName === CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_DEFAULT_BILLABLE) {
             result.alternateText = getPolicyChangeLogDefaultBillableMessage(translate, lastAction);
         } else if (lastAction?.actionName === CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_DEFAULT_REIMBURSABLE) {
@@ -966,10 +929,7 @@ function getOptionData({
         } else if (isCardIssuedAction(lastAction)) {
             result.alternateText = getCardIssuedMessage({reportAction: lastAction, expensifyCard: card, translate});
         } else if (lastAction?.actionName !== CONST.REPORT.ACTIONS.TYPE.REPORT_PREVIEW && lastActorDisplayName && lastMessageTextFromReport) {
-            const displayName =
-                (lastMessageTextFromReport.length > 0 &&
-                    getLastActorDisplayNameFromLastVisibleActions(report, lastActorDetails, currentUserAccountID, personalDetails, visibleReportActionsData, lastAction)) ||
-                lastActorDisplayName;
+            const displayName = (lastMessageTextFromReport.length > 0 && getLastActorDisplayNameFromLastVisibleActions(report, lastActorDetails)) || lastActorDisplayName;
             result.alternateText = formatReportLastMessageText(`${displayName}: ${lastMessageText}`);
         } else if (lastAction && isOldDotReportAction(lastAction)) {
             result.alternateText = getMessageOfOldDotReportAction(translate, lastAction);
@@ -1033,11 +993,8 @@ function getOptionData({
                     translate('report.noActivityYet'),
             );
         }
-        if (shouldShowLastActorDisplayName(report, lastActorDetails, lastAction, currentUserAccountID) && !isReportArchived) {
-            const displayName =
-                (lastMessageTextFromReport.length > 0 &&
-                    getLastActorDisplayNameFromLastVisibleActions(report, lastActorDetails, currentUserAccountID, personalDetails, visibleReportActionsData, lastAction)) ||
-                lastActorDisplayName;
+        if (shouldShowLastActorDisplayName(report, lastActorDetails, lastAction) && !isReportArchived) {
+            const displayName = (lastMessageTextFromReport.length > 0 && getLastActorDisplayNameFromLastVisibleActions(report, lastActorDetails)) || lastActorDisplayName;
             result.alternateText = `${displayName}: ${formatReportLastMessageText(lastMessageText)}`;
         } else {
             result.alternateText = formatReportLastMessageText(lastMessageText);
diff --git a/src/libs/StringUtils/index.ts b/src/libs/StringUtils/index.ts
index 440b905e4148..c79a8b765f1e 100644
--- a/src/libs/StringUtils/index.ts
+++ b/src/libs/StringUtils/index.ts
@@ -106,7 +106,7 @@ function normalizeAccents(text: string) {
 function normalize(text: string): string {
     return removeInvisibleCharacters(text)
         .replaceAll(/[\u00A0\u1680\u2000-\u200A\u202F\u205F\u3000]/g, ' ') // space-like -> ' '
-        .replaceAll(CONST.REGEX.WHITESPACE, ' ') // collapse spaces
+        .replaceAll(/\s+/g, ' ') // collapse spaces
         .trim();
 }
 
@@ -182,10 +182,6 @@ function startsWithVowel(str: string): boolean {
     return /^[aeiouAEIOU]/.test(str);
 }
 
-function camelToHyphenCase(str: string) {
-    return str.replaceAll(/[A-Z]/g, (letter) => `-${letter.toLowerCase()}`);
-}
-
 export default {
     sanitizeString,
     isEmptyString,
@@ -204,5 +200,4 @@ export default {
     decodeUnicode,
     countWhiteSpaces,
     startsWithVowel,
-    camelToHyphenCase,
 };
diff --git a/src/libs/TimeTrackingUtils.ts b/src/libs/TimeTrackingUtils.ts
index daf4c321b8b6..39bc88d5b2b5 100644
--- a/src/libs/TimeTrackingUtils.ts
+++ b/src/libs/TimeTrackingUtils.ts
@@ -1,6 +1,5 @@
 import type {LocalizedTranslate} from '@components/LocaleContextProvider';
-import {convertToDisplayString, convertToFrontendAmountAsString, getCurrencyDecimals} from './CurrencyUtils';
-import {validateAmount} from './MoneyRequestUtils';
+import {convertToDisplayString} from './CurrencyUtils';
 
 /**
  * Computes the transaction amount for given hourly rate (in cents) and hour count.
@@ -16,11 +15,4 @@ function formatTimeMerchant(hours: number, rate: number, currency: string, trans
     return translate('iou.timeTracking.hoursAt', hours, convertToDisplayString(rate, currency));
 }
 
-/**
- * Checks whether the amount calculated via computeTimeAmount is valid (primarily that it is not too big).
- */
-function isValidTimeExpenseAmount(amount: number, currency?: string) {
-    return validateAmount(convertToFrontendAmountAsString(amount, currency), getCurrencyDecimals(currency));
-}
-
-export {computeTimeAmount, formatTimeMerchant, isValidTimeExpenseAmount};
+export {computeTimeAmount, formatTimeMerchant};
diff --git a/src/libs/TransactionPreviewUtils.ts b/src/libs/TransactionPreviewUtils.ts
index 15592977f66c..6362f15576f6 100644
--- a/src/libs/TransactionPreviewUtils.ts
+++ b/src/libs/TransactionPreviewUtils.ts
@@ -1,10 +1,11 @@
 import truncate from 'lodash/truncate';
-import type {OnyxEntry} from 'react-native-onyx';
+import type {OnyxEntry, OnyxInputValue} from 'react-native-onyx';
 import CONST from '@src/CONST';
 import type {TranslationPaths} from '@src/languages/types';
 import ROUTES from '@src/ROUTES';
 import type * as OnyxTypes from '@src/types/onyx';
 import {isEmptyObject} from '@src/types/utils/EmptyObject';
+import {getCurrentUserAccountID} from './actions/Report';
 import {abandonReviewDuplicateTransactions, setReviewDuplicatesKey} from './actions/Transaction';
 import {isCategoryMissing} from './CategoryUtils';
 import {convertToDisplayString} from './CurrencyUtils';
@@ -32,6 +33,7 @@ import {
     hasPendingRTERViolation,
     hasViolation,
     hasWarningTypeViolation,
+    isAmountMissing,
     isCreatedMissing,
     isDistanceRequest,
     isFetchingWaypointsFromServer,
@@ -215,7 +217,7 @@ function getTransactionPreviewTextAndTranslationPaths({
     const shouldShowHoldMessage = !(isMoneyRequestSettled && !isSettlementOrApprovalPartial) && !!transaction?.comment?.hold;
     const showCashOrCard: TranslationPathOrText = {translationPath: isTransactionMadeWithCard ? 'iou.card' : 'iou.cash'};
     const isTransactionScanning = isScanning(transaction);
-    const hasFieldErrors = hasMissingSmartscanFields(transaction, iouReport);
+    const hasFieldErrors = hasMissingSmartscanFields(transaction);
     const isPaidGroupPolicy = isPaidGroupPolicyUtil(iouReport);
 
     // This will be fixed as part of https://github.com/Expensify/Expensify/issues/507850
@@ -257,7 +259,12 @@ function getTransactionPreviewTextAndTranslationPaths({
 
     if (hasFieldErrors && RBRMessage === undefined) {
         const merchantMissing = isMerchantMissing(transaction);
-        if (merchantMissing) {
+        const amountMissing = isAmountMissing(transaction);
+        if (amountMissing && merchantMissing) {
+            RBRMessage = {translationPath: 'violations.reviewRequired'};
+        } else if (amountMissing) {
+            RBRMessage = {translationPath: 'iou.missingAmount'};
+        } else if (merchantMissing) {
             RBRMessage = {translationPath: 'iou.missingMerchant'};
         }
     }
@@ -363,7 +370,7 @@ function createTransactionPreviewConditionals({
     currentUserAccountID,
     reportActions,
 }: {
-    iouReport: OnyxEntry<OnyxTypes.Report>;
+    iouReport: OnyxInputValue<OnyxTypes.Report> | undefined;
     transaction: OnyxEntry<OnyxTypes.Transaction> | undefined;
     action: OnyxEntry<OnyxTypes.ReportAction>;
     violations: OnyxTypes.TransactionViolations;
@@ -389,7 +396,7 @@ function createTransactionPreviewConditionals({
     const policy = getPolicy(iouReport?.policyID);
     const hasViolationsOfTypeNotice =
         hasNoticeTypeViolation(transaction, violations, currentUserEmail ?? '', currentUserAccountID, iouReport ?? undefined, policy, true) && iouReport && isPaidGroupPolicyUtil(iouReport);
-    const hasFieldErrors = hasMissingSmartscanFields(transaction, iouReport);
+    const hasFieldErrors = hasMissingSmartscanFields(transaction);
 
     const isFetchingWaypoints = isFetchingWaypointsFromServer(transaction);
 
@@ -422,7 +429,7 @@ function createTransactionPreviewConditionals({
     // When there are no settled transactions in duplicates, show the "Keep this one" button
     const shouldShowKeepButton = areThereDuplicates;
     const participantAccountIDs = isMoneyRequestAction(action) && isBillSplit ? (getOriginalMessage(action)?.participantAccountIDs ?? []) : [];
-    const shouldShowSplitShare = isBillSplit && !!requestAmount && requestAmount > 0 && participantAccountIDs.includes(currentUserAccountID);
+    const shouldShowSplitShare = isBillSplit && !!requestAmount && requestAmount > 0 && participantAccountIDs.includes(getCurrentUserAccountID());
     /*
  Show the merchant for IOUs and expenses only if:
  - the merchant is not empty, is custom, or is not related to scanning smartscan;
diff --git a/src/libs/TransactionUtils/index.ts b/src/libs/TransactionUtils/index.ts
index d15cacaeffcb..9f4628c472c8 100644
--- a/src/libs/TransactionUtils/index.ts
+++ b/src/libs/TransactionUtils/index.ts
@@ -3,7 +3,7 @@ import {deepEqual} from 'fast-equals';
 import lodashDeepClone from 'lodash/cloneDeep';
 import lodashHas from 'lodash/has';
 import lodashSet from 'lodash/set';
-import type {OnyxCollection, OnyxEntry, OnyxKey} from 'react-native-onyx';
+import type {OnyxCollection, OnyxEntry} from 'react-native-onyx';
 import Onyx from 'react-native-onyx';
 import type {ValueOf} from 'type-fest';
 import type {Coordinate} from '@components/MapView/MapViewTypes';
@@ -13,7 +13,7 @@ import type {TransactionWithOptionalSearchFields} from '@components/TransactionI
 import {getPolicyTagsData} from '@libs/actions/Policy/Tag';
 import type {MergeDuplicatesParams} from '@libs/API/parameters';
 import {getCategoryDefaultTaxRate, isCategoryMissing} from '@libs/CategoryUtils';
-import {convertToBackendAmount, getCurrencyDecimals, getCurrencySymbol} from '@libs/CurrencyUtils';
+import {convertToBackendAmount, getCurrencyDecimals} from '@libs/CurrencyUtils';
 import DateUtils from '@libs/DateUtils';
 import DistanceRequestUtils from '@libs/DistanceRequestUtils';
 import {toLocaleDigit} from '@libs/LocaleDigitUtils';
@@ -21,7 +21,6 @@ import {toLocaleDigit} from '@libs/LocaleDigitUtils';
 import {translateLocal} from '@libs/Localize';
 import Log from '@libs/Log';
 import {rand64, roundToTwoDecimalPlaces} from '@libs/NumberUtils';
-import Permissions from '@libs/Permissions';
 import {getLoginsByAccountIDs, getPersonalDetailsByIDs} from '@libs/PersonalDetailsUtils';
 import {
     getCommaSeparatedTagNameWithSanitizedColons,
@@ -54,7 +53,6 @@ import type {IOUType} from '@src/CONST';
 import IntlStore from '@src/languages/IntlStore';
 import ONYXKEYS from '@src/ONYXKEYS';
 import type {
-    Beta,
     CardList,
     OnyxInputOrEntry,
     Policy,
@@ -131,13 +129,23 @@ type BuildOptimisticTransactionParams = {
     isDemoTransactionParam?: boolean;
 };
 
-let allBetas: OnyxEntry<Beta[]>;
-Onyx.connectWithoutView({
-    key: ONYXKEYS.BETAS,
-    callback: (value) => (allBetas = value),
+let deprecatedAllReports: OnyxCollection<Report> = {};
+Onyx.connect({
+    key: ONYXKEYS.COLLECTION.REPORT,
+    waitForCollectionCallback: true,
+    callback: (value) => {
+        deprecatedAllReports = value;
+    },
 });
 
-function hasDistanceCustomUnit(transaction: OnyxEntry<Transaction> | Partial<Transaction>): boolean {
+let deprecatedAllTransactionViolations: OnyxCollection<TransactionViolations> = {};
+Onyx.connect({
+    key: ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS,
+    waitForCollectionCallback: true,
+    callback: (value) => (deprecatedAllTransactionViolations = value),
+});
+
+function hasDistanceCustomUnit(transaction: OnyxEntry<Transaction>): boolean {
     const type = transaction?.comment?.type;
     const customUnitName = transaction?.comment?.customUnit?.name;
     return type === CONST.TRANSACTION.TYPE.CUSTOM_UNIT && customUnitName === CONST.CUSTOM_UNITS.NAME_DISTANCE;
@@ -215,11 +223,6 @@ function isScanRequest(transaction: OnyxEntry<Transaction> | Partial<Transaction
         return transaction?.iouRequestType === CONST.IOU.REQUEST_TYPE.SCAN;
     }
 
-    // Distance requests can have a receipt source (for the map), so we need to exclude them
-    if (hasDistanceCustomUnit(transaction)) {
-        return false;
-    }
-
     return !!transaction?.receipt?.source && transaction?.amount === 0;
 }
 
@@ -453,7 +456,6 @@ function buildOptimisticTransaction(params: BuildOptimisticTransactionParams): T
         lodashSet(commentJSON, 'customUnit', customUnit);
     }
 
-    const isManualTransaction = !isPerDiemTransaction && !isMapDistanceTransaction && !isManualDistanceTransaction && !splitExpenses && !receipt?.source;
     if (type === CONST.TRANSACTION.TYPE.TIME) {
         commentJSON.units = {
             count,
@@ -470,7 +472,7 @@ function buildOptimisticTransaction(params: BuildOptimisticTransactionParams): T
         currency,
         reportID,
         comment: commentJSON,
-        merchant: merchant || (isManualTransaction ? CONST.TRANSACTION.DEFAULT_MERCHANT : CONST.TRANSACTION.PARTIAL_TRANSACTION_MERCHANT),
+        merchant: merchant || CONST.TRANSACTION.PARTIAL_TRANSACTION_MERCHANT,
         created: created || DateUtils.getDBTime(),
         pendingAction,
         receipt: receipt?.source
@@ -514,10 +516,9 @@ function isDemoTransaction(transaction: OnyxInputOrEntry<Transaction>): boolean
 
 function isMerchantMissing(transaction: OnyxEntry<Transaction>) {
     if (transaction?.modifiedMerchant && transaction.modifiedMerchant !== '') {
-        return transaction.modifiedMerchant === CONST.TRANSACTION.PARTIAL_TRANSACTION_MERCHANT || transaction.modifiedMerchant === CONST.TRANSACTION.DEFAULT_MERCHANT;
+        return transaction.modifiedMerchant === CONST.TRANSACTION.PARTIAL_TRANSACTION_MERCHANT;
     }
-    const isMerchantEmpty =
-        transaction?.merchant === CONST.TRANSACTION.PARTIAL_TRANSACTION_MERCHANT || transaction?.merchant === CONST.TRANSACTION.DEFAULT_MERCHANT || transaction?.merchant === '';
+    const isMerchantEmpty = transaction?.merchant === CONST.TRANSACTION.PARTIAL_TRANSACTION_MERCHANT || transaction?.merchant === '';
 
     return isMerchantEmpty;
 }
@@ -543,20 +544,7 @@ function isPartialMerchant(merchant: string): boolean {
 }
 
 function isAmountMissing(transaction: OnyxEntry<Transaction>) {
-    if (Permissions.isBetaEnabled(CONST.BETAS.ZERO_EXPENSES, allBetas)) {
-        return transaction?.amount === undefined && (!transaction?.modifiedAmount === undefined || transaction?.modifiedAmount === '');
-    }
-    return (transaction?.amount === 0 || transaction?.amount === undefined) && (!transaction?.modifiedAmount || transaction?.modifiedAmount === 0 || transaction?.modifiedAmount === '');
-}
-
-function hasValidModifiedAmount(transaction: OnyxEntry<Transaction> | null): boolean {
-    if (!transaction) {
-        return false;
-    }
-    if (Permissions.isBetaEnabled(CONST.BETAS.ZERO_EXPENSES, allBetas)) {
-        return transaction?.modifiedAmount !== undefined && transaction?.modifiedAmount !== null && transaction?.modifiedAmount !== '';
-    }
-    return transaction?.modifiedAmount !== undefined && transaction?.modifiedAmount !== null && transaction?.modifiedAmount !== '' && transaction?.modifiedAmount !== 0;
+    return transaction?.amount === 0 && (!transaction.modifiedAmount || transaction.modifiedAmount === 0);
 }
 
 function isPartial(transaction: OnyxEntry<Transaction>): boolean {
@@ -570,12 +558,14 @@ function isCreatedMissing(transaction: OnyxEntry<Transaction>) {
     return transaction?.created === '' && (!transaction.created || transaction.modifiedCreated === '');
 }
 
-function areRequiredFieldsEmpty(transaction: OnyxEntry<Transaction>, transactionReport: OnyxEntry<Report>): boolean {
-    const isFromExpenseReport = transactionReport?.type === CONST.REPORT.TYPE.EXPENSE;
-    if (Permissions.isBetaEnabled(CONST.BETAS.ZERO_EXPENSES, allBetas)) {
-        return (isFromExpenseReport && isMerchantMissing(transaction)) || isCreatedMissing(transaction);
-    }
-    return (isFromExpenseReport && isMerchantMissing(transaction)) || isAmountMissing(transaction) || isCreatedMissing(transaction);
+function areRequiredFieldsEmpty(transaction: OnyxEntry<Transaction>, reportTransaction?: OnyxEntry<Report>): boolean {
+    const parentReport = reportTransaction ?? deprecatedAllReports?.[`${ONYXKEYS.COLLECTION.REPORT}${transaction?.reportID}`];
+    const isFromExpenseReport = parentReport?.type === CONST.REPORT.TYPE.EXPENSE;
+    const isSplitPolicyExpenseChat = !!transaction?.comment?.splits?.some(
+        (participant) => deprecatedAllReports?.[`${ONYXKEYS.COLLECTION.REPORT}${participant.chatReportID}`]?.isOwnPolicyExpenseChat,
+    );
+    const isMerchantRequired = isFromExpenseReport || isSplitPolicyExpenseChat;
+    return (isMerchantRequired && isMerchantMissing(transaction)) || isAmountMissing(transaction) || isCreatedMissing(transaction);
 }
 
 function getClearedPendingFields(transactionChanges: TransactionChanges) {
@@ -667,16 +657,9 @@ function getUpdatedTransaction({
             const distanceInMeters = getDistanceInMeters(transaction, unit);
             const amount = DistanceRequestUtils.getDistanceRequestAmount(distanceInMeters, unit, rate ?? 0);
             const updatedAmount = isFromExpenseReport || isUnReportedExpense ? -amount : amount;
-            const updatedMerchant = DistanceRequestUtils.getDistanceMerchant(
-                true,
-                distanceInMeters,
-                unit,
-                rate,
-                transaction.currency,
-                // eslint-disable-next-line @typescript-eslint/no-deprecated
-                translateLocal,
-                (digit) => toLocaleDigit(IntlStore.getCurrentLocale(), digit),
-                getCurrencySymbol,
+            // eslint-disable-next-line @typescript-eslint/no-deprecated
+            const updatedMerchant = DistanceRequestUtils.getDistanceMerchant(true, distanceInMeters, unit, rate, transaction.currency, translateLocal, (digit) =>
+                toLocaleDigit(IntlStore.getCurrentLocale(), digit),
             );
 
             updatedTransaction.amount = updatedAmount;
@@ -715,16 +698,9 @@ function getUpdatedTransaction({
             const amount = DistanceRequestUtils.getDistanceRequestAmount(distanceInMeters, unit, rate ?? 0);
             const updatedAmount = isFromExpenseReport || isUnReportedExpense ? -amount : amount;
             const updatedCurrency = updatedMileageRate.currency ?? CONST.CURRENCY.USD;
-            const updatedMerchant = DistanceRequestUtils.getDistanceMerchant(
-                true,
-                distanceInMeters,
-                unit,
-                rate,
-                updatedCurrency,
-                // eslint-disable-next-line @typescript-eslint/no-deprecated
-                translateLocal,
-                (digit) => toLocaleDigit(IntlStore.getCurrentLocale(), digit),
-                getCurrencySymbol,
+            // eslint-disable-next-line @typescript-eslint/no-deprecated
+            const updatedMerchant = DistanceRequestUtils.getDistanceMerchant(true, distanceInMeters, unit, rate, updatedCurrency, translateLocal, (digit) =>
+                toLocaleDigit(IntlStore.getCurrentLocale(), digit),
             );
 
             updatedTransaction.amount = updatedAmount;
@@ -742,10 +718,6 @@ function getUpdatedTransaction({
         updatedTransaction.taxCode = transactionChanges.taxCode;
     }
 
-    if (Object.hasOwn(transactionChanges, 'taxValue') && typeof transactionChanges.taxCode === 'string') {
-        updatedTransaction.taxValue = transactionChanges.taxValue;
-    }
-
     if (Object.hasOwn(transactionChanges, 'reimbursable') && typeof transactionChanges.reimbursable === 'boolean') {
         updatedTransaction.reimbursable = transactionChanges.reimbursable;
     }
@@ -799,16 +771,9 @@ function getUpdatedTransaction({
         let amount = DistanceRequestUtils.getDistanceRequestAmount(distanceInMeters, unit, rate ?? 0);
         amount = isFromExpenseReport || isUnReportedExpense ? -amount : amount;
         const updatedCurrency = updatedMileageRate.currency ?? CONST.CURRENCY.USD;
-        const updatedMerchant = DistanceRequestUtils.getDistanceMerchant(
-            true,
-            distanceInMeters,
-            unit,
-            rate,
-            updatedCurrency,
-            // eslint-disable-next-line @typescript-eslint/no-deprecated
-            translateLocal,
-            (digit) => toLocaleDigit(IntlStore.getCurrentLocale(), digit),
-            getCurrencySymbol,
+        // eslint-disable-next-line @typescript-eslint/no-deprecated
+        const updatedMerchant = DistanceRequestUtils.getDistanceMerchant(true, distanceInMeters, unit, rate, updatedCurrency, translateLocal, (digit) =>
+            toLocaleDigit(IntlStore.getCurrentLocale(), digit),
         );
 
         updatedTransaction.modifiedAmount = amount;
@@ -816,14 +781,6 @@ function getUpdatedTransaction({
         updatedTransaction.modifiedCurrency = updatedCurrency;
     }
 
-    if (Object.hasOwn(transactionChanges, 'odometerStart') && typeof transactionChanges.odometerStart === 'number') {
-        lodashSet(updatedTransaction, 'comment.odometerStart', transactionChanges.odometerStart);
-    }
-
-    if (Object.hasOwn(transactionChanges, 'odometerEnd') && typeof transactionChanges.odometerEnd === 'number') {
-        lodashSet(updatedTransaction, 'comment.odometerEnd', transactionChanges.odometerEnd);
-    }
-
     updatedTransaction.pendingFields = {
         ...(updatedTransaction?.pendingFields ?? {}),
         ...(Object.hasOwn(transactionChanges, 'comment') && {comment: CONST.RED_BRICK_ROAD_PENDING_ACTION.UPDATE}),
@@ -844,8 +801,6 @@ function getUpdatedTransaction({
             amount: CONST.RED_BRICK_ROAD_PENDING_ACTION.UPDATE,
             merchant: CONST.RED_BRICK_ROAD_PENDING_ACTION.UPDATE,
         }),
-        ...(Object.hasOwn(transactionChanges, 'odometerStart') && {odometerStart: CONST.RED_BRICK_ROAD_PENDING_ACTION.UPDATE}),
-        ...(Object.hasOwn(transactionChanges, 'odometerEnd') && {odometerEnd: CONST.RED_BRICK_ROAD_PENDING_ACTION.UPDATE}),
     };
 
     return updatedTransaction;
@@ -866,8 +821,8 @@ function getDescription(transaction: OnyxInputOrEntry<Transaction>): string {
 function getAmount(transaction: OnyxInputOrEntry<Transaction>, isFromExpenseReport = false, isFromTrackedExpense = false, allowNegative = false, disableOppositeConversion = false): number {
     // IOU requests cannot have negative values, but they can be stored as negative values, let's return absolute value
     if (!isFromExpenseReport && !isFromTrackedExpense && !allowNegative) {
-        const amount = Number(transaction?.modifiedAmount) ?? 0;
-        if (hasValidModifiedAmount(transaction)) {
+        const amount = transaction?.modifiedAmount ?? 0;
+        if (amount) {
             return Math.abs(amount);
         }
         return Math.abs(transaction?.amount ?? 0);
@@ -880,8 +835,8 @@ function getAmount(transaction: OnyxInputOrEntry<Transaction>, isFromExpenseRepo
     // Expense report case:
     // The amounts are stored using an opposite sign and negative values can be set,
     // we need to return an opposite sign than is saved in the transaction object
-    let amount = Number(transaction?.modifiedAmount) ?? 0;
-    if (hasValidModifiedAmount(transaction)) {
+    let amount = transaction?.modifiedAmount ?? 0;
+    if (amount) {
         return -amount;
     }
 
@@ -1010,9 +965,9 @@ function getConvertedAmount(
 function getOriginalAmountForDisplay(transaction: Pick<Transaction, 'originalAmount' | 'amount' | 'modifiedAmount'>, isExpenseReport: boolean): number {
     /* eslint-disable @typescript-eslint/prefer-nullish-coalescing */
     if (isExpenseReport) {
-        return -((transaction.originalAmount || transaction.amount || Number(transaction.modifiedAmount)) ?? 0);
+        return -((transaction.originalAmount || transaction.amount || transaction.modifiedAmount) ?? 0);
     }
-    return getOriginalAmount(transaction as Transaction) || Math.abs(transaction.amount ?? 0) || Math.abs(Number(transaction.modifiedAmount ?? 0));
+    return getOriginalAmount(transaction as Transaction) || Math.abs(transaction.amount ?? 0) || Math.abs(transaction.modifiedAmount ?? 0);
     /* eslint-enable @typescript-eslint/prefer-nullish-coalescing */
 }
 
@@ -1068,16 +1023,9 @@ function getMerchant(transaction: OnyxInputOrEntry<Transaction>, policyParam: On
             // If modifiedMerchant is empty but modifiedCurrency exists, recalculate the merchant
             (!transaction?.modifiedMerchant && transaction?.modifiedCurrency)
         ) {
-            return DistanceRequestUtils.getDistanceMerchant(
-                true,
-                distanceInMeters,
-                unit,
-                rate,
-                getCurrency(transaction),
-                // eslint-disable-next-line @typescript-eslint/no-deprecated
-                translateLocal,
-                (digit) => toLocaleDigit(IntlStore.getCurrentLocale(), digit),
-                getCurrencySymbol,
+            // eslint-disable-next-line @typescript-eslint/no-deprecated
+            return DistanceRequestUtils.getDistanceMerchant(true, distanceInMeters, unit, rate, getCurrency(transaction), translateLocal, (digit) =>
+                toLocaleDigit(IntlStore.getCurrentLocale(), digit),
             );
         }
     }
@@ -1425,8 +1373,8 @@ function didReceiptScanSucceed(transaction: OnyxEntry<Transaction>): boolean {
 /**
  * Check if the transaction has a non-smart-scanning receipt and is missing required fields
  */
-function hasMissingSmartscanFields(transaction: OnyxInputOrEntry<Transaction>, transactionReport: OnyxEntry<Report>): boolean {
-    return !!(transaction && !isDistanceRequest(transaction) && !isReceiptBeingScanned(transaction) && areRequiredFieldsEmpty(transaction, transactionReport));
+function hasMissingSmartscanFields(transaction: OnyxInputOrEntry<Transaction>, reportTransaction?: OnyxEntry<Report>): boolean {
+    return !!(transaction && !isDistanceRequest(transaction) && !isReceiptBeingScanned(transaction) && areRequiredFieldsEmpty(transaction, reportTransaction));
 }
 
 /**
@@ -1444,16 +1392,13 @@ function getTransactionViolations(
         return undefined;
     }
 
-    const violations =
-        transactionViolations?.[ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS + transaction.transactionID]?.filter(
-            (violation) => !isViolationDismissed(transaction, violation, currentUserEmail, currentUserAccountID, iouReport, policy),
-        ) ?? [];
-
-    if (CONST.IS_ATTENDEES_REQUIRED_FEATURE_DISABLED) {
-        return violations.filter((violation) => violation.name !== CONST.VIOLATIONS.MISSING_ATTENDEES);
-    }
+    return transactionViolations?.[ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS + transaction.transactionID]?.filter(
+        (violation) => !isViolationDismissed(transaction, violation, currentUserEmail, currentUserAccountID, iouReport, policy),
+    );
+}
 
-    return violations;
+function getTransactionViolationsOfTransaction(transactionID: string) {
+    return deprecatedAllTransactionViolations?.[`${ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS}${transactionID}`] ?? [];
 }
 
 /**
@@ -1593,7 +1538,6 @@ function shouldShowViolation(
     const isSubmitter = isCurrentUserSubmitter(iouReport);
     const isPolicyMember = isPolicyMemberPolicyUtils(policy, currentUserEmail);
     const isReportOpen = isOpenExpenseReport(iouReport);
-    const isAttendeeTrackingEnabled = policy?.isAttendeeTrackingEnabled ?? false;
 
     if (violationName === CONST.VIOLATIONS.AUTO_REPORTED_REJECTED_EXPENSE) {
         return isSubmitter || isPolicyAdmin(policy);
@@ -1611,10 +1555,6 @@ function shouldShowViolation(
         return isPolicyMember && !isSubmitter && !isReportOpen;
     }
 
-    if (violationName === CONST.VIOLATIONS.MISSING_ATTENDEES) {
-        return isAttendeeTrackingEnabled;
-    }
-
     if (violationName === CONST.VIOLATIONS.MISSING_CATEGORY && isCategoryBeingAnalyzed(transaction)) {
         return false;
     }
@@ -1693,10 +1633,6 @@ function waypointHasValidAddress(waypoint: RecentWaypoint | Waypoint): boolean {
     return !!waypoint?.address?.trim();
 }
 
-function isWaypointNullIsland(waypoint: RecentWaypoint | Waypoint): boolean {
-    return waypoint.lat === 0 && waypoint.lng === 0;
-}
-
 /**
  * Converts the key of a waypoint to its index
  */
@@ -1735,11 +1671,6 @@ function getValidWaypoints(waypoints: WaypointCollection | undefined, reArrangeI
             return acc;
         }
 
-        // Exclude null island
-        if (isWaypointNullIsland(currentWaypoint)) {
-            return acc;
-        }
-
         // Check for adjacent waypoints with the same address or coordinate
         const previousCoordinate: Coordinate | undefined = previousWaypoint?.lng && previousWaypoint?.lat ? [previousWaypoint.lng, previousWaypoint.lat] : undefined;
         const currentCoordinate: Coordinate | undefined = currentWaypoint.lng && currentWaypoint.lat ? [currentWaypoint.lng, currentWaypoint.lat] : undefined;
@@ -1882,8 +1813,7 @@ function hasViolation(
         (violation) =>
             violation.type === CONST.VIOLATION_TYPES.VIOLATION &&
             (showInReview === undefined || showInReview === (violation.showInReview ?? false)) &&
-            !isViolationDismissed(transaction, violation, currentUserEmail, currentUserAccountID, iouReport, policy) &&
-            (!CONST.IS_ATTENDEES_REQUIRED_FEATURE_DISABLED || violation.name !== CONST.VIOLATIONS.MISSING_ATTENDEES),
+            !isViolationDismissed(transaction, violation, currentUserEmail, currentUserAccountID, iouReport, policy),
     );
 }
 
@@ -2071,18 +2001,9 @@ function getWorkspaceTaxesSettingsName(policy: OnyxEntry<Policy>, taxCode: strin
 /**
  * Gets the name corresponding to the taxCode that is displayed to the user
  */
-function getTaxName(policy: OnyxEntry<Policy>, transaction: OnyxEntry<Transaction>, shouldFallbackToValue = false) {
+function getTaxName(policy: OnyxEntry<Policy>, transaction: OnyxEntry<Transaction>) {
     const defaultTaxCode = getDefaultTaxCode(policy, transaction);
-
-    // transaction?.taxCode may be an empty string
-    // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
-    const taxRate = Object.values(transformedTaxRates(policy, transaction)).find((rate) => rate.code === (transaction?.taxCode || defaultTaxCode));
-
-    if (shouldFallbackToValue && transaction?.taxValue !== undefined && taxRate?.value !== transaction?.taxValue) {
-        return transaction?.taxValue;
-    }
-
-    return taxRate?.modifiedName;
+    return Object.values(transformedTaxRates(policy, transaction)).find((taxRate) => taxRate.code === (transaction?.taxCode ?? defaultTaxCode))?.modifiedName;
 }
 
 type FieldsToCompare = Record<string, Array<keyof Transaction>>;
@@ -2171,7 +2092,7 @@ function getValidDuplicateTransactionIDs(transactionID: string, transactionColle
  *
  */
 function removeTransactionFromDuplicateTransactionViolation(
-    onyxData: OnyxData<OnyxKey>,
+    onyxData: OnyxData,
     transactionID: string,
     transactions: OnyxCollection<Transaction>,
     transactionViolations: OnyxCollection<TransactionViolations>,
@@ -2546,21 +2467,16 @@ function isTransactionPendingDelete(transaction: OnyxEntry<Transaction>): boolea
 }
 
 /**
- * Retrieves all "child" transactions associated with a given original transaction.
- * By default excludes orphaned transactions (reportID '0'). Use includeOrphaned=true for counting.
+ * Retrieves all “child” transactions associated with a given original transaction
  */
-function getChildTransactions(transactions: OnyxCollection<Transaction>, reports: OnyxCollection<Report>, originalTransactionID: string | undefined, includeOrphaned = false) {
+function getChildTransactions(transactions: OnyxCollection<Transaction>, reports: OnyxCollection<Report>, originalTransactionID: string | undefined) {
     return Object.values(transactions ?? {}).filter((currentTransaction) => {
-        const isSplitChild = currentTransaction?.comment?.originalTransactionID === originalTransactionID;
-        if (!isSplitChild || currentTransaction?.pendingAction === CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE) {
-            return false;
-        }
-        const isOrphaned = currentTransaction?.reportID === CONST.REPORT.UNREPORTED_REPORT_ID;
-        if (isOrphaned) {
-            return includeOrphaned;
-        }
         const currentReport = reports?.[`${ONYXKEYS.COLLECTION.REPORT}${currentTransaction?.reportID}`];
-        return !!currentReport || currentTransaction?.comment?.source === CONST.IOU.TYPE.SPLIT;
+        return (
+            currentTransaction?.comment?.originalTransactionID === originalTransactionID &&
+            !!currentReport &&
+            currentTransaction?.pendingAction !== CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE
+        );
     });
 }
 
@@ -2598,9 +2514,9 @@ function isExpenseUnreported(transaction?: Transaction): transaction is Unreport
 }
 
 /**
- * Check if there is a smartscan failed or no route violation for the transaction.
+ * Check if there is a smartscan failed violation for the transaction.
  */
-function hasSmartScanFailedOrNoRouteViolation(
+function hasSmartScanFailedViolation(
     transaction: Transaction,
     transactionViolations: OnyxCollection<TransactionViolations> | undefined,
     currentUserEmail: string,
@@ -2609,7 +2525,7 @@ function hasSmartScanFailedOrNoRouteViolation(
     policy: OnyxEntry<Policy>,
 ): boolean {
     const violations = getTransactionViolations(transaction, transactionViolations, currentUserEmail, currentUserAccountID, report, policy);
-    return !!violations?.some((violation) => violation.name === CONST.VIOLATIONS.SMARTSCAN_FAILED || violation.name === CONST.VIOLATIONS.NO_ROUTE);
+    return !!violations?.some((violation) => violation.name === CONST.VIOLATIONS.SMARTSCAN_FAILED);
 }
 
 /**
@@ -2704,18 +2620,16 @@ export {
     areRequiredFieldsEmpty,
     hasMissingSmartscanFields,
     hasPendingRTERViolation,
-    hasValidModifiedAmount,
     allHavePendingRTERViolation,
     hasPendingUI,
     getWaypointIndex,
     waypointHasValidAddress,
-    isWaypointNullIsland,
     getRecentTransactions,
     hasReservationList,
     hasViolation,
     hasDuplicateTransactions,
     hasBrokenConnectionViolation,
-    hasSmartScanFailedOrNoRouteViolation,
+    hasSmartScanFailedViolation,
     shouldShowBrokenConnectionViolation,
     shouldShowBrokenConnectionViolationForMultipleTransactions,
     hasNoticeTypeViolation,
@@ -2752,6 +2666,7 @@ export {
     isDemoTransaction,
     shouldShowViolation,
     isUnreportedAndHasInvalidDistanceRateTransaction,
+    getTransactionViolationsOfTransaction,
     hasTransactionBeenRejected,
     isExpenseSplit,
     getAttendeesListDisplayString,
diff --git a/src/libs/TravelInvoicingUtils.ts b/src/libs/TravelInvoicingUtils.ts
deleted file mode 100644
index 6e31243e7c58..000000000000
--- a/src/libs/TravelInvoicingUtils.ts
+++ /dev/null
@@ -1,91 +0,0 @@
-import type {OnyxEntry} from 'react-native-onyx';
-import CONST from '@src/CONST';
-import type {BankAccountList} from '@src/types/onyx';
-import type ExpensifyCardSettings from '@src/types/onyx/ExpensifyCardSettings';
-import {getLastFourDigits} from './BankAccountUtils';
-
-/**
- * Checks whether Travel Invoicing is enabled based on the card settings.
- * Travel Invoicing is considered enabled if the PROGRAM_TRAVEL_US feed has a valid paymentBankAccountID.
- */
-function getIsTravelInvoicingEnabled(cardSettings: OnyxEntry<ExpensifyCardSettings>): boolean {
-    if (!cardSettings) {
-        return false;
-    }
-    return !!cardSettings.paymentBankAccountID;
-}
-
-/**
- * Checks if a settlement account is configured for Travel Invoicing.
- */
-function hasTravelInvoicingSettlementAccount(cardSettings: OnyxEntry<ExpensifyCardSettings>): boolean {
-    if (!cardSettings) {
-        return false;
-    }
-    return !!cardSettings.paymentBankAccountID && cardSettings.paymentBankAccountID !== CONST.DEFAULT_NUMBER_ID;
-}
-
-/**
- * Gets the remaining limit for Travel Invoicing.
- * Returns 0 if no settings are available.
- */
-function getTravelLimit(cardSettings: OnyxEntry<ExpensifyCardSettings>): number {
-    return cardSettings?.remainingLimit ?? 0;
-}
-
-/**
- * Gets the current spend for Travel Invoicing.
- * This is the sum of all posted Travel Invoicing card transactions.
- * Returns 0 if no settings are available.
- */
-function getTravelSpend(cardSettings: OnyxEntry<ExpensifyCardSettings>): number {
-    return cardSettings?.currentBalance ?? 0;
-}
-
-type TravelSettlementAccountInfo = {
-    displayName: string;
-    last4: string;
-    bankAccountID: number;
-};
-
-/**
- * Gets the settlement account information for Travel Invoicing.
- * Returns undefined if no settlement account is configured.
- */
-function getTravelSettlementAccount(cardSettings: OnyxEntry<ExpensifyCardSettings>, bankAccountList: OnyxEntry<BankAccountList>): TravelSettlementAccountInfo | undefined {
-    if (!cardSettings?.paymentBankAccountID) {
-        return undefined;
-    }
-
-    const bankAccountID = cardSettings.paymentBankAccountID;
-    const bankAccountIDStr = bankAccountID.toString();
-    const bankAccount = bankAccountList?.[bankAccountIDStr];
-
-    // Use paymentBankAccountAddressName if available, else fallback to bank account data
-    const displayName = cardSettings.paymentBankAccountAddressName ?? bankAccount?.accountData?.addressName ?? '';
-
-    // Use paymentBankAccountNumber if available, else fallback to bank account data
-    const accountNumber = cardSettings.paymentBankAccountNumber ?? bankAccount?.accountData?.accountNumber ?? '';
-    const last4 = getLastFourDigits(accountNumber);
-
-    return {
-        displayName,
-        last4,
-        bankAccountID,
-    };
-}
-
-/**
- * Gets the settlement frequency for Travel Invoicing.
- * Returns 'daily' or 'monthly' based on whether a monthly settlement date is configured.
- */
-function getTravelSettlementFrequency(cardSettings: OnyxEntry<ExpensifyCardSettings>): string {
-    if (!cardSettings) {
-        return CONST.EXPENSIFY_CARD.FREQUENCY_SETTING.DAILY;
-    }
-    return cardSettings.monthlySettlementDate ? CONST.EXPENSIFY_CARD.FREQUENCY_SETTING.MONTHLY : CONST.EXPENSIFY_CARD.FREQUENCY_SETTING.DAILY;
-}
-
-export {getIsTravelInvoicingEnabled, hasTravelInvoicingSettlementAccount, getTravelLimit, getTravelSpend, getTravelSettlementAccount, getTravelSettlementFrequency};
-
-export type {TravelSettlementAccountInfo};
diff --git a/src/libs/Violations/ViolationsUtils.ts b/src/libs/Violations/ViolationsUtils.ts
index b6504b70a9dc..a09cc8165d7a 100644
--- a/src/libs/Violations/ViolationsUtils.ts
+++ b/src/libs/Violations/ViolationsUtils.ts
@@ -8,12 +8,11 @@ import {getDecodedCategoryName, isCategoryMissing} from '@libs/CategoryUtils';
 import * as CurrencyUtils from '@libs/CurrencyUtils';
 import DateUtils from '@libs/DateUtils';
 import {isReceiptError} from '@libs/ErrorUtils';
-import {getCurrentUserEmail} from '@libs/Network/NetworkStore';
 import Parser from '@libs/Parser';
 import {getDistanceRateCustomUnitRate, getPerDiemRateCustomUnitRate, getSortedTagKeys, isDefaultTagName, isTaxTrackingEnabled} from '@libs/PolicyUtils';
 import {isCurrentUserSubmitter} from '@libs/ReportUtils';
 import * as TransactionUtils from '@libs/TransactionUtils';
-import {hasValidModifiedAmount, isViolationDismissed, shouldShowViolation} from '@libs/TransactionUtils';
+import {isViolationDismissed, shouldShowViolation} from '@libs/TransactionUtils';
 import CONST from '@src/CONST';
 import ONYXKEYS from '@src/ONYXKEYS';
 import type {Policy, PolicyCategories, PolicyTagLists, Report, ReportAction, Transaction, TransactionViolation, ViolationName} from '@src/types/onyx';
@@ -235,9 +234,9 @@ const ViolationsUtils = {
         hasDependentTags: boolean,
         isInvoiceTransaction: boolean,
         isSelfDM?: boolean,
-        iouReport?: OnyxEntry<Report>,
+        iouReport?: OnyxEntry<Report> | null,
         isFromExpenseReport?: boolean,
-    ): OnyxUpdate<typeof ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS> {
+    ): OnyxUpdate {
         const isScanning = TransactionUtils.isScanning(updatedTransaction);
         const isScanRequest = TransactionUtils.isScanRequest(updatedTransaction);
         const isPartialTransaction = TransactionUtils.isPartial(updatedTransaction);
@@ -264,7 +263,7 @@ const ViolationsUtils = {
         const shouldShowSmartScanFailedError =
             isScanRequest &&
             updatedTransaction.receipt?.state === CONST.IOU.RECEIPT_STATE.SCAN_FAILED &&
-            TransactionUtils.hasMissingSmartscanFields(updatedTransaction, iouReport) &&
+            TransactionUtils.hasMissingSmartscanFields(updatedTransaction, iouReport ?? undefined) &&
             !hasUserStartedFixingSmartscan;
         const hasSmartScanFailedError = transactionViolations.some((violation) => violation.name === CONST.VIOLATIONS.SMARTSCAN_FAILED);
         if (shouldShowSmartScanFailedError && !hasSmartScanFailedError) {
@@ -337,7 +336,6 @@ const ViolationsUtils = {
         // const hasOverTripLimitViolation = transactionViolations.some((violation) => violation.name === CONST.VIOLATIONS.OVER_TRIP_LIMIT);
         const hasCategoryOverLimitViolation = transactionViolations.some((violation) => violation.name === CONST.VIOLATIONS.OVER_CATEGORY_LIMIT);
         const hasMissingCommentViolation = transactionViolations.some((violation) => violation.name === CONST.VIOLATIONS.MISSING_COMMENT);
-        const hasMissingAttendeesViolation = transactionViolations.some((violation) => violation.name === CONST.VIOLATIONS.MISSING_ATTENDEES);
         const hasTaxOutOfPolicyViolation = transactionViolations.some((violation) => violation.name === CONST.VIOLATIONS.TAX_OUT_OF_POLICY);
         const isDistanceRequest = TransactionUtils.isDistanceRequest(updatedTransaction);
         const isPerDiemRequest = TransactionUtils.isPerDiemRequest(updatedTransaction);
@@ -346,7 +344,7 @@ const ViolationsUtils = {
         const isTaxInPolicy = Object.keys(policy.taxRates?.taxes ?? {}).some((key) => key === updatedTransaction.taxCode);
 
         // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
-        const amount = hasValidModifiedAmount(updatedTransaction) ? Number(updatedTransaction.modifiedAmount) : updatedTransaction.amount;
+        const amount = updatedTransaction.modifiedAmount || updatedTransaction.amount;
         // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
         const currency = updatedTransaction.modifiedCurrency || updatedTransaction.currency;
         const canCalculateAmountViolations = policy.outputCurrency === currency;
@@ -386,40 +384,6 @@ const ViolationsUtils = {
         const shouldCategoryShowOverLimitViolation =
             canCalculateAmountViolations && !isInvoiceTransaction && typeof categoryOverLimit === 'number' && expenseAmount > categoryOverLimit && isControlPolicy;
         const shouldShowMissingComment = !isInvoiceTransaction && policyCategories?.[categoryName ?? '']?.areCommentsRequired && !updatedTransaction.comment?.comment && isControlPolicy;
-        const attendees = updatedTransaction.modifiedAttendees ?? updatedTransaction.comment?.attendees ?? [];
-        const isAttendeeTrackingEnabled = policy.isAttendeeTrackingEnabled ?? false;
-        // Filter out the owner/creator when checking attendance count - expense is valid if at least one non-owner attendee is present
-        const ownerAccountID = iouReport?.ownerAccountID;
-        // Calculate attendees minus owner. When ownerAccountID is known, filter by accountID.
-        // When ownerAccountID is undefined (offline split where iouReport is unavailable),
-        // fallback to using login/email to identify the owner (similar to AttendeeUtils approach).
-        let attendeesMinusOwnerCount: number;
-        if (ownerAccountID !== undefined) {
-            // Normal case: filter by accountID
-            attendeesMinusOwnerCount = attendees.filter((a) => a?.accountID !== ownerAccountID).length;
-        } else {
-            // Offline scenario: ownerAccountID unavailable, use login/email as fallback
-            const currentUserEmail = getCurrentUserEmail();
-            if (currentUserEmail) {
-                // Filter by login or email to identify owner
-                attendeesMinusOwnerCount = attendees.filter((a) => {
-                    const attendeeIdentifier = a?.login ?? a?.email;
-                    return attendeeIdentifier !== currentUserEmail;
-                }).length;
-            } else {
-                // Can't identify owner at all - if there are attendees, assume owner is one of them
-                // This means we need at least 2 attendees to have a non-owner attendee
-                attendeesMinusOwnerCount = Math.max(0, attendees.length - 1);
-            }
-        }
-
-        const shouldShowMissingAttendees =
-            !isInvoiceTransaction &&
-            isAttendeeTrackingEnabled &&
-            !!policyCategories?.[categoryName ?? '']?.areAttendeesRequired &&
-            isControlPolicy &&
-            (attendees.length === 0 || attendeesMinusOwnerCount === 0);
-
         const hasFutureDateViolation = transactionViolations.some((violation) => violation.name === 'futureDate');
         // Add 'futureDate' violation if transaction date is in the future and policy type is corporate
         if (!hasFutureDateViolation && shouldDisplayFutureDateViolation) {
@@ -502,25 +466,6 @@ const ViolationsUtils = {
             newTransactionViolations = reject(newTransactionViolations, {name: CONST.VIOLATIONS.MISSING_COMMENT});
         }
 
-        const shouldProcessMissingAttendees = !CONST.IS_ATTENDEES_REQUIRED_FEATURE_DISABLED;
-
-        if (shouldProcessMissingAttendees) {
-            if (!hasMissingAttendeesViolation && shouldShowMissingAttendees) {
-                newTransactionViolations.push({
-                    name: CONST.VIOLATIONS.MISSING_ATTENDEES,
-                    type: CONST.VIOLATION_TYPES.VIOLATION,
-                    showInReview: true,
-                });
-            }
-
-            if (hasMissingAttendeesViolation && !shouldShowMissingAttendees) {
-                newTransactionViolations = reject(newTransactionViolations, {name: CONST.VIOLATIONS.MISSING_ATTENDEES});
-            }
-        } else if (hasMissingAttendeesViolation) {
-            // Feature flag is disabled - always remove missingAttendees violations
-            newTransactionViolations = reject(newTransactionViolations, {name: CONST.VIOLATIONS.MISSING_ATTENDEES});
-        }
-
         if (isPolicyTrackTaxEnabled && !hasTaxOutOfPolicyViolation && !isTaxInPolicy) {
             newTransactionViolations.push({name: CONST.VIOLATIONS.TAX_OUT_OF_POLICY, type: CONST.VIOLATION_TYPES.VIOLATION, showInReview: true});
         }
@@ -590,8 +535,6 @@ const ViolationsUtils = {
                 return translate('violations.missingCategory');
             case 'missingComment':
                 return translate('violations.missingComment');
-            case 'missingAttendees':
-                return translate('violations.missingAttendees');
             case 'missingTag':
                 return translate('violations.missingTag', {tagName});
             case 'modifiedAmount':
@@ -651,8 +594,6 @@ const ViolationsUtils = {
                 });
             case CONST.VIOLATIONS.RECEIPT_GENERATED_WITH_AI:
                 return translate('violations.receiptGeneratedWithAI');
-            case CONST.VIOLATIONS.NO_ROUTE:
-                return translate('violations.noRoute');
             default:
                 // The interpreter should never get here because the switch cases should be exhaustive.
                 // If typescript is showing an error on the assertion below it means the switch statement is out of
@@ -724,8 +665,7 @@ const ViolationsUtils = {
             return transactionViolations.some((violation: TransactionViolation) => {
                 return (
                     !isViolationDismissed(transaction, violation, currentUserEmail, currentUserAccountID, report, policy) &&
-                    shouldShowViolation(report, policy, violation.name, currentUserEmail, true, transaction) &&
-                    (!CONST.IS_ATTENDEES_REQUIRED_FEATURE_DISABLED || violation.name !== CONST.VIOLATIONS.MISSING_ATTENDEES)
+                    shouldShowViolation(report, policy, violation.name, currentUserEmail, true, transaction)
                 );
             });
         });
diff --git a/src/libs/WorkspaceReportFieldUtils.ts b/src/libs/WorkspaceReportFieldUtils.ts
index 250d98f0d9e0..287c5ad1573f 100644
--- a/src/libs/WorkspaceReportFieldUtils.ts
+++ b/src/libs/WorkspaceReportFieldUtils.ts
@@ -1,11 +1,12 @@
 import type {FormInputErrors} from '@components/Form/types';
-import type {LocalizedTranslate} from '@components/LocaleContextProvider';
 import CONST from '@src/CONST';
 import type {TranslationPaths} from '@src/languages/types';
 import type ONYXKEYS from '@src/ONYXKEYS';
 import type {InputID} from '@src/types/form/WorkspaceReportFieldForm';
 import type {PolicyReportField, PolicyReportFieldType} from '@src/types/onyx/Policy';
 import {addErrorMessage} from './ErrorUtils';
+// eslint-disable-next-line @typescript-eslint/no-deprecated
+import {translateLocal} from './Localize';
 import {isRequiredFulfilled} from './ValidationUtils';
 
 /**
@@ -44,17 +45,19 @@ function validateReportFieldListValueName(
     priorValueName: string,
     listValues: string[],
     inputID: InputID,
-    translate: LocalizedTranslate,
 ): FormInputErrors<typeof ONYXKEYS.FORMS.WORKSPACE_REPORT_FIELDS_FORM> {
     const errors: FormInputErrors<typeof ONYXKEYS.FORMS.WORKSPACE_REPORT_FIELDS_FORM> = {};
 
     if (!isRequiredFulfilled(valueName)) {
-        errors[inputID] = translate('workspace.reportFields.listValueRequiredError');
+        // eslint-disable-next-line @typescript-eslint/no-deprecated
+        errors[inputID] = translateLocal('workspace.reportFields.listValueRequiredError');
     } else if (priorValueName !== valueName && listValues.some((currentValueName) => currentValueName === valueName)) {
-        errors[inputID] = translate('workspace.reportFields.existingListValueError');
+        // eslint-disable-next-line @typescript-eslint/no-deprecated
+        errors[inputID] = translateLocal('workspace.reportFields.existingListValueError');
     } else if ([...valueName].length > CONST.WORKSPACE_REPORT_FIELD_POLICY_MAX_LENGTH) {
         // Uses the spread syntax to count the number of Unicode code points instead of the number of UTF-16 code units.
-        addErrorMessage(errors, inputID, translate('common.error.characterLimitExceedCounter', [...valueName].length, CONST.WORKSPACE_REPORT_FIELD_POLICY_MAX_LENGTH));
+        // eslint-disable-next-line @typescript-eslint/no-deprecated
+        addErrorMessage(errors, inputID, translateLocal('common.error.characterLimitExceedCounter', [...valueName].length, CONST.WORKSPACE_REPORT_FIELD_POLICY_MAX_LENGTH));
     }
 
     return errors;
@@ -69,7 +72,7 @@ function generateFieldID(name: string) {
 /**
  * Gets the initial value for a report field.
  */
-function getReportFieldInitialValue(reportField: PolicyReportField | null, translate: LocalizedTranslate): string {
+function getReportFieldInitialValue(reportField: PolicyReportField | null): string {
     if (!reportField) {
         return '';
     }
@@ -79,7 +82,8 @@ function getReportFieldInitialValue(reportField: PolicyReportField | null, trans
     }
 
     if (reportField.type === CONST.REPORT_FIELD_TYPES.DATE) {
-        return translate('common.currentDate');
+        // eslint-disable-next-line @typescript-eslint/no-deprecated
+        return translateLocal('common.currentDate');
     }
 
     return reportField.value ?? reportField.defaultValue;
diff --git a/src/libs/actions/App.ts b/src/libs/actions/App.ts
index 237a88d0360b..25fb574c8aa3 100644
--- a/src/libs/actions/App.ts
+++ b/src/libs/actions/App.ts
@@ -270,16 +270,8 @@ function getOnyxDataForOpenOrReconnect(
     isFullReconnect = false,
     shouldKeepPublicRooms = false,
     allReportsWithDraftComments?: Record<string, string | undefined>,
-): OnyxData<
-    typeof ONYXKEYS.COLLECTION.REPORT | typeof ONYXKEYS.IS_LOADING_REPORT_DATA | typeof ONYXKEYS.HAS_LOADED_APP | typeof ONYXKEYS.IS_LOADING_APP | typeof ONYXKEYS.LAST_FULL_RECONNECT_TIME
-> {
-    const result: OnyxData<
-        | typeof ONYXKEYS.IS_LOADING_REPORT_DATA
-        | typeof ONYXKEYS.HAS_LOADED_APP
-        | typeof ONYXKEYS.IS_LOADING_APP
-        | typeof ONYXKEYS.COLLECTION.REPORT
-        | typeof ONYXKEYS.LAST_FULL_RECONNECT_TIME
-    > = {
+): OnyxData {
+    const result: OnyxData = {
         optimisticData: [
             {
                 onyxMethod: Onyx.METHOD.MERGE,
diff --git a/src/libs/actions/BankAccounts.ts b/src/libs/actions/BankAccounts.ts
index 2875cdbc4391..1133fc3b8b63 100644
--- a/src/libs/actions/BankAccounts.ts
+++ b/src/libs/actions/BankAccounts.ts
@@ -173,7 +173,7 @@ function updateAddPersonalBankAccountDraft(bankData: Partial<PersonalBankAccount
 /**
  * Helper method to build the Onyx data required during setup of a Verified Business Bank Account
  */
-function getVBBADataForOnyx(currentStep?: BankAccountStep, shouldShowLoading = true): OnyxData<typeof ONYXKEYS.REIMBURSEMENT_ACCOUNT | typeof ONYXKEYS.NVP_LAST_PAYMENT_METHOD> {
+function getVBBADataForOnyx(currentStep?: BankAccountStep, shouldShowLoading = true): OnyxData {
     return {
         optimisticData: [
             {
@@ -221,10 +221,7 @@ function addBusinessWebsiteForDraft(websiteUrl: string) {
 /**
  * Get the Onyx data required to set the last used payment method to VBBA for a given policyID
  */
-function getOnyxDataForConnectingVBBAAndLastPaymentMethod(
-    policyID: string,
-    lastPaymentMethod?: LastPaymentMethodType | string,
-): OnyxData<typeof ONYXKEYS.REIMBURSEMENT_ACCOUNT | typeof ONYXKEYS.NVP_LAST_PAYMENT_METHOD> {
+function getOnyxDataForConnectingVBBAAndLastPaymentMethod(policyID: string, lastPaymentMethod?: LastPaymentMethodType | string): OnyxData {
     const onyxData = getVBBADataForOnyx();
     const lastUsedPaymentMethod = typeof lastPaymentMethod === 'string' ? lastPaymentMethod : lastPaymentMethod?.expense?.name;
 
@@ -304,7 +301,7 @@ function addPersonalBankAccount(
         parameters.source = source;
     }
 
-    const onyxData: OnyxData<typeof ONYXKEYS.PERSONAL_BANK_ACCOUNT | typeof ONYXKEYS.USER_WALLET | typeof ONYXKEYS.NVP_LAST_PAYMENT_METHOD> = {
+    const onyxData: OnyxData = {
         optimisticData: [
             {
                 onyxMethod: Onyx.METHOD.MERGE,
@@ -393,10 +390,10 @@ function deletePaymentBankAccount(bankAccountID: number, personalPolicyID: strin
     const bankAccountFailureData = {
         ...bankAccount,
         errors: getMicroSecondOnyxErrorWithTranslationKey('bankAccount.error.deletePaymentBankAccount'),
-        pendingAction: null,
+        pendingAction: CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE,
     };
 
-    const onyxData: OnyxData<typeof ONYXKEYS.BANK_ACCOUNT_LIST | typeof ONYXKEYS.NVP_LAST_PAYMENT_METHOD> = {
+    const onyxData: OnyxData = {
         optimisticData: [
             {
                 onyxMethod: Onyx.METHOD.MERGE,
@@ -539,7 +536,7 @@ function validateBankAccount(bankAccountID: number, validateCode: string, policy
         policyID,
     };
 
-    const onyxData: OnyxData<typeof ONYXKEYS.REIMBURSEMENT_ACCOUNT> = {
+    const onyxData: OnyxData = {
         optimisticData: [
             {
                 onyxMethod: Onyx.METHOD.MERGE,
@@ -582,7 +579,7 @@ function getCorpayBankAccountFields(country: string, currency: string) {
         isBusinessBankAccount: true,
     };
 
-    const onyxData: OnyxData<typeof ONYXKEYS.CORPAY_FIELDS> = {
+    const onyxData: OnyxData = {
         optimisticData: [
             {
                 onyxMethod: Onyx.METHOD.MERGE,
@@ -627,7 +624,7 @@ function createCorpayBankAccount(fields: ReimbursementAccountForm, policyID: str
         policyID,
     };
 
-    const onyxData: OnyxData<typeof ONYXKEYS.REIMBURSEMENT_ACCOUNT> = {
+    const onyxData: OnyxData = {
         optimisticData: [
             {
                 onyxMethod: Onyx.METHOD.MERGE,
@@ -676,7 +673,7 @@ function saveCorpayOnboardingCompanyDetails(parameters: SaveCorpayOnboardingComp
         bankAccountID,
     };
 
-    const onyxData: OnyxData<typeof ONYXKEYS.REIMBURSEMENT_ACCOUNT> = {
+    const onyxData: OnyxData = {
         optimisticData: [
             {
                 onyxMethod: Onyx.METHOD.MERGE,
@@ -714,7 +711,7 @@ function saveCorpayOnboardingCompanyDetails(parameters: SaveCorpayOnboardingComp
 }
 
 function saveCorpayOnboardingBeneficialOwners(parameters: SaveCorpayOnboardingBeneficialOwnerParams) {
-    const onyxData: OnyxData<typeof ONYXKEYS.REIMBURSEMENT_ACCOUNT> = {
+    const onyxData: OnyxData = {
         optimisticData: [
             {
                 onyxMethod: Onyx.METHOD.MERGE,
@@ -752,7 +749,7 @@ function saveCorpayOnboardingBeneficialOwners(parameters: SaveCorpayOnboardingBe
 }
 
 function saveCorpayOnboardingDirectorInformation(parameters: SaveCorpayOnboardingDirectorInformationParams) {
-    const onyxData: OnyxData<typeof ONYXKEYS.REIMBURSEMENT_ACCOUNT | typeof ONYXKEYS.FORMS.ENTER_SINGER_INFO_FORM> = {
+    const onyxData: OnyxData = {
         optimisticData: [
             {
                 onyxMethod: Onyx.METHOD.MERGE,
@@ -815,7 +812,7 @@ function saveCorpayOnboardingDirectorInformation(parameters: SaveCorpayOnboardin
 }
 
 function askForCorpaySignerInformation(parameters: AskForCorpaySignerInformationParams) {
-    const onyxData: OnyxData<typeof ONYXKEYS.REIMBURSEMENT_ACCOUNT> = {
+    const onyxData: OnyxData = {
         optimisticData: [
             {
                 onyxMethod: Onyx.METHOD.MERGE,
@@ -857,7 +854,7 @@ function clearReimbursementAccount() {
 }
 
 function finishCorpayBankAccountOnboarding(parameters: FinishCorpayBankAccountOnboardingParams) {
-    const onyxData: OnyxData<typeof ONYXKEYS.REIMBURSEMENT_ACCOUNT> = {
+    const onyxData: OnyxData = {
         optimisticData: [
             {
                 onyxMethod: Onyx.METHOD.MERGE,
@@ -895,7 +892,7 @@ function finishCorpayBankAccountOnboarding(parameters: FinishCorpayBankAccountOn
 }
 
 function sendReminderForCorpaySignerInformation(parameters: SendReminderForCorpaySignerInformationParams) {
-    const onyxData: OnyxData<typeof ONYXKEYS.REIMBURSEMENT_ACCOUNT> = {
+    const onyxData: OnyxData = {
         optimisticData: [
             {
                 onyxMethod: Onyx.METHOD.MERGE,
@@ -933,7 +930,7 @@ function sendReminderForCorpaySignerInformation(parameters: SendReminderForCorpa
 }
 
 function enableGlobalReimbursementsForUSDBankAccount(parameters: EnableGlobalReimbursementsForUSDBankAccountParams) {
-    const onyxData: OnyxData<typeof ONYXKEYS.FORMS.ENABLE_GLOBAL_REIMBURSEMENTS> = {
+    const onyxData: OnyxData = {
         optimisticData: [
             {
                 onyxMethod: Onyx.METHOD.MERGE,
@@ -1014,7 +1011,7 @@ function clearReimbursementAccountSendReminderForCorpaySignerInformation() {
  * @param policyID - policy ID
  */
 function openReimbursementAccountPage(stepToOpen: ReimbursementAccountStep, subStep: ReimbursementAccountSubStep, localCurrentStep: ReimbursementAccountStep, policyID: string) {
-    const onyxData: OnyxData<typeof ONYXKEYS.REIMBURSEMENT_ACCOUNT> = {
+    const onyxData: OnyxData = {
         optimisticData: [
             {
                 onyxMethod: Onyx.METHOD.MERGE,
@@ -1254,7 +1251,7 @@ function unshareBankAccount(bankAccountID: number, ownerEmail: string) {
         ownerEmail,
     };
 
-    const onyxData: OnyxData<typeof ONYXKEYS.UNSHARE_BANK_ACCOUNT> = {
+    const onyxData: OnyxData = {
         optimisticData: [
             {
                 onyxMethod: Onyx.METHOD.MERGE,
@@ -1311,7 +1308,7 @@ function createCorpayBankAccountForWalletFlow(data: InternationalBankAccountForm
         inputs: JSON.stringify(inputData),
     };
 
-    const onyxData: OnyxData<typeof ONYXKEYS.REIMBURSEMENT_ACCOUNT> = {
+    const onyxData: OnyxData = {
         optimisticData: [
             {
                 onyxMethod: Onyx.METHOD.MERGE,
@@ -1369,7 +1366,7 @@ function shareBankAccount(bankAccountID: number, emailList: string[]) {
         emailList,
     };
 
-    const onyxData: OnyxData<typeof ONYXKEYS.SHARE_BANK_ACCOUNT> = {
+    const onyxData: OnyxData = {
         optimisticData: [
             {
                 onyxMethod: Onyx.METHOD.MERGE,
@@ -1418,21 +1415,21 @@ function getBankAccountFromID(bankAccountID: number | undefined) {
 }
 
 function openBankAccountSharePage() {
-    const optimisticData: Array<OnyxUpdate<typeof ONYXKEYS.IS_LOADING_SHARE_BANK_ACCOUNTS>> = [
+    const optimisticData: OnyxUpdate[] = [
         {
             onyxMethod: Onyx.METHOD.MERGE,
             key: ONYXKEYS.IS_LOADING_SHARE_BANK_ACCOUNTS,
             value: true,
         },
     ];
-    const successData: Array<OnyxUpdate<typeof ONYXKEYS.IS_LOADING_SHARE_BANK_ACCOUNTS>> = [
+    const successData: OnyxUpdate[] = [
         {
             onyxMethod: Onyx.METHOD.MERGE,
             key: ONYXKEYS.IS_LOADING_SHARE_BANK_ACCOUNTS,
             value: false,
         },
     ];
-    const failureData: Array<OnyxUpdate<typeof ONYXKEYS.IS_LOADING_SHARE_BANK_ACCOUNTS>> = [
+    const failureData: OnyxUpdate[] = [
         {
             onyxMethod: Onyx.METHOD.MERGE,
             key: ONYXKEYS.IS_LOADING_SHARE_BANK_ACCOUNTS,
diff --git a/src/libs/actions/Card.ts b/src/libs/actions/Card.ts
index ef6cf199ea8e..a9824e4656ed 100644
--- a/src/libs/actions/Card.ts
+++ b/src/libs/actions/Card.ts
@@ -431,8 +431,6 @@ function clearIssueNewCardFlow(policyID: string | undefined) {
     Onyx.set(`${ONYXKEYS.COLLECTION.ISSUE_NEW_EXPENSIFY_CARD}${policyID}`, {
         currentStep: null,
         data: {},
-        isSuccessful: false,
-        isLoading: false,
     });
 }
 
diff --git a/src/libs/actions/CompanyCards.ts b/src/libs/actions/CompanyCards.ts
index 3846455a42f9..818588e73b0a 100644
--- a/src/libs/actions/CompanyCards.ts
+++ b/src/libs/actions/CompanyCards.ts
@@ -154,7 +154,7 @@ function addNewCompanyCardsFeed(
 }
 
 function setWorkspaceCompanyCardFeedName(policyID: string, domainOrWorkspaceAccountID: number, bankName: CompanyCardFeed, userDefinedName: string) {
-    const onyxData: OnyxData<typeof ONYXKEYS.COLLECTION.SHARED_NVP_PRIVATE_DOMAIN_MEMBER> = {
+    const onyxData: OnyxData = {
         optimisticData: [
             {
                 onyxMethod: Onyx.METHOD.MERGE,
@@ -185,7 +185,7 @@ function setWorkspaceCompanyCardTransactionLiability(domainOrWorkspaceAccountID:
         [bankName]: {liabilityType},
     };
 
-    const onyxData: OnyxData<typeof ONYXKEYS.COLLECTION.SHARED_NVP_PRIVATE_DOMAIN_MEMBER> = {
+    const onyxData: OnyxData = {
         optimisticData: [
             {
                 onyxMethod: Onyx.METHOD.MERGE,
@@ -316,7 +316,7 @@ function assignWorkspaceCompanyCard(
     if (!data || !policy?.id) {
         return;
     }
-    const {bankName = '', email = '', encryptedCardNumber = '', startDate = '', cardName = '', cardholder, customCardName = ''} = data;
+    const {bankName = '', email = '', encryptedCardNumber = '', startDate = '', cardName = '', cardholder} = data;
     const assigneeDetails = PersonalDetailsUtils.getPersonalDetailByEmail(email);
     const optimisticCardAssignedReportAction = ReportUtils.buildOptimisticCardAssignedReportAction(assigneeDetails?.accountID ?? CONST.DEFAULT_NUMBER_ID);
 
@@ -325,12 +325,7 @@ function assignWorkspaceCompanyCard(
         feed,
         cardholder,
         cardName,
-        customCardName,
-        assignedCard: undefined,
-        isAssigned: true,
-        isCardDeleted: false,
-        encryptedCardNumber,
-        hasFailedCardAssignment: true,
+        cardNumber: encryptedCardNumber,
         pendingAction: CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD,
         errors: {
             failed: translate('workspace.companyCards.assignCardFailedError'),
@@ -341,14 +336,14 @@ function assignWorkspaceCompanyCard(
         policyID: policy.id,
         bankName,
         encryptedCardNumber,
-        cardName: customCardName,
+        cardName,
         email,
         startDate,
         reportActionID: optimisticCardAssignedReportAction.reportActionID,
     };
     const policyExpenseChat = ReportUtils.getPolicyExpenseChat(policy.ownerAccountID ?? CONST.DEFAULT_NUMBER_ID, policy.id);
 
-    const onyxData: OnyxData<typeof ONYXKEYS.COLLECTION.REPORT_ACTIONS | typeof ONYXKEYS.ASSIGN_CARD | typeof ONYXKEYS.COLLECTION.FAILED_COMPANY_CARDS_ASSIGNMENTS> = {
+    const onyxData: OnyxData = {
         optimisticData: [
             {
                 onyxMethod: Onyx.METHOD.MERGE,
@@ -369,13 +364,6 @@ function assignWorkspaceCompanyCard(
                 key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${policyExpenseChat?.reportID}`,
                 value: {[optimisticCardAssignedReportAction.reportActionID]: {pendingAction: null}},
             },
-            {
-                onyxMethod: Onyx.METHOD.MERGE,
-                key: `${ONYXKEYS.COLLECTION.FAILED_COMPANY_CARDS_ASSIGNMENTS}${domainOrWorkspaceAccountID}_${feed}`,
-                value: {
-                    [encryptedCardNumber]: null,
-                },
-            },
         ],
         failureData: [
             {
@@ -411,17 +399,13 @@ function assignWorkspaceCompanyCard(
 function unassignWorkspaceCompanyCard(domainOrWorkspaceAccountID: number, bankName: CompanyCardFeed, card: Card) {
     const cardID = card.cardID;
 
-    const onyxData: OnyxData<typeof ONYXKEYS.COLLECTION.WORKSPACE_CARDS_LIST | typeof ONYXKEYS.CARD_LIST> = {
+    const onyxData: OnyxData = {
         optimisticData: [
             {
                 onyxMethod: Onyx.METHOD.MERGE,
                 key: `${ONYXKEYS.COLLECTION.WORKSPACE_CARDS_LIST}${domainOrWorkspaceAccountID}_${bankName}`,
                 value: {
-                    [cardID]: {
-                        ...card,
-                        pendingAction: CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE,
-                        errors: null,
-                    },
+                    [cardID]: null,
                 },
             },
             {
@@ -458,7 +442,6 @@ function unassignWorkspaceCompanyCard(domainOrWorkspaceAccountID: number, bankNa
                 key: `${ONYXKEYS.COLLECTION.WORKSPACE_CARDS_LIST}${domainOrWorkspaceAccountID}_${bankName}`,
                 value: {
                     [cardID]: {
-                        ...card,
                         pendingAction: null,
                         errors: ErrorUtils.getMicroSecondOnyxErrorWithTranslationKey('common.genericErrorMessage'),
                     },
@@ -484,13 +467,13 @@ function unassignWorkspaceCompanyCard(domainOrWorkspaceAccountID: number, bankNa
     API.write(WRITE_COMMANDS.UNASSIGN_COMPANY_CARD, parameters, onyxData);
 }
 
-function resetFailedWorkspaceCompanyCardAssignment(domainOrWorkspaceAccountID: number, feed: CompanyCardFeedWithDomainID | undefined, encryptedCardNumber: string) {
+function resetFailedWorkspaceCompanyCardAssignment(domainOrWorkspaceAccountID: number, feed: CompanyCardFeedWithDomainID | undefined, cardNumber: string) {
     if (!feed) {
         return;
     }
 
     Onyx.merge(`${ONYXKEYS.COLLECTION.FAILED_COMPANY_CARDS_ASSIGNMENTS}${domainOrWorkspaceAccountID}_${feed}`, {
-        [encryptedCardNumber]: null,
+        [cardNumber]: null,
     });
 }
 
diff --git a/src/libs/actions/Delegate.ts b/src/libs/actions/Delegate.ts
index f547631bb979..76bf304b06dd 100644
--- a/src/libs/actions/Delegate.ts
+++ b/src/libs/actions/Delegate.ts
@@ -17,6 +17,7 @@ import type Credentials from '@src/types/onyx/Credentials';
 import type Response from '@src/types/onyx/Response';
 import type Session from '@src/types/onyx/Session';
 import {confirmReadyToOpenApp, openApp} from './App';
+import {getCurrentUserAccountID} from './Report';
 import updateSessionAuthTokens from './Session/updateSessionAuthTokens';
 import updateSessionUser from './Session/updateSessionUser';
 
@@ -123,6 +124,8 @@ function connect({email, delegatedAccess, credentials, session, activePolicyID,
     Onyx.set(ONYXKEYS.STASHED_CREDENTIALS, credentials ?? {});
     Onyx.set(ONYXKEYS.STASHED_SESSION, session ?? {});
 
+    const previousAccountID = getCurrentUserAccountID();
+
     const optimisticData: Array<OnyxUpdate<typeof ONYXKEYS.ACCOUNT>> = [
         {
             onyxMethod: Onyx.METHOD.MERGE,
@@ -205,7 +208,7 @@ function connect({email, delegatedAccess, credentials, session, activePolicyID,
                             newDotCurrentAccountEmail: email,
                             authToken: restrictedToken,
                             policyID,
-                            accountID: String(session?.accountID ?? CONST.DEFAULT_NUMBER_ID),
+                            accountID: String(previousAccountID),
                         });
                         return true;
                     });
@@ -362,7 +365,7 @@ function addDelegate({email, role, validateCode, delegatedAccess}: AddDelegatePa
         ];
     };
 
-    const optimisticData: Array<OnyxUpdate<typeof ONYXKEYS.ACCOUNT | typeof ONYXKEYS.VALIDATE_ACTION_CODE>> = [
+    const optimisticData: OnyxUpdate[] = [
         {
             onyxMethod: Onyx.METHOD.MERGE,
             key: ONYXKEYS.ACCOUNT,
diff --git a/src/libs/actions/Domain.ts b/src/libs/actions/Domain.ts
index 49d7618a9d06..ea7268e5d114 100644
--- a/src/libs/actions/Domain.ts
+++ b/src/libs/actions/Domain.ts
@@ -1,12 +1,11 @@
 import Onyx from 'react-native-onyx';
 import type {OnyxUpdate} from 'react-native-onyx';
 import * as API from '@libs/API';
-import type {AddAdminToDomainParams, DeleteDomainParams, RemoveDomainAdminParams, SetTechnicalContactEmailParams, ToggleConsolidatedDomainBillingParams} from '@libs/API/parameters';
+import type {AddAdminToDomainParams, RemoveDomainAdminParams, SetTechnicalContactEmailParams, ToggleConsolidatedDomainBillingParams} from '@libs/API/parameters';
 import {READ_COMMANDS, SIDE_EFFECT_REQUEST_COMMANDS, WRITE_COMMANDS} from '@libs/API/types';
 import {getMicroSecondOnyxErrorWithTranslationKey} from '@libs/ErrorUtils';
 import CONST from '@src/CONST';
 import ONYXKEYS from '@src/ONYXKEYS';
-import type {Domain} from '@src/types/onyx';
 import type PrefixedRecord from '@src/types/utils/PrefixedRecord';
 import type {ScimTokenWithState} from './ScimToken/ScimTokenUtils';
 import {ScimTokenState} from './ScimToken/ScimTokenUtils';
@@ -441,9 +440,7 @@ function clearSetPrimaryContactError(domainAccountID: number) {
 }
 
 function toggleConsolidatedDomainBilling(domainAccountID: number, domainName: string, useTechnicalContactBillingCard: boolean) {
-    const optimisticData: Array<
-        OnyxUpdate<typeof ONYXKEYS.COLLECTION.SHARED_NVP_PRIVATE_DOMAIN_MEMBER | typeof ONYXKEYS.COLLECTION.DOMAIN_PENDING_ACTIONS | typeof ONYXKEYS.COLLECTION.DOMAIN_ERRORS>
-    > = [
+    const optimisticData: OnyxUpdate[] = [
         {
             onyxMethod: Onyx.METHOD.MERGE,
             key: `${ONYXKEYS.COLLECTION.SHARED_NVP_PRIVATE_DOMAIN_MEMBER}${domainAccountID}`,
@@ -468,7 +465,7 @@ function toggleConsolidatedDomainBilling(domainAccountID: number, domainName: st
             },
         },
     ];
-    const successData: Array<OnyxUpdate<typeof ONYXKEYS.COLLECTION.DOMAIN_PENDING_ACTIONS | typeof ONYXKEYS.COLLECTION.DOMAIN_ERRORS>> = [
+    const successData: OnyxUpdate[] = [
         {
             onyxMethod: Onyx.METHOD.MERGE,
             key: `${ONYXKEYS.COLLECTION.DOMAIN_PENDING_ACTIONS}${domainAccountID}`,
@@ -484,9 +481,7 @@ function toggleConsolidatedDomainBilling(domainAccountID: number, domainName: st
             },
         },
     ];
-    const failureData: Array<
-        OnyxUpdate<typeof ONYXKEYS.COLLECTION.SHARED_NVP_PRIVATE_DOMAIN_MEMBER | typeof ONYXKEYS.COLLECTION.DOMAIN_ERRORS | typeof ONYXKEYS.COLLECTION.DOMAIN_PENDING_ACTIONS>
-    > = [
+    const failureData: OnyxUpdate[] = [
         {
             onyxMethod: Onyx.METHOD.MERGE,
             key: `${ONYXKEYS.COLLECTION.SHARED_NVP_PRIVATE_DOMAIN_MEMBER}${domainAccountID}`,
@@ -530,7 +525,7 @@ function clearToggleConsolidatedDomainBillingErrors(domainAccountID: number) {
 function addAdminToDomain(domainAccountID: number, accountID: number, targetEmail: string, domainName: string) {
     const PERMISSION_KEY = `${CONST.DOMAIN.EXPENSIFY_ADMIN_ACCESS_PREFIX}${accountID}`;
 
-    const optimisticData: Array<OnyxUpdate<typeof ONYXKEYS.COLLECTION.DOMAIN | typeof ONYXKEYS.COLLECTION.DOMAIN_PENDING_ACTIONS | typeof ONYXKEYS.COLLECTION.DOMAIN_ERRORS>> = [
+    const optimisticData: OnyxUpdate[] = [
         {
             onyxMethod: Onyx.METHOD.MERGE,
             key: `${ONYXKEYS.COLLECTION.DOMAIN}${domainAccountID}`,
@@ -562,7 +557,7 @@ function addAdminToDomain(domainAccountID: number, accountID: number, targetEmai
         },
     ];
 
-    const successData: Array<OnyxUpdate<typeof ONYXKEYS.COLLECTION.DOMAIN | typeof ONYXKEYS.COLLECTION.DOMAIN_PENDING_ACTIONS | typeof ONYXKEYS.COLLECTION.DOMAIN_ERRORS>> = [
+    const successData: OnyxUpdate[] = [
         {
             onyxMethod: Onyx.METHOD.MERGE,
             key: `${ONYXKEYS.COLLECTION.DOMAIN}${domainAccountID}`,
@@ -592,7 +587,7 @@ function addAdminToDomain(domainAccountID: number, accountID: number, targetEmai
         },
     ];
 
-    const failureData: Array<OnyxUpdate<typeof ONYXKEYS.COLLECTION.DOMAIN_PENDING_ACTIONS | typeof ONYXKEYS.COLLECTION.DOMAIN_ERRORS>> = [
+    const failureData: OnyxUpdate[] = [
         {
             onyxMethod: Onyx.METHOD.MERGE,
             key: `${ONYXKEYS.COLLECTION.DOMAIN_ERRORS}${domainAccountID}`,
@@ -627,12 +622,6 @@ function addAdminToDomain(domainAccountID: number, accountID: number, targetEmai
  * Removes an error and pending actions after trying to add admin
  */
 function clearAdminError(domainAccountID: number, accountID: number) {
-    const PERMISSION_KEY = `${CONST.DOMAIN.EXPENSIFY_ADMIN_ACCESS_PREFIX}${accountID}`;
-
-    Onyx.merge(`${ONYXKEYS.COLLECTION.DOMAIN}${domainAccountID}`, {
-        [PERMISSION_KEY]: null,
-    });
-
     Onyx.merge(`${ONYXKEYS.COLLECTION.DOMAIN_ERRORS}${domainAccountID}`, {
         adminErrors: {
             [accountID]: null,
@@ -706,82 +695,6 @@ function revokeDomainAdminAccess(domainAccountID: number, accountID: number) {
     API.write(WRITE_COMMANDS.REMOVE_DOMAIN_ADMIN, parameters, {optimisticData, successData, failureData});
 }
 
-/**
- * Removes the domain
- */
-function resetDomain(domainAccountID: number, domainName: string, domain: Domain) {
-    const optimisticData: OnyxUpdate[] = [
-        {
-            onyxMethod: Onyx.METHOD.MERGE,
-            key: `${ONYXKEYS.COLLECTION.DOMAIN_PENDING_ACTIONS}${domainAccountID}`,
-            value: {
-                pendingAction: CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE,
-            },
-        },
-        {
-            onyxMethod: Onyx.METHOD.MERGE,
-            key: `${ONYXKEYS.COLLECTION.DOMAIN}${domainAccountID}`,
-            value: null,
-        },
-    ];
-    const successData: OnyxUpdate[] = [
-        {
-            onyxMethod: Onyx.METHOD.MERGE,
-            key: `${ONYXKEYS.COLLECTION.DOMAIN_PENDING_ACTIONS}${domainAccountID}`,
-            value: {
-                pendingAction: null,
-            },
-        },
-        {
-            onyxMethod: Onyx.METHOD.MERGE,
-            key: `${ONYXKEYS.COLLECTION.DOMAIN_ERRORS}${domainAccountID}`,
-            value: {
-                errors: null,
-            },
-        },
-    ];
-    const failureData: OnyxUpdate[] = [
-        {
-            onyxMethod: Onyx.METHOD.MERGE,
-            key: `${ONYXKEYS.COLLECTION.DOMAIN}${domainAccountID}`,
-            value: domain,
-        },
-        {
-            onyxMethod: Onyx.METHOD.MERGE,
-            key: `${ONYXKEYS.COLLECTION.DOMAIN_PENDING_ACTIONS}${domainAccountID}`,
-            value: {
-                pendingAction: null,
-            },
-        },
-        {
-            onyxMethod: Onyx.METHOD.MERGE,
-            key: `${ONYXKEYS.COLLECTION.DOMAIN_ERRORS}${domainAccountID}`,
-            value: {
-                errors: getMicroSecondOnyxErrorWithTranslationKey('domain.admins.error.removeDomain'),
-            },
-        },
-    ];
-
-    const parameters: DeleteDomainParams = {
-        domainAccountID,
-        domainName,
-    };
-
-    API.write(WRITE_COMMANDS.DELETE_DOMAIN, parameters, {optimisticData, successData, failureData});
-}
-
-/**
- * Clears errors after trying to reset domain
- */
-function clearDomainErrors(domainAccountID: number) {
-    Onyx.merge(`${ONYXKEYS.COLLECTION.DOMAIN_ERRORS}${domainAccountID}`, {
-        errors: null,
-    });
-    Onyx.merge(`${ONYXKEYS.COLLECTION.DOMAIN_PENDING_ACTIONS}${domainAccountID}`, {
-        pendingAction: null,
-    });
-}
-
 export {
     getDomainValidationCode,
     validateDomain,
@@ -803,6 +716,4 @@ export {
     addAdminToDomain,
     clearAdminError,
     revokeDomainAdminAccess,
-    resetDomain,
-    clearDomainErrors,
 };
diff --git a/src/libs/actions/GPSDraftDetails.ts b/src/libs/actions/GPSDraftDetails.ts
index 17aa10935ac5..2da497ae89f6 100644
--- a/src/libs/actions/GPSDraftDetails.ts
+++ b/src/libs/actions/GPSDraftDetails.ts
@@ -1,8 +1,6 @@
 import Onyx from 'react-native-onyx';
-import type {OnyxEntry} from 'react-native-onyx';
 import ONYXKEYS from '@src/ONYXKEYS';
 import type {GpsDraftDetails} from '@src/types/onyx';
-import geodesicDistance from '@src/utils/geodesicDistance';
 
 function resetGPSDraftDetails() {
     Onyx.merge(ONYXKEYS.GPS_DRAFT_DETAILS, null);
@@ -20,14 +18,13 @@ function setEndAddress(endAddress: GpsDraftDetails['endAddress']) {
     });
 }
 
-function initGpsDraft(reportID: string) {
+function initGpsDraft() {
     Onyx.merge(ONYXKEYS.GPS_DRAFT_DETAILS, {
         gpsPoints: [],
         isTracking: true,
         distanceInMeters: 0,
         startAddress: {value: '', type: 'coordinates'},
         endAddress: {value: '', type: 'coordinates'},
-        reportID,
     });
 }
 
@@ -37,37 +34,15 @@ function setIsTracking(isTracking: boolean) {
     });
 }
 
-type GPSPoint = GpsDraftDetails['gpsPoints'][number];
-
-function addGpsPoints(gpsDraftDetails: OnyxEntry<GpsDraftDetails>, gpsPointsToAdd: GpsDraftDetails['gpsPoints']) {
-    const capturedPoints = gpsDraftDetails?.gpsPoints ?? [];
-
-    const pointsToMeasureDistanceBetween: GPSPoint[] = [capturedPoints.at(-1), ...gpsPointsToAdd].filter((val): val is GPSPoint => !!val);
-
-    let previousPoint: GPSPoint | undefined;
-    let distanceToAdd = 0;
-    for (const point of pointsToMeasureDistanceBetween) {
-        if (previousPoint === undefined) {
-            previousPoint = point;
-            continue;
-        }
-
-        const distanceBetweenPoints = geodesicDistance(point, previousPoint);
-
-        distanceToAdd += distanceBetweenPoints;
-
-        previousPoint = point;
-    }
-
-    const capturedDistance = gpsDraftDetails?.distanceInMeters ?? 0;
-
-    const updatedDistance = capturedDistance + distanceToAdd;
-
-    const updatedGpsPoints = [...capturedPoints, ...gpsPointsToAdd];
-
+/**
+ * This implementation is for testing purposes only to display the correct state of the GPS screen
+ * as if user has tracked location for some time. It will be changed in a follow-up PR to proper
+ * implementation
+ */
+// eslint-disable-next-line @typescript-eslint/no-unused-vars
+async function addGpsPoints(gpsPoints: GpsDraftDetails['gpsPoints']) {
     Onyx.merge(ONYXKEYS.GPS_DRAFT_DETAILS, {
-        gpsPoints: updatedGpsPoints,
-        distanceInMeters: updatedDistance,
+        gpsPoints: [{lat: 123.234, long: 20.23534}],
     });
 }
 
diff --git a/src/libs/actions/IOU/Duplicate.ts b/src/libs/actions/IOU/Duplicate.ts
index da8822844c31..0d52f42439a1 100644
--- a/src/libs/actions/IOU/Duplicate.ts
+++ b/src/libs/actions/IOU/Duplicate.ts
@@ -514,10 +514,6 @@ function duplicateExpenseTransaction({
             receipt: undefined,
             source: undefined,
             waypoints: transactionDetails?.waypoints as WaypointCollection | undefined,
-            type: transaction?.comment?.type,
-            count: transaction?.comment?.units?.count,
-            rate: transaction?.comment?.units?.rate,
-            unit: transaction?.comment?.units?.unit,
         },
         shouldHandleNavigation: false,
         shouldGenerateTransactionThreadReport: true,
diff --git a/src/libs/actions/IOU/MoneyRequest.ts b/src/libs/actions/IOU/MoneyRequest.ts
deleted file mode 100644
index 233f421b5e11..000000000000
--- a/src/libs/actions/IOU/MoneyRequest.ts
+++ /dev/null
@@ -1,617 +0,0 @@
-import type {OnyxCollection, OnyxEntry} from 'react-native-onyx';
-import DistanceRequestUtils from '@libs/DistanceRequestUtils';
-import getCurrentPosition from '@libs/getCurrentPosition';
-import {navigateToConfirmationPage, navigateToParticipantPage} from '@libs/IOUUtils';
-import Log from '@libs/Log';
-import Navigation from '@libs/Navigation/Navigation';
-import {getManagerMcTestParticipant, getParticipantsOption, getReportOption} from '@libs/OptionsListUtils';
-import {isPaidGroupPolicy} from '@libs/PolicyUtils';
-import {findSelfDMReportID, generateReportID, getPolicyExpenseChat} from '@libs/ReportUtils';
-import type {OptionData} from '@libs/ReportUtils';
-import {shouldRestrictUserBillableActions} from '@libs/SubscriptionUtils';
-import {getValidWaypoints} from '@libs/TransactionUtils';
-import type {ReceiptFile} from '@pages/iou/request/step/IOURequestStepScan/types';
-import {setTransactionReport} from '@userActions/Transaction';
-import type {IOUType} from '@src/CONST';
-import CONST from '@src/CONST';
-import type {TranslationParameters, TranslationPaths} from '@src/languages/types';
-import type {Route} from '@src/ROUTES';
-import ROUTES from '@src/ROUTES';
-import type {IntroSelected, LastSelectedDistanceRates, PersonalDetailsList, Policy, QuickAction, Report, Transaction, TransactionViolation} from '@src/types/onyx';
-import type {ReportAttributes, ReportAttributesDerivedValue} from '@src/types/onyx/DerivedValues';
-import type {Participant} from '@src/types/onyx/IOU';
-import type {Receipt, WaypointCollection} from '@src/types/onyx/Transaction';
-import type {GpsPoint} from './index';
-import {
-    createDistanceRequest,
-    getMoneyRequestParticipantsFromReport,
-    requestMoney,
-    resetSplitShares,
-    setCustomUnitRateID,
-    setMoneyRequestMerchant,
-    setMoneyRequestParticipants,
-    setMoneyRequestParticipantsFromReport,
-    setMoneyRequestPendingFields,
-    setMultipleMoneyRequestParticipantsFromReport,
-    trackExpense,
-} from './index';
-import {startSplitBill} from './Split';
-
-type CreateTransactionParams = {
-    transactions: Transaction[];
-    iouType: string;
-    report: OnyxEntry<Report>;
-    currentUserAccountID: number;
-    currentUserEmail?: string;
-    backToReport?: string;
-    shouldGenerateTransactionThreadReport: boolean;
-    isASAPSubmitBetaEnabled: boolean;
-    transactionViolations?: OnyxCollection<TransactionViolation[]>;
-    quickAction: OnyxEntry<QuickAction>;
-    policyRecentlyUsedCurrencies?: string[];
-    introSelected?: IntroSelected;
-    activePolicyID?: string;
-    files: ReceiptFile[];
-    participant: Participant;
-    gpsPoint?: GpsPoint;
-    policyParams?: {policy: OnyxEntry<Policy>};
-    billable?: boolean;
-    reimbursable?: boolean;
-};
-
-type InitialTransactionParams = {
-    transactionID: string;
-    reportID?: string;
-    taxCode: string;
-    taxAmount: number;
-    isFromGlobalCreate?: boolean;
-    currency?: string;
-    participants?: Participant[];
-};
-
-type MoneyRequestStepScanParticipantsFlowParams = {
-    iouType: IOUType;
-    policy: OnyxEntry<Policy>;
-    report: OnyxEntry<Report>;
-    reportID: string;
-    reportAttributesDerived?: Record<string, ReportAttributes>;
-    transactions: Transaction[];
-    initialTransaction: InitialTransactionParams;
-    personalDetails?: PersonalDetailsList;
-    currentUserLogin?: string;
-    currentUserAccountID: number;
-    backTo?: Route;
-    backToReport?: string;
-    shouldSkipConfirmation: boolean;
-    defaultExpensePolicy?: OnyxEntry<Policy> | null;
-    isArchivedExpenseReport: boolean;
-    isAutoReporting: boolean;
-    isASAPSubmitBetaEnabled: boolean;
-    transactionViolations?: OnyxCollection<TransactionViolation[]>;
-    quickAction: OnyxEntry<QuickAction>;
-    policyRecentlyUsedCurrencies?: string[];
-    introSelected?: IntroSelected;
-    activePolicyID?: string;
-    privateIsArchived?: string;
-    files: ReceiptFile[];
-    isTestTransaction?: boolean;
-    locationPermissionGranted?: boolean;
-    shouldGenerateTransactionThreadReport: boolean;
-};
-
-type MoneyRequestStepDistanceNavigationParams = {
-    iouType: IOUType;
-    policy: OnyxEntry<Policy>;
-    report: OnyxEntry<Report>;
-    reportID: string;
-    transactionID: string;
-    transaction?: Transaction;
-    reportAttributesDerived?: Record<string, ReportAttributes>;
-    personalDetails?: PersonalDetailsList;
-    waypoints?: WaypointCollection;
-    customUnitRateID: string;
-    manualDistance?: number;
-    currentUserLogin?: string;
-    currentUserAccountID: number;
-    backTo?: Route;
-    backToReport?: string;
-    shouldSkipConfirmation: boolean;
-    defaultExpensePolicy?: OnyxEntry<Policy> | null;
-    isArchivedExpenseReport: boolean;
-    isAutoReporting: boolean;
-    isASAPSubmitBetaEnabled: boolean;
-    transactionViolations?: OnyxCollection<TransactionViolation[]>;
-    lastSelectedDistanceRates?: OnyxEntry<LastSelectedDistanceRates>;
-    setDistanceRequestData?: (participants: Participant[]) => void;
-    translate: <TPath extends TranslationPaths>(path: TPath, ...parameters: TranslationParameters<TPath>) => string;
-    quickAction: OnyxEntry<QuickAction>;
-    policyRecentlyUsedCurrencies?: string[];
-    introSelected?: IntroSelected;
-    activePolicyID?: string;
-    privateIsArchived?: string;
-};
-
-function createTransaction({
-    transactions,
-    iouType,
-    report,
-    currentUserAccountID,
-    currentUserEmail,
-    backToReport,
-    shouldGenerateTransactionThreadReport,
-    isASAPSubmitBetaEnabled,
-    transactionViolations,
-    quickAction,
-    policyRecentlyUsedCurrencies,
-    introSelected,
-    activePolicyID,
-    files,
-    participant,
-    gpsPoint,
-    policyParams,
-    billable,
-    reimbursable = true,
-}: CreateTransactionParams) {
-    for (const [index, receiptFile] of files.entries()) {
-        const transaction = transactions.find((item) => item.transactionID === receiptFile.transactionID);
-        const receipt: Receipt = receiptFile.file ?? {};
-        receipt.source = receiptFile.source;
-        receipt.state = CONST.IOU.RECEIPT_STATE.SCAN_READY;
-        if (iouType === CONST.IOU.TYPE.TRACK && report) {
-            trackExpense({
-                report,
-                isDraftPolicy: false,
-                participantParams: {
-                    payeeEmail: currentUserEmail,
-                    payeeAccountID: currentUserAccountID,
-                    participant,
-                },
-                transactionParams: {
-                    amount: 0,
-                    currency: transaction?.currency ?? 'USD',
-                    created: transaction?.created,
-                    receipt,
-                    billable,
-                    reimbursable,
-                    gpsPoint,
-                },
-                ...(policyParams ?? {}),
-                shouldHandleNavigation: index === files.length - 1,
-                isASAPSubmitBetaEnabled,
-                currentUserAccountIDParam: currentUserAccountID,
-                currentUserEmailParam: currentUserEmail ?? '',
-                introSelected,
-                activePolicyID,
-                quickAction,
-            });
-        } else {
-            requestMoney({
-                report,
-                participantParams: {
-                    payeeEmail: currentUserEmail,
-                    payeeAccountID: currentUserAccountID,
-                    participant,
-                },
-                ...(policyParams ?? {}),
-                gpsPoint,
-                transactionParams: {
-                    amount: 0,
-                    attendees: transaction?.comment?.attendees,
-                    currency: transaction?.currency ?? 'USD',
-                    created: transaction?.created ?? '',
-                    merchant: '',
-                    receipt,
-                    billable,
-                    reimbursable,
-                },
-                shouldHandleNavigation: index === files.length - 1,
-                backToReport,
-                shouldGenerateTransactionThreadReport,
-                isASAPSubmitBetaEnabled,
-                currentUserAccountIDParam: currentUserAccountID,
-                currentUserEmailParam: currentUserEmail ?? '',
-                transactionViolations,
-                quickAction,
-                policyRecentlyUsedCurrencies: policyRecentlyUsedCurrencies ?? [],
-            });
-        }
-    }
-}
-
-function getMoneyRequestParticipantOptions(
-    currentUserAccountID: number,
-    report: OnyxEntry<Report>,
-    policy: OnyxEntry<Policy>,
-    personalDetails: OnyxEntry<PersonalDetailsList>,
-    privateIsArchived?: string,
-    reportAttributesDerived?: ReportAttributesDerivedValue['reports'],
-): Array<Participant | OptionData> {
-    const selectedParticipants = getMoneyRequestParticipantsFromReport(report, currentUserAccountID);
-    return selectedParticipants.map((participant) => {
-        const participantAccountID = participant?.accountID ?? CONST.DEFAULT_NUMBER_ID;
-        return participantAccountID ? getParticipantsOption(participant, personalDetails) : getReportOption(participant, privateIsArchived, policy, reportAttributesDerived);
-    });
-}
-
-function handleMoneyRequestStepScanParticipants({
-    iouType,
-    policy,
-    report,
-    reportID,
-    reportAttributesDerived,
-    transactions,
-    initialTransaction,
-    personalDetails,
-    currentUserLogin,
-    currentUserAccountID,
-    backTo,
-    backToReport,
-    shouldSkipConfirmation,
-    defaultExpensePolicy,
-    shouldGenerateTransactionThreadReport,
-    isArchivedExpenseReport,
-    isAutoReporting,
-    isASAPSubmitBetaEnabled,
-    transactionViolations,
-    quickAction,
-    policyRecentlyUsedCurrencies,
-    introSelected,
-    activePolicyID,
-    privateIsArchived,
-    files,
-    isTestTransaction = false,
-    locationPermissionGranted = false,
-}: MoneyRequestStepScanParticipantsFlowParams) {
-    if (backTo) {
-        Navigation.goBack(backTo);
-        return;
-    }
-
-    if (isTestTransaction) {
-        const managerMcTestParticipant = getManagerMcTestParticipant() ?? {};
-        let reportIDParam = managerMcTestParticipant.reportID;
-        if (!managerMcTestParticipant.reportID && report?.reportID) {
-            reportIDParam = generateReportID();
-        }
-        setMoneyRequestParticipants(
-            initialTransaction.transactionID,
-            [
-                {
-                    ...managerMcTestParticipant,
-                    reportID: reportIDParam,
-                    selected: true,
-                },
-            ],
-            true,
-        ).then(() => {
-            navigateToConfirmationPage(iouType, initialTransaction.transactionID, reportID, backToReport, true, reportIDParam);
-        });
-        return;
-    }
-
-    // If the user started this flow from using the + button in the composer inside a report
-    // the participants can be automatically assigned from the report and the user can skip the participants step and go straight
-    // to the confirmation step.
-    // If the user is started this flow using the Create expense option (combined submit/track flow), they should be redirected to the participants page.
-    if (!initialTransaction?.isFromGlobalCreate && !isArchivedExpenseReport && iouType !== CONST.IOU.TYPE.CREATE) {
-        const participants = getMoneyRequestParticipantOptions(currentUserAccountID, report, policy, personalDetails, privateIsArchived, reportAttributesDerived);
-
-        if (shouldSkipConfirmation) {
-            const firstReceiptFile = files.at(0);
-            if (iouType === CONST.IOU.TYPE.SPLIT && firstReceiptFile) {
-                const splitReceipt: Receipt = firstReceiptFile.file ?? {};
-                splitReceipt.source = firstReceiptFile.source;
-                splitReceipt.state = CONST.IOU.RECEIPT_STATE.SCAN_READY;
-                startSplitBill({
-                    participants,
-                    currentUserLogin: currentUserLogin ?? '',
-                    currentUserAccountID,
-                    comment: '',
-                    receipt: splitReceipt,
-                    existingSplitChatReportID: reportID,
-                    billable: false,
-                    category: '',
-                    tag: '',
-                    currency: initialTransaction?.currency ?? 'USD',
-                    taxCode: initialTransaction.taxCode,
-                    taxAmount: initialTransaction.taxAmount,
-                    quickAction,
-                    policyRecentlyUsedCurrencies: policyRecentlyUsedCurrencies ?? [],
-                    // No need to update recently used tags because no tags are used when the confirmation step is skipped
-                    policyRecentlyUsedTags: undefined,
-                });
-                return;
-            }
-            const participant = participants.at(0);
-            if (!participant) {
-                return;
-            }
-            if (locationPermissionGranted) {
-                getCurrentPosition(
-                    (successData) => {
-                        const policyParams = {policy};
-                        const gpsPoint = {
-                            lat: successData.coords.latitude,
-                            long: successData.coords.longitude,
-                        };
-                        createTransaction({
-                            transactions,
-                            iouType,
-                            report,
-                            currentUserAccountID,
-                            currentUserEmail: currentUserLogin,
-                            backToReport,
-                            shouldGenerateTransactionThreadReport,
-                            isASAPSubmitBetaEnabled,
-                            transactionViolations,
-                            quickAction,
-                            policyRecentlyUsedCurrencies,
-                            introSelected,
-                            activePolicyID,
-                            files,
-                            participant,
-                            gpsPoint,
-                            policyParams,
-                            billable: false,
-                            reimbursable: true,
-                        });
-                    },
-                    (errorData) => {
-                        Log.info('[IOURequestStepScan] getCurrentPosition failed', false, errorData);
-                        // When there is an error, the money can still be requested, it just won't include the GPS coordinates
-                        createTransaction({
-                            transactions,
-                            iouType,
-                            report,
-                            currentUserAccountID,
-                            currentUserEmail: currentUserLogin,
-                            backToReport,
-                            shouldGenerateTransactionThreadReport,
-                            isASAPSubmitBetaEnabled,
-                            transactionViolations,
-                            quickAction,
-                            policyRecentlyUsedCurrencies,
-                            introSelected,
-                            activePolicyID,
-                            files,
-                            participant,
-                        });
-                    },
-                );
-                return;
-            }
-            createTransaction({
-                transactions,
-                iouType,
-                report,
-                currentUserAccountID,
-                currentUserEmail: currentUserLogin,
-                backToReport,
-                shouldGenerateTransactionThreadReport,
-                isASAPSubmitBetaEnabled,
-                transactionViolations,
-                quickAction,
-                policyRecentlyUsedCurrencies,
-                introSelected,
-                activePolicyID,
-                files,
-                participant,
-            });
-            return;
-        }
-        const transactionIDs = files.map((receiptFile) => receiptFile.transactionID);
-        setMultipleMoneyRequestParticipantsFromReport(transactionIDs, report, currentUserAccountID).then(() =>
-            navigateToConfirmationPage(iouType, initialTransaction.transactionID, reportID, backToReport),
-        );
-        return;
-    }
-
-    // If there was no reportID, then that means the user started this flow from the global + menu
-    // and an optimistic reportID was generated. In that case, the next step is to select the participants for this expense.
-    if (
-        iouType === CONST.IOU.TYPE.CREATE &&
-        isPaidGroupPolicy(defaultExpensePolicy) &&
-        defaultExpensePolicy?.isPolicyExpenseChatEnabled &&
-        !shouldRestrictUserBillableActions(defaultExpensePolicy.id)
-    ) {
-        const activePolicyExpenseChat = getPolicyExpenseChat(currentUserAccountID, defaultExpensePolicy?.id);
-        const shouldAutoReport = !!defaultExpensePolicy?.autoReporting || isAutoReporting;
-        const transactionReportID = shouldAutoReport ? activePolicyExpenseChat?.reportID : CONST.REPORT.UNREPORTED_REPORT_ID;
-
-        // If the initial transaction has different participants selected that means that the user has changed the participant in the confirmation step
-        if (initialTransaction?.participants && initialTransaction?.participants?.at(0)?.reportID !== activePolicyExpenseChat?.reportID) {
-            const selfDMReportID = findSelfDMReportID();
-            const isTrackExpense = initialTransaction?.participants?.at(0)?.reportID === selfDMReportID;
-
-            const setParticipantsPromises = files.map((receiptFile) => setMoneyRequestParticipants(receiptFile.transactionID, initialTransaction?.participants));
-            Promise.all(setParticipantsPromises).then(() => {
-                if (isTrackExpense) {
-                    Navigation.navigate(ROUTES.MONEY_REQUEST_STEP_CONFIRMATION.getRoute(CONST.IOU.ACTION.CREATE, CONST.IOU.TYPE.TRACK, initialTransaction.transactionID, selfDMReportID));
-                } else {
-                    navigateToConfirmationPage(iouType, initialTransaction.transactionID, reportID, backToReport, iouType === CONST.IOU.TYPE.CREATE, initialTransaction?.reportID);
-                }
-            });
-            return;
-        }
-
-        const setParticipantsPromises = files.map((receiptFile) => {
-            setTransactionReport(receiptFile.transactionID, {reportID: transactionReportID}, true);
-            return setMoneyRequestParticipantsFromReport(receiptFile.transactionID, activePolicyExpenseChat, currentUserAccountID);
-        });
-        Promise.all(setParticipantsPromises).then(() =>
-            Navigation.navigate(
-                ROUTES.MONEY_REQUEST_STEP_CONFIRMATION.getRoute(
-                    CONST.IOU.ACTION.CREATE,
-                    iouType === CONST.IOU.TYPE.CREATE ? CONST.IOU.TYPE.SUBMIT : iouType,
-                    initialTransaction.transactionID,
-                    activePolicyExpenseChat?.reportID,
-                ),
-            ),
-        );
-    } else {
-        navigateToParticipantPage(iouType, initialTransaction.transactionID, reportID);
-    }
-}
-
-function handleMoneyRequestStepDistanceNavigation({
-    iouType,
-    report,
-    policy,
-    transaction,
-    reportID,
-    transactionID,
-    reportAttributesDerived,
-    personalDetails,
-    waypoints,
-    customUnitRateID,
-    manualDistance,
-    currentUserLogin,
-    currentUserAccountID,
-    backTo,
-    backToReport,
-    shouldSkipConfirmation,
-    defaultExpensePolicy,
-    isArchivedExpenseReport,
-    isAutoReporting,
-    isASAPSubmitBetaEnabled,
-    transactionViolations,
-    lastSelectedDistanceRates,
-    setDistanceRequestData,
-    translate,
-    quickAction,
-    policyRecentlyUsedCurrencies,
-    introSelected,
-    activePolicyID,
-    privateIsArchived,
-}: MoneyRequestStepDistanceNavigationParams) {
-    const isManualDistance = manualDistance !== undefined;
-
-    if (transaction?.splitShares && !isManualDistance) {
-        resetSplitShares(transaction);
-    }
-    if (backTo) {
-        Navigation.goBack(backTo);
-        return;
-    }
-
-    // If a reportID exists in the report object, it's because either:
-    // - The user started this flow from using the + button in the composer inside a report.
-    // - The user started this flow from using the global create menu by selecting the Track expense option.
-    // In this case, the participants can be automatically assigned from the report and the user can skip the participants step and go straight
-    // to the confirm step.
-    // If the user started this flow using the Create expense option (combined submit/track flow), they should be redirected to the participants page.
-    if (report?.reportID && !isArchivedExpenseReport && iouType !== CONST.IOU.TYPE.CREATE) {
-        const participants = getMoneyRequestParticipantOptions(currentUserAccountID, report, policy, personalDetails, privateIsArchived, reportAttributesDerived);
-
-        setDistanceRequestData?.(participants);
-        if (shouldSkipConfirmation) {
-            setMoneyRequestPendingFields(transactionID, {waypoints: CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD});
-            setMoneyRequestMerchant(transactionID, translate('iou.fieldPending'), false);
-            const participant = participants.at(0);
-            if (iouType === CONST.IOU.TYPE.TRACK && participant) {
-                trackExpense({
-                    report,
-                    isDraftPolicy: false,
-                    participantParams: {
-                        payeeEmail: currentUserLogin,
-                        payeeAccountID: currentUserAccountID,
-                        participant,
-                    },
-                    policyParams: {
-                        policy,
-                    },
-                    transactionParams: {
-                        amount: 0,
-                        distance: manualDistance,
-                        currency: transaction?.currency ?? 'USD',
-                        created: transaction?.created ?? '',
-                        merchant: translate('iou.fieldPending'),
-                        receipt: {},
-                        billable: false,
-                        reimbursable: isManualDistance ? undefined : true,
-                        validWaypoints: isManualDistance ? undefined : getValidWaypoints(waypoints, true),
-                        customUnitRateID,
-                        attendees: transaction?.comment?.attendees,
-                    },
-                    isASAPSubmitBetaEnabled,
-                    currentUserAccountIDParam: currentUserAccountID,
-                    currentUserEmailParam: currentUserLogin ?? '',
-                    introSelected,
-                    activePolicyID,
-                    quickAction,
-                });
-                return;
-            }
-            const isPolicyExpenseChat = !!participant?.isPolicyExpenseChat;
-
-            createDistanceRequest({
-                report,
-                participants,
-                currentUserLogin,
-                currentUserAccountID,
-                iouType,
-                existingTransaction: transaction,
-                transactionParams: {
-                    amount: 0,
-                    distance: manualDistance,
-                    comment: '',
-                    created: transaction?.created ?? '',
-                    currency: transaction?.currency ?? 'USD',
-                    merchant: translate('iou.fieldPending'),
-                    billable: !!policy?.defaultBillable,
-                    reimbursable: isManualDistance ? undefined : !!policy?.defaultReimbursable,
-                    validWaypoints: isManualDistance ? undefined : getValidWaypoints(waypoints, true),
-                    customUnitRateID: DistanceRequestUtils.getCustomUnitRateID({reportID: report.reportID, isPolicyExpenseChat, policy, lastSelectedDistanceRates}),
-                    splitShares: transaction?.splitShares,
-                    attendees: transaction?.comment?.attendees,
-                },
-                backToReport,
-                isASAPSubmitBetaEnabled,
-                transactionViolations,
-                quickAction,
-                policyRecentlyUsedCurrencies: policyRecentlyUsedCurrencies ?? [],
-            });
-            return;
-        }
-        setMoneyRequestParticipantsFromReport(transactionID, report, currentUserAccountID).then(() => {
-            navigateToConfirmationPage(iouType, transactionID, reportID, backToReport, false, undefined, isManualDistance);
-        });
-        return;
-    }
-
-    // If there was no reportID, then that means the user started this flow from the global menu
-    // and an optimistic reportID was generated. In that case, the next step is to select the participants for this expense.
-    if (
-        iouType === CONST.IOU.TYPE.CREATE &&
-        isPaidGroupPolicy(defaultExpensePolicy) &&
-        defaultExpensePolicy?.isPolicyExpenseChatEnabled &&
-        !shouldRestrictUserBillableActions(defaultExpensePolicy.id)
-    ) {
-        const activePolicyExpenseChat = getPolicyExpenseChat(currentUserAccountID, defaultExpensePolicy?.id);
-        const shouldAutoReport = !!defaultExpensePolicy?.autoReporting || isAutoReporting;
-        const transactionReportID = shouldAutoReport ? activePolicyExpenseChat?.reportID : CONST.REPORT.UNREPORTED_REPORT_ID;
-        const rateID = DistanceRequestUtils.getCustomUnitRateID({
-            reportID: transactionReportID,
-            isPolicyExpenseChat: true,
-            policy: defaultExpensePolicy,
-            lastSelectedDistanceRates,
-        });
-        setTransactionReport(transactionID, {reportID: transactionReportID}, true);
-        setCustomUnitRateID(transactionID, rateID);
-        setMoneyRequestParticipantsFromReport(transactionID, activePolicyExpenseChat, currentUserAccountID).then(() => {
-            Navigation.navigate(
-                ROUTES.MONEY_REQUEST_STEP_CONFIRMATION.getRoute(
-                    CONST.IOU.ACTION.CREATE,
-                    iouType === CONST.IOU.TYPE.CREATE ? CONST.IOU.TYPE.SUBMIT : iouType,
-                    transactionID,
-                    activePolicyExpenseChat?.reportID,
-                ),
-            );
-        });
-    } else {
-        navigateToParticipantPage(iouType, transactionID, reportID);
-    }
-}
-
-export {createTransaction, handleMoneyRequestStepScanParticipants, handleMoneyRequestStepDistanceNavigation};
-export type {MoneyRequestStepScanParticipantsFlowParams, MoneyRequestStepDistanceNavigationParams};
diff --git a/src/libs/actions/IOU/SendInvoice.ts b/src/libs/actions/IOU/SendInvoice.ts
index bea275ab32b4..7f4f9c34fc9f 100644
--- a/src/libs/actions/IOU/SendInvoice.ts
+++ b/src/libs/actions/IOU/SendInvoice.ts
@@ -49,18 +49,7 @@ type SendInvoiceInformation = {
     createdIOUReportActionID: string;
     createdReportActionIDForThread: string | undefined;
     reportActionID: string;
-    onyxData: OnyxData<
-        | typeof ONYXKEYS.COLLECTION.REPORT
-        | typeof ONYXKEYS.COLLECTION.REPORT_METADATA
-        | typeof ONYXKEYS.COLLECTION.TRANSACTION
-        | typeof ONYXKEYS.COLLECTION.REPORT_ACTIONS
-        | typeof ONYXKEYS.COLLECTION.POLICY_RECENTLY_USED_CATEGORIES
-        | typeof ONYXKEYS.RECENTLY_USED_CURRENCIES
-        | typeof ONYXKEYS.COLLECTION.POLICY_RECENTLY_USED_TAGS
-        | typeof ONYXKEYS.PERSONAL_DETAILS_LIST
-        | typeof ONYXKEYS.COLLECTION.POLICY
-        | typeof ONYXKEYS.COLLECTION.SNAPSHOT
-    >;
+    onyxData: OnyxData;
 };
 
 type SendInvoiceOptions = {
@@ -109,38 +98,12 @@ type BuildOnyxDataForInvoiceParams = {
 };
 
 /** Builds the Onyx data for an invoice */
-function buildOnyxDataForInvoice(
-    invoiceParams: BuildOnyxDataForInvoiceParams,
-): OnyxData<
-    | typeof ONYXKEYS.COLLECTION.REPORT
-    | typeof ONYXKEYS.COLLECTION.REPORT_METADATA
-    | typeof ONYXKEYS.COLLECTION.TRANSACTION
-    | typeof ONYXKEYS.COLLECTION.REPORT_ACTIONS
-    | typeof ONYXKEYS.COLLECTION.POLICY_RECENTLY_USED_CATEGORIES
-    | typeof ONYXKEYS.RECENTLY_USED_CURRENCIES
-    | typeof ONYXKEYS.COLLECTION.POLICY_RECENTLY_USED_TAGS
-    | typeof ONYXKEYS.PERSONAL_DETAILS_LIST
-    | typeof ONYXKEYS.COLLECTION.POLICY
-    | typeof ONYXKEYS.COLLECTION.SNAPSHOT
-> {
+function buildOnyxDataForInvoice(invoiceParams: BuildOnyxDataForInvoiceParams): [OnyxUpdate[], OnyxUpdate[], OnyxUpdate[]] {
     const {chat, iou, transactionParams, policyParams, optimisticData: optimisticDataParams, companyName, companyWebsite, participant} = invoiceParams;
     const transaction = transactionParams.transaction;
 
     const clearedPendingFields = Object.fromEntries(Object.keys(transactionParams.transaction.pendingFields ?? {}).map((key) => [key, null]));
-    const optimisticData: Array<
-        OnyxUpdate<
-            | typeof ONYXKEYS.COLLECTION.REPORT
-            | typeof ONYXKEYS.COLLECTION.REPORT_METADATA
-            | typeof ONYXKEYS.COLLECTION.TRANSACTION
-            | typeof ONYXKEYS.COLLECTION.REPORT_ACTIONS
-            | typeof ONYXKEYS.COLLECTION.POLICY_RECENTLY_USED_CATEGORIES
-            | typeof ONYXKEYS.RECENTLY_USED_CURRENCIES
-            | typeof ONYXKEYS.COLLECTION.POLICY_RECENTLY_USED_TAGS
-            | typeof ONYXKEYS.PERSONAL_DETAILS_LIST
-            | typeof ONYXKEYS.COLLECTION.POLICY
-            | typeof ONYXKEYS.COLLECTION.SNAPSHOT
-        >
-    > = [
+    const optimisticData: OnyxUpdate[] = [
         {
             onyxMethod: Onyx.METHOD.SET,
             key: `${ONYXKEYS.COLLECTION.REPORT}${iou.report?.reportID}`,
@@ -213,17 +176,7 @@ function buildOnyxDataForInvoice(
         });
     }
 
-    const successData: Array<
-        OnyxUpdate<
-            | typeof ONYXKEYS.PERSONAL_DETAILS_LIST
-            | typeof ONYXKEYS.COLLECTION.REPORT
-            | typeof ONYXKEYS.COLLECTION.REPORT_METADATA
-            | typeof ONYXKEYS.COLLECTION.TRANSACTION
-            | typeof ONYXKEYS.COLLECTION.REPORT_ACTIONS
-            | typeof ONYXKEYS.COLLECTION.POLICY
-            | typeof ONYXKEYS.COLLECTION.SNAPSHOT
-        >
-    > = [];
+    const successData: OnyxUpdate[] = [];
 
     if (chat.report) {
         optimisticData.push({
@@ -542,7 +495,7 @@ function buildOnyxDataForInvoice(
         }
     }
 
-    return {optimisticData, successData, failureData};
+    return [optimisticData, successData, failureData];
 }
 
 /**
@@ -672,7 +625,7 @@ function getSendInvoiceInformation({
         });
 
     // STEP 6: Build Onyx Data
-    const onyxData = buildOnyxDataForInvoice({
+    const [optimisticData, successData, failureData] = buildOnyxDataForInvoice({
         chat: {report: chatReport, createdAction: optimisticCreatedActionForChat, reportPreviewAction, isNewReport: isNewChatReport},
         iou: {createdAction: optimisticCreatedActionForIOUReport, action: iouAction, report: optimisticInvoiceReport},
         transactionParams: {
@@ -704,7 +657,11 @@ function getSendInvoiceInformation({
         reportPreviewReportActionID: reportPreviewAction.reportActionID,
         transactionID: optimisticTransaction.transactionID,
         transactionThreadReportID: optimisticTransactionThread.reportID,
-        onyxData,
+        onyxData: {
+            optimisticData,
+            successData,
+            failureData,
+        },
     };
 }
 
diff --git a/src/libs/actions/IOU/SendMoney.ts b/src/libs/actions/IOU/SendMoney.ts
index e6e2aa80b89c..89b3b5856170 100644
--- a/src/libs/actions/IOU/SendMoney.ts
+++ b/src/libs/actions/IOU/SendMoney.ts
@@ -31,28 +31,9 @@ import {dismissModalAndOpenReportInInboxTab} from '.';
 
 type SendMoneyParamsData = {
     params: SendMoneyParams;
-    optimisticData: Array<
-        OnyxUpdate<
-            | typeof ONYXKEYS.COLLECTION.REPORT
-            | typeof ONYXKEYS.NVP_QUICK_ACTION_GLOBAL_CREATE
-            | typeof ONYXKEYS.COLLECTION.REPORT_ACTIONS
-            | typeof ONYXKEYS.COLLECTION.TRANSACTION
-            | typeof ONYXKEYS.COLLECTION.REPORT_METADATA
-            | typeof ONYXKEYS.PERSONAL_DETAILS_LIST
-        >
-    >;
-    successData: Array<
-        OnyxUpdate<
-            | typeof ONYXKEYS.PERSONAL_DETAILS_LIST
-            | typeof ONYXKEYS.COLLECTION.REPORT
-            | typeof ONYXKEYS.COLLECTION.REPORT_METADATA
-            | typeof ONYXKEYS.COLLECTION.REPORT_ACTIONS
-            | typeof ONYXKEYS.COLLECTION.TRANSACTION
-        >
-    >;
-    failureData: Array<
-        OnyxUpdate<typeof ONYXKEYS.COLLECTION.TRANSACTION | typeof ONYXKEYS.COLLECTION.REPORT | typeof ONYXKEYS.NVP_QUICK_ACTION_GLOBAL_CREATE | typeof ONYXKEYS.COLLECTION.REPORT_ACTIONS>
-    >;
+    optimisticData: OnyxUpdate[];
+    successData: OnyxUpdate[];
+    failureData: OnyxUpdate[];
 };
 
 /**
@@ -425,6 +406,7 @@ function getSendMoneyParams({
         });
     }
 
+    // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
     const optimisticData: Array<
         OnyxUpdate<
             | typeof ONYXKEYS.COLLECTION.REPORT
diff --git a/src/libs/actions/IOU/Split.ts b/src/libs/actions/IOU/Split.ts
deleted file mode 100644
index e95036ee241a..000000000000
--- a/src/libs/actions/IOU/Split.ts
+++ /dev/null
@@ -1,1555 +0,0 @@
-import {InteractionManager} from 'react-native';
-import type {OnyxCollection, OnyxEntry, OnyxKey, OnyxUpdate} from 'react-native-onyx';
-import Onyx from 'react-native-onyx';
-import type {ValueOf} from 'type-fest';
-import type {SearchContextProps} from '@components/Search/types';
-import * as API from '@libs/API';
-import type {CompleteSplitBillParams, RevertSplitTransactionParams, SplitBillParams, SplitTransactionParams, SplitTransactionSplitsParam, StartSplitBillParams} from '@libs/API/parameters';
-import {WRITE_COMMANDS} from '@libs/API/types';
-import DateUtils from '@libs/DateUtils';
-import {getMicroSecondOnyxErrorWithTranslationKey} from '@libs/ErrorUtils';
-import {calculateAmount as calculateIOUAmount, updateIOUOwnerAndTotal} from '@libs/IOUUtils';
-import {formatPhoneNumber} from '@libs/LocalePhoneNumber';
-import isSearchTopmostFullScreenRoute from '@libs/Navigation/helpers/isSearchTopmostFullScreenRoute';
-import Navigation, {navigationRef} from '@libs/Navigation/Navigation';
-import * as NumberUtils from '@libs/NumberUtils';
-import Parser from '@libs/Parser';
-import {addSMSDomainIfPhoneNumber} from '@libs/PhoneNumber';
-import {getDistanceRateCustomUnitRate} from '@libs/PolicyUtils';
-import {getAllReportActions, getOriginalMessage, getReportAction, getReportActionHtml, getReportActionText, isMoneyRequestAction} from '@libs/ReportActionsUtils';
-import {
-    buildOptimisticChatReport,
-    buildOptimisticCreatedReportAction,
-    buildOptimisticExpenseReport,
-    buildOptimisticIOUReport,
-    buildOptimisticIOUReportAction,
-    buildOptimisticMoneyRequestEntities,
-    buildOptimisticReportPreview,
-    generateReportID,
-    getChatByParticipants,
-    getParsedComment,
-    getReportOrDraftReport,
-    getTransactionDetails,
-    hasViolations as hasViolationsReportUtils,
-    isArchivedReport,
-    isPolicyExpenseChat as isPolicyExpenseChatReportUtil,
-    shouldCreateNewMoneyRequestReport as shouldCreateNewMoneyRequestReportReportUtils,
-    updateReportPreview,
-} from '@libs/ReportUtils';
-import playSound, {SOUNDS} from '@libs/Sound';
-import {buildOptimisticTransaction, getChildTransactions, isOnHold, isPerDiemRequest as isPerDiemRequestTransactionUtils} from '@libs/TransactionUtils';
-import {buildOptimisticPolicyRecentlyUsedTags, getPolicyTagsData} from '@userActions/Policy/Tag';
-import {notifyNewAction} from '@userActions/Report';
-import {removeDraftSplitTransaction, removeDraftTransaction} from '@userActions/TransactionEdit';
-import CONST from '@src/CONST';
-import NAVIGATORS from '@src/NAVIGATORS';
-import ONYXKEYS from '@src/ONYXKEYS';
-import SCREENS from '@src/SCREENS';
-import type * as OnyxTypes from '@src/types/onyx';
-import type {Attendee, Participant, Split, SplitExpense} from '@src/types/onyx/IOU';
-import type {CurrentUserPersonalDetails} from '@src/types/onyx/PersonalDetails';
-import type RecentlyUsedTags from '@src/types/onyx/RecentlyUsedTags';
-import type ReportAction from '@src/types/onyx/ReportAction';
-import type {OnyxData} from '@src/types/onyx/Request';
-import type {SplitShares, TransactionChanges} from '@src/types/onyx/Transaction';
-import {isEmptyObject} from '@src/types/utils/EmptyObject';
-import {
-    buildMinimalTransactionForFormula,
-    buildOnyxDataForMoneyRequest,
-    createSplitsAndOnyxData,
-    dismissModalAndOpenReportInInboxTab,
-    getAllPersonalDetails,
-    getAllReports,
-    getAllTransactions,
-    getDeleteTrackExpenseInformation,
-    getMoneyRequestInformation,
-    getMoneyRequestParticipantsFromReport,
-    getOrCreateOptimisticSplitChatReport,
-    getReceiptError,
-    getReportPreviewAction,
-    getUpdateMoneyRequestParams,
-    mergePolicyRecentlyUsedCategories,
-    mergePolicyRecentlyUsedCurrencies,
-} from './index';
-import type {MoneyRequestInformationParams, OneOnOneIOUReport, StartSplitBilActionParams} from './index';
-
-type IOURequestType = ValueOf<typeof CONST.IOU.REQUEST_TYPE>;
-
-type UpdateSplitTransactionsParams = {
-    allTransactionsList: OnyxCollection<OnyxTypes.Transaction>;
-    allReportsList: OnyxCollection<OnyxTypes.Report>;
-    allReportNameValuePairsList: OnyxCollection<OnyxTypes.ReportNameValuePairs>;
-    transactionData: {
-        reportID: string;
-        originalTransactionID: string;
-        splitExpenses: SplitExpense[];
-        splitExpensesTotal?: number;
-    };
-    searchContext?: Partial<SearchContextProps>;
-    policyCategories: OnyxTypes.PolicyCategories | undefined;
-    policy: OnyxTypes.Policy | undefined;
-    policyRecentlyUsedCategories: OnyxTypes.RecentlyUsedCategories | undefined;
-    iouReport: OnyxEntry<OnyxTypes.Report>;
-    firstIOU: OnyxEntry<OnyxTypes.ReportAction> | undefined;
-    isASAPSubmitBetaEnabled: boolean;
-    currentUserPersonalDetails: CurrentUserPersonalDetails;
-    transactionViolations: OnyxCollection<OnyxTypes.TransactionViolation[]>;
-    quickAction: OnyxEntry<OnyxTypes.QuickAction>;
-    policyRecentlyUsedCurrencies: string[];
-    iouReportNextStep: OnyxEntry<OnyxTypes.ReportNextStepDeprecated>;
-};
-
-type SplitBillActionsParams = {
-    participants: Participant[];
-    currentUserLogin: string;
-    currentUserAccountID: number;
-    amount: number;
-    comment: string;
-    currency: string;
-    merchant: string;
-    created: string;
-    category?: string;
-    tag?: string;
-    billable?: boolean;
-    reimbursable?: boolean;
-    iouRequestType?: IOURequestType;
-    existingSplitChatReportID?: string;
-    splitShares?: SplitShares;
-    taxCode?: string;
-    taxAmount?: number;
-    isRetry?: boolean;
-    policyRecentlyUsedCategories?: OnyxEntry<OnyxTypes.RecentlyUsedCategories>;
-    policyRecentlyUsedTags: OnyxEntry<RecentlyUsedTags>;
-    isASAPSubmitBetaEnabled: boolean;
-    transactionViolations: OnyxCollection<OnyxTypes.TransactionViolation[]>;
-    quickAction: OnyxEntry<OnyxTypes.QuickAction>;
-    policyRecentlyUsedCurrencies: string[];
-};
-
-/**
- * @param amount - always in smallest currency unit
- * @param existingSplitChatReportID - Either a group DM or a expense chat
- */
-function splitBill({
-    participants,
-    currentUserLogin,
-    currentUserAccountID,
-    amount,
-    comment,
-    currency,
-    merchant,
-    created,
-    category = '',
-    tag = '',
-    billable = false,
-    reimbursable = false,
-    iouRequestType = CONST.IOU.REQUEST_TYPE.MANUAL,
-    existingSplitChatReportID,
-    splitShares = {},
-    taxCode = '',
-    taxAmount = 0,
-    policyRecentlyUsedCategories,
-    isASAPSubmitBetaEnabled,
-    transactionViolations,
-    quickAction,
-    policyRecentlyUsedCurrencies,
-    policyRecentlyUsedTags,
-}: SplitBillActionsParams) {
-    const parsedComment = getParsedComment(comment);
-    const {splitData, splits, onyxData} = createSplitsAndOnyxData({
-        participants,
-        currentUserLogin,
-        currentUserAccountID,
-        existingSplitChatReportID,
-        transactionParams: {
-            amount,
-            comment: parsedComment,
-            currency,
-            merchant,
-            created,
-            category,
-            tag,
-            splitShares,
-            billable,
-            reimbursable,
-            iouRequestType,
-            taxCode,
-            taxAmount,
-        },
-        policyRecentlyUsedCategories,
-        policyRecentlyUsedTags,
-        isASAPSubmitBetaEnabled,
-        transactionViolations,
-        quickAction,
-        policyRecentlyUsedCurrencies,
-    });
-
-    const parameters: SplitBillParams = {
-        reportID: splitData.chatReportID,
-        amount,
-        splits: JSON.stringify(splits),
-        currency,
-        comment: parsedComment,
-        category,
-        merchant,
-        created,
-        tag,
-        billable,
-        reimbursable,
-        transactionID: splitData.transactionID,
-        reportActionID: splitData.reportActionID,
-        createdReportActionID: splitData.createdReportActionID,
-        policyID: splitData.policyID,
-        chatType: splitData.chatType,
-        taxCode,
-        taxAmount,
-        description: parsedComment,
-    };
-
-    playSound(SOUNDS.DONE);
-    API.write(WRITE_COMMANDS.SPLIT_BILL, parameters, onyxData);
-    // eslint-disable-next-line @typescript-eslint/no-deprecated
-    InteractionManager.runAfterInteractions(() => removeDraftTransaction(CONST.IOU.OPTIMISTIC_TRANSACTION_ID));
-
-    dismissModalAndOpenReportInInboxTab(existingSplitChatReportID);
-
-    notifyNewAction(splitData.chatReportID, currentUserAccountID);
-}
-
-/**
- * @param amount - always in the smallest currency unit
- */
-function splitBillAndOpenReport({
-    participants,
-    currentUserLogin,
-    currentUserAccountID,
-    amount,
-    comment,
-    currency,
-    merchant,
-    created,
-    category = '',
-    tag = '',
-    billable = false,
-    reimbursable = false,
-    iouRequestType = CONST.IOU.REQUEST_TYPE.MANUAL,
-    splitShares = {},
-    taxCode = '',
-    taxAmount = 0,
-    existingSplitChatReportID,
-    policyRecentlyUsedCategories,
-    policyRecentlyUsedTags,
-    isASAPSubmitBetaEnabled,
-    transactionViolations,
-    quickAction,
-    policyRecentlyUsedCurrencies,
-}: SplitBillActionsParams) {
-    const parsedComment = getParsedComment(comment);
-    const {splitData, splits, onyxData} = createSplitsAndOnyxData({
-        participants,
-        currentUserLogin,
-        currentUserAccountID,
-        existingSplitChatReportID,
-        isASAPSubmitBetaEnabled,
-        transactionParams: {
-            amount,
-            comment: parsedComment,
-            currency,
-            merchant,
-            created,
-            category,
-            tag,
-            splitShares,
-            billable,
-            reimbursable,
-            iouRequestType,
-            taxCode,
-            taxAmount,
-        },
-        policyRecentlyUsedCategories,
-        policyRecentlyUsedTags,
-        transactionViolations,
-        quickAction,
-        policyRecentlyUsedCurrencies,
-    });
-
-    const parameters: SplitBillParams = {
-        reportID: splitData.chatReportID,
-        amount,
-        splits: JSON.stringify(splits),
-        currency,
-        merchant,
-        created,
-        comment: parsedComment,
-        category,
-        tag,
-        billable,
-        reimbursable,
-        transactionID: splitData.transactionID,
-        reportActionID: splitData.reportActionID,
-        createdReportActionID: splitData.createdReportActionID,
-        policyID: splitData.policyID,
-        chatType: splitData.chatType,
-        taxCode,
-        taxAmount,
-        description: parsedComment,
-    };
-
-    playSound(SOUNDS.DONE);
-    API.write(WRITE_COMMANDS.SPLIT_BILL_AND_OPEN_REPORT, parameters, onyxData);
-    // eslint-disable-next-line @typescript-eslint/no-deprecated
-    InteractionManager.runAfterInteractions(() => removeDraftTransaction(CONST.IOU.OPTIMISTIC_TRANSACTION_ID));
-
-    dismissModalAndOpenReportInInboxTab(splitData.chatReportID);
-    notifyNewAction(splitData.chatReportID, currentUserAccountID);
-}
-
-/** Used exclusively for starting a split expense request that contains a receipt, the split request will be completed once the receipt is scanned
- *  or user enters details manually.
- *
- * @param existingSplitChatReportID - Either a group DM or a expense chat
- */
-function startSplitBill({
-    participants,
-    currentUserLogin,
-    currentUserAccountID,
-    comment,
-    receipt,
-    existingSplitChatReportID,
-    billable = false,
-    reimbursable = false,
-    category = '',
-    tag = '',
-    currency,
-    taxCode = '',
-    taxAmount = 0,
-    shouldPlaySound = true,
-    policyRecentlyUsedCategories,
-    policyRecentlyUsedTags,
-    quickAction,
-    policyRecentlyUsedCurrencies,
-}: StartSplitBilActionParams) {
-    const currentUserEmailForIOUSplit = addSMSDomainIfPhoneNumber(currentUserLogin);
-    const participantAccountIDs = participants.map((participant) => Number(participant.accountID));
-    const {splitChatReport, existingSplitChatReport} = getOrCreateOptimisticSplitChatReport(existingSplitChatReportID, participants, participantAccountIDs, currentUserAccountID);
-    const isOwnPolicyExpenseChat = !!splitChatReport.isOwnPolicyExpenseChat;
-    const parsedComment = getParsedComment(comment);
-
-    // ReportID is -2 (aka "deleted") on the group transaction
-    const splitTransaction = buildOptimisticTransaction({
-        transactionParams: {
-            amount: 0,
-            currency,
-            reportID: CONST.REPORT.SPLIT_REPORT_ID,
-            comment: parsedComment,
-            merchant: CONST.TRANSACTION.PARTIAL_TRANSACTION_MERCHANT,
-            receipt,
-            category,
-            tag,
-            taxCode,
-            taxAmount,
-            billable,
-            reimbursable,
-        },
-    });
-
-    const filename = splitTransaction.receipt?.filename;
-
-    // Note: The created action must be optimistically generated before the IOU action so there's no chance that the created action appears after the IOU action in the chat
-    const splitChatCreatedReportAction = buildOptimisticCreatedReportAction(currentUserEmailForIOUSplit);
-    const splitIOUReportAction = buildOptimisticIOUReportAction({
-        type: CONST.IOU.REPORT_ACTION_TYPE.SPLIT,
-        amount: 0,
-        currency: CONST.CURRENCY.USD,
-        comment: parsedComment,
-        participants,
-        transactionID: splitTransaction.transactionID,
-        isOwnPolicyExpenseChat,
-    });
-
-    splitChatReport.lastReadTime = DateUtils.getDBTime();
-    splitChatReport.lastMessageText = getReportActionText(splitIOUReportAction);
-    splitChatReport.lastMessageHtml = getReportActionHtml(splitIOUReportAction);
-
-    // If we have an existing splitChatReport (group chat or workspace) use it's pending fields, otherwise indicate that we are adding a chat
-    if (!existingSplitChatReport) {
-        splitChatReport.pendingFields = {
-            createChat: CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD,
-        };
-    }
-
-    const optimisticData: OnyxUpdate[] = [
-        {
-            // Use set for new reports because it doesn't exist yet, is faster,
-            // and we need the data to be available when we navigate to the chat page
-            onyxMethod: existingSplitChatReport ? Onyx.METHOD.MERGE : Onyx.METHOD.SET,
-            key: `${ONYXKEYS.COLLECTION.REPORT}${splitChatReport.reportID}`,
-            value: splitChatReport,
-        },
-        {
-            onyxMethod: Onyx.METHOD.SET,
-            key: ONYXKEYS.NVP_QUICK_ACTION_GLOBAL_CREATE,
-            value: {
-                action: CONST.QUICK_ACTIONS.SPLIT_SCAN,
-                chatReportID: splitChatReport.reportID,
-                isFirstQuickAction: isEmptyObject(quickAction),
-            },
-        },
-        existingSplitChatReport
-            ? {
-                  onyxMethod: Onyx.METHOD.MERGE,
-                  key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${splitChatReport.reportID}`,
-                  value: {
-                      [splitIOUReportAction.reportActionID]: splitIOUReportAction as OnyxTypes.ReportAction,
-                  },
-              }
-            : {
-                  onyxMethod: Onyx.METHOD.SET,
-                  key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${splitChatReport.reportID}`,
-                  value: {
-                      [splitChatCreatedReportAction.reportActionID]: splitChatCreatedReportAction,
-                      [splitIOUReportAction.reportActionID]: splitIOUReportAction as OnyxTypes.ReportAction,
-                  },
-              },
-        {
-            onyxMethod: Onyx.METHOD.SET,
-            key: `${ONYXKEYS.COLLECTION.TRANSACTION}${splitTransaction.transactionID}`,
-            value: splitTransaction,
-        },
-    ];
-
-    if (!existingSplitChatReport) {
-        optimisticData.push({
-            onyxMethod: Onyx.METHOD.MERGE,
-            key: `${ONYXKEYS.COLLECTION.REPORT_METADATA}${splitChatReport.reportID}`,
-            value: {
-                isOptimisticReport: true,
-            },
-        });
-    }
-
-    const successData: Array<
-        OnyxUpdate<typeof ONYXKEYS.COLLECTION.REPORT_ACTIONS | typeof ONYXKEYS.COLLECTION.TRANSACTION | typeof ONYXKEYS.COLLECTION.REPORT_METADATA | typeof ONYXKEYS.COLLECTION.REPORT>
-    > = [
-        {
-            onyxMethod: Onyx.METHOD.MERGE,
-            key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${splitChatReport.reportID}`,
-            value: {
-                ...(existingSplitChatReport ? {} : {[splitChatCreatedReportAction.reportActionID]: {pendingAction: null}}),
-                [splitIOUReportAction.reportActionID]: {pendingAction: null},
-            },
-        },
-        {
-            onyxMethod: Onyx.METHOD.MERGE,
-            key: `${ONYXKEYS.COLLECTION.TRANSACTION}${splitTransaction.transactionID}`,
-            value: {pendingAction: null},
-        },
-    ];
-
-    if (!existingSplitChatReport) {
-        successData.push({
-            onyxMethod: Onyx.METHOD.MERGE,
-            key: `${ONYXKEYS.COLLECTION.REPORT_METADATA}${splitChatReport.reportID}`,
-            value: {
-                isOptimisticReport: false,
-            },
-        });
-    }
-
-    const redundantParticipants: Record<number, null> = {};
-    if (!existingSplitChatReport) {
-        successData.push({
-            onyxMethod: Onyx.METHOD.MERGE,
-            key: `${ONYXKEYS.COLLECTION.REPORT}${splitChatReport.reportID}`,
-            value: {pendingFields: {createChat: null}, participants: redundantParticipants},
-        });
-    }
-
-    const failureData: Array<
-        OnyxUpdate<typeof ONYXKEYS.COLLECTION.TRANSACTION | typeof ONYXKEYS.NVP_QUICK_ACTION_GLOBAL_CREATE | typeof ONYXKEYS.COLLECTION.REPORT_ACTIONS | typeof ONYXKEYS.COLLECTION.REPORT>
-    > = [
-        {
-            onyxMethod: Onyx.METHOD.MERGE,
-            key: `${ONYXKEYS.COLLECTION.TRANSACTION}${splitTransaction.transactionID}`,
-            value: {
-                errors: getMicroSecondOnyxErrorWithTranslationKey('iou.error.genericCreateFailureMessage'),
-            },
-        },
-        {
-            onyxMethod: Onyx.METHOD.SET,
-            key: ONYXKEYS.NVP_QUICK_ACTION_GLOBAL_CREATE,
-            value: quickAction ?? null,
-        },
-    ];
-
-    const retryParams = {
-        participants: participants.map(({icons, ...rest}) => rest),
-        currentUserLogin,
-        currentUserAccountID,
-        comment,
-        receipt,
-        existingSplitChatReportID,
-        billable,
-        reimbursable,
-        category,
-        tag,
-        currency,
-        taxCode,
-        taxAmount,
-        quickAction,
-        policyRecentlyUsedCurrencies,
-        policyRecentlyUsedTags,
-    };
-
-    if (existingSplitChatReport) {
-        failureData.push({
-            onyxMethod: Onyx.METHOD.MERGE,
-            key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${splitChatReport.reportID}`,
-            value: {
-                [splitIOUReportAction.reportActionID]: {
-                    errors: getReceiptError(receipt, filename, undefined, undefined, CONST.IOU.ACTION_PARAMS.START_SPLIT_BILL, retryParams),
-                },
-            },
-        });
-    } else {
-        failureData.push(
-            {
-                onyxMethod: Onyx.METHOD.MERGE,
-                key: `${ONYXKEYS.COLLECTION.REPORT}${splitChatReport.reportID}`,
-                value: {
-                    errorFields: {
-                        createChat: getMicroSecondOnyxErrorWithTranslationKey('report.genericCreateReportFailureMessage'),
-                    },
-                },
-            },
-            {
-                onyxMethod: Onyx.METHOD.MERGE,
-                key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${splitChatReport.reportID}`,
-                value: {
-                    [splitChatCreatedReportAction.reportActionID]: {
-                        errors: getMicroSecondOnyxErrorWithTranslationKey('report.genericCreateReportFailureMessage'),
-                    },
-                    [splitIOUReportAction.reportActionID]: {
-                        errors: getReceiptError(receipt, filename, undefined, undefined, CONST.IOU.ACTION_PARAMS.START_SPLIT_BILL, retryParams),
-                    },
-                },
-            },
-        );
-    }
-
-    const splits: Split[] = [{email: currentUserEmailForIOUSplit, accountID: currentUserAccountID}];
-
-    for (const participant of participants) {
-        // Disabling this line since participant.login can be an empty string
-        // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
-        const email = participant.isOwnPolicyExpenseChat ? '' : addSMSDomainIfPhoneNumber(participant.login || participant.text || '').toLowerCase();
-        const accountID = participant.isOwnPolicyExpenseChat ? 0 : Number(participant.accountID);
-        if (email === currentUserEmailForIOUSplit) {
-            continue;
-        }
-
-        // When splitting with a expense chat, we only need to supply the policyID and the workspace reportID as it's needed so we can update the report preview
-        if (participant.isOwnPolicyExpenseChat) {
-            splits.push({
-                policyID: participant.policyID,
-                chatReportID: splitChatReport.reportID,
-            });
-            continue;
-        }
-
-        const participantPersonalDetails = getAllPersonalDetails()[participant?.accountID ?? CONST.DEFAULT_NUMBER_ID];
-        if (!participantPersonalDetails) {
-            optimisticData.push({
-                onyxMethod: Onyx.METHOD.MERGE,
-                key: ONYXKEYS.PERSONAL_DETAILS_LIST,
-                value: {
-                    [accountID]: {
-                        accountID,
-                        // Disabling this line since participant.displayName can be an empty string
-                        // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
-                        displayName: formatPhoneNumber(participant.displayName || email),
-                        // Disabling this line since participant.login can be an empty string
-                        // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
-                        login: participant.login || participant.text,
-                        isOptimisticPersonalDetail: true,
-                    },
-                },
-            });
-            // BE will send different participants. We clear the optimistic ones to avoid duplicated entries
-            redundantParticipants[accountID] = null;
-        }
-
-        splits.push({
-            email,
-            accountID,
-        });
-    }
-
-    for (const participant of participants) {
-        const isPolicyExpenseChat = isPolicyExpenseChatReportUtil(participant);
-        if (!isPolicyExpenseChat) {
-            continue;
-        }
-        const optimisticPolicyRecentlyUsedCategories = mergePolicyRecentlyUsedCategories(category, policyRecentlyUsedCategories);
-        const optimisticPolicyRecentlyUsedTags = buildOptimisticPolicyRecentlyUsedTags({
-            policyTags: getPolicyTagsData(participant.policyID),
-            policyRecentlyUsedTags,
-            transactionTags: tag,
-        });
-        const optimisticRecentlyUsedCurrencies = mergePolicyRecentlyUsedCurrencies(currency, policyRecentlyUsedCurrencies);
-
-        if (optimisticPolicyRecentlyUsedCategories.length > 0) {
-            optimisticData.push({
-                onyxMethod: Onyx.METHOD.SET,
-                key: `${ONYXKEYS.COLLECTION.POLICY_RECENTLY_USED_CATEGORIES}${participant.policyID}`,
-                value: optimisticPolicyRecentlyUsedCategories,
-            });
-        }
-
-        if (optimisticRecentlyUsedCurrencies.length > 0) {
-            optimisticData.push({
-                onyxMethod: Onyx.METHOD.SET,
-                key: ONYXKEYS.RECENTLY_USED_CURRENCIES,
-                value: optimisticRecentlyUsedCurrencies,
-            });
-        }
-
-        if (!isEmptyObject(optimisticPolicyRecentlyUsedTags)) {
-            optimisticData.push({
-                onyxMethod: Onyx.METHOD.MERGE,
-                key: `${ONYXKEYS.COLLECTION.POLICY_RECENTLY_USED_TAGS}${participant.policyID}`,
-                value: optimisticPolicyRecentlyUsedTags,
-            });
-        }
-    }
-
-    // Save the new splits array into the transaction's comment in case the user calls CompleteSplitBill while offline
-    optimisticData.push({
-        onyxMethod: Onyx.METHOD.MERGE,
-        key: `${ONYXKEYS.COLLECTION.TRANSACTION}${splitTransaction.transactionID}`,
-        value: {
-            comment: {
-                splits,
-            },
-        },
-    });
-
-    const parameters: StartSplitBillParams = {
-        chatReportID: splitChatReport.reportID,
-        reportActionID: splitIOUReportAction.reportActionID,
-        transactionID: splitTransaction.transactionID,
-        splits: JSON.stringify(splits),
-        receipt,
-        comment: parsedComment,
-        category,
-        tag,
-        currency,
-        isFromGroupDM: !existingSplitChatReport,
-        billable,
-        reimbursable,
-        ...(existingSplitChatReport ? {} : {createdReportActionID: splitChatCreatedReportAction.reportActionID}),
-        chatType: splitChatReport?.chatType,
-        taxCode,
-        taxAmount,
-        description: parsedComment,
-    };
-    if (shouldPlaySound) {
-        playSound(SOUNDS.DONE);
-    }
-
-    API.write(WRITE_COMMANDS.START_SPLIT_BILL, parameters, {optimisticData, successData, failureData});
-
-    Navigation.dismissModalWithReport({reportID: splitChatReport.reportID});
-    notifyNewAction(splitChatReport.reportID, currentUserAccountID);
-
-    // Return the split transactionID for testing purpose
-    return {splitTransactionID: splitTransaction.transactionID};
-}
-
-/** Used for editing a split expense while it's still scanning or when SmartScan fails, it completes a split expense started by startSplitBill above.
- *
- * @param chatReportID - The group chat or workspace reportID
- * @param reportAction - The split action that lives in the chatReport above
- * @param updatedTransaction - The updated **draft** split transaction
- * @param sessionAccountID - accountID of the current user
- * @param sessionEmail - email of the current user
- */
-function completeSplitBill(
-    chatReportID: string,
-    reportAction: OnyxEntry<OnyxTypes.ReportAction>,
-    updatedTransaction: OnyxEntry<OnyxTypes.Transaction>,
-    sessionAccountID: number,
-    isASAPSubmitBetaEnabled: boolean,
-    quickAction: OnyxEntry<OnyxTypes.QuickAction>,
-    transactionViolations: OnyxCollection<OnyxTypes.TransactionViolation[]>,
-    sessionEmail?: string,
-) {
-    if (!reportAction) {
-        return;
-    }
-
-    const parsedComment = getParsedComment(Parser.htmlToMarkdown(updatedTransaction?.comment?.comment ?? ''));
-    if (updatedTransaction?.comment) {
-        // eslint-disable-next-line no-param-reassign
-        updatedTransaction.comment.comment = parsedComment;
-    }
-    const currentUserEmailForIOUSplit = addSMSDomainIfPhoneNumber(sessionEmail);
-    const transactionID = updatedTransaction?.transactionID;
-    const unmodifiedTransaction = getAllTransactions()[`${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`];
-
-    // Save optimistic updated transaction and action
-    const optimisticData: OnyxUpdate[] = [
-        {
-            onyxMethod: Onyx.METHOD.MERGE,
-            key: `${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`,
-            value: {
-                ...updatedTransaction,
-                receipt: {
-                    state: CONST.IOU.RECEIPT_STATE.OPEN,
-                },
-            },
-        },
-        {
-            onyxMethod: Onyx.METHOD.MERGE,
-            key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${chatReportID}`,
-            value: {
-                [reportAction.reportActionID]: {
-                    lastModified: DateUtils.getDBTime(),
-                    originalMessage: {
-                        whisperedTo: [],
-                    },
-                },
-            },
-        },
-    ];
-
-    const successData: OnyxUpdate[] = [
-        {
-            onyxMethod: Onyx.METHOD.MERGE,
-            key: `${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`,
-            value: {pendingAction: null},
-        },
-        {
-            onyxMethod: Onyx.METHOD.MERGE,
-            key: `${ONYXKEYS.COLLECTION.SPLIT_TRANSACTION_DRAFT}${transactionID}`,
-            value: {pendingAction: null},
-        },
-    ];
-
-    const failureData: OnyxUpdate[] = [
-        {
-            onyxMethod: Onyx.METHOD.MERGE,
-            key: `${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`,
-            value: {
-                ...unmodifiedTransaction,
-                errors: getMicroSecondOnyxErrorWithTranslationKey('iou.error.genericCreateFailureMessage'),
-            },
-        },
-        {
-            onyxMethod: Onyx.METHOD.MERGE,
-            key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${chatReportID}`,
-            value: {
-                [reportAction.reportActionID]: {
-                    ...reportAction,
-                    errors: getMicroSecondOnyxErrorWithTranslationKey('iou.error.genericCreateFailureMessage'),
-                },
-            },
-        },
-    ];
-
-    const splitParticipants: Split[] = updatedTransaction?.comment?.splits ?? [];
-    const amount = Number(updatedTransaction?.modifiedAmount);
-    const currency = updatedTransaction?.modifiedCurrency;
-
-    // Exclude the current user when calculating the split amount, `calculateAmount` takes it into account
-    const splitAmount = calculateIOUAmount(splitParticipants.length - 1, amount ?? 0, currency ?? '', false);
-    const splitTaxAmount = calculateIOUAmount(splitParticipants.length - 1, updatedTransaction?.taxAmount ?? 0, currency ?? '', false);
-
-    const splits: Split[] = [{email: currentUserEmailForIOUSplit}];
-    for (const participant of splitParticipants) {
-        // Skip creating the transaction for the current user
-        if (participant.email === currentUserEmailForIOUSplit) {
-            continue;
-        }
-        const isPolicyExpenseChat = !!participant.policyID;
-
-        if (!isPolicyExpenseChat) {
-            // In case this is still the optimistic accountID saved in the splits array, return early as we cannot know
-            // if there is an existing chat between the split creator and this participant
-            // Instead, we will rely on Auth generating the report IDs and the user won't see any optimistic chats or reports created
-            const participantPersonalDetails: OnyxTypes.PersonalDetails | null = getAllPersonalDetails()[participant?.accountID ?? CONST.DEFAULT_NUMBER_ID];
-            if (!participantPersonalDetails || participantPersonalDetails.isOptimisticPersonalDetail) {
-                splits.push({
-                    email: participant.email,
-                });
-                continue;
-            }
-        }
-
-        let oneOnOneChatReport: OnyxEntry<OnyxTypes.Report>;
-        let isNewOneOnOneChatReport = false;
-        if (isPolicyExpenseChat) {
-            // The expense chat reportID is saved in the splits array when starting a split expense with a workspace
-            oneOnOneChatReport = getAllReports()?.[`${ONYXKEYS.COLLECTION.REPORT}${participant.chatReportID}`];
-        } else {
-            const existingChatReport = getChatByParticipants(participant.accountID ? [participant.accountID, sessionAccountID] : []);
-            isNewOneOnOneChatReport = !existingChatReport;
-            oneOnOneChatReport =
-                existingChatReport ??
-                buildOptimisticChatReport({
-                    participantList: participant.accountID ? [participant.accountID, sessionAccountID] : [],
-                });
-        }
-
-        let oneOnOneIOUReport: OneOnOneIOUReport = oneOnOneChatReport?.iouReportID ? getAllReports()?.[`${ONYXKEYS.COLLECTION.REPORT}${oneOnOneChatReport.iouReportID}`] : null;
-        const shouldCreateNewOneOnOneIOUReport = shouldCreateNewMoneyRequestReportReportUtils(oneOnOneIOUReport, oneOnOneChatReport, false);
-
-        // Generate IDs upfront so we can pass them to buildOptimisticExpenseReport for formula computation
-        const optimisticTransactionID = NumberUtils.rand64();
-        const optimisticExpenseReportID = generateReportID();
-
-        if (!oneOnOneIOUReport || shouldCreateNewOneOnOneIOUReport) {
-            const reportTransactions = buildMinimalTransactionForFormula(
-                optimisticTransactionID,
-                optimisticExpenseReportID,
-                updatedTransaction?.modifiedCreated,
-                splitAmount,
-                currency ?? '',
-                updatedTransaction?.modifiedMerchant,
-            );
-
-            oneOnOneIOUReport = isPolicyExpenseChat
-                ? buildOptimisticExpenseReport(
-                      oneOnOneChatReport?.reportID,
-                      participant.policyID,
-                      sessionAccountID,
-                      splitAmount,
-                      currency ?? '',
-                      undefined,
-                      undefined,
-                      optimisticExpenseReportID,
-                      reportTransactions,
-                  )
-                : buildOptimisticIOUReport(sessionAccountID, participant.accountID ?? CONST.DEFAULT_NUMBER_ID, splitAmount, oneOnOneChatReport?.reportID, currency ?? '');
-        } else if (isPolicyExpenseChat) {
-            if (typeof oneOnOneIOUReport?.total === 'number') {
-                // Because of the Expense reports are stored as negative values, we subtract the total from the amount
-                oneOnOneIOUReport.total -= splitAmount;
-            }
-        } else {
-            oneOnOneIOUReport = updateIOUOwnerAndTotal(oneOnOneIOUReport, sessionAccountID, splitAmount, currency ?? '');
-        }
-
-        const oneOnOneTransaction = buildOptimisticTransaction({
-            existingTransactionID: optimisticTransactionID,
-            originalTransactionID: transactionID,
-            transactionParams: {
-                amount: isPolicyExpenseChat ? -splitAmount : splitAmount,
-                currency: currency ?? '',
-                reportID: oneOnOneIOUReport?.reportID,
-                comment: parsedComment,
-                created: updatedTransaction?.modifiedCreated,
-                merchant: updatedTransaction?.modifiedMerchant,
-                receipt: {...updatedTransaction?.receipt, state: CONST.IOU.RECEIPT_STATE.OPEN},
-                category: updatedTransaction?.category,
-                tag: updatedTransaction?.tag,
-                taxCode: updatedTransaction?.taxCode,
-                taxAmount: isPolicyExpenseChat ? -splitTaxAmount : splitAmount,
-                billable: updatedTransaction?.billable,
-                reimbursable: updatedTransaction?.reimbursable,
-                source: CONST.IOU.TYPE.SPLIT,
-                filename: updatedTransaction?.receipt?.filename,
-            },
-        });
-        oneOnOneIOUReport.transactionCount = (oneOnOneIOUReport.transactionCount ?? 0) + 1;
-
-        const [oneOnOneCreatedActionForChat, oneOnOneCreatedActionForIOU, oneOnOneIOUAction, optimisticTransactionThread, optimisticCreatedActionForTransactionThread] =
-            buildOptimisticMoneyRequestEntities({
-                iouReport: oneOnOneIOUReport,
-                type: CONST.IOU.REPORT_ACTION_TYPE.CREATE,
-                amount: splitAmount,
-                currency: currency ?? '',
-                comment: parsedComment,
-                payeeEmail: currentUserEmailForIOUSplit,
-                participants: [participant],
-                transactionID: oneOnOneTransaction.transactionID,
-            });
-
-        let oneOnOneReportPreviewAction = getReportPreviewAction(oneOnOneChatReport?.reportID, oneOnOneIOUReport?.reportID);
-        if (oneOnOneReportPreviewAction) {
-            oneOnOneReportPreviewAction = updateReportPreview(oneOnOneIOUReport, oneOnOneReportPreviewAction);
-        } else {
-            oneOnOneReportPreviewAction = buildOptimisticReportPreview(oneOnOneChatReport, oneOnOneIOUReport, '', oneOnOneTransaction);
-        }
-        const hasViolations = hasViolationsReportUtils(oneOnOneIOUReport.reportID, transactionViolations, sessionAccountID, sessionEmail ?? '');
-
-        const [oneOnOneOptimisticData, oneOnOneSuccessData, oneOnOneFailureData] = buildOnyxDataForMoneyRequest({
-            isNewChatReport: isNewOneOnOneChatReport,
-            isOneOnOneSplit: true,
-            shouldCreateNewMoneyRequestReport: shouldCreateNewOneOnOneIOUReport,
-            isASAPSubmitBetaEnabled,
-            currentUserAccountIDParam: sessionAccountID,
-            currentUserEmailParam: sessionEmail ?? '',
-            hasViolations,
-            optimisticParams: {
-                chat: {
-                    report: oneOnOneChatReport,
-                    createdAction: oneOnOneCreatedActionForChat,
-                    reportPreviewAction: oneOnOneReportPreviewAction,
-                },
-                iou: {
-                    report: oneOnOneIOUReport,
-                    createdAction: oneOnOneCreatedActionForIOU,
-                    action: oneOnOneIOUAction,
-                },
-                transactionParams: {
-                    transaction: oneOnOneTransaction,
-                    transactionThreadReport: optimisticTransactionThread,
-                    transactionThreadCreatedReportAction: optimisticCreatedActionForTransactionThread,
-                },
-                policyRecentlyUsed: {},
-            },
-            quickAction,
-        });
-
-        splits.push({
-            email: participant.email,
-            accountID: participant.accountID,
-            policyID: participant.policyID,
-            iouReportID: oneOnOneIOUReport?.reportID,
-            chatReportID: oneOnOneChatReport?.reportID,
-            transactionID: oneOnOneTransaction.transactionID,
-            reportActionID: oneOnOneIOUAction.reportActionID,
-            createdChatReportActionID: oneOnOneCreatedActionForChat.reportActionID,
-            createdIOUReportActionID: oneOnOneCreatedActionForIOU.reportActionID,
-            reportPreviewReportActionID: oneOnOneReportPreviewAction.reportActionID,
-            transactionThreadReportID: optimisticTransactionThread.reportID,
-            createdReportActionIDForThread: optimisticCreatedActionForTransactionThread?.reportActionID,
-        });
-
-        optimisticData.push(...oneOnOneOptimisticData);
-        successData.push(...oneOnOneSuccessData);
-        failureData.push(...oneOnOneFailureData);
-    }
-
-    const {
-        amount: transactionAmount,
-        currency: transactionCurrency,
-        created: transactionCreated,
-        merchant: transactionMerchant,
-        comment: transactionComment,
-        category: transactionCategory,
-        tag: transactionTag,
-        taxCode: transactionTaxCode,
-        taxAmount: transactionTaxAmount,
-        billable: transactionBillable,
-        reimbursable: transactionReimbursable,
-    } = getTransactionDetails(updatedTransaction) ?? {};
-
-    const parameters: CompleteSplitBillParams = {
-        transactionID,
-        amount: transactionAmount,
-        currency: transactionCurrency,
-        created: transactionCreated,
-        merchant: transactionMerchant,
-        comment: transactionComment,
-        category: transactionCategory,
-        tag: transactionTag,
-        splits: JSON.stringify(splits),
-        taxCode: transactionTaxCode,
-        taxAmount: transactionTaxAmount,
-        billable: transactionBillable,
-        reimbursable: transactionReimbursable,
-        description: parsedComment,
-    };
-
-    playSound(SOUNDS.DONE);
-    API.write(WRITE_COMMANDS.COMPLETE_SPLIT_BILL, parameters, {optimisticData, successData, failureData});
-    // eslint-disable-next-line @typescript-eslint/no-deprecated
-    InteractionManager.runAfterInteractions(() => removeDraftTransaction(CONST.IOU.OPTIMISTIC_TRANSACTION_ID));
-    dismissModalAndOpenReportInInboxTab(chatReportID);
-    notifyNewAction(chatReportID, sessionAccountID);
-}
-
-function updateSplitTransactions({
-    allTransactionsList,
-    allReportsList,
-    allReportNameValuePairsList,
-    transactionData,
-    searchContext,
-    policyCategories,
-    policy,
-    policyRecentlyUsedCategories,
-    iouReport,
-    firstIOU,
-    isASAPSubmitBetaEnabled,
-    currentUserPersonalDetails,
-    transactionViolations,
-    quickAction,
-    policyRecentlyUsedCurrencies,
-    iouReportNextStep,
-}: UpdateSplitTransactionsParams) {
-    const transactionReport = getReportOrDraftReport(transactionData?.reportID);
-    const parentTransactionReport = getReportOrDraftReport(transactionReport?.parentReportID);
-    const expenseReport = transactionReport?.type === CONST.REPORT.TYPE.EXPENSE ? transactionReport : parentTransactionReport;
-
-    const originalTransactionID = transactionData?.originalTransactionID ?? CONST.IOU.OPTIMISTIC_TRANSACTION_ID;
-    const originalTransaction = allTransactionsList?.[`${ONYXKEYS.COLLECTION.TRANSACTION}${originalTransactionID}`];
-    const originalTransactionDetails = getTransactionDetails(originalTransaction);
-
-    const policyTags = getPolicyTagsData(expenseReport?.policyID);
-    const participants = getMoneyRequestParticipantsFromReport(expenseReport, currentUserPersonalDetails.accountID);
-    const splitExpenses = transactionData?.splitExpenses ?? [];
-
-    // Get all children once (including orphaned), then filter for non-orphaned
-    const allChildTransactions = getChildTransactions(allTransactionsList, allReportsList, originalTransactionID, true);
-    const originalChildTransactions = allChildTransactions.filter((tx) => tx?.reportID !== CONST.REPORT.UNREPORTED_REPORT_ID);
-    const processedChildTransactionIDs: string[] = [];
-
-    const splitExpensesTotal = transactionData?.splitExpensesTotal ?? 0;
-
-    const isCreationOfSplits = originalChildTransactions.length === 0;
-    const hasEditableSplitExpensesLeft = splitExpenses.some((expense) => (expense.statusNum ?? 0) < CONST.REPORT.STATUS_NUM.SUBMITTED);
-    // Don't revert split if there are orphaned children (reportID '0') - they're still part of the split
-    const isReverseSplitOperation =
-        splitExpenses.length === 1 && originalChildTransactions.length > 0 && hasEditableSplitExpensesLeft && allChildTransactions.length === originalChildTransactions.length;
-
-    let changesInReportTotal = 0;
-    // Validate custom unit rate before proceeding with split
-    const customUnitRateID = originalTransaction?.comment?.customUnit?.customUnitRateID;
-    const isPerDiem = isPerDiemRequestTransactionUtils(originalTransaction);
-
-    if (customUnitRateID && policy && !isPerDiem) {
-        const customUnitRate = getDistanceRateCustomUnitRate(policy, customUnitRateID);
-
-        // If the rate doesn't exist or is disabled, show an error and return early
-        if (!customUnitRate || !customUnitRate.enabled) {
-            // Show error to user
-            Onyx.merge(`${ONYXKEYS.COLLECTION.SPLIT_TRANSACTION_DRAFT}${originalTransactionID}`, {
-                errors: getMicroSecondOnyxErrorWithTranslationKey('iou.error.invalidRate'),
-            });
-            return;
-        }
-    }
-
-    const splits: SplitTransactionSplitsParam =
-        splitExpenses.map((split) => {
-            const currentDescription = getParsedComment(Parser.htmlToMarkdown(split.description ?? ''));
-            changesInReportTotal += split.amount;
-            return {
-                amount: split.amount,
-                category: split.category ?? '',
-                tag: split.tags?.[0] ?? '',
-                created: split.created,
-                merchant: split?.merchant ?? '',
-                transactionID: split.transactionID,
-                comment: {
-                    comment: currentDescription,
-                },
-                reimbursable: split?.reimbursable,
-            };
-        }) ?? [];
-    changesInReportTotal -= splitExpensesTotal;
-
-    const successData = [] as OnyxUpdate[];
-    const failureData = [] as OnyxUpdate[];
-    const optimisticData = [] as OnyxUpdate[];
-
-    // The split transactions can be in different reports, so we need to calculate the total for each report.
-    const reportTotals = new Map<string, number>();
-    const expenseReportID = expenseReport?.reportID;
-
-    if (expenseReportID) {
-        const expenseReportKey = `${ONYXKEYS.COLLECTION.REPORT}${expenseReportID}`;
-        const expenseReportTotal = allReportsList?.[expenseReportKey]?.total ?? expenseReport?.total ?? 0;
-        reportTotals.set(expenseReportID, expenseReportTotal - changesInReportTotal);
-    }
-
-    for (const expense of splitExpenses) {
-        const splitExpenseReportID = expense.reportID;
-        if (!splitExpenseReportID || reportTotals.has(splitExpenseReportID)) {
-            continue;
-        }
-
-        const splitExpenseReport = allReportsList?.[`${ONYXKEYS.COLLECTION.REPORT}${splitExpenseReportID}`];
-        reportTotals.set(splitExpenseReportID, splitExpenseReport?.total ?? 0);
-    }
-
-    for (const [index, splitExpense] of splitExpenses.entries()) {
-        const existingTransactionID = isReverseSplitOperation ? originalTransactionID : splitExpense.transactionID;
-        const splitTransaction = allTransactionsList?.[`${ONYXKEYS.COLLECTION.TRANSACTION}${existingTransactionID}`];
-        if (splitTransaction) {
-            processedChildTransactionIDs.push(splitTransaction.transactionID);
-        }
-
-        const splitReportActions = getAllReportActions(isReverseSplitOperation ? expenseReport?.reportID : splitTransaction?.reportID);
-        const currentReportAction = Object.values(splitReportActions).find((action) => {
-            const transactionID = isMoneyRequestAction(action) ? (getOriginalMessage(action)?.IOUTransactionID ?? CONST.DEFAULT_NUMBER_ID) : CONST.DEFAULT_NUMBER_ID;
-            return transactionID === existingTransactionID;
-        });
-
-        const requestMoneyInformation = {
-            participantParams: {
-                participant: participants.at(0) ?? ({} as Participant),
-                payeeEmail: currentUserPersonalDetails?.login ?? '',
-                payeeAccountID: currentUserPersonalDetails?.accountID ?? CONST.DEFAULT_NUMBER_ID,
-            },
-            policyParams: {
-                policy,
-                policyCategories,
-                policyTags,
-            },
-            transactionParams: {
-                amount: Math.abs(originalTransaction?.amount ?? 0),
-                modifiedAmount: splitExpense.amount ?? 0,
-                currency: originalTransactionDetails?.currency ?? CONST.CURRENCY.USD,
-                created: splitExpense.created,
-                merchant: splitExpense.merchant ?? '',
-                comment: splitExpense.description,
-                category: splitExpense.category,
-                tag: splitExpense.tags?.[0],
-                originalTransactionID,
-                attendees: originalTransactionDetails?.attendees,
-                source: CONST.IOU.TYPE.SPLIT,
-                linkedTrackedExpenseReportAction: currentReportAction,
-                pendingAction: splitTransaction ? null : CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD,
-                pendingFields: splitTransaction ? splitTransaction.pendingFields : undefined,
-                reimbursable: originalTransactionDetails?.reimbursable,
-                taxCode: originalTransactionDetails?.taxCode,
-                taxAmount: calculateIOUAmount(splitExpenses.length - 1, originalTransactionDetails?.taxAmount ?? 0, originalTransactionDetails?.currency ?? CONST.CURRENCY.USD, false),
-                billable: originalTransactionDetails?.billable,
-            },
-            parentChatReport: getReportOrDraftReport(getReportOrDraftReport(expenseReport?.chatReportID)?.parentReportID),
-            existingTransaction: originalTransaction,
-            isASAPSubmitBetaEnabled,
-            currentUserAccountIDParam: currentUserPersonalDetails?.accountID,
-            currentUserEmailParam: currentUserPersonalDetails?.login ?? '',
-            transactionViolations,
-            quickAction,
-            policyRecentlyUsedCurrencies,
-        } as MoneyRequestInformationParams;
-
-        if (isReverseSplitOperation) {
-            requestMoneyInformation.transactionParams = {
-                amount: splitExpense.amount ?? 0,
-                currency: originalTransactionDetails?.currency ?? CONST.CURRENCY.USD,
-                created: splitExpense.created,
-                merchant: splitExpense.merchant ?? '',
-                comment: splitExpense.description,
-                category: splitExpense.category,
-                tag: splitExpense.tags?.[0],
-                attendees: originalTransactionDetails?.attendees as Attendee[],
-                linkedTrackedExpenseReportAction: currentReportAction,
-                taxCode: originalTransactionDetails?.taxCode,
-                taxAmount: calculateIOUAmount(splitExpenses.length - 1, originalTransactionDetails?.taxAmount ?? 0, originalTransactionDetails?.currency ?? CONST.CURRENCY.USD, false),
-                billable: originalTransactionDetails?.billable,
-            };
-            requestMoneyInformation.existingTransaction = undefined;
-        }
-
-        const {participantParams, policyParams, transactionParams, parentChatReport, existingTransaction} = requestMoneyInformation;
-        const parsedComment = getParsedComment(Parser.htmlToMarkdown(transactionParams.comment ?? ''));
-        transactionParams.comment = parsedComment;
-
-        const {transactionThreadReportID, createdReportActionIDForThread, onyxData, iouAction} = getMoneyRequestInformation({
-            participantParams,
-            parentChatReport,
-            policyParams,
-            transactionParams,
-            moneyRequestReportID: splitExpense?.reportID,
-            existingTransaction,
-            existingTransactionID,
-            newReportTotal: reportTotals.get(splitExpense?.reportID ?? String(CONST.DEFAULT_NUMBER_ID)) ?? 0,
-            newNonReimbursableTotal: (transactionReport?.nonReimbursableTotal ?? 0) - changesInReportTotal,
-            isSplitExpense: true,
-            currentReportActionID: currentReportAction?.reportActionID,
-            isASAPSubmitBetaEnabled,
-            currentUserAccountIDParam: currentUserPersonalDetails?.accountID,
-            currentUserEmailParam: currentUserPersonalDetails?.login ?? '',
-            transactionViolations,
-            quickAction,
-            shouldGenerateTransactionThreadReport: !isReverseSplitOperation,
-            policyRecentlyUsedCurrencies,
-        });
-
-        let updateMoneyRequestParamsOnyxData: OnyxData<OnyxKey> = {};
-        const currentSplit = splits.at(index);
-
-        // For existing split transactions, update the field change messages
-        // For new transactions, skip this step
-        if (splitTransaction) {
-            const existing = getTransactionDetails(splitTransaction);
-            const transactionChanges = {
-                ...currentSplit,
-                comment: currentSplit?.comment?.comment,
-            } as TransactionChanges;
-
-            if (currentSplit) {
-                currentSplit.reimbursable = splitTransaction.reimbursable;
-                currentSplit.billable = splitTransaction.billable;
-            }
-
-            for (const key of Object.keys(transactionChanges)) {
-                const newValue = transactionChanges[key as keyof typeof transactionChanges];
-                const oldValue = existing?.[key as keyof typeof existing];
-                if (newValue === oldValue) {
-                    delete transactionChanges[key as keyof typeof transactionChanges];
-                    // Ensure we pass the currency to getUpdateMoneyRequestParams as well, so the amount message is created correctly
-                } else if (key === 'amount') {
-                    transactionChanges.currency = originalTransactionDetails?.currency;
-                }
-            }
-
-            if (isReverseSplitOperation) {
-                delete transactionChanges.transactionID;
-            }
-
-            if (Object.keys(transactionChanges).length > 0) {
-                const transactionThreadReport = getAllReports()?.[`${ONYXKEYS.COLLECTION.REPORT}${isReverseSplitOperation ? splitExpense?.reportID : transactionThreadReportID}`];
-                const transactionIOUReport = getAllReports()?.[`${ONYXKEYS.COLLECTION.REPORT}${splitExpense?.reportID ?? transactionThreadReport?.parentReportID}`];
-                const {onyxData: moneyRequestParamsOnyxData, params} = getUpdateMoneyRequestParams({
-                    transactionID: existingTransactionID,
-                    transactionThreadReport,
-                    iouReport: transactionIOUReport,
-                    transactionChanges,
-                    policy,
-                    policyTagList: policyTags ?? null,
-                    policyCategories: policyCategories ?? null,
-                    newTransactionReportID: splitExpense?.reportID,
-                    policyRecentlyUsedCategories,
-                    currentUserAccountIDParam: currentUserPersonalDetails?.accountID,
-                    currentUserEmailParam: currentUserPersonalDetails?.login ?? '',
-                    isASAPSubmitBetaEnabled,
-                    iouReportNextStep,
-                });
-                if (currentSplit) {
-                    currentSplit.modifiedExpenseReportActionID = params.reportActionID;
-                }
-                updateMoneyRequestParamsOnyxData = moneyRequestParamsOnyxData;
-            }
-            // For new split transactions, set the reportID once the transaction and associated report are created
-        } else if (currentSplit) {
-            currentSplit.reportID = splitExpense?.reportID;
-        }
-
-        if (currentSplit) {
-            currentSplit.transactionThreadReportID = transactionThreadReportID;
-            currentSplit.createdReportActionIDForThread = createdReportActionIDForThread;
-            currentSplit.splitReportActionID = iouAction.reportActionID;
-        }
-
-        optimisticData.push(...(onyxData.optimisticData ?? []), ...(updateMoneyRequestParamsOnyxData.optimisticData ?? []));
-        successData.push(...(onyxData.successData ?? []), ...(updateMoneyRequestParamsOnyxData.successData ?? []));
-        failureData.push(...(onyxData.failureData ?? []), ...(updateMoneyRequestParamsOnyxData.failureData ?? []));
-    }
-
-    // All transactions that were deleted in the split list will be marked as deleted in onyx
-    const undeletedTransactions = originalChildTransactions.filter(
-        (currentTransaction) => !processedChildTransactionIDs.includes(currentTransaction?.transactionID ?? CONST.IOU.OPTIMISTIC_TRANSACTION_ID),
-    );
-
-    for (const undeletedTransaction of undeletedTransactions) {
-        const splitTransaction = allTransactionsList?.[`${ONYXKEYS.COLLECTION.TRANSACTION}${undeletedTransaction?.transactionID}`];
-        const splitReportActions = getAllReportActions(splitTransaction?.reportID);
-        const reportNameValuePairs = allReportNameValuePairsList?.[`${ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS}${splitTransaction?.reportID}`];
-        const isReportArchived = isArchivedReport(reportNameValuePairs);
-        const currentReportAction = Object.values(splitReportActions).find((action) => {
-            const transactionID = isMoneyRequestAction(action) ? (getOriginalMessage(action)?.IOUTransactionID ?? CONST.DEFAULT_NUMBER_ID) : CONST.DEFAULT_NUMBER_ID;
-            return transactionID === undeletedTransaction?.transactionID;
-        }) as ReportAction;
-
-        const {
-            optimisticData: deleteExpenseOptimisticData,
-            failureData: deleteExpenseFailureData,
-            successData: deleteExpenseSuccessData,
-        } = getDeleteTrackExpenseInformation(
-            splitTransaction?.reportID ?? String(CONST.DEFAULT_NUMBER_ID),
-            undeletedTransaction?.transactionID,
-            currentReportAction,
-            undefined,
-            undefined,
-            undefined,
-            undefined,
-            undefined,
-            isReportArchived,
-        );
-
-        optimisticData.push(...(deleteExpenseOptimisticData ?? []));
-        successData.push(...(deleteExpenseSuccessData ?? []));
-        failureData.push(...(deleteExpenseFailureData ?? []));
-    }
-
-    if (!isReverseSplitOperation) {
-        // Use SET to update originalTransaction more quickly in Onyx as compared to MERGE to prevent UI inconsistency
-        optimisticData.push({
-            onyxMethod: Onyx.METHOD.SET,
-            key: `${ONYXKEYS.COLLECTION.TRANSACTION}${originalTransactionID}`,
-            value: {
-                ...originalTransaction,
-                reportID: CONST.REPORT.SPLIT_REPORT_ID,
-            },
-        });
-
-        // @ts-expect-error - will be solved in https://github.com/Expensify/App/issues/73830
-        failureData.push({
-            onyxMethod: Onyx.METHOD.MERGE,
-            key: `${ONYXKEYS.COLLECTION.TRANSACTION}${originalTransactionID}`,
-            value: originalTransaction,
-        });
-
-        if (firstIOU) {
-            const updatedReportAction = {
-                [firstIOU.reportActionID]: {
-                    pendingAction: CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE,
-                    previousMessage: firstIOU.message,
-                    message: [
-                        {
-                            type: 'COMMENT',
-                            html: '',
-                            text: '',
-                            isEdited: true,
-                            isDeletedParentAction: true,
-                        },
-                    ],
-                    originalMessage: {
-                        IOUTransactionID: null,
-                    },
-                    errors: null,
-                },
-            };
-            const transactionThread = getAllReports()?.[`${ONYXKEYS.COLLECTION.REPORT}${firstIOU.childReportID}`] ?? null;
-            optimisticData.push({
-                onyxMethod: Onyx.METHOD.MERGE,
-                key: `${ONYXKEYS.COLLECTION.REPORT}${firstIOU?.childReportID}`,
-                value: null,
-            });
-            optimisticData.push({
-                onyxMethod: Onyx.METHOD.MERGE,
-                key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${iouReport?.reportID}`,
-                value: updatedReportAction,
-            });
-
-            failureData.push({
-                onyxMethod: Onyx.METHOD.MERGE,
-                key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${iouReport?.reportID}`,
-                value: {
-                    [firstIOU.reportActionID]: {
-                        ...firstIOU,
-                        pendingAction: null,
-                    },
-                },
-            });
-            failureData.push({
-                onyxMethod: Onyx.METHOD.MERGE,
-                key: `${ONYXKEYS.COLLECTION.REPORT}${firstIOU?.childReportID}`,
-                value: transactionThread ?? null,
-            });
-        }
-
-        optimisticData.push({
-            onyxMethod: Onyx.METHOD.MERGE,
-            key: `${ONYXKEYS.COLLECTION.SNAPSHOT}${searchContext?.currentSearchHash}`,
-            value: {
-                data: {
-                    [`${ONYXKEYS.COLLECTION.TRANSACTION}${originalTransactionID}`]: null,
-                },
-            },
-        });
-
-        // @ts-expect-error - will be solved in https://github.com/Expensify/App/issues/73830
-        failureData.push({
-            onyxMethod: Onyx.METHOD.MERGE,
-            key: `${ONYXKEYS.COLLECTION.SNAPSHOT}${searchContext?.currentSearchHash}`,
-            value: {
-                data: {
-                    [`${ONYXKEYS.COLLECTION.TRANSACTION}${originalTransactionID}`]: originalTransaction,
-                },
-            },
-        });
-    } else {
-        optimisticData.push({
-            onyxMethod: Onyx.METHOD.MERGE,
-            key: `${ONYXKEYS.COLLECTION.TRANSACTION}${originalTransactionID}`,
-            value: {
-                errors: null,
-            },
-        });
-    }
-
-    if (isReverseSplitOperation) {
-        const parameters = {
-            ...splits.at(0),
-            comment: splits.at(0)?.comment?.comment,
-        } as RevertSplitTransactionParams;
-        API.write(WRITE_COMMANDS.REVERT_SPLIT_TRANSACTION, parameters, {optimisticData, successData, failureData});
-    } else {
-        // Prepare splitApiParams for the Transaction_Split API call which requires a specific format for the splits
-        // The format is: splits[0][amount], splits[0][category], splits[0][tag] etc.
-        const splitApiParams = {} as Record<string, string | number | boolean>;
-        for (const [i, split] of splits.entries()) {
-            for (const [key, value] of Object.entries(split)) {
-                splitApiParams[`splits[${i}][${key}]`] = value !== null && typeof value === 'object' ? JSON.stringify(value) : value;
-            }
-        }
-        if (isCreationOfSplits) {
-            const isTransactionOnHold = isOnHold(originalTransaction);
-
-            if (isTransactionOnHold) {
-                const holdReportActionIDs: string[] = [];
-                const holdReportActionCommentIDs: string[] = [];
-                const transactionReportActions = getAllReportActions(firstIOU?.childReportID);
-                const holdReportAction = getReportAction(firstIOU?.childReportID, `${originalTransaction?.comment?.hold ?? ''}`);
-
-                const holdReportActionComment = holdReportAction
-                    ? Object.values(transactionReportActions ?? {}).find(
-                          (action) => action?.actionName === CONST.REPORT.ACTIONS.TYPE.ADD_COMMENT && action?.timestamp === holdReportAction.timestamp,
-                      )
-                    : undefined;
-
-                if (holdReportAction && holdReportActionComment) {
-                    // Loop through all split expenses and add optimistic hold report actions for each split
-                    for (const [index, splitExpense] of splits.entries()) {
-                        const splitReportID = splitExpense?.transactionThreadReportID;
-                        if (!splitReportID) {
-                            continue;
-                        }
-
-                        // Generate new IDs and timestamps for each split
-                        const newHoldReportActionID = NumberUtils.rand64();
-                        const newHoldReportActionCommentID = NumberUtils.rand64();
-                        const timestamp = DateUtils.getDBTime();
-                        const reportActionTimestamp = DateUtils.addMillisecondsFromDateTime(timestamp, 1);
-
-                        // Store IDs for API parameters
-                        holdReportActionIDs[index] = newHoldReportActionID;
-                        holdReportActionCommentIDs[index] = newHoldReportActionCommentID;
-
-                        // Create new optimistic hold report action with new ID and timestamp, keeping other information
-                        const newHoldReportAction = {
-                            ...holdReportAction,
-                            reportActionID: newHoldReportActionID,
-                            created: timestamp,
-                            pendingAction: CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD,
-                        };
-
-                        // Create new optimistic hold report action comment with new ID and timestamp, keeping other information
-                        const newHoldReportActionComment = {
-                            ...holdReportActionComment,
-                            reportActionID: newHoldReportActionCommentID,
-                            created: reportActionTimestamp,
-                            pendingAction: CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD,
-                        };
-
-                        // Add to optimisticData for this split's reportActions
-                        optimisticData.push({
-                            onyxMethod: Onyx.METHOD.MERGE,
-                            key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${splitReportID}`,
-                            value: {
-                                [newHoldReportActionID]: newHoldReportAction,
-                                [newHoldReportActionCommentID]: newHoldReportActionComment,
-                            },
-                        });
-
-                        // Add successData to clear pendingAction after API call succeeds
-                        successData.push({
-                            onyxMethod: Onyx.METHOD.MERGE,
-                            key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${splitReportID}`,
-                            value: {
-                                [newHoldReportActionID]: {pendingAction: null},
-                                [newHoldReportActionCommentID]: {pendingAction: null},
-                            },
-                        });
-
-                        // Add failureData to remove optimistic hold report actions if the request fails
-                        failureData.push({
-                            onyxMethod: Onyx.METHOD.MERGE,
-                            key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${splitReportID}`,
-                            value: {
-                                [newHoldReportActionID]: null,
-                                [newHoldReportActionCommentID]: null,
-                            },
-                        });
-                    }
-
-                    // Add hold report action IDs to API parameters
-                    for (const [i, holdReportActionID] of holdReportActionIDs.entries()) {
-                        if (holdReportActionID) {
-                            splitApiParams[`splits[${i}][holdReportActionID]`] = holdReportActionID;
-                        }
-                    }
-                    for (const [i, holdReportActionCommentID] of holdReportActionCommentIDs.entries()) {
-                        if (holdReportActionCommentID) {
-                            splitApiParams[`splits[${i}][holdReportActionCommentID]`] = holdReportActionCommentID;
-                        }
-                    }
-                }
-            }
-        }
-
-        const splitParameters: SplitTransactionParams = {
-            ...splitApiParams,
-            transactionID: originalTransactionID,
-        };
-
-        if (isCreationOfSplits) {
-            // eslint-disable-next-line rulesdir/no-multiple-api-calls
-            API.write(WRITE_COMMANDS.SPLIT_TRANSACTION, splitParameters, {optimisticData, successData, failureData});
-        } else {
-            // eslint-disable-next-line rulesdir/no-multiple-api-calls
-            API.write(WRITE_COMMANDS.UPDATE_SPLIT_TRANSACTION, splitParameters, {optimisticData, successData, failureData});
-        }
-    }
-    // eslint-disable-next-line @typescript-eslint/no-deprecated
-    InteractionManager.runAfterInteractions(() => removeDraftSplitTransaction(originalTransactionID));
-}
-
-function updateSplitTransactionsFromSplitExpensesFlow(params: UpdateSplitTransactionsParams) {
-    updateSplitTransactions(params);
-    const transactionReport = getReportOrDraftReport(params.transactionData?.reportID);
-    const parentTransactionReport = getReportOrDraftReport(transactionReport?.parentReportID);
-    const expenseReport = transactionReport?.type === CONST.REPORT.TYPE.EXPENSE ? transactionReport : parentTransactionReport;
-    const isSearchPageTopmostFullScreenRoute = isSearchTopmostFullScreenRoute();
-    const transactionThreadReportID = params.firstIOU?.childReportID;
-    const transactionThreadReportScreen = Navigation.getReportRouteByID(transactionThreadReportID);
-
-    // Reset selected transactions in search after saving split expenses
-    const searchFullScreenRoutes = navigationRef.getRootState()?.routes.findLast((route) => route.name === NAVIGATORS.SEARCH_FULLSCREEN_NAVIGATOR);
-    const lastRoute = searchFullScreenRoutes?.state?.routes?.at(-1);
-    const isUserOnSearchPage = isSearchTopmostFullScreenRoute() && lastRoute?.name === SCREENS.SEARCH.ROOT;
-    if (isUserOnSearchPage) {
-        params?.searchContext?.clearSelectedTransactions?.(undefined, true);
-    } else {
-        params?.searchContext?.clearSelectedTransactions?.(true);
-    }
-
-    if (isSearchPageTopmostFullScreenRoute || !transactionReport?.parentReportID) {
-        Navigation.dismissToSuperWideRHP();
-
-        // After the modal is dismissed, remove the transaction thread report screen
-        // to avoid navigating back to a report removed by the split transaction.
-        requestAnimationFrame(() => {
-            if (!transactionThreadReportScreen?.key) {
-                return;
-            }
-
-            Navigation.removeScreenByKey(transactionThreadReportScreen.key);
-        });
-
-        return;
-    }
-    Navigation.dismissModalWithReport({reportID: expenseReport?.reportID ?? String(CONST.DEFAULT_NUMBER_ID)});
-
-    // After the modal is dismissed, remove the transaction thread report screen
-    // to avoid navigating back to a report removed by the split transaction.
-    requestAnimationFrame(() => {
-        if (!transactionThreadReportScreen?.key) {
-            return;
-        }
-
-        Navigation.removeScreenByKey(transactionThreadReportScreen.key);
-    });
-}
-
-export {completeSplitBill, splitBill, splitBillAndOpenReport, startSplitBill, updateSplitTransactions, updateSplitTransactionsFromSplitExpensesFlow};
-
-export type {SplitBillActionsParams, UpdateSplitTransactionsParams};
diff --git a/src/libs/actions/IOU/index.ts b/src/libs/actions/IOU/index.ts
index 629fa4e910c5..eaee8f4c9ca9 100644
--- a/src/libs/actions/IOU/index.ts
+++ b/src/libs/actions/IOU/index.ts
@@ -5,18 +5,19 @@ import cloneDeep from 'lodash/cloneDeep';
 // eslint-disable-next-line you-dont-need-lodash-underscore/union-by
 import lodashUnionBy from 'lodash/unionBy';
 import {InteractionManager} from 'react-native';
-import type {NullishDeep, OnyxCollection, OnyxEntry, OnyxInputValue, OnyxKey, OnyxUpdate} from 'react-native-onyx';
+import type {NullishDeep, OnyxCollection, OnyxEntry, OnyxInputValue, OnyxUpdate} from 'react-native-onyx';
 import Onyx from 'react-native-onyx';
 import type {SetRequired, ValueOf} from 'type-fest';
 import ReceiptGeneric from '@assets/images/receipt-generic.png';
 import type {PaymentMethod} from '@components/KYCWall/types';
-import type {SearchQueryJSON} from '@components/Search/types';
+import type {SearchContextProps, SearchQueryJSON} from '@components/Search/types';
 import * as API from '@libs/API';
 import type {
     AddReportApproverParams,
     ApproveMoneyRequestParams,
     AssignReportToMeParams,
     CategorizeTrackedExpenseParams as CategorizeTrackedExpenseApiParams,
+    CompleteSplitBillParams,
     CreateDistanceRequestParams,
     CreatePerDiemRequestParams,
     CreateWorkspaceParams,
@@ -30,8 +31,13 @@ import type {
     ReplaceReceiptParams,
     RequestMoneyParams,
     RetractReportParams,
+    RevertSplitTransactionParams,
     SetNameValuePairParams,
     ShareTrackedExpenseParams,
+    SplitBillParams,
+    SplitTransactionParams,
+    SplitTransactionSplitsParam,
+    StartSplitBillParams,
     SubmitReportParams,
     TrackExpenseParams,
     UnapproveExpenseReportParams,
@@ -58,7 +64,6 @@ import * as Localize from '@libs/Localize';
 import Log from '@libs/Log';
 import {validateAmount} from '@libs/MoneyRequestUtils';
 import isReportOpenInRHP from '@libs/Navigation/helpers/isReportOpenInRHP';
-import isReportOpenInSuperWideRHP from '@libs/Navigation/helpers/isReportOpenInSuperWideRHP';
 import isSearchTopmostFullScreenRoute from '@libs/Navigation/helpers/isSearchTopmostFullScreenRoute';
 import Navigation, {navigationRef} from '@libs/Navigation/Navigation';
 import {isOffline} from '@libs/Network/NetworkStore';
@@ -74,6 +79,7 @@ import {addSMSDomainIfPhoneNumber} from '@libs/PhoneNumber';
 import {
     arePaymentsEnabled,
     getDistanceRateCustomUnit,
+    getDistanceRateCustomUnitRate,
     getMemberAccountIDsForWorkspace,
     getPerDiemCustomUnit,
     getPerDiemRateCustomUnitRate,
@@ -227,7 +233,7 @@ import type {GuidedSetupData} from '@userActions/Report';
 import {buildInviteToRoomOnyxData, completeOnboarding, getCurrentUserAccountID, notifyNewAction, optimisticReportLastData} from '@userActions/Report';
 import {clearAllRelatedReportActionErrors} from '@userActions/ReportActions';
 import {sanitizeRecentWaypoints} from '@userActions/Transaction';
-import {removeDraftTransaction, removeDraftTransactions} from '@userActions/TransactionEdit';
+import {removeDraftSplitTransaction, removeDraftTransaction, removeDraftTransactions} from '@userActions/TransactionEdit';
 import {getOnboardingMessages} from '@userActions/Welcome/OnboardingFlow';
 import type {OnboardingCompanySize} from '@userActions/Welcome/OnboardingFlow';
 import type {IOUAction, IOUActionParams, IOUType} from '@src/CONST';
@@ -297,7 +303,7 @@ type MoneyRequestInformation = {
     reportPreviewAction: OnyxTypes.ReportAction;
     transactionThreadReportID?: string;
     createdReportActionIDForThread: string | undefined;
-    onyxData: OnyxData<OnyxKey>;
+    onyxData: OnyxData;
     billable?: boolean;
     reimbursable?: boolean;
 };
@@ -318,29 +324,9 @@ type PayInvoiceArgs = {
 };
 
 type RejectMoneyRequestData = {
-    optimisticData: Array<
-        OnyxUpdate<
-            | typeof ONYXKEYS.COLLECTION.REPORT
-            | typeof ONYXKEYS.COLLECTION.TRANSACTION
-            | typeof ONYXKEYS.COLLECTION.REPORT_ACTIONS
-            | typeof ONYXKEYS.COLLECTION.REPORT_METADATA
-            | typeof ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS
-            | typeof ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS
-        >
-    >;
-    successData: Array<
-        OnyxUpdate<typeof ONYXKEYS.COLLECTION.REPORT | typeof ONYXKEYS.COLLECTION.REPORT_ACTIONS | typeof ONYXKEYS.COLLECTION.REPORT_METADATA | typeof ONYXKEYS.COLLECTION.TRANSACTION>
-    >;
-    failureData: Array<
-        OnyxUpdate<
-            | typeof ONYXKEYS.COLLECTION.REPORT
-            | typeof ONYXKEYS.COLLECTION.TRANSACTION
-            | typeof ONYXKEYS.COLLECTION.REPORT_ACTIONS
-            | typeof ONYXKEYS.COLLECTION.REPORT_METADATA
-            | typeof ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS
-            | typeof ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS
-        >
-    >;
+    optimisticData: OnyxUpdate[];
+    successData: OnyxUpdate[];
+    failureData: OnyxUpdate[];
     parameters: RejectMoneyRequestParams;
     urlToNavigateBack: Route | undefined;
 };
@@ -359,7 +345,7 @@ type TrackExpenseInformation = {
     actionableWhisperReportActionIDParam?: string;
     optimisticReportID: string | undefined;
     optimisticReportActionID: string | undefined;
-    onyxData: OnyxData<OnyxKey>;
+    onyxData: OnyxData;
 };
 
 type TrackedExpenseTransactionParams = Omit<BaseTransactionParams, 'taxCode' | 'taxAmount'> & {
@@ -390,7 +376,7 @@ type TrackedExpenseReportInformation = {
     isLinkedTrackedExpenseReportArchived: boolean | undefined;
 };
 type TrackedExpenseParams = {
-    onyxData?: OnyxData<OnyxKey>;
+    onyxData?: OnyxData;
     reportInformation: TrackedExpenseReportInformation;
     transactionParams: TrackedExpenseTransactionParams;
     policyParams: TrackedExpensePolicyParams;
@@ -410,12 +396,12 @@ type SplitData = {
 type SplitsAndOnyxData = {
     splitData: SplitData;
     splits: Split[];
-    onyxData: OnyxData<OnyxKey>;
+    onyxData: OnyxData;
 };
 
 type UpdateMoneyRequestData = {
     params: UpdateMoneyRequestParams;
-    onyxData: OnyxData<OnyxKey>;
+    onyxData: OnyxData;
 };
 
 type PayMoneyRequestData = {
@@ -777,6 +763,29 @@ type StartSplitBilActionParams = {
     policyRecentlyUsedCurrencies: string[];
 };
 
+type UpdateSplitTransactionsParams = {
+    allTransactionsList: OnyxCollection<OnyxTypes.Transaction>;
+    allReportsList: OnyxCollection<OnyxTypes.Report>;
+    allReportNameValuePairsList: OnyxCollection<OnyxTypes.ReportNameValuePairs>;
+    transactionData: {
+        reportID: string;
+        originalTransactionID: string;
+        splitExpenses: SplitExpense[];
+        splitExpensesTotal?: number;
+    };
+    searchContext?: Partial<SearchContextProps>;
+    policyCategories: OnyxTypes.PolicyCategories | undefined;
+    policy: OnyxTypes.Policy | undefined;
+    policyRecentlyUsedCategories: OnyxTypes.RecentlyUsedCategories | undefined;
+    iouReport: OnyxEntry<OnyxTypes.Report>;
+    firstIOU: OnyxEntry<OnyxTypes.ReportAction> | undefined;
+    isASAPSubmitBetaEnabled: boolean;
+    currentUserPersonalDetails: CurrentUserPersonalDetails;
+    transactionViolations: OnyxCollection<OnyxTypes.TransactionViolation[]>;
+    quickAction: OnyxEntry<OnyxTypes.QuickAction>;
+    policyRecentlyUsedCurrencies: string[];
+};
+
 type ReplaceReceipt = {
     transactionID: string;
     file?: File;
@@ -808,7 +817,6 @@ type DeleteTrackExpenseParams = {
     isSingleTransactionView: boolean | undefined;
     isChatReportArchived: boolean | undefined;
     isChatIOUReportArchived: boolean | undefined;
-    allTransactionViolationsParam: OnyxCollection<OnyxTypes.TransactionViolations>;
 };
 
 type DeleteMoneyRequestFunctionParams = {
@@ -823,7 +831,6 @@ type DeleteMoneyRequestFunctionParams = {
     transactionIDsPendingDeletion?: string[];
     selectedTransactionIDs?: string[];
     hash?: number;
-    allTransactionViolationsParam: OnyxCollection<OnyxTypes.TransactionViolations>;
 };
 
 let allTransactions: NonNullable<OnyxCollection<OnyxTypes.Transaction>> = {};
@@ -863,6 +870,15 @@ Onyx.connect({
     },
 });
 
+let allNextSteps: NonNullable<OnyxCollection<OnyxTypes.ReportNextStepDeprecated>> = {};
+Onyx.connect({
+    key: ONYXKEYS.COLLECTION.NEXT_STEP,
+    waitForCollectionCallback: true,
+    callback: (value) => {
+        allNextSteps = value ?? {};
+    },
+});
+
 let allReports: OnyxCollection<OnyxTypes.Report>;
 Onyx.connect({
     key: ONYXKEYS.COLLECTION.REPORT,
@@ -973,11 +989,6 @@ function dismissModalAndOpenReportInInboxTab(reportID?: string) {
         const rhpKey = rootState.routes.at(-1)?.state?.key;
         if (rhpKey) {
             const hasMultipleTransactions = Object.values(allTransactions).filter((transaction) => transaction?.reportID === reportID).length > 0;
-            // When a report is opened in the super wide RHP, we need to dismiss to the first RHP to show the same report with new expense.
-            if (isReportOpenInSuperWideRHP(rootState)) {
-                Navigation.dismissToPreviousRHP();
-                return;
-            }
             // When a report with one expense is opened in the wide RHP and the user adds another expense, RHP should be dismissed and ROUTES.SEARCH_MONEY_REQUEST_REPORT should be displayed.
             if (hasMultipleTransactions && reportID) {
                 Navigation.dismissModal();
@@ -1137,8 +1148,6 @@ function initMoneyRequest({
         }
     }
 
-    const defaultMerchant = newIouRequestType === CONST.IOU.REQUEST_TYPE.MANUAL ? CONST.TRANSACTION.DEFAULT_MERCHANT : CONST.TRANSACTION.PARTIAL_TRANSACTION_MERCHANT;
-
     const newTransaction = {
         amount: 0,
         comment,
@@ -1149,7 +1158,7 @@ function initMoneyRequest({
         reportID,
         transactionID: newTransactionID,
         isFromGlobalCreate,
-        merchant: defaultMerchant,
+        merchant: CONST.TRANSACTION.PARTIAL_TRANSACTION_MERCHANT,
     };
 
     // Store the transaction in Onyx and mark it as not saved so it can be cleaned up later
@@ -1207,9 +1216,6 @@ function startMoneyRequest(
         case CONST.IOU.REQUEST_TYPE.DISTANCE:
             Navigation.navigate(ROUTES.MONEY_REQUEST_CREATE_TAB_DISTANCE.getRoute(CONST.IOU.ACTION.CREATE, iouType, CONST.IOU.OPTIMISTIC_TRANSACTION_ID, reportID, backToReport));
             return;
-        case CONST.IOU.REQUEST_TYPE.TIME:
-            Navigation.navigate(ROUTES.MONEY_REQUEST_CREATE_TAB_TIME.getRoute(CONST.IOU.ACTION.CREATE, iouType, CONST.IOU.OPTIMISTIC_TRANSACTION_ID, reportID, backToReport));
-            return;
         default:
             Navigation.navigate(ROUTES.MONEY_REQUEST_CREATE.getRoute(CONST.IOU.ACTION.CREATE, iouType, CONST.IOU.OPTIMISTIC_TRANSACTION_ID, reportID, backToReport));
     }
@@ -1282,13 +1288,9 @@ function setMoneyRequestTimeCount(transactionID: string, count: number, isDraft:
  * @param transactionID - The transaction ID
  * @param category - The category name
  * @param policy - The policy object, or undefined for P2P transactions where tax info should be cleared
- * @param isMovingFromTrackExpense - If the expense is moved from Track Expense
  */
-function setMoneyRequestCategory(transactionID: string, category: string, policy: OnyxEntry<OnyxTypes.Policy>, isMovingFromTrackExpense?: boolean) {
+function setMoneyRequestCategory(transactionID: string, category: string, policy: OnyxEntry<OnyxTypes.Policy>) {
     Onyx.merge(`${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${transactionID}`, {category});
-    if (isMovingFromTrackExpense) {
-        return;
-    }
     if (!policy) {
         setMoneyRequestTaxRate(transactionID, '');
         setMoneyRequestTaxAmount(transactionID, null);
@@ -1547,7 +1549,7 @@ function getReceiptError(
 }
 
 /** Helper function to get optimistic fields violations onyx data */
-function getFieldViolationsOnyxData(iouReport: OnyxTypes.Report): SetRequired<OnyxData<typeof ONYXKEYS.COLLECTION.REPORT_VIOLATIONS>, 'optimisticData' | 'failureData'> {
+function getFieldViolationsOnyxData(iouReport: OnyxTypes.Report): SetRequired<OnyxData, 'optimisticData' | 'failureData'> {
     const missingFields: OnyxTypes.ReportFieldsViolations = {};
     const excludedFields = Object.values(CONST.REPORT_VIOLATIONS_EXCLUDED_FIELDS) as string[];
 
@@ -1586,12 +1588,10 @@ type BuildOnyxDataForTestDriveIOUParams = {
     testDriveCommentReportActionID?: string;
 };
 
-function buildOnyxDataForTestDriveIOU(
-    testDriveIOUParams: BuildOnyxDataForTestDriveIOUParams,
-): OnyxData<typeof ONYXKEYS.COLLECTION.REPORT_ACTIONS | typeof ONYXKEYS.COLLECTION.REPORT | typeof ONYXKEYS.COLLECTION.TRANSACTION_DRAFT> {
+function buildOnyxDataForTestDriveIOU(testDriveIOUParams: BuildOnyxDataForTestDriveIOUParams): OnyxData {
     const optimisticData: Array<OnyxUpdate<typeof ONYXKEYS.COLLECTION.REPORT_ACTIONS | typeof ONYXKEYS.COLLECTION.REPORT>> = [];
-    const successData: Array<OnyxUpdate<typeof ONYXKEYS.COLLECTION.REPORT_ACTIONS | typeof ONYXKEYS.COLLECTION.REPORT>> = [];
-    const failureData: Array<OnyxUpdate<typeof ONYXKEYS.COLLECTION.REPORT_ACTIONS | typeof ONYXKEYS.COLLECTION.REPORT | typeof ONYXKEYS.COLLECTION.TRANSACTION_DRAFT>> = [];
+    const successData: OnyxUpdate[] = [];
+    const failureData: OnyxUpdate[] = [];
 
     const optimisticIOUReportAction = buildOptimisticIOUReportAction({
         type: CONST.IOU.REPORT_ACTION_TYPE.PAY,
@@ -1606,7 +1606,7 @@ function buildOnyxDataForTestDriveIOU(
     });
     // eslint-disable-next-line @typescript-eslint/no-deprecated
     const text = Localize.translateLocal('testDrive.employeeInviteMessage', personalDetailsList?.[userAccountID]?.firstName ?? '');
-    const textComment = buildOptimisticAddCommentReportAction(text, undefined, userAccountID, undefined, undefined, testDriveIOUParams.testDriveCommentReportActionID);
+    const textComment = buildOptimisticAddCommentReportAction(text, undefined, userAccountID, undefined, undefined, undefined, testDriveIOUParams.testDriveCommentReportActionID);
     textComment.reportAction.created = DateUtils.subtractMillisecondsFromDateTime(testDriveIOUParams.iouOptimisticParams.createdAction.created, 1);
 
     optimisticData.push(
@@ -1863,7 +1863,6 @@ function buildOnyxDataForMoneyRequest(moneyRequestParams: BuildOnyxDataForMoneyR
     }
 
     let iouAction = iou.action;
-    let iouReport = iou.report;
     if (isMoneyRequestToManagerMcTest) {
         const date = new Date();
         const isTestReceipt = transaction.receipt?.isTestReceipt ?? false;
@@ -1880,14 +1879,6 @@ function buildOnyxDataForMoneyRequest(moneyRequestParams: BuildOnyxDataForMoneyR
             reportActionID: iou.action.reportActionID,
         });
         iouAction = optimisticIOUReportAction;
-        iouReport = {
-            ...iouReport,
-            ...(!isScanRequest || isTestReceipt
-                ? {lastActionType: CONST.REPORT.ACTIONS.TYPE.MARKED_REIMBURSED, stateNum: CONST.REPORT.STATE_NUM.APPROVED, statusNum: CONST.REPORT.STATUS_NUM.REIMBURSED}
-                : undefined),
-            hasOutstandingChildRequest: false,
-            lastActorAccountID: deprecatedCurrentUserPersonalDetails?.accountID,
-        };
 
         optimisticData.push(
             // @ts-expect-error - will be solved in https://github.com/Expensify/App/issues/73830
@@ -2224,7 +2215,7 @@ function buildOnyxDataForMoneyRequest(moneyRequestParams: BuildOnyxDataForMoneyR
     const searchUpdate = getSearchOnyxUpdate({
         transaction,
         participant,
-        iouReport,
+        iouReport: iou.report,
         iouAction,
         policy,
         transactionThreadReportID: transactionThreadReport?.reportID,
@@ -3145,8 +3136,13 @@ function getMoneyRequestInformation(moneyRequestInformation: MoneyRequestInforma
     }
 
     // STEP 3: Build an optimistic transaction with the receipt
-    const isDistanceRequest = existingTransaction && isDistanceRequestTransactionUtils(existingTransaction);
-    const isManualDistanceRequest = existingTransaction && isManualDistanceRequestTransactionUtils(existingTransaction);
+    const isDistanceRequest =
+        existingTransaction &&
+        (existingTransaction.iouRequestType === CONST.IOU.REQUEST_TYPE.DISTANCE ||
+            existingTransaction.iouRequestType === CONST.IOU.REQUEST_TYPE.DISTANCE_MAP ||
+            existingTransaction.iouRequestType === CONST.IOU.REQUEST_TYPE.DISTANCE_MANUAL ||
+            existingTransaction.iouRequestType === CONST.IOU.REQUEST_TYPE.DISTANCE_ODOMETER);
+    const isManualDistanceRequest = existingTransaction && existingTransaction.iouRequestType === CONST.IOU.REQUEST_TYPE.DISTANCE_MANUAL;
     let optimisticTransaction = buildOptimisticTransaction({
         existingTransactionID: optimisticTransactionID,
         existingTransaction,
@@ -3200,17 +3196,8 @@ function getMoneyRequestInformation(moneyRequestInformation: MoneyRequestInforma
     }
 
     if (isSplitExpense && existingTransaction) {
-        const {convertedAmount: originalConvertedAmount, ...existingTransactionWithoutConvertedAmount} = existingTransaction;
+        const {convertedAmount: omittedConvertedAmount, ...existingTransactionWithoutConvertedAmount} = existingTransaction;
         optimisticTransaction = fastMerge(existingTransactionWithoutConvertedAmount, optimisticTransaction, false);
-
-        // Calculate proportional convertedAmount for the split based on the original conversion rate
-        // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- modifiedAmount can be empty string
-        const originalAmount = Number(existingTransaction.modifiedAmount) || existingTransaction.amount;
-        // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- modifiedAmount can be empty string
-        const splitAmount = Number(optimisticTransaction.modifiedAmount) || optimisticTransaction.amount;
-        if (originalConvertedAmount && originalAmount && splitAmount) {
-            optimisticTransaction.convertedAmount = Math.round((originalConvertedAmount * splitAmount) / originalAmount);
-        }
     }
 
     // STEP 4: Build optimistic reportActions. We need:
@@ -4058,7 +4045,6 @@ type GetUpdateMoneyRequestParamsType = {
     currentUserEmailParam: string;
     isASAPSubmitBetaEnabled: boolean;
     policyRecentlyUsedCurrencies?: string[];
-    iouReportNextStep: OnyxEntry<OnyxTypes.ReportNextStepDeprecated>;
 };
 
 function getUpdateMoneyRequestParams(params: GetUpdateMoneyRequestParamsType): UpdateMoneyRequestData {
@@ -4081,7 +4067,6 @@ function getUpdateMoneyRequestParams(params: GetUpdateMoneyRequestParamsType): U
         currentUserEmailParam,
         isASAPSubmitBetaEnabled,
         policyRecentlyUsedCurrencies,
-        iouReportNextStep,
     } = params;
     const optimisticData: OnyxUpdate[] = [];
     const successData: Array<
@@ -4452,7 +4437,6 @@ function getUpdateMoneyRequestParams(params: GetUpdateMoneyRequestParamsType): U
     const hasModifiedTaxCode = 'taxCode' in transactionChanges;
     const hasModifiedDate = 'date' in transactionChanges;
     const hasModifiedMerchant = 'merchant' in transactionChanges;
-    const hasModifiedAttendees = 'attendees' in transactionChanges;
 
     const isInvoice = isInvoiceReportReportUtils(iouReport);
     if (
@@ -4461,8 +4445,7 @@ function getUpdateMoneyRequestParams(params: GetUpdateMoneyRequestParamsType): U
         isPaidGroupPolicy(policy) &&
         !isInvoice &&
         updatedTransaction &&
-        (hasPendingWaypoints ||
-            hasModifiedTag ||
+        (hasModifiedTag ||
             hasModifiedCategory ||
             hasModifiedComment ||
             hasModifiedMerchant ||
@@ -4472,8 +4455,7 @@ function getUpdateMoneyRequestParams(params: GetUpdateMoneyRequestParamsType): U
             hasModifiedAmount ||
             hasModifiedCreated ||
             hasModifiedReimbursable ||
-            hasModifiedTaxCode ||
-            hasModifiedAttendees)
+            hasModifiedTaxCode)
     ) {
         const currentTransactionViolations = allTransactionViolations[`${ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS}${transactionID}`] ?? [];
         // If the amount, currency or date have been modified, we remove the duplicate violations since they would be out of date as the transaction has changed
@@ -4485,9 +4467,6 @@ function getUpdateMoneyRequestParams(params: GetUpdateMoneyRequestParamsType): U
             hasModifiedCategory && transactionChanges.category === ''
                 ? optimisticViolations.filter((violation) => violation.name !== CONST.VIOLATIONS.CATEGORY_OUT_OF_POLICY)
                 : optimisticViolations;
-        if (hasPendingWaypoints) {
-            optimisticViolations = optimisticViolations.filter((violation) => violation.name !== CONST.VIOLATIONS.NO_ROUTE);
-        }
 
         const violationsOnyxData = ViolationsUtils.getViolationsOnyxData(
             updatedTransaction,
@@ -4534,7 +4513,7 @@ function getUpdateMoneyRequestParams(params: GetUpdateMoneyRequestParamsType): U
             ((iouReport?.statusNum ?? CONST.REPORT.STATUS_NUM.OPEN) === CONST.REPORT.STATUS_NUM.OPEN ||
                 (hasModifiedReimbursable && iouReport?.statusNum === CONST.REPORT.STATUS_NUM.SUBMITTED))
         ) {
-            const currentNextStep = iouReportNextStep ?? {};
+            const currentNextStep = allNextSteps[`${ONYXKEYS.COLLECTION.NEXT_STEP}${iouReport?.reportID}`] ?? {};
             const shouldFixViolations = Array.isArray(violationsOnyxData.value) && violationsOnyxData.value.length > 0;
             const moneyRequestReport = updatedMoneyRequestReport ?? iouReport ?? undefined;
             const hasViolations = hasViolationsReportUtils(moneyRequestReport?.reportID, allTransactionViolations, currentUserAccountIDParam, currentUserEmailParam);
@@ -4810,7 +4789,6 @@ type UpdateMoneyRequestDateParams = {
     currentUserAccountIDParam: number;
     currentUserEmailParam: string;
     isASAPSubmitBetaEnabled: boolean;
-    parentReportNextStep: OnyxEntry<OnyxTypes.ReportNextStepDeprecated>;
 };
 
 /** Updates the created date of an expense */
@@ -4827,7 +4805,6 @@ function updateMoneyRequestDate({
     currentUserAccountIDParam,
     currentUserEmailParam,
     isASAPSubmitBetaEnabled,
-    parentReportNextStep,
 }: UpdateMoneyRequestDateParams) {
     const transactionChanges: TransactionChanges = {
         created: value,
@@ -4848,7 +4825,6 @@ function updateMoneyRequestDate({
             currentUserAccountIDParam,
             currentUserEmailParam,
             isASAPSubmitBetaEnabled,
-            iouReportNextStep: parentReportNextStep,
         });
         removeTransactionFromDuplicateTransactionViolation(data.onyxData, transactionID, transactions, transactionViolations);
     }
@@ -4857,31 +4833,18 @@ function updateMoneyRequestDate({
 }
 
 /** Updates the billable field of an expense */
-function updateMoneyRequestBillable({
-    transactionID,
-    transactionThreadReport,
-    parentReport,
-    value,
-    policy,
-    policyTagList,
-    policyCategories,
-    currentUserAccountIDParam,
-    currentUserEmailParam,
-    isASAPSubmitBetaEnabled,
-    parentReportNextStep,
-}: {
-    transactionID: string | undefined;
-    transactionThreadReport: OnyxEntry<OnyxTypes.Report>;
-    parentReport: OnyxEntry<OnyxTypes.Report>;
-    value: boolean;
-    policy: OnyxEntry<OnyxTypes.Policy>;
-    policyTagList: OnyxEntry<OnyxTypes.PolicyTagLists>;
-    policyCategories: OnyxEntry<OnyxTypes.PolicyCategories>;
-    currentUserAccountIDParam: number;
-    currentUserEmailParam: string;
-    isASAPSubmitBetaEnabled: boolean;
-    parentReportNextStep: OnyxEntry<OnyxTypes.ReportNextStepDeprecated>;
-}) {
+function updateMoneyRequestBillable(
+    transactionID: string | undefined,
+    transactionThreadReport: OnyxEntry<OnyxTypes.Report>,
+    parentReport: OnyxEntry<OnyxTypes.Report>,
+    value: boolean,
+    policy: OnyxEntry<OnyxTypes.Policy>,
+    policyTagList: OnyxEntry<OnyxTypes.PolicyTagLists>,
+    policyCategories: OnyxEntry<OnyxTypes.PolicyCategories>,
+    currentUserAccountIDParam: number,
+    currentUserEmailParam: string,
+    isASAPSubmitBetaEnabled: boolean,
+) {
     if (!transactionID || !transactionThreadReport?.reportID) {
         return;
     }
@@ -4899,36 +4862,22 @@ function updateMoneyRequestBillable({
         currentUserAccountIDParam,
         currentUserEmailParam,
         isASAPSubmitBetaEnabled,
-        iouReportNextStep: parentReportNextStep,
     });
     API.write(WRITE_COMMANDS.UPDATE_MONEY_REQUEST_BILLABLE, params, onyxData);
 }
 
-function updateMoneyRequestReimbursable({
-    transactionID,
-    transactionThreadReport,
-    parentReport,
-    value,
-    policy,
-    policyTagList,
-    policyCategories,
-    currentUserAccountIDParam,
-    currentUserEmailParam,
-    isASAPSubmitBetaEnabled,
-    parentReportNextStep,
-}: {
-    transactionID: string | undefined;
-    transactionThreadReport: OnyxEntry<OnyxTypes.Report>;
-    parentReport: OnyxEntry<OnyxTypes.Report>;
-    value: boolean;
-    policy: OnyxEntry<OnyxTypes.Policy>;
-    policyTagList: OnyxEntry<OnyxTypes.PolicyTagLists>;
-    policyCategories: OnyxEntry<OnyxTypes.PolicyCategories>;
-    currentUserAccountIDParam: number;
-    currentUserEmailParam: string;
-    isASAPSubmitBetaEnabled: boolean;
-    parentReportNextStep: OnyxEntry<OnyxTypes.ReportNextStepDeprecated>;
-}) {
+function updateMoneyRequestReimbursable(
+    transactionID: string | undefined,
+    transactionThreadReport: OnyxEntry<OnyxTypes.Report>,
+    parentReport: OnyxEntry<OnyxTypes.Report>,
+    value: boolean,
+    policy: OnyxEntry<OnyxTypes.Policy>,
+    policyTagList: OnyxEntry<OnyxTypes.PolicyTagLists>,
+    policyCategories: OnyxEntry<OnyxTypes.PolicyCategories>,
+    currentUserAccountIDParam: number,
+    currentUserEmailParam: string,
+    isASAPSubmitBetaEnabled: boolean,
+) {
     if (!transactionID || !transactionThreadReport?.reportID) {
         return;
     }
@@ -4946,37 +4895,23 @@ function updateMoneyRequestReimbursable({
         currentUserAccountIDParam,
         currentUserEmailParam,
         isASAPSubmitBetaEnabled,
-        iouReportNextStep: parentReportNextStep,
     });
     API.write(WRITE_COMMANDS.UPDATE_MONEY_REQUEST_REIMBURSABLE, params, onyxData);
 }
 
 /** Updates the merchant field of an expense */
-function updateMoneyRequestMerchant({
-    transactionID,
-    transactionThreadReport,
-    parentReport,
-    value,
-    policy,
-    policyTagList,
-    policyCategories,
-    currentUserAccountIDParam,
-    currentUserEmailParam,
-    isASAPSubmitBetaEnabled,
-    parentReportNextStep,
-}: {
-    transactionID: string;
-    transactionThreadReport: OnyxEntry<OnyxTypes.Report>;
-    parentReport: OnyxEntry<OnyxTypes.Report>;
-    value: string;
-    policy: OnyxEntry<OnyxTypes.Policy>;
-    policyTagList: OnyxEntry<OnyxTypes.PolicyTagLists>;
-    policyCategories: OnyxEntry<OnyxTypes.PolicyCategories>;
-    currentUserAccountIDParam: number;
-    currentUserEmailParam: string;
-    isASAPSubmitBetaEnabled: boolean;
-    parentReportNextStep: OnyxEntry<OnyxTypes.ReportNextStepDeprecated>;
-}) {
+function updateMoneyRequestMerchant(
+    transactionID: string,
+    transactionThreadReport: OnyxEntry<OnyxTypes.Report>,
+    parentReport: OnyxEntry<OnyxTypes.Report>,
+    value: string,
+    policy: OnyxEntry<OnyxTypes.Policy>,
+    policyTagList: OnyxEntry<OnyxTypes.PolicyTagLists>,
+    policyCategories: OnyxEntry<OnyxTypes.PolicyCategories>,
+    currentUserAccountIDParam: number,
+    currentUserEmailParam: string,
+    isASAPSubmitBetaEnabled: boolean,
+) {
     const transactionChanges: TransactionChanges = {
         merchant: value,
     };
@@ -4996,7 +4931,6 @@ function updateMoneyRequestMerchant({
             currentUserAccountIDParam,
             currentUserEmailParam,
             isASAPSubmitBetaEnabled,
-            iouReportNextStep: parentReportNextStep,
         });
     }
     const {params, onyxData} = data;
@@ -5016,7 +4950,6 @@ function updateMoneyRequestAttendees({
     currentUserAccountIDParam,
     currentUserEmailParam,
     isASAPSubmitBetaEnabled,
-    parentReportNextStep,
 }: {
     transactionID: string;
     transactionThreadReport: OnyxEntry<OnyxTypes.Report>;
@@ -5029,7 +4962,6 @@ function updateMoneyRequestAttendees({
     currentUserAccountIDParam: number;
     currentUserEmailParam: string;
     isASAPSubmitBetaEnabled: boolean;
-    parentReportNextStep: OnyxEntry<OnyxTypes.ReportNextStepDeprecated>;
 }) {
     const transactionChanges: TransactionChanges = {
         attendees,
@@ -5046,7 +4978,6 @@ function updateMoneyRequestAttendees({
         currentUserAccountIDParam,
         currentUserEmailParam,
         isASAPSubmitBetaEnabled,
-        iouReportNextStep: parentReportNextStep,
     });
     const {params, onyxData} = data;
     API.write(WRITE_COMMANDS.UPDATE_MONEY_REQUEST_ATTENDEES, params, onyxData);
@@ -5065,7 +4996,6 @@ type UpdateMoneyRequestTagParams = {
     currentUserEmailParam: string;
     isASAPSubmitBetaEnabled: boolean;
     hash?: number;
-    parentReportNextStep: OnyxEntry<OnyxTypes.ReportNextStepDeprecated>;
 };
 
 /** Updates the tag of an expense */
@@ -5082,7 +5012,6 @@ function updateMoneyRequestTag({
     currentUserEmailParam,
     isASAPSubmitBetaEnabled,
     hash,
-    parentReportNextStep,
 }: UpdateMoneyRequestTagParams) {
     const transactionChanges: TransactionChanges = {
         tag,
@@ -5100,37 +5029,23 @@ function updateMoneyRequestTag({
         currentUserAccountIDParam,
         currentUserEmailParam,
         isASAPSubmitBetaEnabled,
-        iouReportNextStep: parentReportNextStep,
     });
     API.write(WRITE_COMMANDS.UPDATE_MONEY_REQUEST_TAG, params, onyxData);
 }
 
 /** Updates the created tax amount of an expense */
-function updateMoneyRequestTaxAmount({
-    transactionID,
-    transactionThreadReport,
-    parentReport,
-    taxAmount,
-    policy,
-    policyTagList,
-    policyCategories,
-    currentUserAccountIDParam,
-    currentUserEmailParam,
-    isASAPSubmitBetaEnabled,
-    parentReportNextStep,
-}: {
-    transactionID: string;
-    transactionThreadReport: OnyxEntry<OnyxTypes.Report>;
-    parentReport: OnyxEntry<OnyxTypes.Report>;
-    taxAmount: number;
-    policy: OnyxEntry<OnyxTypes.Policy>;
-    policyTagList: OnyxEntry<OnyxTypes.PolicyTagLists>;
-    policyCategories: OnyxEntry<OnyxTypes.PolicyCategories>;
-    currentUserAccountIDParam: number;
-    currentUserEmailParam: string;
-    isASAPSubmitBetaEnabled: boolean;
-    parentReportNextStep: OnyxEntry<OnyxTypes.ReportNextStepDeprecated>;
-}) {
+function updateMoneyRequestTaxAmount(
+    transactionID: string,
+    transactionThreadReport: OnyxEntry<OnyxTypes.Report>,
+    parentReport: OnyxEntry<OnyxTypes.Report>,
+    taxAmount: number,
+    policy: OnyxEntry<OnyxTypes.Policy>,
+    policyTagList: OnyxEntry<OnyxTypes.PolicyTagLists>,
+    policyCategories: OnyxEntry<OnyxTypes.PolicyCategories>,
+    currentUserAccountIDParam: number,
+    currentUserEmailParam: string,
+    isASAPSubmitBetaEnabled: boolean,
+) {
     const transactionChanges = {
         taxAmount,
     };
@@ -5145,7 +5060,6 @@ function updateMoneyRequestTaxAmount({
         currentUserAccountIDParam,
         currentUserEmailParam,
         isASAPSubmitBetaEnabled,
-        iouReportNextStep: parentReportNextStep,
     });
     API.write(WRITE_COMMANDS.UPDATE_MONEY_REQUEST_TAX_AMOUNT, params, onyxData);
 }
@@ -5156,14 +5070,12 @@ type UpdateMoneyRequestTaxRateParams = {
     parentReport: OnyxEntry<OnyxTypes.Report>;
     taxCode: string;
     taxAmount: number;
-    taxValue: string;
     policy: OnyxEntry<OnyxTypes.Policy>;
     policyTagList: OnyxEntry<OnyxTypes.PolicyTagLists>;
     policyCategories: OnyxEntry<OnyxTypes.PolicyCategories>;
     currentUserAccountIDParam: number;
     currentUserEmailParam: string;
     isASAPSubmitBetaEnabled: boolean;
-    parentReportNextStep: OnyxEntry<OnyxTypes.ReportNextStepDeprecated>;
 };
 
 /** Updates the created tax rate of an expense */
@@ -5173,19 +5085,16 @@ function updateMoneyRequestTaxRate({
     parentReport,
     taxCode,
     taxAmount,
-    taxValue,
     policy,
     policyTagList,
     policyCategories,
     currentUserAccountIDParam,
     currentUserEmailParam,
     isASAPSubmitBetaEnabled,
-    parentReportNextStep,
 }: UpdateMoneyRequestTaxRateParams) {
     const transactionChanges = {
         taxCode,
         taxAmount,
-        taxValue,
     };
     const {params, onyxData} = getUpdateMoneyRequestParams({
         transactionID,
@@ -5198,7 +5107,6 @@ function updateMoneyRequestTaxRate({
         currentUserAccountIDParam,
         currentUserEmailParam,
         isASAPSubmitBetaEnabled,
-        iouReportNextStep: parentReportNextStep,
     });
 
     API.write(WRITE_COMMANDS.UPDATE_MONEY_REQUEST_TAX_RATE, params, onyxData);
@@ -5211,16 +5119,15 @@ type UpdateMoneyRequestDistanceParams = {
     waypoints?: WaypointCollection;
     distance?: number;
     routes?: Routes;
-    policy: OnyxEntry<OnyxTypes.Policy>;
-    policyTagList: OnyxEntry<OnyxTypes.PolicyTagLists>;
-    policyCategories: OnyxEntry<OnyxTypes.PolicyCategories>;
+    policy?: OnyxEntry<OnyxTypes.Policy>;
+    policyTagList?: OnyxEntry<OnyxTypes.PolicyTagLists>;
+    policyCategories?: OnyxEntry<OnyxTypes.PolicyCategories>;
     transactionBackup: OnyxEntry<OnyxTypes.Transaction>;
     currentUserAccountIDParam: number;
     currentUserEmailParam: string;
     isASAPSubmitBetaEnabled: boolean;
     odometerStart?: number;
     odometerEnd?: number;
-    parentReportNextStep: OnyxEntry<OnyxTypes.ReportNextStepDeprecated>;
 };
 
 /** Updates the waypoints of a distance expense */
@@ -5231,16 +5138,15 @@ function updateMoneyRequestDistance({
     waypoints,
     distance,
     routes = undefined,
-    policy,
-    policyTagList,
-    policyCategories,
+    policy = {} as OnyxTypes.Policy,
+    policyTagList = {},
+    policyCategories = {},
     transactionBackup,
     currentUserAccountIDParam,
     currentUserEmailParam,
     isASAPSubmitBetaEnabled,
     odometerStart,
     odometerEnd,
-    parentReportNextStep,
 }: UpdateMoneyRequestDistanceParams) {
     const transactionChanges: TransactionChanges = {
         ...(waypoints && {waypoints: sanitizeRecentWaypoints(waypoints)}),
@@ -5265,7 +5171,6 @@ function updateMoneyRequestDistance({
             currentUserAccountIDParam,
             currentUserEmailParam,
             isASAPSubmitBetaEnabled,
-            iouReportNextStep: parentReportNextStep,
         });
     }
     const {params, onyxData} = data;
@@ -5336,7 +5241,6 @@ function updateMoneyRequestCategory({
     currentUserEmailParam,
     isASAPSubmitBetaEnabled,
     hash,
-    parentReportNextStep,
 }: {
     transactionID: string;
     transactionThreadReport: OnyxEntry<OnyxTypes.Report>;
@@ -5350,7 +5254,6 @@ function updateMoneyRequestCategory({
     currentUserEmailParam: string;
     isASAPSubmitBetaEnabled: boolean;
     hash?: number;
-    parentReportNextStep: OnyxEntry<OnyxTypes.ReportNextStepDeprecated>;
 }) {
     const transactionChanges: TransactionChanges = {
         category,
@@ -5369,37 +5272,23 @@ function updateMoneyRequestCategory({
         currentUserEmailParam,
         isASAPSubmitBetaEnabled,
         hash,
-        iouReportNextStep: parentReportNextStep,
     });
     API.write(WRITE_COMMANDS.UPDATE_MONEY_REQUEST_CATEGORY, params, onyxData);
 }
 
 /** Updates the description of an expense */
-function updateMoneyRequestDescription({
-    transactionID,
-    transactionThreadReport,
-    parentReport,
-    comment,
-    policy,
-    policyTagList,
-    policyCategories,
-    currentUserAccountIDParam,
-    currentUserEmailParam,
-    isASAPSubmitBetaEnabled,
-    parentReportNextStep,
-}: {
-    transactionID: string;
-    transactionThreadReport: OnyxEntry<OnyxTypes.Report>;
-    parentReport: OnyxEntry<OnyxTypes.Report>;
-    comment: string;
-    policy: OnyxEntry<OnyxTypes.Policy>;
-    policyTagList: OnyxEntry<OnyxTypes.PolicyTagLists>;
-    policyCategories: OnyxEntry<OnyxTypes.PolicyCategories>;
-    currentUserAccountIDParam: number;
-    currentUserEmailParam: string;
-    isASAPSubmitBetaEnabled: boolean;
-    parentReportNextStep: OnyxEntry<OnyxTypes.ReportNextStepDeprecated>;
-}) {
+function updateMoneyRequestDescription(
+    transactionID: string,
+    transactionThreadReport: OnyxEntry<OnyxTypes.Report>,
+    parentReport: OnyxEntry<OnyxTypes.Report>,
+    comment: string,
+    policy: OnyxEntry<OnyxTypes.Policy>,
+    policyTagList: OnyxEntry<OnyxTypes.PolicyTagLists>,
+    policyCategories: OnyxEntry<OnyxTypes.PolicyCategories>,
+    currentUserAccountIDParam: number,
+    currentUserEmailParam: string,
+    isASAPSubmitBetaEnabled: boolean,
+) {
     const parsedComment = getParsedComment(comment);
     const transactionChanges: TransactionChanges = {
         comment: parsedComment,
@@ -5420,7 +5309,6 @@ function updateMoneyRequestDescription({
             currentUserAccountIDParam,
             currentUserEmailParam,
             isASAPSubmitBetaEnabled,
-            iouReportNextStep: parentReportNextStep,
         });
     }
     const {params, onyxData} = data;
@@ -5442,7 +5330,6 @@ function updateMoneyRequestDistanceRate({
     isASAPSubmitBetaEnabled,
     updatedTaxAmount,
     updatedTaxCode,
-    parentReportNextStep,
 }: {
     transactionID: string;
     transactionThreadReport: OnyxEntry<OnyxTypes.Report>;
@@ -5456,7 +5343,6 @@ function updateMoneyRequestDistanceRate({
     isASAPSubmitBetaEnabled: boolean;
     updatedTaxAmount?: number;
     updatedTaxCode?: string;
-    parentReportNextStep: OnyxEntry<OnyxTypes.ReportNextStepDeprecated>;
 }) {
     const transactionChanges: TransactionChanges = {
         customUnitRateID: rateID,
@@ -5491,7 +5377,6 @@ function updateMoneyRequestDistanceRate({
             currentUserAccountIDParam,
             currentUserEmailParam,
             isASAPSubmitBetaEnabled,
-            iouReportNextStep: parentReportNextStep,
         });
     }
     const {params, onyxData} = data;
@@ -5510,13 +5395,9 @@ const getConvertTrackedExpenseInformation = (
     resolution: IOUAction,
     isLinkedTrackedExpenseReportArchived: boolean | undefined,
 ) => {
-    const optimisticData: Array<
-        OnyxUpdate<typeof ONYXKEYS.COLLECTION.TRANSACTION | typeof ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS | typeof ONYXKEYS.COLLECTION.REPORT | typeof ONYXKEYS.COLLECTION.REPORT_ACTIONS>
-    > = [];
-    const successData: Array<OnyxUpdate<typeof ONYXKEYS.COLLECTION.REPORT_ACTIONS | typeof ONYXKEYS.COLLECTION.REPORT>> = [];
-    const failureData: Array<
-        OnyxUpdate<typeof ONYXKEYS.COLLECTION.TRANSACTION | typeof ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS | typeof ONYXKEYS.COLLECTION.REPORT | typeof ONYXKEYS.COLLECTION.REPORT_ACTIONS>
-    > = [];
+    const optimisticData: OnyxUpdate[] = [];
+    const successData: OnyxUpdate[] = [];
+    const failureData: OnyxUpdate[] = [];
 
     // Delete the transaction from the track expense report
     const {
@@ -5599,7 +5480,6 @@ type AddTrackedExpenseToPolicyParam = {
     moneyRequestCreatedReportActionID: string | undefined;
     moneyRequestPreviewReportActionID: string;
     distance: number | undefined;
-    attendees: string | undefined;
 } & ConvertTrackedWorkspaceParams;
 
 type ConvertTrackedExpenseToRequestParams = {
@@ -5632,11 +5512,11 @@ type ConvertTrackedExpenseToRequestParams = {
         createdReportActionID: string | undefined;
         reportActionID: string;
     };
-    onyxData: OnyxData<OnyxKey>;
+    onyxData: OnyxData;
     workspaceParams?: ConvertTrackedWorkspaceParams;
 };
 
-function addTrackedExpenseToPolicy(parameters: AddTrackedExpenseToPolicyParam, onyxData: OnyxData<OnyxKey>) {
+function addTrackedExpenseToPolicy(parameters: AddTrackedExpenseToPolicyParam, onyxData: OnyxData) {
     API.write(WRITE_COMMANDS.ADD_TRACKED_EXPENSE_TO_POLICY, parameters, onyxData);
 }
 
@@ -5658,15 +5538,9 @@ function convertTrackedExpenseToRequest(convertTrackedExpenseParams: ConvertTrac
         transactionThreadReportID,
         isLinkedTrackedExpenseReportArchived,
     } = transactionParams;
-    const optimisticData: Array<OnyxUpdate<OnyxKey>> = [];
-    const successData: Array<OnyxUpdate<OnyxKey>> = [];
-    const failureData: Array<OnyxUpdate<OnyxKey>> = [];
-
-    optimisticData?.push(...(onyxData.optimisticData ?? []));
-    successData?.push(...(onyxData.successData ?? []));
-    failureData?.push(...(onyxData.failureData ?? []));
+    const {optimisticData: convertTransactionOptimisticData = [], successData: convertTransactionSuccessData = [], failureData: convertTransactionFailureData = []} = onyxData;
 
-    const convertTrackedExpenseInformation = getConvertTrackedExpenseInformation(
+    const {optimisticData, successData, failureData, modifiedExpenseReportActionID} = getConvertTrackedExpenseInformation(
         transactionID,
         actionableWhisperReportActionID,
         iouParams.reportID,
@@ -5676,9 +5550,10 @@ function convertTrackedExpenseToRequest(convertTrackedExpenseParams: ConvertTrac
         CONST.IOU.ACTION.SUBMIT,
         isLinkedTrackedExpenseReportArchived,
     );
-    optimisticData?.push(...(convertTrackedExpenseInformation.optimisticData ?? []));
-    successData?.push(...(convertTrackedExpenseInformation.successData ?? []));
-    failureData?.push(...(convertTrackedExpenseInformation.failureData ?? []));
+
+    optimisticData?.push(...convertTransactionOptimisticData);
+    successData?.push(...convertTransactionSuccessData);
+    failureData?.push(...convertTransactionFailureData);
 
     if (workspaceParams) {
         const params = {
@@ -5688,14 +5563,13 @@ function convertTrackedExpenseToRequest(convertTrackedExpenseParams: ConvertTrac
             comment,
             created,
             merchant,
-            attendees: attendees ? JSON.stringify(attendees) : undefined,
             reimbursable: true,
             transactionID,
             actionableWhisperReportActionID,
             moneyRequestReportID: iouParams.reportID,
             moneyRequestCreatedReportActionID: iouParams.createdReportActionID,
             moneyRequestPreviewReportActionID: iouParams.reportActionID,
-            modifiedExpenseReportActionID: convertTrackedExpenseInformation.modifiedExpenseReportActionID,
+            modifiedExpenseReportActionID,
             reportPreviewReportActionID: chatParams.reportPreviewReportActionID,
             ...workspaceParams,
         };
@@ -5722,7 +5596,7 @@ function convertTrackedExpenseToRequest(convertTrackedExpenseParams: ConvertTrac
         moneyRequestCreatedReportActionID: iouParams.createdReportActionID,
         moneyRequestPreviewReportActionID: iouParams.reportActionID,
         transactionThreadReportID,
-        modifiedExpenseReportActionID: convertTrackedExpenseInformation.modifiedExpenseReportActionID,
+        modifiedExpenseReportActionID,
         reportPreviewReportActionID: chatParams.reportPreviewReportActionID,
     };
     API.write(WRITE_COMMANDS.CONVERT_TRACKED_EXPENSE_TO_REQUEST, parameters, {optimisticData, successData, failureData});
@@ -5974,16 +5848,8 @@ function shareTrackedExpense(trackedExpenseParams: TrackedExpenseParams) {
         return;
     }
 
-    const optimisticData: Array<OnyxUpdate<OnyxKey>> = [];
-    const successData: Array<OnyxUpdate<OnyxKey>> = [];
-    const failureData: Array<OnyxUpdate<OnyxKey>> = [];
-
     const {optimisticData: shareTrackedExpenseOptimisticData = [], successData: shareTrackedExpenseSuccessData = [], failureData: shareTrackedExpenseFailureData = []} = onyxData ?? {};
 
-    optimisticData?.push(...shareTrackedExpenseOptimisticData);
-    successData?.push(...shareTrackedExpenseSuccessData);
-    failureData?.push(...shareTrackedExpenseFailureData);
-
     const {transactionID} = transactionParams;
     const {
         actionableWhisperReportActionID,
@@ -5997,7 +5863,7 @@ function shareTrackedExpense(trackedExpenseParams: TrackedExpenseParams) {
         isLinkedTrackedExpenseReportArchived,
     } = reportInformation;
 
-    const convertTrackedExpenseInformation = getConvertTrackedExpenseInformation(
+    const {optimisticData, successData, failureData, modifiedExpenseReportActionID} = getConvertTrackedExpenseInformation(
         transactionID,
         actionableWhisperReportActionID,
         moneyRequestReportID,
@@ -6008,9 +5874,9 @@ function shareTrackedExpense(trackedExpenseParams: TrackedExpenseParams) {
         isLinkedTrackedExpenseReportArchived,
     );
 
-    optimisticData?.push(...(convertTrackedExpenseInformation.optimisticData ?? []));
-    successData?.push(...(convertTrackedExpenseInformation.successData ?? []));
-    failureData?.push(...(convertTrackedExpenseInformation.failureData ?? []));
+    optimisticData?.push(...shareTrackedExpenseOptimisticData);
+    successData?.push(...shareTrackedExpenseSuccessData);
+    failureData?.push(...shareTrackedExpenseFailureData);
 
     const policyEmployeeList = policyParams?.policy?.employeeList;
     if (!policyEmployeeList?.[accountantEmail]) {
@@ -6053,7 +5919,7 @@ function shareTrackedExpense(trackedExpenseParams: TrackedExpenseParams) {
         moneyRequestReportID,
         moneyRequestCreatedReportActionID,
         actionableWhisperReportActionID,
-        modifiedExpenseReportActionID: convertTrackedExpenseInformation.modifiedExpenseReportActionID,
+        modifiedExpenseReportActionID,
         reportPreviewReportActionID,
         policyExpenseChatReportID: createdWorkspaceParams?.expenseChatReportID,
         policyExpenseCreatedReportActionID: createdWorkspaceParams?.expenseCreatedReportActionID,
@@ -6221,7 +6087,7 @@ function requestMoney(requestMoneyInformation: RequestMoneyInformation): {iouRep
                           category,
                           tag,
                           taxCode,
-                          taxAmount: Math.abs(taxAmount),
+                          taxAmount,
                           billable,
                           policyID: chatReport.policyID,
                           waypoints: sanitizedWaypoints,
@@ -6617,9 +6483,7 @@ function trackExpense(params: CreateTrackExpenseParams) {
         value: recentServerValidatedWaypoints,
     });
 
-    const isDistanceRequest = isMapDistanceRequest(transaction) || isManualDistanceRequestTransactionUtils(transaction) || isOdometerDistanceRequestTransactionUtils(transaction);
-
-    if (isDistanceRequest) {
+    if (isMapDistanceRequest(transaction) || isManualDistanceRequestTransactionUtils(transaction) || isOdometerDistanceRequestTransactionUtils(transaction)) {
         // @ts-expect-error - will be solved in https://github.com/Expensify/App/issues/73830
         onyxData?.optimisticData?.push({
             onyxMethod: Onyx.METHOD.SET,
@@ -6754,7 +6618,6 @@ function trackExpense(params: CreateTrackExpenseParams) {
                 reportPreviewReportActionID: reportPreviewAction?.reportActionID,
                 optimisticReportID,
                 optimisticReportActionID,
-                policyID: isDistanceRequest ? undefined : policy?.id,
                 receipt: isFileUploadable(trackedReceipt) ? trackedReceipt : undefined,
                 receiptState: trackedReceipt?.state,
                 reimbursable,
@@ -6770,7 +6633,6 @@ function trackExpense(params: CreateTrackExpenseParams) {
                 waypoints: sanitizedWaypoints,
                 customUnitRateID,
                 description: parsedComment,
-                isDistance: isMapDistanceRequest(transaction) || isManualDistanceRequestTransactionUtils(transaction),
             };
             if (actionableWhisperReportActionIDParam) {
                 parameters.actionableWhisperReportActionID = actionableWhisperReportActionIDParam;
@@ -7356,38 +7218,910 @@ function createSplitsAndOnyxData({
     };
 }
 
-function setDraftSplitTransaction(
-    transactionID: string | undefined,
-    splitTransactionDraft: OnyxEntry<OnyxTypes.Transaction>,
-    transactionChanges: TransactionChanges = {},
-    policy?: OnyxEntry<OnyxTypes.Policy>,
-) {
-    if (!transactionID) {
-        return undefined;
-    }
-    let draftSplitTransaction = splitTransactionDraft;
-
-    if (!draftSplitTransaction) {
-        draftSplitTransaction = allTransactions[`${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`];
-    }
-
-    const updatedTransaction = draftSplitTransaction
-        ? getUpdatedTransaction({
-              transaction: draftSplitTransaction,
-              transactionChanges,
-              isFromExpenseReport: false,
-              shouldUpdateReceiptState: false,
-              policy,
-          })
-        : null;
-
-    Onyx.merge(`${ONYXKEYS.COLLECTION.SPLIT_TRANSACTION_DRAFT}${transactionID}`, updatedTransaction);
-}
-
-/** Requests money based on a distance (e.g. mileage from a map) */
-function createDistanceRequest(distanceRequestInformation: CreateDistanceRequestInformation) {
-    const {
-        report,
+type SplitBillActionsParams = {
+    participants: Participant[];
+    currentUserLogin: string;
+    currentUserAccountID: number;
+    amount: number;
+    comment: string;
+    currency: string;
+    merchant: string;
+    created: string;
+    category?: string;
+    tag?: string;
+    billable?: boolean;
+    reimbursable?: boolean;
+    iouRequestType?: IOURequestType;
+    existingSplitChatReportID?: string;
+    splitShares?: SplitShares;
+    taxCode?: string;
+    taxAmount?: number;
+    isRetry?: boolean;
+    policyRecentlyUsedCategories?: OnyxEntry<OnyxTypes.RecentlyUsedCategories>;
+    policyRecentlyUsedTags: OnyxEntry<RecentlyUsedTags>;
+    isASAPSubmitBetaEnabled: boolean;
+    transactionViolations: OnyxCollection<OnyxTypes.TransactionViolation[]>;
+    quickAction: OnyxEntry<OnyxTypes.QuickAction>;
+    policyRecentlyUsedCurrencies: string[];
+};
+
+/**
+ * @param amount - always in smallest currency unit
+ * @param existingSplitChatReportID - Either a group DM or a expense chat
+ */
+function splitBill({
+    participants,
+    currentUserLogin,
+    currentUserAccountID,
+    amount,
+    comment,
+    currency,
+    merchant,
+    created,
+    category = '',
+    tag = '',
+    billable = false,
+    reimbursable = false,
+    iouRequestType = CONST.IOU.REQUEST_TYPE.MANUAL,
+    existingSplitChatReportID,
+    splitShares = {},
+    taxCode = '',
+    taxAmount = 0,
+    policyRecentlyUsedCategories,
+    isASAPSubmitBetaEnabled,
+    transactionViolations,
+    quickAction,
+    policyRecentlyUsedCurrencies,
+    policyRecentlyUsedTags,
+}: SplitBillActionsParams) {
+    const parsedComment = getParsedComment(comment);
+    const {splitData, splits, onyxData} = createSplitsAndOnyxData({
+        participants,
+        currentUserLogin,
+        currentUserAccountID,
+        existingSplitChatReportID,
+        transactionParams: {
+            amount,
+            comment: parsedComment,
+            currency,
+            merchant,
+            created,
+            category,
+            tag,
+            splitShares,
+            billable,
+            reimbursable,
+            iouRequestType,
+            taxCode,
+            taxAmount,
+        },
+        policyRecentlyUsedCategories,
+        policyRecentlyUsedTags,
+        isASAPSubmitBetaEnabled,
+        transactionViolations,
+        quickAction,
+        policyRecentlyUsedCurrencies,
+    });
+
+    const parameters: SplitBillParams = {
+        reportID: splitData.chatReportID,
+        amount,
+        splits: JSON.stringify(splits),
+        currency,
+        comment: parsedComment,
+        category,
+        merchant,
+        created,
+        tag,
+        billable,
+        reimbursable,
+        transactionID: splitData.transactionID,
+        reportActionID: splitData.reportActionID,
+        createdReportActionID: splitData.createdReportActionID,
+        policyID: splitData.policyID,
+        chatType: splitData.chatType,
+        taxCode,
+        taxAmount,
+        description: parsedComment,
+    };
+
+    playSound(SOUNDS.DONE);
+    API.write(WRITE_COMMANDS.SPLIT_BILL, parameters, onyxData);
+    // eslint-disable-next-line @typescript-eslint/no-deprecated
+    InteractionManager.runAfterInteractions(() => removeDraftTransaction(CONST.IOU.OPTIMISTIC_TRANSACTION_ID));
+
+    dismissModalAndOpenReportInInboxTab(existingSplitChatReportID);
+
+    notifyNewAction(splitData.chatReportID, currentUserAccountID);
+}
+
+/**
+ * @param amount - always in the smallest currency unit
+ */
+function splitBillAndOpenReport({
+    participants,
+    currentUserLogin,
+    currentUserAccountID,
+    amount,
+    comment,
+    currency,
+    merchant,
+    created,
+    category = '',
+    tag = '',
+    billable = false,
+    reimbursable = false,
+    iouRequestType = CONST.IOU.REQUEST_TYPE.MANUAL,
+    splitShares = {},
+    taxCode = '',
+    taxAmount = 0,
+    existingSplitChatReportID,
+    policyRecentlyUsedCategories,
+    policyRecentlyUsedTags,
+    isASAPSubmitBetaEnabled,
+    transactionViolations,
+    quickAction,
+    policyRecentlyUsedCurrencies,
+}: SplitBillActionsParams) {
+    const parsedComment = getParsedComment(comment);
+    const {splitData, splits, onyxData} = createSplitsAndOnyxData({
+        participants,
+        currentUserLogin,
+        currentUserAccountID,
+        existingSplitChatReportID,
+        isASAPSubmitBetaEnabled,
+        transactionParams: {
+            amount,
+            comment: parsedComment,
+            currency,
+            merchant,
+            created,
+            category,
+            tag,
+            splitShares,
+            billable,
+            reimbursable,
+            iouRequestType,
+            taxCode,
+            taxAmount,
+        },
+        policyRecentlyUsedCategories,
+        policyRecentlyUsedTags,
+        transactionViolations,
+        quickAction,
+        policyRecentlyUsedCurrencies,
+    });
+
+    const parameters: SplitBillParams = {
+        reportID: splitData.chatReportID,
+        amount,
+        splits: JSON.stringify(splits),
+        currency,
+        merchant,
+        created,
+        comment: parsedComment,
+        category,
+        tag,
+        billable,
+        reimbursable,
+        transactionID: splitData.transactionID,
+        reportActionID: splitData.reportActionID,
+        createdReportActionID: splitData.createdReportActionID,
+        policyID: splitData.policyID,
+        chatType: splitData.chatType,
+        taxCode,
+        taxAmount,
+        description: parsedComment,
+    };
+
+    playSound(SOUNDS.DONE);
+    API.write(WRITE_COMMANDS.SPLIT_BILL_AND_OPEN_REPORT, parameters, onyxData);
+    // eslint-disable-next-line @typescript-eslint/no-deprecated
+    InteractionManager.runAfterInteractions(() => removeDraftTransaction(CONST.IOU.OPTIMISTIC_TRANSACTION_ID));
+
+    dismissModalAndOpenReportInInboxTab(splitData.chatReportID);
+    notifyNewAction(splitData.chatReportID, currentUserAccountID);
+}
+
+/** Used exclusively for starting a split expense request that contains a receipt, the split request will be completed once the receipt is scanned
+ *  or user enters details manually.
+ *
+ * @param existingSplitChatReportID - Either a group DM or a expense chat
+ */
+function startSplitBill({
+    participants,
+    currentUserLogin,
+    currentUserAccountID,
+    comment,
+    receipt,
+    existingSplitChatReportID,
+    billable = false,
+    reimbursable = false,
+    category = '',
+    tag = '',
+    currency,
+    taxCode = '',
+    taxAmount = 0,
+    shouldPlaySound = true,
+    policyRecentlyUsedCategories,
+    policyRecentlyUsedTags,
+    quickAction,
+    policyRecentlyUsedCurrencies,
+}: StartSplitBilActionParams) {
+    const currentUserEmailForIOUSplit = addSMSDomainIfPhoneNumber(currentUserLogin);
+    const participantAccountIDs = participants.map((participant) => Number(participant.accountID));
+    const {splitChatReport, existingSplitChatReport} = getOrCreateOptimisticSplitChatReport(existingSplitChatReportID, participants, participantAccountIDs, currentUserAccountID);
+    const isOwnPolicyExpenseChat = !!splitChatReport.isOwnPolicyExpenseChat;
+    const parsedComment = getParsedComment(comment);
+
+    // ReportID is -2 (aka "deleted") on the group transaction
+    const splitTransaction = buildOptimisticTransaction({
+        transactionParams: {
+            amount: 0,
+            currency,
+            reportID: CONST.REPORT.SPLIT_REPORT_ID,
+            comment: parsedComment,
+            merchant: CONST.TRANSACTION.PARTIAL_TRANSACTION_MERCHANT,
+            receipt,
+            category,
+            tag,
+            taxCode,
+            taxAmount,
+            billable,
+            reimbursable,
+        },
+    });
+
+    const filename = splitTransaction.receipt?.filename;
+
+    // Note: The created action must be optimistically generated before the IOU action so there's no chance that the created action appears after the IOU action in the chat
+    const splitChatCreatedReportAction = buildOptimisticCreatedReportAction(currentUserEmailForIOUSplit);
+    const splitIOUReportAction = buildOptimisticIOUReportAction({
+        type: CONST.IOU.REPORT_ACTION_TYPE.SPLIT,
+        amount: 0,
+        currency: CONST.CURRENCY.USD,
+        comment: parsedComment,
+        participants,
+        transactionID: splitTransaction.transactionID,
+        isOwnPolicyExpenseChat,
+    });
+
+    splitChatReport.lastReadTime = DateUtils.getDBTime();
+    splitChatReport.lastMessageText = getReportActionText(splitIOUReportAction);
+    splitChatReport.lastMessageHtml = getReportActionHtml(splitIOUReportAction);
+
+    // If we have an existing splitChatReport (group chat or workspace) use it's pending fields, otherwise indicate that we are adding a chat
+    if (!existingSplitChatReport) {
+        splitChatReport.pendingFields = {
+            createChat: CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD,
+        };
+    }
+
+    const optimisticData: OnyxUpdate[] = [
+        {
+            // Use set for new reports because it doesn't exist yet, is faster,
+            // and we need the data to be available when we navigate to the chat page
+            onyxMethod: existingSplitChatReport ? Onyx.METHOD.MERGE : Onyx.METHOD.SET,
+            key: `${ONYXKEYS.COLLECTION.REPORT}${splitChatReport.reportID}`,
+            value: splitChatReport,
+        },
+        {
+            onyxMethod: Onyx.METHOD.SET,
+            key: ONYXKEYS.NVP_QUICK_ACTION_GLOBAL_CREATE,
+            value: {
+                action: CONST.QUICK_ACTIONS.SPLIT_SCAN,
+                chatReportID: splitChatReport.reportID,
+                isFirstQuickAction: isEmptyObject(quickAction),
+            },
+        },
+        existingSplitChatReport
+            ? {
+                  onyxMethod: Onyx.METHOD.MERGE,
+                  key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${splitChatReport.reportID}`,
+                  value: {
+                      [splitIOUReportAction.reportActionID]: splitIOUReportAction as OnyxTypes.ReportAction,
+                  },
+              }
+            : {
+                  onyxMethod: Onyx.METHOD.SET,
+                  key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${splitChatReport.reportID}`,
+                  value: {
+                      [splitChatCreatedReportAction.reportActionID]: splitChatCreatedReportAction,
+                      [splitIOUReportAction.reportActionID]: splitIOUReportAction as OnyxTypes.ReportAction,
+                  },
+              },
+        {
+            onyxMethod: Onyx.METHOD.SET,
+            key: `${ONYXKEYS.COLLECTION.TRANSACTION}${splitTransaction.transactionID}`,
+            value: splitTransaction,
+        },
+    ];
+
+    if (!existingSplitChatReport) {
+        optimisticData.push({
+            onyxMethod: Onyx.METHOD.MERGE,
+            key: `${ONYXKEYS.COLLECTION.REPORT_METADATA}${splitChatReport.reportID}`,
+            value: {
+                isOptimisticReport: true,
+            },
+        });
+    }
+
+    const successData: Array<
+        OnyxUpdate<typeof ONYXKEYS.COLLECTION.REPORT_ACTIONS | typeof ONYXKEYS.COLLECTION.TRANSACTION | typeof ONYXKEYS.COLLECTION.REPORT_METADATA | typeof ONYXKEYS.COLLECTION.REPORT>
+    > = [
+        {
+            onyxMethod: Onyx.METHOD.MERGE,
+            key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${splitChatReport.reportID}`,
+            value: {
+                ...(existingSplitChatReport ? {} : {[splitChatCreatedReportAction.reportActionID]: {pendingAction: null}}),
+                [splitIOUReportAction.reportActionID]: {pendingAction: null},
+            },
+        },
+        {
+            onyxMethod: Onyx.METHOD.MERGE,
+            key: `${ONYXKEYS.COLLECTION.TRANSACTION}${splitTransaction.transactionID}`,
+            value: {pendingAction: null},
+        },
+    ];
+
+    if (!existingSplitChatReport) {
+        successData.push({
+            onyxMethod: Onyx.METHOD.MERGE,
+            key: `${ONYXKEYS.COLLECTION.REPORT_METADATA}${splitChatReport.reportID}`,
+            value: {
+                isOptimisticReport: false,
+            },
+        });
+    }
+
+    const redundantParticipants: Record<number, null> = {};
+    if (!existingSplitChatReport) {
+        successData.push({
+            onyxMethod: Onyx.METHOD.MERGE,
+            key: `${ONYXKEYS.COLLECTION.REPORT}${splitChatReport.reportID}`,
+            value: {pendingFields: {createChat: null}, participants: redundantParticipants},
+        });
+    }
+
+    const failureData: Array<
+        OnyxUpdate<typeof ONYXKEYS.COLLECTION.TRANSACTION | typeof ONYXKEYS.NVP_QUICK_ACTION_GLOBAL_CREATE | typeof ONYXKEYS.COLLECTION.REPORT_ACTIONS | typeof ONYXKEYS.COLLECTION.REPORT>
+    > = [
+        {
+            onyxMethod: Onyx.METHOD.MERGE,
+            key: `${ONYXKEYS.COLLECTION.TRANSACTION}${splitTransaction.transactionID}`,
+            value: {
+                errors: getMicroSecondOnyxErrorWithTranslationKey('iou.error.genericCreateFailureMessage'),
+            },
+        },
+        {
+            onyxMethod: Onyx.METHOD.SET,
+            key: ONYXKEYS.NVP_QUICK_ACTION_GLOBAL_CREATE,
+            value: quickAction ?? null,
+        },
+    ];
+
+    const retryParams = {
+        participants: participants.map(({icons, ...rest}) => rest),
+        currentUserLogin,
+        currentUserAccountID,
+        comment,
+        receipt,
+        existingSplitChatReportID,
+        billable,
+        reimbursable,
+        category,
+        tag,
+        currency,
+        taxCode,
+        taxAmount,
+        quickAction,
+        policyRecentlyUsedCurrencies,
+        policyRecentlyUsedTags,
+    };
+
+    if (existingSplitChatReport) {
+        failureData.push({
+            onyxMethod: Onyx.METHOD.MERGE,
+            key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${splitChatReport.reportID}`,
+            value: {
+                [splitIOUReportAction.reportActionID]: {
+                    errors: getReceiptError(receipt, filename, undefined, undefined, CONST.IOU.ACTION_PARAMS.START_SPLIT_BILL, retryParams),
+                },
+            },
+        });
+    } else {
+        failureData.push(
+            {
+                onyxMethod: Onyx.METHOD.MERGE,
+                key: `${ONYXKEYS.COLLECTION.REPORT}${splitChatReport.reportID}`,
+                value: {
+                    errorFields: {
+                        createChat: getMicroSecondOnyxErrorWithTranslationKey('report.genericCreateReportFailureMessage'),
+                    },
+                },
+            },
+            {
+                onyxMethod: Onyx.METHOD.MERGE,
+                key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${splitChatReport.reportID}`,
+                value: {
+                    [splitChatCreatedReportAction.reportActionID]: {
+                        errors: getMicroSecondOnyxErrorWithTranslationKey('report.genericCreateReportFailureMessage'),
+                    },
+                    [splitIOUReportAction.reportActionID]: {
+                        errors: getReceiptError(receipt, filename, undefined, undefined, CONST.IOU.ACTION_PARAMS.START_SPLIT_BILL, retryParams),
+                    },
+                },
+            },
+        );
+    }
+
+    const splits: Split[] = [{email: currentUserEmailForIOUSplit, accountID: currentUserAccountID}];
+
+    for (const participant of participants) {
+        // Disabling this line since participant.login can be an empty string
+        // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
+        const email = participant.isOwnPolicyExpenseChat ? '' : addSMSDomainIfPhoneNumber(participant.login || participant.text || '').toLowerCase();
+        const accountID = participant.isOwnPolicyExpenseChat ? 0 : Number(participant.accountID);
+        if (email === currentUserEmailForIOUSplit) {
+            continue;
+        }
+
+        // When splitting with a expense chat, we only need to supply the policyID and the workspace reportID as it's needed so we can update the report preview
+        if (participant.isOwnPolicyExpenseChat) {
+            splits.push({
+                policyID: participant.policyID,
+                chatReportID: splitChatReport.reportID,
+            });
+            continue;
+        }
+
+        const participantPersonalDetails = allPersonalDetails[participant?.accountID ?? CONST.DEFAULT_NUMBER_ID];
+        if (!participantPersonalDetails) {
+            optimisticData.push({
+                onyxMethod: Onyx.METHOD.MERGE,
+                key: ONYXKEYS.PERSONAL_DETAILS_LIST,
+                value: {
+                    [accountID]: {
+                        accountID,
+                        // Disabling this line since participant.displayName can be an empty string
+                        // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
+                        displayName: formatPhoneNumber(participant.displayName || email),
+                        // Disabling this line since participant.login can be an empty string
+                        // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
+                        login: participant.login || participant.text,
+                        isOptimisticPersonalDetail: true,
+                    },
+                },
+            });
+            // BE will send different participants. We clear the optimistic ones to avoid duplicated entries
+            redundantParticipants[accountID] = null;
+        }
+
+        splits.push({
+            email,
+            accountID,
+        });
+    }
+
+    for (const participant of participants) {
+        const isPolicyExpenseChat = isPolicyExpenseChatReportUtil(participant);
+        if (!isPolicyExpenseChat) {
+            continue;
+        }
+        const optimisticPolicyRecentlyUsedCategories = mergePolicyRecentlyUsedCategories(category, policyRecentlyUsedCategories);
+        const optimisticPolicyRecentlyUsedTags = buildOptimisticPolicyRecentlyUsedTags({
+            policyTags: getPolicyTagsData(participant.policyID),
+            policyRecentlyUsedTags,
+            transactionTags: tag,
+        });
+        const optimisticRecentlyUsedCurrencies = mergePolicyRecentlyUsedCurrencies(currency, policyRecentlyUsedCurrencies);
+
+        if (optimisticPolicyRecentlyUsedCategories.length > 0) {
+            optimisticData.push({
+                onyxMethod: Onyx.METHOD.SET,
+                key: `${ONYXKEYS.COLLECTION.POLICY_RECENTLY_USED_CATEGORIES}${participant.policyID}`,
+                value: optimisticPolicyRecentlyUsedCategories,
+            });
+        }
+
+        if (optimisticRecentlyUsedCurrencies.length > 0) {
+            optimisticData.push({
+                onyxMethod: Onyx.METHOD.SET,
+                key: ONYXKEYS.RECENTLY_USED_CURRENCIES,
+                value: optimisticRecentlyUsedCurrencies,
+            });
+        }
+
+        if (!isEmptyObject(optimisticPolicyRecentlyUsedTags)) {
+            optimisticData.push({
+                onyxMethod: Onyx.METHOD.MERGE,
+                key: `${ONYXKEYS.COLLECTION.POLICY_RECENTLY_USED_TAGS}${participant.policyID}`,
+                value: optimisticPolicyRecentlyUsedTags,
+            });
+        }
+    }
+
+    // Save the new splits array into the transaction's comment in case the user calls CompleteSplitBill while offline
+    optimisticData.push({
+        onyxMethod: Onyx.METHOD.MERGE,
+        key: `${ONYXKEYS.COLLECTION.TRANSACTION}${splitTransaction.transactionID}`,
+        value: {
+            comment: {
+                splits,
+            },
+        },
+    });
+
+    const parameters: StartSplitBillParams = {
+        chatReportID: splitChatReport.reportID,
+        reportActionID: splitIOUReportAction.reportActionID,
+        transactionID: splitTransaction.transactionID,
+        splits: JSON.stringify(splits),
+        receipt,
+        comment: parsedComment,
+        category,
+        tag,
+        currency,
+        isFromGroupDM: !existingSplitChatReport,
+        billable,
+        reimbursable,
+        ...(existingSplitChatReport ? {} : {createdReportActionID: splitChatCreatedReportAction.reportActionID}),
+        chatType: splitChatReport?.chatType,
+        taxCode,
+        taxAmount,
+        description: parsedComment,
+    };
+    if (shouldPlaySound) {
+        playSound(SOUNDS.DONE);
+    }
+
+    API.write(WRITE_COMMANDS.START_SPLIT_BILL, parameters, {optimisticData, successData, failureData});
+
+    Navigation.dismissModalWithReport({reportID: splitChatReport.reportID});
+    notifyNewAction(splitChatReport.reportID, currentUserAccountID);
+
+    // Return the split transactionID for testing purpose
+    return {splitTransactionID: splitTransaction.transactionID};
+}
+
+/** Used for editing a split expense while it's still scanning or when SmartScan fails, it completes a split expense started by startSplitBill above.
+ *
+ * @param chatReportID - The group chat or workspace reportID
+ * @param reportAction - The split action that lives in the chatReport above
+ * @param updatedTransaction - The updated **draft** split transaction
+ * @param sessionAccountID - accountID of the current user
+ * @param sessionEmail - email of the current user
+ */
+function completeSplitBill(
+    chatReportID: string,
+    reportAction: OnyxEntry<OnyxTypes.ReportAction>,
+    updatedTransaction: OnyxEntry<OnyxTypes.Transaction>,
+    sessionAccountID: number,
+    isASAPSubmitBetaEnabled: boolean,
+    quickAction: OnyxEntry<OnyxTypes.QuickAction>,
+    transactionViolations: OnyxCollection<OnyxTypes.TransactionViolation[]>,
+    sessionEmail?: string,
+) {
+    if (!reportAction) {
+        return;
+    }
+
+    const parsedComment = getParsedComment(Parser.htmlToMarkdown(updatedTransaction?.comment?.comment ?? ''));
+    if (updatedTransaction?.comment) {
+        // eslint-disable-next-line no-param-reassign
+        updatedTransaction.comment.comment = parsedComment;
+    }
+    const currentUserEmailForIOUSplit = addSMSDomainIfPhoneNumber(sessionEmail);
+    const transactionID = updatedTransaction?.transactionID;
+    const unmodifiedTransaction = allTransactions[`${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`];
+
+    // Save optimistic updated transaction and action
+    const optimisticData: OnyxUpdate[] = [
+        {
+            onyxMethod: Onyx.METHOD.MERGE,
+            key: `${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`,
+            value: {
+                ...updatedTransaction,
+                receipt: {
+                    state: CONST.IOU.RECEIPT_STATE.OPEN,
+                },
+            },
+        },
+        {
+            onyxMethod: Onyx.METHOD.MERGE,
+            key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${chatReportID}`,
+            value: {
+                [reportAction.reportActionID]: {
+                    lastModified: DateUtils.getDBTime(),
+                    originalMessage: {
+                        whisperedTo: [],
+                    },
+                },
+            },
+        },
+    ];
+
+    const successData: OnyxUpdate[] = [
+        {
+            onyxMethod: Onyx.METHOD.MERGE,
+            key: `${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`,
+            value: {pendingAction: null},
+        },
+        {
+            onyxMethod: Onyx.METHOD.MERGE,
+            key: `${ONYXKEYS.COLLECTION.SPLIT_TRANSACTION_DRAFT}${transactionID}`,
+            value: {pendingAction: null},
+        },
+    ];
+
+    const failureData: OnyxUpdate[] = [
+        {
+            onyxMethod: Onyx.METHOD.MERGE,
+            key: `${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`,
+            value: {
+                ...unmodifiedTransaction,
+                errors: getMicroSecondOnyxErrorWithTranslationKey('iou.error.genericCreateFailureMessage'),
+            },
+        },
+        {
+            onyxMethod: Onyx.METHOD.MERGE,
+            key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${chatReportID}`,
+            value: {
+                [reportAction.reportActionID]: {
+                    ...reportAction,
+                    errors: getMicroSecondOnyxErrorWithTranslationKey('iou.error.genericCreateFailureMessage'),
+                },
+            },
+        },
+    ];
+
+    const splitParticipants: Split[] = updatedTransaction?.comment?.splits ?? [];
+    const amount = updatedTransaction?.modifiedAmount;
+    const currency = updatedTransaction?.modifiedCurrency;
+
+    // Exclude the current user when calculating the split amount, `calculateAmount` takes it into account
+    const splitAmount = calculateIOUAmount(splitParticipants.length - 1, amount ?? 0, currency ?? '', false);
+    const splitTaxAmount = calculateIOUAmount(splitParticipants.length - 1, updatedTransaction?.taxAmount ?? 0, currency ?? '', false);
+
+    const splits: Split[] = [{email: currentUserEmailForIOUSplit}];
+    for (const participant of splitParticipants) {
+        // Skip creating the transaction for the current user
+        if (participant.email === currentUserEmailForIOUSplit) {
+            continue;
+        }
+        const isPolicyExpenseChat = !!participant.policyID;
+
+        if (!isPolicyExpenseChat) {
+            // In case this is still the optimistic accountID saved in the splits array, return early as we cannot know
+            // if there is an existing chat between the split creator and this participant
+            // Instead, we will rely on Auth generating the report IDs and the user won't see any optimistic chats or reports created
+            const participantPersonalDetails: OnyxTypes.PersonalDetails | null = allPersonalDetails[participant?.accountID ?? CONST.DEFAULT_NUMBER_ID];
+            if (!participantPersonalDetails || participantPersonalDetails.isOptimisticPersonalDetail) {
+                splits.push({
+                    email: participant.email,
+                });
+                continue;
+            }
+        }
+
+        let oneOnOneChatReport: OnyxEntry<OnyxTypes.Report>;
+        let isNewOneOnOneChatReport = false;
+        if (isPolicyExpenseChat) {
+            // The expense chat reportID is saved in the splits array when starting a split expense with a workspace
+            oneOnOneChatReport = allReports?.[`${ONYXKEYS.COLLECTION.REPORT}${participant.chatReportID}`];
+        } else {
+            const existingChatReport = getChatByParticipants(participant.accountID ? [participant.accountID, sessionAccountID] : []);
+            isNewOneOnOneChatReport = !existingChatReport;
+            oneOnOneChatReport =
+                existingChatReport ??
+                buildOptimisticChatReport({
+                    participantList: participant.accountID ? [participant.accountID, sessionAccountID] : [],
+                });
+        }
+
+        let oneOnOneIOUReport: OneOnOneIOUReport = oneOnOneChatReport?.iouReportID ? allReports?.[`${ONYXKEYS.COLLECTION.REPORT}${oneOnOneChatReport.iouReportID}`] : null;
+        const shouldCreateNewOneOnOneIOUReport = shouldCreateNewMoneyRequestReportReportUtils(oneOnOneIOUReport, oneOnOneChatReport, false);
+
+        // Generate IDs upfront so we can pass them to buildOptimisticExpenseReport for formula computation
+        const optimisticTransactionID = NumberUtils.rand64();
+        const optimisticExpenseReportID = generateReportID();
+
+        if (!oneOnOneIOUReport || shouldCreateNewOneOnOneIOUReport) {
+            const reportTransactions = buildMinimalTransactionForFormula(
+                optimisticTransactionID,
+                optimisticExpenseReportID,
+                updatedTransaction?.modifiedCreated,
+                splitAmount,
+                currency ?? '',
+                updatedTransaction?.modifiedMerchant,
+            );
+
+            oneOnOneIOUReport = isPolicyExpenseChat
+                ? buildOptimisticExpenseReport(
+                      oneOnOneChatReport?.reportID,
+                      participant.policyID,
+                      sessionAccountID,
+                      splitAmount,
+                      currency ?? '',
+                      undefined,
+                      undefined,
+                      optimisticExpenseReportID,
+                      reportTransactions,
+                  )
+                : buildOptimisticIOUReport(sessionAccountID, participant.accountID ?? CONST.DEFAULT_NUMBER_ID, splitAmount, oneOnOneChatReport?.reportID, currency ?? '');
+        } else if (isPolicyExpenseChat) {
+            if (typeof oneOnOneIOUReport?.total === 'number') {
+                // Because of the Expense reports are stored as negative values, we subtract the total from the amount
+                oneOnOneIOUReport.total -= splitAmount;
+            }
+        } else {
+            oneOnOneIOUReport = updateIOUOwnerAndTotal(oneOnOneIOUReport, sessionAccountID, splitAmount, currency ?? '');
+        }
+
+        const oneOnOneTransaction = buildOptimisticTransaction({
+            existingTransactionID: optimisticTransactionID,
+            originalTransactionID: transactionID,
+            transactionParams: {
+                amount: isPolicyExpenseChat ? -splitAmount : splitAmount,
+                currency: currency ?? '',
+                reportID: oneOnOneIOUReport?.reportID,
+                comment: parsedComment,
+                created: updatedTransaction?.modifiedCreated,
+                merchant: updatedTransaction?.modifiedMerchant,
+                receipt: {...updatedTransaction?.receipt, state: CONST.IOU.RECEIPT_STATE.OPEN},
+                category: updatedTransaction?.category,
+                tag: updatedTransaction?.tag,
+                taxCode: updatedTransaction?.taxCode,
+                taxAmount: isPolicyExpenseChat ? -splitTaxAmount : splitAmount,
+                billable: updatedTransaction?.billable,
+                reimbursable: updatedTransaction?.reimbursable,
+                source: CONST.IOU.TYPE.SPLIT,
+                filename: updatedTransaction?.receipt?.filename,
+            },
+        });
+        oneOnOneIOUReport.transactionCount = (oneOnOneIOUReport.transactionCount ?? 0) + 1;
+
+        const [oneOnOneCreatedActionForChat, oneOnOneCreatedActionForIOU, oneOnOneIOUAction, optimisticTransactionThread, optimisticCreatedActionForTransactionThread] =
+            buildOptimisticMoneyRequestEntities({
+                iouReport: oneOnOneIOUReport,
+                type: CONST.IOU.REPORT_ACTION_TYPE.CREATE,
+                amount: splitAmount,
+                currency: currency ?? '',
+                comment: parsedComment,
+                payeeEmail: currentUserEmailForIOUSplit,
+                participants: [participant],
+                transactionID: oneOnOneTransaction.transactionID,
+            });
+
+        let oneOnOneReportPreviewAction = getReportPreviewAction(oneOnOneChatReport?.reportID, oneOnOneIOUReport?.reportID);
+        if (oneOnOneReportPreviewAction) {
+            oneOnOneReportPreviewAction = updateReportPreview(oneOnOneIOUReport, oneOnOneReportPreviewAction);
+        } else {
+            oneOnOneReportPreviewAction = buildOptimisticReportPreview(oneOnOneChatReport, oneOnOneIOUReport, '', oneOnOneTransaction);
+        }
+        const hasViolations = hasViolationsReportUtils(oneOnOneIOUReport.reportID, transactionViolations, sessionAccountID, sessionEmail ?? '');
+
+        const [oneOnOneOptimisticData, oneOnOneSuccessData, oneOnOneFailureData] = buildOnyxDataForMoneyRequest({
+            isNewChatReport: isNewOneOnOneChatReport,
+            isOneOnOneSplit: true,
+            shouldCreateNewMoneyRequestReport: shouldCreateNewOneOnOneIOUReport,
+            isASAPSubmitBetaEnabled,
+            currentUserAccountIDParam: sessionAccountID,
+            currentUserEmailParam: sessionEmail ?? '',
+            hasViolations,
+            optimisticParams: {
+                chat: {
+                    report: oneOnOneChatReport,
+                    createdAction: oneOnOneCreatedActionForChat,
+                    reportPreviewAction: oneOnOneReportPreviewAction,
+                },
+                iou: {
+                    report: oneOnOneIOUReport,
+                    createdAction: oneOnOneCreatedActionForIOU,
+                    action: oneOnOneIOUAction,
+                },
+                transactionParams: {
+                    transaction: oneOnOneTransaction,
+                    transactionThreadReport: optimisticTransactionThread,
+                    transactionThreadCreatedReportAction: optimisticCreatedActionForTransactionThread,
+                },
+                policyRecentlyUsed: {},
+            },
+            quickAction,
+        });
+
+        splits.push({
+            email: participant.email,
+            accountID: participant.accountID,
+            policyID: participant.policyID,
+            iouReportID: oneOnOneIOUReport?.reportID,
+            chatReportID: oneOnOneChatReport?.reportID,
+            transactionID: oneOnOneTransaction.transactionID,
+            reportActionID: oneOnOneIOUAction.reportActionID,
+            createdChatReportActionID: oneOnOneCreatedActionForChat.reportActionID,
+            createdIOUReportActionID: oneOnOneCreatedActionForIOU.reportActionID,
+            reportPreviewReportActionID: oneOnOneReportPreviewAction.reportActionID,
+            transactionThreadReportID: optimisticTransactionThread.reportID,
+            createdReportActionIDForThread: optimisticCreatedActionForTransactionThread?.reportActionID,
+        });
+
+        optimisticData.push(...oneOnOneOptimisticData);
+        successData.push(...oneOnOneSuccessData);
+        failureData.push(...oneOnOneFailureData);
+    }
+
+    const {
+        amount: transactionAmount,
+        currency: transactionCurrency,
+        created: transactionCreated,
+        merchant: transactionMerchant,
+        comment: transactionComment,
+        category: transactionCategory,
+        tag: transactionTag,
+        taxCode: transactionTaxCode,
+        taxAmount: transactionTaxAmount,
+        billable: transactionBillable,
+        reimbursable: transactionReimbursable,
+    } = getTransactionDetails(updatedTransaction) ?? {};
+
+    const parameters: CompleteSplitBillParams = {
+        transactionID,
+        amount: transactionAmount,
+        currency: transactionCurrency,
+        created: transactionCreated,
+        merchant: transactionMerchant,
+        comment: transactionComment,
+        category: transactionCategory,
+        tag: transactionTag,
+        splits: JSON.stringify(splits),
+        taxCode: transactionTaxCode,
+        taxAmount: transactionTaxAmount,
+        billable: transactionBillable,
+        reimbursable: transactionReimbursable,
+        description: parsedComment,
+    };
+
+    playSound(SOUNDS.DONE);
+    API.write(WRITE_COMMANDS.COMPLETE_SPLIT_BILL, parameters, {optimisticData, successData, failureData});
+    // eslint-disable-next-line @typescript-eslint/no-deprecated
+    InteractionManager.runAfterInteractions(() => removeDraftTransaction(CONST.IOU.OPTIMISTIC_TRANSACTION_ID));
+    dismissModalAndOpenReportInInboxTab(chatReportID);
+    notifyNewAction(chatReportID, sessionAccountID);
+}
+
+function setDraftSplitTransaction(
+    transactionID: string | undefined,
+    splitTransactionDraft: OnyxEntry<OnyxTypes.Transaction>,
+    transactionChanges: TransactionChanges = {},
+    policy?: OnyxEntry<OnyxTypes.Policy>,
+) {
+    if (!transactionID) {
+        return undefined;
+    }
+    let draftSplitTransaction = splitTransactionDraft;
+
+    if (!draftSplitTransaction) {
+        draftSplitTransaction = allTransactions[`${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`];
+    }
+
+    const updatedTransaction = draftSplitTransaction
+        ? getUpdatedTransaction({
+              transaction: draftSplitTransaction,
+              transactionChanges,
+              isFromExpenseReport: false,
+              shouldUpdateReceiptState: false,
+              policy,
+          })
+        : null;
+
+    Onyx.merge(`${ONYXKEYS.COLLECTION.SPLIT_TRANSACTION_DRAFT}${transactionID}`, updatedTransaction);
+}
+
+/** Requests money based on a distance (e.g. mileage from a map) */
+function createDistanceRequest(distanceRequestInformation: CreateDistanceRequestInformation) {
+    const {
+        report,
         participants,
         currentUserLogin = '',
         currentUserAccountID = -1,
@@ -7440,7 +8174,7 @@ function createDistanceRequest(distanceRequestInformation: CreateDistanceRequest
         : receipt;
 
     let parameters: CreateDistanceRequestParams;
-    let onyxData: OnyxData<OnyxKey>;
+    let onyxData: OnyxData;
     const sanitizedWaypoints = !isManualDistanceRequest ? sanitizeRecentWaypoints(validWaypoints) : null;
     if (iouType === CONST.IOU.TYPE.SPLIT) {
         const {
@@ -7626,7 +8360,6 @@ type UpdateMoneyRequestAmountAndCurrencyParams = {
     policyTagList?: OnyxEntry<OnyxTypes.PolicyTagLists>;
     policyCategories?: OnyxEntry<OnyxTypes.PolicyCategories>;
     taxCode: string;
-    taxValue: string;
     allowNegative?: boolean;
     transactions: OnyxCollection<OnyxTypes.Transaction>;
     transactionViolations: OnyxCollection<OnyxTypes.TransactionViolations>;
@@ -7634,7 +8367,6 @@ type UpdateMoneyRequestAmountAndCurrencyParams = {
     currentUserEmailParam: string;
     isASAPSubmitBetaEnabled: boolean;
     policyRecentlyUsedCurrencies: string[];
-    parentReportNextStep: OnyxEntry<OnyxTypes.ReportNextStepDeprecated>;
 };
 
 /** Updates the amount and currency fields of an expense */
@@ -7649,7 +8381,6 @@ function updateMoneyRequestAmountAndCurrency({
     policyTagList,
     policyCategories,
     taxCode,
-    taxValue,
     allowNegative = false,
     transactions,
     transactionViolations,
@@ -7657,14 +8388,12 @@ function updateMoneyRequestAmountAndCurrency({
     currentUserEmailParam,
     isASAPSubmitBetaEnabled,
     policyRecentlyUsedCurrencies,
-    parentReportNextStep,
 }: UpdateMoneyRequestAmountAndCurrencyParams) {
     const transactionChanges = {
         amount,
         currency,
         taxCode,
         taxAmount,
-        taxValue,
     };
 
     let data: UpdateMoneyRequestData;
@@ -7685,7 +8414,6 @@ function updateMoneyRequestAmountAndCurrency({
             currentUserEmailParam,
             isASAPSubmitBetaEnabled,
             policyRecentlyUsedCurrencies,
-            iouReportNextStep: parentReportNextStep,
         });
         removeTransactionFromDuplicateTransactionViolation(data.onyxData, transactionID, transactions, transactionViolations);
     }
@@ -8154,7 +8882,6 @@ function deleteMoneyRequest({
     isSingleTransactionView = false,
     transactionIDsPendingDeletion,
     selectedTransactionIDs,
-    allTransactionViolationsParam,
     hash,
 }: DeleteMoneyRequestFunctionParams) {
     if (!transactionID) {
@@ -8202,9 +8929,7 @@ function deleteMoneyRequest({
         value: null,
     });
 
-    const failureData: Array<
-        OnyxUpdate<typeof ONYXKEYS.COLLECTION.TRANSACTION | typeof ONYXKEYS.COLLECTION.REPORT | typeof ONYXKEYS.COLLECTION.REPORT_ACTIONS | typeof ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS>
-    > = [
+    const failureData: OnyxUpdate[] = [
         {
             onyxMethod: Onyx.METHOD.SET,
             key: `${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`,
@@ -8272,7 +8997,7 @@ function deleteMoneyRequest({
             onyxMethod: Onyx.METHOD.MERGE,
             key: `${ONYXKEYS.COLLECTION.REPORT}${chatReport?.reportID}`,
             value: {
-                hasOutstandingChildRequest: hasOutstandingChildRequest(chatReport, updatedIOUReport, currentUserEmail, allTransactionViolationsParam, undefined),
+                hasOutstandingChildRequest: hasOutstandingChildRequest(chatReport, updatedIOUReport, currentUserEmail, undefined),
             },
         });
     }
@@ -8291,7 +9016,7 @@ function deleteMoneyRequest({
                 onyxMethod: Onyx.METHOD.MERGE,
                 key: `${ONYXKEYS.COLLECTION.REPORT}${chatReport?.reportID}`,
                 value: {
-                    hasOutstandingChildRequest: hasOutstandingChildRequest(chatReport, iouReport?.reportID, currentUserEmail, allTransactionViolationsParam, undefined),
+                    hasOutstandingChildRequest: hasOutstandingChildRequest(chatReport, iouReport?.reportID, currentUserEmail, undefined),
                     iouReportID: null,
                     ...optimisticLastReportData,
                 },
@@ -8492,7 +9217,6 @@ function deleteTrackExpense({
     isSingleTransactionView = false,
     isChatReportArchived,
     isChatIOUReportArchived,
-    allTransactionViolationsParam,
 }: DeleteTrackExpenseParams) {
     if (!chatReportID || !transactionID) {
         return;
@@ -8520,7 +9244,6 @@ function deleteTrackExpense({
             chatReport: chatIOUReport,
             isChatIOUReportArchived,
             isSingleTransactionView,
-            allTransactionViolationsParam,
         });
         return urlToNavigateBack;
     }
@@ -8570,95 +9293,6 @@ function getHoldReportActionsAndTransactions(reportID: string | undefined) {
     return {holdReportActions, holdTransactions};
 }
 
-type OptimisticReportActionCopyIDs = Record<string, string>;
-
-/**
- * Gets duplicate workflow actions for a partial expense report.
- * Used when splitting held expenses into a new partial report to maintain action history.
- *
- * @param sourceReportID - The ID of the original report to copy actions from
- * @param targetReportID - The ID of the new partial expense report to copy actions to
- * @returns A tuple of [optimisticData, successData, failureData, duplicatedReportActionIDs]
- */
-function getDuplicateActionsForPartialReport(
-    sourceReportID: string | undefined,
-    targetReportID: string | undefined,
-): [
-    Array<OnyxUpdate<typeof ONYXKEYS.COLLECTION.REPORT_ACTIONS>>,
-    Array<OnyxUpdate<typeof ONYXKEYS.COLLECTION.REPORT_ACTIONS>>,
-    Array<OnyxUpdate<typeof ONYXKEYS.COLLECTION.REPORT_ACTIONS>>,
-    OptimisticReportActionCopyIDs,
-] {
-    const optimisticData: Array<OnyxUpdate<typeof ONYXKEYS.COLLECTION.REPORT_ACTIONS>> = [];
-    const successData: Array<OnyxUpdate<typeof ONYXKEYS.COLLECTION.REPORT_ACTIONS>> = [];
-    const failureData: Array<OnyxUpdate<typeof ONYXKEYS.COLLECTION.REPORT_ACTIONS>> = [];
-    const optimisticReportActionCopyIDs: OptimisticReportActionCopyIDs = {};
-
-    if (!sourceReportID || !targetReportID) {
-        return [optimisticData, successData, failureData, optimisticReportActionCopyIDs];
-    }
-
-    const sourceReportActions = getAllReportActions(sourceReportID);
-
-    // Match the backend's WORKFLOW_ACTIONS list
-    const workflowActionTypes = [
-        CONST.REPORT.ACTIONS.TYPE.SUBMITTED,
-        CONST.REPORT.ACTIONS.TYPE.SUBMITTED_AND_CLOSED,
-        CONST.REPORT.ACTIONS.TYPE.APPROVED,
-        CONST.REPORT.ACTIONS.TYPE.UNAPPROVED,
-        CONST.REPORT.ACTIONS.TYPE.REJECTED,
-        CONST.REPORT.ACTIONS.TYPE.RETRACTED,
-        CONST.REPORT.ACTIONS.TYPE.CLOSED,
-        CONST.REPORT.ACTIONS.TYPE.REOPENED,
-        CONST.REPORT.ACTIONS.TYPE.FORWARDED,
-        CONST.REPORT.ACTIONS.TYPE.TAKE_CONTROL,
-        CONST.REPORT.ACTIONS.TYPE.REROUTE,
-    ] as const;
-
-    const copiedActions: Record<string, OnyxTypes.ReportAction> = {};
-    const copiedActionsSuccess: OnyxCollection<NullishDeep<ReportAction>> = {};
-    const copiedActionsFailure: Record<string, null> = {};
-
-    for (const action of Object.values(sourceReportActions)) {
-        if (action && (workflowActionTypes as readonly string[]).includes(action.actionName)) {
-            const newActionID = NumberUtils.rand64();
-            copiedActions[newActionID] = {
-                ...action,
-                reportActionID: newActionID,
-                reportID: targetReportID,
-                pendingAction: CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD,
-            };
-            copiedActionsSuccess[newActionID] = {
-                pendingAction: null,
-            };
-            copiedActionsFailure[newActionID] = null;
-            optimisticReportActionCopyIDs[action.reportActionID] = newActionID;
-        }
-    }
-
-    if (Object.keys(copiedActions).length > 0) {
-        optimisticData.push({
-            onyxMethod: Onyx.METHOD.MERGE,
-            key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${targetReportID}`,
-            value: copiedActions,
-        });
-
-        successData.push({
-            onyxMethod: Onyx.METHOD.MERGE,
-            key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${targetReportID}`,
-            value: copiedActionsSuccess,
-        });
-
-        failureData.push({
-            onyxMethod: Onyx.METHOD.MERGE,
-            key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${targetReportID}`,
-            value: copiedActionsFailure,
-        });
-    }
-
-    return [optimisticData, successData, failureData, optimisticReportActionCopyIDs];
-}
-
 function getReportFromHoldRequestsOnyxData({
     chatReport,
     iouReport,
@@ -8678,7 +9312,6 @@ function getReportFromHoldRequestsOnyxData({
     optimisticHoldActionID: string;
     optimisticCreatedReportForUnapprovedTransactionsActionID: string | undefined;
     optimisticHoldReportExpenseActionIDs: OptimisticHoldReportExpenseActionID[];
-    optimisticReportActionCopyIDs: OptimisticReportActionCopyIDs;
     optimisticData: OnyxUpdate[];
     successData: OnyxUpdate[];
     failureData: OnyxUpdate[];
@@ -8923,17 +9556,6 @@ function getReportFromHoldRequestsOnyxData({
         },
     ];
 
-    // Copy submission/approval actions to the new report
-    const [copiedActionsOptimistic, copiedActionsSuccess, copiedActionsFailure, optimisticReportActionCopyIDs] = getDuplicateActionsForPartialReport(
-        iouReport?.reportID,
-        optimisticExpenseReport.reportID,
-    );
-    // Only copy the report action for approval flow
-    if (isApprovalFlow && !isEmptyObject(optimisticReportActionCopyIDs)) {
-        optimisticData.push(...copiedActionsOptimistic);
-        successData.push(...copiedActionsSuccess);
-        failureData.push(...copiedActionsFailure);
-    }
     // add optimistic system message explaining the created report for unapproved transactions
     if (isApprovalFlow && optimisticCreatedReportForUnapprovedAction) {
         optimisticData.push({
@@ -8972,7 +9594,6 @@ function getReportFromHoldRequestsOnyxData({
         successData,
         optimisticHoldReportID: optimisticExpenseReport.reportID,
         optimisticHoldReportExpenseActionIDs,
-        optimisticReportActionCopyIDs,
     };
 }
 
@@ -9100,7 +9721,7 @@ function getPayMoneyRequestParams({
     const optimisticChatReport = {
         ...chatReport,
         lastReadTime: DateUtils.getDBTime(),
-        hasOutstandingChildRequest: hasOutstandingChildRequest(chatReport, iouReport?.reportID, currentUserEmail, allTransactionViolations, undefined),
+        hasOutstandingChildRequest: hasOutstandingChildRequest(chatReport, iouReport?.reportID, currentUserEmail, undefined),
         iouReportID: null,
         lastMessageText: getReportActionText(optimisticIOUReportAction),
         lastMessageHtml: getReportActionHtml(optimisticIOUReportAction),
@@ -9448,7 +10069,6 @@ function canSubmitReport(
     isReportArchived: boolean,
     currentUserEmailParam: string,
 ) {
-    // eslint-disable-next-line @typescript-eslint/no-deprecated -- Temporarily disabling the rule for deprecated functions; it will be removed soon in https://github.com/Expensify/App/issues/73648.
     const currentUserAccountID = getCurrentUserAccountID();
     const isOpenExpenseReport = isOpenExpenseReportReportUtils(report);
     const isAdmin = policy?.role === CONST.POLICY.ROLE.ADMIN;
@@ -9587,7 +10207,7 @@ function approveMoneyRequest(
             onyxMethod: Onyx.METHOD.MERGE,
             key: `${ONYXKEYS.COLLECTION.REPORT}${expenseReport.chatReportID}`,
             value: {
-                hasOutstandingChildRequest: hasOutstandingChildRequest(chatReport, updatedExpenseReport, currentUserEmail, allTransactionViolations, undefined),
+                hasOutstandingChildRequest: hasOutstandingChildRequest(chatReport, updatedExpenseReport, currentUserEmail, undefined),
             },
         };
     }
@@ -9679,7 +10299,6 @@ function approveMoneyRequest(
     let optimisticHoldReportID;
     let optimisticHoldActionID;
     let optimisticHoldReportExpenseActionIDs;
-    let optimisticReportActionCopyIDs;
     let optimisticCreatedReportForUnapprovedTransactionsActionID;
     if (!full && !!chatReport && !!expenseReport) {
         const originalCreated = getReportOriginalCreationTimestamp(expenseReport);
@@ -9699,7 +10318,6 @@ function approveMoneyRequest(
         optimisticHoldActionID = holdReportOnyxData.optimisticHoldActionID;
         optimisticCreatedReportForUnapprovedTransactionsActionID = holdReportOnyxData.optimisticCreatedReportForUnapprovedTransactionsActionID;
         optimisticHoldReportExpenseActionIDs = JSON.stringify(holdReportOnyxData.optimisticHoldReportExpenseActionIDs);
-        optimisticReportActionCopyIDs = JSON.stringify(holdReportOnyxData.optimisticReportActionCopyIDs);
     }
 
     // Remove duplicates violations if we approve the report
@@ -9742,7 +10360,6 @@ function approveMoneyRequest(
         optimisticHoldReportID,
         optimisticHoldActionID,
         optimisticHoldReportExpenseActionIDs,
-        optimisticReportActionCopyIDs,
         optimisticCreatedReportForUnapprovedTransactionsActionID,
     };
 
@@ -10000,7 +10617,7 @@ function retractReport(
         });
     }
 
-    const successData: Array<OnyxUpdate<typeof ONYXKEYS.COLLECTION.REPORT_ACTIONS | typeof ONYXKEYS.COLLECTION.REPORT>> = [
+    const successData: OnyxUpdate[] = [
         {
             onyxMethod: Onyx.METHOD.MERGE,
             key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${expenseReport.reportID}`,
@@ -10022,7 +10639,7 @@ function retractReport(
         },
     ];
 
-    const failureData: Array<OnyxUpdate<typeof ONYXKEYS.COLLECTION.REPORT_ACTIONS | typeof ONYXKEYS.COLLECTION.REPORT | typeof ONYXKEYS.COLLECTION.NEXT_STEP>> = [
+    const failureData: OnyxUpdate[] = [
         {
             onyxMethod: Onyx.METHOD.MERGE,
             key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${expenseReport.reportID}`,
@@ -10032,19 +10649,16 @@ function retractReport(
                 },
             },
         },
+        // @ts-expect-error - will be solved in https://github.com/Expensify/App/issues/73830
         {
             onyxMethod: Onyx.METHOD.MERGE,
             key: `${ONYXKEYS.COLLECTION.REPORT}${expenseReport.reportID}`,
             value: {
-                // @ts-expect-error - will be solved in https://github.com/Expensify/App/issues/73830
                 stateNum: expenseReport.stateNum,
-                // @ts-expect-error - will be solved in https://github.com/Expensify/App/issues/73830
                 statusNum: expenseReport.stateNum,
-                // @ts-expect-error - will be solved in https://github.com/Expensify/App/issues/73830
                 hasReportBeenRetracted: false,
                 nextStep: expenseReport.nextStep ?? null,
                 pendingFields: {
-                    // @ts-expect-error - will be solved in https://github.com/Expensify/App/issues/73830
                     partial: null,
                     nextStep: null,
                 },
@@ -10768,7 +11382,6 @@ function completePaymentOnboarding(
         companySize: introSelected?.companySize as OnboardingCompanySize,
     });
 }
-
 function payMoneyRequest(
     paymentType: PaymentMethodType,
     chatReport: OnyxTypes.Report,
@@ -11460,7 +12073,7 @@ function getSearchOnyxUpdate({
     transactionThreadReportID,
     isFromOneTransactionReport,
     isInvoice,
-}: GetSearchOnyxUpdateParams): OnyxData<typeof ONYXKEYS.COLLECTION.SNAPSHOT> | undefined {
+}: GetSearchOnyxUpdateParams): OnyxData | undefined {
     const toAccountID = participant?.accountID;
     const fromAccountID = deprecatedCurrentUserPersonalDetails?.accountID;
     const currentSearchQueryJSON = getCurrentSearchQueryJSON();
@@ -11492,11 +12105,11 @@ function getSearchOnyxUpdate({
             }
             return {
                 optimisticData: [
+                    // @ts-expect-error - will be solved in https://github.com/Expensify/App/issues/73830
                     {
                         onyxMethod: Onyx.METHOD.MERGE,
                         key: `${ONYXKEYS.COLLECTION.SNAPSHOT}${currentSearchQueryJSON.hash}` as const,
                         value: {
-                            // @ts-expect-error - will be solved in https://github.com/Expensify/App/issues/73830
                             data: {
                                 [ONYXKEYS.PERSONAL_DETAILS_LIST]: {
                                     [toAccountID]: {
@@ -11976,14 +12589,14 @@ function prepareRejectMoneyRequestData(
             );
             successData.push(
                 {
-                    onyxMethod: Onyx.METHOD.MERGE,
+                    onyxMethod: Onyx.METHOD.SET,
                     key: `${ONYXKEYS.COLLECTION.REPORT}${rejectedToReportID}`,
                     value: {
                         pendingFields: null,
                     },
                 },
                 {
-                    onyxMethod: Onyx.METHOD.MERGE,
+                    onyxMethod: Onyx.METHOD.SET,
                     key: `${ONYXKEYS.COLLECTION.REPORT_METADATA}${rejectedToReportID}`,
                     value: {
                         isOptimisticReport: null,
@@ -12167,7 +12780,7 @@ function prepareRejectMoneyRequestData(
     // Update hasOutstandingChildRequest on the chat report after all optimistic updates
     if (policyExpenseChat) {
         const excludedReportID = rejectedToReportID ?? reportID;
-        const shouldHaveOutstandingChildRequest = hasOutstandingChildRequest(policyExpenseChat, excludedReportID, currentUserEmail, allTransactionViolations, undefined);
+        const shouldHaveOutstandingChildRequest = hasOutstandingChildRequest(policyExpenseChat, excludedReportID, currentUserEmail, undefined);
 
         if (policyExpenseChat.hasOutstandingChildRequest !== shouldHaveOutstandingChildRequest) {
             optimisticData.push({
@@ -12725,6 +13338,580 @@ function clearSplitTransactionDraftErrors(transactionID: string | undefined) {
     });
 }
 
+function updateSplitTransactions({
+    allTransactionsList,
+    allReportsList,
+    allReportNameValuePairsList,
+    transactionData,
+    searchContext,
+    policyCategories,
+    policy,
+    policyRecentlyUsedCategories,
+    iouReport,
+    firstIOU,
+    isASAPSubmitBetaEnabled,
+    currentUserPersonalDetails,
+    transactionViolations,
+    quickAction,
+    policyRecentlyUsedCurrencies,
+}: UpdateSplitTransactionsParams) {
+    const transactionReport = getReportOrDraftReport(transactionData?.reportID);
+    const parentTransactionReport = getReportOrDraftReport(transactionReport?.parentReportID);
+    const expenseReport = transactionReport?.type === CONST.REPORT.TYPE.EXPENSE ? transactionReport : parentTransactionReport;
+
+    const originalTransactionID = transactionData?.originalTransactionID ?? CONST.IOU.OPTIMISTIC_TRANSACTION_ID;
+    const originalTransaction = allTransactionsList?.[`${ONYXKEYS.COLLECTION.TRANSACTION}${originalTransactionID}`];
+    const originalTransactionDetails = getTransactionDetails(originalTransaction);
+
+    const policyTags = getPolicyTagsData(expenseReport?.policyID);
+    const participants = getMoneyRequestParticipantsFromReport(expenseReport, currentUserPersonalDetails.accountID);
+    const splitExpenses = transactionData?.splitExpenses ?? [];
+
+    // List of all child transactions that have been created after split
+    const originalChildTransactions = getChildTransactions(allTransactionsList, allReportsList, originalTransactionID);
+    const processedChildTransactionIDs: string[] = [];
+
+    const splitExpensesTotal = transactionData?.splitExpensesTotal ?? 0;
+
+    const isCreationOfSplits = originalChildTransactions.length === 0;
+    const hasEditableSplitExpensesLeft = splitExpenses.some((expense) => (expense.statusNum ?? 0) < CONST.REPORT.STATUS_NUM.SUBMITTED);
+    const isReverseSplitOperation = splitExpenses.length === 1 && originalChildTransactions.length > 0 && hasEditableSplitExpensesLeft;
+
+    let changesInReportTotal = 0;
+    // Validate custom unit rate before proceeding with split
+    const customUnitRateID = originalTransaction?.comment?.customUnit?.customUnitRateID;
+    const isPerDiem = isPerDiemRequestTransactionUtils(originalTransaction);
+
+    if (customUnitRateID && policy && !isPerDiem) {
+        const customUnitRate = getDistanceRateCustomUnitRate(policy, customUnitRateID);
+
+        // If the rate doesn't exist or is disabled, show an error and return early
+        if (!customUnitRate || !customUnitRate.enabled) {
+            // Show error to user
+            Onyx.merge(`${ONYXKEYS.COLLECTION.SPLIT_TRANSACTION_DRAFT}${originalTransactionID}`, {
+                errors: getMicroSecondOnyxErrorWithTranslationKey('iou.error.invalidRate'),
+            });
+            return;
+        }
+    }
+
+    const splits: SplitTransactionSplitsParam =
+        splitExpenses.map((split) => {
+            const currentDescription = getParsedComment(Parser.htmlToMarkdown(split.description ?? ''));
+            changesInReportTotal += split.amount;
+            return {
+                amount: split.amount,
+                category: split.category ?? '',
+                tag: split.tags?.[0] ?? '',
+                created: split.created,
+                merchant: split?.merchant ?? '',
+                transactionID: split.transactionID,
+                comment: {
+                    comment: currentDescription,
+                },
+                reimbursable: split?.reimbursable,
+            };
+        }) ?? [];
+    changesInReportTotal -= splitExpensesTotal;
+
+    const successData = [] as OnyxUpdate[];
+    const failureData = [] as OnyxUpdate[];
+    const optimisticData = [] as OnyxUpdate[];
+
+    // The split transactions can be in different reports, so we need to calculate the total for each report.
+    const reportTotals = new Map<string, number>();
+    const expenseReportID = expenseReport?.reportID;
+
+    if (expenseReportID) {
+        const expenseReportKey = `${ONYXKEYS.COLLECTION.REPORT}${expenseReportID}`;
+        const expenseReportTotal = allReportsList?.[expenseReportKey]?.total ?? expenseReport?.total ?? 0;
+        reportTotals.set(expenseReportID, expenseReportTotal - changesInReportTotal);
+    }
+
+    for (const expense of splitExpenses) {
+        const splitExpenseReportID = expense.reportID;
+        if (!splitExpenseReportID || reportTotals.has(splitExpenseReportID)) {
+            continue;
+        }
+
+        const splitExpenseReport = allReportsList?.[`${ONYXKEYS.COLLECTION.REPORT}${splitExpenseReportID}`];
+        reportTotals.set(splitExpenseReportID, splitExpenseReport?.total ?? 0);
+    }
+
+    for (const [index, splitExpense] of splitExpenses.entries()) {
+        const existingTransactionID = isReverseSplitOperation ? originalTransactionID : splitExpense.transactionID;
+        const splitTransaction = allTransactionsList?.[`${ONYXKEYS.COLLECTION.TRANSACTION}${existingTransactionID}`];
+        if (splitTransaction) {
+            processedChildTransactionIDs.push(splitTransaction.transactionID);
+        }
+
+        const splitReportActions = getAllReportActions(isReverseSplitOperation ? expenseReport?.reportID : splitTransaction?.reportID);
+        const currentReportAction = Object.values(splitReportActions).find((action) => {
+            const transactionID = isMoneyRequestAction(action) ? (getOriginalMessage(action)?.IOUTransactionID ?? CONST.DEFAULT_NUMBER_ID) : CONST.DEFAULT_NUMBER_ID;
+            return transactionID === existingTransactionID;
+        });
+
+        const requestMoneyInformation = {
+            participantParams: {
+                participant: participants.at(0) ?? ({} as Participant),
+                payeeEmail: currentUserPersonalDetails?.login ?? '',
+                payeeAccountID: currentUserPersonalDetails?.accountID ?? CONST.DEFAULT_NUMBER_ID,
+            },
+            policyParams: {
+                policy,
+                policyCategories,
+                policyTags,
+            },
+            transactionParams: {
+                amount: Math.abs(originalTransaction?.amount ?? 0),
+                modifiedAmount: splitExpense.amount ?? 0,
+                currency: originalTransactionDetails?.currency ?? CONST.CURRENCY.USD,
+                created: splitExpense.created,
+                merchant: splitExpense.merchant ?? '',
+                comment: splitExpense.description,
+                category: splitExpense.category,
+                tag: splitExpense.tags?.[0],
+                originalTransactionID,
+                attendees: originalTransactionDetails?.attendees,
+                source: CONST.IOU.TYPE.SPLIT,
+                linkedTrackedExpenseReportAction: currentReportAction,
+                pendingAction: splitTransaction ? null : CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD,
+                pendingFields: splitTransaction ? splitTransaction.pendingFields : undefined,
+                reimbursable: originalTransactionDetails?.reimbursable,
+                taxCode: originalTransactionDetails?.taxCode,
+                taxAmount: calculateIOUAmount(splitExpenses.length - 1, originalTransactionDetails?.taxAmount ?? 0, originalTransactionDetails?.currency ?? CONST.CURRENCY.USD, false),
+                billable: originalTransactionDetails?.billable,
+            },
+            parentChatReport: getReportOrDraftReport(getReportOrDraftReport(expenseReport?.chatReportID)?.parentReportID),
+            existingTransaction: originalTransaction,
+            isASAPSubmitBetaEnabled,
+            currentUserAccountIDParam: currentUserPersonalDetails?.accountID,
+            currentUserEmailParam: currentUserPersonalDetails?.login ?? '',
+            transactionViolations,
+            quickAction,
+            policyRecentlyUsedCurrencies,
+        } as MoneyRequestInformationParams;
+
+        if (isReverseSplitOperation) {
+            requestMoneyInformation.transactionParams = {
+                amount: splitExpense.amount ?? 0,
+                currency: originalTransactionDetails?.currency ?? CONST.CURRENCY.USD,
+                created: splitExpense.created,
+                merchant: splitExpense.merchant ?? '',
+                comment: splitExpense.description,
+                category: splitExpense.category,
+                tag: splitExpense.tags?.[0],
+                attendees: originalTransactionDetails?.attendees as Attendee[],
+                linkedTrackedExpenseReportAction: currentReportAction,
+                taxCode: originalTransactionDetails?.taxCode,
+                taxAmount: calculateIOUAmount(splitExpenses.length - 1, originalTransactionDetails?.taxAmount ?? 0, originalTransactionDetails?.currency ?? CONST.CURRENCY.USD, false),
+                billable: originalTransactionDetails?.billable,
+            };
+            requestMoneyInformation.existingTransaction = undefined;
+        }
+
+        const {participantParams, policyParams, transactionParams, parentChatReport, existingTransaction} = requestMoneyInformation;
+        const parsedComment = getParsedComment(Parser.htmlToMarkdown(transactionParams.comment ?? ''));
+        transactionParams.comment = parsedComment;
+
+        const {transactionThreadReportID, createdReportActionIDForThread, onyxData, iouAction} = getMoneyRequestInformation({
+            participantParams,
+            parentChatReport,
+            policyParams,
+            transactionParams,
+            moneyRequestReportID: splitExpense?.reportID,
+            existingTransaction,
+            existingTransactionID,
+            newReportTotal: reportTotals.get(splitExpense?.reportID ?? String(CONST.DEFAULT_NUMBER_ID)) ?? 0,
+            newNonReimbursableTotal: (transactionReport?.nonReimbursableTotal ?? 0) - changesInReportTotal,
+            isSplitExpense: true,
+            currentReportActionID: currentReportAction?.reportActionID,
+            isASAPSubmitBetaEnabled,
+            currentUserAccountIDParam: currentUserPersonalDetails?.accountID,
+            currentUserEmailParam: currentUserPersonalDetails?.login ?? '',
+            transactionViolations,
+            quickAction,
+            shouldGenerateTransactionThreadReport: !isReverseSplitOperation,
+            policyRecentlyUsedCurrencies,
+        });
+
+        let updateMoneyRequestParamsOnyxData: OnyxData = {};
+        const currentSplit = splits.at(index);
+
+        // For existing split transactions, update the field change messages
+        // For new transactions, skip this step
+        if (splitTransaction) {
+            const existing = getTransactionDetails(splitTransaction);
+            const transactionChanges = {
+                ...currentSplit,
+                comment: currentSplit?.comment?.comment,
+            } as TransactionChanges;
+
+            if (currentSplit) {
+                currentSplit.reimbursable = splitTransaction.reimbursable;
+                currentSplit.billable = splitTransaction.billable;
+            }
+
+            for (const key of Object.keys(transactionChanges)) {
+                const newValue = transactionChanges[key as keyof typeof transactionChanges];
+                const oldValue = existing?.[key as keyof typeof existing];
+                if (newValue === oldValue) {
+                    delete transactionChanges[key as keyof typeof transactionChanges];
+                    // Ensure we pass the currency to getUpdateMoneyRequestParams as well, so the amount message is created correctly
+                } else if (key === 'amount') {
+                    transactionChanges.currency = originalTransactionDetails?.currency;
+                }
+            }
+
+            if (isReverseSplitOperation) {
+                delete transactionChanges.transactionID;
+            }
+
+            if (Object.keys(transactionChanges).length > 0) {
+                const transactionThreadReport = allReports?.[`${ONYXKEYS.COLLECTION.REPORT}${isReverseSplitOperation ? splitExpense?.reportID : transactionThreadReportID}`];
+                const transactionIOUReport = allReports?.[`${ONYXKEYS.COLLECTION.REPORT}${splitExpense?.reportID ?? transactionThreadReport?.parentReportID}`];
+                const {onyxData: moneyRequestParamsOnyxData, params} = getUpdateMoneyRequestParams({
+                    transactionID: existingTransactionID,
+                    transactionThreadReport,
+                    iouReport: transactionIOUReport,
+                    transactionChanges,
+                    policy,
+                    policyTagList: policyTags ?? null,
+                    policyCategories: policyCategories ?? null,
+                    newTransactionReportID: splitExpense?.reportID,
+                    policyRecentlyUsedCategories,
+                    currentUserAccountIDParam: currentUserPersonalDetails?.accountID,
+                    currentUserEmailParam: currentUserPersonalDetails?.login ?? '',
+                    isASAPSubmitBetaEnabled,
+                });
+                if (currentSplit) {
+                    currentSplit.modifiedExpenseReportActionID = params.reportActionID;
+                }
+                updateMoneyRequestParamsOnyxData = moneyRequestParamsOnyxData;
+            }
+            // For new split transactions, set the reportID once the transaction and associated report are created
+        } else if (currentSplit) {
+            currentSplit.reportID = splitExpense?.reportID;
+        }
+
+        if (currentSplit) {
+            currentSplit.transactionThreadReportID = transactionThreadReportID;
+            currentSplit.createdReportActionIDForThread = createdReportActionIDForThread;
+            currentSplit.splitReportActionID = iouAction.reportActionID;
+        }
+
+        optimisticData.push(...(onyxData.optimisticData ?? []), ...(updateMoneyRequestParamsOnyxData.optimisticData ?? []));
+        successData.push(...(onyxData.successData ?? []), ...(updateMoneyRequestParamsOnyxData.successData ?? []));
+        failureData.push(...(onyxData.failureData ?? []), ...(updateMoneyRequestParamsOnyxData.failureData ?? []));
+    }
+
+    // All transactions that were deleted in the split list will be marked as deleted in onyx
+    const undeletedTransactions = originalChildTransactions.filter(
+        (currentTransaction) => !processedChildTransactionIDs.includes(currentTransaction?.transactionID ?? CONST.IOU.OPTIMISTIC_TRANSACTION_ID),
+    );
+
+    for (const undeletedTransaction of undeletedTransactions) {
+        const splitTransaction = allTransactionsList?.[`${ONYXKEYS.COLLECTION.TRANSACTION}${undeletedTransaction?.transactionID}`];
+        const splitReportActions = getAllReportActions(splitTransaction?.reportID);
+        const reportNameValuePairs = allReportNameValuePairsList?.[`${ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS}${splitTransaction?.reportID}`];
+        const isReportArchived = isArchivedReport(reportNameValuePairs);
+        const currentReportAction = Object.values(splitReportActions).find((action) => {
+            const transactionID = isMoneyRequestAction(action) ? (getOriginalMessage(action)?.IOUTransactionID ?? CONST.DEFAULT_NUMBER_ID) : CONST.DEFAULT_NUMBER_ID;
+            return transactionID === undeletedTransaction?.transactionID;
+        }) as ReportAction;
+
+        const {
+            optimisticData: deleteExpenseOptimisticData,
+            failureData: deleteExpenseFailureData,
+            successData: deleteExpenseSuccessData,
+        } = getDeleteTrackExpenseInformation(
+            splitTransaction?.reportID ?? String(CONST.DEFAULT_NUMBER_ID),
+            undeletedTransaction?.transactionID,
+            currentReportAction,
+            undefined,
+            undefined,
+            undefined,
+            undefined,
+            undefined,
+            isReportArchived,
+        );
+
+        optimisticData.push(...(deleteExpenseOptimisticData ?? []));
+        successData.push(...(deleteExpenseSuccessData ?? []));
+        failureData.push(...(deleteExpenseFailureData ?? []));
+    }
+
+    if (!isReverseSplitOperation) {
+        // Use SET to update originalTransaction more quickly in Onyx as compared to MERGE to prevent UI inconsistency
+        optimisticData.push({
+            onyxMethod: Onyx.METHOD.SET,
+            key: `${ONYXKEYS.COLLECTION.TRANSACTION}${originalTransactionID}`,
+            value: {
+                ...originalTransaction,
+                reportID: CONST.REPORT.SPLIT_REPORT_ID,
+            },
+        });
+
+        // @ts-expect-error - will be solved in https://github.com/Expensify/App/issues/73830
+        failureData.push({
+            onyxMethod: Onyx.METHOD.MERGE,
+            key: `${ONYXKEYS.COLLECTION.TRANSACTION}${originalTransactionID}`,
+            value: originalTransaction,
+        });
+
+        if (firstIOU) {
+            const updatedReportAction = {
+                [firstIOU.reportActionID]: {
+                    pendingAction: CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE,
+                    previousMessage: firstIOU.message,
+                    message: [
+                        {
+                            type: 'COMMENT',
+                            html: '',
+                            text: '',
+                            isEdited: true,
+                            isDeletedParentAction: true,
+                        },
+                    ],
+                    originalMessage: {
+                        IOUTransactionID: null,
+                    },
+                    errors: null,
+                },
+            };
+            const transactionThread = allReports?.[`${ONYXKEYS.COLLECTION.REPORT}${firstIOU.childReportID}`] ?? null;
+            optimisticData.push({
+                onyxMethod: Onyx.METHOD.MERGE,
+                key: `${ONYXKEYS.COLLECTION.REPORT}${firstIOU?.childReportID}`,
+                value: null,
+            });
+            optimisticData.push({
+                onyxMethod: Onyx.METHOD.MERGE,
+                key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${iouReport?.reportID}`,
+                value: updatedReportAction,
+            });
+
+            failureData.push({
+                onyxMethod: Onyx.METHOD.MERGE,
+                key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${iouReport?.reportID}`,
+                value: {
+                    [firstIOU.reportActionID]: {
+                        ...firstIOU,
+                        pendingAction: null,
+                    },
+                },
+            });
+            failureData.push({
+                onyxMethod: Onyx.METHOD.MERGE,
+                key: `${ONYXKEYS.COLLECTION.REPORT}${firstIOU?.childReportID}`,
+                value: transactionThread,
+            });
+        }
+
+        optimisticData.push({
+            onyxMethod: Onyx.METHOD.MERGE,
+            key: `${ONYXKEYS.COLLECTION.SNAPSHOT}${searchContext?.currentSearchHash}`,
+            value: {
+                data: {
+                    [`${ONYXKEYS.COLLECTION.TRANSACTION}${originalTransactionID}`]: null,
+                },
+            },
+        });
+
+        // @ts-expect-error - will be solved in https://github.com/Expensify/App/issues/73830
+        failureData.push({
+            onyxMethod: Onyx.METHOD.MERGE,
+            key: `${ONYXKEYS.COLLECTION.SNAPSHOT}${searchContext?.currentSearchHash}`,
+            value: {
+                data: {
+                    [`${ONYXKEYS.COLLECTION.TRANSACTION}${originalTransactionID}`]: originalTransaction,
+                },
+            },
+        });
+    } else {
+        optimisticData.push({
+            onyxMethod: Onyx.METHOD.MERGE,
+            key: `${ONYXKEYS.COLLECTION.TRANSACTION}${originalTransactionID}`,
+            value: {
+                errors: null,
+            },
+        });
+    }
+
+    if (isReverseSplitOperation) {
+        const parameters = {
+            ...splits.at(0),
+            comment: splits.at(0)?.comment?.comment,
+        } as RevertSplitTransactionParams;
+        API.write(WRITE_COMMANDS.REVERT_SPLIT_TRANSACTION, parameters, {optimisticData, successData, failureData});
+    } else {
+        // Prepare splitApiParams for the Transaction_Split API call which requires a specific format for the splits
+        // The format is: splits[0][amount], splits[0][category], splits[0][tag] etc.
+        const splitApiParams = {} as Record<string, string | number | boolean>;
+        for (const [i, split] of splits.entries()) {
+            for (const [key, value] of Object.entries(split)) {
+                splitApiParams[`splits[${i}][${key}]`] = value !== null && typeof value === 'object' ? JSON.stringify(value) : value;
+            }
+        }
+        if (isCreationOfSplits) {
+            const isTransactionOnHold = isOnHold(originalTransaction);
+
+            if (isTransactionOnHold) {
+                const holdReportActionIDs: string[] = [];
+                const holdReportActionCommentIDs: string[] = [];
+                const transactionReportActions = getAllReportActions(firstIOU?.childReportID);
+                const holdReportAction = getReportAction(firstIOU?.childReportID, `${originalTransaction?.comment?.hold ?? ''}`);
+
+                const holdReportActionComment = holdReportAction
+                    ? Object.values(transactionReportActions ?? {}).find(
+                          (action) => action?.actionName === CONST.REPORT.ACTIONS.TYPE.ADD_COMMENT && action?.timestamp === holdReportAction.timestamp,
+                      )
+                    : undefined;
+
+                if (holdReportAction && holdReportActionComment) {
+                    // Loop through all split expenses and add optimistic hold report actions for each split
+                    for (const [index, splitExpense] of splits.entries()) {
+                        const splitReportID = splitExpense?.transactionThreadReportID;
+                        if (!splitReportID) {
+                            continue;
+                        }
+
+                        // Generate new IDs and timestamps for each split
+                        const newHoldReportActionID = NumberUtils.rand64();
+                        const newHoldReportActionCommentID = NumberUtils.rand64();
+                        const timestamp = DateUtils.getDBTime();
+                        const reportActionTimestamp = DateUtils.addMillisecondsFromDateTime(timestamp, 1);
+
+                        // Store IDs for API parameters
+                        holdReportActionIDs[index] = newHoldReportActionID;
+                        holdReportActionCommentIDs[index] = newHoldReportActionCommentID;
+
+                        // Create new optimistic hold report action with new ID and timestamp, keeping other information
+                        const newHoldReportAction = {
+                            ...holdReportAction,
+                            reportActionID: newHoldReportActionID,
+                            created: timestamp,
+                            pendingAction: CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD,
+                        };
+
+                        // Create new optimistic hold report action comment with new ID and timestamp, keeping other information
+                        const newHoldReportActionComment = {
+                            ...holdReportActionComment,
+                            reportActionID: newHoldReportActionCommentID,
+                            created: reportActionTimestamp,
+                            pendingAction: CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD,
+                        };
+
+                        // Add to optimisticData for this split's reportActions
+                        optimisticData.push({
+                            onyxMethod: Onyx.METHOD.MERGE,
+                            key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${splitReportID}`,
+                            value: {
+                                [newHoldReportActionID]: newHoldReportAction,
+                                [newHoldReportActionCommentID]: newHoldReportActionComment,
+                            },
+                        });
+
+                        // Add successData to clear pendingAction after API call succeeds
+                        successData.push({
+                            onyxMethod: Onyx.METHOD.MERGE,
+                            key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${splitReportID}`,
+                            value: {
+                                [newHoldReportActionID]: {pendingAction: null},
+                                [newHoldReportActionCommentID]: {pendingAction: null},
+                            },
+                        });
+
+                        // Add failureData to remove optimistic hold report actions if the request fails
+                        failureData.push({
+                            onyxMethod: Onyx.METHOD.MERGE,
+                            key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${splitReportID}`,
+                            value: {
+                                [newHoldReportActionID]: null,
+                                [newHoldReportActionCommentID]: null,
+                            },
+                        });
+                    }
+
+                    // Add hold report action IDs to API parameters
+                    for (const [i, holdReportActionID] of holdReportActionIDs.entries()) {
+                        if (holdReportActionID) {
+                            splitApiParams[`splits[${i}][holdReportActionID]`] = holdReportActionID;
+                        }
+                    }
+                    for (const [i, holdReportActionCommentID] of holdReportActionCommentIDs.entries()) {
+                        if (holdReportActionCommentID) {
+                            splitApiParams[`splits[${i}][holdReportActionCommentID]`] = holdReportActionCommentID;
+                        }
+                    }
+                }
+            }
+        }
+
+        const splitParameters: SplitTransactionParams = {
+            ...splitApiParams,
+            transactionID: originalTransactionID,
+        };
+
+        if (isCreationOfSplits) {
+            // eslint-disable-next-line rulesdir/no-multiple-api-calls
+            API.write(WRITE_COMMANDS.SPLIT_TRANSACTION, splitParameters, {optimisticData, successData, failureData});
+        } else {
+            // eslint-disable-next-line rulesdir/no-multiple-api-calls
+            API.write(WRITE_COMMANDS.UPDATE_SPLIT_TRANSACTION, splitParameters, {optimisticData, successData, failureData});
+        }
+    }
+    // eslint-disable-next-line @typescript-eslint/no-deprecated
+    InteractionManager.runAfterInteractions(() => removeDraftSplitTransaction(originalTransactionID));
+}
+
+function updateSplitTransactionsFromSplitExpensesFlow(params: UpdateSplitTransactionsParams) {
+    updateSplitTransactions(params);
+    const transactionReport = getReportOrDraftReport(params.transactionData?.reportID);
+    const parentTransactionReport = getReportOrDraftReport(transactionReport?.parentReportID);
+    const expenseReport = transactionReport?.type === CONST.REPORT.TYPE.EXPENSE ? transactionReport : parentTransactionReport;
+    const isSearchPageTopmostFullScreenRoute = isSearchTopmostFullScreenRoute();
+    const transactionThreadReportID = params.firstIOU?.childReportID;
+    const transactionThreadReportScreen = Navigation.getReportRouteByID(transactionThreadReportID);
+
+    // Reset selected transactions in search after saving split expenses
+    const searchFullScreenRoutes = navigationRef.getRootState()?.routes.findLast((route) => route.name === NAVIGATORS.SEARCH_FULLSCREEN_NAVIGATOR);
+    const lastRoute = searchFullScreenRoutes?.state?.routes?.at(-1);
+    const isUserOnSearchPage = isSearchTopmostFullScreenRoute() && lastRoute?.name === SCREENS.SEARCH.ROOT;
+    if (isUserOnSearchPage) {
+        params?.searchContext?.clearSelectedTransactions?.(undefined, true);
+    } else {
+        params?.searchContext?.clearSelectedTransactions?.(true);
+    }
+
+    if (isSearchPageTopmostFullScreenRoute || !transactionReport?.parentReportID) {
+        Navigation.dismissModal();
+
+        // After the modal is dismissed, remove the transaction thread report screen
+        // to avoid navigating back to a report removed by the split transaction.
+        requestAnimationFrame(() => {
+            if (!transactionThreadReportScreen?.key) {
+                return;
+            }
+
+            Navigation.removeScreenByKey(transactionThreadReportScreen.key);
+        });
+
+        return;
+    }
+    Navigation.dismissModalWithReport({reportID: expenseReport?.reportID ?? String(CONST.DEFAULT_NUMBER_ID)});
+
+    // After the modal is dismissed, remove the transaction thread report screen
+    // to avoid navigating back to a report removed by the split transaction.
+    requestAnimationFrame(() => {
+        if (!transactionThreadReportScreen?.key) {
+            return;
+        }
+
+        Navigation.removeScreenByKey(transactionThreadReportScreen.key);
+    });
+}
+
 function assignReportToMe(
     report: OnyxTypes.Report,
     accountID: number,
@@ -12763,7 +13950,7 @@ function assignReportToMe(
         bypassNextApproverID: accountID,
     });
 
-    const onyxData: OnyxData<typeof ONYXKEYS.COLLECTION.REPORT | typeof ONYXKEYS.COLLECTION.REPORT_ACTIONS | typeof ONYXKEYS.COLLECTION.NEXT_STEP> = {
+    const onyxData: OnyxData = {
         optimisticData: [
             {
                 onyxMethod: Onyx.METHOD.MERGE,
@@ -12878,7 +14065,7 @@ function addReportApprover(
         isASAPSubmitBetaEnabled,
         bypassNextApproverID: newApproverAccountID,
     });
-    const onyxData: OnyxData<typeof ONYXKEYS.COLLECTION.REPORT | typeof ONYXKEYS.COLLECTION.REPORT_ACTIONS | typeof ONYXKEYS.COLLECTION.NEXT_STEP> = {
+    const onyxData: OnyxData = {
         optimisticData: [
             {
                 onyxMethod: Onyx.METHOD.MERGE,
@@ -12964,6 +14151,7 @@ export {
     canCancelPayment,
     cleanUpMoneyRequest,
     clearMoneyRequest,
+    completeSplitBill,
     createDistanceRequest,
     createDraftTransaction,
     deleteMoneyRequest,
@@ -13016,7 +14204,10 @@ export {
     setMoneyRequestTaxAmount,
     setMoneyRequestTaxRate,
     setSplitShares,
+    splitBill,
+    splitBillAndOpenReport,
     startMoneyRequest,
+    startSplitBill,
     submitReport,
     trackExpense,
     unapproveExpenseReport,
@@ -13054,6 +14245,8 @@ export {
     evenlyDistributeSplitExpenseAmounts,
     resetSplitExpensesByDateRange,
     updateSplitExpenseAmountField,
+    updateSplitTransactions,
+    updateSplitTransactionsFromSplitExpensesFlow,
     initDraftSplitExpenseDataForEdit,
     removeSplitExpenseField,
     updateSplitExpenseField,
@@ -13081,12 +14274,6 @@ export {
     getSearchOnyxUpdate,
     setMoneyRequestTimeRate,
     setMoneyRequestTimeCount,
-    buildMinimalTransactionForFormula,
-    buildOnyxDataForMoneyRequest,
-    createSplitsAndOnyxData,
-    getDeleteTrackExpenseInformation,
-    getMoneyRequestInformation,
-    getOrCreateOptimisticSplitChatReport,
 };
 export type {
     GPSPoint as GpsPoint,
@@ -13099,7 +14286,4 @@ export type {
     PerDiemExpenseTransactionParams,
     UpdateMoneyRequestData,
     BasePolicyParams,
-    MoneyRequestInformationParams,
-    OneOnOneIOUReport,
-    RejectMoneyRequestData,
 };
diff --git a/src/libs/actions/MergeTransaction.ts b/src/libs/actions/MergeTransaction.ts
index 310b3114c181..7941e91ef389 100644
--- a/src/libs/actions/MergeTransaction.ts
+++ b/src/libs/actions/MergeTransaction.ts
@@ -22,7 +22,7 @@ import CONST from '@src/CONST';
 import {isDistanceRequest, isTransactionPendingDelete} from '@src/libs/TransactionUtils';
 import ONYXKEYS from '@src/ONYXKEYS';
 import ROUTES from '@src/ROUTES';
-import type {CardList, MergeTransaction, Policy, PolicyCategories, PolicyTagLists, Report, ReportNextStepDeprecated, Transaction, TransactionViolations} from '@src/types/onyx';
+import type {CardList, MergeTransaction, Policy, PolicyCategories, PolicyTagLists, Report, Transaction, TransactionViolations} from '@src/types/onyx';
 import {getUpdateMoneyRequestParams, getUpdateTrackExpenseParams} from './IOU';
 import type {UpdateMoneyRequestData} from './IOU';
 
@@ -186,7 +186,6 @@ function getOnyxTargetTransactionData({
     mergeTransaction,
     targetTransactionThreadReport,
     targetTransactionThreadParentReport,
-    targetTransactionThreadParentReportNextStep,
     policy,
     policyTags,
     policyCategories,
@@ -199,7 +198,6 @@ function getOnyxTargetTransactionData({
     mergeTransaction: MergeTransaction;
     targetTransactionThreadReport: OnyxEntry<Report>;
     targetTransactionThreadParentReport: OnyxEntry<Report>;
-    targetTransactionThreadParentReportNextStep: OnyxEntry<ReportNextStepDeprecated>;
     policy: OnyxEntry<Policy>;
     policyTags: OnyxEntry<PolicyTagLists>;
     policyCategories: OnyxEntry<PolicyCategories>;
@@ -239,7 +237,6 @@ function getOnyxTargetTransactionData({
             transactionID: targetTransaction.transactionID,
             transactionThreadReport: targetTransactionThreadReport,
             iouReport: targetTransactionThreadParentReport,
-            iouReportNextStep: targetTransactionThreadParentReportNextStep,
             transactionChanges: filteredTransactionChanges,
             policy,
             policyTagList: policyTags,
@@ -290,7 +287,6 @@ type MergeTransactionRequestParams = {
     sourceTransaction: Transaction;
     targetTransactionThreadReport: OnyxEntry<Report>;
     targetTransactionThreadParentReport: OnyxEntry<Report>;
-    targetTransactionThreadParentReportNextStep: OnyxEntry<ReportNextStepDeprecated>;
     policy: OnyxEntry<Policy>;
     policyTags: OnyxEntry<PolicyTagLists>;
     policyCategories: OnyxEntry<PolicyCategories>;
@@ -308,7 +304,6 @@ function mergeTransactionRequest({
     sourceTransaction,
     targetTransactionThreadReport,
     targetTransactionThreadParentReport,
-    targetTransactionThreadParentReportNextStep,
     allTransactionViolations,
     policy,
     policyTags,
@@ -351,7 +346,6 @@ function mergeTransactionRequest({
         mergeTransaction,
         targetTransactionThreadReport,
         targetTransactionThreadParentReport,
-        targetTransactionThreadParentReportNextStep,
         policy,
         policyTags,
         policyCategories,
diff --git a/src/libs/actions/OnyxDerived/ONYX_DERIVED_VALUES.ts b/src/libs/actions/OnyxDerived/ONYX_DERIVED_VALUES.ts
index 32a1cd58914c..0f9c467e518d 100644
--- a/src/libs/actions/OnyxDerived/ONYX_DERIVED_VALUES.ts
+++ b/src/libs/actions/OnyxDerived/ONYX_DERIVED_VALUES.ts
@@ -3,7 +3,6 @@ import ONYXKEYS from '@src/ONYXKEYS';
 import outstandingReportsByPolicyIDConfig from './configs/outstandingReportsByPolicyID';
 import reportAttributesConfig from './configs/reportAttributes';
 import reportTransactionsAndViolationsConfig from './configs/reportTransactionsAndViolations';
-import visibleReportActionsConfig from './configs/visibleReportActions';
 import type {OnyxDerivedValueConfig} from './types';
 
 /**
@@ -14,7 +13,6 @@ const ONYX_DERIVED_VALUES = {
     [ONYXKEYS.DERIVED.REPORT_ATTRIBUTES]: reportAttributesConfig,
     [ONYXKEYS.DERIVED.REPORT_TRANSACTIONS_AND_VIOLATIONS]: reportTransactionsAndViolationsConfig,
     [ONYXKEYS.DERIVED.OUTSTANDING_REPORTS_BY_POLICY_ID]: outstandingReportsByPolicyIDConfig,
-    [ONYXKEYS.DERIVED.VISIBLE_REPORT_ACTIONS]: visibleReportActionsConfig,
 } as const satisfies {
     // eslint-disable-next-line @typescript-eslint/no-explicit-any
     [Key in ValueOf<typeof ONYXKEYS.DERIVED>]: OnyxDerivedValueConfig<Key, any>;
diff --git a/src/libs/actions/OnyxDerived/configs/reportAttributes.ts b/src/libs/actions/OnyxDerived/configs/reportAttributes.ts
index e998c18507f5..eb4069ce021e 100644
--- a/src/libs/actions/OnyxDerived/configs/reportAttributes.ts
+++ b/src/libs/actions/OnyxDerived/configs/reportAttributes.ts
@@ -68,12 +68,11 @@ export default createOnyxDerivedValueConfig({
         ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS,
         ONYXKEYS.COLLECTION.TRANSACTION,
         ONYXKEYS.PERSONAL_DETAILS_LIST,
-        ONYXKEYS.SESSION,
         ONYXKEYS.COLLECTION.POLICY,
         ONYXKEYS.COLLECTION.REPORT_METADATA,
     ],
     compute: (
-        [reports, preferredLocale, transactionViolations, reportActions, reportNameValuePairs, transactions, personalDetails, session, policies],
+        [reports, preferredLocale, transactionViolations, reportActions, reportNameValuePairs, transactions, personalDetails, policies],
         {currentValue, sourceValues, areAllConnectionsSet},
     ) => {
         if (!areAllConnectionsSet) {
@@ -220,9 +219,7 @@ export default createOnyxDerivedValueConfig({
             }
 
             acc[report.reportID] = {
-                reportName: report
-                    ? computeReportName(report, reports, policies, transactions, reportNameValuePairs, personalDetails, reportActions, session?.accountID ?? CONST.DEFAULT_NUMBER_ID)
-                    : '',
+                reportName: report ? computeReportName(report, reports, policies, transactions, reportNameValuePairs, personalDetails, reportActions) : '',
                 isEmpty: generateIsEmptyReport(report, isReportArchived),
                 brickRoadStatus,
                 requiresAttention,
diff --git a/src/libs/actions/OnyxDerived/configs/visibleReportActions.ts b/src/libs/actions/OnyxDerived/configs/visibleReportActions.ts
deleted file mode 100644
index 6dd27b6c8cc8..000000000000
--- a/src/libs/actions/OnyxDerived/configs/visibleReportActions.ts
+++ /dev/null
@@ -1,136 +0,0 @@
-import type {OnyxEntry} from 'react-native-onyx';
-import {isActionableWhisperRequiringWritePermission, isConciergeCategoryOptions, isMovedTransactionAction, shouldReportActionBeVisible} from '@libs/ReportActionsUtils';
-import createOnyxDerivedValueConfig from '@userActions/OnyxDerived/createOnyxDerivedValueConfig';
-import CONST from '@src/CONST';
-import ONYXKEYS from '@src/ONYXKEYS';
-import type {ReportAction, ReportActions} from '@src/types/onyx';
-import type {VisibleReportActionsDerivedValue} from '@src/types/onyx/DerivedValues';
-
-function getOrCreateReportVisibilityRecord(result: VisibleReportActionsDerivedValue, reportID: string): Record<string, boolean> {
-    if (!result[reportID]) {
-        // eslint-disable-next-line no-param-reassign
-        result[reportID] = {};
-    }
-    return result[reportID];
-}
-
-function doesActionDependOnReportExistence(action: ReportAction): boolean {
-    const isUnreportedTransaction = action.actionName === CONST.REPORT.ACTIONS.TYPE.UNREPORTED_TRANSACTION;
-    const isMovedTransaction = isMovedTransactionAction(action as OnyxEntry<ReportAction>);
-
-    return isUnreportedTransaction || isMovedTransaction;
-}
-
-/**
- * Returns true if the action's visibility depends on runtime context that can't be cached,
- * such as write permissions or policy settings.
- */
-function shouldSkipCachingAction(action: ReportAction): boolean {
-    return isActionableWhisperRequiringWritePermission(action) || isConciergeCategoryOptions(action);
-}
-
-export default createOnyxDerivedValueConfig({
-    key: ONYXKEYS.DERIVED.VISIBLE_REPORT_ACTIONS,
-    // Note: REPORT and SESSION dependencies are needed to trigger recompute when reports change
-    // (for UNREPORTED_TRANSACTION/MOVED_TRANSACTION visibility) or when user changes (for whisper targeting).
-    // shouldReportActionBeVisible uses global Onyx-connected variables internally.
-    dependencies: [ONYXKEYS.COLLECTION.REPORT_ACTIONS, ONYXKEYS.COLLECTION.REPORT, ONYXKEYS.SESSION],
-    compute: ([allReportActions], {sourceValues, currentValue}): VisibleReportActionsDerivedValue => {
-        if (!allReportActions) {
-            return {};
-        }
-
-        const reportActionsUpdates = sourceValues?.[ONYXKEYS.COLLECTION.REPORT_ACTIONS];
-        const reportUpdates = sourceValues?.[ONYXKEYS.COLLECTION.REPORT];
-        const sessionUpdates = sourceValues?.[ONYXKEYS.SESSION];
-
-        // Session change = user changed, need full recompute due to whisper targeting
-        if (sessionUpdates) {
-            const result: VisibleReportActionsDerivedValue = {};
-
-            for (const [reportActionsKey, reportActions] of Object.entries(allReportActions)) {
-                if (!reportActions) {
-                    continue;
-                }
-
-                const reportID = reportActionsKey.replace(ONYXKEYS.COLLECTION.REPORT_ACTIONS, '');
-                const reportVisibility = getOrCreateReportVisibilityRecord(result, reportID);
-
-                for (const [actionID, action] of Object.entries(reportActions)) {
-                    if (action) {
-                        if (shouldSkipCachingAction(action)) {
-                            continue;
-                        }
-                        reportVisibility[actionID] = shouldReportActionBeVisible(action, actionID);
-                    }
-                }
-            }
-
-            return result;
-        }
-
-        // Only reports changed - recompute actions that depend on report existence
-        if (reportUpdates && !reportActionsUpdates) {
-            const result: VisibleReportActionsDerivedValue = currentValue ? {...currentValue} : {};
-
-            for (const [reportActionsKey, reportActions] of Object.entries(allReportActions)) {
-                if (!reportActions) {
-                    continue;
-                }
-
-                const reportID = reportActionsKey.replace(ONYXKEYS.COLLECTION.REPORT_ACTIONS, '');
-                const reportVisibility = getOrCreateReportVisibilityRecord(result, reportID);
-
-                for (const [actionID, action] of Object.entries(reportActions)) {
-                    if (!action) {
-                        continue;
-                    }
-
-                    if (doesActionDependOnReportExistence(action)) {
-                        if (shouldSkipCachingAction(action)) {
-                            delete reportVisibility[actionID];
-                            continue;
-                        }
-                        reportVisibility[actionID] = shouldReportActionBeVisible(action, actionID);
-                    }
-                }
-            }
-
-            return result;
-        }
-
-        const result: VisibleReportActionsDerivedValue = currentValue ? {...currentValue} : {};
-        const reportActionsToProcess = reportActionsUpdates ? Object.keys(reportActionsUpdates) : Object.keys(allReportActions);
-
-        for (const reportActionsKey of reportActionsToProcess) {
-            const reportActions: OnyxEntry<ReportActions> = allReportActions[reportActionsKey];
-            const reportID = reportActionsKey.replace(ONYXKEYS.COLLECTION.REPORT_ACTIONS, '');
-
-            if (!reportActions) {
-                delete result[reportID];
-                continue;
-            }
-
-            const reportVisibility = getOrCreateReportVisibilityRecord(result, reportID);
-
-            const specificUpdates = reportActionsUpdates?.[reportActionsKey];
-            const actionsToProcess = specificUpdates ? Object.entries(specificUpdates) : Object.entries(reportActions);
-
-            for (const [actionID, action] of actionsToProcess) {
-                if (!action) {
-                    delete reportVisibility[actionID];
-                    continue;
-                }
-
-                if (shouldSkipCachingAction(action)) {
-                    delete reportVisibility[actionID];
-                    continue;
-                }
-
-                reportVisibility[actionID] = shouldReportActionBeVisible(action, actionID);
-            }
-        }
-
-        return result;
-    },
-});
diff --git a/src/libs/actions/PaymentMethods.ts b/src/libs/actions/PaymentMethods.ts
index dfe5e90879e8..c0055ae91573 100644
--- a/src/libs/actions/PaymentMethods.ts
+++ b/src/libs/actions/PaymentMethods.ts
@@ -278,7 +278,7 @@ function addSubscriptionPaymentCard(
  * Calls the API to add a new SCA (GBP or EUR) card.
  * Updates verify3dsSubscription Onyx key with a new authentication link for 3DS.
  */
-function addPaymentCardSCA(params: AddPaymentCardParams, onyxData: OnyxData<typeof ONYXKEYS.FORMS.ADD_PAYMENT_CARD_FORM> = {}) {
+function addPaymentCardSCA(params: AddPaymentCardParams, onyxData: OnyxData = {}) {
     API.write(WRITE_COMMANDS.ADD_PAYMENT_CARD_SCA, params, onyxData);
 }
 
diff --git a/src/libs/actions/Policy/Category.ts b/src/libs/actions/Policy/Category.ts
index 4fa96f04b42c..a404d2854d4a 100644
--- a/src/libs/actions/Policy/Category.ts
+++ b/src/libs/actions/Policy/Category.ts
@@ -11,7 +11,6 @@ import type {
     OpenPolicyCategoriesPageParams,
     RemovePolicyCategoryReceiptsRequiredParams,
     SetPolicyCategoryApproverParams,
-    SetPolicyCategoryAttendeesRequiredParams,
     SetPolicyCategoryDescriptionRequiredParams,
     SetPolicyCategoryMaxAmountParams,
     SetPolicyCategoryReceiptsRequiredParams,
@@ -39,44 +38,8 @@ import type {ApprovalRule, ExpenseRule, MccGroup} from '@src/types/onyx/Policy';
 import type {PolicyCategoryExpenseLimitType} from '@src/types/onyx/PolicyCategory';
 import type {OnyxData} from '@src/types/onyx/Request';
 
-type CreatePolicyCategoryParams = {
-    policyID: string;
-    categoryName: string;
-    isSetupCategoriesTaskParentReportArchived: boolean;
-    setupCategoryTaskReport: OnyxEntry<Report>;
-    setupCategoryTaskParentReport: OnyxEntry<Report>;
-    currentUserAccountID: number;
-    hasOutstandingChildTask: boolean;
-    parentReportAction: OnyxEntry<ReportAction>;
-    setupCategoriesAndTagsTaskReport?: OnyxEntry<Report>;
-    setupCategoriesAndTagsTaskParentReport?: OnyxEntry<Report>;
-    isSetupCategoriesAndTagsTaskParentReportArchived?: boolean;
-    setupCategoriesAndTagsHasOutstandingChildTask?: boolean;
-    setupCategoriesAndTagsParentReportAction?: OnyxEntry<ReportAction>;
-    policyHasTags?: boolean;
-};
-
-type SetWorkspaceCategoryEnabledParams = {
-    policyData: PolicyData;
-    categoriesToUpdate: Record<string, {name: string; enabled: boolean}>;
-    isSetupCategoriesTaskParentReportArchived: boolean;
-    setupCategoryTaskReport: OnyxEntry<Report>;
-    setupCategoryTaskParentReport: OnyxEntry<Report>;
-    currentUserAccountID: number;
-    hasOutstandingChildTask: boolean;
-    parentReportAction: OnyxEntry<ReportAction> | undefined;
-    setupCategoriesAndTagsTaskReport?: OnyxEntry<Report>;
-    setupCategoriesAndTagsTaskParentReport?: OnyxEntry<Report>;
-    isSetupCategoriesAndTagsTaskParentReportArchived?: boolean;
-    setupCategoriesAndTagsHasOutstandingChildTask?: boolean;
-    setupCategoriesAndTagsParentReportAction?: OnyxEntry<ReportAction>;
-    policyHasTags?: boolean;
-};
-
 function appendSetupCategoriesOnboardingData(
-    onyxData: OnyxData<
-        typeof ONYXKEYS.COLLECTION.POLICY_CATEGORIES | typeof ONYXKEYS.COLLECTION.POLICY_CATEGORIES_DRAFT | typeof ONYXKEYS.COLLECTION.REPORT | typeof ONYXKEYS.COLLECTION.REPORT_ACTIONS
-    >,
+    onyxData: OnyxData,
     setupCategoryTaskReport: OnyxEntry<Report>,
     setupCategoryTaskParentReport: OnyxEntry<Report>,
     isSetupCategoriesTaskParentReportArchived: boolean,
@@ -124,7 +87,7 @@ function buildOptimisticPolicyWithExistingCategories(policyID: string, categorie
         return acc;
     }, {});
 
-    const onyxData: OnyxData<typeof ONYXKEYS.COLLECTION.POLICY_CATEGORIES | typeof ONYXKEYS.COLLECTION.POLICY_CATEGORIES_DRAFT> = {
+    const onyxData: OnyxData = {
         optimisticData: [
             {
                 onyxMethod: Onyx.METHOD.MERGE,
@@ -182,7 +145,7 @@ function buildOptimisticPolicyCategories(policyID: string, categories: readonly
         return acc;
     }, {});
 
-    const onyxData: OnyxData<typeof ONYXKEYS.COLLECTION.POLICY_CATEGORIES | typeof ONYXKEYS.COLLECTION.POLICY_CATEGORIES_DRAFT> = {
+    const onyxData: OnyxData = {
         optimisticData: [
             {
                 onyxMethod: Onyx.METHOD.MERGE,
@@ -300,7 +263,7 @@ function buildOptimisticMccGroup() {
 }
 
 function updateImportSpreadsheetData(categoriesLength: number) {
-    const onyxData: OnyxData<typeof ONYXKEYS.IMPORTED_SPREADSHEET> = {
+    const onyxData: OnyxData = {
         successData: [
             {
                 onyxMethod: Onyx.METHOD.MERGE,
@@ -362,22 +325,16 @@ function getPolicyCategories(policyID: string) {
     API.read(READ_COMMANDS.GET_POLICY_CATEGORIES, params);
 }
 
-function setWorkspaceCategoryEnabled({
-    policyData,
-    categoriesToUpdate,
-    isSetupCategoriesTaskParentReportArchived,
-    setupCategoryTaskReport,
-    setupCategoryTaskParentReport,
-    currentUserAccountID,
-    hasOutstandingChildTask,
-    parentReportAction,
-    setupCategoriesAndTagsTaskReport,
-    setupCategoriesAndTagsTaskParentReport,
-    isSetupCategoriesAndTagsTaskParentReportArchived,
-    setupCategoriesAndTagsHasOutstandingChildTask,
-    setupCategoriesAndTagsParentReportAction,
-    policyHasTags,
-}: SetWorkspaceCategoryEnabledParams) {
+function setWorkspaceCategoryEnabled(
+    policyData: PolicyData,
+    categoriesToUpdate: Record<string, {name: string; enabled: boolean}>,
+    isSetupCategoriesTaskParentReportArchived: boolean,
+    setupCategoryTaskReport: OnyxEntry<Report>,
+    setupCategoryTaskParentReport: OnyxEntry<Report>,
+    currentUserAccountID: number,
+    hasOutstandingChildTask: boolean,
+    parentReportAction: OnyxEntry<ReportAction> | undefined,
+) {
     const policyID = policyData.policy?.id;
     const policyCategoriesOptimisticData = {
         ...Object.keys(categoriesToUpdate).reduce<PolicyCategories>((acc, key) => {
@@ -394,7 +351,7 @@ function setWorkspaceCategoryEnabled({
         }, {}),
     };
 
-    const onyxData: OnyxData<typeof ONYXKEYS.COLLECTION.POLICY_CATEGORIES> = {
+    const onyxData: OnyxData = {
         optimisticData: [
             {
                 onyxMethod: Onyx.METHOD.MERGE,
@@ -454,18 +411,6 @@ function setWorkspaceCategoryEnabled({
         parentReportAction,
     );
 
-    if (setupCategoriesAndTagsTaskReport && policyHasTags) {
-        appendSetupCategoriesOnboardingData(
-            onyxData,
-            setupCategoriesAndTagsTaskReport,
-            setupCategoriesAndTagsTaskParentReport,
-            isSetupCategoriesAndTagsTaskParentReportArchived ?? false,
-            currentUserAccountID,
-            setupCategoriesAndTagsHasOutstandingChildTask ?? false,
-            setupCategoriesAndTagsParentReportAction,
-        );
-    }
-
     const parameters = {
         policyID,
         categories: JSON.stringify(Object.keys(categoriesToUpdate).map((key) => categoriesToUpdate[key])),
@@ -482,7 +427,7 @@ function setPolicyCategoryDescriptionRequired(policyID: string, categoryName: st
     // When areCommentsRequired is set to false, commentHint has to be reset
     const updatedCommentHint = areCommentsRequired ? policyCategories?.[categoryName]?.commentHint : '';
 
-    const onyxData: OnyxData<typeof ONYXKEYS.COLLECTION.POLICY_CATEGORIES> = {
+    const onyxData: OnyxData = {
         optimisticData: [
             {
                 onyxMethod: Onyx.METHOD.MERGE,
@@ -556,7 +501,7 @@ function setPolicyCategoryReceiptsRequired(policyData: PolicyData, categoryName:
         },
     };
 
-    const onyxData: OnyxData<typeof ONYXKEYS.COLLECTION.POLICY_CATEGORIES> = {
+    const onyxData: OnyxData = {
         optimisticData: [
             {
                 onyxMethod: Onyx.METHOD.MERGE,
@@ -621,7 +566,7 @@ function removePolicyCategoryReceiptsRequired(policyData: PolicyData, categoryNa
         },
     };
 
-    const onyxData: OnyxData<typeof ONYXKEYS.COLLECTION.POLICY_CATEGORIES> = {
+    const onyxData: OnyxData = {
         optimisticData: [
             {
                 onyxMethod: Onyx.METHOD.MERGE,
@@ -672,22 +617,16 @@ function removePolicyCategoryReceiptsRequired(policyData: PolicyData, categoryNa
     API.write(WRITE_COMMANDS.REMOVE_POLICY_CATEGORY_RECEIPTS_REQUIRED, parameters, onyxData);
 }
 
-function createPolicyCategory({
-    policyID,
-    categoryName,
-    isSetupCategoriesTaskParentReportArchived,
-    setupCategoryTaskReport,
-    setupCategoryTaskParentReport,
-    currentUserAccountID,
-    hasOutstandingChildTask,
-    parentReportAction,
-    setupCategoriesAndTagsTaskReport,
-    setupCategoriesAndTagsTaskParentReport,
-    isSetupCategoriesAndTagsTaskParentReportArchived,
-    setupCategoriesAndTagsHasOutstandingChildTask,
-    setupCategoriesAndTagsParentReportAction,
-    policyHasTags,
-}: CreatePolicyCategoryParams) {
+function createPolicyCategory(
+    policyID: string,
+    categoryName: string,
+    isSetupCategoriesTaskParentReportArchived: boolean,
+    setupCategoryTaskReport: OnyxEntry<Report>,
+    setupCategoryTaskParentReport: OnyxEntry<Report>,
+    currentUserAccountID: number,
+    hasOutstandingChildTask: boolean,
+    parentReportAction: OnyxEntry<ReportAction>,
+) {
     const onyxData = buildOptimisticPolicyCategories(policyID, [categoryName]);
     appendSetupCategoriesOnboardingData(
         onyxData,
@@ -698,18 +637,6 @@ function createPolicyCategory({
         hasOutstandingChildTask,
         parentReportAction,
     );
-    // Complete the combined "Set up categories and tags" task only if tags already exist
-    if (setupCategoriesAndTagsTaskReport && policyHasTags) {
-        appendSetupCategoriesOnboardingData(
-            onyxData,
-            setupCategoriesAndTagsTaskReport,
-            setupCategoriesAndTagsTaskParentReport,
-            isSetupCategoriesAndTagsTaskParentReportArchived ?? false,
-            currentUserAccountID,
-            setupCategoriesAndTagsHasOutstandingChildTask ?? false,
-            setupCategoriesAndTagsParentReportAction,
-        );
-    }
     const parameters = {
         policyID,
         categories: JSON.stringify([{name: categoryName}]),
@@ -800,7 +727,7 @@ function renamePolicyCategory(policyData: PolicyData, policyCategory: {oldName:
         },
     };
 
-    const onyxData: OnyxData<typeof ONYXKEYS.COLLECTION.POLICY_CATEGORIES | typeof ONYXKEYS.COLLECTION.POLICY> = {
+    const onyxData: OnyxData = {
         optimisticData: [
             {
                 onyxMethod: Onyx.METHOD.MERGE,
@@ -883,7 +810,7 @@ function renamePolicyCategory(policyData: PolicyData, policyCategory: {oldName:
 function setPolicyCategoryPayrollCode(policyID: string, categoryName: string, payrollCode: string, policyCategories: PolicyCategories = {}) {
     const policyCategoryToUpdate = policyCategories?.[categoryName] ?? {};
 
-    const onyxData: OnyxData<typeof ONYXKEYS.COLLECTION.POLICY_CATEGORIES> = {
+    const onyxData: OnyxData = {
         optimisticData: [
             {
                 onyxMethod: Onyx.METHOD.MERGE,
@@ -951,7 +878,7 @@ function setPolicyCategoryPayrollCode(policyID: string, categoryName: string, pa
 function setPolicyCategoryGLCode(policyID: string, categoryName: string, glCode: string, policyCategories: PolicyCategories = {}) {
     const policyCategoryToUpdate = policyCategories?.[categoryName] ?? {};
 
-    const onyxData: OnyxData<typeof ONYXKEYS.COLLECTION.POLICY_CATEGORIES> = {
+    const onyxData: OnyxData = {
         optimisticData: [
             {
                 onyxMethod: Onyx.METHOD.MERGE,
@@ -1028,7 +955,7 @@ function setWorkspaceRequiresCategory(policyData: PolicyData, requiresCategory:
         },
     };
 
-    const onyxData: OnyxData<typeof ONYXKEYS.COLLECTION.POLICY> = {
+    const onyxData: OnyxData = {
         optimisticData: [
             {
                 onyxMethod: Onyx.METHOD.MERGE,
@@ -1121,7 +1048,7 @@ function deleteWorkspaceCategories(
           }
         : {};
 
-    const onyxData: OnyxData<typeof ONYXKEYS.COLLECTION.POLICY_CATEGORIES> = {
+    const onyxData: OnyxData = {
         optimisticData: [
             {
                 onyxMethod: Onyx.METHOD.MERGE,
@@ -1191,7 +1118,7 @@ function enablePolicyCategories(policyData: PolicyData, enabled: boolean, should
             },
         ]),
     );
-    const onyxData: OnyxData<typeof ONYXKEYS.COLLECTION.POLICY | typeof ONYXKEYS.COLLECTION.POLICY_CATEGORIES> = {
+    const onyxData: OnyxData = {
         optimisticData: [
             {
                 onyxMethod: Onyx.METHOD.MERGE,
@@ -1327,7 +1254,7 @@ function downloadCategoriesCSV(policyID: string, onDownloadFailed: () => void, t
 function setWorkspaceCategoryDescriptionHint(policyID: string, categoryName: string, commentHint: string, policyCategories: PolicyCategories = {}) {
     const originalCommentHint = policyCategories?.[categoryName]?.commentHint;
 
-    const onyxData: OnyxData<typeof ONYXKEYS.COLLECTION.POLICY_CATEGORIES> = {
+    const onyxData: OnyxData = {
         optimisticData: [
             {
                 onyxMethod: Onyx.METHOD.MERGE,
@@ -1397,7 +1324,7 @@ function setPolicyCategoryMaxAmount(
     const originalExpenseLimitType = policyCategoryToUpdate?.expenseLimitType;
     const parsedMaxExpenseAmount = maxExpenseAmount === '' ? null : CurrencyUtils.convertToBackendAmount(parseFloat(maxExpenseAmount));
 
-    const onyxData: OnyxData<typeof ONYXKEYS.COLLECTION.POLICY_CATEGORIES> = {
+    const onyxData: OnyxData = {
         optimisticData: [
             {
                 onyxMethod: Onyx.METHOD.MERGE,
@@ -1490,7 +1417,7 @@ function setPolicyCategoryApprover(policyID: string, categoryName: string, appro
         }
     }
 
-    const onyxData: OnyxData<typeof ONYXKEYS.COLLECTION.POLICY> = {
+    const onyxData: OnyxData = {
         optimisticData: [
             {
                 onyxMethod: Onyx.METHOD.MERGE,
@@ -1559,7 +1486,7 @@ function setPolicyCategoryTax(policy: OnyxEntry<Policy>, categoryName: string, t
         }
     }
 
-    const onyxData: OnyxData<typeof ONYXKEYS.COLLECTION.POLICY> = {
+    const onyxData: OnyxData = {
         optimisticData: [
             {
                 onyxMethod: Onyx.METHOD.MERGE,
@@ -1593,68 +1520,6 @@ function setPolicyCategoryTax(policy: OnyxEntry<Policy>, categoryName: string, t
     API.write(WRITE_COMMANDS.SET_POLICY_CATEGORY_TAX, parameters, onyxData);
 }
 
-function setPolicyCategoryAttendeesRequired(policyID: string, categoryName: string, areAttendeesRequired: boolean, policyCategories: PolicyCategories = {}) {
-    const policyCategoryToUpdate = policyCategories?.[categoryName];
-    const originalAreAttendeesRequired = policyCategoryToUpdate?.areAttendeesRequired;
-
-    const onyxData: OnyxData<typeof ONYXKEYS.COLLECTION.POLICY_CATEGORIES> = {
-        optimisticData: [
-            {
-                onyxMethod: Onyx.METHOD.MERGE,
-                key: `${ONYXKEYS.COLLECTION.POLICY_CATEGORIES}${policyID}`,
-                value: {
-                    [categoryName]: {
-                        pendingAction: CONST.RED_BRICK_ROAD_PENDING_ACTION.UPDATE,
-                        pendingFields: {
-                            areAttendeesRequired: CONST.RED_BRICK_ROAD_PENDING_ACTION.UPDATE,
-                        },
-                        areAttendeesRequired,
-                    },
-                },
-            },
-        ],
-        successData: [
-            {
-                onyxMethod: Onyx.METHOD.MERGE,
-                key: `${ONYXKEYS.COLLECTION.POLICY_CATEGORIES}${policyID}`,
-                value: {
-                    [categoryName]: {
-                        pendingAction: null,
-                        pendingFields: {
-                            areAttendeesRequired: null,
-                        },
-                        areAttendeesRequired,
-                    },
-                },
-            },
-        ],
-        failureData: [
-            {
-                onyxMethod: Onyx.METHOD.MERGE,
-                key: `${ONYXKEYS.COLLECTION.POLICY_CATEGORIES}${policyID}`,
-                value: {
-                    [categoryName]: {
-                        errors: ErrorUtils.getMicroSecondOnyxErrorWithTranslationKey('common.genericErrorMessage'),
-                        pendingAction: null,
-                        pendingFields: {
-                            areAttendeesRequired: null,
-                        },
-                        areAttendeesRequired: originalAreAttendeesRequired,
-                    },
-                },
-            },
-        ],
-    };
-
-    const parameters: SetPolicyCategoryAttendeesRequiredParams = {
-        policyID,
-        categoryName,
-        areAttendeesRequired,
-    };
-
-    API.write(WRITE_COMMANDS.SET_POLICY_CATEGORY_ATTENDEES_REQUIRED, parameters, onyxData);
-}
-
 export {
     buildOptimisticPolicyCategories,
     buildOptimisticMccGroup,
@@ -1669,7 +1534,6 @@ export {
     removePolicyCategoryReceiptsRequired,
     renamePolicyCategory,
     setPolicyCategoryApprover,
-    setPolicyCategoryAttendeesRequired,
     setPolicyCategoryDescriptionRequired,
     buildOptimisticPolicyWithExistingCategories,
     setPolicyCategoryGLCode,
diff --git a/src/libs/actions/Policy/DistanceRate.ts b/src/libs/actions/Policy/DistanceRate.ts
index e3517a3fe3b6..b95b6e3cb303 100644
--- a/src/libs/actions/Policy/DistanceRate.ts
+++ b/src/libs/actions/Policy/DistanceRate.ts
@@ -48,7 +48,7 @@ function openPolicyDistanceRatesPage(policyID?: string) {
 }
 
 function enablePolicyDistanceRates(policyID: string, enabled: boolean, customUnit: CustomUnit | undefined) {
-    const onyxData: OnyxData<typeof ONYXKEYS.COLLECTION.POLICY> = {
+    const onyxData: OnyxData = {
         optimisticData: [
             {
                 onyxMethod: Onyx.METHOD.MERGE,
@@ -413,7 +413,7 @@ function deletePolicyDistanceRates(
         };
     }
 
-    const optimisticData: Array<OnyxUpdate<typeof ONYXKEYS.COLLECTION.POLICY | typeof ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS>> = [
+    const optimisticData: OnyxUpdate[] = [
         {
             onyxMethod: Onyx.METHOD.MERGE,
             key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`,
@@ -427,7 +427,7 @@ function deletePolicyDistanceRates(
         },
     ];
 
-    const failureData: Array<OnyxUpdate<typeof ONYXKEYS.COLLECTION.POLICY | typeof ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS>> = [
+    const failureData: OnyxUpdate[] = [
         {
             onyxMethod: Onyx.METHOD.MERGE,
             key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`,
diff --git a/src/libs/actions/Policy/Member.ts b/src/libs/actions/Policy/Member.ts
index 49aa43ad14cf..b58eafcdb11a 100644
--- a/src/libs/actions/Policy/Member.ts
+++ b/src/libs/actions/Policy/Member.ts
@@ -37,6 +37,12 @@ import type {OnyxData} from '@src/types/onyx/Request';
 import {isEmptyObject} from '@src/types/utils/EmptyObject';
 import {createPolicyExpenseChats} from './Policy';
 
+type OnyxDataReturnType = {
+    optimisticData: OnyxUpdate[];
+    successData: OnyxUpdate[];
+    failureData: OnyxUpdate[];
+};
+
 type WorkspaceMembersRoleData = {
     email: string;
     role: ValueOf<typeof CONST.POLICY.ROLE>;
@@ -102,10 +108,10 @@ function buildRoomMembersOnyxData(
     roomType: typeof CONST.REPORT.CHAT_TYPE.POLICY_ANNOUNCE | typeof CONST.REPORT.CHAT_TYPE.POLICY_ADMINS,
     policyID: string,
     accountIDs: number[],
-): OnyxData<typeof ONYXKEYS.COLLECTION.REPORT_METADATA | typeof ONYXKEYS.COLLECTION.REPORT> {
+): OnyxDataReturnType {
     const report = ReportUtils.getRoom(roomType, policyID);
     const reportMetadata = ReportUtils.getReportMetadata(report?.reportID);
-    const roomMembers: OnyxData<typeof ONYXKEYS.COLLECTION.REPORT_METADATA | typeof ONYXKEYS.COLLECTION.REPORT> = {
+    const roomMembers: OnyxDataReturnType = {
         optimisticData: [],
         failureData: [],
         successData: [],
@@ -118,7 +124,7 @@ function buildRoomMembersOnyxData(
     const participantAccountIDs = [...Object.keys(report.participants ?? {}).map(Number), ...accountIDs];
     const pendingChatMembers = ReportUtils.getPendingChatMembers(accountIDs, reportMetadata?.pendingChatMembers ?? [], CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD);
 
-    roomMembers.optimisticData?.push(
+    roomMembers.optimisticData.push(
         {
             onyxMethod: Onyx.METHOD.MERGE,
             key: `${ONYXKEYS.COLLECTION.REPORT}${report?.reportID}`,
@@ -135,7 +141,7 @@ function buildRoomMembersOnyxData(
         },
     );
 
-    roomMembers.failureData?.push(
+    roomMembers.failureData.push(
         {
             onyxMethod: Onyx.METHOD.MERGE,
             key: `${ONYXKEYS.COLLECTION.REPORT}${report?.reportID}`,
@@ -154,34 +160,20 @@ function buildRoomMembersOnyxData(
             },
         },
     );
-    roomMembers.successData?.push(
-        {
-            onyxMethod: Onyx.METHOD.MERGE,
-            key: `${ONYXKEYS.COLLECTION.REPORT}${report?.reportID}`,
-            value: {
-                participants: accountIDs.reduce((acc, curr) => {
-                    if (ReportUtils.isOptimisticPersonalDetail(curr)) {
-                        Object.assign(acc, {[curr]: null});
-                    }
-                    return acc;
-                }, {}),
-            },
-        },
-        {
-            onyxMethod: Onyx.METHOD.MERGE,
-            key: `${ONYXKEYS.COLLECTION.REPORT_METADATA}${report?.reportID}`,
-            value: {
-                pendingChatMembers: reportMetadata?.pendingChatMembers ?? null,
-            },
+    roomMembers.successData.push({
+        onyxMethod: Onyx.METHOD.MERGE,
+        key: `${ONYXKEYS.COLLECTION.REPORT_METADATA}${report?.reportID}`,
+        value: {
+            pendingChatMembers: reportMetadata?.pendingChatMembers ?? null,
         },
-    );
+    });
     return roomMembers;
 }
 /**
  * Updates the import spreadsheet data according to the result of the import
  */
-function updateImportSpreadsheetData(addedMembersLength: number, updatedMembersLength: number): OnyxData<typeof ONYXKEYS.IMPORTED_SPREADSHEET> {
-    const onyxData: OnyxData<typeof ONYXKEYS.IMPORTED_SPREADSHEET> = {
+function updateImportSpreadsheetData(addedMembersLength: number, updatedMembersLength: number): OnyxData {
+    const onyxData: OnyxData = {
         successData: [
             {
                 onyxMethod: Onyx.METHOD.MERGE,
@@ -225,8 +217,8 @@ function removeOptimisticRoomMembers(
     roomType: typeof CONST.REPORT.CHAT_TYPE.POLICY_ANNOUNCE | typeof CONST.REPORT.CHAT_TYPE.POLICY_ADMINS,
     policyID: string | undefined,
     accountIDs: number[],
-): OnyxData<typeof ONYXKEYS.COLLECTION.REPORT_METADATA> {
-    const roomMembers: OnyxData<typeof ONYXKEYS.COLLECTION.REPORT_METADATA> = {
+): OnyxDataReturnType {
+    const roomMembers: OnyxDataReturnType = {
         optimisticData: [],
         failureData: [],
         successData: [],
@@ -245,21 +237,21 @@ function removeOptimisticRoomMembers(
 
     const pendingChatMembers = ReportUtils.getPendingChatMembers(accountIDs, reportMetadata?.pendingChatMembers ?? [], CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE);
 
-    roomMembers.optimisticData?.push({
+    roomMembers.optimisticData.push({
         onyxMethod: Onyx.METHOD.MERGE,
         key: `${ONYXKEYS.COLLECTION.REPORT_METADATA}${report.reportID}`,
         value: {
             pendingChatMembers,
         },
     });
-    roomMembers.failureData?.push({
+    roomMembers.failureData.push({
         onyxMethod: Onyx.METHOD.MERGE,
         key: `${ONYXKEYS.COLLECTION.REPORT_METADATA}${report.reportID}`,
         value: {
             pendingChatMembers: reportMetadata?.pendingChatMembers ?? null,
         },
     });
-    roomMembers.successData?.push({
+    roomMembers.successData.push({
         onyxMethod: Onyx.METHOD.MERGE,
         key: `${ONYXKEYS.COLLECTION.REPORT_METADATA}${report.reportID}`,
         value: {
@@ -275,10 +267,10 @@ function removeOptimisticRoomMembers(
  * @param [policyID] The id of the policy.
  * @param [loginList] The logins of the users whose roles are being updated to non-admin role or are removed from a workspace
  */
-function resetAccountingPreferredExporter(policy: OnyxEntry<Policy>, loginList: string[]): OnyxData<typeof ONYXKEYS.COLLECTION.POLICY> {
-    const optimisticData: Array<OnyxUpdate<typeof ONYXKEYS.COLLECTION.POLICY>> = [];
-    const successData: Array<OnyxUpdate<typeof ONYXKEYS.COLLECTION.POLICY>> = [];
-    const failureData: Array<OnyxUpdate<typeof ONYXKEYS.COLLECTION.POLICY>> = [];
+function resetAccountingPreferredExporter(policy: OnyxEntry<Policy>, loginList: string[]): OnyxDataReturnType {
+    const optimisticData: OnyxUpdate[] = [];
+    const successData: OnyxUpdate[] = [];
+    const failureData: OnyxUpdate[] = [];
     if (!policy?.id) {
         return {optimisticData, successData, failureData};
     }
@@ -480,9 +472,7 @@ function removeMembers(policyID: string, selectedMemberEmails: string[], policyM
     const approvalRules: ApprovalRule[] = policy?.rules?.approvalRules ?? [];
     const optimisticApprovalRules = approvalRules.filter((rule) => !selectedMemberEmails.includes(rule?.approver ?? ''));
 
-    const optimisticData: Array<
-        OnyxUpdate<typeof ONYXKEYS.COLLECTION.POLICY | typeof ONYXKEYS.COLLECTION.REPORT | typeof ONYXKEYS.COLLECTION.REPORT_METADATA | typeof ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS>
-    > = [
+    const optimisticData: OnyxUpdate[] = [
         {
             onyxMethod: Onyx.METHOD.MERGE,
             key: policyKey,
@@ -496,27 +486,25 @@ function removeMembers(policyID: string, selectedMemberEmails: string[], policyM
             },
         },
     ];
-    optimisticData.push(...(announceRoomMembers.optimisticData ?? []), ...(adminRoomMembers.optimisticData ?? []), ...(preferredExporterOnyxData.optimisticData ?? []));
+    optimisticData.push(...announceRoomMembers.optimisticData, ...adminRoomMembers.optimisticData, ...preferredExporterOnyxData.optimisticData);
 
-    const successData: Array<OnyxUpdate<typeof ONYXKEYS.COLLECTION.POLICY | typeof ONYXKEYS.COLLECTION.REPORT_METADATA>> = [
+    const successData: OnyxUpdate[] = [
         {
             onyxMethod: Onyx.METHOD.MERGE,
             key: policyKey,
             value: {employeeList: successMembersState},
         },
     ];
-    successData.push(...(announceRoomMembers.successData ?? []), ...(adminRoomMembers.successData ?? []), ...(preferredExporterOnyxData.successData ?? []));
+    successData.push(...announceRoomMembers.successData, ...adminRoomMembers.successData, ...preferredExporterOnyxData.successData);
 
-    const failureData: Array<
-        OnyxUpdate<typeof ONYXKEYS.COLLECTION.POLICY | typeof ONYXKEYS.COLLECTION.REPORT | typeof ONYXKEYS.COLLECTION.REPORT_METADATA | typeof ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS>
-    > = [
+    const failureData: OnyxUpdate[] = [
         {
             onyxMethod: Onyx.METHOD.MERGE,
             key: policyKey,
             value: {employeeList: failureMembersState, approver: policy?.approver, rules: policy?.rules},
         },
     ];
-    failureData.push(...(announceRoomMembers.failureData ?? []), ...(adminRoomMembers.failureData ?? []), ...(preferredExporterOnyxData.failureData ?? []));
+    failureData.push(...announceRoomMembers.failureData, ...adminRoomMembers.failureData, ...preferredExporterOnyxData.failureData);
 
     const pendingChatMembers = ReportUtils.getPendingChatMembers(accountIDs, [], CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE);
 
@@ -538,11 +526,11 @@ function removeMembers(policyID: string, selectedMemberEmails: string[], policyM
                     pendingChatMembers,
                 },
             },
+            // @ts-expect-error - will be solved in https://github.com/Expensify/App/issues/73830
             {
                 onyxMethod: Onyx.METHOD.MERGE,
                 key: `${ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS}${report?.reportID}`,
                 value: {
-                    // @ts-expect-error - will be solved in https://github.com/Expensify/App/issues/73830
                     private_isArchived: true,
                 },
             },
@@ -583,11 +571,11 @@ function removeMembers(policyID: string, selectedMemberEmails: string[], policyM
                     pendingChatMembers: null,
                 },
             },
+            // @ts-expect-error - will be solved in https://github.com/Expensify/App/issues/73830
             {
                 onyxMethod: Onyx.METHOD.MERGE,
                 key: `${ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS}${report?.reportID}`,
                 value: {
-                    // @ts-expect-error - will be solved in https://github.com/Expensify/App/issues/73830
                     private_isArchived: false,
                 },
             },
@@ -668,7 +656,7 @@ function buildUpdateWorkspaceMembersRoleOnyxData(policyID: string, selectedMembe
         };
     });
 
-    const optimisticData: Array<OnyxUpdate<typeof ONYXKEYS.COLLECTION.POLICY | typeof ONYXKEYS.COLLECTION.REPORT>> = [
+    const optimisticData: OnyxUpdate[] = [
         {
             onyxMethod: Onyx.METHOD.MERGE,
             key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`,
@@ -685,7 +673,7 @@ function buildUpdateWorkspaceMembersRoleOnyxData(policyID: string, selectedMembe
         },
     ];
 
-    const successData: Array<OnyxUpdate<typeof ONYXKEYS.COLLECTION.POLICY>> = [
+    const successData: OnyxUpdate[] = [
         {
             onyxMethod: Onyx.METHOD.MERGE,
             key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`,
@@ -702,7 +690,7 @@ function buildUpdateWorkspaceMembersRoleOnyxData(policyID: string, selectedMembe
         },
     ];
 
-    const failureData: Array<OnyxUpdate<typeof ONYXKEYS.COLLECTION.POLICY | typeof ONYXKEYS.COLLECTION.REPORT>> = [
+    const failureData: OnyxUpdate[] = [
         {
             onyxMethod: Onyx.METHOD.MERGE,
             key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`,
@@ -718,9 +706,9 @@ function buildUpdateWorkspaceMembersRoleOnyxData(policyID: string, selectedMembe
             policy,
             memberRoles.map((member) => member.email),
         );
-        optimisticData.push(...(preferredExporterOnyxData.optimisticData ?? []));
-        successData.push(...(preferredExporterOnyxData.successData ?? []));
-        failureData.push(...(preferredExporterOnyxData.failureData ?? []));
+        optimisticData.push(...preferredExporterOnyxData.optimisticData);
+        successData.push(...preferredExporterOnyxData.successData);
+        failureData.push(...preferredExporterOnyxData.failureData);
     }
 
     const adminRoom = ReportUtils.getAllPolicyReports(policyID).find(ReportUtils.isAdminRoom);
@@ -911,7 +899,6 @@ function buildAddMembersToWorkspaceOnyxData(
         };
         successMembersState[email] = {pendingAction: null};
         failureMembersState[email] = {
-            pendingAction: null,
             errors: ErrorUtils.getMicroSecondOnyxErrorWithTranslationKey('workspace.people.error.genericAdd'),
         };
     }
@@ -928,11 +915,11 @@ function buildAddMembersToWorkspaceOnyxData(
         },
     ];
     optimisticData.push(
-        ...(newPersonalDetailsOnyxData.optimisticData ?? []),
+        ...newPersonalDetailsOnyxData.optimisticData,
         ...membersChats.onyxOptimisticData,
         ...announceRoomChat.onyxOptimisticData,
-        ...(announceRoomMembers.optimisticData ?? []),
-        ...(adminRoomMembers.optimisticData ?? []),
+        ...announceRoomMembers.optimisticData,
+        ...adminRoomMembers.optimisticData,
     );
 
     const successData: OnyxUpdate[] = [
@@ -945,11 +932,11 @@ function buildAddMembersToWorkspaceOnyxData(
         },
     ];
     successData.push(
-        ...(newPersonalDetailsOnyxData.finallyData ?? []),
+        ...newPersonalDetailsOnyxData.finallyData,
         ...membersChats.onyxSuccessData,
         ...announceRoomChat.onyxSuccessData,
-        ...(announceRoomMembers.successData ?? []),
-        ...(adminRoomMembers.successData ?? []),
+        ...announceRoomMembers.successData,
+        ...adminRoomMembers.successData,
     );
 
     const failureData: OnyxUpdate[] = [
@@ -964,7 +951,7 @@ function buildAddMembersToWorkspaceOnyxData(
             },
         },
     ];
-    failureData.push(...membersChats.onyxFailureData, ...announceRoomChat.onyxFailureData, ...(announceRoomMembers.failureData ?? []), ...(adminRoomMembers.failureData ?? []));
+    failureData.push(...membersChats.onyxFailureData, ...announceRoomChat.onyxFailureData, ...announceRoomMembers.failureData, ...adminRoomMembers.failureData);
 
     return {optimisticData, successData, failureData, optimisticAnnounceChat, membersChats, logins};
 }
diff --git a/src/libs/actions/Policy/PerDiem.ts b/src/libs/actions/Policy/PerDiem.ts
index db001948c27d..ddf64723b4b3 100644
--- a/src/libs/actions/Policy/PerDiem.ts
+++ b/src/libs/actions/Policy/PerDiem.ts
@@ -49,7 +49,7 @@ function enablePerDiem(policyID: string, enabled: boolean, customUnitID?: string
     const workspaceChatReportID = findPolicyExpenseChatByPolicyID(policyID)?.reportID;
 
     const shouldClearQuickAction = quickAction?.action === CONST.QUICK_ACTIONS.PER_DIEM && !enabled && workspaceChatReportID === quickAction?.chatReportID;
-    const onyxData: OnyxData<typeof ONYXKEYS.COLLECTION.POLICY | typeof ONYXKEYS.NVP_QUICK_ACTION_GLOBAL_CREATE> = {
+    const onyxData: OnyxData = {
         optimisticData: [
             {
                 onyxMethod: Onyx.METHOD.MERGE,
@@ -126,7 +126,7 @@ function openPolicyPerDiemPage(policyID?: string) {
 }
 
 function updateImportSpreadsheetData(ratesLength: number) {
-    const onyxData: OnyxData<typeof ONYXKEYS.IMPORTED_SPREADSHEET> = {
+    const onyxData: OnyxData = {
         successData: [
             {
                 onyxMethod: Onyx.METHOD.MERGE,
@@ -241,7 +241,7 @@ function deleteWorkspacePerDiemRates(policyID: string, customUnit: CustomUnit |
         return;
     }
     const {newCustomUnit, customUnitOnyxUpdate} = prepareNewCustomUnit(customUnit, subRatesToBeDeleted);
-    const onyxData: OnyxData<typeof ONYXKEYS.COLLECTION.POLICY> = {
+    const onyxData: OnyxData = {
         optimisticData: [
             {
                 onyxMethod: Onyx.METHOD.MERGE,
@@ -271,7 +271,7 @@ function editPerDiemRateDestination(policyID: string, rateID: string, customUnit
     const newCustomUnit: CustomUnit = lodashDeepClone(customUnit);
     newCustomUnit.rates[rateID].name = newDestination;
 
-    const onyxData: OnyxData<typeof ONYXKEYS.COLLECTION.POLICY> = {
+    const onyxData: OnyxData = {
         optimisticData: [
             {
                 onyxMethod: Onyx.METHOD.MERGE,
@@ -306,7 +306,7 @@ function editPerDiemRateSubrate(policyID: string, rateID: string, subRateID: str
         return subRate;
     });
 
-    const onyxData: OnyxData<typeof ONYXKEYS.COLLECTION.POLICY> = {
+    const onyxData: OnyxData = {
         optimisticData: [
             {
                 onyxMethod: Onyx.METHOD.MERGE,
@@ -341,7 +341,7 @@ function editPerDiemRateAmount(policyID: string, rateID: string, subRateID: stri
         return subRate;
     });
 
-    const onyxData: OnyxData<typeof ONYXKEYS.COLLECTION.POLICY> = {
+    const onyxData: OnyxData = {
         optimisticData: [
             {
                 onyxMethod: Onyx.METHOD.MERGE,
@@ -371,7 +371,7 @@ function editPerDiemRateCurrency(policyID: string, rateID: string, customUnit: C
     const newCustomUnit: CustomUnit = lodashDeepClone(customUnit);
     newCustomUnit.rates[rateID].currency = newCurrency;
 
-    const onyxData: OnyxData<typeof ONYXKEYS.COLLECTION.POLICY> = {
+    const onyxData: OnyxData = {
         optimisticData: [
             {
                 onyxMethod: Onyx.METHOD.MERGE,
diff --git a/src/libs/actions/Policy/Policy.ts b/src/libs/actions/Policy/Policy.ts
index de476dfe0bc2..907585f692a7 100644
--- a/src/libs/actions/Policy/Policy.ts
+++ b/src/libs/actions/Policy/Policy.ts
@@ -88,7 +88,6 @@ import * as PhoneNumber from '@libs/PhoneNumber';
 import * as PolicyUtils from '@libs/PolicyUtils';
 import {getCustomUnitsForDuplication, getMemberAccountIDsForWorkspace, goBackWhenEnableFeature, isControlPolicy, navigateToExpensifyCardPage} from '@libs/PolicyUtils';
 import * as ReportUtils from '@libs/ReportUtils';
-import {hasValidModifiedAmount} from '@libs/TransactionUtils';
 import type {PolicySelector} from '@pages/home/sidebar/FloatingActionButtonAndPopover';
 import type {Feature} from '@pages/OnboardingInterestedFeatures/types';
 import * as PaymentMethods from '@userActions/PaymentMethods';
@@ -137,13 +136,9 @@ type ReportCreationData = Record<
 >;
 
 type WorkspaceMembersChats = {
-    onyxSuccessData: Array<OnyxUpdate<typeof ONYXKEYS.COLLECTION.REPORT | typeof ONYXKEYS.COLLECTION.REPORT_METADATA | typeof ONYXKEYS.COLLECTION.REPORT_ACTIONS>>;
-    onyxOptimisticData: Array<
-        OnyxUpdate<
-            typeof ONYXKEYS.COLLECTION.REPORT | typeof ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS | typeof ONYXKEYS.COLLECTION.REPORT_ACTIONS | typeof ONYXKEYS.COLLECTION.REPORT_METADATA
-        >
-    >;
-    onyxFailureData: Array<OnyxUpdate<typeof ONYXKEYS.COLLECTION.REPORT | typeof ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS | typeof ONYXKEYS.COLLECTION.REPORT_METADATA>>;
+    onyxSuccessData: OnyxUpdate[];
+    onyxOptimisticData: OnyxUpdate[];
+    onyxFailureData: OnyxUpdate[];
     reportCreationData: ReportCreationData;
 };
 
@@ -378,21 +373,7 @@ function deleteWorkspace(params: DeleteWorkspaceActionParams) {
         return acc;
     }, {});
 
-    const optimisticData: Array<
-        OnyxUpdate<
-            | typeof ONYXKEYS.COLLECTION.POLICY
-            | typeof ONYXKEYS.COLLECTION.SHARED_NVP_PRIVATE_DOMAIN_MEMBER
-            | typeof ONYXKEYS.BANK_ACCOUNT_LIST
-            | typeof ONYXKEYS.REIMBURSEMENT_ACCOUNT
-            | typeof ONYXKEYS.NVP_ACTIVE_POLICY_ID
-            | typeof ONYXKEYS.COLLECTION.REPORT
-            | typeof ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS
-            | typeof ONYXKEYS.COLLECTION.REPORT_ACTIONS_DRAFTS
-            | typeof ONYXKEYS.COLLECTION.REPORT_ACTIONS
-            | typeof ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS
-            | typeof ONYXKEYS.NVP_LAST_PAYMENT_METHOD
-        >
-    > = [
+    const optimisticData: OnyxUpdate[] = [
         {
             onyxMethod: Onyx.METHOD.MERGE,
             key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`,
@@ -430,20 +411,7 @@ function deleteWorkspace(params: DeleteWorkspaceActionParams) {
     ];
 
     // Restore the old report stateNum and statusNum
-    const failureData: Array<
-        OnyxUpdate<
-            | typeof ONYXKEYS.REIMBURSEMENT_ACCOUNT
-            | typeof ONYXKEYS.COLLECTION.POLICY
-            | typeof ONYXKEYS.COLLECTION.SHARED_NVP_PRIVATE_DOMAIN_MEMBER
-            | typeof ONYXKEYS.BANK_ACCOUNT_LIST
-            | typeof ONYXKEYS.NVP_ACTIVE_POLICY_ID
-            | typeof ONYXKEYS.COLLECTION.REPORT
-            | typeof ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS
-            | typeof ONYXKEYS.COLLECTION.REPORT_ACTIONS
-            | typeof ONYXKEYS.NVP_LAST_PAYMENT_METHOD
-            | typeof ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS
-        >
-    > = [
+    const failureData: OnyxUpdate[] = [
         {
             onyxMethod: Onyx.METHOD.MERGE,
             key: ONYXKEYS.REIMBURSEMENT_ACCOUNT,
@@ -481,7 +449,6 @@ function deleteWorkspace(params: DeleteWorkspaceActionParams) {
             .filter((p) => p && p.id !== activePolicyID && p.type !== CONST.POLICY.TYPE.PERSONAL && p.pendingAction !== CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE)
             .sort((policyA, policyB) => localeCompare(policyB?.created ?? '', policyA?.created ?? ''))
             .at(0);
-
         const newActivePolicyID = mostRecentlyCreatedGroupPolicy?.id ?? personalPolicyID;
 
         // @ts-expect-error - will be solved in https://github.com/Expensify/App/issues/73830
@@ -579,6 +546,7 @@ function deleteWorkspace(params: DeleteWorkspaceActionParams) {
             optimisticData.push({
                 onyxMethod: Onyx.METHOD.MERGE,
                 key: `${ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS}${transactionID}`,
+                // @ts-expect-error - will be solved in https://github.com/Expensify/App/issues/73830
                 value: transactionViolation?.filter((violation) => violation.type !== CONST.VIOLATION_TYPES.VIOLATION),
             });
             // @ts-expect-error - will be solved in https://github.com/Expensify/App/issues/73830
@@ -1333,11 +1301,11 @@ function createPolicyExpenseChats(
                     statusNum: CONST.REPORT.STATUS_NUM.OPEN,
                 },
             });
+            // @ts-expect-error - will be solved in https://github.com/Expensify/App/issues/73830
             workspaceMembersChats.onyxOptimisticData.push({
                 onyxMethod: Onyx.METHOD.MERGE,
                 key: `${ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS}${oldChat.reportID}`,
                 value: {
-                    // @ts-expect-error - will be solved in https://github.com/Expensify/App/issues/73830
                     private_isArchived: false,
                 },
             });
@@ -2152,22 +2120,7 @@ function buildPolicyData(options: BuildPolicyDataOptions) {
     const areDistanceRatesEnabled = !!featuresMap?.find((feature) => feature.id === CONST.POLICY.MORE_FEATURES.ARE_DISTANCE_RATES_ENABLED && feature.enabled);
 
     // WARNING: The data below should be kept in sync with the API so we create the policy with the correct configuration.
-    const optimisticData: Array<
-        OnyxUpdate<
-            | typeof ONYXKEYS.COLLECTION.POLICY
-            | typeof ONYXKEYS.COLLECTION.REPORT_METADATA
-            | typeof ONYXKEYS.COLLECTION.REPORT
-            | typeof ONYXKEYS.COLLECTION.REPORT_ACTIONS
-            | typeof ONYXKEYS.COLLECTION.POLICY_DRAFTS
-            | typeof ONYXKEYS.NVP_ACTIVE_POLICY_ID
-            | typeof ONYXKEYS.NVP_INTRO_SELECTED
-            | typeof ONYXKEYS.NVP_ONBOARDING
-            | typeof ONYXKEYS.COLLECTION.REPORT_DRAFT
-            | typeof ONYXKEYS.COLLECTION.POLICY_CATEGORIES
-            | typeof ONYXKEYS.COLLECTION.POLICY_CATEGORIES_DRAFT
-            | typeof ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS
-        >
-    > = [
+    const optimisticData: OnyxUpdate[] = [
         {
             onyxMethod: Onyx.METHOD.SET,
             key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`,
@@ -2319,20 +2272,7 @@ function buildPolicyData(options: BuildPolicyDataOptions) {
         });
     }
 
-    const successData: Array<
-        OnyxUpdate<
-            | typeof ONYXKEYS.COLLECTION.POLICY
-            | typeof ONYXKEYS.COLLECTION.REPORT
-            | typeof ONYXKEYS.COLLECTION.REPORT_METADATA
-            | typeof ONYXKEYS.COLLECTION.REPORT_ACTIONS
-            | typeof ONYXKEYS.COLLECTION.REPORT_ACTIONS
-            | typeof ONYXKEYS.NVP_LAST_PAYMENT_METHOD
-            | typeof ONYXKEYS.NVP_ONBOARDING
-            | typeof ONYXKEYS.COLLECTION.POLICY_CATEGORIES
-            | typeof ONYXKEYS.COLLECTION.POLICY_CATEGORIES_DRAFT
-            | typeof ONYXKEYS.PERSONAL_DETAILS_LIST
-        >
-    > = [
+    const successData: OnyxUpdate[] = [
         {
             onyxMethod: Onyx.METHOD.MERGE,
             key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`,
@@ -2416,21 +2356,7 @@ function buildPolicyData(options: BuildPolicyDataOptions) {
         },
     ];
 
-    const failureData: Array<
-        OnyxUpdate<
-            | typeof ONYXKEYS.COLLECTION.POLICY
-            | typeof ONYXKEYS.COLLECTION.REPORT
-            | typeof ONYXKEYS.COLLECTION.REPORT_ACTIONS
-            | typeof ONYXKEYS.NVP_ACTIVE_POLICY_ID
-            | typeof ONYXKEYS.NVP_INTRO_SELECTED
-            | typeof ONYXKEYS.NVP_ONBOARDING
-            | typeof ONYXKEYS.COLLECTION.POLICY_CATEGORIES
-            | typeof ONYXKEYS.COLLECTION.POLICY_CATEGORIES_DRAFT
-            | typeof ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS
-            | typeof ONYXKEYS.COLLECTION.REPORT_METADATA
-            | typeof ONYXKEYS.PERSONAL_DETAILS_LIST
-        >
-    > = [
+    const failureData: OnyxUpdate[] = [
         {
             onyxMethod: Onyx.METHOD.MERGE,
             key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`,
@@ -2785,6 +2711,7 @@ function buildDuplicatePolicyData(policy: Policy, options: DuplicatePolicyDataOp
         policyCategories && isCategoriesOptionSelected ? buildOptimisticPolicyWithExistingCategories(targetPolicyID, policyCategories) : defaultOptimisticCategoriesData;
 
     // WARNING: The data below should be kept in sync with the API so we create the policy with the correct configuration.
+    // @ts-expect-error - will be solved in https://github.com/Expensify/App/issues/73830
     // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
     const optimisticData: OnyxUpdate[] = [
         {
@@ -2892,6 +2819,8 @@ function buildDuplicatePolicyData(policy: Policy, options: DuplicatePolicyDataOp
         ...announceRoomChat.onyxOptimisticData,
     ];
 
+    // @ts-expect-error - will be solved in https://github.com/Expensify/App/issues/73830
+    // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
     const successData: OnyxUpdate[] = [
         {
             onyxMethod: Onyx.METHOD.MERGE,
@@ -2967,6 +2896,8 @@ function buildDuplicatePolicyData(policy: Policy, options: DuplicatePolicyDataOp
         ...announceRoomChat.onyxSuccessData,
     ];
 
+    // @ts-expect-error - will be solved in https://github.com/Expensify/App/issues/73830
+    // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
     const failureData: OnyxUpdate[] = [
         {
             onyxMethod: Onyx.METHOD.MERGE,
@@ -3045,7 +2976,7 @@ function openPolicyWorkflowsPage(policyID: string) {
         return;
     }
 
-    const onyxData: OnyxData<typeof ONYXKEYS.COLLECTION.POLICY> = {
+    const onyxData: OnyxData = {
         optimisticData: [
             {
                 onyxMethod: Onyx.METHOD.MERGE,
@@ -3824,7 +3755,7 @@ function createWorkspaceFromIOUPayment(
         transactionsOptimisticData[`${ONYXKEYS.COLLECTION.TRANSACTION}${transaction.transactionID}`] = {
             ...transaction,
             amount: -transaction.amount,
-            modifiedAmount: hasValidModifiedAmount(transaction) ? -Number(transaction.modifiedAmount) : '',
+            modifiedAmount: transaction.modifiedAmount ? -transaction.modifiedAmount : 0,
         };
 
         transactionFailureData[`${ONYXKEYS.COLLECTION.TRANSACTION}${transaction.transactionID}`] = transaction;
@@ -3989,7 +3920,7 @@ function createWorkspaceFromIOUPayment(
 }
 
 function enablePolicyConnections(policyID: string, enabled: boolean) {
-    const onyxData: OnyxData<typeof ONYXKEYS.COLLECTION.POLICY> = {
+    const onyxData: OnyxData = {
         optimisticData: [
             {
                 onyxMethod: Onyx.METHOD.MERGE,
@@ -4037,13 +3968,13 @@ function enablePolicyConnections(policyID: string, enabled: boolean) {
 }
 
 function enablePolicyReceiptPartners(policyID: string, enabled: boolean) {
-    const onyxData: OnyxData<typeof ONYXKEYS.COLLECTION.POLICY> = {
+    const onyxData: OnyxData = {
         optimisticData: [
+            // @ts-expect-error - will be solved in https://github.com/Expensify/App/issues/73830
             {
                 onyxMethod: Onyx.METHOD.MERGE,
                 key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`,
                 value: {
-                    // @ts-expect-error - will be solved in https://github.com/Expensify/App/issues/73830
                     receiptPartners: {enabled},
                     pendingFields: {
                         receiptPartners: CONST.RED_BRICK_ROAD_PENDING_ACTION.UPDATE,
@@ -4063,11 +3994,11 @@ function enablePolicyReceiptPartners(policyID: string, enabled: boolean) {
             },
         ],
         failureData: [
+            // @ts-expect-error - will be solved in https://github.com/Expensify/App/issues/73830
             {
                 onyxMethod: Onyx.METHOD.MERGE,
                 key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`,
                 value: {
-                    // @ts-expect-error - will be solved in https://github.com/Expensify/App/issues/73830
                     receiptPartners: {enabled: !enabled},
                     pendingFields: {
                         receiptPartners: null,
@@ -4092,7 +4023,7 @@ function savePreferredExportMethod(policyID: string, exportMethod: ReportExportT
 }
 
 function enableExpensifyCard(policyID: string, enabled: boolean, shouldNavigateToExpensifyCardPage = false) {
-    const onyxData: OnyxData<typeof ONYXKEYS.COLLECTION.POLICY> = {
+    const onyxData: OnyxData = {
         optimisticData: [
             {
                 onyxMethod: Onyx.METHOD.MERGE,
@@ -4145,7 +4076,7 @@ function enableExpensifyCard(policyID: string, enabled: boolean, shouldNavigateT
 }
 
 function enableCompanyCards(policyID: string, enabled: boolean, shouldGoBack = true) {
-    const onyxData: OnyxData<typeof ONYXKEYS.COLLECTION.POLICY> = {
+    const onyxData: OnyxData = {
         optimisticData: [
             {
                 onyxMethod: Onyx.METHOD.MERGE,
@@ -4193,7 +4124,7 @@ function enableCompanyCards(policyID: string, enabled: boolean, shouldGoBack = t
 }
 
 function enablePolicyReportFields(policyID: string, enabled: boolean) {
-    const onyxData: OnyxData<typeof ONYXKEYS.COLLECTION.POLICY> = {
+    const onyxData: OnyxData = {
         optimisticData: [
             {
                 onyxMethod: Onyx.METHOD.MERGE,
@@ -4238,7 +4169,7 @@ function enablePolicyReportFields(policyID: string, enabled: boolean) {
 
 function enablePolicyTaxes(policyID: string, enabled: boolean) {
     const defaultTaxRates: TaxRatesWithDefault = CONST.DEFAULT_TAX;
-    const taxRatesData: OnyxData<typeof ONYXKEYS.COLLECTION.POLICY> = {
+    const taxRatesData: OnyxData = {
         optimisticData: [
             {
                 onyxMethod: Onyx.METHOD.MERGE,
@@ -4296,7 +4227,7 @@ function enablePolicyTaxes(policyID: string, enabled: boolean) {
     const policy = getPolicy(policyID);
     const shouldAddDefaultTaxRatesData = (!policy?.taxRates || isEmptyObject(policy.taxRates)) && enabled;
 
-    const optimisticData: Array<OnyxUpdate<typeof ONYXKEYS.COLLECTION.POLICY>> = [
+    const optimisticData: OnyxUpdate[] = [
         {
             onyxMethod: Onyx.METHOD.MERGE,
             key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`,
@@ -4312,7 +4243,7 @@ function enablePolicyTaxes(policyID: string, enabled: boolean) {
     ];
     optimisticData.push(...(shouldAddDefaultTaxRatesData ? (taxRatesData.optimisticData ?? []) : []));
 
-    const successData: Array<OnyxUpdate<typeof ONYXKEYS.COLLECTION.POLICY>> = [
+    const successData: OnyxUpdate[] = [
         {
             onyxMethod: Onyx.METHOD.MERGE,
             key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`,
@@ -4325,7 +4256,7 @@ function enablePolicyTaxes(policyID: string, enabled: boolean) {
     ];
     successData.push(...(shouldAddDefaultTaxRatesData ? (taxRatesData.successData ?? []) : []));
 
-    const failureData: Array<OnyxUpdate<typeof ONYXKEYS.COLLECTION.POLICY>> = [
+    const failureData: OnyxUpdate[] = [
         {
             onyxMethod: Onyx.METHOD.MERGE,
             key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`,
@@ -4341,7 +4272,7 @@ function enablePolicyTaxes(policyID: string, enabled: boolean) {
     ];
     failureData.push(...(shouldAddDefaultTaxRatesData ? (taxRatesData.failureData ?? []) : []));
 
-    const onyxData: OnyxData<typeof ONYXKEYS.COLLECTION.POLICY> = {
+    const onyxData: OnyxData = {
         optimisticData,
         successData,
         failureData,
@@ -4362,7 +4293,7 @@ function enablePolicyWorkflows(policyID: string, enabled: boolean) {
     // This will be fixed as part of https://github.com/Expensify/Expensify/issues/507850
     // eslint-disable-next-line @typescript-eslint/no-deprecated
     const policy = getPolicy(policyID);
-    const onyxData: OnyxData<typeof ONYXKEYS.COLLECTION.POLICY> = {
+    const onyxData: OnyxData = {
         optimisticData: [
             {
                 onyxMethod: Onyx.METHOD.MERGE,
@@ -4472,7 +4403,7 @@ function enablePolicyRules(policyID: string, enabled: boolean, shouldGoBack = tr
     // This will be fixed as part of https://github.com/Expensify/Expensify/issues/507850
     // eslint-disable-next-line @typescript-eslint/no-deprecated
     const policy = getPolicy(policyID);
-    const onyxData: OnyxData<typeof ONYXKEYS.COLLECTION.POLICY> = {
+    const onyxData: OnyxData = {
         optimisticData: [
             {
                 onyxMethod: Onyx.METHOD.MERGE,
@@ -4539,7 +4470,7 @@ function enableDistanceRequestTax(policyID: string, customUnitName: string, cust
     // This will be fixed as part of https://github.com/Expensify/Expensify/issues/507850
     // eslint-disable-next-line @typescript-eslint/no-deprecated
     const policy = getPolicy(policyID);
-    const onyxData: OnyxData<typeof ONYXKEYS.COLLECTION.POLICY> = {
+    const onyxData: OnyxData = {
         optimisticData: [
             {
                 onyxMethod: Onyx.METHOD.MERGE,
@@ -4601,7 +4532,7 @@ function enableDistanceRequestTax(policyID: string, customUnitName: string, cust
 }
 
 function enablePolicyInvoicing(policyID: string, enabled: boolean) {
-    const onyxData: OnyxData<typeof ONYXKEYS.COLLECTION.POLICY> = {
+    const onyxData: OnyxData = {
         optimisticData: [
             {
                 onyxMethod: Onyx.METHOD.MERGE,
@@ -4677,7 +4608,7 @@ function setPolicyCustomTaxName(policyID: string, customTaxName: string) {
     // eslint-disable-next-line @typescript-eslint/no-deprecated
     const policy = getPolicy(policyID);
     const originalCustomTaxName = policy?.taxRates?.name;
-    const onyxData: OnyxData<typeof ONYXKEYS.COLLECTION.POLICY> = {
+    const onyxData: OnyxData = {
         optimisticData: [
             {
                 onyxMethod: Onyx.METHOD.MERGE,
@@ -4731,7 +4662,7 @@ function setWorkspaceCurrencyDefault(policyID: string, taxCode: string) {
     // eslint-disable-next-line @typescript-eslint/no-deprecated
     const policy = getPolicy(policyID);
     const originalDefaultExternalID = policy?.taxRates?.defaultExternalID;
-    const onyxData: OnyxData<typeof ONYXKEYS.COLLECTION.POLICY> = {
+    const onyxData: OnyxData = {
         optimisticData: [
             {
                 onyxMethod: Onyx.METHOD.MERGE,
@@ -4785,7 +4716,7 @@ function setForeignCurrencyDefault(policyID: string, taxCode: string) {
     // eslint-disable-next-line @typescript-eslint/no-deprecated
     const policy = getPolicy(policyID);
     const originalDefaultForeignCurrencyID = policy?.taxRates?.foreignTaxDefault;
-    const onyxData: OnyxData<typeof ONYXKEYS.COLLECTION.POLICY> = {
+    const onyxData: OnyxData = {
         optimisticData: [
             {
                 onyxMethod: Onyx.METHOD.MERGE,
@@ -5012,7 +4943,7 @@ function setPolicyMaxExpenseAmountNoReceipt(policyID: string, maxExpenseAmountNo
     const parsedMaxExpenseAmountNoReceipt = maxExpenseAmountNoReceipt === '' ? CONST.DISABLED_MAX_EXPENSE_VALUE : CurrencyUtils.convertToBackendAmount(parseFloat(maxExpenseAmountNoReceipt));
     const originalMaxExpenseAmountNoReceipt = policy?.maxExpenseAmountNoReceipt;
 
-    const onyxData: OnyxData<typeof ONYXKEYS.COLLECTION.POLICY> = {
+    const onyxData: OnyxData = {
         optimisticData: [
             {
                 onyxMethod: Onyx.METHOD.MERGE,
@@ -5068,7 +4999,7 @@ function setPolicyMaxExpenseAmount(policyID: string, maxExpenseAmount: string) {
     const parsedMaxExpenseAmount = maxExpenseAmount === '' ? CONST.DISABLED_MAX_EXPENSE_VALUE : CurrencyUtils.convertToBackendAmount(parseFloat(maxExpenseAmount));
     const originalMaxExpenseAmount = policy?.maxExpenseAmount;
 
-    const onyxData: OnyxData<typeof ONYXKEYS.COLLECTION.POLICY> = {
+    const onyxData: OnyxData = {
         optimisticData: [
             {
                 onyxMethod: Onyx.METHOD.MERGE,
@@ -5127,7 +5058,7 @@ function setPolicyProhibitedExpense(policyID: string, prohibitedExpense: keyof P
         [prohibitedExpense]: !originalProhibitedExpenses?.[prohibitedExpense],
     };
 
-    const onyxData: OnyxData<typeof ONYXKEYS.COLLECTION.POLICY> = {
+    const onyxData: OnyxData = {
         optimisticData: [
             {
                 onyxMethod: Onyx.METHOD.MERGE,
@@ -5190,7 +5121,7 @@ function setPolicyMaxExpenseAge(policyID: string, maxExpenseAge: string) {
     const parsedMaxExpenseAge = maxExpenseAge === '' ? CONST.DISABLED_MAX_EXPENSE_VALUE : parseInt(maxExpenseAge, 10);
     const originalMaxExpenseAge = policy?.maxExpenseAge;
 
-    const onyxData: OnyxData<typeof ONYXKEYS.COLLECTION.POLICY> = {
+    const onyxData: OnyxData = {
         optimisticData: [
             {
                 onyxMethod: Onyx.METHOD.MERGE,
@@ -5250,7 +5181,7 @@ function updateCustomRules(policyID: string, customRules: string) {
         return;
     }
 
-    const onyxData: OnyxData<typeof ONYXKEYS.COLLECTION.POLICY> = {
+    const onyxData: OnyxData = {
         optimisticData: [
             {
                 onyxMethod: Onyx.METHOD.MERGE,
@@ -5313,7 +5244,7 @@ function setPolicyBillableMode(policyID: string, defaultBillable: boolean) {
     const originalDefaultBillable = policy?.defaultBillable;
     const originalDefaultBillableDisabled = policy?.disabledFields?.defaultBillable;
 
-    const onyxData: OnyxData<typeof ONYXKEYS.COLLECTION.POLICY> = {
+    const onyxData: OnyxData = {
         optimisticData: [
             {
                 onyxMethod: Onyx.METHOD.MERGE,
@@ -5405,7 +5336,7 @@ function setPolicyReimbursableMode(policyID: string, reimbursableMode: PolicyCas
         reimbursableMode === CONST.POLICY.CASH_EXPENSE_REIMBURSEMENT_CHOICES.ALWAYS_REIMBURSABLE ||
         reimbursableMode === CONST.POLICY.CASH_EXPENSE_REIMBURSEMENT_CHOICES.ALWAYS_NON_REIMBURSABLE;
 
-    const onyxData: OnyxData<typeof ONYXKEYS.COLLECTION.POLICY> = {
+    const onyxData: OnyxData = {
         optimisticData: [
             {
                 onyxMethod: Onyx.METHOD.MERGE,
@@ -5470,7 +5401,7 @@ function disableWorkspaceBillableExpenses(policyID: string) {
     const policy = getPolicy(policyID);
     const originalDefaultBillableDisabled = policy?.disabledFields?.defaultBillable;
 
-    const onyxData: OnyxData<typeof ONYXKEYS.COLLECTION.POLICY> = {
+    const onyxData: OnyxData = {
         optimisticData: [
             {
                 onyxMethod: Onyx.METHOD.MERGE,
@@ -5515,7 +5446,7 @@ function disableWorkspaceBillableExpenses(policyID: string) {
     API.write(WRITE_COMMANDS.DISABLE_POLICY_BILLABLE_MODE, parameters, onyxData);
 }
 
-function getWorkspaceEReceiptsEnabledOnyxData(policyID: string, enabled: boolean): OnyxData<typeof ONYXKEYS.COLLECTION.POLICY> {
+function getWorkspaceEReceiptsEnabledOnyxData(policyID: string, enabled: boolean): OnyxData {
     // This will be fixed as part of https://github.com/Expensify/Expensify/issues/507850
     // eslint-disable-next-line @typescript-eslint/no-deprecated
     const policy = getPolicy(policyID);
@@ -5561,7 +5492,7 @@ function getWorkspaceEReceiptsEnabledOnyxData(policyID: string, enabled: boolean
 }
 
 function setWorkspaceEReceiptsEnabled(policyID: string, enabled: boolean) {
-    const onyxData: OnyxData<typeof ONYXKEYS.COLLECTION.POLICY> = getWorkspaceEReceiptsEnabledOnyxData(policyID, enabled);
+    const onyxData: OnyxData = getWorkspaceEReceiptsEnabledOnyxData(policyID, enabled);
 
     const parameters = {
         policyID,
@@ -5575,7 +5506,7 @@ function setPolicyRequireCompanyCardsEnabled(policy: Policy, requireCompanyCards
     const policyID = policy.id;
     const originalRequireCompanyCardsEnabled = !!policy?.requireCompanyCardsEnabled;
 
-    const onyxData: OnyxData<typeof ONYXKEYS.COLLECTION.POLICY> = {
+    const onyxData: OnyxData = {
         optimisticData: [
             {
                 onyxMethod: Onyx.METHOD.MERGE,
@@ -5628,7 +5559,7 @@ function setPolicyAttendeeTrackingEnabled(policyID: string, isAttendeeTrackingEn
 
     const originalIsAttendeeTrackingEnabled = !!policy?.isAttendeeTrackingEnabled;
 
-    const onyxData: OnyxData<typeof ONYXKEYS.COLLECTION.POLICY> = {
+    const onyxData: OnyxData = {
         optimisticData: [
             {
                 onyxMethod: Onyx.METHOD.MERGE,
@@ -5773,9 +5704,7 @@ function setPolicyPreventMemberCreatedTitle(policyID: string, enforced: boolean)
     // eslint-disable-next-line @typescript-eslint/no-deprecated
     const policy = getPolicy(policyID);
 
-    // When fieldList is empty, deletable is undefined. We treat undefined as true (not enforced) to match OldDot's fallback behavior.
-    const currentDeletable = policy?.fieldList?.[CONST.POLICY.FIELDS.FIELD_LIST_TITLE]?.deletable ?? true;
-    if (!enforced === currentDeletable) {
+    if (!enforced === policy?.fieldList?.[CONST.POLICY.FIELDS.FIELD_LIST_TITLE].deletable) {
         return;
     }
 
diff --git a/src/libs/actions/Policy/ReportField.ts b/src/libs/actions/Policy/ReportField.ts
index b802d6a4a1d2..69c2d1c52487 100644
--- a/src/libs/actions/Policy/ReportField.ts
+++ b/src/libs/actions/Policy/ReportField.ts
@@ -194,7 +194,7 @@ function createReportField({name, type, initialValue, listValues, disabledListVa
         isTax: false,
     };
 
-    const optimisticData: Array<OnyxUpdate<typeof ONYXKEYS.COLLECTION.POLICY | typeof ONYXKEYS.COLLECTION.REPORT>> = [
+    const optimisticData = [
         {
             key: `${ONYXKEYS.COLLECTION.POLICY}${policy?.id}`,
             onyxMethod: Onyx.METHOD.MERGE,
@@ -205,20 +205,18 @@ function createReportField({name, type, initialValue, listValues, disabledListVa
                 errorFields: null,
             },
         },
-        ...(policyExpenseReportIDs ?? []).map(
-            (reportID): OnyxUpdate<typeof ONYXKEYS.COLLECTION.REPORT> => ({
-                key: `${ONYXKEYS.COLLECTION.REPORT}${reportID}`,
-                onyxMethod: Onyx.METHOD.MERGE,
-                value: {
-                    fieldList: {
-                        [fieldKey]: {...optimisticReportFieldDataForPolicy, pendingAction: CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD},
-                    },
+        ...(policyExpenseReportIDs ?? []).map((reportID) => ({
+            key: `${ONYXKEYS.COLLECTION.REPORT}${reportID}`,
+            onyxMethod: Onyx.METHOD.MERGE,
+            value: {
+                fieldList: {
+                    [fieldKey]: {...optimisticReportFieldDataForPolicy, pendingAction: CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD},
                 },
-            }),
-        ),
-    ];
+            },
+        })),
+    ] as OnyxUpdate[];
 
-    const failureData: Array<OnyxUpdate<typeof ONYXKEYS.COLLECTION.POLICY | typeof ONYXKEYS.COLLECTION.REPORT>> = [
+    const failureData = [
         {
             key: `${ONYXKEYS.COLLECTION.POLICY}${policy?.id}`,
             onyxMethod: Onyx.METHOD.MERGE,
@@ -231,20 +229,18 @@ function createReportField({name, type, initialValue, listValues, disabledListVa
                 },
             },
         },
-        ...(policyExpenseReportIDs ?? []).map(
-            (reportID): OnyxUpdate<typeof ONYXKEYS.COLLECTION.REPORT> => ({
-                key: `${ONYXKEYS.COLLECTION.REPORT}${reportID}`,
-                onyxMethod: Onyx.METHOD.MERGE,
-                value: {
-                    fieldList: {
-                        [fieldKey]: null,
-                    },
+        ...(policyExpenseReportIDs ?? []).map((reportID) => ({
+            key: `${ONYXKEYS.COLLECTION.REPORT}${reportID}`,
+            onyxMethod: Onyx.METHOD.MERGE,
+            value: {
+                fieldList: {
+                    [fieldKey]: null,
                 },
-            }),
-        ),
-    ];
+            },
+        })),
+    ] as OnyxUpdate[];
 
-    const onyxData: OnyxData<typeof ONYXKEYS.COLLECTION.POLICY | typeof ONYXKEYS.COLLECTION.REPORT> = {
+    const onyxData: OnyxData = {
         optimisticData,
         successData: [
             {
@@ -293,7 +289,7 @@ function deleteReportFields({policy, reportFieldsToUpdate}: DeleteReportFieldsPa
         return acc;
     }, {});
 
-    const onyxData: OnyxData<typeof ONYXKEYS.COLLECTION.POLICY> = {
+    const onyxData: OnyxData = {
         optimisticData: [
             {
                 onyxMethod: Onyx.METHOD.MERGE,
@@ -360,7 +356,7 @@ function updateReportFieldInitialValue({policy, reportFieldID, newInitialValue}:
         type: nextType,
         defaultValue: newInitialValue,
     };
-    const onyxData: OnyxData<typeof ONYXKEYS.COLLECTION.POLICY> = {
+    const onyxData: OnyxData = {
         optimisticData: [
             {
                 key: `${ONYXKEYS.COLLECTION.POLICY}${policy?.id}`,
@@ -430,7 +426,7 @@ function updateReportFieldListValueEnabled({policy, reportFieldID, valueIndexes,
     }
 
     // We are using the offline pattern A (optimistic without feedback)
-    const onyxData: OnyxData<typeof ONYXKEYS.COLLECTION.POLICY> = {
+    const onyxData: OnyxData = {
         optimisticData: [
             {
                 key: `${ONYXKEYS.COLLECTION.POLICY}${policy?.id}`,
@@ -470,7 +466,7 @@ function addReportFieldListValue({policy, reportFieldID, valueName}: AddReportFi
     updatedReportField.disabledOptions.push(false);
 
     // We are using the offline pattern A (optimistic without feedback)
-    const onyxData: OnyxData<typeof ONYXKEYS.COLLECTION.POLICY> = {
+    const onyxData: OnyxData = {
         optimisticData: [
             {
                 key: `${ONYXKEYS.COLLECTION.POLICY}${policy?.id}`,
@@ -518,7 +514,7 @@ function removeReportFieldListValue({policy, reportFieldID, valueIndexes}: Remov
     }
 
     // We are using the offline pattern A (optimistic without feedback)
-    const onyxData: OnyxData<typeof ONYXKEYS.COLLECTION.POLICY> = {
+    const onyxData: OnyxData = {
         optimisticData: [
             {
                 key: `${ONYXKEYS.COLLECTION.POLICY}${policy?.id}`,
diff --git a/src/libs/actions/Policy/Tag.ts b/src/libs/actions/Policy/Tag.ts
index ae474c02ed99..636f9cff8ff4 100644
--- a/src/libs/actions/Policy/Tag.ts
+++ b/src/libs/actions/Policy/Tag.ts
@@ -29,21 +29,13 @@ import {goBackWhenEnableFeature} from '@libs/PolicyUtils';
 import {pushTransactionViolationsOnyxData} from '@libs/ReportUtils';
 import {getTagArrayFromName} from '@libs/TransactionUtils';
 import type {PolicyTagList} from '@pages/workspace/tags/types';
-import {completeTask} from '@userActions/Task';
 import CONST from '@src/CONST';
 import ONYXKEYS from '@src/ONYXKEYS';
-import type {ImportedSpreadsheet, Policy, PolicyTag, PolicyTagLists, PolicyTags, RecentlyUsedTags, Report} from '@src/types/onyx';
+import type {ImportedSpreadsheet, Policy, PolicyTag, PolicyTagLists, PolicyTags, RecentlyUsedTags} from '@src/types/onyx';
 import type {OnyxValueWithOfflineFeedback} from '@src/types/onyx/OnyxCommon';
 import type {ApprovalRule} from '@src/types/onyx/Policy';
 import type {OnyxData} from '@src/types/onyx/Request';
 
-/**
- * Checks if a task report is incomplete (not approved)
- */
-function isTaskIncomplete(taskReport: OnyxEntry<Report>): boolean {
-    return !!taskReport && (taskReport.stateNum !== CONST.REPORT.STATE_NUM.APPROVED || taskReport.statusNum !== CONST.REPORT.STATUS_NUM.APPROVED);
-}
-
 let allPolicyTags: OnyxCollection<PolicyTagLists> = {};
 Onyx.connect({
     key: ONYXKEYS.COLLECTION.POLICY_TAGS,
@@ -97,8 +89,8 @@ function buildOptimisticPolicyRecentlyUsedTags({policyTags, policyRecentlyUsedTa
     return newOptimisticPolicyRecentlyUsedTags;
 }
 
-function updateImportSpreadsheetData(tagsLength: number): OnyxData<typeof ONYXKEYS.IMPORTED_SPREADSHEET> {
-    const onyxData: OnyxData<typeof ONYXKEYS.IMPORTED_SPREADSHEET> = {
+function updateImportSpreadsheetData(tagsLength: number): OnyxData {
+    const onyxData: OnyxData = {
         successData: [
             {
                 onyxMethod: Onyx.METHOD.MERGE,
@@ -134,18 +126,11 @@ function updateImportSpreadsheetData(tagsLength: number): OnyxData<typeof ONYXKE
     return onyxData;
 }
 
-function createPolicyTag(
-    policyID: string,
-    tagName: string,
-    policyTags: PolicyTagLists = {},
-    setupTagsTaskReport?: OnyxEntry<Report>,
-    setupCategoriesAndTagsTaskReport?: OnyxEntry<Report>,
-    policyHasCustomCategories?: boolean,
-) {
+function createPolicyTag(policyID: string, tagName: string, policyTags: PolicyTagLists = {}) {
     const policyTag = PolicyUtils.getTagLists(policyTags)?.at(0) ?? ({} as PolicyTagList);
     const newTagName = PolicyUtils.escapeTagName(tagName);
 
-    const onyxData: OnyxData<typeof ONYXKEYS.COLLECTION.POLICY_TAGS> = {
+    const onyxData: OnyxData = {
         optimisticData: [
             {
                 onyxMethod: Onyx.METHOD.MERGE,
@@ -203,14 +188,6 @@ function createPolicyTag(
     };
 
     API.write(WRITE_COMMANDS.CREATE_POLICY_TAG, parameters, onyxData);
-
-    if (isTaskIncomplete(setupTagsTaskReport)) {
-        completeTask(setupTagsTaskReport, false, false, undefined);
-    }
-
-    if (isTaskIncomplete(setupCategoriesAndTagsTaskReport) && policyHasCustomCategories) {
-        completeTask(setupCategoriesAndTagsTaskReport, false, false, undefined);
-    }
 }
 
 function importPolicyTags(policyID: string, tags: PolicyTag[]) {
@@ -249,7 +226,7 @@ function setWorkspaceTagEnabled(policyData: PolicyData, tagsToUpdate: Record<str
             return acc;
         }, {}),
     };
-    const onyxData: OnyxData<typeof ONYXKEYS.COLLECTION.POLICY_TAGS> = {
+    const onyxData: OnyxData = {
         optimisticData: [
             {
                 onyxMethod: Onyx.METHOD.MERGE,
@@ -362,7 +339,7 @@ function setWorkspaceTagRequired(policyData: PolicyData, tagListIndexes: number[
         }, {}),
     };
 
-    const onyxData: OnyxData<typeof ONYXKEYS.COLLECTION.POLICY_TAGS> = {
+    const onyxData: OnyxData = {
         optimisticData: [
             {
                 onyxMethod: Onyx.METHOD.MERGE,
@@ -444,7 +421,7 @@ function deletePolicyTags(policyData: PolicyData, tagsToDelete: string[]) {
         },
     };
 
-    const onyxData: OnyxData<typeof ONYXKEYS.COLLECTION.POLICY_TAGS> = {
+    const onyxData: OnyxData = {
         optimisticData: [
             {
                 onyxMethod: Onyx.METHOD.MERGE,
@@ -642,7 +619,7 @@ function renamePolicyTag(policyData: PolicyData, policyTag: {oldName: string; ne
         },
     };
 
-    const onyxData: OnyxData<typeof ONYXKEYS.COLLECTION.POLICY_TAGS | typeof ONYXKEYS.COLLECTION.POLICY> = {
+    const onyxData: OnyxData = {
         optimisticData: [
             {
                 onyxMethod: Onyx.METHOD.MERGE,
@@ -719,7 +696,7 @@ function enablePolicyTags(policyData: PolicyData, enabled: boolean) {
         },
     };
 
-    const onyxData: OnyxData<typeof ONYXKEYS.COLLECTION.POLICY | typeof ONYXKEYS.COLLECTION.POLICY_TAGS> = {
+    const onyxData: OnyxData = {
         optimisticData: [
             {
                 onyxMethod: Onyx.METHOD.MERGE,
@@ -852,7 +829,7 @@ function importMultiLevelTags(policyID: string, spreadsheet: ImportedSpreadsheet
         return;
     }
 
-    const onyxData: OnyxData<typeof ONYXKEYS.COLLECTION.POLICY | typeof ONYXKEYS.IMPORTED_SPREADSHEET> = {
+    const onyxData: OnyxData = {
         successData: [
             {
                 onyxMethod: Onyx.METHOD.MERGE,
@@ -918,7 +895,7 @@ function renamePolicyTagList(policyID: string, policyTagListName: {oldName: stri
     const newName = policyTagListName.newName;
     const oldName = policyTagListName.oldName;
     const oldPolicyTags = policyTags?.[oldName] ?? {};
-    const onyxData: OnyxData<typeof ONYXKEYS.COLLECTION.POLICY_TAGS> = {
+    const onyxData: OnyxData = {
         optimisticData: [
             {
                 onyxMethod: Onyx.METHOD.MERGE,
@@ -975,7 +952,7 @@ function setPolicyRequiresTag(policyData: PolicyData, requiresTag: boolean) {
         },
     };
 
-    const onyxData: OnyxData<typeof ONYXKEYS.COLLECTION.POLICY | typeof ONYXKEYS.COLLECTION.POLICY_TAGS> = {
+    const onyxData: OnyxData = {
         optimisticData: [
             {
                 onyxMethod: Onyx.METHOD.MERGE,
@@ -1022,7 +999,7 @@ function setPolicyRequiresTag(policyData: PolicyData, requiresTag: boolean) {
         }, {}),
     });
 
-    const getUpdatedTagsOnyxData = (required: boolean): OnyxUpdate<typeof ONYXKEYS.COLLECTION.POLICY_TAGS> => ({
+    const getUpdatedTagsOnyxData = (required: boolean): OnyxUpdate => ({
         key: `${ONYXKEYS.COLLECTION.POLICY_TAGS}${policyID}`,
         onyxMethod: Onyx.METHOD.MERGE,
         value: {...getUpdatedTagsData(required)},
@@ -1057,7 +1034,7 @@ function setPolicyTagsRequired(policyData: PolicyData, requiresTag: boolean, tag
         },
     };
 
-    const onyxData: OnyxData<typeof ONYXKEYS.COLLECTION.POLICY_TAGS> = {
+    const onyxData: OnyxData = {
         optimisticData: [
             {
                 onyxMethod: Onyx.METHOD.MERGE,
@@ -1116,7 +1093,7 @@ function setPolicyTagGLCode({policyID, tagName, tagListIndex, glCode, policyTags
     const tagListName = PolicyUtils.getTagListName(policyTags, tagListIndex);
     const policyTagToUpdate = policyTags?.[tagListName]?.tags?.[tagName] ?? {};
 
-    const onyxData: OnyxData<typeof ONYXKEYS.COLLECTION.POLICY_TAGS> = {
+    const onyxData: OnyxData = {
         optimisticData: [
             {
                 onyxMethod: Onyx.METHOD.MERGE,
@@ -1214,7 +1191,7 @@ function setPolicyTagApprover(policy: OnyxEntry<Policy>, tag: string, approver:
 
     const updatedApprovalRules = toBeUnselected ? filteredApprovalRules : [...filteredApprovalRules, updatedApproverRule];
 
-    const onyxData: OnyxData<typeof ONYXKEYS.COLLECTION.POLICY> = {
+    const onyxData: OnyxData = {
         optimisticData: [
             {
                 onyxMethod: Onyx.METHOD.MERGE,
diff --git a/src/libs/actions/Policy/Travel.ts b/src/libs/actions/Policy/Travel.ts
index 1150f4f17bbe..35209bfe63d5 100644
--- a/src/libs/actions/Policy/Travel.ts
+++ b/src/libs/actions/Policy/Travel.ts
@@ -9,7 +9,7 @@ import ONYXKEYS from '@src/ONYXKEYS';
 import type {OnyxData} from '@src/types/onyx/Request';
 
 function enablePolicyTravel(policyID: string, enabled: boolean) {
-    const onyxData: OnyxData<typeof ONYXKEYS.COLLECTION.POLICY> = {
+    const onyxData: OnyxData = {
         optimisticData: [
             {
                 onyxMethod: Onyx.METHOD.MERGE,
diff --git a/src/libs/actions/ReimbursementAccount/resetNonUSDBankAccount.ts b/src/libs/actions/ReimbursementAccount/resetNonUSDBankAccount.ts
index b01c4bc47c6f..2e157acd4cde 100644
--- a/src/libs/actions/ReimbursementAccount/resetNonUSDBankAccount.ts
+++ b/src/libs/actions/ReimbursementAccount/resetNonUSDBankAccount.ts
@@ -15,7 +15,7 @@ function resetNonUSDBankAccount(policyID: string | undefined, achAccount: OnyxEn
 
     // If there's no bankAccountID, we reset locally without making an API call
     if (!bankAccountID) {
-        const updateData: Array<OnyxUpdate<typeof ONYXKEYS.FORMS.REIMBURSEMENT_ACCOUNT_FORM_DRAFT | typeof ONYXKEYS.COLLECTION.POLICY | typeof ONYXKEYS.REIMBURSEMENT_ACCOUNT>> = [
+        const updateData = [
             {
                 onyxMethod: Onyx.METHOD.SET,
                 key: ONYXKEYS.FORMS.REIMBURSEMENT_ACCOUNT_FORM_DRAFT,
@@ -34,16 +34,14 @@ function resetNonUSDBankAccount(policyID: string | undefined, achAccount: OnyxEn
                 value: CONST.REIMBURSEMENT_ACCOUNT.DEFAULT_DATA,
             },
         ];
-        Onyx.update(updateData);
+        Onyx.update(updateData as OnyxUpdate[]);
         return;
     }
 
     const isLastUsedPaymentMethodVBBA = lastUsedPaymentMethod?.expense?.name === CONST.IOU.PAYMENT_TYPE.VBBA;
     const isPreviousLastUsedPaymentMethodVBBA = lastUsedPaymentMethod?.lastUsed?.name === CONST.IOU.PAYMENT_TYPE.VBBA;
 
-    const onyxData: OnyxData<
-        typeof ONYXKEYS.NVP_LAST_PAYMENT_METHOD | typeof ONYXKEYS.REIMBURSEMENT_ACCOUNT | typeof ONYXKEYS.COLLECTION.POLICY | typeof ONYXKEYS.FORMS.REIMBURSEMENT_ACCOUNT_FORM_DRAFT
-    > = {
+    const onyxData: OnyxData = {
         optimisticData: [
             {
                 onyxMethod: Onyx.METHOD.MERGE,
diff --git a/src/libs/actions/ReimbursementAccount/resetUSDBankAccount.ts b/src/libs/actions/ReimbursementAccount/resetUSDBankAccount.ts
index ece32c9c1f4b..d93e8970bf72 100644
--- a/src/libs/actions/ReimbursementAccount/resetUSDBankAccount.ts
+++ b/src/libs/actions/ReimbursementAccount/resetUSDBankAccount.ts
@@ -29,16 +29,7 @@ function resetUSDBankAccount(
     const isLastUsedPaymentMethodBBA = lastUsedPaymentMethod?.expense?.name === CONST.IOU.PAYMENT_TYPE.VBBA;
     const isPreviousLastUsedPaymentMethodBBA = lastUsedPaymentMethod?.lastUsed?.name === CONST.IOU.PAYMENT_TYPE.VBBA;
 
-    const onyxData: OnyxData<
-        | typeof ONYXKEYS.REIMBURSEMENT_ACCOUNT
-        | typeof ONYXKEYS.COLLECTION.POLICY
-        | typeof ONYXKEYS.ONFIDO_TOKEN
-        | typeof ONYXKEYS.ONFIDO_APPLICANT_ID
-        | typeof ONYXKEYS.PLAID_DATA
-        | typeof ONYXKEYS.PLAID_LINK_TOKEN
-        | typeof ONYXKEYS.FORMS.REIMBURSEMENT_ACCOUNT_FORM_DRAFT
-        | typeof ONYXKEYS.NVP_LAST_PAYMENT_METHOD
-    > = {
+    const onyxData: OnyxData = {
         optimisticData: [
             {
                 onyxMethod: Onyx.METHOD.MERGE,
diff --git a/src/libs/actions/Report.ts b/src/libs/actions/Report.ts
index 151fd67f4e72..39c1d867ae72 100644
--- a/src/libs/actions/Report.ts
+++ b/src/libs/actions/Report.ts
@@ -72,13 +72,12 @@ import getEnvironment from '@libs/Environment/getEnvironment';
 import type EnvironmentType from '@libs/Environment/getEnvironment/types';
 import {getMicroSecondOnyxErrorWithTranslationKey, getMicroSecondTranslationErrorWithTranslationKey} from '@libs/ErrorUtils';
 import fileDownload from '@libs/fileDownload';
-import getIsNarrowLayout from '@libs/getIsNarrowLayout';
 import HttpUtils from '@libs/HttpUtils';
 import Log from '@libs/Log';
 import {isEmailPublicDomain} from '@libs/LoginUtils';
 import {getMovedReportID} from '@libs/ModifiedExpenseMessage';
 import type {LinkToOptions} from '@libs/Navigation/helpers/linkTo/types';
-import Navigation, {navigationRef} from '@libs/Navigation/Navigation';
+import Navigation from '@libs/Navigation/Navigation';
 import enhanceParameters from '@libs/Network/enhanceParameters';
 import * as NetworkStore from '@libs/Network/NetworkStore';
 import NetworkConnection from '@libs/NetworkConnection';
@@ -114,6 +113,7 @@ import {
     buildOptimisticEmptyReport,
     buildOptimisticExportIntegrationAction,
     buildOptimisticGroupChatReport,
+    buildOptimisticIOUReportAction,
     buildOptimisticMovedReportAction,
     buildOptimisticRenamedRoomReportAction,
     buildOptimisticReportPreview,
@@ -160,7 +160,6 @@ import {
     isGroupChat as isGroupChatReportUtils,
     isHiddenForCurrentUser,
     isIOUReportUsingReport,
-    isMoneyRequest,
     isMoneyRequestReport,
     isOpenExpenseReport,
     isProcessingReport,
@@ -168,12 +167,13 @@ import {
     isSelfDM,
     isUnread,
     isValidReportIDFromPath,
+    populateOptimisticReportFormula,
     prepareOnboardingOnyxData,
 } from '@libs/ReportUtils';
 import {getCurrentSearchQueryJSON} from '@libs/SearchQueryUtils';
 import type {ArchivedReportsIDSet} from '@libs/SearchUIUtils';
 import playSound, {SOUNDS} from '@libs/Sound';
-import {getAmount, getCurrency, hasValidModifiedAmount, isOnHold, shouldClearConvertedAmount} from '@libs/TransactionUtils';
+import {getAmount, getCurrency, isOnHold, shouldClearConvertedAmount} from '@libs/TransactionUtils';
 import addTrailingForwardSlash from '@libs/UrlUtils';
 import Visibility from '@libs/Visibility';
 import CONFIG from '@src/CONFIG';
@@ -181,8 +181,6 @@ import type {OnboardingAccounting} from '@src/CONST';
 import CONST from '@src/CONST';
 import ONYXKEYS from '@src/ONYXKEYS';
 import ROUTES from '@src/ROUTES';
-import type {Route} from '@src/ROUTES';
-import SCREENS from '@src/SCREENS';
 import INPUT_IDS from '@src/types/form/NewRoomForm';
 import type {
     BankAccountList,
@@ -204,7 +202,6 @@ import type {
     ReportUserIsTyping,
     Transaction,
     TransactionViolations,
-    VisibleReportActionsDerivedValue,
 } from '@src/types/onyx';
 import type {Decision} from '@src/types/onyx/OriginalMessage';
 import type {CurrentUserPersonalDetails, Timezone} from '@src/types/onyx/PersonalDetails';
@@ -565,7 +562,7 @@ function addActions(report: OnyxEntry<Report>, notifyReportID: string, ancestors
     let commandName: typeof WRITE_COMMANDS.ADD_COMMENT | typeof WRITE_COMMANDS.ADD_ATTACHMENT | typeof WRITE_COMMANDS.ADD_TEXT_AND_ATTACHMENT = WRITE_COMMANDS.ADD_COMMENT;
 
     if (text && !file) {
-        const reportComment = buildOptimisticAddCommentReportAction(text, undefined, undefined, undefined, reportID);
+        const reportComment = buildOptimisticAddCommentReportAction(text, undefined, undefined, undefined, undefined, reportID);
         reportCommentAction = reportComment.reportAction;
         reportCommentText = reportComment.commentText;
     }
@@ -574,7 +571,7 @@ function addActions(report: OnyxEntry<Report>, notifyReportID: string, ancestors
         // When we are adding an attachment we will call AddAttachment.
         // It supports sending an attachment with an optional comment and AddComment supports adding a single text comment only.
         commandName = WRITE_COMMANDS.ADD_ATTACHMENT;
-        const attachment = buildOptimisticAddCommentReportAction(text, file, undefined, undefined, reportID);
+        const attachment = buildOptimisticAddCommentReportAction(text, file, undefined, undefined, undefined, reportID);
         attachmentAction = attachment.reportAction;
     }
 
@@ -638,7 +635,7 @@ function addActions(report: OnyxEntry<Report>, notifyReportID: string, ancestors
         }
     }
 
-    const optimisticData: Array<OnyxUpdate<typeof ONYXKEYS.COLLECTION.REPORT | typeof ONYXKEYS.COLLECTION.REPORT_ACTIONS | typeof ONYXKEYS.PERSONAL_DETAILS_LIST>> = [
+    const optimisticData: OnyxUpdate[] = [
         {
             onyxMethod: Onyx.METHOD.MERGE,
             key: `${ONYXKEYS.COLLECTION.REPORT}${reportID}`,
@@ -994,20 +991,7 @@ function openReport(
               reportName: allReports?.[`${ONYXKEYS.COLLECTION.REPORT}${reportID}`]?.reportName ?? CONST.REPORT.DEFAULT_REPORT_NAME,
           };
 
-    const optimisticData: Array<
-        | OnyxUpdate<
-              | typeof ONYXKEYS.COLLECTION.REPORT_METADATA
-              | typeof ONYXKEYS.COLLECTION.REPORT
-              | typeof ONYXKEYS.COLLECTION.TRANSACTION
-              | typeof ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS
-              | typeof ONYXKEYS.COLLECTION.REPORT_ACTIONS
-              | typeof ONYXKEYS.NVP_INTRO_SELECTED
-              | typeof ONYXKEYS.COLLECTION.POLICY
-              | typeof ONYXKEYS.NVP_ONBOARDING
-              | typeof ONYXKEYS.PERSONAL_DETAILS_LIST
-          >
-        | OnyxUpdate<typeof ONYXKEYS.COLLECTION.POLICY>
-    > = [
+    const optimisticData: OnyxUpdate[] = [
         {
             onyxMethod: Onyx.METHOD.MERGE,
             key: `${ONYXKEYS.COLLECTION.REPORT_METADATA}${reportID}`,
@@ -1030,16 +1014,7 @@ function openReport(
         });
     }
 
-    const successData: Array<
-        OnyxUpdate<
-            | typeof ONYXKEYS.COLLECTION.REPORT
-            | typeof ONYXKEYS.COLLECTION.REPORT_METADATA
-            | typeof ONYXKEYS.COLLECTION.REPORT_ACTIONS
-            | typeof ONYXKEYS.COLLECTION.POLICY
-            | typeof ONYXKEYS.PERSONAL_DETAILS_LIST
-            | typeof ONYXKEYS.NVP_ONBOARDING
-        >
-    > = [
+    const successData: OnyxUpdate[] = [
         {
             onyxMethod: Onyx.METHOD.MERGE,
             key: `${ONYXKEYS.COLLECTION.REPORT}${reportID}`,
@@ -1059,17 +1034,7 @@ function openReport(
         },
     ];
 
-    const failureData: Array<
-        OnyxUpdate<
-            | typeof ONYXKEYS.COLLECTION.REPORT
-            | typeof ONYXKEYS.COLLECTION.REPORT_METADATA
-            | typeof ONYXKEYS.NVP_INTRO_SELECTED
-            | typeof ONYXKEYS.NVP_ONBOARDING
-            | typeof ONYXKEYS.COLLECTION.POLICY
-            | typeof ONYXKEYS.PERSONAL_DETAILS_LIST
-            | typeof ONYXKEYS.COLLECTION.REPORT_ACTIONS
-        >
-    > = [
+    const failureData: OnyxUpdate[] = [
         {
             onyxMethod: Onyx.METHOD.MERGE,
             key: `${ONYXKEYS.COLLECTION.REPORT_METADATA}${reportID}`,
@@ -1112,6 +1077,95 @@ function openReport(
         });
     }
 
+    // This is a legacy transactions that doesn't have either a transaction thread or a money request preview
+    if (transaction && !parentReportActionID) {
+        const transactionParentReportID = parentReportID ?? transaction?.reportID;
+        const iouReportActionID = rand64();
+
+        // Get the parent report to determine the actual submitter/owner of the expense
+        // Use optimisticSelfDMReport if provided (when selfDM exists but wasn't in allReports)
+        const parentReport =
+            transactionParentReportID === optimisticSelfDMReport?.reportID ? optimisticSelfDMReport : allReports?.[`${ONYXKEYS.COLLECTION.REPORT}${transactionParentReportID}`];
+        const submitterAccountID = parentReport?.ownerAccountID ?? deprecatedCurrentUserAccountID;
+        // eslint-disable-next-line @typescript-eslint/no-deprecated
+        const submitterEmail = PersonalDetailsUtils.getLoginsByAccountIDs([submitterAccountID]).at(0) ?? deprecatedCurrentUserLogin ?? '';
+        const submitterPersonalDetails = PersonalDetailsUtils.getPersonalDetailByEmail(submitterEmail);
+
+        const optimisticIOUAction = buildOptimisticIOUReportAction({
+            type: isSelfDM(parentReport) ? CONST.IOU.REPORT_ACTION_TYPE.TRACK : CONST.IOU.REPORT_ACTION_TYPE.CREATE,
+            amount: Math.abs(transaction.amount),
+            currency: transaction.currency,
+            comment: transaction.comment?.comment ?? '',
+            participants: [],
+            transactionID: transaction.transactionID,
+            isOwnPolicyExpenseChat: false,
+            reportActionID: iouReportActionID,
+            iouReportID: transactionParentReportID,
+        });
+
+        // Override actor fields to show the submitter instead of current user.
+        // This is needed for legacy transactions where the approver opens the transaction but it should show the submitter
+        optimisticIOUAction.actorAccountID = submitterAccountID;
+        optimisticIOUAction.person = [
+            {
+                style: 'strong',
+                text: submitterPersonalDetails?.displayName ?? submitterEmail,
+                type: 'TEXT',
+            },
+        ];
+        optimisticIOUAction.avatar = submitterPersonalDetails?.avatar;
+
+        // We have a case where the transaction data is only available from the snapshot
+        // So we need to add the transaction data to Onyx so it's available when opening the report
+        optimisticData.push({
+            onyxMethod: Onyx.METHOD.MERGE,
+            key: `${ONYXKEYS.COLLECTION.TRANSACTION}${transaction.transactionID}`,
+            value: transaction,
+        });
+
+        // Add violations if they exist. This is needed when opening from search results where
+        // violations are in the snapshot but not yet synced to the main collections, so we need
+        // to add them to Onyx to ensure they show up in the transaction thread
+        if (transactionViolations) {
+            optimisticData.push({
+                onyxMethod: Onyx.METHOD.MERGE,
+                key: `${ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS}${transaction.transactionID}`,
+                value: transactionViolations,
+            });
+        }
+
+        // Attach the optimistic IOU report action created for the transaction to the transaction thread
+        // Set chatReportID to link back to the parent policy expense chat for proper avatar rendering
+        optimisticData.push({
+            onyxMethod: Onyx.METHOD.MERGE,
+            key: `${ONYXKEYS.COLLECTION.REPORT}${reportID}`,
+            value: {
+                parentReportActionID: iouReportActionID,
+                chatReportID: transactionParentReportID,
+            },
+        });
+
+        optimisticData.push({
+            onyxMethod: Onyx.METHOD.MERGE,
+            key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${transactionParentReportID}`,
+            value: {
+                [iouReportActionID]: {
+                    ...optimisticIOUAction,
+                    childReportID: reportID,
+                },
+            },
+        });
+
+        parameters.moneyRequestPreviewReportActionID = iouReportActionID;
+
+        // Log how often the legacy transaction fallback path is taken
+        Log.info('[Report] Legacy transaction fallback: creating money request preview', false, {
+            transactionParentReportID,
+            transactionID: transaction.transactionID,
+            reportID,
+        });
+    }
+
     const isInviteOnboardingComplete = introSelected?.isInviteOnboardingComplete ?? false;
     const isOnboardingCompleted = onboarding?.hasCompletedGuidedSetupFlow ?? false;
 
@@ -1894,13 +1948,10 @@ function handlePreexistingReport(report: Report) {
     }
 
     // Handle cleanup of stale optimistic IOU report and its report preview separately
-    if ((isMoneyRequestReport(report) || isMoneyRequest(report)) && parentReportID && parentReportActionID) {
-        const parentReportAction = allReportActions?.[parentReportID]?.[parentReportActionID];
-        if (parentReportAction?.childReportID === reportID) {
-            Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${parentReportID}`, {
-                [parentReportActionID]: null,
-            });
-        }
+    if (isMoneyRequestReport(report) && parentReportActionID) {
+        Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${parentReportID}`, {
+            [parentReportActionID]: null,
+        });
         Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT}${reportID}`, null);
         return;
     }
@@ -1923,38 +1974,12 @@ function handlePreexistingReport(report: Report) {
             });
             Onyx.set(`${ONYXKEYS.COLLECTION.REPORT_DRAFT_COMMENT}${reportID}`, null);
         };
-
-        if (!navigationRef.isReady()) {
-            callback();
-            return;
-        }
-
-        // Use Navigation.getActiveRoute() instead of navigationRef.getCurrentRoute()?.path because
-        // getCurrentRoute().path can be undefined during first navigation.
-        // We still need getCurrentRoute() for params and screen name as getActiveRoute() only returns the path string.
-        const activeRoute = Navigation.getActiveRoute();
-        const currentRouteInfo = navigationRef.getCurrentRoute();
-        const backTo = (currentRouteInfo?.params as {backTo?: Route})?.backTo;
-        const screenName = currentRouteInfo?.name;
-
-        const isOptimisticReportFocused = activeRoute.includes(`/r/${reportID}`);
-
-        // Fix specific case: https://github.com/Expensify/App/pull/77657#issuecomment-3678696730.
-        // When user is editing a money request report (/e/:reportID route) and has
-        // an optimistic report in the background that should be replaced with preexisting report
-        const isOptimisticReportInBackground = screenName === SCREENS.RIGHT_MODAL.EXPENSE_REPORT && backTo && backTo.includes(`/r/${reportID}`);
-
         // Only re-route them if they are still looking at the optimistically created report
-        if (isOptimisticReportFocused || isOptimisticReportInBackground) {
+        if (Navigation.getActiveRoute().includes(`/r/${reportID}`)) {
             const currCallback = callback;
             callback = () => {
                 currCallback();
-                if (isOptimisticReportFocused) {
-                    Navigation.setParams({reportID: preexistingReportID.toString()});
-                } else if (isOptimisticReportInBackground) {
-                    // Navigate to the correct backTo route with the preexisting report ID
-                    Navigation.navigate(backTo.replace(`/r/${reportID}`, `/r/${preexistingReportID}`) as Route);
-                }
+                Navigation.setParams({reportID: preexistingReportID.toString()});
             };
 
             // The report screen will listen to this event and transfer the draft comment to the existing report
@@ -1987,7 +2012,6 @@ function deleteReportComment(
     isReportArchived: boolean | undefined,
     isOriginalReportArchived: boolean | undefined,
     currentEmail: string,
-    visibleReportActionsDataParam?: VisibleReportActionsDerivedValue,
 ) {
     const originalReportID = getOriginalReportID(reportID, reportAction);
     const reportActionID = reportAction.reportActionID;
@@ -2034,7 +2058,7 @@ function deleteReportComment(
             (action) =>
                 action.reportActionID !== reportAction.reportActionID &&
                 ReportActionsUtils.didMessageMentionCurrentUser(action, currentEmail) &&
-                ReportActionsUtils.isReportActionVisible(action, reportID, undefined, visibleReportActionsDataParam),
+                ReportActionsUtils.shouldReportActionBeVisible(action, action.reportActionID),
         );
         optimisticReport.lastMentionedTime = latestMentionedReportAction?.created ?? null;
     }
@@ -2067,7 +2091,7 @@ function deleteReportComment(
         },
     ];
 
-    const optimisticData: Array<OnyxUpdate<typeof ONYXKEYS.COLLECTION.REPORT_ACTIONS | typeof ONYXKEYS.COLLECTION.REPORT>> = [
+    const optimisticData: OnyxUpdate[] = [
         {
             onyxMethod: Onyx.METHOD.MERGE,
             key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${originalReportID}`,
@@ -2190,7 +2214,6 @@ function editReportComment(
     isOriginalParentReportArchived: boolean | undefined,
     currentUserLogin: string,
     videoAttributeCache?: Record<string, string>,
-    visibleReportActionsDataParam?: VisibleReportActionsDerivedValue,
 ) {
     const originalReportID = originalReport?.reportID;
     if (!originalReportID || !originalReportAction) {
@@ -2223,7 +2246,7 @@ function editReportComment(
 
     //  Delete the comment if it's empty
     if (!htmlForNewComment) {
-        deleteReportComment(originalReportID, originalReportAction, ancestors, isOriginalReportArchived, isOriginalParentReportArchived, currentUserLogin, visibleReportActionsDataParam);
+        deleteReportComment(originalReportID, originalReportAction, ancestors, isOriginalReportArchived, isOriginalParentReportArchived, currentUserLogin);
         return;
     }
 
@@ -2881,12 +2904,12 @@ function buildNewReportOptimisticData(
     policy: OnyxEntry<Policy>,
     reportID: string,
     reportActionID: string,
-    ownerPersonalDetails: CurrentUserPersonalDetails,
+    creatorPersonalDetails: CurrentUserPersonalDetails,
     reportPreviewReportActionID: string,
     hasViolationsParam: boolean,
     isASAPSubmitBetaEnabled: boolean,
 ) {
-    const {accountID, login, email} = ownerPersonalDetails;
+    const {accountID, login, email} = creatorPersonalDetails;
     const timeOfCreation = DateUtils.getDBTime();
     const parentReport = getPolicyExpenseChat(accountID, policy?.id);
     const optimisticReportData = buildOptimisticEmptyReport(reportID, accountID, parentReport, reportPreviewReportActionID, policy, timeOfCreation);
@@ -2938,7 +2961,7 @@ function buildNewReportOptimisticData(
         shouldShow: true,
         childOwnerAccountID: accountID,
         automatic: false,
-        avatar: ownerPersonalDetails.avatar,
+        avatar: creatorPersonalDetails.avatar,
         isAttachmentOnly: false,
         reportActionID: reportPreviewReportActionID,
         message: createReportActionMessage,
@@ -2962,16 +2985,7 @@ function buildNewReportOptimisticData(
     });
     const outstandingChildRequest = getOutstandingChildRequest(optimisticReportData);
 
-    const optimisticData: Array<
-        OnyxUpdate<
-            | typeof ONYXKEYS.COLLECTION.REPORT
-            | typeof ONYXKEYS.COLLECTION.REPORT_METADATA
-            | typeof ONYXKEYS.COLLECTION.REPORT_ACTIONS
-            | typeof ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS
-            | typeof ONYXKEYS.COLLECTION.SNAPSHOT
-            | typeof ONYXKEYS.COLLECTION.NEXT_STEP
-        >
-    > = [
+    const optimisticData: OnyxUpdate[] = [
         {
             onyxMethod: Onyx.METHOD.SET,
             key: `${ONYXKEYS.COLLECTION.REPORT}${reportID}`,
@@ -3109,7 +3123,7 @@ function buildNewReportOptimisticData(
 }
 
 function createNewReport(
-    ownerPersonalDetails: CurrentUserPersonalDetails,
+    creatorPersonalDetails: CurrentUserPersonalDetails,
     hasViolationsParam: boolean,
     isASAPSubmitBetaEnabled: boolean,
     policy: OnyxEntry<Policy>,
@@ -3124,7 +3138,7 @@ function createNewReport(
         policy,
         optimisticReportID,
         reportActionID,
-        ownerPersonalDetails,
+        creatorPersonalDetails,
         reportPreviewReportActionID,
         hasViolationsParam,
         isASAPSubmitBetaEnabled,
@@ -3142,13 +3156,12 @@ function createNewReport(
             reportID: optimisticReportID,
             reportActionID,
             reportPreviewReportActionID,
-            ownerEmail: ownerPersonalDetails.login,
             ...(shouldDismissEmptyReportsConfirmation ? {shouldDismissEmptyReportsConfirmation} : {}),
         },
         {optimisticData, successData, failureData},
     );
     if (shouldNotifyNewAction) {
-        notifyNewAction(parentReportID, ownerPersonalDetails.accountID, reportPreviewAction);
+        notifyNewAction(parentReportID, creatorPersonalDetails.accountID, reportPreviewAction);
     }
 
     return optimisticReportData;
@@ -3670,7 +3683,7 @@ function toggleEmojiReaction(
 function doneCheckingPublicRoom() {
     Onyx.set(ONYXKEYS.IS_CHECKING_PUBLIC_ROOM, false);
 }
-/** @deprecated This function is deprecated and will be removed soon after migration. Use the accountID from useCurrentUserPersonalDetails hook instead. */
+
 function getCurrentUserAccountID(): number {
     return deprecatedCurrentUserAccountID;
 }
@@ -3679,15 +3692,8 @@ function navigateToMostRecentReport(currentReport: OnyxEntry<Report>) {
     const lastAccessedReportID = findLastAccessedReport(false, false, undefined, currentReport?.reportID)?.reportID;
 
     if (lastAccessedReportID) {
-        // Check if route exists for super wide RHP vs regular full screen report
-        const topmostSuperWideRHP = Navigation.getTopmostSuperWideRHPReportID();
-
-        if (lastAccessedReportID === topmostSuperWideRHP && !getIsNarrowLayout()) {
-            Navigation.dismissToSuperWideRHP();
-        } else {
-            const lastAccessedReportRoute = ROUTES.REPORT_WITH_ID.getRoute(lastAccessedReportID);
-            Navigation.goBack(lastAccessedReportRoute);
-        }
+        const lastAccessedReportRoute = ROUTES.REPORT_WITH_ID.getRoute(lastAccessedReportID);
+        Navigation.goBack(lastAccessedReportRoute);
     } else {
         const isChatThread = isChatThreadReportUtils(currentReport);
 
@@ -3880,7 +3886,6 @@ function leaveRoom(reportID: string, currentUserAccountID: number, isWorkspaceMe
     // If this is the leave action from a workspace room, simply dismiss the modal, i.e., allow the user to view the room and join again immediately.
     // If this is the leave action from a chat thread (even if the chat thread is in a room), do not allow the user to stay in the thread after leaving.
     if (isWorkspaceMemberLeavingWorkspaceRoom && !isChatThread) {
-        Navigation.dismissModal();
         return;
     }
     // In other cases, the report is deleted and we should move the user to another report.
@@ -3922,7 +3927,7 @@ function buildInviteToRoomOnyxData(reportID: string, inviteeEmailsToAccountIDs:
         return participantCleanUp;
     }, {});
 
-    const optimisticData: Array<OnyxUpdate<typeof ONYXKEYS.COLLECTION.REPORT | typeof ONYXKEYS.COLLECTION.REPORT_METADATA | typeof ONYXKEYS.PERSONAL_DETAILS_LIST>> = [
+    const optimisticData: OnyxUpdate[] = [
         {
             onyxMethod: Onyx.METHOD.MERGE,
             key: `${ONYXKEYS.COLLECTION.REPORT}${reportID}`,
@@ -3938,14 +3943,14 @@ function buildInviteToRoomOnyxData(reportID: string, inviteeEmailsToAccountIDs:
             },
         },
     ];
-    optimisticData.push(...(newPersonalDetailsOnyxData.optimisticData ?? []));
+    optimisticData.push(...newPersonalDetailsOnyxData.optimisticData);
 
     const successPendingChatMembers = reportMetadata?.pendingChatMembers
         ? reportMetadata?.pendingChatMembers?.filter(
               (pendingMember) => !(inviteeAccountIDs.includes(Number(pendingMember.accountID)) && pendingMember.pendingAction === CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE),
           )
         : null;
-    const successData: Array<OnyxUpdate<typeof ONYXKEYS.COLLECTION.REPORT | typeof ONYXKEYS.COLLECTION.REPORT_METADATA | typeof ONYXKEYS.PERSONAL_DETAILS_LIST>> = [
+    const successData: OnyxUpdate[] = [
         {
             onyxMethod: Onyx.METHOD.MERGE,
             key: `${ONYXKEYS.COLLECTION.REPORT}${reportID}`,
@@ -3961,7 +3966,7 @@ function buildInviteToRoomOnyxData(reportID: string, inviteeEmailsToAccountIDs:
             },
         },
     ];
-    successData.push(...(newPersonalDetailsOnyxData.finallyData ?? []));
+    successData.push(...newPersonalDetailsOnyxData.finallyData);
 
     const failureData: Array<OnyxUpdate<typeof ONYXKEYS.COLLECTION.REPORT_METADATA>> = [
         {
@@ -4986,7 +4991,7 @@ function deleteAppReport(
     reportID: string | undefined,
     currentUserEmailParam: string,
     reportTransactions: Record<string, Transaction>,
-    allTransactionViolations: OnyxCollection<TransactionViolations>,
+    transactionsViolations: Record<string, TransactionViolations>,
     bankAccountList: OnyxEntry<BankAccountList>,
 ) {
     if (!reportID) {
@@ -5101,7 +5106,7 @@ function deleteAppReport(
         // 1. Update the transaction and its violations
         if (transactionID) {
             const transaction = reportTransactions[`${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`];
-            const transactionViolations = allTransactionViolations?.[`${ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS}${transactionID}`] ?? [];
+            const transactionViolations = transactionsViolations[`${ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS}${transactionID}`];
 
             optimisticData.push(
                 {
@@ -5326,7 +5331,7 @@ function deleteAppReport(
         optimisticData.push({
             onyxMethod: Onyx.METHOD.MERGE,
             key: `${ONYXKEYS.COLLECTION.REPORT}${report?.parentReportID}`,
-            value: {hasOutstandingChildRequest: hasOutstandingChildRequest(chatReport, report?.reportID, currentUserEmailParam, allTransactionViolations, bankAccountList)},
+            value: {hasOutstandingChildRequest: hasOutstandingChildRequest(chatReport, report?.reportID, currentUserEmailParam, bankAccountList)},
         });
     }
 
@@ -5348,13 +5353,14 @@ function deleteAppReport(
 
 /**
  * Moves an IOU report to a policy by converting it to an expense report
+ * @param reportID - The ID of the IOU report to move
+ * @param policy - The policy to move the report to
+ * @param isFromSettlementButton - Whether the action is from report preview
  */
 function moveIOUReportToPolicy(
     reportID: string,
     policy: Policy,
     isFromSettlementButton?: boolean,
-    reportTransactions: Transaction[] = [],
-    isCustomReportNamesBetaEnabled?: boolean,
 ): {policyExpenseChatReportID?: string; useTemporaryOptimisticExpenseChatReportID: boolean} | undefined {
     const iouReport = allReports?.[`${ONYXKEYS.COLLECTION.REPORT}${reportID}`];
 
@@ -5381,8 +5387,6 @@ function moveIOUReportToPolicy(
         policy,
         policyID,
         optimisticExpenseChatReportID,
-        reportTransactions,
-        isCustomReportNamesBetaEnabled,
     );
 
     const parameters: MoveIOUReportToExistingPolicyParams = {
@@ -5398,14 +5402,13 @@ function moveIOUReportToPolicy(
 }
 
 /**
- * Moves an IOU report to a policy by converting it to an expense report and invites the submitter
+ * Moves an IOU report to a policy by converting it to an expense report
+ * @param reportID - The ID of the IOU report to move
  */
 function moveIOUReportToPolicyAndInviteSubmitter(
     reportID: string,
     policy: Policy,
     formatPhoneNumber: LocaleContextProps['formatPhoneNumber'],
-    reportTransactions: Transaction[] = [],
-    isCustomReportNamesBetaEnabled?: boolean,
 ): {policyExpenseChatReportID?: string} | undefined {
     const iouReport = allReports?.[`${ONYXKEYS.COLLECTION.REPORT}${reportID}`];
 
@@ -5431,36 +5434,9 @@ function moveIOUReportToPolicyAndInviteSubmitter(
         return;
     }
 
-    const optimisticData: Array<
-        OnyxUpdate<
-            | typeof ONYXKEYS.COLLECTION.POLICY
-            | typeof ONYXKEYS.PERSONAL_DETAILS_LIST
-            | typeof ONYXKEYS.COLLECTION.REPORT
-            | typeof ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS
-            | typeof ONYXKEYS.COLLECTION.REPORT_ACTIONS
-            | typeof ONYXKEYS.COLLECTION.REPORT_METADATA
-            | typeof ONYXKEYS.COLLECTION.TRANSACTION
-        >
-    > = [];
-    const successData: Array<
-        OnyxUpdate<
-            | typeof ONYXKEYS.COLLECTION.POLICY
-            | typeof ONYXKEYS.PERSONAL_DETAILS_LIST
-            | typeof ONYXKEYS.COLLECTION.REPORT
-            | typeof ONYXKEYS.COLLECTION.REPORT_METADATA
-            | typeof ONYXKEYS.COLLECTION.REPORT_ACTIONS
-        >
-    > = [];
-    const failureData: Array<
-        OnyxUpdate<
-            | typeof ONYXKEYS.COLLECTION.POLICY
-            | typeof ONYXKEYS.COLLECTION.REPORT
-            | typeof ONYXKEYS.COLLECTION.REPORT_ACTIONS
-            | typeof ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS
-            | typeof ONYXKEYS.COLLECTION.REPORT_METADATA
-            | typeof ONYXKEYS.COLLECTION.TRANSACTION
-        >
-    > = [];
+    const optimisticData: OnyxUpdate[] = [];
+    const successData: OnyxUpdate[] = [];
+    const failureData: OnyxUpdate[] = [];
 
     // Optimistically add the submitter to the workspace and create a expense chat for them
     const policyKey = `${ONYXKEYS.COLLECTION.POLICY}${policyID}` as const;
@@ -5527,9 +5503,9 @@ function moveIOUReportToPolicyAndInviteSubmitter(
         },
     });
 
-    optimisticData.push(...(newPersonalDetailsOnyxData.optimisticData ?? []), ...policyExpenseChats.onyxOptimisticData, ...(announceRoomMembers.optimisticData ?? []));
-    successData.push(...(newPersonalDetailsOnyxData.finallyData ?? []), ...policyExpenseChats.onyxSuccessData, ...(announceRoomMembers.successData ?? []));
-    failureData.push(...policyExpenseChats.onyxFailureData, ...(announceRoomMembers.failureData ?? []));
+    optimisticData.push(...newPersonalDetailsOnyxData.optimisticData, ...policyExpenseChats.onyxOptimisticData, ...announceRoomMembers.optimisticData);
+    successData.push(...newPersonalDetailsOnyxData.finallyData, ...policyExpenseChats.onyxSuccessData, ...announceRoomMembers.successData);
+    failureData.push(...policyExpenseChats.onyxFailureData, ...announceRoomMembers.failureData);
 
     const {
         optimisticData: convertedOptimisticData,
@@ -5537,7 +5513,7 @@ function moveIOUReportToPolicyAndInviteSubmitter(
         failureData: convertedFailureData,
         movedExpenseReportAction,
         movedReportAction,
-    } = convertIOUReportToExpenseReport(iouReport, policy, policyID, optimisticPolicyExpenseChatReportID, reportTransactions, isCustomReportNamesBetaEnabled);
+    } = convertIOUReportToExpenseReport(iouReport, policy, policyID, optimisticPolicyExpenseChatReportID);
 
     optimisticData.push(...convertedOptimisticData);
     successData.push(...convertedSuccessData);
@@ -5556,14 +5532,7 @@ function moveIOUReportToPolicyAndInviteSubmitter(
     return {policyExpenseChatReportID: optimisticPolicyExpenseChatReportID};
 }
 
-function convertIOUReportToExpenseReport(
-    iouReport: Report,
-    policy: Policy,
-    policyID: string,
-    optimisticPolicyExpenseChatReportID: string,
-    reportTransactions: Transaction[] = [],
-    isCustomReportNamesBetaEnabled?: boolean,
-) {
+function convertIOUReportToExpenseReport(iouReport: Report, policy: Policy, policyID: string, optimisticPolicyExpenseChatReportID: string) {
     const optimisticData: Array<OnyxUpdate<typeof ONYXKEYS.COLLECTION.REPORT | typeof ONYXKEYS.COLLECTION.TRANSACTION | typeof ONYXKEYS.COLLECTION.REPORT_ACTIONS>> = [];
     const successData: Array<OnyxUpdate<typeof ONYXKEYS.COLLECTION.REPORT_ACTIONS>> = [];
     const failureData: Array<OnyxUpdate<typeof ONYXKEYS.COLLECTION.REPORT | typeof ONYXKEYS.COLLECTION.TRANSACTION | typeof ONYXKEYS.COLLECTION.REPORT_ACTIONS>> = [];
@@ -5585,27 +5554,9 @@ function convertIOUReportToExpenseReport(
         expenseReport.managerID = nextApproverAccountID;
     }
 
-    // Only compute optimistic report name if the user is on the CUSTOM_REPORT_NAMES beta
-    if (isCustomReportNamesBetaEnabled) {
-        const titleReportField = getTitleReportField(getReportFieldsByPolicyID(policyID) ?? {});
-        if (!!titleReportField && isPaidGroupPolicy(policy)) {
-            // Convert transactions array to Record<string, Transaction> for FormulaContext
-            const transactionsRecord: Record<string, Transaction> = {};
-            for (const transaction of reportTransactions) {
-                if (transaction?.transactionID) {
-                    transactionsRecord[transaction.transactionID] = transaction;
-                }
-            }
-
-            // eslint-disable-next-line @typescript-eslint/no-require-imports, @typescript-eslint/no-var-requires
-            const Formula = require('@libs/Formula') as {compute: (formula?: string, context?: {report: Report; policy: Policy; allTransactions?: Record<string, Transaction>}) => string};
-            const computedName = Formula.compute(titleReportField.defaultValue, {
-                report: expenseReport,
-                policy,
-                allTransactions: transactionsRecord,
-            });
-            expenseReport.reportName = computedName ?? expenseReport.reportName;
-        }
+    const titleReportField = getTitleReportField(getReportFieldsByPolicyID(policyID) ?? {});
+    if (!!titleReportField && isPaidGroupPolicy(policy)) {
+        expenseReport.reportName = populateOptimisticReportFormula(titleReportField.defaultValue, expenseReport, policy);
     }
 
     const reportID = iouReport.reportID;
@@ -5621,6 +5572,9 @@ function convertIOUReportToExpenseReport(
         value: iouReport,
     });
 
+    // The expense report transactions need to have the amount reversed to negative values
+    const reportTransactions = getReportTransactions(reportID);
+
     // For performance reasons, we are going to compose a merge collection data for transactions
     const transactionsOptimisticData: Record<string, Transaction> = {};
     const transactionFailureData: Record<string, Transaction> = {};
@@ -5628,7 +5582,7 @@ function convertIOUReportToExpenseReport(
         transactionsOptimisticData[`${ONYXKEYS.COLLECTION.TRANSACTION}${transaction.transactionID}`] = {
             ...transaction,
             amount: -transaction.amount,
-            modifiedAmount: hasValidModifiedAmount(transaction) ? -Number(transaction.modifiedAmount) : '',
+            modifiedAmount: transaction.modifiedAmount ? -transaction.modifiedAmount : 0,
         };
 
         transactionFailureData[`${ONYXKEYS.COLLECTION.TRANSACTION}${transaction.transactionID}`] = transaction;
@@ -5827,16 +5781,7 @@ function buildOptimisticChangePolicyData(
     reportNextStep?: ReportNextStepDeprecated,
     optimisticPolicyExpenseChatReport?: Report,
 ) {
-    const optimisticData: Array<
-        OnyxUpdate<
-            | typeof ONYXKEYS.COLLECTION.REPORT
-            | typeof ONYXKEYS.COLLECTION.SNAPSHOT
-            | typeof ONYXKEYS.COLLECTION.REPORT_ACTIONS
-            | typeof ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS
-            | typeof ONYXKEYS.COLLECTION.NEXT_STEP
-            | typeof ONYXKEYS.COLLECTION.TRANSACTION
-        >
-    > = [];
+    const optimisticData: OnyxUpdate[] = [];
     const successData: Array<OnyxUpdate<typeof ONYXKEYS.COLLECTION.REPORT | typeof ONYXKEYS.COLLECTION.REPORT_ACTIONS | typeof ONYXKEYS.COLLECTION.TRANSACTION>> = [];
     const failureData: Array<
         OnyxUpdate<
@@ -6531,7 +6476,6 @@ export {
     exportReportToPDF,
     exportToIntegration,
     flagComment,
-    // eslint-disable-next-line @typescript-eslint/no-deprecated -- Temporarily disabling the rule for deprecated functions; it will be removed soon in https://github.com/Expensify/App/issues/73648.
     getCurrentUserAccountID,
     getMostRecentReportID,
     getNewerActions,
diff --git a/src/libs/actions/Search.ts b/src/libs/actions/Search.ts
index a9896218641d..3b443982a0fd 100644
--- a/src/libs/actions/Search.ts
+++ b/src/libs/actions/Search.ts
@@ -6,7 +6,7 @@ import type {FormOnyxValues} from '@components/Form/types';
 import type {ContinueActionParams, PaymentMethod, PaymentMethodType} from '@components/KYCWall/types';
 import type {LocalizedTranslate} from '@components/LocaleContextProvider';
 import type {PopoverMenuItem} from '@components/PopoverMenu';
-import type {BankAccountMenuItem, PaymentData, SearchQueryJSON, SelectedReports, SelectedTransactions} from '@components/Search/types';
+import type {BankAccountMenuItem, PaymentData, SearchQueryJSON, SelectedReports, SelectedTransactionInfo, SelectedTransactions} from '@components/Search/types';
 import type {TransactionListItemType, TransactionReportGroupListItemType} from '@components/SelectionListWithSections/types';
 import * as API from '@libs/API';
 import {waitForWrites} from '@libs/API';
@@ -18,7 +18,6 @@ import {getMicroSecondOnyxErrorWithTranslationKey} from '@libs/ErrorUtils';
 import fileDownload from '@libs/fileDownload';
 import isSearchTopmostFullScreenRoute from '@libs/Navigation/helpers/isSearchTopmostFullScreenRoute';
 import Navigation, {navigationRef} from '@libs/Navigation/Navigation';
-import type {SearchFullscreenNavigatorParamList} from '@libs/Navigation/types';
 import enhanceParameters from '@libs/Network/enhanceParameters';
 import {rand64} from '@libs/NumberUtils';
 import {getActivePaymentType} from '@libs/PaymentUtils';
@@ -46,17 +45,26 @@ import ROUTES from '@src/ROUTES';
 import SCREENS from '@src/SCREENS';
 import {FILTER_KEYS} from '@src/types/form/SearchAdvancedFiltersForm';
 import type {SearchAdvancedFiltersForm} from '@src/types/form/SearchAdvancedFiltersForm';
-import type {ExportTemplate, LastPaymentMethod, LastPaymentMethodType, Policy, Report, ReportAction, ReportActions, Transaction} from '@src/types/onyx';
+import type {
+    BankAccountList,
+    ExportTemplate,
+    LastPaymentMethod,
+    LastPaymentMethodType,
+    Policy,
+    Report,
+    ReportAction,
+    ReportActions,
+    Transaction,
+    TransactionViolations,
+} from '@src/types/onyx';
 import type {PaymentInformation} from '@src/types/onyx/LastPaymentMethod';
 import type {ConnectionName} from '@src/types/onyx/Policy';
-import type {OnyxData} from '@src/types/onyx/Request';
 import type Nullable from '@src/types/utils/Nullable';
 import SafeString from '@src/utils/SafeString';
 import {setPersonalBankAccountContinueKYCOnSuccess} from './BankAccounts';
-import type {RejectMoneyRequestData} from './IOU';
 import {prepareRejectMoneyRequestData, rejectMoneyRequest} from './IOU';
 import {isCurrencySupportedForGlobalReimbursement} from './Policy/Policy';
-import {setOptimisticTransactionThread} from './Report';
+import {deleteAppReport, setOptimisticTransactionThread} from './Report';
 import {saveLastSearchParams} from './ReportNavigation';
 
 type OnyxSearchResponse = {
@@ -242,7 +250,13 @@ function getPayActionCallback(
     goToItem();
 }
 
-function getOnyxLoadingData(hash: number, queryJSON?: SearchQueryJSON, offset?: number, isOffline?: boolean, isSearchAPI = false): OnyxData<typeof ONYXKEYS.COLLECTION.SNAPSHOT> {
+function getOnyxLoadingData(
+    hash: number,
+    queryJSON?: SearchQueryJSON,
+    offset?: number,
+    isOffline?: boolean,
+    isSearchAPI = false,
+): {optimisticData: OnyxUpdate[]; finallyData: OnyxUpdate[]; failureData: OnyxUpdate[]} {
     const optimisticData: Array<OnyxUpdate<typeof ONYXKEYS.COLLECTION.SNAPSHOT>> = [
         {
             onyxMethod: Onyx.METHOD.MERGE,
@@ -450,14 +464,7 @@ function search({
 }
 
 function holdMoneyRequestOnSearch(hash: number, transactionIDList: string[], comment: string, allTransactions: OnyxCollection<Transaction>, allReportActions: OnyxCollection<ReportActions>) {
-    const optimisticData: Array<OnyxUpdate<typeof ONYXKEYS.COLLECTION.SNAPSHOT | typeof ONYXKEYS.COLLECTION.REPORT_ACTIONS>> = [];
-    const finallyData: Array<OnyxUpdate<typeof ONYXKEYS.COLLECTION.SNAPSHOT>> = [];
-
-    const onyxLoadingData = getOnyxLoadingData(hash);
-
-    optimisticData.push(...(onyxLoadingData.optimisticData ?? []));
-    finallyData.push(...(onyxLoadingData.finallyData ?? []));
-
+    const {optimisticData, finallyData} = getOnyxLoadingData(hash);
     for (const transactionID of transactionIDList) {
         const transaction = allTransactions?.[`${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`];
         const reportActions = allReportActions?.[`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${transaction?.reportID}`] ?? {};
@@ -726,17 +733,48 @@ function unholdMoneyRequestOnSearch(hash: number, transactionIDList: string[]) {
     API.write(WRITE_COMMANDS.UNHOLD_MONEY_REQUEST_ON_SEARCH, {hash, transactionIDList}, {optimisticData, finallyData});
 }
 
+function bulkDeleteReports(
+    hash: number,
+    selectedTransactions: Record<string, SelectedTransactionInfo>,
+    currentUserEmailParam: string,
+    reportTransactions: Record<string, Transaction>,
+    transactionsViolations: Record<string, TransactionViolations>,
+    bankAccountList: OnyxEntry<BankAccountList>,
+) {
+    const transactionIDList: string[] = [];
+    const reportIDList: string[] = [];
+
+    for (const key of Object.keys(selectedTransactions)) {
+        const selectedItem = selectedTransactions[key];
+        if (selectedItem.action === CONST.SEARCH.ACTION_TYPES.VIEW && key === selectedItem.reportID) {
+            reportIDList.push(selectedItem.reportID);
+        } else {
+            transactionIDList.push(key);
+        }
+    }
+
+    if (transactionIDList.length > 0) {
+        deleteMoneyRequestOnSearch(hash, transactionIDList);
+    }
+
+    if (reportIDList.length > 0) {
+        for (const reportID of reportIDList) {
+            deleteAppReport(reportID, currentUserEmailParam, reportTransactions, transactionsViolations, bankAccountList);
+        }
+    }
+}
+
 function deleteMoneyRequestOnSearch(hash: number, transactionIDList: string[]) {
     const {optimisticData: loadingOptimisticData, finallyData} = getOnyxLoadingData(hash);
 
     for (const transactionID of transactionIDList) {
-        const optimisticData: Array<OnyxUpdate<typeof ONYXKEYS.COLLECTION.SNAPSHOT>> = [
-            // @ts-expect-error - will be solved in https://github.com/Expensify/App/issues/73830
-            ...(loadingOptimisticData ?? []),
+        // @ts-expect-error - will be solved in https://github.com/Expensify/App/issues/73830
+        // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
+        const optimisticData: OnyxUpdate[] = [
+            ...loadingOptimisticData,
             {
                 onyxMethod: Onyx.METHOD.MERGE,
                 key: `${ONYXKEYS.COLLECTION.SNAPSHOT}${hash}`,
-                // @ts-expect-error - will be solved in https://github.com/Expensify/App/issues/73830
                 value: {
                     data: {
                         [`${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`]: {pendingAction: CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE},
@@ -764,15 +802,10 @@ function deleteMoneyRequestOnSearch(hash: number, transactionIDList: string[]) {
 }
 
 function rejectMoneyRequestInBulk(reportID: string, comment: string, policy: OnyxEntry<Policy>, transactionIDs: string[], hash?: number) {
-    const optimisticData: Array<RejectMoneyRequestData['optimisticData'][number] | OnyxUpdate<typeof ONYXKEYS.COLLECTION.SNAPSHOT>> = [];
-    const finallyData: Array<OnyxUpdate<typeof ONYXKEYS.COLLECTION.SNAPSHOT>> = [];
-    const successData: RejectMoneyRequestData['successData'] = [];
-    const failureData: RejectMoneyRequestData['failureData'] = [];
-
-    const loadingData = hash !== undefined ? getOnyxLoadingData(hash) : {optimisticData: undefined, finallyData: undefined};
-    optimisticData.push(...(loadingData.optimisticData ?? []));
-    finallyData.push(...(loadingData.finallyData ?? []));
-
+    const loadingData = hash !== undefined ? getOnyxLoadingData(hash) : {optimisticData: [] as OnyxUpdate[], finallyData: [] as OnyxUpdate[]};
+    const {optimisticData, finallyData} = loadingData;
+    const successData: OnyxUpdate[] = [];
+    const failureData: OnyxUpdate[] = [];
     const transactionIDToRejectReportAction: Record<
         string,
         {
@@ -854,22 +887,13 @@ function rejectMoneyRequestsOnSearch(
         if (isSingleReport && areAllExpensesSelected && !isPolicyDelayedSubmissionEnabled) {
             const searchFullScreenRoutes = navigationRef.getRootState()?.routes.findLast((route) => route.name === NAVIGATORS.SEARCH_FULLSCREEN_NAVIGATOR);
             const lastRoute = searchFullScreenRoutes?.state?.routes?.at(-1);
-            const focusedNavigator = navigationRef.getRootState()?.routes?.at(-1);
             const isUserOnSearchPage = isSearchTopmostFullScreenRoute() && lastRoute?.name === SCREENS.SEARCH.ROOT;
-            const isUserOnSearchMoneyRequestReport =
-                focusedNavigator?.name === NAVIGATORS.RIGHT_MODAL_NAVIGATOR &&
-                focusedNavigator?.state?.routes?.some((route) => route.name === SCREENS.RIGHT_MODAL.SEARCH_MONEY_REQUEST_REPORT);
+            const isUserOnSearchMoneyRequestReport = isSearchTopmostFullScreenRoute() && lastRoute?.name === SCREENS.SEARCH.MONEY_REQUEST_REPORT;
             if (isUserOnSearchPage) {
-                if (isUserOnSearchMoneyRequestReport && lastRoute?.params) {
-                    const searchParams = lastRoute.params as SearchFullscreenNavigatorParamList[typeof SCREENS.SEARCH.ROOT];
-                    urlToNavigateBack = ROUTES.SEARCH_ROOT.getRoute({
-                        query: searchParams.q,
-                        ...(searchParams?.rawQuery && {rawQuery: searchParams.rawQuery}),
-                        ...(searchParams?.name && {name: searchParams.name}),
-                    });
-                } else {
-                    urlToNavigateBack = undefined;
-                }
+                urlToNavigateBack = undefined;
+            } else if (isUserOnSearchMoneyRequestReport) {
+                const lastRouteParams = lastRoute?.params;
+                urlToNavigateBack = lastRouteParams && 'backTo' in lastRouteParams ? lastRouteParams?.backTo : undefined;
             } else {
                 urlToNavigateBack = ROUTES.REPORT_WITH_ID.getRoute(report?.chatReportID);
             }
@@ -1307,6 +1331,7 @@ export {
     clearAdvancedFilters,
     setSearchContext,
     deleteSavedSearch,
+    bulkDeleteReports,
     payMoneyRequestOnSearch,
     approveMoneyRequestOnSearch,
     handleActionButtonPress,
diff --git a/src/libs/actions/Session/index.ts b/src/libs/actions/Session/index.ts
index da79ff8ea9e6..c076f1f0d50a 100644
--- a/src/libs/actions/Session/index.ts
+++ b/src/libs/actions/Session/index.ts
@@ -64,7 +64,6 @@ import ROUTES from '@src/ROUTES';
 import type {TryNewDot} from '@src/types/onyx';
 import type Credentials from '@src/types/onyx/Credentials';
 import type Locale from '@src/types/onyx/Locale';
-import type {OnyxData} from '@src/types/onyx/Request';
 import type Response from '@src/types/onyx/Response';
 import type Session from '@src/types/onyx/Session';
 import type {AutoAuthState} from '@src/types/onyx/Session';
@@ -464,10 +463,16 @@ function resendValidateCode(login = credentials.login) {
     API.write(WRITE_COMMANDS.REQUEST_NEW_VALIDATE_CODE, params, {optimisticData, finallyData});
 }
 
+type OnyxData = {
+    optimisticData: OnyxUpdate[];
+    successData: OnyxUpdate[];
+    failureData: OnyxUpdate[];
+};
+
 /**
  * Constructs the state object for the BeginSignIn && BeginAppleSignIn API calls.
  */
-function signInAttemptState(): OnyxData<typeof ONYXKEYS.ACCOUNT | typeof ONYXKEYS.CREDENTIALS> {
+function signInAttemptState(): OnyxData {
     return {
         optimisticData: [
             {
@@ -526,15 +531,15 @@ function beginSignIn(email: string) {
 /**
  * Create Onyx update to clean up anonymous user data
  */
-function buildOnyxDataToCleanUpAnonymousUser(): OnyxUpdate<typeof ONYXKEYS.PERSONAL_DETAILS_LIST> {
+function buildOnyxDataToCleanUpAnonymousUser() {
     const data: Record<string, null> = {};
     if (session.authTokenType === CONST.AUTH_TOKEN_TYPES.ANONYMOUS && session.accountID) {
         data[session.accountID] = null;
     }
     return {
-        onyxMethod: Onyx.METHOD.MERGE,
         key: ONYXKEYS.PERSONAL_DETAILS_LIST,
         value: data,
+        onyxMethod: Onyx.METHOD.MERGE,
     };
 }
 
@@ -556,7 +561,7 @@ function signUpUser(preferredLocale: Locale | undefined) {
 
     const onyxOperationToCleanUpAnonymousUser = buildOnyxDataToCleanUpAnonymousUser();
 
-    const successData: Array<OnyxUpdate<typeof ONYXKEYS.PERSONAL_DETAILS_LIST | typeof ONYXKEYS.ACCOUNT>> = [
+    const successData: OnyxUpdate[] = [
         {
             onyxMethod: Onyx.METHOD.MERGE,
             key: ONYXKEYS.ACCOUNT,
@@ -727,7 +732,7 @@ function signIn(validateCode: string, preferredLocale: Locale | undefined, twoFa
 
     const onyxOperationToCleanUpAnonymousUser = buildOnyxDataToCleanUpAnonymousUser();
 
-    const successData: Array<OnyxUpdate<typeof ONYXKEYS.PERSONAL_DETAILS_LIST | typeof ONYXKEYS.ACCOUNT | typeof ONYXKEYS.CREDENTIALS>> = [
+    const successData: OnyxUpdate[] = [
         {
             onyxMethod: Onyx.METHOD.MERGE,
             key: ONYXKEYS.ACCOUNT,
@@ -797,7 +802,7 @@ function signInWithValidateCode(accountID: number, code: string, preferredLocale
         },
     ];
 
-    const successData: Array<OnyxUpdate<typeof ONYXKEYS.PERSONAL_DETAILS_LIST | typeof ONYXKEYS.ACCOUNT | typeof ONYXKEYS.CREDENTIALS | typeof ONYXKEYS.SESSION>> = [
+    const successData: OnyxUpdate[] = [
         {
             onyxMethod: Onyx.METHOD.MERGE,
             key: ONYXKEYS.ACCOUNT,
diff --git a/src/libs/actions/Subscription.ts b/src/libs/actions/Subscription.ts
index 679579b9d4ea..07b9346b860d 100644
--- a/src/libs/actions/Subscription.ts
+++ b/src/libs/actions/Subscription.ts
@@ -175,7 +175,7 @@ function updateSubscriptionAddNewUsersAutomatically(addNewUsersAutomatically: bo
 }
 
 function updateSubscriptionSize(newSubscriptionSize: number, currentSubscriptionSize: number) {
-    const onyxData: OnyxData<typeof ONYXKEYS.NVP_PRIVATE_SUBSCRIPTION> = {
+    const onyxData: OnyxData = {
         optimisticData: [
             {
                 onyxMethod: Onyx.METHOD.MERGE,
@@ -232,9 +232,7 @@ function clearUpdateSubscriptionSizeError() {
 }
 
 function clearOutstandingBalance() {
-    const onyxData: OnyxData<
-        typeof ONYXKEYS.SUBSCRIPTION_RETRY_BILLING_STATUS_PENDING | typeof ONYXKEYS.SUBSCRIPTION_RETRY_BILLING_STATUS_SUCCESSFUL | typeof ONYXKEYS.SUBSCRIPTION_RETRY_BILLING_STATUS_FAILED
-    > = {
+    const onyxData: OnyxData = {
         optimisticData: [
             {
                 onyxMethod: Onyx.METHOD.MERGE,
diff --git a/src/libs/actions/Task.ts b/src/libs/actions/Task.ts
index 192a8a0079cd..c94e66a63c63 100644
--- a/src/libs/actions/Task.ts
+++ b/src/libs/actions/Task.ts
@@ -128,11 +128,7 @@ function createTaskAndNavigate(params: CreateTaskAndNavigateParams) {
     // We're only setting onyx data for the task report here because it's possible for the parent report to not exist yet (if you're assigning a task to someone you haven't chatted with before)
     // So we don't want to set the parent report data until we've successfully created that chat report
     // FOR TASK REPORT
-    const optimisticData: Array<
-        OnyxUpdate<
-            typeof ONYXKEYS.COLLECTION.REPORT | typeof ONYXKEYS.COLLECTION.REPORT_METADATA | typeof ONYXKEYS.COLLECTION.REPORT_ACTIONS | typeof ONYXKEYS.NVP_QUICK_ACTION_GLOBAL_CREATE
-        >
-    > = [
+    const optimisticData: OnyxUpdate[] = [
         {
             onyxMethod: Onyx.METHOD.SET,
             key: `${ONYXKEYS.COLLECTION.REPORT}${optimisticTaskReport.reportID}`,
@@ -161,9 +157,7 @@ function createTaskAndNavigate(params: CreateTaskAndNavigateParams) {
     ];
 
     // FOR TASK REPORT
-    const successData: Array<
-        OnyxUpdate<typeof ONYXKEYS.COLLECTION.REPORT | typeof ONYXKEYS.COLLECTION.REPORT_METADATA | typeof ONYXKEYS.PERSONAL_DETAILS_LIST | typeof ONYXKEYS.COLLECTION.REPORT_ACTIONS>
-    > = [
+    const successData: OnyxUpdate[] = [
         {
             onyxMethod: Onyx.METHOD.MERGE,
             key: `${ONYXKEYS.COLLECTION.REPORT}${optimisticTaskReport.reportID}`,
@@ -193,9 +187,7 @@ function createTaskAndNavigate(params: CreateTaskAndNavigateParams) {
     ];
 
     // FOR TASK REPORT
-    const failureData: Array<
-        OnyxUpdate<typeof ONYXKEYS.COLLECTION.REPORT | typeof ONYXKEYS.COLLECTION.REPORT_ACTIONS | typeof ONYXKEYS.PERSONAL_DETAILS_LIST | typeof ONYXKEYS.NVP_QUICK_ACTION_GLOBAL_CREATE>
-    > = [
+    const failureData: OnyxUpdate[] = [
         {
             onyxMethod: Onyx.METHOD.MERGE,
             key: `${ONYXKEYS.COLLECTION.REPORT}${optimisticTaskReport.reportID}`,
@@ -330,12 +322,7 @@ function buildTaskData(
     hasOutstandingChildTaskInParentReport: boolean,
     hasOutstandingChildTask: boolean,
     parentReportAction: OnyxEntry<ReportAction> | undefined,
-): {
-    optimisticData: Array<OnyxUpdate<typeof ONYXKEYS.COLLECTION.REPORT | typeof ONYXKEYS.COLLECTION.REPORT_ACTIONS>>;
-    failureData: Array<OnyxUpdate<typeof ONYXKEYS.COLLECTION.REPORT | typeof ONYXKEYS.COLLECTION.REPORT_ACTIONS>>;
-    successData: Array<OnyxUpdate<typeof ONYXKEYS.COLLECTION.REPORT_ACTIONS>>;
-    parameters: CompleteTaskParams;
-} {
+) {
     const message = `marked as complete`;
     const completedTaskReportAction = ReportUtils.buildOptimisticTaskReportAction(taskReportID, CONST.REPORT.ACTIONS.TYPE.TASK_COMPLETED, message);
     const optimisticData: Array<OnyxUpdate<typeof ONYXKEYS.COLLECTION.REPORT | typeof ONYXKEYS.COLLECTION.REPORT_ACTIONS>> = [
@@ -446,7 +433,7 @@ function completeTask(
     hasOutstandingChildTask: boolean,
     parentReportAction: OnyxEntry<ReportAction> | undefined,
     reportIDFromAction?: string,
-): OnyxData<typeof ONYXKEYS.COLLECTION.REPORT | typeof ONYXKEYS.COLLECTION.REPORT_ACTIONS> {
+): OnyxData {
     const taskReportID = taskReport?.reportID ?? reportIDFromAction;
 
     if (!taskReportID) {
@@ -667,7 +654,7 @@ function editTaskAssignee(
     };
     const successReport: NullishDeep<OnyxTypes.Report> = {pendingFields: {...(assigneeAccountID && {managerID: null})}};
 
-    const optimisticData: Array<OnyxUpdate<typeof ONYXKEYS.COLLECTION.REPORT | typeof ONYXKEYS.COLLECTION.REPORT_METADATA | typeof ONYXKEYS.COLLECTION.REPORT_ACTIONS>> = [
+    const optimisticData: OnyxUpdate[] = [
         {
             onyxMethod: Onyx.METHOD.MERGE,
             key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${report.reportID}`,
@@ -680,9 +667,7 @@ function editTaskAssignee(
         },
     ];
 
-    const successData: Array<
-        OnyxUpdate<typeof ONYXKEYS.COLLECTION.REPORT | typeof ONYXKEYS.COLLECTION.REPORT_METADATA | typeof ONYXKEYS.PERSONAL_DETAILS_LIST | typeof ONYXKEYS.COLLECTION.REPORT_ACTIONS>
-    > = [
+    const successData: OnyxUpdate[] = [
         {
             onyxMethod: Onyx.METHOD.MERGE,
             key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${report.reportID}`,
@@ -695,7 +680,7 @@ function editTaskAssignee(
         },
     ];
 
-    const failureData: Array<OnyxUpdate<typeof ONYXKEYS.COLLECTION.REPORT | typeof ONYXKEYS.COLLECTION.REPORT_ACTIONS | typeof ONYXKEYS.PERSONAL_DETAILS_LIST>> = [
+    const failureData: OnyxUpdate[] = [
         {
             onyxMethod: Onyx.METHOD.MERGE,
             key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${report.reportID}`,
@@ -1089,7 +1074,7 @@ function deleteTask(
     const optimisticReportActions = parentReportAction?.reportActionID ? {[parentReportAction?.reportActionID]: optimisticReportAction} : {};
 
     const optimisticLastReportData = optimisticReportLastData(parentReport?.reportID ?? String(CONST.DEFAULT_NUMBER_ID), optimisticReportActions as ReportActions, canUserPerformWriteAction);
-    const optimisticData: Array<OnyxUpdate<typeof ONYXKEYS.COLLECTION.REPORT | typeof ONYXKEYS.COLLECTION.REPORT_ACTIONS>> = [
+    const optimisticData: OnyxUpdate[] = [
         {
             onyxMethod: Onyx.METHOD.MERGE,
             key: `${ONYXKEYS.COLLECTION.REPORT}${report.reportID}`,
@@ -1300,7 +1285,7 @@ function getFinishOnboardingTaskOnyxData(
     currentUserAccountID: number,
     hasOutstandingChildTask: boolean,
     parentReportAction: OnyxEntry<ReportAction> | undefined,
-): OnyxData<typeof ONYXKEYS.COLLECTION.REPORT | typeof ONYXKEYS.COLLECTION.REPORT_ACTIONS> {
+): OnyxData {
     if (taskReport && canActionTask(taskReport, parentReportAction, currentUserAccountID, taskParentReport, isParentReportArchived)) {
         if (taskReport) {
             if (taskReport.stateNum !== CONST.REPORT.STATE_NUM.APPROVED || taskReport.statusNum !== CONST.REPORT.STATUS_NUM.APPROVED) {
diff --git a/src/libs/actions/TaxRate.ts b/src/libs/actions/TaxRate.ts
index 67d0d4fdc3a7..2a07b617a4a1 100644
--- a/src/libs/actions/TaxRate.ts
+++ b/src/libs/actions/TaxRate.ts
@@ -1,7 +1,7 @@
 import type {NullishDeep, OnyxEntry} from 'react-native-onyx';
 import Onyx from 'react-native-onyx';
 import type {FormOnyxValues} from '@components/Form/types';
-import type {LocaleContextProps, LocalizedTranslate} from '@components/LocaleContextProvider';
+import type {LocaleContextProps} from '@components/LocaleContextProvider';
 import * as API from '@libs/API';
 import type {
     CreatePolicyTaxParams,
@@ -12,6 +12,8 @@ import type {
     UpdatePolicyTaxValueParams,
 } from '@libs/API/parameters';
 import {WRITE_COMMANDS} from '@libs/API/types';
+// eslint-disable-next-line @typescript-eslint/no-deprecated
+import {translateLocal} from '@libs/Localize';
 import {getDistanceRateCustomUnit} from '@libs/PolicyUtils';
 import {getFieldRequiredErrors, isExistingTaxCode, isExistingTaxName, isValidPercentage} from '@libs/ValidationUtils';
 import CONST from '@src/CONST';
@@ -39,27 +41,31 @@ function covertTaxNameToID(name: string) {
 /**
  *  Function to validate tax name
  */
-const validateTaxName = (policy: Policy, values: FormOnyxValues<typeof ONYXKEYS.FORMS.WORKSPACE_TAX_NAME_FORM>, translate: LocalizedTranslate) => {
+const validateTaxName = (policy: Policy, values: FormOnyxValues<typeof ONYXKEYS.FORMS.WORKSPACE_TAX_NAME_FORM>) => {
     const errors = getFieldRequiredErrors(values, [INPUT_IDS.NAME]);
 
     const name = values[INPUT_IDS.NAME];
     if (name.length > CONST.TAX_RATES.NAME_MAX_LENGTH) {
-        errors[INPUT_IDS.NAME] = translate('common.error.characterLimitExceedCounter', name.length, CONST.TAX_RATES.NAME_MAX_LENGTH);
+        // eslint-disable-next-line @typescript-eslint/no-deprecated
+        errors[INPUT_IDS.NAME] = translateLocal('common.error.characterLimitExceedCounter', name.length, CONST.TAX_RATES.NAME_MAX_LENGTH);
     } else if (policy?.taxRates?.taxes && isExistingTaxName(name, policy.taxRates.taxes)) {
-        errors[INPUT_IDS.NAME] = translate('workspace.taxes.error.taxRateAlreadyExists');
+        // eslint-disable-next-line @typescript-eslint/no-deprecated
+        errors[INPUT_IDS.NAME] = translateLocal('workspace.taxes.error.taxRateAlreadyExists');
     }
 
     return errors;
 };
 
-const validateTaxCode = (policy: Policy, values: FormOnyxValues<typeof ONYXKEYS.FORMS.WORKSPACE_TAX_CODE_FORM>, translate: LocalizedTranslate) => {
+const validateTaxCode = (policy: Policy, values: FormOnyxValues<typeof ONYXKEYS.FORMS.WORKSPACE_TAX_CODE_FORM>) => {
     const errors = getFieldRequiredErrors(values, [INPUT_IDS_TAX_CODE.TAX_CODE]);
 
     const taxCode = values[INPUT_IDS_TAX_CODE.TAX_CODE];
     if (taxCode.length > CONST.TAX_RATES.NAME_MAX_LENGTH) {
-        errors[INPUT_IDS_TAX_CODE.TAX_CODE] = translate('common.error.characterLimitExceedCounter', taxCode.length, CONST.TAX_RATES.NAME_MAX_LENGTH);
+        // eslint-disable-next-line @typescript-eslint/no-deprecated
+        errors[INPUT_IDS_TAX_CODE.TAX_CODE] = translateLocal('common.error.characterLimitExceedCounter', taxCode.length, CONST.TAX_RATES.NAME_MAX_LENGTH);
     } else if (policy?.taxRates?.taxes && isExistingTaxCode(taxCode, policy.taxRates.taxes)) {
-        errors[INPUT_IDS_TAX_CODE.TAX_CODE] = translate('workspace.taxes.error.taxCodeAlreadyExists');
+        // eslint-disable-next-line @typescript-eslint/no-deprecated
+        errors[INPUT_IDS_TAX_CODE.TAX_CODE] = translateLocal('workspace.taxes.error.taxCodeAlreadyExists');
     }
 
     return errors;
@@ -68,12 +74,13 @@ const validateTaxCode = (policy: Policy, values: FormOnyxValues<typeof ONYXKEYS.
 /**
  *  Function to validate tax value
  */
-const validateTaxValue = (values: FormOnyxValues<typeof ONYXKEYS.FORMS.WORKSPACE_TAX_VALUE_FORM>, translate: LocalizedTranslate) => {
+const validateTaxValue = (values: FormOnyxValues<typeof ONYXKEYS.FORMS.WORKSPACE_TAX_VALUE_FORM>) => {
     const errors = getFieldRequiredErrors(values, [INPUT_IDS.VALUE]);
 
     const value = values[INPUT_IDS.VALUE];
     if (!isValidPercentage(value)) {
-        errors[INPUT_IDS.VALUE] = translate('workspace.taxes.error.valuePercentageRange');
+        // eslint-disable-next-line @typescript-eslint/no-deprecated
+        errors[INPUT_IDS.VALUE] = translateLocal('workspace.taxes.error.valuePercentageRange');
     }
 
     return errors;
@@ -102,7 +109,7 @@ function createPolicyTax(policyID: string, taxRate: TaxRate) {
         return;
     }
 
-    const onyxData: OnyxData<typeof ONYXKEYS.COLLECTION.POLICY> = {
+    const onyxData: OnyxData = {
         optimisticData: [
             {
                 onyxMethod: Onyx.METHOD.MERGE,
@@ -211,7 +218,7 @@ function setPolicyTaxesEnabled(policy: OnyxEntry<Policy>, taxesIDsToUpdate: stri
 
     const originalTaxes = {...policy.taxRates?.taxes};
 
-    const onyxData: OnyxData<typeof ONYXKEYS.COLLECTION.POLICY> = {
+    const onyxData: OnyxData = {
         optimisticData: [
             {
                 onyxMethod: Onyx.METHOD.MERGE,
@@ -328,8 +335,9 @@ function deletePolicyTaxes(policy: OnyxEntry<Policy>, taxesToDelete: string[], l
         };
     }
 
-    const onyxData: OnyxData<typeof ONYXKEYS.COLLECTION.POLICY> = {
+    const onyxData: OnyxData = {
         optimisticData: [
+            // @ts-expect-error - will be solved in https://github.com/Expensify/App/issues/73830
             {
                 onyxMethod: Onyx.METHOD.MERGE,
                 key: `${ONYXKEYS.COLLECTION.POLICY}${policy.id}`,
@@ -342,7 +350,6 @@ function deletePolicyTaxes(policy: OnyxEntry<Policy>, taxesToDelete: string[], l
                             return acc;
                         }, {}),
                     },
-                    // @ts-expect-error - will be solved in https://github.com/Expensify/App/issues/73830
                     customUnits: distanceRateCustomUnit &&
                         customUnitID && {
                             [customUnitID]: {
@@ -353,6 +360,7 @@ function deletePolicyTaxes(policy: OnyxEntry<Policy>, taxesToDelete: string[], l
             },
         ],
         successData: [
+            // @ts-expect-error - will be solved in https://github.com/Expensify/App/issues/73830
             {
                 onyxMethod: Onyx.METHOD.MERGE,
                 key: `${ONYXKEYS.COLLECTION.POLICY}${policy.id}`,
@@ -364,7 +372,6 @@ function deletePolicyTaxes(policy: OnyxEntry<Policy>, taxesToDelete: string[], l
                             return acc;
                         }, {}),
                     },
-                    // @ts-expect-error - will be solved in https://github.com/Expensify/App/issues/73830
                     customUnits: distanceRateCustomUnit &&
                         customUnitID && {
                             [customUnitID]: {
@@ -375,6 +382,7 @@ function deletePolicyTaxes(policy: OnyxEntry<Policy>, taxesToDelete: string[], l
             },
         ],
         failureData: [
+            // @ts-expect-error - will be solved in https://github.com/Expensify/App/issues/73830
             {
                 onyxMethod: Onyx.METHOD.MERGE,
                 key: `${ONYXKEYS.COLLECTION.POLICY}${policy.id}`,
@@ -390,7 +398,6 @@ function deletePolicyTaxes(policy: OnyxEntry<Policy>, taxesToDelete: string[], l
                             return acc;
                         }, {}),
                     },
-                    // @ts-expect-error - will be solved in https://github.com/Expensify/App/issues/73830
                     customUnits: distanceRateCustomUnit &&
                         customUnitID && {
                             [customUnitID]: {
@@ -413,7 +420,7 @@ function deletePolicyTaxes(policy: OnyxEntry<Policy>, taxesToDelete: string[], l
 function updatePolicyTaxValue(policyID: string, taxID: string, taxValue: number, originalTaxRate: TaxRate) {
     const stringTaxValue = `${taxValue}%`;
 
-    const onyxData: OnyxData<typeof ONYXKEYS.COLLECTION.POLICY> = {
+    const onyxData: OnyxData = {
         optimisticData: [
             {
                 onyxMethod: Onyx.METHOD.MERGE,
@@ -475,7 +482,7 @@ function updatePolicyTaxValue(policyID: string, taxID: string, taxValue: number,
 }
 
 function renamePolicyTax(policyID: string, taxID: string, newName: string, originalTaxRate: TaxRate) {
-    const onyxData: OnyxData<typeof ONYXKEYS.COLLECTION.POLICY> = {
+    const onyxData: OnyxData = {
         optimisticData: [
             {
                 onyxMethod: Onyx.METHOD.MERGE,
@@ -565,7 +572,7 @@ function setPolicyTaxCode(
         },
     };
 
-    const onyxData: OnyxData<typeof ONYXKEYS.COLLECTION.POLICY> = {
+    const onyxData: OnyxData = {
         optimisticData: [
             {
                 onyxMethod: Onyx.METHOD.MERGE,
diff --git a/src/libs/actions/Transaction.ts b/src/libs/actions/Transaction.ts
index 4bf505b1b3c4..b1b417c8646b 100644
--- a/src/libs/actions/Transaction.ts
+++ b/src/libs/actions/Transaction.ts
@@ -1,16 +1,11 @@
 import {getUnixTime} from 'date-fns';
+import {deepEqual} from 'fast-equals';
 import lodashClone from 'lodash/clone';
-import type {NullishDeep, OnyxCollection, OnyxEntry, OnyxUpdate} from 'react-native-onyx';
+import lodashHas from 'lodash/has';
+import type {OnyxCollection, OnyxEntry, OnyxUpdate} from 'react-native-onyx';
 import Onyx from 'react-native-onyx';
 import * as API from '@libs/API';
-import type {
-    ChangeTransactionsReportParams,
-    DismissViolationParams,
-    GetDuplicateTransactionDetailsParams,
-    GetRouteParams,
-    MarkAsCashParams,
-    TransactionThreadInfo,
-} from '@libs/API/parameters';
+import type {ChangeTransactionsReportParams, DismissViolationParams, GetRouteParams, MarkAsCashParams, TransactionThreadInfo} from '@libs/API/parameters';
 import {READ_COMMANDS, WRITE_COMMANDS} from '@libs/API/types';
 import * as CollectionUtils from '@libs/CollectionUtils';
 import DateUtils from '@libs/DateUtils';
@@ -52,9 +47,22 @@ import type {
 } from '@src/types/onyx';
 import type {OriginalMessageIOU, OriginalMessageModifiedExpense} from '@src/types/onyx/OriginalMessage';
 import type {OnyxData} from '@src/types/onyx/Request';
-import type {Waypoint, WaypointCollection} from '@src/types/onyx/Transaction';
+import type {WaypointCollection} from '@src/types/onyx/Transaction';
 import type TransactionState from '@src/types/utils/TransactionStateType';
 import {getPolicyTagsData} from './Policy/Tag';
+import {getCurrentUserAccountID} from './Report';
+
+const allTransactions: OnyxCollection<Transaction> = {};
+Onyx.connect({
+    key: ONYXKEYS.COLLECTION.TRANSACTION,
+    callback: (transaction, key) => {
+        if (!key || !transaction) {
+            return;
+        }
+        const transactionID = CollectionUtils.extractCollectionItemID(key);
+        allTransactions[transactionID] = transaction;
+    },
+});
 
 let allTransactionDrafts: OnyxCollection<Transaction> = {};
 Onyx.connect({
@@ -109,23 +117,10 @@ type SaveWaypointProps = {
 };
 
 function saveWaypoint({transactionID, index, waypoint, isDraft = false, recentWaypointsList = []}: SaveWaypointProps) {
-    // Saving a waypoint should completely overwrite the existing one at the given index (if any).
-    // Onyx merge performs noop on undefined fields. Thus we should fallback to null so the existing fields are cleared.
-    const waypointOnyxUpdate: Required<NullishDeep<RecentWaypoint>> | null = waypoint
-        ? {
-              name: waypoint.name ?? null,
-              address: waypoint.address ?? null,
-              lat: waypoint.lat ?? null,
-              lng: waypoint.lng ?? null,
-              keyForList: waypoint.keyForList ?? null,
-              pendingAction: waypoint.pendingAction ?? null,
-          }
-        : null;
-
     Onyx.merge(`${isDraft ? ONYXKEYS.COLLECTION.TRANSACTION_DRAFT : ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`, {
         comment: {
             waypoints: {
-                [`waypoint${index}`]: waypointOnyxUpdate,
+                [`waypoint${index}`]: waypoint,
             },
             customUnit: {
                 quantity: null,
@@ -151,9 +146,16 @@ function saveWaypoint({transactionID, index, waypoint, isDraft = false, recentWa
         },
     });
 
+    // You can save offline waypoints without verifying the address (we will geocode it on the backend)
+    // We're going to prevent saving those addresses in the recent waypoints though since they could be invalid addresses
+    // However, in the backend once we verify the address, we will save the waypoint in the recent waypoints NVP
+    if (!lodashHas(waypoint, 'lat') || !lodashHas(waypoint, 'lng')) {
+        return;
+    }
+
     // If current location is used, we would want to avoid saving it as a recent waypoint. This prevents the 'Your Location'
     // text from showing up in the address search suggestions
-    if (waypoint?.address === CONST.YOUR_LOCATION_TEXT) {
+    if (deepEqual(waypoint?.address, CONST.YOUR_LOCATION_TEXT)) {
         return;
     }
     const recentWaypointAlreadyExists = recentWaypointsList.find((recentWaypoint) => recentWaypoint?.address === waypoint?.address);
@@ -236,10 +238,7 @@ function removeWaypoint(transaction: OnyxEntry<Transaction>, currentIndex: strin
     return Onyx.set(`${ONYXKEYS.COLLECTION.TRANSACTION}${transaction?.transactionID}`, newTransaction);
 }
 
-function getOnyxDataForRouteRequest(
-    transactionID: string,
-    transactionState: TransactionState = CONST.TRANSACTION.STATE.CURRENT,
-): OnyxData<typeof ONYXKEYS.COLLECTION.TRANSACTION_DRAFT | typeof ONYXKEYS.COLLECTION.TRANSACTION_BACKUP | typeof ONYXKEYS.COLLECTION.TRANSACTION> {
+function getOnyxDataForRouteRequest(transactionID: string, transactionState: TransactionState = CONST.TRANSACTION.STATE.CURRENT): OnyxData {
     let keyPrefix;
     switch (transactionState) {
         case CONST.TRANSACTION.STATE.DRAFT:
@@ -355,33 +354,9 @@ function getRoute(transactionID: string, waypoints: WaypointCollection, routeTyp
  *                             which will replace the existing ones.
  */
 function updateWaypoints(transactionID: string, waypoints: WaypointCollection, isDraft = false): Promise<void | void[]> {
-    // Updating waypoints should completely overwrite the existing ones.
-    // Onyx merge performs noop on undefined fields. Thus we should fallback to null so the existing fields are cleared.
-    const waypointsOnyxUpdate = Object.keys(waypoints).reduce(
-        (acc, key) => {
-            const waypoint = waypoints[key];
-            acc[key] = {
-                name: waypoint.name ?? null,
-                address: waypoint.address ?? null,
-                lat: waypoint.lat ?? null,
-                lng: waypoint.lng ?? null,
-                city: 'city' in waypoint ? (waypoint.city ?? null) : null,
-                state: 'state' in waypoint ? (waypoint.state ?? null) : null,
-                zipCode: 'zipCode' in waypoint ? (waypoint.zipCode ?? null) : null,
-                country: 'country' in waypoint ? (waypoint.country ?? null) : null,
-                street: 'street' in waypoint ? (waypoint.street ?? null) : null,
-                street2: 'street2' in waypoint ? (waypoint.street2 ?? null) : null,
-                pendingAction: 'pendingAction' in waypoint ? (waypoint.pendingAction ?? null) : null,
-                keyForList: waypoint.keyForList ?? null,
-            };
-            return acc;
-        },
-        {} as Record<string, Required<NullishDeep<RecentWaypoint & Waypoint>>>,
-    );
-
     return Onyx.merge(`${isDraft ? ONYXKEYS.COLLECTION.TRANSACTION_DRAFT : ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`, {
         comment: {
-            waypoints: waypointsOnyxUpdate,
+            waypoints,
             customUnit: {
                 quantity: null,
             },
@@ -407,53 +382,27 @@ function updateWaypoints(transactionID: string, waypoints: WaypointCollection, i
     });
 }
 
-type DismissDuplicateTransactionViolationProps = {
-    transactionIDs: string[];
-    dismissedPersonalDetails: PersonalDetails;
-    expenseReport: OnyxEntry<Report>;
-    policy: OnyxEntry<Policy>;
-    isASAPSubmitBetaEnabled: boolean;
-    allTransactions: OnyxCollection<Transaction>;
-};
-
 /**
  * Dismisses the duplicate transaction violation for the provided transactionIDs
  * and updates the transaction to include the dismissed violation in the comment.
  */
-function dismissDuplicateTransactionViolation({
-    transactionIDs,
-    dismissedPersonalDetails,
-    expenseReport,
-    policy,
-    isASAPSubmitBetaEnabled,
-    allTransactions,
-}: DismissDuplicateTransactionViolationProps) {
+function dismissDuplicateTransactionViolation(
+    transactionIDs: string[],
+    dismissedPersonalDetails: PersonalDetails,
+    expenseReport: OnyxEntry<Report>,
+    policy: OnyxEntry<Policy>,
+    isASAPSubmitBetaEnabled: boolean,
+) {
     const currentTransactionViolations = transactionIDs.map((id) => ({transactionID: id, violations: allTransactionViolation?.[id] ?? []}));
-    const currentTransactions = transactionIDs.map((id) => allTransactions?.[`${ONYXKEYS.COLLECTION.TRANSACTION}${id}`]);
+    const currentTransactions = transactionIDs.map((id) => allTransactions?.[id]);
     const transactionsReportActions = currentTransactions.map((transaction) => getIOUActionForReportID(transaction?.reportID, transaction?.transactionID));
     const optimisticDismissedViolationReportActions = transactionsReportActions.map(() => {
         return buildOptimisticDismissedViolationReportAction({reason: 'manual', violationName: CONST.VIOLATIONS.DUPLICATED_TRANSACTION});
     });
 
-    const optimisticData: Array<
-        OnyxUpdate<
-            | typeof ONYXKEYS.COLLECTION.NEXT_STEP
-            | typeof ONYXKEYS.COLLECTION.REPORT
-            | typeof ONYXKEYS.COLLECTION.REPORT_ACTIONS
-            | typeof ONYXKEYS.COLLECTION.TRANSACTION
-            | typeof ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS
-        >
-    > = [];
-    const successData: Array<OnyxUpdate<typeof ONYXKEYS.COLLECTION.REPORT | typeof ONYXKEYS.COLLECTION.REPORT_ACTIONS>> = [];
-    const failureData: Array<
-        OnyxUpdate<
-            | typeof ONYXKEYS.COLLECTION.NEXT_STEP
-            | typeof ONYXKEYS.COLLECTION.REPORT
-            | typeof ONYXKEYS.COLLECTION.REPORT_ACTIONS
-            | typeof ONYXKEYS.COLLECTION.TRANSACTION
-            | typeof ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS
-        >
-    > = [];
+    const optimisticData: OnyxUpdate[] = [];
+    const successData: OnyxUpdate[] = [];
+    const failureData: OnyxUpdate[] = [];
 
     if (expenseReport) {
         const hasOtherViolationsBesideDuplicates = currentTransactionViolations.some(
@@ -525,7 +474,7 @@ function dismissDuplicateTransactionViolation({
     }
 
     // @ts-expect-error - will be solved in https://github.com/Expensify/App/issues/73830
-    const optimisticReportActions: Array<OnyxUpdate<typeof ONYXKEYS.COLLECTION.REPORT_ACTIONS>> = transactionsReportActions.map((action, index) => {
+    const optimisticReportActions: OnyxUpdate[] = transactionsReportActions.map((action, index) => {
         const optimisticDismissedViolationReportAction = optimisticDismissedViolationReportActions.at(index);
         return {
             onyxMethod: Onyx.METHOD.MERGE,
@@ -537,16 +486,17 @@ function dismissDuplicateTransactionViolation({
                 : undefined,
         };
     });
-    const optimisticDataTransactionViolations: Array<OnyxUpdate<typeof ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS>> = currentTransactionViolations.map((transactionViolations) => ({
+    const optimisticDataTransactionViolations: OnyxUpdate[] = currentTransactionViolations.map((transactionViolations) => ({
         onyxMethod: Onyx.METHOD.MERGE,
         key: `${ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS}${transactionViolations.transactionID}`,
+        // @ts-expect-error - will be solved in https://github.com/Expensify/App/issues/73830
         value: transactionViolations.violations?.filter((violation) => violation.name !== CONST.VIOLATIONS.DUPLICATED_TRANSACTION),
     }));
 
     optimisticData.push(...optimisticDataTransactionViolations);
     optimisticData.push(...optimisticReportActions);
 
-    const optimisticDataTransactions: Array<OnyxUpdate<typeof ONYXKEYS.COLLECTION.TRANSACTION>> = currentTransactions.map((transaction) => ({
+    const optimisticDataTransactions: OnyxUpdate[] = currentTransactions.map((transaction) => ({
         onyxMethod: Onyx.METHOD.MERGE,
         key: `${ONYXKEYS.COLLECTION.TRANSACTION}${transaction?.transactionID}`,
         value: {
@@ -564,13 +514,14 @@ function dismissDuplicateTransactionViolation({
 
     optimisticData.push(...optimisticDataTransactions);
 
-    const failureDataTransactionViolations: Array<OnyxUpdate<typeof ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS>> = currentTransactionViolations.map((transactionViolations) => ({
+    const failureDataTransactionViolations: OnyxUpdate[] = currentTransactionViolations.map((transactionViolations) => ({
         onyxMethod: Onyx.METHOD.MERGE,
         key: `${ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS}${transactionViolations.transactionID}`,
+        // @ts-expect-error - will be solved in https://github.com/Expensify/App/issues/73830
         value: transactionViolations.violations?.map((violation) => violation),
     }));
 
-    const failureDataTransaction: Array<OnyxUpdate<typeof ONYXKEYS.COLLECTION.TRANSACTION>> = currentTransactions.map((transaction) => ({
+    const failureDataTransaction: OnyxUpdate[] = currentTransactions.map((transaction) => ({
         onyxMethod: Onyx.METHOD.MERGE,
         key: `${ONYXKEYS.COLLECTION.TRANSACTION}${transaction?.transactionID}`,
         value: {
@@ -579,7 +530,7 @@ function dismissDuplicateTransactionViolation({
     }));
 
     // @ts-expect-error - will be solved in https://github.com/Expensify/App/issues/73830
-    const failureReportActions: Array<OnyxUpdate<typeof ONYXKEYS.COLLECTION.REPORT_ACTIONS>> = transactionsReportActions.map((action, index) => {
+    const failureReportActions: OnyxUpdate[] = transactionsReportActions.map((action, index) => {
         const optimisticDismissedViolationReportAction = optimisticDismissedViolationReportActions.at(index);
         return {
             onyxMethod: Onyx.METHOD.MERGE,
@@ -597,7 +548,7 @@ function dismissDuplicateTransactionViolation({
     failureData.push(...failureReportActions);
 
     // @ts-expect-error - will be solved in https://github.com/Expensify/App/issues/73830
-    const successReportActions: Array<OnyxUpdate<typeof ONYXKEYS.COLLECTION.REPORT_ACTIONS>> = transactionsReportActions.map((action, index) => {
+    const successReportActions: OnyxUpdate[] = transactionsReportActions.map((action, index) => {
         const optimisticDismissedViolationReportAction = optimisticDismissedViolationReportActions.at(index);
         return {
             onyxMethod: Onyx.METHOD.MERGE,
@@ -671,12 +622,13 @@ function markAsCash(transactionID: string | undefined, transactionThreadReportID
     const optimisticReportActions = {
         [optimisticReportAction.reportActionID]: optimisticReportAction,
     };
-    const onyxData: OnyxData<typeof ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS | typeof ONYXKEYS.COLLECTION.REPORT_ACTIONS> = {
+    const onyxData: OnyxData = {
         optimisticData: [
             // Optimistically dismissing the violation, removing it from the list of violations
             {
                 onyxMethod: Onyx.METHOD.MERGE,
                 key: `${ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS}${transactionID}`,
+                // @ts-expect-error - will be solved in https://github.com/Expensify/App/issues/73830
                 value: transactionViolations.filter((violation: TransactionViolation) => violation.name !== CONST.VIOLATIONS.RTER),
             },
             // Optimistically adding the system message indicating we dismissed the violation
@@ -712,7 +664,7 @@ function markAsCash(transactionID: string | undefined, transactionThreadReportID
 }
 
 function openDraftDistanceExpense() {
-    const onyxData: OnyxData<typeof ONYXKEYS.NVP_RECENT_WAYPOINTS> = {
+    const onyxData: OnyxData = {
         optimisticData: [
             {
                 onyxMethod: Onyx.METHOD.SET,
@@ -746,7 +698,7 @@ type ChangeTransactionsReportProps = {
     policy?: OnyxEntry<Policy>;
     reportNextStep?: OnyxEntry<ReportNextStepDeprecated>;
     policyCategories?: OnyxEntry<PolicyCategories>;
-    allTransactions: OnyxCollection<Transaction>;
+    allTransactionsCollection: OnyxCollection<Transaction>;
 };
 
 function changeTransactionsReport({
@@ -758,11 +710,11 @@ function changeTransactionsReport({
     policy,
     reportNextStep,
     policyCategories,
-    allTransactions,
+    allTransactionsCollection,
 }: ChangeTransactionsReportProps) {
     const reportID = newReport?.reportID ?? CONST.REPORT.UNREPORTED_REPORT_ID;
 
-    const transactions = transactionIDs.map((id) => allTransactions?.[`${ONYXKEYS.COLLECTION.TRANSACTION}${id}`]).filter((t): t is NonNullable<typeof t> => t !== undefined);
+    const transactions = transactionIDs.map((id) => allTransactionsCollection?.[`${ONYXKEYS.COLLECTION.TRANSACTION}${id}`]).filter((t): t is NonNullable<typeof t> => t !== undefined);
     const transactionIDToReportActionAndThreadData: Record<string, TransactionThreadInfo> = {};
     const updatedReportTotals: Record<string, number> = {};
     const updatedReportNonReimbursableTotals: Record<string, number> = {};
@@ -774,16 +726,7 @@ function changeTransactionsReport({
         currentTransactionViolations[id] = allTransactionViolation?.[id] ?? [];
     }
 
-    const optimisticData: Array<
-        OnyxUpdate<
-            | typeof ONYXKEYS.COLLECTION.REPORT
-            | typeof ONYXKEYS.COLLECTION.REPORT_METADATA
-            | typeof ONYXKEYS.COLLECTION.REPORT_ACTIONS
-            | typeof ONYXKEYS.COLLECTION.TRANSACTION
-            | typeof ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS
-            | typeof ONYXKEYS.COLLECTION.NEXT_STEP
-        >
-    > = [];
+    const optimisticData: OnyxUpdate[] = [];
     const failureData: Array<
         OnyxUpdate<
             | typeof ONYXKEYS.COLLECTION.REPORT
@@ -807,6 +750,7 @@ function changeTransactionsReport({
     const existingSelfDMReportID = findSelfDMReportID();
     let selfDMReport: Report | undefined;
     let selfDMCreatedReportAction: ReportAction | undefined;
+    const currentUserAccountID = getCurrentUserAccountID();
 
     if (!existingSelfDMReportID && reportID === CONST.REPORT.UNREPORTED_REPORT_ID) {
         const currentTime = DateUtils.getDBTime();
@@ -936,11 +880,9 @@ function changeTransactionsReport({
             value: {
                 reportID,
                 ...(shouldClearAmount && {pendingAction: CONST.RED_BRICK_ROAD_PENDING_ACTION.UPDATE}),
-                ...(isUnreported && {
-                    comment: {
-                        hold: null,
-                    },
-                }),
+                comment: {
+                    hold: null,
+                },
                 ...(shouldClearAmount && {convertedAmount: null}),
                 ...(oldIOUAction ? {linkedTrackedExpenseReportAction: newIOUAction} : {}),
             },
@@ -977,6 +919,7 @@ function changeTransactionsReport({
                     optimisticData.push({
                         onyxMethod: Onyx.METHOD.SET,
                         key: `${ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS}${id}`,
+                        // @ts-expect-error - will be solved in https://github.com/Expensify/App/issues/73830
                         value: allTransactionViolations.filter((violation: TransactionViolation) => violation.name !== CONST.VIOLATIONS.DUPLICATED_TRANSACTION),
                     });
                 }
@@ -1172,7 +1115,7 @@ function changeTransactionsReport({
                     parentReportID: targetReportID,
                     parentReportActionID: optimisticMoneyRequestReportActionID,
                     policyID: reportID !== CONST.REPORT.UNREPORTED_REPORT_ID && newReport ? newReport.policyID : CONST.POLICY.ID_FAKE,
-                    participants: isUnreported && shouldRemoveOtherParticipants ? {[accountID]: participants?.[accountID]} : participants,
+                    participants: isUnreported && shouldRemoveOtherParticipants ? {[currentUserAccountID]: participants?.[currentUserAccountID]} : participants,
                 },
             });
         }
@@ -1297,8 +1240,8 @@ function changeTransactionsReport({
             transactionIDToReportActionAndThreadData[transaction.transactionID] = baseTransactionData;
         }
 
-        // Build unhold report action only when moving to unreported (self DM) report
-        if (isUnreported && isOnHold(transaction)) {
+        // Build unhold report action
+        if (isOnHold(transaction)) {
             const unHoldAction = buildOptimisticUnHoldReportAction();
             optimisticData.push({
                 onyxMethod: Onyx.METHOD.MERGE,
@@ -1519,18 +1462,6 @@ function getDraftTransactions(draftTransactions?: OnyxCollection<Transaction>):
     return Object.values(draftTransactions ?? allTransactionDrafts ?? {}).filter((transaction): transaction is Transaction => !!transaction);
 }
 
-function getDuplicateTransactionDetails(transactionID?: string) {
-    if (!transactionID) {
-        return;
-    }
-
-    const parameters: GetDuplicateTransactionDetailsParams = {
-        transactionID,
-    };
-
-    API.read(READ_COMMANDS.GET_DUPLICATE_TRANSACTION_DETAILS, parameters);
-}
-
 export {
     saveWaypoint,
     removeWaypoint,
@@ -1549,5 +1480,4 @@ export {
     revert,
     changeTransactionsReport,
     setTransactionReport,
-    getDuplicateTransactionDetails,
 };
diff --git a/src/libs/actions/TravelInvoicing.ts b/src/libs/actions/TravelInvoicing.ts
deleted file mode 100644
index 3f98c2a96c39..000000000000
--- a/src/libs/actions/TravelInvoicing.ts
+++ /dev/null
@@ -1,53 +0,0 @@
-import Onyx from 'react-native-onyx';
-import type {OnyxUpdate} from 'react-native-onyx';
-import * as API from '@libs/API';
-import type {OpenPolicyTravelPageParams} from '@libs/API/parameters';
-import {READ_COMMANDS} from '@libs/API/types';
-import ONYXKEYS from '@src/ONYXKEYS';
-
-/**
- * Opens the Travel page for a policy and fetches Travel Invoicing data.
- * Sets the isLoading state for the card settings while the API request is in flight.
- */
-function openPolicyTravelPage(policyID: string, workspaceAccountID: number) {
-    const optimisticData: Array<OnyxUpdate<typeof ONYXKEYS.COLLECTION.PRIVATE_EXPENSIFY_CARD_SETTINGS>> = [
-        {
-            onyxMethod: Onyx.METHOD.MERGE,
-            key: `${ONYXKEYS.COLLECTION.PRIVATE_EXPENSIFY_CARD_SETTINGS}${workspaceAccountID}`,
-            value: {
-                isLoading: true,
-            },
-        },
-    ];
-
-    const successData: Array<OnyxUpdate<typeof ONYXKEYS.COLLECTION.PRIVATE_EXPENSIFY_CARD_SETTINGS>> = [
-        {
-            onyxMethod: Onyx.METHOD.MERGE,
-            key: `${ONYXKEYS.COLLECTION.PRIVATE_EXPENSIFY_CARD_SETTINGS}${workspaceAccountID}`,
-            value: {
-                isLoading: false,
-            },
-        },
-    ];
-
-    const failureData: Array<OnyxUpdate<typeof ONYXKEYS.COLLECTION.PRIVATE_EXPENSIFY_CARD_SETTINGS>> = [
-        {
-            onyxMethod: Onyx.METHOD.MERGE,
-            key: `${ONYXKEYS.COLLECTION.PRIVATE_EXPENSIFY_CARD_SETTINGS}${workspaceAccountID}`,
-            value: {
-                isLoading: false,
-            },
-        },
-    ];
-
-    const params: OpenPolicyTravelPageParams = {
-        policyID,
-    };
-
-    API.read(READ_COMMANDS.OPEN_POLICY_TRAVEL_PAGE, params, {optimisticData, successData, failureData});
-}
-
-export {
-    // eslint-disable-next-line import/prefer-default-export
-    openPolicyTravelPage,
-};
diff --git a/src/libs/actions/User.ts b/src/libs/actions/User.ts
index b5ad228efea5..ad8d5eb74836 100644
--- a/src/libs/actions/User.ts
+++ b/src/libs/actions/User.ts
@@ -49,7 +49,6 @@ import CONFIG from '@src/CONFIG';
 import CONST from '@src/CONST';
 import ONYXKEYS from '@src/ONYXKEYS';
 import ROUTES from '@src/ROUTES';
-import type {ExpenseRuleForm} from '@src/types/form';
 import type {AppReview, BlockedFromConcierge, CustomStatusDraft, LoginList, Policy} from '@src/types/onyx';
 import type Login from '@src/types/onyx/Login';
 import type {Errors} from '@src/types/onyx/OnyxCommon';
@@ -525,16 +524,7 @@ function validateSecondaryLogin(
             },
         },
     ];
-    const successData: Array<
-        OnyxUpdate<
-            | typeof ONYXKEYS.LOGIN_LIST
-            | typeof ONYXKEYS.ACCOUNT
-            | typeof ONYXKEYS.SESSION
-            | typeof ONYXKEYS.PERSONAL_DETAILS_LIST
-            | typeof ONYXKEYS.COLLECTION.POLICY
-            | typeof ONYXKEYS.VALIDATE_ACTION_CODE
-        >
-    > = [
+    const successData: OnyxUpdate[] = [
         {
             onyxMethod: Onyx.METHOD.MERGE,
             key: ONYXKEYS.LOGIN_LIST,
@@ -624,7 +614,7 @@ function validateSecondaryLogin(
         }
     }
 
-    const failureData: Array<OnyxUpdate<typeof ONYXKEYS.LOGIN_LIST | typeof ONYXKEYS.ACCOUNT | typeof ONYXKEYS.VALIDATE_ACTION_CODE>> = [
+    const failureData: OnyxUpdate[] = [
         {
             onyxMethod: Onyx.METHOD.MERGE,
             key: ONYXKEYS.LOGIN_LIST,
@@ -1394,10 +1384,10 @@ function dismissReferralBanner(type: ValueOf<typeof CONST.REFERRAL_PROGRAM.CONTE
 function setNameValuePair(name: OnyxKey, value: SetNameValuePairParams['value'], revertedValue: SetNameValuePairParams['value'], shouldRevertValue = true) {
     const parameters: SetNameValuePairParams = {
         name,
-        value: typeof value === 'object' && value != null ? JSON.stringify(value) : value,
+        value,
     };
 
-    const optimisticData: Array<OnyxUpdate<typeof name>> = [
+    const optimisticData: OnyxUpdate[] = [
         // @ts-expect-error - will be solved in https://github.com/Expensify/App/issues/73830
         {
             onyxMethod: Onyx.METHOD.MERGE,
@@ -1407,7 +1397,7 @@ function setNameValuePair(name: OnyxKey, value: SetNameValuePairParams['value'],
     ];
 
     // @ts-expect-error - will be solved in https://github.com/Expensify/App/issues/73830
-    const failureData: Array<OnyxUpdate<typeof name>> | undefined = shouldRevertValue
+    const failureData: OnyxUpdate[] | undefined = shouldRevertValue
         ? [
               {
                   onyxMethod: Onyx.METHOD.MERGE,
@@ -1515,7 +1505,7 @@ function respondToProactiveAppReview(response: 'positive' | 'negative' | 'skip',
     // For positive/negative responses, create an optimistic Concierge message
     if (message && conciergeChatReportID && response !== 'skip') {
         const conciergeAccountID = CONST.ACCOUNT_ID.CONCIERGE;
-        const optimisticReportAction = ReportUtils.buildOptimisticAddCommentReportAction(message, undefined, conciergeAccountID, undefined, conciergeChatReportID);
+        const optimisticReportAction = ReportUtils.buildOptimisticAddCommentReportAction(message, undefined, conciergeAccountID, undefined, undefined, conciergeChatReportID);
         const optimisticReportActionID = optimisticReportAction.reportAction.reportActionID;
         const currentTime = DateUtils.getDBTime();
 
@@ -1596,7 +1586,7 @@ function respondToProactiveAppReview(response: 'positive' | 'negative' | 'skip',
  */
 function verifyAddSecondaryLoginCode(validateCode: string) {
     resetValidateActionCodeSent();
-    const optimisticData: Array<OnyxUpdate<typeof ONYXKEYS.PENDING_CONTACT_ACTION>> = [
+    const optimisticData: OnyxUpdate[] = [
         {
             onyxMethod: Onyx.METHOD.MERGE,
             key: ONYXKEYS.PENDING_CONTACT_ACTION,
@@ -1610,7 +1600,7 @@ function verifyAddSecondaryLoginCode(validateCode: string) {
         },
     ];
 
-    const successData: Array<OnyxUpdate<typeof ONYXKEYS.PENDING_CONTACT_ACTION>> = [
+    const successData: OnyxUpdate[] = [
         {
             onyxMethod: Onyx.METHOD.MERGE,
             key: ONYXKEYS.PENDING_CONTACT_ACTION,
@@ -1621,7 +1611,7 @@ function verifyAddSecondaryLoginCode(validateCode: string) {
         },
     ];
 
-    const failureData: Array<OnyxUpdate<typeof ONYXKEYS.PENDING_CONTACT_ACTION>> = [
+    const failureData: OnyxUpdate[] = [
         {
             onyxMethod: Onyx.METHOD.MERGE,
             key: ONYXKEYS.PENDING_CONTACT_ACTION,
@@ -1649,18 +1639,6 @@ function updateIsVerifiedValidateActionCode(isVerifiedValidateActionCode: boolea
     });
 }
 
-function setDraftRule(ruleData: Partial<ExpenseRuleForm>) {
-    Onyx.set(ONYXKEYS.FORMS.EXPENSE_RULE_FORM, ruleData);
-}
-
-function updateDraftRule(ruleData: Partial<ExpenseRuleForm>) {
-    Onyx.merge(ONYXKEYS.FORMS.EXPENSE_RULE_FORM, ruleData);
-}
-
-function clearDraftRule() {
-    Onyx.set(ONYXKEYS.FORMS.EXPENSE_RULE_FORM, null);
-}
-
 export {
     closeAccount,
     setServerErrorsOnForm,
@@ -1704,7 +1682,4 @@ export {
     respondToProactiveAppReview,
     verifyAddSecondaryLoginCode,
     updateIsVerifiedValidateActionCode,
-    setDraftRule,
-    updateDraftRule,
-    clearDraftRule,
 };
diff --git a/src/libs/actions/connections/NetSuiteCommands.ts b/src/libs/actions/connections/NetSuiteCommands.ts
index f1aa13731995..c50e2383cb3c 100644
--- a/src/libs/actions/connections/NetSuiteCommands.ts
+++ b/src/libs/actions/connections/NetSuiteCommands.ts
@@ -238,7 +238,7 @@ function updateNetSuiteSyncOptionsOnyxData<TSettingName extends keyof Connection
 }
 
 function updateNetSuiteSubsidiary(policyID: string, newSubsidiary: SubsidiaryParam, oldSubsidiary: SubsidiaryParam) {
-    const onyxData: OnyxData<typeof ONYXKEYS.COLLECTION.POLICY> = {
+    const onyxData: OnyxData = {
         optimisticData: [
             {
                 onyxMethod: Onyx.METHOD.MERGE,
@@ -329,7 +329,7 @@ function updateNetSuiteImportMapping<TMappingName extends keyof Connections['net
     if (!policyID) {
         return;
     }
-    const onyxData: OnyxData<typeof ONYXKEYS.COLLECTION.POLICY> = {
+    const onyxData: OnyxData = {
         optimisticData: [
             {
                 onyxMethod: Onyx.METHOD.MERGE,
@@ -456,7 +456,7 @@ function updateNetSuiteCustomersJobsMapping(
     if (!policyID) {
         return;
     }
-    const onyxData: OnyxData<typeof ONYXKEYS.COLLECTION.POLICY> = {
+    const onyxData: OnyxData = {
         optimisticData: [
             {
                 onyxMethod: Onyx.METHOD.MERGE,
diff --git a/src/libs/fileDownload/FileUtils.ts b/src/libs/fileDownload/FileUtils.ts
index 9a8381c14b7d..2e9aa6ba9e32 100644
--- a/src/libs/fileDownload/FileUtils.ts
+++ b/src/libs/fileDownload/FileUtils.ts
@@ -630,7 +630,7 @@ const getFileValidationErrorText = (
         case CONST.FILE_VALIDATION_ERRORS.WRONG_FILE_TYPE_MULTIPLE:
             return {
                 title: translate('attachmentPicker.someFilesCantBeUploaded'),
-                reason: translate('attachmentPicker.unsupportedFileType', additionalData.fileType ?? ''),
+                reason: translate('attachmentPicker.unsupportedFileType', {fileType: additionalData.fileType ?? ''}),
             };
         case CONST.FILE_VALIDATION_ERRORS.FILE_TOO_LARGE:
             return {
diff --git a/src/libs/telemetry/integrations.ts b/src/libs/telemetry/integrations.ts
index d9ea566de111..05aaf9340be8 100644
--- a/src/libs/telemetry/integrations.ts
+++ b/src/libs/telemetry/integrations.ts
@@ -1,5 +1,6 @@
 import * as SentryReact from '@sentry/react';
 import * as Sentry from '@sentry/react-native';
+import {Platform} from 'react-native';
 
 const navigationIntegration = Sentry.reactNavigationIntegration({
     enableTimeToInitialDisplay: true,
@@ -14,6 +15,14 @@ const tracingIntegration = Sentry.reactNativeTracingIntegration({
     shouldCreateSpanForRequest,
 });
 
+// Browser tracing integration crashes on mobile in release builds
+const browserTracingIntegration =
+    Platform.OS === 'android' || Platform.OS === 'ios'
+        ? null
+        : SentryReact.browserTracingIntegration({
+              shouldCreateSpanForRequest,
+          });
+
 const browserProfilingIntegration = SentryReact.browserProfilingIntegration();
 
-export {navigationIntegration, tracingIntegration, browserProfilingIntegration};
+export {navigationIntegration, tracingIntegration, browserTracingIntegration, browserProfilingIntegration};
diff --git a/src/libs/telemetry/trackAuthenticationError.ts b/src/libs/telemetry/trackAuthenticationError.ts
index c8b98ae010ff..08438b776e94 100644
--- a/src/libs/telemetry/trackAuthenticationError.ts
+++ b/src/libs/telemetry/trackAuthenticationError.ts
@@ -2,7 +2,7 @@ import * as Sentry from '@sentry/react-native';
 import CONST from '@src/CONST';
 
 type AuthenticationFunction = 'Authenticate' | 'reauthenticate';
-type AuthenticationErrorType = 'missing_params' | 'network_retry' | 'auth_failure' | 'unexpected_error';
+type AuthenticationErrorType = 'missing_params' | 'network_retry' | 'auth_failure';
 
 type AuthenticationErrorContext = {
     errorType: AuthenticationErrorType;
diff --git a/src/pages/AddPersonalBankAccountPage.tsx b/src/pages/AddPersonalBankAccountPage.tsx
index 23450f0069dd..5ab0ba760e33 100644
--- a/src/pages/AddPersonalBankAccountPage.tsx
+++ b/src/pages/AddPersonalBankAccountPage.tsx
@@ -1,4 +1,4 @@
-import React, {useContext, useEffect} from 'react';
+import React, {useCallback, useContext, useEffect} from 'react';
 import FullPageNotFoundView from '@components/BlockingViews/FullPageNotFoundView';
 import ConfirmationPage from '@components/ConfirmationPage';
 import HeaderWithBackButton from '@components/HeaderWithBackButton';
@@ -25,7 +25,7 @@ function AddPersonalBankAccountPage() {
     const topmostFullScreenRoute = navigationRef.current?.getRootState()?.routes.findLast((route) => isFullScreenName(route.name));
     const kycWallRef = useContext(KYCWallContext);
 
-    const goBack = () => {
+    const goBack = useCallback(() => {
         switch (topmostFullScreenRoute?.name) {
             case NAVIGATORS.SETTINGS_SPLIT_NAVIGATOR:
                 Navigation.goBack(ROUTES.SETTINGS_WALLET);
@@ -37,21 +37,23 @@ function AddPersonalBankAccountPage() {
                 Navigation.goBack();
                 break;
         }
-    };
+    }, [topmostFullScreenRoute?.name]);
 
-    const exitFlow = (shouldContinue = false) => {
-        const exitReportID = personalBankAccount?.exitReportID;
-        const onSuccessFallbackRoute = personalBankAccount?.onSuccessFallbackRoute ?? '';
+    const exitFlow = useCallback(
+        (shouldContinue = false) => {
+            const exitReportID = personalBankAccount?.exitReportID;
+            const onSuccessFallbackRoute = personalBankAccount?.onSuccessFallbackRoute ?? '';
 
-        if (exitReportID) {
-            Navigation.dismissModalWithReport({reportID: exitReportID});
-        } else if (shouldContinue && onSuccessFallbackRoute) {
-            continueSetup(kycWallRef, onSuccessFallbackRoute);
-        } else {
-            goBack();
-            clearPersonalBankAccount();
-        }
-    };
+            if (exitReportID) {
+                Navigation.dismissModalWithReport({reportID: exitReportID});
+            } else if (shouldContinue && onSuccessFallbackRoute) {
+                continueSetup(kycWallRef, onSuccessFallbackRoute);
+            } else {
+                goBack();
+            }
+        },
+        [personalBankAccount?.exitReportID, personalBankAccount?.onSuccessFallbackRoute, goBack, kycWallRef],
+    );
 
     useEffect(() => clearPersonalBankAccount, []);
 
diff --git a/src/pages/AddUnreportedExpense.tsx b/src/pages/AddUnreportedExpense.tsx
index 4e4e985505e4..0aec0a36a194 100644
--- a/src/pages/AddUnreportedExpense.tsx
+++ b/src/pages/AddUnreportedExpense.tsx
@@ -20,7 +20,7 @@ import getNonEmptyStringOnyxID from '@libs/getNonEmptyStringOnyxID';
 import interceptAnonymousUser from '@libs/interceptAnonymousUser';
 import type {AddUnreportedExpensesParamList} from '@libs/Navigation/types';
 import {canSubmitPerDiemExpenseFromWorkspace, getPerDiemCustomUnit} from '@libs/PolicyUtils';
-import {getTransactionDetails, isIOUReport} from '@libs/ReportUtils';
+import {getTransactionDetails} from '@libs/ReportUtils';
 import {shouldRestrictUserBillableActions} from '@libs/SubscriptionUtils';
 import tokenizedSearch from '@libs/tokenizedSearch';
 import {createUnreportedExpenses, getAmount, getCurrency, getDescription, getMerchant, isPerDiemRequest} from '@libs/TransactionUtils';
@@ -65,15 +65,8 @@ function AddUnreportedExpense({route}: AddUnreportedExpensePageType) {
                     return false;
                 }
 
-                const transactionAmount = getTransactionDetails(item)?.amount ?? 0;
-
                 // Negative values are not allowed for unreported expenses
-                if (transactionAmount < 0) {
-                    return false;
-                }
-
-                // Zero amount expenses are not allowed in IOU reports
-                if (isIOUReport(report) && transactionAmount === 0) {
+                if ((getTransactionDetails(item)?.amount ?? 0) < 0) {
                     return false;
                 }
 
@@ -88,7 +81,7 @@ function AddUnreportedExpense({route}: AddUnreportedExpensePageType) {
                 return true;
             });
         },
-        [policy, report],
+        [policy],
     );
 
     const [transactions = getEmptyArray<Transaction>()] = useOnyx(
@@ -128,7 +121,7 @@ function AddUnreportedExpense({route}: AddUnreportedExpensePageType) {
             const searchableFields: string[] = [];
 
             const merchant = getMerchant(transaction);
-            if (merchant !== CONST.TRANSACTION.PARTIAL_TRANSACTION_MERCHANT && merchant !== CONST.TRANSACTION.DEFAULT_MERCHANT) {
+            if (merchant !== CONST.TRANSACTION.PARTIAL_TRANSACTION_MERCHANT) {
                 searchableFields.push(merchant);
             }
 
diff --git a/src/pages/EditReportFieldPage.tsx b/src/pages/EditReportFieldPage.tsx
index 01132a56b44a..7a4b8631b446 100644
--- a/src/pages/EditReportFieldPage.tsx
+++ b/src/pages/EditReportFieldPage.tsx
@@ -181,7 +181,7 @@ function EditReportFieldPage({route}: EditReportFieldPageProps) {
                 />
             )}
 
-            {reportField.type === CONST.REPORT_FIELD_TYPES.FORMULA && !isReportFieldTitle && (
+            {reportField.type === CONST.REPORT_FIELD_TYPES.FORMULA && (
                 <EditReportFieldText
                     fieldName={reportField.name}
                     fieldKey={fieldKey}
diff --git a/src/pages/GroupChatNameEditPage.tsx b/src/pages/GroupChatNameEditPage.tsx
index a282eb1dc215..1cd289c4f84a 100644
--- a/src/pages/GroupChatNameEditPage.tsx
+++ b/src/pages/GroupChatNameEditPage.tsx
@@ -1,4 +1,4 @@
-import React from 'react';
+import React, {useCallback, useMemo} from 'react';
 import FormProvider from '@components/Form/FormProvider';
 import InputWrapper from '@components/Form/InputWrapper';
 import type {FormOnyxValues} from '@components/Form/types';
@@ -39,34 +39,43 @@ function GroupChatNameEditPage({report}: GroupChatNameEditPageProps) {
     const {translate, formatPhoneNumber} = useLocalize();
     const {inputCallbackRef} = useAutoFocusInput();
 
-    const existingReportName = report ? getGroupChatName(formatPhoneNumber, undefined, false, report) : getGroupChatName(formatPhoneNumber, groupChatDraft?.participants);
+    const existingReportName = useMemo(
+        () => (report ? getGroupChatName(formatPhoneNumber, undefined, false, report) : getGroupChatName(formatPhoneNumber, groupChatDraft?.participants)),
+        [formatPhoneNumber, groupChatDraft?.participants, report],
+    );
     // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
     const currentChatName = reportID ? existingReportName : groupChatDraft?.reportName || existingReportName;
 
-    const validate = (values: FormOnyxValues<typeof ONYXKEYS.FORMS.NEW_CHAT_NAME_FORM>): Errors => {
-        const errors: Errors = {};
-        const name = values[INPUT_IDS.NEW_CHAT_NAME] ?? '';
-        const nameLength = StringUtils.getUTF8ByteLength(name.trim());
-        if (nameLength > CONST.REPORT_NAME_LIMIT) {
-            errors.newChatName = translate('common.error.characterLimitExceedCounter', nameLength, CONST.REPORT_NAME_LIMIT);
-        }
+    const validate = useCallback(
+        (values: FormOnyxValues<typeof ONYXKEYS.FORMS.NEW_CHAT_NAME_FORM>): Errors => {
+            const errors: Errors = {};
+            const name = values[INPUT_IDS.NEW_CHAT_NAME] ?? '';
+            const nameLength = StringUtils.getUTF8ByteLength(name.trim());
+            if (nameLength > CONST.REPORT_NAME_LIMIT) {
+                errors.newChatName = translate('common.error.characterLimitExceedCounter', nameLength, CONST.REPORT_NAME_LIMIT);
+            }
 
-        return errors;
-    };
+            return errors;
+        },
+        [translate],
+    );
 
-    const editName = (values: FormOnyxValues<typeof ONYXKEYS.FORMS.NEW_CHAT_NAME_FORM>) => {
-        if (isUpdatingExistingReport) {
+    const editName = useCallback(
+        (values: FormOnyxValues<typeof ONYXKEYS.FORMS.NEW_CHAT_NAME_FORM>) => {
+            if (isUpdatingExistingReport) {
+                if (values[INPUT_IDS.NEW_CHAT_NAME] !== currentChatName) {
+                    updateChatName(reportID, report.reportName, values[INPUT_IDS.NEW_CHAT_NAME] ?? '', CONST.REPORT.CHAT_TYPE.GROUP);
+                }
+                Navigation.setNavigationActionToMicrotaskQueue(() => Navigation.goBack(ROUTES.REPORT_WITH_ID_DETAILS.getRoute(reportID)));
+                return;
+            }
             if (values[INPUT_IDS.NEW_CHAT_NAME] !== currentChatName) {
-                updateChatName(reportID, report.reportName, values[INPUT_IDS.NEW_CHAT_NAME] ?? '', CONST.REPORT.CHAT_TYPE.GROUP);
+                setGroupDraft({reportName: values[INPUT_IDS.NEW_CHAT_NAME]});
             }
-            Navigation.setNavigationActionToMicrotaskQueue(() => Navigation.goBack(ROUTES.REPORT_WITH_ID_DETAILS.getRoute(reportID)));
-            return;
-        }
-        if (values[INPUT_IDS.NEW_CHAT_NAME] !== currentChatName) {
-            setGroupDraft({reportName: values[INPUT_IDS.NEW_CHAT_NAME]});
-        }
-        Navigation.setNavigationActionToMicrotaskQueue(() => Navigation.goBack(ROUTES.NEW_CHAT_CONFIRM));
-    };
+            Navigation.setNavigationActionToMicrotaskQueue(() => Navigation.goBack(ROUTES.NEW_CHAT_CONFIRM));
+        },
+        [isUpdatingExistingReport, currentChatName, reportID, report?.reportName],
+    );
 
     return (
         <ScreenWrapper
diff --git a/src/pages/MissingPersonalDetails/substeps/Address.tsx b/src/pages/MissingPersonalDetails/substeps/Address.tsx
index 289982a3a277..d718058ad04e 100644
--- a/src/pages/MissingPersonalDetails/substeps/Address.tsx
+++ b/src/pages/MissingPersonalDetails/substeps/Address.tsx
@@ -70,7 +70,7 @@ function AddressStep({isEditing, onNext, personalDetailsValues}: CustomSubStepPr
             if (countrySpecificZipRegex) {
                 if (!countrySpecificZipRegex.test(values[INPUT_IDS.ZIP_POST_CODE]?.trim().toUpperCase())) {
                     if (isRequiredFulfilled(values[INPUT_IDS.ZIP_POST_CODE]?.trim())) {
-                        errors[INPUT_IDS.ZIP_POST_CODE] = translate('privatePersonalDetails.error.incorrectZipFormat', countryZipFormat);
+                        errors[INPUT_IDS.ZIP_POST_CODE] = translate('privatePersonalDetails.error.incorrectZipFormat', {zipFormat: countryZipFormat});
                     } else {
                         errors[INPUT_IDS.ZIP_POST_CODE] = translate('common.error.fieldRequired');
                     }
diff --git a/src/pages/MultifactorAuthentication/BiometricsTestPage.tsx b/src/pages/MultifactorAuthentication/BiometricsTestPage.tsx
deleted file mode 100644
index 048703a98ab6..000000000000
--- a/src/pages/MultifactorAuthentication/BiometricsTestPage.tsx
+++ /dev/null
@@ -1,26 +0,0 @@
-import React, {useEffect} from 'react';
-import FullScreenLoadingIndicator from '@components/FullscreenLoadingIndicator';
-import ScreenWrapper from '@components/ScreenWrapper';
-import Navigation from '@libs/Navigation/Navigation';
-import ROUTES from '@src/ROUTES';
-
-const LOADING_DELAY_MS = 400;
-
-function MultifactorAuthenticationBiometricsTestPage() {
-    useEffect(() => {
-        // Show a short loading state so the RHP transition feels smooth, then move to the magic code flow
-        const timeoutId = setTimeout(() => Navigation.navigate(ROUTES.MULTIFACTOR_AUTHENTICATION_MAGIC_CODE), LOADING_DELAY_MS);
-
-        return () => clearTimeout(timeoutId);
-    }, []);
-
-    return (
-        <ScreenWrapper testID={MultifactorAuthenticationBiometricsTestPage.displayName}>
-            <FullScreenLoadingIndicator />
-        </ScreenWrapper>
-    );
-}
-
-MultifactorAuthenticationBiometricsTestPage.displayName = 'MultifactorAuthenticationBiometricsTestPage';
-
-export default MultifactorAuthenticationBiometricsTestPage;
diff --git a/src/pages/MultifactorAuthentication/NotificationPage.tsx b/src/pages/MultifactorAuthentication/NotificationPage.tsx
deleted file mode 100644
index e961ee56c3c8..000000000000
--- a/src/pages/MultifactorAuthentication/NotificationPage.tsx
+++ /dev/null
@@ -1,93 +0,0 @@
-import React from 'react';
-import {View} from 'react-native';
-import BlockingView from '@components/BlockingViews/BlockingView';
-import Button from '@components/Button';
-import HeaderWithBackButton from '@components/HeaderWithBackButton';
-import {loadIllustration} from '@components/Icon/IllustrationLoader';
-import ScreenWrapper from '@components/ScreenWrapper';
-import {useMemoizedLazyAsset} from '@hooks/useLazyAsset';
-import useLocalize from '@hooks/useLocalize';
-import useThemeStyles from '@hooks/useThemeStyles';
-import Navigation from '@libs/Navigation/Navigation';
-import type {PlatformStackScreenProps} from '@libs/Navigation/PlatformStackNavigation/types';
-import type {MultifactorAuthenticationParamList} from '@libs/Navigation/types';
-import variables from '@styles/variables';
-import CONST from '@src/CONST';
-import type {TranslationPaths} from '@src/languages/types';
-import type SCREENS from '@src/SCREENS';
-
-// TODO: this config will be part of the scenario configuration, the current implementation is for testing purposes (https://github.com/Expensify/App/issues/79373)
-const mockedConfigSuccess = {
-    headerTitle: 'multifactorAuthentication.biometricsTest.biometricsTest',
-    title: 'multifactorAuthentication.biometricsTest.authenticationSuccessful',
-    description: 'multifactorAuthentication.biometricsTest.successfullyAuthenticatedUsing',
-} as const satisfies Record<string, TranslationPaths>;
-
-// TODO: this config will be part of the scenario configuration, the current implementation is for testing purposes (https://github.com/Expensify/App/issues/79373)
-const mockedConfigFailure = {
-    headerTitle: 'multifactorAuthentication.biometricsTest.biometricsTest',
-    title: 'multifactorAuthentication.oops',
-    description: 'multifactorAuthentication.biometricsTest.yourAttemptWasUnsuccessful',
-} as const satisfies Record<string, TranslationPaths>;
-
-type MultifactorAuthenticationNotificationPageProps = PlatformStackScreenProps<MultifactorAuthenticationParamList, typeof SCREENS.MULTIFACTOR_AUTHENTICATION.NOTIFICATION>;
-
-function MultifactorAuthenticationNotificationPage({route}: MultifactorAuthenticationNotificationPageProps) {
-    const {translate} = useLocalize();
-    const styles = useThemeStyles();
-    const onGoBackPress = () => {
-        Navigation.dismissModal();
-    };
-
-    const isSuccessNotification = route.params.notificationType === CONST.MULTIFACTOR_AUTHENTICATION_NOTIFICATION_TYPE.SUCCESS;
-
-    let headerTitle = translate(mockedConfigFailure.headerTitle);
-    let title = translate(mockedConfigFailure.title);
-    let description = translate(mockedConfigFailure.description);
-
-    if (isSuccessNotification) {
-        headerTitle = translate(mockedConfigSuccess.headerTitle);
-        title = translate(mockedConfigSuccess.title);
-        // TODO: Replace hardcoded 'FaceID' with the actual authentication type (e.g., 'FaceID', 'TouchID', 'Fingerprint')
-        // once the MFA context provides the auth method used. This will require adding authType to route params and to CONST.
-        description = translate(mockedConfigSuccess.description, {authType: 'FaceID'});
-    }
-
-    const {asset: icon} = useMemoizedLazyAsset(() => loadIllustration(isSuccessNotification ? 'OpenPadlock' : 'HumptyDumpty'));
-
-    return (
-        <ScreenWrapper testID={MultifactorAuthenticationNotificationPage.displayName}>
-            <HeaderWithBackButton
-                title={headerTitle}
-                onBackButtonPress={onGoBackPress}
-                shouldShowBackButton
-            />
-            <View style={styles.flex1}>
-                <BlockingView
-                    icon={icon}
-                    contentFitImage="fill"
-                    iconWidth={isSuccessNotification ? variables.openPadlockWidth : variables.humptyDumptyWidth}
-                    iconHeight={isSuccessNotification ? variables.openPadlockHeight : variables.humptyDumptyHeight}
-                    title={title}
-                    titleStyles={styles.mb2}
-                    subtitle={description}
-                    subtitleStyle={styles.textSupporting}
-                    containerStyle={styles.ph5}
-                    testID={MultifactorAuthenticationNotificationPage.displayName}
-                />
-            </View>
-            <View style={[styles.flexRow, styles.m5, styles.mt0]}>
-                <Button
-                    success
-                    style={styles.flex1}
-                    onPress={onGoBackPress}
-                    text={translate('common.buttonConfirm')}
-                />
-            </View>
-        </ScreenWrapper>
-    );
-}
-
-MultifactorAuthenticationNotificationPage.displayName = 'MultifactorAuthenticationNotificationPage';
-
-export default MultifactorAuthenticationNotificationPage;
diff --git a/src/pages/MultifactorAuthentication/PromptPage.tsx b/src/pages/MultifactorAuthentication/PromptPage.tsx
deleted file mode 100644
index df649a215be6..000000000000
--- a/src/pages/MultifactorAuthentication/PromptPage.tsx
+++ /dev/null
@@ -1,83 +0,0 @@
-import React, {useState} from 'react';
-import FullPageOfflineBlockingView from '@components/BlockingViews/FullPageOfflineBlockingView';
-import Button from '@components/Button';
-import FixedFooter from '@components/FixedFooter';
-import HeaderWithBackButton from '@components/HeaderWithBackButton';
-import LottieAnimations from '@components/LottieAnimations';
-import MultifactorAuthenticationPromptContent from '@components/MultifactorAuthentication/PromptContent';
-import MultifactorAuthenticationTriggerCancelConfirmModal from '@components/MultifactorAuthentication/TriggerCancelConfirmModal';
-import ScreenWrapper from '@components/ScreenWrapper';
-import useLocalize from '@hooks/useLocalize';
-import useThemeStyles from '@hooks/useThemeStyles';
-import Navigation from '@navigation/Navigation';
-import CONST from '@src/CONST';
-import type {TranslationPaths} from '@src/languages/types';
-import ROUTES from '@src/ROUTES';
-
-const mockedConfig = {
-    title: 'multifactorAuthentication.verifyYourself.biometrics',
-    subtitle: 'multifactorAuthentication.enableQuickVerification.biometrics',
-} as const satisfies Record<string, TranslationPaths>;
-
-function MultifactorAuthenticationPromptPage() {
-    const {translate} = useLocalize();
-    const styles = useThemeStyles();
-
-    const [isConfirmModalVisible, setConfirmModalVisibility] = useState(false);
-
-    const onConfirm = () => {
-        // Temporary navigation, expected behavior: let the MultifactorAuthentication know that the soft prompt was accepted
-        Navigation.navigate(ROUTES.MULTIFACTOR_AUTHENTICATION_NOTIFICATION.getRoute(CONST.MULTIFACTOR_AUTHENTICATION_NOTIFICATION_TYPE.SUCCESS));
-    };
-
-    const showConfirmModal = () => {
-        setConfirmModalVisibility(true);
-    };
-
-    const hideConfirmModal = () => {
-        setConfirmModalVisibility(false);
-    };
-
-    const cancelFlow = () => {
-        if (!isConfirmModalVisible) {
-            return;
-        }
-
-        hideConfirmModal();
-        // Temporary navigation, expected behavior: trigger the failure from the MultifactorAuthenticationContext
-        Navigation.navigate(ROUTES.MULTIFACTOR_AUTHENTICATION_NOTIFICATION.getRoute(CONST.MULTIFACTOR_AUTHENTICATION_NOTIFICATION_TYPE.FAILURE));
-    };
-
-    return (
-        <ScreenWrapper testID={MultifactorAuthenticationPromptPage.displayName}>
-            <HeaderWithBackButton
-                title={translate('multifactorAuthentication.letsVerifyItsYou')}
-                onBackButtonPress={showConfirmModal}
-                shouldShowBackButton
-            />
-            <FullPageOfflineBlockingView>
-                <MultifactorAuthenticationPromptContent
-                    animation={LottieAnimations.Fingerprint}
-                    title={mockedConfig.title}
-                    subtitle={mockedConfig.subtitle}
-                />
-                <FixedFooter style={[styles.flexColumn, styles.gap3]}>
-                    <Button
-                        success
-                        onPress={onConfirm}
-                        text={translate('common.buttonConfirm')}
-                    />
-                </FixedFooter>
-                <MultifactorAuthenticationTriggerCancelConfirmModal
-                    isVisible={isConfirmModalVisible}
-                    onConfirm={cancelFlow}
-                    onCancel={hideConfirmModal}
-                />
-            </FullPageOfflineBlockingView>
-        </ScreenWrapper>
-    );
-}
-
-MultifactorAuthenticationPromptPage.displayName = 'MultifactorAuthenticationPromptPage';
-
-export default MultifactorAuthenticationPromptPage;
diff --git a/src/pages/MultifactorAuthentication/ValidateCodePage.tsx b/src/pages/MultifactorAuthentication/ValidateCodePage.tsx
deleted file mode 100644
index ddf857df5c39..000000000000
--- a/src/pages/MultifactorAuthentication/ValidateCodePage.tsx
+++ /dev/null
@@ -1,208 +0,0 @@
-import React, {useEffect, useRef, useState} from 'react';
-import {View} from 'react-native';
-import FullPageOfflineBlockingView from '@components/BlockingViews/FullPageOfflineBlockingView';
-import Button from '@components/Button';
-import FormHelpMessage from '@components/FormHelpMessage';
-import HeaderWithBackButton from '@components/HeaderWithBackButton';
-import MagicCodeInput from '@components/MagicCodeInput';
-import type {MagicCodeInputHandle} from '@components/MagicCodeInput';
-import MultifactorAuthenticationValidateCodeResendButton from '@components/MultifactorAuthentication/ValidateCodeResendButton';
-import type {MultifactorAuthenticationValidateCodeResendButtonHandle} from '@components/MultifactorAuthentication/ValidateCodeResendButton';
-import ScreenWrapper from '@components/ScreenWrapper';
-import Text from '@components/Text';
-import useLocalize from '@hooks/useLocalize';
-import useNetwork from '@hooks/useNetwork';
-import useOnyx from '@hooks/useOnyx';
-import useThemeStyles from '@hooks/useThemeStyles';
-import AccountUtils from '@libs/AccountUtils';
-import {getLatestErrorMessage} from '@libs/ErrorUtils';
-import {isValidValidateCode} from '@libs/ValidationUtils';
-import Navigation from '@navigation/Navigation';
-import {clearAccountMessages} from '@userActions/Session';
-import {resendValidateCode} from '@userActions/User';
-import CONST from '@src/CONST';
-import type {TranslationPaths} from '@src/languages/types';
-import ONYXKEYS from '@src/ONYXKEYS';
-import ROUTES from '@src/ROUTES';
-import {isEmptyObject} from '@src/types/utils/EmptyObject';
-
-type FormError = {
-    inputCode?: TranslationPaths;
-};
-
-function MultifactorAuthenticationValidateCodePage() {
-    const {translate} = useLocalize();
-    const {isOffline} = useNetwork();
-    const styles = useThemeStyles();
-
-    // Onyx data
-    const [account] = useOnyx(ONYXKEYS.ACCOUNT, {canBeMissing: true});
-    const [session] = useOnyx(ONYXKEYS.SESSION, {canBeMissing: false});
-
-    const contactMethod = account?.primaryLogin ?? '';
-
-    // Local state
-    const [inputCode, setInputCode] = useState('');
-    const [formError, setFormError] = useState<FormError>({});
-    const [canShowError, setCanShowError] = useState<boolean>(false);
-
-    // Refs
-    const inputRef = useRef<MagicCodeInputHandle>(null);
-    const resendButtonRef = useRef<MultifactorAuthenticationValidateCodeResendButtonHandle>(null);
-    const hasClearedInitialErrorsRef = useRef(false);
-
-    // Derived state
-    const hasError = !!account && !isEmptyObject(account?.errors);
-    const isValidateCodeFormSubmitting = AccountUtils.isValidateCodeFormSubmitting(account);
-    const shouldDisableResendCode = isOffline ?? account?.isLoading;
-
-    // Auto-blur on error
-    useEffect(() => {
-        if (!(inputRef.current && hasError && (session?.autoAuthState === CONST.AUTO_AUTH_STATE.FAILED || account?.isLoading))) {
-            return;
-        }
-        inputRef.current.blur();
-    }, [account?.isLoading, session?.autoAuthState, hasError]);
-
-    // Clear input when code is reset
-    useEffect(() => {
-        if (!inputRef.current || inputCode.length > 0) {
-            return;
-        }
-        inputRef.current.clear();
-    }, [inputCode.length]);
-
-    // Clear any pre-existing errors on mount
-    useEffect(() => {
-        if (hasClearedInitialErrorsRef.current || !account?.errors) {
-            return;
-        }
-        hasClearedInitialErrorsRef.current = true;
-        clearAccountMessages();
-    }, [account?.errors]);
-
-    // Reset formError when hasError changes
-    useEffect(() => {
-        if (!hasError) {
-            return;
-        }
-        setFormError({});
-    }, [hasError]);
-
-    /**
-     * Handle code input and clear formError upon text change
-     */
-    const onCodeInput = (text: string) => {
-        setFormError({});
-        setCanShowError(false);
-        setInputCode(text);
-
-        // Clear backend errors
-        if (account?.errors) {
-            clearAccountMessages();
-        }
-    };
-
-    const resendValidationCode = () => {
-        resendValidateCode(contactMethod);
-        inputRef.current?.clear();
-        setInputCode('');
-        setFormError({});
-        setCanShowError(false);
-        resendButtonRef.current?.resetCountdown();
-    };
-
-    /**
-     * Validate and submit form
-     */
-    const validateAndSubmitForm = () => {
-        // Check if already loading
-        if (account?.isLoading) {
-            return;
-        }
-
-        // Clear backend errors before validation
-        if (account?.errors) {
-            clearAccountMessages();
-        }
-
-        setCanShowError(true);
-
-        // Blur input
-        if (inputRef.current) {
-            inputRef.current.blur();
-        }
-
-        // Validate input
-        if (!inputCode.trim()) {
-            setFormError({inputCode: 'validateCodeForm.error.pleaseFillMagicCode'});
-            return;
-        }
-
-        if (!isValidValidateCode(inputCode)) {
-            setFormError({inputCode: 'validateCodeForm.error.incorrectMagicCode'});
-            return;
-        }
-
-        // Clear errors before submit
-        setFormError({});
-
-        // Temporary navigation, expected behavior: trigger submit from the MultifactorAuthenticationContext
-        // 'enable-biometrics' is a type of the MultifactorAuthentication prompt
-        // will be added as a part of scenario config in another PR to make it complacent with CONSISTENCY-2 (docs)
-        Navigation.navigate(ROUTES.MULTIFACTOR_AUTHENTICATION_PROMPT.getRoute('enable-biometrics'));
-    };
-
-    const onGoBackPress = () => {
-        // Temporary navigation, expected behavior: trigger onBack from the MultifactorAuthenticationContext
-        // Close the RHP instead of returning to the invisible biometrics test screen
-        Navigation.dismissModal();
-    };
-
-    return (
-        <ScreenWrapper testID={MultifactorAuthenticationValidateCodePage.displayName}>
-            <HeaderWithBackButton
-                title={translate('multifactorAuthentication.letsVerifyItsYou')}
-                onBackButtonPress={onGoBackPress}
-                shouldShowBackButton
-            />
-            <FullPageOfflineBlockingView>
-                <Text style={[styles.m5, styles.mt3, styles.textNormal]}>{translate('contacts.enterMagicCode', contactMethod)}</Text>
-                <View style={[styles.mh5]}>
-                    <MagicCodeInput
-                        autoComplete="one-time-code"
-                        name="multifactorAuthenticationValidateCode"
-                        value={inputCode}
-                        onChangeText={onCodeInput}
-                        onFulfill={validateAndSubmitForm}
-                        errorText={canShowError && formError.inputCode ? translate(formError.inputCode) : ''}
-                        hasError={hasError}
-                        ref={inputRef}
-                        maxLength={CONST.MAGIC_CODE_LENGTH}
-                    />
-                    {hasError && <FormHelpMessage message={getLatestErrorMessage(account)} />}
-                    <MultifactorAuthenticationValidateCodeResendButton
-                        ref={resendButtonRef}
-                        shouldDisableResendCode={shouldDisableResendCode}
-                        hasError={hasError}
-                        resendButtonText="validateCodeForm.magicCodeNotReceived"
-                        onResendValidationCode={resendValidationCode}
-                    />
-                </View>
-                <Button
-                    success
-                    large
-                    style={[styles.w100, styles.p5, styles.mtAuto]}
-                    onPress={validateAndSubmitForm}
-                    text={translate('common.verify')}
-                    isLoading={isValidateCodeFormSubmitting}
-                    isDisabled={isOffline}
-                />
-            </FullPageOfflineBlockingView>
-        </ScreenWrapper>
-    );
-}
-
-MultifactorAuthenticationValidateCodePage.displayName = 'MultifactorAuthenticationValidateCodePage';
-
-export default MultifactorAuthenticationValidateCodePage;
diff --git a/src/pages/NewChatPage.tsx b/src/pages/NewChatPage.tsx
index e60006e53a29..2f1915763819 100755
--- a/src/pages/NewChatPage.tsx
+++ b/src/pages/NewChatPage.tsx
@@ -3,7 +3,7 @@ import reportsSelector from '@selectors/Attributes';
 import isEmpty from 'lodash/isEmpty';
 import reject from 'lodash/reject';
 import type {Ref} from 'react';
-import React, {useEffect, useImperativeHandle, useRef, useState} from 'react';
+import React, {useCallback, useEffect, useImperativeHandle, useMemo, useRef, useState} from 'react';
 import {Keyboard} from 'react-native';
 import Button from '@components/Button';
 import {PressableWithFeedback} from '@components/Pressable';
@@ -85,7 +85,6 @@ function useOptions() {
     });
 
     const [nvpDismissedProductTraining] = useOnyx(ONYXKEYS.NVP_DISMISSED_PRODUCT_TRAINING, {canBeMissing: true});
-    const [allPolicies] = useOnyx(ONYXKEYS.COLLECTION.POLICY, {canBeMissing: true});
 
     const reports = listOptions?.reports ?? [];
     const personalDetails = listOptions?.personalDetails ?? [];
@@ -95,7 +94,6 @@ function useOptions() {
             reports,
             personalDetails: personalDetails.concat(contacts),
         },
-        allPolicies,
         draftComments,
         nvpDismissedProductTraining,
         loginList,
@@ -126,13 +124,15 @@ function useOptions() {
         selectedOptions.some((participant) => getPersonalDetailSearchTerms(participant).join(' ').toLowerCase?.().includes(cleanSearchTerm)),
     );
 
-    useFocusEffect(() => {
-        focusTimeoutRef.current = setTimeout(() => {
-            setDidScreenTransitionEnd(true);
-        }, CONST.ANIMATED_TRANSITION);
+    useFocusEffect(
+        useCallback(() => {
+            focusTimeoutRef.current = setTimeout(() => {
+                setDidScreenTransitionEnd(true);
+            }, CONST.ANIMATED_TRANSITION);
 
-        return () => focusTimeoutRef.current && clearTimeout(focusTimeoutRef.current);
-    });
+            return () => focusTimeoutRef.current && clearTimeout(focusTimeoutRef.current);
+        }, []),
+    );
 
     useEffect(() => {
         if (!debouncedSearchTerm.length) {
@@ -251,174 +251,186 @@ function NewChatPage({ref}: NewChatPageProps) {
         areOptionsInitialized,
     } = useOptions();
 
-    const sections: Section[] = [];
-    let firstKeyForList = '';
+    const [sections, firstKeyForList] = useMemo(() => {
+        const sectionsList: Section[] = [];
+        let firstKey = '';
+
+        const formatResults = formatSectionsFromSearchTerm(
+            debouncedSearchTerm,
+            selectedOptions as OptionData[],
+            recentReports,
+            personalDetails,
+            undefined,
+            undefined,
+            undefined,
+            reportAttributesDerived,
+        );
+        sectionsList.push(formatResults.section);
 
-    const formatResults = formatSectionsFromSearchTerm(
-        debouncedSearchTerm,
-        selectedOptions as OptionData[],
-        recentReports,
-        personalDetails,
-        undefined,
-        undefined,
-        undefined,
-        reportAttributesDerived,
-    );
-    sections.push(formatResults.section);
+        if (!firstKey) {
+            firstKey = getFirstKeyForList(formatResults.section.data);
+        }
 
-    if (!firstKeyForList) {
-        firstKeyForList = getFirstKeyForList(formatResults.section.data);
-    }
+        sectionsList.push({
+            title: translate('common.recents'),
+            data: selectedOptions.length ? recentReports.filter((option) => !option.isSelfDM) : recentReports,
+            shouldShow: !isEmpty(recentReports),
+        });
+        if (!firstKey) {
+            firstKey = getFirstKeyForList(recentReports);
+        }
 
-    sections.push({
-        title: translate('common.recents'),
-        data: selectedOptions.length ? recentReports.filter((option) => !option.isSelfDM) : recentReports,
-        shouldShow: !isEmpty(recentReports),
-    });
-    if (!firstKeyForList) {
-        firstKeyForList = getFirstKeyForList(recentReports);
-    }
-
-    sections.push({
-        title: translate('common.contacts'),
-        data: personalDetails,
-        shouldShow: !isEmpty(personalDetails),
-    });
-    if (!firstKeyForList) {
-        firstKeyForList = getFirstKeyForList(personalDetails);
-    }
-
-    if (userToInvite) {
-        sections.push({
-            title: undefined,
-            data: [userToInvite],
-            shouldShow: true,
+        sectionsList.push({
+            title: translate('common.contacts'),
+            data: personalDetails,
+            shouldShow: !isEmpty(personalDetails),
         });
-        if (!firstKeyForList) {
-            firstKeyForList = getFirstKeyForList([userToInvite]);
+        if (!firstKey) {
+            firstKey = getFirstKeyForList(personalDetails);
+        }
+
+        if (userToInvite) {
+            sectionsList.push({
+                title: undefined,
+                data: [userToInvite],
+                shouldShow: true,
+            });
+            if (!firstKey) {
+                firstKey = getFirstKeyForList([userToInvite]);
+            }
         }
-    }
+
+        return [sectionsList, firstKey];
+    }, [debouncedSearchTerm, selectedOptions, recentReports, personalDetails, reportAttributesDerived, translate, userToInvite]);
 
     /**
      * Removes a selected option from list if already selected. If not already selected add this option to the list.
      */
-    const toggleOption = (option: ListItem & Partial<OptionData>) => {
-        const isOptionInList = !!option.isSelected;
+    const toggleOption = useCallback(
+        (option: ListItem & Partial<OptionData>) => {
+            const isOptionInList = !!option.isSelected;
 
-        let newSelectedOptions: SelectedOption[];
+            let newSelectedOptions: SelectedOption[];
 
-        if (isOptionInList) {
-            newSelectedOptions = reject(selectedOptions, (selectedOption) => selectedOption.login === option.login);
-        } else {
-            newSelectedOptions = [...selectedOptions, {...option, isSelected: true, selected: true, reportID: option.reportID}];
-            selectionListRef?.current?.scrollToIndex(0, true);
-        }
+            if (isOptionInList) {
+                newSelectedOptions = reject(selectedOptions, (selectedOption) => selectedOption.login === option.login);
+            } else {
+                newSelectedOptions = [...selectedOptions, {...option, isSelected: true, selected: true, reportID: option.reportID}];
+                selectionListRef?.current?.scrollToIndex(0, true);
+            }
 
-        selectionListRef?.current?.clearInputAfterSelect?.();
-        if (!canUseTouchScreen()) {
-            selectionListRef.current?.focusTextInput();
-        }
-        setSelectedOptions(newSelectedOptions);
-
-        if (personalData?.login && personalData?.accountID) {
-            const participants: SelectedParticipant[] = [
-                ...newSelectedOptions.map((selectedOption) => ({
-                    login: selectedOption.login,
-                    accountID: selectedOption.accountID ?? CONST.DEFAULT_NUMBER_ID,
-                })),
-                {
-                    login: personalData.login,
-                    accountID: personalData.accountID,
-                },
-            ];
-            setGroupDraft({participants});
-        }
-    };
+            selectionListRef?.current?.clearInputAfterSelect?.();
+            if (!canUseTouchScreen()) {
+                selectionListRef.current?.focusTextInput();
+            }
+            setSelectedOptions(newSelectedOptions);
+
+            if (personalData?.login && personalData?.accountID) {
+                const participants: SelectedParticipant[] = [
+                    ...newSelectedOptions.map((selectedOption) => ({
+                        login: selectedOption.login,
+                        accountID: selectedOption.accountID ?? CONST.DEFAULT_NUMBER_ID,
+                    })),
+                    {
+                        login: personalData.login,
+                        accountID: personalData.accountID,
+                    },
+                ];
+                setGroupDraft({participants});
+            }
+        },
+        [selectedOptions, setSelectedOptions, personalData?.accountID, personalData?.login],
+    );
 
     /**
      * If there are selected options already then it will toggle the option otherwise
      * creates a new 1:1 chat with the option and the current user,
      * or navigates to the existing chat if one with those participants already exists.
      */
-    const selectOption = (option?: Option) => {
-        if (option?.isSelfDM) {
-            if (!option.reportID) {
-                Navigation.dismissModal();
+    const selectOption = useCallback(
+        (option?: Option) => {
+            if (option?.isSelfDM) {
+                if (!option.reportID) {
+                    Navigation.dismissModal();
+                    return;
+                }
+                Navigation.dismissModalWithReport({reportID: option.reportID});
                 return;
             }
-            Navigation.dismissModalWithReport({reportID: option.reportID});
-            return;
-        }
 
-        if (selectedOptions.length && option) {
-            // Prevent excluded emails from being added to groups
-            if (option?.login && excludedGroupEmails.has(option.login)) {
+            if (selectedOptions.length && option) {
+                // Prevent excluded emails from being added to groups
+                if (option?.login && excludedGroupEmails.has(option.login)) {
+                    return;
+                }
+                toggleOption(option);
                 return;
             }
-            toggleOption(option);
-            return;
-        }
 
-        if (option?.reportID) {
-            Navigation.dismissModal({
-                callback: () => {
-                    Navigation.navigate(ROUTES.REPORT_WITH_ID.getRoute(option?.reportID));
-                },
-            });
-            return;
-        }
+            if (option?.reportID) {
+                Navigation.dismissModal({
+                    callback: () => {
+                        Navigation.navigate(ROUTES.REPORT_WITH_ID.getRoute(option?.reportID));
+                    },
+                });
+                return;
+            }
 
-        let login = '';
+            let login = '';
 
-        if (option?.login) {
-            login = option.login;
-        } else if (selectedOptions.length === 1) {
-            login = selectedOptions.at(0)?.login ?? '';
-        }
-        if (!login) {
-            Log.warn('Tried to create chat with empty login');
-            return;
-        }
-        KeyboardUtils.dismiss().then(() => {
-            singleExecution(() => navigateToAndOpenReport([login]))();
-        });
-    };
+            if (option?.login) {
+                login = option.login;
+            } else if (selectedOptions.length === 1) {
+                login = selectedOptions.at(0)?.login ?? '';
+            }
+            if (!login) {
+                Log.warn('Tried to create chat with empty login');
+                return;
+            }
+            KeyboardUtils.dismiss().then(() => {
+                singleExecution(() => navigateToAndOpenReport([login]))();
+            });
+        },
+        [selectedOptions, toggleOption, singleExecution],
+    );
 
-    const itemRightSideComponent = (item: ListItem & Option, isFocused?: boolean) => {
-        if (!!item.isSelfDM || (item.login && excludedGroupEmails.has(item.login)) || !item.login) {
-            return null;
-        }
+    const itemRightSideComponent = useCallback(
+        (item: ListItem & Option, isFocused?: boolean) => {
+            if (!!item.isSelfDM || (item.login && excludedGroupEmails.has(item.login)) || !item.login) {
+                return null;
+            }
 
-        if (item.isSelected) {
+            if (item.isSelected) {
+                return (
+                    <PressableWithFeedback
+                        onPress={() => toggleOption(item)}
+                        disabled={item.isDisabled}
+                        role={CONST.ROLE.BUTTON}
+                        accessibilityLabel={CONST.ROLE.BUTTON}
+                        style={[styles.flexRow, styles.alignItemsCenter, styles.ml5, styles.optionSelectCircle]}
+                    >
+                        <SelectCircle
+                            isChecked={item.isSelected}
+                            selectCircleStyles={styles.ml0}
+                        />
+                    </PressableWithFeedback>
+                );
+            }
+            const buttonInnerStyles = isFocused ? styles.buttonDefaultHovered : {};
             return (
-                <PressableWithFeedback
+                <Button
                     onPress={() => toggleOption(item)}
-                    disabled={item.isDisabled}
-                    role={CONST.ROLE.CHECKBOX}
-                    accessibilityLabel={item.text ?? ''}
-                    accessibilityState={{checked: item.isSelected}}
-                    style={[styles.flexRow, styles.alignItemsCenter, styles.ml5, styles.optionSelectCircle]}
-                >
-                    <SelectCircle
-                        isChecked={item.isSelected}
-                        selectCircleStyles={styles.ml0}
-                    />
-                </PressableWithFeedback>
+                    style={[styles.pl2]}
+                    text={translate('newChatPage.addToGroup')}
+                    innerStyles={buttonInnerStyles}
+                    small
+                />
             );
-        }
-        const buttonInnerStyles = isFocused ? styles.buttonDefaultHovered : {};
-        return (
-            <Button
-                onPress={() => toggleOption(item)}
-                style={[styles.pl2]}
-                text={translate('newChatPage.addToGroup')}
-                innerStyles={buttonInnerStyles}
-                small
-            />
-        );
-    };
+        },
+        [toggleOption, styles.alignItemsCenter, styles.buttonDefaultHovered, styles.flexRow, styles.ml0, styles.ml5, styles.optionSelectCircle, styles.pl2, translate],
+    );
 
-    const createGroup = () => {
+    const createGroup = useCallback(() => {
         if (!personalData || !personalData.login || !personalData.accountID) {
             return;
         }
@@ -430,26 +442,30 @@ function NewChatPage({ref}: NewChatPageProps) {
         setGroupDraft({participants: logins});
         Keyboard.dismiss();
         Navigation.navigate(ROUTES.NEW_CHAT_CONFIRM);
-    };
+    }, [selectedOptions, personalData]);
     const {isDismissed} = useDismissedReferralBanners({referralContentType: CONST.REFERRAL_PROGRAM.CONTENT_TYPES.START_CHAT});
 
-    const footerContent = (!isDismissed || selectedOptions.length > 0) && (
-        <>
-            <ReferralProgramCTA
-                referralContentType={CONST.REFERRAL_PROGRAM.CONTENT_TYPES.START_CHAT}
-                style={selectedOptions.length ? styles.mb5 : undefined}
-            />
+    const footerContent = useMemo(
+        () =>
+            (!isDismissed || selectedOptions.length > 0) && (
+                <>
+                    <ReferralProgramCTA
+                        referralContentType={CONST.REFERRAL_PROGRAM.CONTENT_TYPES.START_CHAT}
+                        style={selectedOptions.length ? styles.mb5 : undefined}
+                    />
 
-            {!!selectedOptions.length && (
-                <Button
-                    success
-                    large
-                    text={translate('common.next')}
-                    onPress={createGroup}
-                    pressOnEnter
-                />
-            )}
-        </>
+                    {!!selectedOptions.length && (
+                        <Button
+                            success
+                            large
+                            text={translate('common.next')}
+                            onPress={createGroup}
+                            pressOnEnter
+                        />
+                    )}
+                </>
+            ),
+        [createGroup, selectedOptions.length, styles.mb5, translate, isDismissed],
     );
 
     return (
diff --git a/src/pages/NewReportWorkspaceSelectionPage.tsx b/src/pages/NewReportWorkspaceSelectionPage.tsx
index 610d2aaa034b..1824c5f31332 100644
--- a/src/pages/NewReportWorkspaceSelectionPage.tsx
+++ b/src/pages/NewReportWorkspaceSelectionPage.tsx
@@ -139,7 +139,7 @@ function NewReportWorkspaceSelectionPage({route}: NewReportWorkspaceSelectionPag
                         policy: policies?.[`${ONYXKEYS.COLLECTION.POLICY}${policyID}`],
                         reportNextStep,
                         policyCategories: undefined,
-                        allTransactions,
+                        allTransactionsCollection: allTransactions,
                     });
 
                     // eslint-disable-next-line rulesdir/no-default-id-values
diff --git a/src/pages/OnboardingWorkEmail/BaseOnboardingWorkEmail.tsx b/src/pages/OnboardingWorkEmail/BaseOnboardingWorkEmail.tsx
index 29fac9341078..f890b7c0aa93 100644
--- a/src/pages/OnboardingWorkEmail/BaseOnboardingWorkEmail.tsx
+++ b/src/pages/OnboardingWorkEmail/BaseOnboardingWorkEmail.tsx
@@ -1,5 +1,5 @@
 import {useIsFocused} from '@react-navigation/native';
-import {Str} from 'expensify-common';
+import {PUBLIC_DOMAINS_SET, Str} from 'expensify-common';
 import React, {useCallback, useEffect, useMemo, useState} from 'react';
 import {View} from 'react-native';
 import AutoEmailLink from '@components/AutoEmailLink';
@@ -108,7 +108,7 @@ function BaseOnboardingWorkEmail({shouldUseNativeStyles}: BaseOnboardingWorkEmai
         const emailParts = userEmail.split('@');
         const domain = emailParts.at(1) ?? '';
 
-        if (!Str.isValidEmail(userEmail) && !isOffline) {
+        if ((PUBLIC_DOMAINS_SET.has(domain.toLowerCase()) || !Str.isValidEmail(userEmail)) && !isOffline) {
             Log.hmmm('User is trying to add an invalid work email', {userEmail, domain});
             addErrorMessage(errors, INPUT_IDS.ONBOARDING_WORK_EMAIL, translate('onboarding.workEmailValidationError.publicEmail'));
         }
diff --git a/src/pages/OnboardingWorkEmailValidation/BaseOnboardingWorkEmailValidation.tsx b/src/pages/OnboardingWorkEmailValidation/BaseOnboardingWorkEmailValidation.tsx
index c96e566fdbce..26b6fd1d05f6 100644
--- a/src/pages/OnboardingWorkEmailValidation/BaseOnboardingWorkEmailValidation.tsx
+++ b/src/pages/OnboardingWorkEmailValidation/BaseOnboardingWorkEmailValidation.tsx
@@ -1,5 +1,5 @@
 import {useIsFocused} from '@react-navigation/native';
-import React, {useEffect} from 'react';
+import React, {useCallback, useEffect} from 'react';
 import {View} from 'react-native';
 import HeaderWithBackButton from '@components/HeaderWithBackButton';
 import OnboardingMergingAccountBlockedView from '@components/OnboardingMergingAccountBlockedView';
@@ -67,17 +67,20 @@ function BaseOnboardingWorkEmailValidation({shouldUseNativeStyles}: BaseOnboardi
         Navigation.navigate(ROUTES.ONBOARDING_PURPOSE.getRoute(), {forceReplace: true});
     }, [onboardingValues?.isMergeAccountStepCompleted, onboardingValues?.shouldRedirectToClassicAfterMerge, onboardingValues?.isMergeAccountStepSkipped, isVsb, isSmb, isFocused]);
 
-    const sendValidateCode = () => {
+    const sendValidateCode = useCallback(() => {
         if (!credentials?.login) {
             return;
         }
         resendValidateCode(credentials.login);
-    };
+    }, [credentials?.login]);
 
-    const validateAccountAndMerge = (validateCode: string) => {
-        setOnboardingErrorMessage(null);
-        MergeIntoAccountAndLogin(workEmail, validateCode, session?.accountID);
-    };
+    const validateAccountAndMerge = useCallback(
+        (validateCode: string) => {
+            setOnboardingErrorMessage(null);
+            MergeIntoAccountAndLogin(workEmail, validateCode, session?.accountID);
+        },
+        [workEmail, session?.accountID],
+    );
 
     return (
         <ScreenWrapper
diff --git a/src/pages/OnboardingWorkspaceConfirmation/OnboardingCurrencyPicker.tsx b/src/pages/OnboardingWorkspaceConfirmation/OnboardingCurrencyPicker.tsx
index c086ccb65e16..f76edb4ff3bc 100644
--- a/src/pages/OnboardingWorkspaceConfirmation/OnboardingCurrencyPicker.tsx
+++ b/src/pages/OnboardingWorkspaceConfirmation/OnboardingCurrencyPicker.tsx
@@ -2,8 +2,8 @@ import {useIsFocused} from '@react-navigation/native';
 import React, {useEffect, useRef} from 'react';
 import type {StyleProp, ViewStyle} from 'react-native';
 import MenuItemWithTopDescription from '@components/MenuItemWithTopDescription';
-import useCurrencyList from '@hooks/useCurrencyList';
 import useOnyx from '@hooks/useOnyx';
+import {getCurrencySymbol} from '@libs/CurrencyUtils';
 import Navigation from '@libs/Navigation/Navigation';
 import CONST from '@src/CONST';
 import ONYXKEYS from '@src/ONYXKEYS';
@@ -30,7 +30,6 @@ type CurrencyPickerProps = {
 };
 
 function OnboardingCurrencyPicker({label, value, errorText, style, onInputChange, onBlur}: CurrencyPickerProps) {
-    const {getCurrencySymbol} = useCurrencyList();
     const didOpenCurrencySelector = useRef(false);
     const isFocused = useIsFocused();
     const [draftValues] = useOnyx(ONYXKEYS.FORMS.ONBOARDING_WORKSPACE_DETAILS_FORM_DRAFT, {canBeMissing: true});
diff --git a/src/pages/OnboardingWorkspaceInvite/BaseOnboardingWorkspaceInvite.tsx b/src/pages/OnboardingWorkspaceInvite/BaseOnboardingWorkspaceInvite.tsx
index 1c63ee2b53b1..f247ef6fa75d 100644
--- a/src/pages/OnboardingWorkspaceInvite/BaseOnboardingWorkspaceInvite.tsx
+++ b/src/pages/OnboardingWorkspaceInvite/BaseOnboardingWorkspaceInvite.tsx
@@ -1,4 +1,4 @@
-import React, {useEffect, useState} from 'react';
+import React, {useCallback, useEffect, useMemo, useState} from 'react';
 import {View} from 'react-native';
 import type {SectionListData} from 'react-native';
 import Button from '@components/Button';
@@ -57,11 +57,16 @@ function BaseOnboardingWorkspaceInvite({shouldUseNativeStyles}: BaseOnboardingWo
     const session = useSession();
     const {isBetaEnabled} = usePermissions();
 
-    const ineligibleInvitees = getIneligibleInvitees(policy?.employeeList);
-    const excludedUsers: Record<string, boolean> = {};
-    for (const login of ineligibleInvitees) {
-        excludedUsers[login] = true;
-    }
+    const excludedUsers = useMemo(() => {
+        const ineligibleInvitees = getIneligibleInvitees(policy?.employeeList);
+        return ineligibleInvitees.reduce(
+            (acc, login) => {
+                acc[login] = true;
+                return acc;
+            },
+            {} as Record<string, boolean>,
+        );
+    }, [policy?.employeeList]);
 
     const {searchTerm, debouncedSearchTerm, setSearchTerm, availableOptions, selectedOptions, selectedOptionsForDisplay, toggleSelection, areOptionsInitialized, searchOptions} =
         useSearchSelector({
@@ -73,19 +78,27 @@ function BaseOnboardingWorkspaceInvite({shouldUseNativeStyles}: BaseOnboardingWo
             shouldInitialize: didScreenTransitionEnd,
         });
 
-    const welcomeNoteSubject = `# ${currentUserPersonalDetails?.displayName ?? ''} invited you to ${policy?.name ?? 'a workspace'}`;
+    const welcomeNoteSubject = useMemo(
+        () => `# ${currentUserPersonalDetails?.displayName ?? ''} invited you to ${policy?.name ?? 'a workspace'}`,
+        [policy?.name, currentUserPersonalDetails?.displayName],
+    );
 
-    const welcomeNote = translate('workspace.common.welcomeNote');
+    const welcomeNote = useMemo(() => translate('workspace.common.welcomeNote'), [translate]);
 
     useEffect(() => {
         searchInServer(debouncedSearchTerm);
     }, [debouncedSearchTerm]);
 
-    const sections: Sections[] = [];
-    if (areOptionsInitialized) {
+    const sections: Sections[] = useMemo(() => {
+        const sectionsArr: Sections[] = [];
+
+        if (!areOptionsInitialized) {
+            return [];
+        }
+
         // Selected options section
         if (selectedOptionsForDisplay.length > 0) {
-            sections.push({
+            sectionsArr.push({
                 title: undefined,
                 data: selectedOptionsForDisplay,
             });
@@ -93,7 +106,7 @@ function BaseOnboardingWorkspaceInvite({shouldUseNativeStyles}: BaseOnboardingWo
 
         // Contacts section
         if (availableOptions.personalDetails.length > 0) {
-            sections.push({
+            sectionsArr.push({
                 title: translate('common.contacts'),
                 data: availableOptions.personalDetails,
             });
@@ -101,41 +114,62 @@ function BaseOnboardingWorkspaceInvite({shouldUseNativeStyles}: BaseOnboardingWo
 
         // User to invite section
         if (availableOptions.userToInvite) {
-            sections.push({
+            sectionsArr.push({
                 title: undefined,
                 data: [availableOptions.userToInvite],
             });
         }
-    }
-
-    const completeOnboarding = (isInvitedAccountant: boolean) => {
-        completeOnboardingReport({
-            engagementChoice: CONST.ONBOARDING_CHOICES.TRACK_WORKSPACE,
-            onboardingMessage: onboardingMessages[CONST.ONBOARDING_CHOICES.TRACK_WORKSPACE],
-            firstName: currentUserPersonalDetails.firstName,
-            lastName: currentUserPersonalDetails.lastName,
-            adminsChatReportID: onboardingAdminsChatReportID,
-            onboardingPolicyID,
-            shouldSkipTestDriveModal: !!onboardingPolicyID && !onboardingAdminsChatReportID,
-            isInvitedAccountant,
-            onboardingPurposeSelected,
-        });
+        return sectionsArr;
+    }, [areOptionsInitialized, selectedOptionsForDisplay, availableOptions.personalDetails, availableOptions.userToInvite, translate]);
 
-        setOnboardingAdminsChatReportID();
-        setOnboardingPolicyID();
+    const handleToggleSelection = useCallback(
+        (option: OptionData) => {
+            toggleSelection(option);
+        },
+        [toggleSelection],
+    );
 
-        navigateAfterOnboardingWithMicrotaskQueue(
-            isSmallScreenWidth,
-            isBetaEnabled(CONST.BETAS.DEFAULT_ROOMS),
-            onboardingPolicyID,
+    const completeOnboarding = useCallback(
+        (isInvitedAccountant: boolean) => {
+            completeOnboardingReport({
+                engagementChoice: CONST.ONBOARDING_CHOICES.TRACK_WORKSPACE,
+                onboardingMessage: onboardingMessages[CONST.ONBOARDING_CHOICES.TRACK_WORKSPACE],
+                firstName: currentUserPersonalDetails.firstName,
+                lastName: currentUserPersonalDetails.lastName,
+                adminsChatReportID: onboardingAdminsChatReportID,
+                onboardingPolicyID,
+                shouldSkipTestDriveModal: !!onboardingPolicyID && !onboardingAdminsChatReportID,
+                isInvitedAccountant,
+                onboardingPurposeSelected,
+            });
+
+            setOnboardingAdminsChatReportID();
+            setOnboardingPolicyID();
+
+            navigateAfterOnboardingWithMicrotaskQueue(
+                isSmallScreenWidth,
+                isBetaEnabled(CONST.BETAS.DEFAULT_ROOMS),
+                onboardingPolicyID,
+                onboardingAdminsChatReportID,
+                // Onboarding tasks would show in Concierge instead of admins room for testing accounts, we should open where onboarding tasks are located
+                // See https://github.com/Expensify/App/issues/57167 for more details
+                (session?.email ?? '').includes('+'),
+            );
+        },
+        [
+            currentUserPersonalDetails.firstName,
+            onboardingMessages,
+            currentUserPersonalDetails.lastName,
             onboardingAdminsChatReportID,
-            // Onboarding tasks would show in Concierge instead of admins room for testing accounts, we should open where onboarding tasks are located
-            // See https://github.com/Expensify/App/issues/57167 for more details
-            (session?.email ?? '').includes('+'),
-        );
-    };
+            onboardingPolicyID,
+            onboardingPurposeSelected,
+            isSmallScreenWidth,
+            isBetaEnabled,
+            session?.email,
+        ],
+    );
 
-    const inviteUser = () => {
+    const inviteUser = useCallback(() => {
         let isValid = true;
         if (selectedOptions.length <= 0) {
             isValid = false;
@@ -158,38 +192,54 @@ function BaseOnboardingWorkspaceInvite({shouldUseNativeStyles}: BaseOnboardingWo
         const policyMemberAccountIDs = Object.values(getMemberAccountIDsForWorkspace(policy?.employeeList, false, false));
         addMembersToWorkspace(invitedEmailsToAccountIDs, `${welcomeNoteSubject}\n\n${welcomeNote}`, onboardingPolicyID, policyMemberAccountIDs, CONST.POLICY.ROLE.USER, formatPhoneNumber);
         completeOnboarding(true);
-    };
-
-    const searchValue = debouncedSearchTerm.trim().toLowerCase();
-    let headerMessage = getHeaderMessage(searchOptions.personalDetails.length + selectedOptions.length !== 0, !!searchOptions.userToInvite, searchValue, countryCode, false);
-    if (!availableOptions.userToInvite && CONST.EXPENSIFY_EMAILS_OBJECT[searchValue]) {
-        headerMessage = translate('messages.errorMessageInvalidEmail');
-    } else if (
-        !availableOptions.userToInvite &&
-        excludedUsers[parsePhoneNumber(appendCountryCode(searchValue, countryCode)).possible ? addSMSDomainIfPhoneNumber(appendCountryCode(searchValue, countryCode)) : searchValue]
-    ) {
-        headerMessage = translate('messages.userIsAlreadyMember', {login: searchValue, name: policy?.name ?? ''});
-    }
-
-    const footerContent = (
-        <View style={[onboardingIsMediumOrLargerScreenWidth ? styles.mh3 : undefined]}>
-            <View style={styles.mb2}>
-                <Button
-                    large
-                    text={translate('common.skip')}
-                    onPress={() => completeOnboarding(false)}
-                />
-            </View>
-            <View>
-                <Button
-                    success
-                    large
-                    text={translate('common.continue')}
-                    onPress={() => inviteUser()}
-                    isDisabled={selectedOptions.length <= 0}
-                />
+    }, [completeOnboarding, onboardingPolicyID, policy?.employeeList, selectedOptions, welcomeNote, welcomeNoteSubject, formatPhoneNumber]);
+
+    const headerMessage = useMemo(() => {
+        const searchValue = debouncedSearchTerm.trim().toLowerCase();
+        if (!availableOptions.userToInvite && CONST.EXPENSIFY_EMAILS_OBJECT[searchValue]) {
+            return translate('messages.errorMessageInvalidEmail');
+        }
+        if (
+            !availableOptions.userToInvite &&
+            excludedUsers[parsePhoneNumber(appendCountryCode(searchValue, countryCode)).possible ? addSMSDomainIfPhoneNumber(appendCountryCode(searchValue, countryCode)) : searchValue]
+        ) {
+            return translate('messages.userIsAlreadyMember', {login: searchValue, name: policy?.name ?? ''});
+        }
+        return getHeaderMessage(searchOptions.personalDetails.length + selectedOptions.length !== 0, !!searchOptions.userToInvite, searchValue, countryCode, false);
+    }, [
+        debouncedSearchTerm,
+        availableOptions.userToInvite,
+        excludedUsers,
+        countryCode,
+        searchOptions.personalDetails.length,
+        searchOptions.userToInvite,
+        selectedOptions.length,
+        translate,
+        policy?.name,
+    ]);
+
+    const footerContent = useMemo(
+        () => (
+            <View style={[onboardingIsMediumOrLargerScreenWidth ? styles.mh3 : undefined]}>
+                <View style={styles.mb2}>
+                    <Button
+                        large
+                        text={translate('common.skip')}
+                        onPress={() => completeOnboarding(false)}
+                    />
+                </View>
+                <View>
+                    <Button
+                        success
+                        large
+                        text={translate('common.continue')}
+                        onPress={() => inviteUser()}
+                        isDisabled={selectedOptions.length <= 0}
+                    />
+                </View>
             </View>
-        </View>
+        ),
+        [completeOnboarding, inviteUser, onboardingIsMediumOrLargerScreenWidth, selectedOptions.length, styles.mb2, styles.mh3, translate],
     );
 
     return (
@@ -226,7 +276,7 @@ function BaseOnboardingWorkspaceInvite({shouldUseNativeStyles}: BaseOnboardingWo
                     setSearchTerm(value);
                 }}
                 headerMessage={headerMessage}
-                onSelectRow={toggleSelection}
+                onSelectRow={handleToggleSelection}
                 onConfirm={inviteUser}
                 showScrollIndicator
                 showLoadingPlaceholder={!areOptionsInitialized || !didScreenTransitionEnd}
diff --git a/src/pages/ProfilePage.tsx b/src/pages/ProfilePage.tsx
index aedff840f39a..dac2ba12e39b 100755
--- a/src/pages/ProfilePage.tsx
+++ b/src/pages/ProfilePage.tsx
@@ -1,5 +1,5 @@
 import {Str} from 'expensify-common';
-import React, {useEffect} from 'react';
+import React, {useEffect, useMemo} from 'react';
 import {View} from 'react-native';
 import type {OnyxCollection, OnyxEntry} from 'react-native-onyx';
 import AutoUpdateTime from '@components/AutoUpdateTime';
@@ -78,9 +78,14 @@ function ProfilePage({route}: ProfilePageProps) {
     const expensifyIcons = useMemoizedLazyExpensifyIcons(['Bug', 'Pencil', 'Phone']);
     const accountID = Number(route.params?.accountID ?? CONST.DEFAULT_NUMBER_ID);
     const isCurrentUser = currentUserAccountID === accountID;
-    const reportID = isCurrentUser ? findSelfDMReportID() : getChatByParticipants(currentUserAccountID ? [accountID, currentUserAccountID] : [], reports)?.reportID;
-    const reportKey = isAnonymousUserSession() || !reportID ? (`${ONYXKEYS.COLLECTION.REPORT}0` as const) : (`${ONYXKEYS.COLLECTION.REPORT}${reportID}` as const);
+    const reportKey = useMemo(() => {
+        const reportID = isCurrentUser ? findSelfDMReportID() : getChatByParticipants(currentUserAccountID ? [accountID, currentUserAccountID] : [], reports)?.reportID;
 
+        if (isAnonymousUserSession() || !reportID) {
+            return `${ONYXKEYS.COLLECTION.REPORT}0` as const;
+        }
+        return `${ONYXKEYS.COLLECTION.REPORT}${reportID}` as const;
+    }, [accountID, isCurrentUser, reports, currentUserAccountID]);
     const [report] = useOnyx(reportKey, {canBeMissing: true});
 
     const styles = useThemeStyles();
@@ -89,24 +94,24 @@ function ProfilePage({route}: ProfilePageProps) {
     const isValidAccountID = isValidAccountRoute(accountID);
     const loginParams = route.params?.login;
 
-    let details: OnyxEntry<PersonalDetails>;
-    // Check if we have the personal details already in Onyx
-    if (personalDetails?.[accountID]) {
-        details = personalDetails?.[accountID] ?? undefined;
-    } else if (!loginParams) {
+    const details = useMemo((): OnyxEntry<PersonalDetails> => {
+        // Check if we have the personal details already in Onyx
+        if (personalDetails?.[accountID]) {
+            return personalDetails?.[accountID] ?? undefined;
+        }
         // Check if we have the login param
-        details = isValidAccountID ? undefined : {accountID: 0};
-    } else {
+        if (!loginParams) {
+            return isValidAccountID ? undefined : {accountID: 0};
+        }
         // Look up the personal details by login
         const foundDetails = Object.values(personalDetails ?? {}).find((personalDetail) => personalDetail?.login === loginParams?.toLowerCase());
         if (foundDetails) {
-            details = foundDetails;
-        } else {
-            // If we don't have the personal details in Onyx, we can create an optimistic account
-            const optimisticAccountID = generateAccountID(loginParams);
-            details = {accountID: optimisticAccountID, login: loginParams, displayName: loginParams};
+            return foundDetails;
         }
-    }
+        // If we don't have the personal details in Onyx, we can create an optimistic account
+        const optimisticAccountID = generateAccountID(loginParams);
+        return {accountID: optimisticAccountID, login: loginParams, displayName: loginParams};
+    }, [personalDetails, accountID, loginParams, isValidAccountID]);
 
     const displayName = formatPhoneNumber(getDisplayNameOrDefault(details, undefined, undefined, isCurrentUser, translate('common.you').toLowerCase()));
     // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
@@ -155,15 +160,18 @@ function ProfilePage({route}: ProfilePageProps) {
         }
     }, [accountID, loginParams, isConcierge]);
 
-    const promotedActions: PromotedAction[] = [];
-    if (report) {
-        promotedActions.push(PromotedActions.pin(report));
-    }
+    const promotedActions = useMemo(() => {
+        const result: PromotedAction[] = [];
+        if (report) {
+            result.push(PromotedActions.pin(report));
+        }
 
-    // If it's a self DM, we only want to show the Message button if the self DM report exists because we don't want to optimistically create a report for self DM
-    if ((!isCurrentUser || report) && !isAnonymousUserSession()) {
-        promotedActions.push(PromotedActions.message({reportID: report?.reportID, accountID, login: loginParams, currentUserAccountID}));
-    }
+        // If it's a self DM, we only want to show the Message button if the self DM report exists because we don't want to optimistically create a report for self DM
+        if ((!isCurrentUser || report) && !isAnonymousUserSession()) {
+            result.push(PromotedActions.message({reportID: report?.reportID, accountID, login: loginParams, currentUserAccountID}));
+        }
+        return result;
+    }, [accountID, isCurrentUser, loginParams, report, currentUserAccountID]);
 
     return (
         <ScreenWrapper testID="ProfilePage">
diff --git a/src/pages/ReimbursementAccount/NonUSD/BankInfo/subSteps/BankAccountDetails.tsx b/src/pages/ReimbursementAccount/NonUSD/BankInfo/subSteps/BankAccountDetails.tsx
index 515c265cd8e1..449c6a0047fe 100644
--- a/src/pages/ReimbursementAccount/NonUSD/BankInfo/subSteps/BankAccountDetails.tsx
+++ b/src/pages/ReimbursementAccount/NonUSD/BankInfo/subSteps/BankAccountDetails.tsx
@@ -1,4 +1,4 @@
-import React from 'react';
+import React, {useCallback, useMemo} from 'react';
 import {View} from 'react-native';
 import ActivityIndicator from '@components/ActivityIndicator';
 import AddressSearch from '@components/AddressSearch';
@@ -33,44 +33,55 @@ function BankAccountDetails({onNext, isEditing, corpayFields}: BankInfoSubStepPr
     const [reimbursementAccount] = useOnyx(ONYXKEYS.REIMBURSEMENT_ACCOUNT, {canBeMissing: false});
     const [reimbursementAccountDraft] = useOnyx(ONYXKEYS.FORMS.REIMBURSEMENT_ACCOUNT_FORM_DRAFT, {canBeMissing: true});
 
-    const bankAccountDetailsFields = corpayFields?.formFields?.filter((field) => !field.id.includes(CONST.NON_USD_BANK_ACCOUNT.BANK_INFO_STEP_ACCOUNT_HOLDER_KEY_PREFIX));
+    const bankAccountDetailsFields = useMemo(() => {
+        return corpayFields?.formFields?.filter((field) => !field.id.includes(CONST.NON_USD_BANK_ACCOUNT.BANK_INFO_STEP_ACCOUNT_HOLDER_KEY_PREFIX));
+    }, [corpayFields]);
 
-    const subStepKeys: Record<keyof ReimbursementAccountForm, keyof ReimbursementAccountForm> = {} as Record<keyof ReimbursementAccountForm, keyof ReimbursementAccountForm>;
-    for (const field of bankAccountDetailsFields ?? []) {
-        subStepKeys[field.id as keyof ReimbursementAccountForm] = field.id as keyof ReimbursementAccountForm;
-    }
+    const subStepKeys = bankAccountDetailsFields?.reduce(
+        (acc, field) => {
+            acc[field.id as keyof ReimbursementAccountForm] = field.id as keyof ReimbursementAccountForm;
+            return acc;
+        },
+        {} as Record<keyof ReimbursementAccountForm, keyof ReimbursementAccountForm>,
+    );
 
-    const defaultValues = getBankInfoStepValues(subStepKeys ?? {}, reimbursementAccountDraft, reimbursementAccount);
+    const defaultValues = useMemo(
+        () => getBankInfoStepValues(subStepKeys ?? {}, reimbursementAccountDraft, reimbursementAccount),
+        [reimbursementAccount, reimbursementAccountDraft, subStepKeys],
+    );
 
     const fieldIds = bankAccountDetailsFields?.map((field) => field.id);
 
-    const validate = (values: FormOnyxValues<typeof ONYXKEYS.FORMS.REIMBURSEMENT_ACCOUNT_FORM>): FormInputErrors<typeof ONYXKEYS.FORMS.REIMBURSEMENT_ACCOUNT_FORM> => {
-        const errors: FormInputErrors<typeof ONYXKEYS.FORMS.REIMBURSEMENT_ACCOUNT_FORM> = {};
+    const validate = useCallback(
+        (values: FormOnyxValues<typeof ONYXKEYS.FORMS.REIMBURSEMENT_ACCOUNT_FORM>): FormInputErrors<typeof ONYXKEYS.FORMS.REIMBURSEMENT_ACCOUNT_FORM> => {
+            const errors: FormInputErrors<typeof ONYXKEYS.FORMS.REIMBURSEMENT_ACCOUNT_FORM> = {};
 
-        if (corpayFields?.formFields) {
-            for (const field of corpayFields.formFields) {
-                const fieldID = field.id as keyof FormOnyxValues<typeof ONYXKEYS.FORMS.REIMBURSEMENT_ACCOUNT_FORM>;
+            if (corpayFields?.formFields) {
+                for (const field of corpayFields.formFields) {
+                    const fieldID = field.id as keyof FormOnyxValues<typeof ONYXKEYS.FORMS.REIMBURSEMENT_ACCOUNT_FORM>;
 
-                if (field.isRequired && !values[fieldID]) {
-                    errors[fieldID] = translate('common.error.fieldRequired');
-                }
-
-                for (const rule of field.validationRules) {
-                    if (!rule.regEx) {
-                        continue;
+                    if (field.isRequired && !values[fieldID]) {
+                        errors[fieldID] = translate('common.error.fieldRequired');
                     }
 
-                    if (new RegExp(rule.regEx).test(SafeString(values[fieldID]))) {
-                        continue;
-                    }
+                    for (const rule of field.validationRules) {
+                        if (!rule.regEx) {
+                            continue;
+                        }
 
-                    errors[fieldID] = rule.errorMessage;
+                        if (new RegExp(rule.regEx).test(SafeString(values[fieldID]))) {
+                            continue;
+                        }
+
+                        errors[fieldID] = rule.errorMessage;
+                    }
                 }
             }
-        }
 
-        return errors;
-    };
+            return errors;
+        },
+        [corpayFields?.formFields, translate],
+    );
 
     const handleSubmit = useReimbursementAccountStepFormSubmit({
         fieldIds: fieldIds as Array<FormOnyxKeys<typeof ONYXKEYS.FORMS.REIMBURSEMENT_ACCOUNT_FORM>>,
@@ -78,35 +89,37 @@ function BankAccountDetails({onNext, isEditing, corpayFields}: BankInfoSubStepPr
         shouldSaveDraft: isEditing,
     });
 
-    const inputs = bankAccountDetailsFields?.map((field) => {
-        if (field.valueSet !== undefined) {
-            return getInputForValueSet(field, SafeString(defaultValues[field.id as keyof typeof defaultValues]), isEditing, styles);
-        }
-
-        return (
-            <View
-                style={styles.mb6}
-                key={field.id}
-            >
-                <InputWrapper
-                    InputComponent={getInputComponent(field)}
-                    inputID={field.id}
-                    label={field.label}
-                    aria-label={field.label}
-                    role={CONST.ROLE.PRESENTATION}
-                    shouldSaveDraft={!isEditing}
-                    defaultValue={SafeString(defaultValues[field.id as keyof typeof defaultValues])}
-                    limitSearchesToCountry={reimbursementAccountDraft?.country}
-                    renamedInputKeys={{
-                        street: 'bankAddressLine1',
-                        city: 'bankCity',
-                        country: '',
-                    }}
-                    forwardedFSClass={CONST.FULLSTORY.CLASS.MASK}
-                />
-            </View>
-        );
-    });
+    const inputs = useMemo(() => {
+        return bankAccountDetailsFields?.map((field) => {
+            if (field.valueSet !== undefined) {
+                return getInputForValueSet(field, SafeString(defaultValues[field.id as keyof typeof defaultValues]), isEditing, styles);
+            }
+
+            return (
+                <View
+                    style={styles.mb6}
+                    key={field.id}
+                >
+                    <InputWrapper
+                        InputComponent={getInputComponent(field)}
+                        inputID={field.id}
+                        label={field.label}
+                        aria-label={field.label}
+                        role={CONST.ROLE.PRESENTATION}
+                        shouldSaveDraft={!isEditing}
+                        defaultValue={SafeString(defaultValues[field.id as keyof typeof defaultValues])}
+                        limitSearchesToCountry={reimbursementAccountDraft?.country}
+                        renamedInputKeys={{
+                            street: 'bankAddressLine1',
+                            city: 'bankCity',
+                            country: '',
+                        }}
+                        forwardedFSClass={CONST.FULLSTORY.CLASS.MASK}
+                    />
+                </View>
+            );
+        });
+    }, [bankAccountDetailsFields, styles, isEditing, defaultValues, reimbursementAccountDraft?.country]);
 
     return (
         <FormProvider
diff --git a/src/pages/ReimbursementAccount/USD/BankInfo/BankInfo.tsx b/src/pages/ReimbursementAccount/USD/BankInfo/BankInfo.tsx
index 5224e45ef71c..54273f008d80 100644
--- a/src/pages/ReimbursementAccount/USD/BankInfo/BankInfo.tsx
+++ b/src/pages/ReimbursementAccount/USD/BankInfo/BankInfo.tsx
@@ -1,4 +1,4 @@
-import React, {useEffect} from 'react';
+import React, {useCallback, useEffect, useMemo} from 'react';
 import InteractiveStepWrapper from '@components/InteractiveStepWrapper';
 import useLocalize from '@hooks/useLocalize';
 import useOnyx from '@hooks/useOnyx';
@@ -42,7 +42,7 @@ function BankInfo({onBackButtonPress, policyID, setUSDBankAccountStep}: BankInfo
     const {translate} = useLocalize();
 
     const [redirectedFromPlaidToManual, setRedirectedFromPlaidToManual] = React.useState(false);
-    const values = getSubStepValues(BANK_INFO_STEP_KEYS, reimbursementAccountDraft, reimbursementAccount ?? {});
+    const values = useMemo(() => getSubStepValues(BANK_INFO_STEP_KEYS, reimbursementAccountDraft, reimbursementAccount ?? {}), [reimbursementAccount, reimbursementAccountDraft]);
 
     let setupType = reimbursementAccount?.achData?.subStep ?? '';
 
@@ -52,38 +52,41 @@ function BankInfo({onBackButtonPress, policyID, setUSDBankAccountStep}: BankInfo
     }
 
     const bankAccountID = Number(reimbursementAccount?.achData?.bankAccountID);
-    const submit = (submitData: unknown) => {
-        const data = submitData as ReimbursementAccountForm;
-        if (setupType === CONST.BANK_ACCOUNT.SETUP_TYPE.MANUAL) {
-            connectBankAccountManually(
-                bankAccountID,
-                {
-                    [BANK_INFO_STEP_KEYS.ROUTING_NUMBER]: data[BANK_INFO_STEP_KEYS.ROUTING_NUMBER] ?? '',
-                    [BANK_INFO_STEP_KEYS.ACCOUNT_NUMBER]: data[BANK_INFO_STEP_KEYS.ACCOUNT_NUMBER] ?? '',
-                    [BANK_INFO_STEP_KEYS.BANK_NAME]: data[BANK_INFO_STEP_KEYS.BANK_NAME] ?? values?.bankName ?? '',
-                    [BANK_INFO_STEP_KEYS.PLAID_ACCOUNT_ID]: data[BANK_INFO_STEP_KEYS.PLAID_ACCOUNT_ID] ?? values?.plaidAccountID,
-                    [BANK_INFO_STEP_KEYS.PLAID_ACCESS_TOKEN]: data[BANK_INFO_STEP_KEYS.PLAID_ACCESS_TOKEN] ?? values?.plaidAccessToken ?? '',
-                    [BANK_INFO_STEP_KEYS.PLAID_MASK]: data[BANK_INFO_STEP_KEYS.PLAID_MASK] ?? values?.mask ?? '',
-                    [BANK_INFO_STEP_KEYS.IS_SAVINGS]: data[BANK_INFO_STEP_KEYS.IS_SAVINGS] ?? false,
-                },
-                policyID,
-            );
-        } else if (setupType === CONST.BANK_ACCOUNT.SETUP_TYPE.PLAID) {
-            connectBankAccountWithPlaid(
-                bankAccountID,
-                {
-                    [BANK_INFO_STEP_KEYS.ROUTING_NUMBER]: data[BANK_INFO_STEP_KEYS.ROUTING_NUMBER] ?? '',
-                    [BANK_INFO_STEP_KEYS.ACCOUNT_NUMBER]: data[BANK_INFO_STEP_KEYS.ACCOUNT_NUMBER] ?? '',
-                    [BANK_INFO_STEP_KEYS.BANK_NAME]: data[BANK_INFO_STEP_KEYS.BANK_NAME] ?? '',
-                    [BANK_INFO_STEP_KEYS.PLAID_ACCOUNT_ID]: data[BANK_INFO_STEP_KEYS.PLAID_ACCOUNT_ID] ?? '',
-                    [BANK_INFO_STEP_KEYS.PLAID_ACCESS_TOKEN]: data[BANK_INFO_STEP_KEYS.PLAID_ACCESS_TOKEN] ?? '',
-                    [BANK_INFO_STEP_KEYS.PLAID_MASK]: data[BANK_INFO_STEP_KEYS.PLAID_MASK] ?? '',
-                    [BANK_INFO_STEP_KEYS.IS_SAVINGS]: data[BANK_INFO_STEP_KEYS.IS_SAVINGS] ?? false,
-                },
-                policyID,
-            );
-        }
-    };
+    const submit = useCallback(
+        (submitData: unknown) => {
+            const data = submitData as ReimbursementAccountForm;
+            if (setupType === CONST.BANK_ACCOUNT.SETUP_TYPE.MANUAL) {
+                connectBankAccountManually(
+                    bankAccountID,
+                    {
+                        [BANK_INFO_STEP_KEYS.ROUTING_NUMBER]: data[BANK_INFO_STEP_KEYS.ROUTING_NUMBER] ?? '',
+                        [BANK_INFO_STEP_KEYS.ACCOUNT_NUMBER]: data[BANK_INFO_STEP_KEYS.ACCOUNT_NUMBER] ?? '',
+                        [BANK_INFO_STEP_KEYS.BANK_NAME]: data[BANK_INFO_STEP_KEYS.BANK_NAME] ?? values?.bankName ?? '',
+                        [BANK_INFO_STEP_KEYS.PLAID_ACCOUNT_ID]: data[BANK_INFO_STEP_KEYS.PLAID_ACCOUNT_ID] ?? values?.plaidAccountID,
+                        [BANK_INFO_STEP_KEYS.PLAID_ACCESS_TOKEN]: data[BANK_INFO_STEP_KEYS.PLAID_ACCESS_TOKEN] ?? values?.plaidAccessToken ?? '',
+                        [BANK_INFO_STEP_KEYS.PLAID_MASK]: data[BANK_INFO_STEP_KEYS.PLAID_MASK] ?? values?.mask ?? '',
+                        [BANK_INFO_STEP_KEYS.IS_SAVINGS]: data[BANK_INFO_STEP_KEYS.IS_SAVINGS] ?? false,
+                    },
+                    policyID,
+                );
+            } else if (setupType === CONST.BANK_ACCOUNT.SETUP_TYPE.PLAID) {
+                connectBankAccountWithPlaid(
+                    bankAccountID,
+                    {
+                        [BANK_INFO_STEP_KEYS.ROUTING_NUMBER]: data[BANK_INFO_STEP_KEYS.ROUTING_NUMBER] ?? '',
+                        [BANK_INFO_STEP_KEYS.ACCOUNT_NUMBER]: data[BANK_INFO_STEP_KEYS.ACCOUNT_NUMBER] ?? '',
+                        [BANK_INFO_STEP_KEYS.BANK_NAME]: data[BANK_INFO_STEP_KEYS.BANK_NAME] ?? '',
+                        [BANK_INFO_STEP_KEYS.PLAID_ACCOUNT_ID]: data[BANK_INFO_STEP_KEYS.PLAID_ACCOUNT_ID] ?? '',
+                        [BANK_INFO_STEP_KEYS.PLAID_ACCESS_TOKEN]: data[BANK_INFO_STEP_KEYS.PLAID_ACCESS_TOKEN] ?? '',
+                        [BANK_INFO_STEP_KEYS.PLAID_MASK]: data[BANK_INFO_STEP_KEYS.PLAID_MASK] ?? '',
+                        [BANK_INFO_STEP_KEYS.IS_SAVINGS]: data[BANK_INFO_STEP_KEYS.IS_SAVINGS] ?? false,
+                    },
+                    policyID,
+                );
+            }
+        },
+        [setupType, bankAccountID, values?.bankName, values?.plaidAccountID, values?.plaidAccessToken, values?.mask, policyID],
+    );
 
     const bodyContent = setupType === CONST.BANK_ACCOUNT.SETUP_TYPE.PLAID ? plaidSubSteps : manualSubSteps;
     const {componentToRender: SubStep, isEditing, screenIndex, nextScreen, prevScreen, moveTo} = useSubStep<BankInfoSubStepProps>({bodyContent, startFrom: 0, onFinished: submit});
diff --git a/src/pages/ReportAddApproverPage.tsx b/src/pages/ReportAddApproverPage.tsx
index 61cff123d3e0..dedcb8632079 100644
--- a/src/pages/ReportAddApproverPage.tsx
+++ b/src/pages/ReportAddApproverPage.tsx
@@ -100,7 +100,7 @@ function ReportAddApproverPage({report, isLoadingReportData, policy}: ReportAddA
             isASAPSubmitBetaEnabled,
             reportNextStep,
         );
-        Navigation.dismissToPreviousRHP();
+        Navigation.dismissModal();
     }, [allApprovers, selectedApproverEmail, report, currentUserDetails.accountID, currentUserDetails.email, policy, hasViolations, isASAPSubmitBetaEnabled, reportNextStep]);
 
     const button = useMemo(() => {
diff --git a/src/pages/ReportChangeApproverPage.tsx b/src/pages/ReportChangeApproverPage.tsx
index b0808304a134..d9ebe90b0208 100644
--- a/src/pages/ReportChangeApproverPage.tsx
+++ b/src/pages/ReportChangeApproverPage.tsx
@@ -1,4 +1,4 @@
-import React, {useCallback, useEffect, useMemo, useRef, useState} from 'react';
+import React, {useCallback, useMemo, useState} from 'react';
 import {View} from 'react-native';
 import type {ValueOf} from 'type-fest';
 import FormHelpMessage from '@components/FormHelpMessage';
@@ -8,6 +8,7 @@ import ScreenWrapper from '@components/ScreenWrapper';
 import SelectionList from '@components/SelectionList';
 import RadioListItem from '@components/SelectionList/ListItem/RadioListItem';
 import type {ListItem} from '@components/SelectionList/types';
+import Text from '@components/Text';
 import useCurrentUserPersonalDetails from '@hooks/useCurrentUserPersonalDetails';
 import useEnvironment from '@hooks/useEnvironment';
 import useLocalize from '@hooks/useLocalize';
@@ -51,8 +52,6 @@ function ReportChangeApproverPage({report, policy, isLoadingReportData}: ReportC
     const isASAPSubmitBetaEnabled = isBetaEnabled(CONST.BETAS.ASAP_SUBMIT);
     const hasViolations = hasViolationsReportUtils(report?.reportID, transactionViolations, currentUserDetails.accountID, currentUserDetails.login ?? '');
     const [reportNextStep] = useOnyx(`${ONYXKEYS.COLLECTION.NEXT_STEP}${reportID}`, {canBeMissing: true});
-    const hasAutoAppliedRef = useRef(false);
-    const hasNavigatedToAddApproverRef = useRef(false);
 
     const changeApprover = useCallback(() => {
         if (!selectedApproverType) {
@@ -60,7 +59,6 @@ function ReportChangeApproverPage({report, policy, isLoadingReportData}: ReportC
             return;
         }
         if (selectedApproverType === APPROVER_TYPE.ADD_APPROVER) {
-            hasNavigatedToAddApproverRef.current = true;
             if (policy && !isControlPolicy(policy)) {
                 Navigation.navigate(
                     ROUTES.WORKSPACE_UPGRADE.getRoute(
@@ -75,8 +73,8 @@ function ReportChangeApproverPage({report, policy, isLoadingReportData}: ReportC
             return;
         }
         assignReportToMe(report, currentUserDetails.accountID, currentUserDetails.email ?? '', policy, hasViolations, isASAPSubmitBetaEnabled, reportNextStep);
-        Navigation.dismissToPreviousRHP();
-    }, [selectedApproverType, report, currentUserDetails.accountID, currentUserDetails.email, policy, hasViolations, isASAPSubmitBetaEnabled, reportNextStep]);
+        Navigation.goBack(ROUTES.REPORT_WITH_ID.getRoute(reportID));
+    }, [selectedApproverType, report, currentUserDetails.accountID, currentUserDetails.email, policy, hasViolations, isASAPSubmitBetaEnabled, reportNextStep, reportID]);
 
     const approverTypes = useMemo(() => {
         const data: Array<ListItem<ApproverType>> = [
@@ -101,18 +99,6 @@ function ReportChangeApproverPage({report, policy, isLoadingReportData}: ReportC
         return data;
     }, [translate, selectedApproverType, policy, report, currentUserDetails.accountID]);
 
-    useEffect(() => {
-        if (selectedApproverType === undefined && approverTypes.length > 0) {
-            setSelectedApproverType(approverTypes.at(0)?.keyForList);
-            return;
-        }
-
-        if (!hasAutoAppliedRef.current && approverTypes.length === 1 && selectedApproverType === approverTypes.at(0)?.keyForList && !hasNavigatedToAddApproverRef.current) {
-            hasAutoAppliedRef.current = true;
-            changeApprover();
-        }
-    }, [approverTypes, selectedApproverType, changeApprover]);
-
     // eslint-disable-next-line rulesdir/no-negated-variables
     const shouldShowNotFoundView = (isEmptyObject(policy) && !isLoadingReportData) || !isPolicyAdmin(policy) || !isMoneyRequestReport(report) || isMoneyRequestReportPendingDeletion(report);
 
@@ -127,13 +113,12 @@ function ReportChangeApproverPage({report, policy, isLoadingReportData}: ReportC
 
     const listHeader = useMemo(
         () => (
-            <View style={[styles.ph5, styles.mb5, styles.renderHTML, styles.flexRow]}>
-                <RenderHTML
-                    html={translate('iou.changeApprover.header', {
-                        workflowSettingLink: `${environmentURL}/${ROUTES.WORKSPACE_WORKFLOWS.getRoute(policy?.id)}`,
-                    })}
-                />
-            </View>
+            <>
+                <Text style={[styles.ph5, styles.mb5]}>{translate('iou.changeApprover.subtitle')}</Text>
+                <View style={[styles.ph5, styles.mb5, styles.renderHTML, styles.flexRow]}>
+                    <RenderHTML html={translate('iou.changeApprover.description', {workflowSettingLink: `${environmentURL}/${ROUTES.WORKSPACE_WORKFLOWS.getRoute(policy?.id)}`})} />
+                </View>
+            </>
         ),
         [environmentURL, policy?.id, styles.flexRow, styles.mb5, styles.ph5, styles.renderHTML, translate],
     );
@@ -166,7 +151,6 @@ function ReportChangeApproverPage({report, policy, isLoadingReportData}: ReportC
                 confirmButtonOptions={confirmButtonOptions}
                 shouldUpdateFocusedIndex
                 customListHeader={listHeader}
-                initiallyFocusedItemKey={selectedApproverType}
             >
                 {hasError && (
                     <FormHelpMessage
diff --git a/src/pages/ReportChangeWorkspacePage.tsx b/src/pages/ReportChangeWorkspacePage.tsx
index 3e2c148f568c..b3abdd9e28dc 100644
--- a/src/pages/ReportChangeWorkspacePage.tsx
+++ b/src/pages/ReportChangeWorkspacePage.tsx
@@ -13,7 +13,6 @@ import useNetwork from '@hooks/useNetwork';
 import useOnyx from '@hooks/useOnyx';
 import usePermissions from '@hooks/usePermissions';
 import useReportIsArchived from '@hooks/useReportIsArchived';
-import useReportTransactions from '@hooks/useReportTransactions';
 import useThemeStyles from '@hooks/useThemeStyles';
 import useWorkspaceList from '@hooks/useWorkspaceList';
 import {changeReportPolicy, changeReportPolicyAndInviteSubmitter, moveIOUReportToPolicy, moveIOUReportToPolicyAndInviteSubmitter} from '@libs/actions/Report';
@@ -52,7 +51,6 @@ function ReportChangeWorkspacePage({report, route}: ReportChangeWorkspacePagePro
     const styles = useThemeStyles();
     const [searchTerm, debouncedSearchTerm, setSearchTerm] = useDebouncedState('');
     const {translate, formatPhoneNumber, localeCompare} = useLocalize();
-    const reportTransactions = useReportTransactions(reportID);
 
     const [policies, fetchStatus] = useOnyx(ONYXKEYS.COLLECTION.POLICY, {canBeMissing: false});
     const [reportNextStep] = useOnyx(`${ONYXKEYS.COLLECTION.NEXT_STEP}${reportID}`, {canBeMissing: true});
@@ -60,16 +58,14 @@ function ReportChangeWorkspacePage({report, route}: ReportChangeWorkspacePagePro
     const [isLoadingApp] = useOnyx(ONYXKEYS.IS_LOADING_APP, {canBeMissing: false});
     const [transactionViolations] = useOnyx(ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS, {canBeMissing: true});
     const isReportLastVisibleArchived = useReportIsArchived(report?.parentReportID);
-    const reportOwnerAccountID = report?.ownerAccountID;
     const submitterEmailSelector = useCallback(
-        (personalDetailsList: OnyxEntry<PersonalDetailsList>) => personalDetailsList?.[reportOwnerAccountID ?? CONST.DEFAULT_NUMBER_ID]?.login,
-        [reportOwnerAccountID],
+        (personalDetailsList: OnyxEntry<PersonalDetailsList>) => personalDetailsList?.[report?.ownerAccountID ?? CONST.DEFAULT_NUMBER_ID]?.login,
+        [report?.ownerAccountID],
     );
     const [submitterEmail] = useOnyx(ONYXKEYS.PERSONAL_DETAILS_LIST, {canBeMissing: false, selector: submitterEmailSelector}, [submitterEmailSelector]);
     const shouldShowLoadingIndicator = isLoadingApp && !isOffline;
     const {isBetaEnabled} = usePermissions();
     const isASAPSubmitBetaEnabled = isBetaEnabled(CONST.BETAS.ASAP_SUBMIT);
-    const isCustomReportNamesBetaEnabled = isBetaEnabled(CONST.BETAS.CUSTOM_REPORT_NAMES);
     const session = useSession();
     const hasViolations = hasViolationsReportUtils(report?.reportID, transactionViolations, session?.accountID ?? CONST.DEFAULT_NUMBER_ID, session?.email ?? '');
 
@@ -86,9 +82,9 @@ function ReportChangeWorkspacePage({report, route}: ReportChangeWorkspacePagePro
             const {backTo} = route.params;
             Navigation.goBack(backTo);
             if (isIOUReport(reportID)) {
-                const invite = moveIOUReportToPolicyAndInviteSubmitter(reportID, policy, formatPhoneNumber, reportTransactions, isCustomReportNamesBetaEnabled);
+                const invite = moveIOUReportToPolicyAndInviteSubmitter(reportID, policy, formatPhoneNumber);
                 if (!invite?.policyExpenseChatReportID) {
-                    moveIOUReportToPolicy(reportID, policy, false, reportTransactions, isCustomReportNamesBetaEnabled);
+                    moveIOUReportToPolicy(reportID, policy);
                 }
                 // This will be fixed as part of https://github.com/Expensify/Expensify/issues/507850
                 // eslint-disable-next-line @typescript-eslint/no-deprecated
@@ -126,13 +122,11 @@ function ReportChangeWorkspacePage({report, route}: ReportChangeWorkspacePagePro
             reportID,
             report,
             formatPhoneNumber,
-            reportTransactions,
             isReportLastVisibleArchived,
             session?.accountID,
             session?.email,
             hasViolations,
             isASAPSubmitBetaEnabled,
-            isCustomReportNamesBetaEnabled,
             reportNextStep,
             isChangePolicyTrainingModalDismissed,
         ],
diff --git a/src/pages/ReportDetailsPage.tsx b/src/pages/ReportDetailsPage.tsx
index 37a3e73e0097..87dbfad34d2f 100644
--- a/src/pages/ReportDetailsPage.tsx
+++ b/src/pages/ReportDetailsPage.tsx
@@ -1,4 +1,3 @@
-import {StackActions} from '@react-navigation/native';
 import reportsSelector from '@selectors/Attributes';
 import {Str} from 'expensify-common';
 import React, {useCallback, useEffect, useMemo, useRef, useState} from 'react';
@@ -23,7 +22,6 @@ import RoomHeaderAvatars from '@components/RoomHeaderAvatars';
 import ScreenWrapper from '@components/ScreenWrapper';
 import ScrollView from '@components/ScrollView';
 import {useSearchContext} from '@components/Search/SearchContext';
-import {SUPER_WIDE_RIGHT_MODALS} from '@components/WideRHPContextProvider/WIDE_RIGHT_MODALS';
 import useActivePolicy from '@hooks/useActivePolicy';
 import useAncestors from '@hooks/useAncestors';
 import useCurrentUserPersonalDetails from '@hooks/useCurrentUserPersonalDetails';
@@ -43,9 +41,9 @@ import useResponsiveLayout from '@hooks/useResponsiveLayout';
 import useThemeStyles from '@hooks/useThemeStyles';
 import getBase62ReportID from '@libs/getBase62ReportID';
 import getNonEmptyStringOnyxID from '@libs/getNonEmptyStringOnyxID';
-import Navigation, {navigationRef} from '@libs/Navigation/Navigation';
+import Navigation from '@libs/Navigation/Navigation';
 import type {PlatformStackScreenProps} from '@libs/Navigation/PlatformStackNavigation/types';
-import type {ReportDetailsNavigatorParamList, RightModalNavigatorParamList} from '@libs/Navigation/types';
+import type {ReportDetailsNavigatorParamList} from '@libs/Navigation/types';
 import {getPersonalDetailsForAccountIDs} from '@libs/OptionsListUtils';
 import Parser from '@libs/Parser';
 import Permissions from '@libs/Permissions';
@@ -70,7 +68,6 @@ import {
     getParticipantsList,
     getReportDescription,
     getReportFieldKey,
-    getReportForHeader,
     isAdminOwnerApproverOrReportOwner,
     isArchivedNonExpenseReport,
     isCanceledTaskReport as isCanceledTaskReportUtil,
@@ -126,7 +123,7 @@ import type {TranslationPaths} from '@src/languages/types';
 import ONYXKEYS from '@src/ONYXKEYS';
 import type {Route} from '@src/ROUTES';
 import ROUTES from '@src/ROUTES';
-import SCREENS from '@src/SCREENS';
+import type SCREENS from '@src/SCREENS';
 import type * as OnyxTypes from '@src/types/onyx';
 import type DeepValueOf from '@src/types/utils/DeepValueOf';
 import {isEmptyObject} from '@src/types/utils/EmptyObject';
@@ -186,8 +183,6 @@ function ReportDetailsPage({policy, report, route, reportMetadata}: ReportDetail
     const [isDebugModeEnabled = false] = useOnyx(ONYXKEYS.IS_DEBUG_MODE_ENABLED, {canBeMissing: true});
     const [personalDetails] = useOnyx(ONYXKEYS.PERSONAL_DETAILS_LIST, {canBeMissing: false});
     const [introSelected] = useOnyx(ONYXKEYS.NVP_INTRO_SELECTED, {canBeMissing: true});
-    const [allTransactionDrafts] = useOnyx(ONYXKEYS.COLLECTION.TRANSACTION_DRAFT, {canBeMissing: true});
-    const [allTransactionViolations] = useOnyx(ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS, {canBeMissing: true});
     const currentUserPersonalDetails = useCurrentUserPersonalDetails();
     const [isLastMemberLeavingGroupModalVisible, setIsLastMemberLeavingGroupModalVisible] = useState(false);
     const [isDeleteModalVisible, setIsDeleteModalVisible] = useState(false);
@@ -332,6 +327,7 @@ function ReportDetailsPage({policy, report, route, reportMetadata}: ReportDetail
     }, [report?.reportID, isOffline, isPrivateNotesFetchTriggered, isSelfDM]);
 
     const leaveChat = useCallback(() => {
+        Navigation.dismissModal();
         Navigation.isNavigationReady().then(() => {
             if (isRootGroupChat) {
                 leaveGroupChat(report.reportID, quickAction?.chatReportID?.toString() === report.reportID, currentUserPersonalDetails.accountID);
@@ -344,10 +340,8 @@ function ReportDetailsPage({policy, report, route, reportMetadata}: ReportDetail
 
     const shouldShowLeaveButton = canLeaveChat(report, policy, !!reportNameValuePairs?.private_isArchived);
     const shouldShowGoToWorkspace = shouldShowPolicy(policy, false, currentUserPersonalDetails?.email) && !policy?.isJoinRequestPending;
-    const reportForHeader = useMemo(() => getReportForHeader(report), [report]);
-    const reportName = isGroupChat
-        ? getReportNameFromReportNameUtils(reportForHeader, reportAttributes)
-        : Parser.htmlToText(getReportNameFromReportNameUtils(reportForHeader, reportAttributes));
+
+    const reportName = isGroupChat ? getReportNameFromReportNameUtils(report, reportAttributes) : Parser.htmlToText(getReportNameFromReportNameUtils(report, reportAttributes));
     const additionalRoomDetails =
         (isPolicyExpenseChat && !!report?.isOwnPolicyExpenseChat) || isExpenseReportUtil(report) || isPolicyExpenseChat || isInvoiceRoom
             ? chatRoomSubtitle
@@ -448,7 +442,6 @@ function ReportDetailsPage({policy, report, route, reportMetadata}: ReportDetail
                         CONST.IOU.ACTION.SUBMIT,
                         actionableWhisperReportActionID,
                         introSelected,
-                        allTransactionDrafts,
                         activePolicy,
                         isRestrictedToPreferredPolicy,
                         preferredPolicyID,
@@ -469,7 +462,6 @@ function ReportDetailsPage({policy, report, route, reportMetadata}: ReportDetail
                             CONST.IOU.ACTION.CATEGORIZE,
                             actionableWhisperReportActionID,
                             introSelected,
-                            allTransactionDrafts,
                             activePolicy,
                         );
                     },
@@ -487,7 +479,6 @@ function ReportDetailsPage({policy, report, route, reportMetadata}: ReportDetail
                             CONST.IOU.ACTION.SHARE,
                             actionableWhisperReportActionID,
                             introSelected,
-                            allTransactionDrafts,
                             activePolicy,
                         );
                     },
@@ -610,7 +601,6 @@ function ReportDetailsPage({policy, report, route, reportMetadata}: ReportDetail
         isRestrictedToPreferredPolicy,
         preferredPolicyID,
         introSelected,
-        allTransactionDrafts,
         activePolicy,
         parentReport,
     ]);
@@ -881,7 +871,6 @@ function ReportDetailsPage({policy, report, route, reportMetadata}: ReportDetail
                 isSingleTransactionView,
                 isChatReportArchived: isMoneyRequestReportArchived,
                 isChatIOUReportArchived,
-                allTransactionViolationsParam: allTransactionViolations,
             });
         } else if (iouTransactionID) {
             deleteTransactions([iouTransactionID], duplicateTransactions, duplicateTransactionViolations, currentSearchHash, isSingleTransactionView);
@@ -914,39 +903,9 @@ function ReportDetailsPage({policy, report, route, reportMetadata}: ReportDetail
     // Where to navigate back to after deleting the transaction and its report.
     const navigateToTargetUrl = useCallback(() => {
         let urlToNavigateBack: string | undefined;
+
         // Only proceed with navigation logic if transaction was actually deleted
         if (!isEmptyObject(requestParentReportAction)) {
-            const rootState = navigationRef.getRootState();
-            const rhp = rootState.routes.at(-1);
-            const rhpRoutes = rhp?.state?.routes ?? [];
-            const previousRoute = rhpRoutes.at(-2);
-            const superWideRHPIndex = rhpRoutes.findIndex((rhpRoute) => SUPER_WIDE_RIGHT_MODALS.has(rhpRoute.name));
-
-            // If the deleted expense is displayed directly below, close the entire RHP
-            const isSuperWideRHPDisplayed = superWideRHPIndex > -1;
-            const isSuperWideRHPDisplayedDirectlyBelow = isSuperWideRHPDisplayed && superWideRHPIndex === rhpRoutes.length - 2;
-            if (
-                isSuperWideRHPDisplayedDirectlyBelow &&
-                (previousRoute?.params as RightModalNavigatorParamList[typeof SCREENS.RIGHT_MODAL.SEARCH_MONEY_REQUEST_REPORT])?.reportID === route.params.reportID
-            ) {
-                Navigation.dismissModal();
-                return;
-            }
-
-            // If the deleted expense is opened from the super wide rhp, go back there.
-            if (
-                previousRoute?.name === SCREENS.RIGHT_MODAL.SEARCH_REPORT &&
-                (previousRoute.params as RightModalNavigatorParamList[typeof SCREENS.RIGHT_MODAL.SEARCH_REPORT])?.reportID === route.params.reportID
-            ) {
-                if (isSuperWideRHPDisplayed) {
-                    const distanceToPop = rhpRoutes.length - 1 - superWideRHPIndex;
-                    navigationRef.dispatch({...StackActions.pop(distanceToPop), target: rhp?.state?.key});
-                    return;
-                }
-                Navigation.dismissModal();
-                return;
-            }
-
             const isTrackExpense = isTrackExpenseAction(requestParentReportAction);
             if (isTrackExpense) {
                 urlToNavigateBack = getNavigationUrlAfterTrackExpenseDelete(
@@ -975,9 +934,9 @@ function ReportDetailsPage({policy, report, route, reportMetadata}: ReportDetail
             Navigation.dismissModal();
         } else {
             setDeleteTransactionNavigateBackUrl(urlToNavigateBack);
-            navigateBackOnDeleteTransaction(urlToNavigateBack as Route);
+            navigateBackOnDeleteTransaction(urlToNavigateBack as Route, true);
         }
-    }, [requestParentReportAction, route.params.reportID, moneyRequestReport, iouTransactionID, iouReport, chatIOUReport, isChatIOUReportArchived, isSingleTransactionView]);
+    }, [iouTransactionID, requestParentReportAction, isSingleTransactionView, moneyRequestReport, isChatIOUReportArchived, iouReport, chatIOUReport]);
 
     // A flag to indicate whether the user chose to delete the transaction or not
     const isTransactionDeleted = useRef<boolean>(false);
diff --git a/src/pages/ReportParticipantDetailsPage.tsx b/src/pages/ReportParticipantDetailsPage.tsx
index e277041209fb..7e81858d5a43 100644
--- a/src/pages/ReportParticipantDetailsPage.tsx
+++ b/src/pages/ReportParticipantDetailsPage.tsx
@@ -1,4 +1,4 @@
-import React from 'react';
+import React, {useCallback} from 'react';
 import {View} from 'react-native';
 import Avatar from '@components/Avatar';
 import Button from '@components/Button';
@@ -51,19 +51,19 @@ function ReportParticipantDetails({report, route}: ReportParticipantDetailsPageP
     const displayName = formatPhoneNumber(getDisplayNameOrDefault(details));
     const isCurrentUserAdmin = isGroupChatAdmin(report, currentUserPersonalDetails?.accountID);
     const isSelectedMemberCurrentUser = accountID === currentUserPersonalDetails?.accountID;
-    const removeUser = () => {
+    const removeUser = useCallback(() => {
         setIsRemoveMemberConfirmModalVisible(false);
         removeFromGroupChat(report?.reportID, [accountID]);
         Navigation.goBack(backTo);
-    };
+    }, [backTo, report?.reportID, accountID]);
 
-    const navigateToProfile = () => {
+    const navigateToProfile = useCallback(() => {
         Navigation.navigate(ROUTES.PROFILE.getRoute(accountID, Navigation.getActiveRoute()));
-    };
+    }, [accountID]);
 
-    const openRoleSelectionModal = () => {
+    const openRoleSelectionModal = useCallback(() => {
         Navigation.navigate(ROUTES.REPORT_PARTICIPANTS_ROLE_SELECTION.getRoute(report.reportID, accountID, route.params.backTo));
-    };
+    }, [accountID, report.reportID, route.params.backTo]);
 
     if (!member) {
         return <NotFoundPage />;
diff --git a/src/pages/RequireTwoFactorAuthenticationPage.tsx b/src/pages/RequireTwoFactorAuthenticationPage.tsx
index c5c6a1078b51..bd2f90087725 100644
--- a/src/pages/RequireTwoFactorAuthenticationPage.tsx
+++ b/src/pages/RequireTwoFactorAuthenticationPage.tsx
@@ -1,10 +1,10 @@
 import {isUserValidatedSelector} from '@selectors/Account';
 import React, {useCallback} from 'react';
-import {StyleSheet, View} from 'react-native';
+import {View} from 'react-native';
 import type {OnyxCollection} from 'react-native-onyx';
 import Button from '@components/Button';
-import FocusTrapForModal from '@components/FocusTrap/FocusTrapForModal';
 import Icon from '@components/Icon';
+import ScreenWrapper from '@components/ScreenWrapper';
 import Text from '@components/Text';
 import {useMemoizedLazyIllustrations} from '@hooks/useLazyAsset';
 import useLocalize from '@hooks/useLocalize';
@@ -43,46 +43,39 @@ function RequireTwoFactorAuthenticationPage() {
 
     const handleOnPress = useCallback(() => {
         if (isUserValidated) {
-            Navigation.navigate(ROUTES.SETTINGS_2FA_ROOT.getRoute());
+            Navigation.navigate(ROUTES.SETTINGS_2FA_ROOT.getRoute(ROUTES.REQUIRE_TWO_FACTOR_AUTH));
             return;
         }
-        Navigation.navigate(ROUTES.SETTINGS_2FA_VERIFY_ACCOUNT.getRoute({forwardTo: ROUTES.SETTINGS_2FA_ROOT.getRoute()}));
+        Navigation.navigate(ROUTES.SETTINGS_2FA_VERIFY_ACCOUNT.getRoute({backTo: ROUTES.REQUIRE_TWO_FACTOR_AUTH, forwardTo: ROUTES.SETTINGS_2FA_ROOT.getRoute()}));
     }, [isUserValidated]);
 
     return (
-        <FocusTrapForModal active>
-            <View
-                style={[StyleSheet.absoluteFill, styles.twoFARequiredOverlay]}
-                testID="RequireTwoFactorAuthenticationPage"
-            >
-                <View style={[styles.flex1, styles.appBG]}>
-                    <View style={styles.twoFARequiredContainer}>
-                        <View style={[styles.twoFAIllustration, styles.alignItemsCenter]}>
-                            <Icon
-                                src={illustrations.Encryption}
-                                width={variables.twoFAIconHeight}
-                                height={variables.twoFAIconHeight}
-                            />
-                        </View>
-                        <View style={[styles.mt2, styles.mh5, styles.dFlex, styles.alignItemsCenter]}>
-                            <View style={styles.mb5}>
-                                <Text style={[styles.textHeadlineH1, styles.textAlignCenter, styles.mv2]}>{translate('twoFactorAuth.twoFactorAuthIsRequiredForAdminsHeader')}</Text>
-                                <Text style={[styles.textSupporting, styles.textAlignCenter]}>
-                                    {translate(is2FARequiredBecauseOfXero ? 'twoFactorAuth.twoFactorAuthIsRequiredXero' : 'twoFactorAuth.twoFactorAuthIsRequiredCompany')}
-                                </Text>
-                            </View>
-                            <Button
-                                large
-                                success
-                                pressOnEnter
-                                onPress={handleOnPress}
-                                text={translate('twoFactorAuth.enableTwoFactorAuth')}
-                            />
-                        </View>
+        <ScreenWrapper testID="RequireTwoFactorAuthenticationPage">
+            <View style={styles.twoFARequiredContainer}>
+                <View style={[styles.twoFAIllustration, styles.alignItemsCenter]}>
+                    <Icon
+                        src={illustrations.Encryption}
+                        width={variables.twoFAIconHeight}
+                        height={variables.twoFAIconHeight}
+                    />
+                </View>
+                <View style={[styles.mt2, styles.mh5, styles.dFlex, styles.alignItemsCenter]}>
+                    <View style={styles.mb5}>
+                        <Text style={[styles.textHeadlineH1, styles.textAlignCenter, styles.mv2]}>{translate('twoFactorAuth.twoFactorAuthIsRequiredForAdminsHeader')}</Text>
+                        <Text style={[styles.textSupporting, styles.textAlignCenter]}>
+                            {translate(is2FARequiredBecauseOfXero ? 'twoFactorAuth.twoFactorAuthIsRequiredXero' : 'twoFactorAuth.twoFactorAuthIsRequiredCompany')}
+                        </Text>
                     </View>
+                    <Button
+                        large
+                        success
+                        pressOnEnter
+                        onPress={handleOnPress}
+                        text={translate('twoFactorAuth.enableTwoFactorAuth')}
+                    />
                 </View>
             </View>
-        </FocusTrapForModal>
+        </ScreenWrapper>
     );
 }
 
diff --git a/src/pages/RestrictedAction/Workspace/WorkspaceAdminRestrictedAction.tsx b/src/pages/RestrictedAction/Workspace/WorkspaceAdminRestrictedAction.tsx
index 3ae000ac7469..1b92da30c250 100644
--- a/src/pages/RestrictedAction/Workspace/WorkspaceAdminRestrictedAction.tsx
+++ b/src/pages/RestrictedAction/Workspace/WorkspaceAdminRestrictedAction.tsx
@@ -49,9 +49,7 @@ function WorkspaceAdminRestrictedAction({policyID}: WorkspaceAdminRestrictedActi
                         width={variables.restrictedActionIllustrationHeight}
                         height={variables.restrictedActionIllustrationHeight}
                     />
-                    <Text style={[styles.textHeadlineH1, styles.textAlignCenter, styles.breakWord]}>
-                        {translate('workspace.restrictedAction.actionsAreCurrentlyRestricted', policy?.name ?? '')}
-                    </Text>
+                    <Text style={[styles.textHeadlineH1, styles.textAlignCenter]}>{translate('workspace.restrictedAction.actionsAreCurrentlyRestricted', policy?.name ?? '')}</Text>
                     <Text style={[styles.textLabelSupportingEmptyValue, styles.textAlignCenter, styles.lh20, styles.mt2]}>
                         {translate('workspace.restrictedAction.workspaceOwnerWillNeedToAddOrUpdatePaymentCard', {workspaceOwnerName: policy?.owner ?? ''})}
                     </Text>
diff --git a/src/pages/RoomInvitePage.tsx b/src/pages/RoomInvitePage.tsx
index 953530b3273d..87c9ef2a380f 100644
--- a/src/pages/RoomInvitePage.tsx
+++ b/src/pages/RoomInvitePage.tsx
@@ -20,7 +20,7 @@ import useLocalize from '@hooks/useLocalize';
 import useOnyx from '@hooks/useOnyx';
 import useReportIsArchived from '@hooks/useReportIsArchived';
 import useThemeStyles from '@hooks/useThemeStyles';
-import {inviteToRoom, inviteToRoomAction, searchInServer} from '@libs/actions/Report';
+import {inviteToRoomAction, searchInServer} from '@libs/actions/Report';
 import {clearUserSearchPhrase, updateUserSearchPhrase} from '@libs/actions/RoomMembersUserSearchPhrase';
 import {READ_COMMANDS} from '@libs/API/types';
 import {canUseTouchScreen} from '@libs/DeviceCapabilities';
@@ -31,14 +31,12 @@ import type {PlatformStackScreenProps} from '@libs/Navigation/PlatformStackNavig
 import type {RoomMembersNavigatorParamList} from '@libs/Navigation/types';
 import type {MemberForList} from '@libs/OptionsListUtils';
 import {filterAndOrderOptions, formatMemberForList, getHeaderMessage, getMemberInviteOptions} from '@libs/OptionsListUtils';
-import Parser from '@libs/Parser';
 import {getLoginsByAccountIDs} from '@libs/PersonalDetailsUtils';
 import {addSMSDomainIfPhoneNumber, parsePhoneNumber} from '@libs/PhoneNumber';
 import type {MemberEmailsToAccountIDs} from '@libs/PolicyUtils';
 import {isPolicyEmployee as isPolicyEmployeeUtil} from '@libs/PolicyUtils';
-import {getReportAction} from '@libs/ReportActionsUtils';
 import type {OptionData} from '@libs/ReportUtils';
-import {getReportName, isHiddenForCurrentUser, isPolicyExpenseChat} from '@libs/ReportUtils';
+import {getReportName, isHiddenForCurrentUser} from '@libs/ReportUtils';
 import CONST from '@src/CONST';
 import type {TranslationPaths} from '@src/languages/types';
 import ONYXKEYS from '@src/ONYXKEYS';
@@ -60,7 +58,7 @@ function RoomInvitePage({
     },
 }: RoomInvitePageProps) {
     const styles = useThemeStyles();
-    const {translate, formatPhoneNumber} = useLocalize();
+    const {translate} = useLocalize();
     const [userSearchPhrase] = useOnyx(ONYXKEYS.ROOM_MEMBERS_USER_SEARCH_PHRASE, {canBeMissing: true});
     const [countryCode = CONST.DEFAULT_COUNTRY_CODE] = useOnyx(ONYXKEYS.COUNTRY_CODE, {canBeMissing: false});
     const [loginList] = useOnyx(ONYXKEYS.LOGIN_LIST, {canBeMissing: true});
@@ -195,8 +193,6 @@ function RoomInvitePage({
     // Non policy members should not be able to view the participants of a room
     const reportID = report?.reportID;
     const isPolicyEmployee = useMemo(() => isPolicyEmployeeUtil(report?.policyID, policy), [report?.policyID, policy]);
-    const reportAction = useMemo(() => getReportAction(report?.parentReportID, report?.parentReportActionID), [report?.parentReportID, report?.parentReportActionID]);
-    const shouldParserToHTML = reportAction?.actionName !== CONST.REPORT.ACTIONS.TYPE.ADD_COMMENT;
     const backRoute = useMemo(() => {
         return reportID && (!isPolicyEmployee || isReportArchived ? ROUTES.REPORT_WITH_ID_DETAILS.getRoute(reportID, backTo) : ROUTES.ROOM_MEMBERS.getRoute(reportID, backTo));
     }, [isPolicyEmployee, reportID, backTo, isReportArchived]);
@@ -206,7 +202,7 @@ function RoomInvitePage({
 
     const ancestors = useAncestors(report);
 
-    const inviteUsers = () => {
+    const inviteUsers = useCallback(() => {
         HttpUtils.cancelPendingRequests(READ_COMMANDS.SEARCH_FOR_REPORTS);
 
         if (!validate()) {
@@ -222,11 +218,7 @@ function RoomInvitePage({
             invitedEmailsToAccountIDs[login] = Number(accountID);
         }
         if (report?.reportID) {
-            if (isPolicyExpenseChat(report)) {
-                inviteToRoomAction(report, ancestors, invitedEmailsToAccountIDs, currentUserPersonalDetails.timezone ?? CONST.DEFAULT_TIME_ZONE);
-            } else {
-                inviteToRoom(reportID, invitedEmailsToAccountIDs, formatPhoneNumber);
-            }
+            inviteToRoomAction(report, ancestors, invitedEmailsToAccountIDs, currentUserPersonalDetails.timezone ?? CONST.DEFAULT_TIME_ZONE);
             clearUserSearchPhrase();
             if (backTo) {
                 Navigation.goBack(backTo);
@@ -234,7 +226,7 @@ function RoomInvitePage({
                 Navigation.goBack(ROUTES.REPORT_WITH_ID.getRoute(report.reportID));
             }
         }
-    };
+    }, [validate, selectedOptions, ancestors, report, currentUserPersonalDetails.timezone, backTo]);
 
     const goBack = useCallback(() => {
         Navigation.goBack(backRoute);
@@ -278,7 +270,7 @@ function RoomInvitePage({
             >
                 <HeaderWithBackButton
                     title={translate('workspace.invite.invitePeople')}
-                    subtitle={shouldParserToHTML ? Parser.htmlToText(reportName) : reportName}
+                    subtitle={reportName}
                     onBackButtonPress={goBack}
                 />
                 <SelectionList
diff --git a/src/pages/RoomMemberDetailsPage.tsx b/src/pages/RoomMemberDetailsPage.tsx
index 0e6abaa99318..04ddd3e0bc48 100644
--- a/src/pages/RoomMemberDetailsPage.tsx
+++ b/src/pages/RoomMemberDetailsPage.tsx
@@ -1,4 +1,4 @@
-import React from 'react';
+import React, {useCallback} from 'react';
 import {View} from 'react-native';
 import Avatar from '@components/Avatar';
 import Button from '@components/Button';
@@ -53,15 +53,15 @@ function RoomMemberDetailsPage({report, route}: RoomMemberDetailsPagePageProps)
     const isSelectedMemberCurrentUser = accountID === currentUserPersonalDetails?.accountID;
     const isSelectedMemberOwner = accountID === report.ownerAccountID;
     const shouldDisableRemoveUser = (isPolicyExpenseChat(report) && isUserPolicyAdmin(policy, details.login)) || isSelectedMemberCurrentUser || isSelectedMemberOwner;
-    const removeUser = () => {
+    const removeUser = useCallback(() => {
         setIsRemoveMemberConfirmModalVisible(false);
         removeFromRoom(report?.reportID, [accountID]);
         Navigation.goBack(backTo);
-    };
+    }, [backTo, report?.reportID, accountID]);
 
-    const navigateToProfile = () => {
+    const navigateToProfile = useCallback(() => {
         Navigation.navigate(ROUTES.PROFILE.getRoute(accountID, Navigation.getActiveRoute()));
-    };
+    }, [accountID]);
 
     if (!member) {
         return <NotFoundPage />;
diff --git a/src/pages/RoomMembersPage.tsx b/src/pages/RoomMembersPage.tsx
index ab569650ae08..3ba50430bd8c 100644
--- a/src/pages/RoomMembersPage.tsx
+++ b/src/pages/RoomMembersPage.tsx
@@ -34,19 +34,9 @@ import Navigation from '@libs/Navigation/Navigation';
 import type {PlatformStackRouteProp, PlatformStackScreenProps} from '@libs/Navigation/PlatformStackNavigation/types';
 import type {RoomMembersNavigatorParamList} from '@libs/Navigation/types';
 import {isPersonalDetailsReady, isSearchStringMatchUserDetails} from '@libs/OptionsListUtils';
-import Parser from '@libs/Parser';
 import {getDisplayNameOrDefault, getPersonalDetailsByIDs} from '@libs/PersonalDetailsUtils';
 import {isPolicyEmployee as isPolicyEmployeeUtils, isUserPolicyAdmin} from '@libs/PolicyUtils';
-import {getReportAction} from '@libs/ReportActionsUtils';
-import {
-    getReportForHeader,
-    getReportName,
-    getReportPersonalDetailsParticipants,
-    isChatThread,
-    isDefaultRoom,
-    isPolicyExpenseChat as isPolicyExpenseChatUtils,
-    isUserCreatedPolicyRoom,
-} from '@libs/ReportUtils';
+import {getReportName, getReportPersonalDetailsParticipants, isChatThread, isDefaultRoom, isPolicyExpenseChat as isPolicyExpenseChatUtils, isUserCreatedPolicyRoom} from '@libs/ReportUtils';
 import StringUtils from '@libs/StringUtils';
 import {clearAddRoomMemberError, openRoomMembersPage, removeFromRoom} from '@userActions/Report';
 import CONST from '@src/CONST';
@@ -64,8 +54,6 @@ type RoomMembersPageProps = WithReportOrNotFoundProps & WithCurrentUserPersonalD
 function RoomMembersPage({report, policy}: RoomMembersPageProps) {
     const route = useRoute<PlatformStackRouteProp<RoomMembersNavigatorParamList, typeof SCREENS.ROOM_MEMBERS.ROOT>>();
     const icons = useMemoizedLazyExpensifyIcons(['RemoveMembers', 'FallbackAvatar']);
-    const reportAction = useMemo(() => getReportAction(report?.parentReportID, report?.parentReportActionID), [report?.parentReportID, report?.parentReportActionID]);
-    const shouldParserToHTML = reportAction?.actionName !== CONST.REPORT.ACTIONS.TYPE.ADD_COMMENT;
     const styles = useThemeStyles();
     const [session] = useOnyx(ONYXKEYS.SESSION, {canBeMissing: false});
     const [reportMetadata] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT_METADATA}${report?.reportID}`, {canBeMissing: false});
@@ -79,7 +67,6 @@ function RoomMembersPage({report, policy}: RoomMembersPageProps) {
     const isPolicyExpenseChat = useMemo(() => isPolicyExpenseChatUtils(report), [report]);
     const backTo = route.params.backTo;
     const isReportArchived = useReportIsArchived(report.reportID);
-    const reportForSubtitle = useMemo(() => getReportForHeader(report), [report]);
 
     const {chatParticipants: participants, personalDetailsParticipants} = useMemo(
         () => getReportPersonalDetailsParticipants(report, personalDetails, reportMetadata, true),
@@ -426,7 +413,7 @@ function RoomMembersPage({report, policy}: RoomMembersPageProps) {
                 <HeaderWithBackButton
                     title={selectionModeHeader ? translate('common.selectMultiple') : translate('workspace.common.members')}
                     // eslint-disable-next-line @typescript-eslint/no-deprecated
-                    subtitle={StringUtils.lineBreaksToSpaces(shouldParserToHTML ? Parser.htmlToText(getReportName(reportForSubtitle)) : getReportName(reportForSubtitle))}
+                    subtitle={StringUtils.lineBreaksToSpaces(getReportName(report))}
                     onBackButtonPress={() => {
                         if (isMobileSelectionModeEnabled) {
                             setSelectedMembers([]);
diff --git a/src/pages/ScheduleCall/ScheduleCallConfirmationPage.tsx b/src/pages/ScheduleCall/ScheduleCallConfirmationPage.tsx
index 908efd1b48c4..cf86fcf8dff8 100644
--- a/src/pages/ScheduleCall/ScheduleCallConfirmationPage.tsx
+++ b/src/pages/ScheduleCall/ScheduleCallConfirmationPage.tsx
@@ -1,6 +1,6 @@
 import {useRoute} from '@react-navigation/native';
 import {addMinutes} from 'date-fns';
-import React, {useEffect} from 'react';
+import React, {useCallback, useEffect, useMemo} from 'react';
 import FullPageOfflineBlockingView from '@components/BlockingViews/FullPageOfflineBlockingView';
 import Button from '@components/Button';
 import FixedFooter from '@components/FixedFooter';
@@ -38,7 +38,7 @@ function ScheduleCallConfirmationPage() {
     const personalDetails = usePersonalDetails();
     const route = useRoute<PlatformStackRouteProp<ScheduleCallParamList, typeof SCREENS.SCHEDULE_CALL.CONFIRMATION>>();
 
-    const confirm = () => {
+    const confirm = useCallback(() => {
         if (!scheduleCallDraft?.timeSlot || !scheduleCallDraft?.date || !scheduleCallDraft.guide || !scheduleCallDraft.reportID) {
             return;
         }
@@ -52,22 +52,28 @@ function ScheduleCallConfirmationPage() {
             currentUserPersonalDetails,
             userTimezone,
         );
-    };
+    }, [currentUserPersonalDetails, scheduleCallDraft?.timeSlot, scheduleCallDraft?.date, scheduleCallDraft?.guide, scheduleCallDraft?.reportID, userTimezone]);
 
-    const guideDetails: PersonalDetails | null = scheduleCallDraft?.guide?.accountID
-        ? (personalDetails?.[scheduleCallDraft.guide.accountID] ?? {
-              accountID: scheduleCallDraft.guide.accountID,
-              login: scheduleCallDraft.guide.email,
-              displayName: scheduleCallDraft.guide.email,
-              avatar: getDefaultAvatarURL({
-                  accountID: scheduleCallDraft.guide.accountID,
-                  accountEmail: scheduleCallDraft.guide.email,
-              }),
-          })
-        : null;
+    const guideDetails: PersonalDetails | null = useMemo(
+        () =>
+            scheduleCallDraft?.guide?.accountID
+                ? (personalDetails?.[scheduleCallDraft.guide.accountID] ?? {
+                      accountID: scheduleCallDraft.guide.accountID,
+                      login: scheduleCallDraft.guide.email,
+                      displayName: scheduleCallDraft.guide.email,
+                      avatar: getDefaultAvatarURL({
+                          accountID: scheduleCallDraft.guide.accountID,
+                          accountEmail: scheduleCallDraft.guide.email,
+                      }),
+                  })
+                : null,
+        [personalDetails, scheduleCallDraft?.guide?.accountID, scheduleCallDraft?.guide?.email],
+    );
 
-    let dateTimeString = '';
-    if (scheduleCallDraft?.timeSlot && scheduleCallDraft.date) {
+    const dateTimeString = useMemo(() => {
+        if (!scheduleCallDraft?.timeSlot || !scheduleCallDraft.date) {
+            return '';
+        }
         const dateString = DateUtils.formatInTimeZoneWithFallback(scheduleCallDraft.date, userTimezone, CONST.DATE.MONTH_DAY_YEAR_FORMAT);
         const timeString = `${DateUtils.formatInTimeZoneWithFallback(scheduleCallDraft?.timeSlot, userTimezone, CONST.DATE.LOCAL_TIME_FORMAT)} - ${DateUtils.formatInTimeZoneWithFallback(
             addMinutes(scheduleCallDraft?.timeSlot, 30),
@@ -77,8 +83,8 @@ function ScheduleCallConfirmationPage() {
 
         const timezoneString = DateUtils.getZoneAbbreviation(new Date(scheduleCallDraft?.timeSlot), userTimezone);
 
-        dateTimeString = `${dateString} from ${timeString} ${timezoneString}`;
-    }
+        return `${dateString} from ${timeString} ${timezoneString}`;
+    }, [scheduleCallDraft?.date, scheduleCallDraft?.timeSlot, userTimezone]);
 
     useEffect(() => {
         const guideAccountID = scheduleCallDraft?.guide?.accountID;
diff --git a/src/pages/Search/AdvancedSearchFilters.tsx b/src/pages/Search/AdvancedSearchFilters.tsx
index 9164ce9ff1b1..11f0638320dd 100644
--- a/src/pages/Search/AdvancedSearchFilters.tsx
+++ b/src/pages/Search/AdvancedSearchFilters.tsx
@@ -13,7 +13,6 @@ import type {SearchAmountFilterKeys, SearchDateFilterKeys, SearchDatePreset, Sea
 import SpacerView from '@components/SpacerView';
 import Text from '@components/Text';
 import useAdvancedSearchFilters from '@hooks/useAdvancedSearchFilters';
-import useCurrentUserPersonalDetails from '@hooks/useCurrentUserPersonalDetails';
 import useLocalize from '@hooks/useLocalize';
 import useOnyx from '@hooks/useOnyx';
 import useSingleExecution from '@hooks/useSingleExecution';
@@ -276,7 +275,7 @@ function getFilterCardDisplayTitle(filters: Partial<SearchAdvancedFiltersForm>,
 
     const cardNames = Object.values(cards)
         .filter((card) => cardIdsFilter.includes(card.cardID.toString()) && !feedFilter.includes(createCardFeedKey(card.fundID, card.bank)))
-        .map((card) => getCardDescription(card, translate));
+        .map((card) => getCardDescription(card));
 
     const feedNames = Object.keys(cardFeedNamesWithType)
         .filter((workspaceCardFeedKey) => {
@@ -350,7 +349,10 @@ function getFilterDisplayTitle(
             return translate('search.filters.amount.equalTo', {amount: convertToDisplayStringWithoutCurrency(Number(equalTo))});
         }
         if (lessThan && greaterThan) {
-            return translate('search.filters.amount.between', convertToDisplayStringWithoutCurrency(Number(greaterThan)), convertToDisplayStringWithoutCurrency(Number(lessThan)));
+            return translate('search.filters.amount.between', {
+                lessThan: convertToDisplayStringWithoutCurrency(Number(lessThan)),
+                greaterThan: convertToDisplayStringWithoutCurrency(Number(greaterThan)),
+            });
         }
         if (lessThan) {
             return translate('search.filters.amount.lessThan', {amount: convertToDisplayStringWithoutCurrency(Number(lessThan))});
@@ -525,9 +527,9 @@ function getFilterExpenseDisplayTitle(filters: Partial<SearchAdvancedFiltersForm
         : undefined;
 }
 
-function getFilterInDisplayTitle(filters: Partial<SearchAdvancedFiltersForm>, _: LocaleContextProps['translate'], reports: OnyxCollection<Report> | undefined, currentUserAccountID: number) {
+function getFilterInDisplayTitle(filters: Partial<SearchAdvancedFiltersForm>, _: LocaleContextProps['translate'], reports?: OnyxCollection<Report>) {
     return filters.in
-        ?.map((id) => computeReportName(reports?.[`${ONYXKEYS.COLLECTION.REPORT}${id}`], reports, undefined, undefined, undefined, undefined, undefined, currentUserAccountID))
+        ?.map((id) => computeReportName(reports?.[`${ONYXKEYS.COLLECTION.REPORT}${id}`], reports))
         ?.filter(Boolean)
         ?.join(', ');
 }
@@ -546,8 +548,8 @@ function AdvancedSearchFilters() {
     const personalDetails = usePersonalDetails();
 
     const [policies = getEmptyObject<NonNullable<OnyxCollection<Policy>>>()] = useOnyx(ONYXKEYS.COLLECTION.POLICY, {canBeMissing: false});
+
     const [currentUserLogin] = useOnyx(ONYXKEYS.SESSION, {canBeMissing: false, selector: emailSelector});
-    const {accountID: currentUserAccountID} = useCurrentUserPersonalDetails();
 
     const taxRates = getAllTaxRates(policies);
 
@@ -586,7 +588,7 @@ function AdvancedSearchFilters() {
             queryJSON,
         });
 
-        Navigation.setNavigationActionToMicrotaskQueue(() => applyFiltersAndNavigate());
+        applyFiltersAndNavigate();
     };
 
     const filters = typeFiltersKeys.map((section) => {
@@ -607,7 +609,7 @@ function AdvancedSearchFilters() {
             ) {
                 filterTitle = baseFilterConfig[key].getTitle(searchAdvancedFilters[key] ?? [], personalDetails, formatPhoneNumber);
             } else if (key === CONST.SEARCH.SYNTAX_FILTER_KEYS.IN) {
-                filterTitle = baseFilterConfig[key].getTitle(searchAdvancedFilters, translate, reports, currentUserAccountID);
+                filterTitle = baseFilterConfig[key].getTitle(searchAdvancedFilters, translate, reports);
             } else if (key === CONST.SEARCH.SYNTAX_FILTER_KEYS.POLICY_ID) {
                 const workspacesData = workspaces.flatMap((value) => value.data);
                 filterTitle = baseFilterConfig[key].getTitle(searchAdvancedFilters, workspacesData);
diff --git a/src/pages/Search/EmptySearchView.tsx b/src/pages/Search/EmptySearchView.tsx
index 87b8cb9f7d63..838cd6c121c5 100644
--- a/src/pages/Search/EmptySearchView.tsx
+++ b/src/pages/Search/EmptySearchView.tsx
@@ -1,6 +1,6 @@
 import {hasSeenTourSelector, tryNewDotOnyxSelector} from '@selectors/Onboarding';
 import {accountIDSelector} from '@selectors/Session';
-import React, {useState} from 'react';
+import React, {useCallback, useMemo, useState} from 'react';
 import type {ReactNode} from 'react';
 // eslint-disable-next-line no-restricted-imports
 import type {GestureResponderEvent, ImageStyle, Text as RNText, TextStyle, ViewStyle} from 'react-native';
@@ -96,7 +96,7 @@ function EmptySearchView({similarSearchHash, type, hasResults, queryJSON}: Empty
     const [activePolicyID] = useOnyx(ONYXKEYS.NVP_ACTIVE_POLICY_ID, {canBeMissing: true});
     const [activePolicy] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY}${activePolicyID}`, {canBeMissing: true});
 
-    const groupPoliciesWithChatEnabled = getGroupPaidPoliciesWithExpenseChatEnabled(allPolicies);
+    const groupPoliciesWithChatEnabled = useMemo(() => getGroupPaidPoliciesWithExpenseChatEnabled(allPolicies), [allPolicies]);
 
     const [introSelected] = useOnyx(ONYXKEYS.NVP_INTRO_SELECTED, {canBeMissing: true});
     const [hasSeenTour = false] = useOnyx(ONYXKEYS.NVP_ONBOARDING, {
@@ -155,17 +155,23 @@ function EmptySearchViewContent({
 
     const illustrations = useMemoizedLazyIllustrations(['PiggyBank', 'TravelAlerts']);
 
-    const tripsFeatures: FeatureListItem[] = [
-        {
-            icon: illustrations.PiggyBank,
-            translationKey: 'travel.features.saveMoney',
-        },
-        {
-            icon: illustrations.TravelAlerts,
-            translationKey: 'travel.features.alerts',
-        },
-    ];
+    const tripsFeatures: FeatureListItem[] = useMemo(
+        () => [
+            {
+                icon: illustrations.PiggyBank,
+                translationKey: 'travel.features.saveMoney',
+            },
+            {
+                icon: illustrations.TravelAlerts,
+                translationKey: 'travel.features.alerts',
+            },
+        ],
+        [illustrations.PiggyBank, illustrations.TravelAlerts],
+    );
     const [contextMenuAnchor, setContextMenuAnchor] = useState<RNText | null>(null);
+    const handleContextMenuAnchorRef = useCallback((node: RNText | null) => {
+        setContextMenuAnchor(node);
+    }, []);
     const [modalVisible, setModalVisible] = useState(false);
     const [transactionViolations] = useOnyx(ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS, {canBeMissing: true});
     const {isBetaEnabled} = usePermissions();
@@ -184,9 +190,14 @@ function EmptySearchViewContent({
 
     const [tryNewDot] = useOnyx(ONYXKEYS.NVP_TRY_NEW_DOT, {selector: tryNewDotOnyxSelector, canBeMissing: true});
 
-    const shouldRedirectToExpensifyClassic = areAllGroupPoliciesExpenseChatDisabled(allPolicies ?? {});
+    const shouldRedirectToExpensifyClassic = useMemo(() => {
+        return areAllGroupPoliciesExpenseChatDisabled(allPolicies ?? {});
+    }, [allPolicies]);
 
-    const defaultChatEnabledPolicy = getDefaultChatEnabledPolicy(groupPoliciesWithChatEnabled as Array<OnyxEntry<Policy>>, activePolicy);
+    const defaultChatEnabledPolicy = useMemo(
+        () => getDefaultChatEnabledPolicy(groupPoliciesWithChatEnabled as Array<OnyxEntry<Policy>>, activePolicy),
+        [activePolicy, groupPoliciesWithChatEnabled],
+    );
 
     const defaultChatEnabledPolicyID = defaultChatEnabledPolicy?.id;
 
@@ -195,33 +206,31 @@ function EmptySearchViewContent({
         selector: reportSummariesOnyxSelector,
     });
     const [hasDismissedEmptyReportsConfirmation] = useOnyx(ONYXKEYS.NVP_EMPTY_REPORTS_CONFIRMATION_DISMISSED, {canBeMissing: true});
-    const shouldShowEmptyReportConfirmation = hasEmptyReportsForPolicy(reportSummaries, defaultChatEnabledPolicyID, accountID) && hasDismissedEmptyReportsConfirmation !== true;
-
-    const filteredPolicyID = queryJSON?.policyID;
-    let isFilteredWorkspaceAccessible = true;
-    if (filteredPolicyID) {
-        const policyIDToCheck = Array.isArray(filteredPolicyID) ? filteredPolicyID.at(0) : filteredPolicyID;
-        const filteredPolicy = allPolicies?.[`${ONYXKEYS.COLLECTION.POLICY}${policyIDToCheck}`];
-        isFilteredWorkspaceAccessible = !!filteredPolicy;
-    }
-
-    const handleCreateWorkspaceReport = (shouldDismissEmptyReportsConfirmation?: boolean) => {
-        if (!defaultChatEnabledPolicy?.id) {
-            return;
-        }
+    const shouldShowEmptyReportConfirmation = useMemo(
+        () => hasEmptyReportsForPolicy(reportSummaries, defaultChatEnabledPolicyID, accountID) && hasDismissedEmptyReportsConfirmation !== true,
+        [accountID, defaultChatEnabledPolicyID, hasDismissedEmptyReportsConfirmation, reportSummaries],
+    );
 
-        const {reportID: createdReportID} = createNewReport(
-            currentUserPersonalDetails,
-            hasViolations,
-            isASAPSubmitBetaEnabled,
-            defaultChatEnabledPolicy,
-            false,
-            shouldDismissEmptyReportsConfirmation,
-        );
-        Navigation.setNavigationActionToMicrotaskQueue(() => {
-            Navigation.navigate(ROUTES.SEARCH_MONEY_REQUEST_REPORT.getRoute({reportID: createdReportID, backTo: Navigation.getActiveRoute()}));
-        });
-    };
+    const handleCreateWorkspaceReport = useCallback(
+        (shouldDismissEmptyReportsConfirmation?: boolean) => {
+            if (!defaultChatEnabledPolicy?.id) {
+                return;
+            }
+
+            const {reportID: createdReportID} = createNewReport(
+                currentUserPersonalDetails,
+                hasViolations,
+                isASAPSubmitBetaEnabled,
+                defaultChatEnabledPolicy,
+                false,
+                shouldDismissEmptyReportsConfirmation,
+            );
+            Navigation.setNavigationActionToMicrotaskQueue(() => {
+                Navigation.navigate(ROUTES.SEARCH_MONEY_REQUEST_REPORT.getRoute({reportID: createdReportID, backTo: Navigation.getActiveRoute()}));
+            });
+        },
+        [currentUserPersonalDetails, hasViolations, defaultChatEnabledPolicy, isASAPSubmitBetaEnabled],
+    );
 
     const {openCreateReportConfirmation: openCreateReportFromSearch, CreateReportConfirmationModal} = useCreateEmptyReportConfirmation({
         policyID: defaultChatEnabledPolicyID,
@@ -229,111 +238,112 @@ function EmptySearchViewContent({
         onConfirm: handleCreateWorkspaceReport,
     });
 
-    const handleCreateReportClick = () => {
+    const handleCreateReportClick = useCallback(() => {
         if (shouldShowEmptyReportConfirmation) {
             openCreateReportFromSearch();
         } else {
             handleCreateWorkspaceReport(false);
         }
-    };
-
-    const typeMenuItems = typeMenuSections.map((section) => section.menuItems).flat();
-
-    const onLongPress = (event: GestureResponderEvent | MouseEvent) => {
-        if (!contextMenuAnchor) {
-            return;
-        }
-
-        showContextMenu({
-            type: CONST.CONTEXT_MENU_TYPES.LINK,
-            event,
-            selection: CONST.BOOK_TRAVEL_DEMO_URL,
-            contextMenuAnchor,
-        });
-    };
+    }, [handleCreateWorkspaceReport, openCreateReportFromSearch, shouldShowEmptyReportConfirmation]);
+
+    const typeMenuItems = useMemo(() => {
+        return typeMenuSections.map((section) => section.menuItems).flat();
+    }, [typeMenuSections]);
+
+    const tripViewChildren = useMemo(() => {
+        const onLongPress = (event: GestureResponderEvent | MouseEvent) => {
+            if (!contextMenuAnchor) {
+                return;
+            }
+
+            showContextMenu({
+                type: CONST.CONTEXT_MENU_TYPES.LINK,
+                event,
+                selection: CONST.BOOK_TRAVEL_DEMO_URL,
+                contextMenuAnchor,
+            });
+        };
 
-    const tripViewChildren = (
-        <>
-            <Text style={[styles.textSupporting, styles.textNormal]}>
-                {translate('travel.subtitle')}{' '}
-                <PressableWithSecondaryInteraction
-                    inline
-                    onSecondaryInteraction={onLongPress}
-                    accessible
-                    accessibilityLabel={translate('travel.bookADemo')}
-                >
-                    <TextLink
-                        onLongPress={onLongPress}
-                        onPress={() => {
-                            Linking.openURL(CONST.BOOK_TRAVEL_DEMO_URL);
-                        }}
-                        ref={setContextMenuAnchor}
+        return (
+            <>
+                <Text style={[styles.textSupporting, styles.textNormal]}>
+                    {translate('travel.subtitle')}{' '}
+                    <PressableWithSecondaryInteraction
+                        inline
+                        onSecondaryInteraction={onLongPress}
+                        accessible
+                        accessibilityLabel={translate('travel.bookADemo')}
                     >
-                        {translate('travel.bookADemo')}
-                    </TextLink>
-                </PressableWithSecondaryInteraction>
-                {translate('travel.toLearnMore')}
-            </Text>
-            <View style={[styles.flex1, styles.flexRow, styles.flexWrap, styles.rowGap4, styles.pt4, styles.pl1, styles.mb5]}>
-                {tripsFeatures.map((tripsFeature) => (
-                    <View
-                        key={tripsFeature.translationKey}
-                        style={styles.w100}
-                    >
-                        <MenuItem
-                            title={translate(tripsFeature.translationKey)}
-                            icon={tripsFeature.icon}
-                            iconWidth={variables.menuIconSize}
-                            iconHeight={variables.menuIconSize}
-                            interactive={false}
-                            displayInDefaultIconColor
-                            wrapperStyle={[styles.p0, styles.cursorAuto]}
-                            containerStyle={[styles.m0, styles.wAuto]}
-                            numberOfLinesTitle={0}
-                        />
-                    </View>
-                ))}
-            </View>
-            <SearchScopeProvider isOnSearch={false}>
-                <BookTravelButton
-                    text={translate('search.searchResults.emptyTripResults.buttonText')}
-                    activePolicyID={activePolicy?.id}
-                />
-            </SearchScopeProvider>
-        </>
-    );
+                        <TextLink
+                            onLongPress={onLongPress}
+                            onPress={() => {
+                                Linking.openURL(CONST.BOOK_TRAVEL_DEMO_URL);
+                            }}
+                            ref={handleContextMenuAnchorRef}
+                        >
+                            {translate('travel.bookADemo')}
+                        </TextLink>
+                    </PressableWithSecondaryInteraction>
+                    {translate('travel.toLearnMore')}
+                </Text>
+                <View style={[styles.flex1, styles.flexRow, styles.flexWrap, styles.rowGap4, styles.pt4, styles.pl1, styles.mb5]}>
+                    {tripsFeatures.map((tripsFeature) => (
+                        <View
+                            key={tripsFeature.translationKey}
+                            style={styles.w100}
+                        >
+                            <MenuItem
+                                title={translate(tripsFeature.translationKey)}
+                                icon={tripsFeature.icon}
+                                iconWidth={variables.menuIconSize}
+                                iconHeight={variables.menuIconSize}
+                                interactive={false}
+                                displayInDefaultIconColor
+                                wrapperStyle={[styles.p0, styles.cursorAuto]}
+                                containerStyle={[styles.m0, styles.wAuto]}
+                                numberOfLinesTitle={0}
+                            />
+                        </View>
+                    ))}
+                </View>
+                <SearchScopeProvider isOnSearch={false}>
+                    <BookTravelButton
+                        text={translate('search.searchResults.emptyTripResults.buttonText')}
+                        activePolicyID={activePolicy?.id}
+                    />
+                </SearchScopeProvider>
+            </>
+        );
+    }, [contextMenuAnchor, handleContextMenuAnchorRef, styles, translate, activePolicy?.id, tripsFeatures]);
 
     // Default 'Folder' lottie animation, along with its background styles
     const defaultViewItemHeader = useSearchEmptyStateIllustration();
 
-    const startTestDriveAction = () => {
-        startTestDrive(introSelected, tryNewDot?.hasBeenAddedToNudgeMigration ?? false, isUserPaidPolicyMember);
-    };
-
-    let content: EmptySearchViewItem | undefined;
-
-    // Begin by going through all of our To-do searches, and returning their empty state
-    // if it exists
-    for (const menuItem of typeMenuItems) {
-        if (menuItem.similarSearchHash === similarSearchHash && menuItem.emptyState) {
-            content = {
-                ...defaultViewItemHeader.fireworks,
-                title: translate(menuItem.emptyState.title),
-                subtitle: translate(menuItem.emptyState.subtitle),
-                buttons: menuItem.emptyState.buttons?.map((button) => ({
-                    ...button,
-                    buttonText: translate(button.buttonText),
-                })),
-            };
-            break;
+    const content: EmptySearchViewItem = useMemo(() => {
+        // Begin by going through all of our To-do searches, and returning their empty state
+        // if it exists
+        for (const menuItem of typeMenuItems) {
+            if (menuItem.similarSearchHash === similarSearchHash && menuItem.emptyState) {
+                return {
+                    ...defaultViewItemHeader.fireworks,
+                    title: translate(menuItem.emptyState.title),
+                    subtitle: translate(menuItem.emptyState.subtitle),
+                    buttons: menuItem.emptyState.buttons?.map((button) => ({
+                        ...button,
+                        buttonText: translate(button.buttonText),
+                    })),
+                };
+            }
         }
-    }
 
-    // If we didn't match a specific search hash, show a specific message based on the type of the data
-    if (!content) {
+        const startTestDriveAction = () => {
+            startTestDrive(introSelected, tryNewDot?.hasBeenAddedToNudgeMigration ?? false, isUserPaidPolicyMember);
+        };
+
+        // If we didn't match a specific search hash, show a specific message based on the type of the data
         switch (type) {
             case CONST.SEARCH.DATA_TYPES.TRIP:
-                content = {
+                return {
                     headerMediaType: CONST.EMPTY_STATE_MEDIA.ANIMATION,
                     headerMedia: LottieAnimations.TripsEmptyState,
                     headerContentStyles: [styles.emptyStateFolderWebStyles, StyleUtils.getBackgroundColorStyle(theme.travelBG)],
@@ -342,22 +352,16 @@ function EmptySearchViewContent({
                     children: tripViewChildren,
                     lottieWebViewStyles: {backgroundColor: theme.travelBG, ...styles.emptyStateFolderWebStyles, ...styles.tripEmptyStateLottieWebView},
                 };
-                break;
             case CONST.SEARCH.DATA_TYPES.EXPENSE_REPORT:
-                if (!isFilteredWorkspaceAccessible) {
-                    content = {
-                        ...defaultViewItemHeader.folder,
-                        title: translate('search.searchResults.emptyResults.title'),
-                        subtitle: translate('search.searchResults.emptyResults.subtitle'),
-                    };
-                } else if (hasResults && (!queryJSON || !isDefaultExpenseReportsQuery(queryJSON) || hasExpenseReports)) {
-                    content = {
+                if (hasResults && (!queryJSON || !isDefaultExpenseReportsQuery(queryJSON) || hasExpenseReports)) {
+                    return {
                         ...defaultViewItemHeader.folder,
                         title: translate('search.searchResults.emptyResults.title'),
                         subtitle: translate('search.searchResults.emptyResults.subtitle'),
                     };
-                } else if (!hasResults || !hasExpenseReports) {
-                    content = {
+                }
+                if (!hasResults || !hasExpenseReports) {
+                    return {
                         ...defaultViewItemHeader.folder,
                         title: translate('search.searchResults.emptyReportResults.title'),
                         subtitle: translate(hasSeenTour ? 'search.searchResults.emptyReportResults.subtitleWithOnlyCreateButton' : 'search.searchResults.emptyReportResults.subtitle'),
@@ -403,55 +407,47 @@ function EmptySearchViewContent({
                 }
             // eslint-disable-next-line no-fallthrough
             case CONST.SEARCH.DATA_TYPES.EXPENSE:
-                if (!content) {
-                    if (!isFilteredWorkspaceAccessible) {
-                        content = {
-                            ...defaultViewItemHeader.folder,
-                            title: translate('search.searchResults.emptyResults.title'),
-                            subtitle: translate('search.searchResults.emptyResults.subtitle'),
-                        };
-                    } else if (hasResults && (!queryJSON || !isDefaultExpensesQuery(queryJSON) || hasTransactions)) {
-                        content = {
-                            ...defaultViewItemHeader.folder,
-                            title: translate('search.searchResults.emptyResults.title'),
-                            subtitle: translate('search.searchResults.emptyResults.subtitle'),
-                        };
-                    } else if (!hasResults || !hasTransactions) {
-                        content = {
-                            ...defaultViewItemHeader.folder,
-                            title: translate('search.searchResults.emptyExpenseResults.title'),
-                            subtitle: translate(hasSeenTour ? 'search.searchResults.emptyExpenseResults.subtitleWithOnlyCreateButton' : 'search.searchResults.emptyExpenseResults.subtitle'),
-                            buttons: [
-                                ...(!hasSeenTour
-                                    ? [
-                                          {
-                                              buttonText: translate('emptySearchView.takeATestDrive'),
-                                              buttonAction: startTestDriveAction,
-                                          },
-                                      ]
-                                    : []),
-                                {
-                                    buttonText: translate('iou.createExpense'),
-                                    buttonAction: () =>
-                                        interceptAnonymousUser(() => {
-                                            if (shouldRedirectToExpensifyClassic) {
-                                                setModalVisible(true);
-                                                return;
-                                            }
-                                            startMoneyRequest(CONST.IOU.TYPE.CREATE, generateReportID());
-                                        }),
-                                    success: true,
-                                },
-                            ],
-                        };
-                    }
+                if (hasResults && (!queryJSON || !isDefaultExpensesQuery(queryJSON) || hasTransactions)) {
+                    return {
+                        ...defaultViewItemHeader.folder,
+                        title: translate('search.searchResults.emptyResults.title'),
+                        subtitle: translate('search.searchResults.emptyResults.subtitle'),
+                    };
+                }
+                if (!hasResults || !hasTransactions) {
+                    return {
+                        ...defaultViewItemHeader.folder,
+                        title: translate('search.searchResults.emptyExpenseResults.title'),
+                        subtitle: translate(hasSeenTour ? 'search.searchResults.emptyExpenseResults.subtitleWithOnlyCreateButton' : 'search.searchResults.emptyExpenseResults.subtitle'),
+                        buttons: [
+                            ...(!hasSeenTour
+                                ? [
+                                      {
+                                          buttonText: translate('emptySearchView.takeATestDrive'),
+                                          buttonAction: startTestDriveAction,
+                                      },
+                                  ]
+                                : []),
+                            {
+                                buttonText: translate('iou.createExpense'),
+                                buttonAction: () =>
+                                    interceptAnonymousUser(() => {
+                                        if (shouldRedirectToExpensifyClassic) {
+                                            setModalVisible(true);
+                                            return;
+                                        }
+                                        startMoneyRequest(CONST.IOU.TYPE.CREATE, generateReportID());
+                                    }),
+                                success: true,
+                            },
+                        ],
+                    };
                 }
-                break;
             // We want to display the default nothing to show message if there is any filter applied.
             // eslint-disable-next-line no-fallthrough
             case CONST.SEARCH.DATA_TYPES.INVOICE:
-                if (!content && !hasResults) {
-                    content = {
+                if (!hasResults) {
+                    return {
                         title: translate('search.searchResults.emptyInvoiceResults.title'),
                         subtitle: translate(hasSeenTour ? 'search.searchResults.emptyInvoiceResults.subtitleWithOnlyCreateButton' : 'search.searchResults.emptyInvoiceResults.subtitle'),
                         buttons: [
@@ -479,29 +475,41 @@ function EmptySearchViewContent({
                         ...defaultViewItemHeader.folder,
                     };
                 }
-                break;
             // eslint-disable-next-line no-fallthrough
             case CONST.SEARCH.DATA_TYPES.CHAT:
             default:
-                if (!content) {
-                    content = {
-                        ...defaultViewItemHeader.folder,
-                        title: translate('search.searchResults.emptyResults.title'),
-                        subtitle: translate('search.searchResults.emptyResults.subtitle'),
-                    };
-                }
-                break;
+                return {
+                    ...defaultViewItemHeader.folder,
+                    title: translate('search.searchResults.emptyResults.title'),
+                    subtitle: translate('search.searchResults.emptyResults.subtitle'),
+                };
         }
-    }
-
-    // Fallback to default content if somehow not set (should never happen in practice)
-    if (!content) {
-        content = {
-            ...defaultViewItemHeader.folder,
-            title: translate('search.searchResults.emptyResults.title'),
-            subtitle: translate('search.searchResults.emptyResults.subtitle'),
-        };
-    }
+    }, [
+        type,
+        typeMenuItems,
+        similarSearchHash,
+        translate,
+        StyleUtils,
+        theme.travelBG,
+        styles.emptyStateFolderWebStyles,
+        styles.textAlignLeft,
+        styles.tripEmptyStateLottieWebView,
+        introSelected,
+        tryNewDot?.hasBeenAddedToNudgeMigration,
+        isUserPaidPolicyMember,
+        hasResults,
+        defaultViewItemHeader.fireworks,
+        defaultViewItemHeader.folder,
+        hasSeenTour,
+        groupPoliciesWithChatEnabled.length,
+        tripViewChildren,
+        hasTransactions,
+        shouldRedirectToExpensifyClassic,
+        hasExpenseReports,
+        defaultChatEnabledPolicyID,
+        handleCreateReportClick,
+        queryJSON,
+    ]);
 
     return (
         <>
diff --git a/src/pages/Search/SearchAdvancedFiltersPage/SearchFiltersCategoryPage.tsx b/src/pages/Search/SearchAdvancedFiltersPage/SearchFiltersCategoryPage.tsx
index bb612bf80622..d15cd32db223 100644
--- a/src/pages/Search/SearchAdvancedFiltersPage/SearchFiltersCategoryPage.tsx
+++ b/src/pages/Search/SearchAdvancedFiltersPage/SearchFiltersCategoryPage.tsx
@@ -9,6 +9,7 @@ import useOnyx from '@hooks/useOnyx';
 import useThemeStyles from '@hooks/useThemeStyles';
 import {getDecodedCategoryName} from '@libs/CategoryUtils';
 import Navigation from '@libs/Navigation/Navigation';
+import {getPersonalPolicy} from '@libs/PolicyUtils';
 import {updateAdvancedFilters} from '@userActions/Search';
 import CONST from '@src/CONST';
 import ONYXKEYS from '@src/ONYXKEYS';
@@ -16,12 +17,22 @@ import ROUTES from '@src/ROUTES';
 import type {PolicyCategories, PolicyCategory} from '@src/types/onyx';
 import {getEmptyObject} from '@src/types/utils/EmptyObject';
 
+const availableNonPersonalPolicyCategoriesSelector = (policyCategories: OnyxCollection<PolicyCategories>) =>
+    Object.fromEntries(
+        Object.entries(policyCategories ?? {}).filter(([key, categories]) => {
+            if (key === `${ONYXKEYS.COLLECTION.POLICY_CATEGORIES}${getPersonalPolicy()?.id}`) {
+                return false;
+            }
+            const availableCategories = Object.values(categories ?? {}).filter((category) => category.pendingAction !== CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE);
+            return availableCategories.length > 0;
+        }),
+    );
+
 function SearchFiltersCategoryPage() {
     const styles = useThemeStyles();
     const {translate} = useLocalize();
 
     const [searchAdvancedFiltersForm] = useOnyx(ONYXKEYS.FORMS.SEARCH_ADVANCED_FILTERS_FORM, {canBeMissing: true});
-    const [personalPolicyID] = useOnyx(ONYXKEYS.PERSONAL_POLICY_ID, {canBeMissing: true});
     const selectedCategoriesItems = searchAdvancedFiltersForm?.category?.map((category) => {
         if (category === CONST.SEARCH.CATEGORY_EMPTY_VALUE) {
             return {name: translate('search.noCategory'), value: category};
@@ -29,28 +40,10 @@ function SearchFiltersCategoryPage() {
         return {name: category, value: category};
     });
     const policyIDs = searchAdvancedFiltersForm?.policyID ?? [];
-
-    const availableNonPersonalPolicyCategoriesSelector = useCallback(
-        (policyCategories: OnyxCollection<PolicyCategories>) =>
-            Object.fromEntries(
-                Object.entries(policyCategories ?? {}).filter(([key, categories]) => {
-                    if (key === `${ONYXKEYS.COLLECTION.POLICY_CATEGORIES}${personalPolicyID}`) {
-                        return false;
-                    }
-                    const availableCategories = Object.values(categories ?? {}).filter((category) => category.pendingAction !== CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE);
-                    return availableCategories.length > 0;
-                }),
-            ),
-        [personalPolicyID],
-    );
-    const [allPolicyCategories = getEmptyObject<NonNullable<OnyxCollection<PolicyCategories>>>()] = useOnyx(
-        ONYXKEYS.COLLECTION.POLICY_CATEGORIES,
-        {
-            canBeMissing: false,
-            selector: availableNonPersonalPolicyCategoriesSelector,
-        },
-        [availableNonPersonalPolicyCategoriesSelector],
-    );
+    const [allPolicyCategories = getEmptyObject<NonNullable<OnyxCollection<PolicyCategories>>>()] = useOnyx(ONYXKEYS.COLLECTION.POLICY_CATEGORIES, {
+        canBeMissing: false,
+        selector: availableNonPersonalPolicyCategoriesSelector,
+    });
 
     const selectedPoliciesCategories: PolicyCategory[] = Object.keys(allPolicyCategories ?? {})
         .filter((key) => policyIDs?.map((policyID) => `${ONYXKEYS.COLLECTION.POLICY_CATEGORIES}${policyID}`)?.includes(key))
diff --git a/src/pages/Search/SearchColumnsPage.tsx b/src/pages/Search/SearchColumnsPage.tsx
index a0e4b181d35d..3371887504cb 100644
--- a/src/pages/Search/SearchColumnsPage.tsx
+++ b/src/pages/Search/SearchColumnsPage.tsx
@@ -25,13 +25,8 @@ import ROUTES from '@src/ROUTES';
 import type {SearchAdvancedFiltersForm} from '@src/types/form';
 
 type ColumnItem = {
-    text: string;
-    value: SearchCustomColumnIds;
-    keyForList: SearchCustomColumnIds;
+    columnId: SearchCustomColumnIds;
     isSelected: boolean;
-    isDisabled: boolean;
-    isDragDisabled: boolean;
-    leftElement: React.JSX.Element;
 };
 
 function SearchColumnsPage() {
@@ -68,19 +63,21 @@ function SearchColumnsPage() {
         const unselected = columnsToSort
             .filter((col) => !col.isSelected)
             .sort((a, b) => {
-                const textA = translate(getSearchColumnTranslationKey(a.value));
-                const textB = translate(getSearchColumnTranslationKey(b.value));
+                const textA = translate(getSearchColumnTranslationKey(a.columnId));
+                const textB = translate(getSearchColumnTranslationKey(b.columnId));
                 return localeCompare(textA, textB);
             });
         return [...selected, ...unselected];
     };
 
-    const defaultColumns = allCustomColumns.map((columnId) => ({
-        columnId,
-        isSelected: defaultCustomColumns.has(columnId),
-    }));
+    const defaultColumns = sortColumns(
+        allCustomColumns.map((columnId) => ({
+            columnId,
+            isSelected: defaultCustomColumns.has(columnId),
+        })),
+    );
 
-    const [columns, setColumns] = useState(() => {
+    const [columns, setColumns] = useState<ColumnItem[]>(() => {
         const selectedColumnIds = searchAdvancedFiltersForm?.columns?.filter((columnId) => allCustomColumns.includes(columnId)) ?? [];
 
         if (!selectedColumnIds.length) {
@@ -90,35 +87,33 @@ function SearchColumnsPage() {
         const selected = selectedColumnIds.map((columnId) => ({columnId, isSelected: true}));
         const unselected = allCustomColumns.filter((columnId) => !selectedColumnIds.includes(columnId)).map((columnId) => ({columnId, isSelected: false}));
 
-        return [...selected, ...unselected];
+        return sortColumns([...selected, ...unselected]);
     });
 
     const selectedColumnIds = columns.filter((col) => col.isSelected).map((col) => col.columnId);
 
-    const allColumnsList = sortColumns(
-        columns.map(({columnId, isSelected}) => {
-            const isRequired = requiredColumns.has(columnId);
-            const isEffectivelySelected = isRequired || isSelected;
-            const isDragDisabled = !isEffectivelySelected;
-            return {
-                text: translate(getSearchColumnTranslationKey(columnId)),
-                value: columnId,
-                keyForList: columnId,
-                isSelected: isEffectivelySelected,
-                isDisabled: isRequired,
-                isDragDisabled,
-                leftElement: (
-                    <View style={[styles.mr3, isDragDisabled && styles.cursorDisabled]}>
-                        <Icon
-                            src={icons.DragHandles}
-                            fill={theme.icon}
-                            additionalStyles={isDragDisabled && styles.opacitySemiTransparent}
-                        />
-                    </View>
-                ),
-            };
-        }),
-    );
+    const allColumnsList = columns.map(({columnId, isSelected}) => {
+        const isRequired = requiredColumns.has(columnId);
+        const isEffectivelySelected = isRequired || isSelected;
+        const isDragDisabled = !isEffectivelySelected;
+        return {
+            text: translate(getSearchColumnTranslationKey(columnId)),
+            value: columnId,
+            keyForList: columnId,
+            isSelected: isEffectivelySelected,
+            isDisabled: isRequired,
+            isDragDisabled,
+            leftElement: (
+                <View style={[styles.mr3, isDragDisabled && styles.cursorDisabled]}>
+                    <Icon
+                        src={icons.DragHandles}
+                        fill={theme.icon}
+                        additionalStyles={isDragDisabled && styles.opacitySemiTransparent}
+                    />
+                </View>
+            ),
+        };
+    });
 
     const typeColumnsList = allColumnsList.filter((column) => allTypeCustomColumns.includes(column.keyForList));
     const groupColumnsList = allColumnsList.filter((column) => allGroupCustomColumns.includes(column.keyForList));
@@ -155,7 +150,7 @@ function SearchColumnsPage() {
             }
 
             const updatedColumns = prevColumns.map((col) => (col.columnId === updatedColumnId ? {...col, isSelected: false} : col));
-            return updatedColumns;
+            return sortColumns(updatedColumns);
         });
     };
 
@@ -163,14 +158,14 @@ function SearchColumnsPage() {
         const newGroupColumns = data.map((item) => ({columnId: item.value, isSelected: item.isSelected}));
         const existingTypeColumns = typeColumnsList.map((item) => ({columnId: item.value, isSelected: item.isSelected}));
         const newColumns = [...existingTypeColumns, ...newGroupColumns];
-        setColumns(newColumns);
+        setColumns(sortColumns(newColumns));
     };
 
     const onTypeDragEnd = ({data}: {data: typeof allColumnsList}) => {
         const newTypeColumns = data.map((item) => ({columnId: item.value, isSelected: item.isSelected}));
         const existingGroupColumns = groupColumnsList.map((item) => ({columnId: item.value, isSelected: item.isSelected}));
         const newColumns = [...existingGroupColumns, ...newTypeColumns];
-        setColumns(newColumns);
+        setColumns(sortColumns(newColumns));
     };
 
     const resetColumns = () => {
diff --git a/src/pages/Search/SearchHoldReasonPage.tsx b/src/pages/Search/SearchHoldReasonPage.tsx
index f979a6f47ffc..468cafd5c174 100644
--- a/src/pages/Search/SearchHoldReasonPage.tsx
+++ b/src/pages/Search/SearchHoldReasonPage.tsx
@@ -1,5 +1,4 @@
-import React, {useCallback, useContext, useEffect} from 'react';
-import {DelegateNoAccessContext} from '@components/DelegateNoAccessModalProvider';
+import React, {useCallback, useEffect} from 'react';
 import type {FormInputErrors, FormOnyxValues} from '@components/Form/types';
 import {useSearchContext} from '@components/Search/SearchContext';
 import useAncestors from '@hooks/useAncestors';
@@ -30,14 +29,8 @@ function SearchHoldReasonPage({route}: SearchHoldReasonPageProps) {
     const ancestors = useAncestors(report);
 
     const [allReportActions] = useOnyx(ONYXKEYS.COLLECTION.REPORT_ACTIONS, {canBeMissing: true});
-    const {isDelegateAccessRestricted, showDelegateNoAccessModal} = useContext(DelegateNoAccessContext);
     const onSubmit = useCallback(
         ({comment}: FormOnyxValues<typeof ONYXKEYS.FORMS.MONEY_REQUEST_HOLD_FORM>) => {
-            if (isDelegateAccessRestricted) {
-                showDelegateNoAccessModal();
-                return;
-            }
-
             if (route.name === SCREENS.SEARCH.MONEY_REQUEST_REPORT_HOLD_TRANSACTIONS) {
                 putTransactionsOnHold(context.selectedTransactionIDs, comment, reportID, ancestors);
                 context.clearSelectedTransactions(true);
@@ -48,7 +41,7 @@ function SearchHoldReasonPage({route}: SearchHoldReasonPageProps) {
 
             Navigation.goBack();
         },
-        [route.name, context, reportID, allTransactions, allReportActions, ancestors, isDelegateAccessRestricted, showDelegateNoAccessModal],
+        [route.name, context, reportID, allTransactions, allReportActions, ancestors],
     );
 
     const validate = useCallback(
diff --git a/src/pages/Search/SearchMoneyRequestReportPage.tsx b/src/pages/Search/SearchMoneyRequestReportPage.tsx
index 351a8fbe848a..cfeb0082a01d 100644
--- a/src/pages/Search/SearchMoneyRequestReportPage.tsx
+++ b/src/pages/Search/SearchMoneyRequestReportPage.tsx
@@ -1,29 +1,25 @@
 import {PortalHost} from '@gorhom/portal';
-import {useIsFocused} from '@react-navigation/native';
-import React, {useCallback, useEffect, useMemo, useRef, useState} from 'react';
+import React, {useEffect, useMemo, useRef, useState} from 'react';
 import type {FlatList} from 'react-native';
-import type {OnyxCollection, OnyxEntry} from 'react-native-onyx';
+import {View} from 'react-native';
+import type {OnyxCollection} from 'react-native-onyx';
 import FullPageNotFoundView from '@components/BlockingViews/FullPageNotFoundView';
 import DragAndDropProvider from '@components/DragAndDrop/Provider';
 import MoneyRequestReportView from '@components/MoneyRequestReportView/MoneyRequestReportView';
 import ScreenWrapper from '@components/ScreenWrapper';
 import {useSearchContext} from '@components/Search/SearchContext';
-import useShowSuperWideRHPVersion from '@components/WideRHPContextProvider/useShowSuperWideRHPVersion';
-import WideRHPOverlayWrapper from '@components/WideRHPOverlayWrapper';
 import useIsReportReadyToDisplay from '@hooks/useIsReportReadyToDisplay';
 import useNetwork from '@hooks/useNetwork';
 import useOnyx from '@hooks/useOnyx';
 import usePaginatedReportActions from '@hooks/usePaginatedReportActions';
-import usePrevious from '@hooks/usePrevious';
 import useReportIsArchived from '@hooks/useReportIsArchived';
 import useResponsiveLayout from '@hooks/useResponsiveLayout';
 import useThemeStyles from '@hooks/useThemeStyles';
 import useTransactionsAndViolationsForReport from '@hooks/useTransactionsAndViolationsForReport';
 import getNonEmptyStringOnyxID from '@libs/getNonEmptyStringOnyxID';
-import Log from '@libs/Log';
 import {getAllNonDeletedTransactions} from '@libs/MoneyRequestReportUtils';
 import type {PlatformStackScreenProps} from '@libs/Navigation/PlatformStackNavigation/types';
-import type {RightModalNavigatorParamList} from '@libs/Navigation/types';
+import type {SearchFullscreenNavigatorParamList} from '@libs/Navigation/types';
 import {
     getFilteredReportActionsForReportView,
     getIOUActionForTransactionID,
@@ -33,21 +29,18 @@ import {
     isMoneyRequestAction,
 } from '@libs/ReportActionsUtils';
 import {isValidReportIDFromPath} from '@libs/ReportUtils';
-import {isDefaultAvatar, isLetterAvatar, isPresetAvatar} from '@libs/UserAvatarUtils';
 import Navigation from '@navigation/Navigation';
 import ReactionListWrapper from '@pages/home/ReactionListWrapper';
-import {createTransactionThreadReport, openReport, updateLastVisitTime} from '@userActions/Report';
+import {createTransactionThreadReport, openReport} from '@userActions/Report';
 import CONST from '@src/CONST';
 import ONYXKEYS from '@src/ONYXKEYS';
 import type {ActionListContextType, ScrollPosition} from '@src/pages/home/ReportScreenContext';
 import {ActionListContext} from '@src/pages/home/ReportScreenContext';
-import SCREENS from '@src/SCREENS';
-import type {PersonalDetailsList, Policy, Transaction, TransactionViolations} from '@src/types/onyx';
+import type SCREENS from '@src/SCREENS';
+import type {Policy, Transaction, TransactionViolations} from '@src/types/onyx';
 import {getEmptyObject} from '@src/types/utils/EmptyObject';
 
-type SearchMoneyRequestPageProps =
-    | PlatformStackScreenProps<RightModalNavigatorParamList, typeof SCREENS.RIGHT_MODAL.SEARCH_MONEY_REQUEST_REPORT>
-    | PlatformStackScreenProps<RightModalNavigatorParamList, typeof SCREENS.RIGHT_MODAL.EXPENSE_REPORT>;
+type SearchMoneyRequestPageProps = PlatformStackScreenProps<SearchFullscreenNavigatorParamList, typeof SCREENS.SEARCH.MONEY_REQUEST_REPORT>;
 
 const defaultReportMetadata = {
     isLoadingInitialReportActions: true,
@@ -62,22 +55,13 @@ function SearchMoneyRequestReportPage({route}: SearchMoneyRequestPageProps) {
     const {shouldUseNarrowLayout} = useResponsiveLayout();
     const styles = useThemeStyles();
     const {isOffline} = useNetwork();
+
     const reportIDFromRoute = getNonEmptyStringOnyxID(route.params?.reportID);
-    const {currentSearchResults: snapshot} = useSearchContext();
+    const {currentSearchHash} = useSearchContext();
+    const [snapshot] = useOnyx(`${ONYXKEYS.COLLECTION.SNAPSHOT}${currentSearchHash}`, {canBeMissing: true});
 
     const [report] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${reportIDFromRoute}`, {allowStaleData: true, canBeMissing: true});
 
-    const isFocused = useIsFocused();
-
-    useEffect(() => {
-        // Update last visit time when the expense super wide RHP report is focused
-        if (!reportIDFromRoute || !isFocused || route.name !== SCREENS.RIGHT_MODAL.EXPENSE_REPORT) {
-            return;
-        }
-
-        updateLastVisitTime(reportIDFromRoute);
-    }, [reportIDFromRoute, isFocused, route.name]);
-
     const snapshotReport = useMemo(() => {
         // eslint-disable-next-line @typescript-eslint/no-deprecated
         return (snapshot?.data?.[`${ONYXKEYS.COLLECTION.REPORT}${reportIDFromRoute}`] ?? {}) as typeof report;
@@ -117,23 +101,6 @@ function SearchMoneyRequestReportPage({route}: SearchMoneyRequestPageProps) {
     const oneTransactionID = reportTransactions.at(0)?.transactionID;
 
     const reportID = report?.reportID;
-    const doesReportIDLookValid = isValidReportIDFromPath(reportID);
-    const ownerAccountID = report?.ownerAccountID;
-    const ownerPersonalDetailsSelector = useCallback(
-        (personalDetailsList: OnyxEntry<PersonalDetailsList>) => {
-            if (!ownerAccountID) {
-                return undefined;
-            }
-
-            return personalDetailsList?.[ownerAccountID];
-        },
-        [ownerAccountID],
-    );
-    const [ownerPersonalDetails] = useOnyx(ONYXKEYS.PERSONAL_DETAILS_LIST, {selector: ownerPersonalDetailsSelector, canBeMissing: true}, [ownerAccountID]);
-    const doesOwnerHavePersonalDetails = !!ownerPersonalDetails;
-    const doesOwnerHaveAvatar = !!ownerPersonalDetails?.avatar;
-    const doesOwnerHaveDefaultAvatar =
-        isDefaultAvatar(ownerPersonalDetails?.avatar) || isPresetAvatar(ownerPersonalDetails?.avatar) || isLetterAvatar(ownerPersonalDetails?.originalFileName);
 
     // Prevents creating duplicate transaction threads for legacy transactions
     const hasCreatedLegacyThreadRef = useRef(false);
@@ -157,17 +124,7 @@ function SearchMoneyRequestReportPage({route}: SearchMoneyRequestPageProps) {
         return {snapshotTransaction: transaction, snapshotViolations: violations};
     }, [snapshot?.data, allReportTransactions]);
 
-    // If there is more than one transaction, display the report in Super Wide RHP, otherwise it will be shown in Wide RHP
-    const shouldShowSuperWideRHP = visibleTransactions.length > 1;
-
-    useShowSuperWideRHPVersion(shouldShowSuperWideRHP);
-
     useEffect(() => {
-        // Guard prevents calling openReport for multi-transaction reports
-        if (visibleTransactions.length > 2) {
-            return;
-        }
-
         if (transactionThreadReportID === CONST.FAKE_REPORT_ID && oneTransactionID) {
             const iouAction = getIOUActionForTransactionID(reportActions, oneTransactionID);
             createTransactionThreadReport(report, iouAction);
@@ -175,14 +132,9 @@ function SearchMoneyRequestReportPage({route}: SearchMoneyRequestPageProps) {
         }
 
         openReport(reportIDFromRoute, '', [], undefined, undefined, false, [], undefined);
-
-        // oneTransactionID dependency handles the case when deleting a transaction:
-        // oneTransactionID updates after transactionThreadReportID,
-        // so we need it in dependencies to re-run the effect with the correct remaining transaction.
-        // For more details see https://github.com/Expensify/App/pull/80107
         // We don't want this hook to re-run on the every report change
         // eslint-disable-next-line react-hooks/exhaustive-deps
-    }, [reportIDFromRoute, transactionThreadReportID, oneTransactionID]);
+    }, [reportIDFromRoute, transactionThreadReportID]);
 
     useEffect(() => {
         hasCreatedLegacyThreadRef.current = false;
@@ -241,7 +193,8 @@ function SearchMoneyRequestReportPage({route}: SearchMoneyRequestPageProps) {
         visibleTransactions,
     ]);
 
-    const shouldShowAccessErrorPage = useMemo(
+    // eslint-disable-next-line rulesdir/no-negated-variables
+    const shouldShowNotFoundPage = useMemo(
         (): boolean => {
             if (isLoadingApp !== false) {
                 return false;
@@ -251,50 +204,14 @@ function SearchMoneyRequestReportPage({route}: SearchMoneyRequestPageProps) {
                 return true;
             }
 
-            return !!reportID && !doesReportIDLookValid;
+            return !!reportID && !isValidReportIDFromPath(reportID);
         },
-
-        // isLoadingApp intentionally omitted to avoid re-computing after initial load completes.
         // eslint-disable-next-line react-hooks/exhaustive-deps
-        [reportID, reportMetadata?.isLoadingInitialReportActions, doesReportIDLookValid],
+        [reportID, reportMetadata?.isLoadingInitialReportActions],
     );
-    const prevShouldShowAccessErrorPage = usePrevious(shouldShowAccessErrorPage);
-    const participantCount = Object.keys(report?.participants ?? {}).length;
-
-    useEffect(() => {
-        if (!shouldShowAccessErrorPage || prevShouldShowAccessErrorPage) {
-            return;
-        }
 
-        Log.info('[SearchMoneyRequestReportPage] shouldShowAccessErrorPage changed to true', false, {
-            reportIDFromRoute,
-            reportID,
-            doesReportIDLookValid,
-            isLoadingApp,
-            isLoadingInitialReportActions: reportMetadata?.isLoadingInitialReportActions,
-            ownerAccountID,
-            doesOwnerHavePersonalDetails,
-            doesOwnerHaveAvatar,
-            doesOwnerHaveDefaultAvatar,
-            participantCount,
-        });
-    }, [
-        doesOwnerHaveAvatar,
-        doesOwnerHaveDefaultAvatar,
-        doesOwnerHavePersonalDetails,
-        doesReportIDLookValid,
-        isLoadingApp,
-        ownerAccountID,
-        participantCount,
-        prevShouldShowAccessErrorPage,
-        reportID,
-        reportIDFromRoute,
-        reportMetadata?.isLoadingInitialReportActions,
-        shouldShowAccessErrorPage,
-    ]);
-
-    return (
-        <WideRHPOverlayWrapper>
+    if (shouldUseNarrowLayout) {
+        return (
             <ActionListContext.Provider value={actionListValue}>
                 <ReactionListWrapper>
                     <ScreenWrapper
@@ -303,7 +220,7 @@ function SearchMoneyRequestReportPage({route}: SearchMoneyRequestPageProps) {
                         offlineIndicatorStyle={styles.mtAuto}
                     >
                         <FullPageNotFoundView
-                            shouldShow={shouldShowAccessErrorPage}
+                            shouldShow={shouldShowNotFoundPage}
                             subtitleKey="notFound.noAccess"
                             subtitleStyle={[styles.textSupporting]}
                             shouldDisplaySearchRouter
@@ -319,13 +236,49 @@ function SearchMoneyRequestReportPage({route}: SearchMoneyRequestPageProps) {
                                     key={report?.reportID}
                                     backToRoute={route.params.backTo}
                                 />
-                                <PortalHost name="suggestions" />
                             </DragAndDropProvider>
                         </FullPageNotFoundView>
                     </ScreenWrapper>
                 </ReactionListWrapper>
             </ActionListContext.Provider>
-        </WideRHPOverlayWrapper>
+        );
+    }
+
+    return (
+        <ActionListContext.Provider value={actionListValue}>
+            <ReactionListWrapper>
+                <ScreenWrapper
+                    testID="SearchMoneyRequestReportPage"
+                    shouldEnableMaxHeight
+                    offlineIndicatorStyle={styles.mtAuto}
+                >
+                    <View style={[styles.searchSplitContainer, styles.flexColumn, styles.flex1]}>
+                        <FullPageNotFoundView
+                            shouldShow={shouldShowNotFoundPage}
+                            subtitleKey="notFound.noAccess"
+                            subtitleStyle={[styles.textSupporting]}
+                            shouldDisplaySearchRouter
+                            shouldShowBackButton={shouldUseNarrowLayout}
+                            onBackButtonPress={Navigation.goBack}
+                        >
+                            <DragAndDropProvider isDisabled={isEditingDisabled}>
+                                <View style={[styles.flex1, styles.justifyContentEnd, styles.overflowHidden]}>
+                                    <MoneyRequestReportView
+                                        report={reportToUse}
+                                        reportMetadata={reportMetadata}
+                                        policy={policy}
+                                        shouldDisplayReportFooter={isCurrentReportLoadedFromOnyx}
+                                        key={report?.reportID}
+                                        backToRoute={route.params.backTo}
+                                    />
+                                </View>
+                                <PortalHost name="suggestions" />
+                            </DragAndDropProvider>
+                        </FullPageNotFoundView>
+                    </View>
+                </ScreenWrapper>
+            </ReactionListWrapper>
+        </ActionListContext.Provider>
     );
 }
 
diff --git a/src/pages/Search/SearchMoneyRequestReportVerifyAccountPage.tsx b/src/pages/Search/SearchMoneyRequestReportVerifyAccountPage.tsx
index 0a667946a789..a8a61a29b1f1 100644
--- a/src/pages/Search/SearchMoneyRequestReportVerifyAccountPage.tsx
+++ b/src/pages/Search/SearchMoneyRequestReportVerifyAccountPage.tsx
@@ -1,5 +1,4 @@
 import React from 'react';
-import Navigation from '@libs/Navigation/Navigation';
 import type {PlatformStackScreenProps} from '@libs/Navigation/PlatformStackNavigation/types';
 import type {SearchReportActionsParamList} from '@libs/Navigation/types';
 import VerifyAccountPageBase from '@pages/settings/VerifyAccountPageBase';
@@ -9,13 +8,7 @@ import type SCREENS from '@src/SCREENS';
 type SearchMoneyRequestReportVerifyAccountPageProps = PlatformStackScreenProps<SearchReportActionsParamList, typeof SCREENS.SEARCH.MONEY_REQUEST_REPORT_VERIFY_ACCOUNT>;
 
 function SearchMoneyRequestReportVerifyAccountPage({route}: SearchMoneyRequestReportVerifyAccountPageProps) {
-    const topmostSuperWideRHPReportParams = Navigation.getTopmostSuperWideRHPReportParams();
-    const {reportID, backTo} = topmostSuperWideRHPReportParams ?? {};
-    const navigateBackTo =
-        reportID === route.params.reportID
-            ? ROUTES.SEARCH_MONEY_REQUEST_REPORT.getRoute({reportID: route.params.reportID, backTo})
-            : ROUTES.SEARCH_MONEY_REQUEST_REPORT.getRoute({reportID: route.params.reportID});
-    return <VerifyAccountPageBase navigateBackTo={navigateBackTo} />;
+    return <VerifyAccountPageBase navigateBackTo={ROUTES.SEARCH_MONEY_REQUEST_REPORT.getRoute({reportID: route.params.reportID})} />;
 }
 
 export default SearchMoneyRequestReportVerifyAccountPage;
diff --git a/src/pages/Search/SearchPage.tsx b/src/pages/Search/SearchPage.tsx
index 61df2302045e..4207312b6934 100644
--- a/src/pages/Search/SearchPage.tsx
+++ b/src/pages/Search/SearchPage.tsx
@@ -40,7 +40,7 @@ import {setupMergeTransactionDataAndNavigate} from '@libs/actions/MergeTransacti
 import {moveIOUReportToPolicy, moveIOUReportToPolicyAndInviteSubmitter, searchInServer} from '@libs/actions/Report';
 import {
     approveMoneyRequestOnSearch,
-    deleteMoneyRequestOnSearch,
+    bulkDeleteReports,
     exportSearchItemsToCSV,
     getExportTemplates,
     getLastPolicyBankAccountID,
@@ -79,7 +79,7 @@ import {
     isInvoiceReport,
     isIOUReport as isIOUReportUtil,
 } from '@libs/ReportUtils';
-import {buildSearchQueryJSON, buildSearchQueryString} from '@libs/SearchQueryUtils';
+import {buildSearchQueryJSON} from '@libs/SearchQueryUtils';
 import {shouldRestrictUserBillableActions} from '@libs/SubscriptionUtils';
 import {hasTransactionBeenRejected} from '@libs/TransactionUtils';
 import type {ReceiptFile} from '@pages/iou/request/step/IOURequestStepScan/types';
@@ -91,7 +91,7 @@ import CONST from '@src/CONST';
 import ONYXKEYS from '@src/ONYXKEYS';
 import ROUTES from '@src/ROUTES';
 import type SCREENS from '@src/SCREENS';
-import type {Policy, Report, SearchResults, Transaction} from '@src/types/onyx';
+import type {Policy, Report, SearchResults, Transaction, TransactionViolations} from '@src/types/onyx';
 import type {FileObject} from '@src/types/utils/Attachment';
 import SearchPageNarrow from './SearchPageNarrow';
 import SearchPageWide from './SearchPageWide';
@@ -135,11 +135,11 @@ function SearchPage({route}: SearchPageProps) {
     const {showConfirmModal} = useConfirmModal();
     const {isBetaEnabled} = usePermissions();
     const isDEWBetaEnabled = isBetaEnabled(CONST.BETAS.NEW_DOT_DEW);
-    const isCustomReportNamesBetaEnabled = isBetaEnabled(CONST.BETAS.CUSTOM_REPORT_NAMES);
     const [isHoldEducationalModalVisible, setIsHoldEducationalModalVisible] = useState(false);
     const [rejectModalAction, setRejectModalAction] = useState<ValueOf<
         typeof CONST.REPORT.TRANSACTION_SECONDARY_ACTIONS.HOLD | typeof CONST.REPORT.TRANSACTION_SECONDARY_ACTIONS.REJECT
     > | null>(null);
+    const [emptyReportsCount, setEmptyReportsCount] = useState<number>(0);
 
     const [dismissedRejectUseExplanation] = useOnyx(ONYXKEYS.NVP_DISMISSED_REJECT_USE_EXPLANATION, {canBeMissing: true});
     const [dismissedHoldUseExplanation] = useOnyx(ONYXKEYS.NVP_DISMISSED_HOLD_USE_EXPLANATION, {canBeMissing: true});
@@ -242,18 +242,6 @@ function SearchPage({route}: SearchPageProps) {
         }
     }, [lastSearchType, queryJSON, setLastSearchType, currentSearchResults]);
 
-    // Peggy injects default sortBy/sortOrder at parse time, so queryJSON
-    // can differ from the URL’s raw query. When they diverge, we need to replace the URL
-    useEffect(() => {
-        if (!queryJSON || !route.params.q) {
-            return;
-        }
-        const normalizedQueryString = buildSearchQueryString(queryJSON);
-        if (normalizedQueryString !== route.params.q) {
-            Navigation.navigate(ROUTES.SEARCH_ROOT.getRoute({query: normalizedQueryString}), {forceReplace: true});
-        }
-    }, [queryJSON, route.params.q]);
-
     const {status, hash} = queryJSON ?? {};
     const selectedTransactionsKeys = Object.keys(selectedTransactions ?? {});
 
@@ -311,6 +299,22 @@ function SearchPage({route}: SearchPageProps) {
             return;
         }
 
+        const emptyReports =
+            selectedReports?.filter((selectedReport) => {
+                if (!selectedReport) {
+                    return false;
+                }
+                const fullReport = currentSearchResults?.data?.[`${ONYXKEYS.COLLECTION.REPORT}${selectedReport.reportID}`];
+                return (fullReport?.transactionCount ?? 0) === 0;
+            }) ?? [];
+        const hasOnlyEmptyReports = selectedReports.length > 0 && emptyReports.length === selectedReports.length;
+
+        if (hasOnlyEmptyReports) {
+            setEmptyReportsCount(emptyReports.length);
+            setIsDownloadErrorModalVisible(true);
+            return;
+        }
+
         if (areAllMatchingItemsSelected) {
             const result = await showConfirmModal({
                 title: translate('search.exportSearchResults.title'),
@@ -344,6 +348,7 @@ function SearchPage({route}: SearchPageProps) {
                 transactionIDList: selectedTransactionsKeys,
             },
             () => {
+                setEmptyReportsCount(0);
                 setIsDownloadErrorModalVisible(true);
             },
             translate,
@@ -351,17 +356,17 @@ function SearchPage({route}: SearchPageProps) {
         clearSelectedTransactions(undefined, true);
     }, [
         isOffline,
-        areAllMatchingItemsSelected,
-        showConfirmModal,
-        translate,
-        selectedTransactionsKeys,
         status,
-        hash,
         selectedReports,
+        areAllMatchingItemsSelected,
         queryJSON,
-        selectAllMatchingItems,
+        selectedTransactionsKeys,
+        translate,
         clearSelectedTransactions,
-        setIsDownloadErrorModalVisible,
+        currentSearchResults?.data,
+        showConfirmModal,
+        hash,
+        selectAllMatchingItems,
     ]);
 
     const handleApproveWithDEWCheck = useCallback(async () => {
@@ -427,6 +432,38 @@ function SearchPage({route}: SearchPageProps) {
         clearSelectedTransactions,
     ]);
 
+    const {expenseCount, isAllOneTransactionReports, uniqueReportCount} = useMemo(() => {
+        let expenses = 0;
+        let hasNonOneTransactionReport = false;
+        const reportIDs = new Set<string>();
+
+        for (const key of Object.keys(selectedTransactions)) {
+            const selectedItem = selectedTransactions[key];
+            if (!selectedItem?.reportID) {
+                continue;
+            }
+            if (selectedItem.action === CONST.SEARCH.ACTION_TYPES.VIEW && key === selectedItem.reportID) {
+                hasNonOneTransactionReport = true;
+                reportIDs.add(selectedItem.reportID);
+            } else {
+                expenses += 1;
+                reportIDs.add(selectedItem.reportID);
+                if (!selectedItem.isFromOneTransactionReport) {
+                    hasNonOneTransactionReport = true;
+                }
+            }
+        }
+
+        return {expenseCount: expenses, isAllOneTransactionReports: !hasNonOneTransactionReport && expenses > 0, uniqueReportCount: reportIDs.size};
+    }, [selectedTransactions]);
+
+    // Show "delete expense" only when ALL selected items are from one-transaction reports
+    // Show "delete report" in all other cases (empty reports, multi-expense reports, or mixtures)
+    const isDeletingOnlyExpenses = isAllOneTransactionReports;
+    const deleteCount = isDeletingOnlyExpenses ? expenseCount : uniqueReportCount;
+    const deleteModalTitle = isDeletingOnlyExpenses ? translate('iou.deleteExpense', {count: expenseCount}) : translate('iou.deleteReport', {count: deleteCount});
+    const deleteModalPrompt = isDeletingOnlyExpenses ? translate('iou.deleteConfirmation', {count: expenseCount}) : translate('iou.deleteReportConfirmation', {count: deleteCount});
+
     const handleDeleteSelectedTransactions = useCallback(async () => {
         if (isOffline) {
             setIsOfflineModalVisible(true);
@@ -441,8 +478,8 @@ function SearchPage({route}: SearchPageProps) {
         // eslint-disable-next-line @typescript-eslint/no-deprecated
         InteractionManager.runAfterInteractions(async () => {
             const result = await showConfirmModal({
-                title: translate('iou.deleteExpense', {count: selectedTransactionsKeys.length}),
-                prompt: translate('iou.deleteConfirmation', {count: selectedTransactionsKeys.length}),
+                title: deleteModalTitle,
+                prompt: deleteModalPrompt,
                 confirmText: translate('common.delete'),
                 cancelText: translate('common.cancel'),
                 danger: true,
@@ -454,11 +491,28 @@ function SearchPage({route}: SearchPageProps) {
             // We need to wait for modal to fully disappear before clearing them to avoid translation flicker between singular vs plural
             // eslint-disable-next-line @typescript-eslint/no-deprecated
             InteractionManager.runAfterInteractions(() => {
-                deleteMoneyRequestOnSearch(hash, selectedTransactionsKeys);
+                const reportTransactions = allTransactions ? Object.fromEntries(Object.entries(allTransactions).filter((entry): entry is [string, Transaction] => !!entry[1])) : {};
+                const transactionsViolations = allTransactionViolations
+                    ? Object.fromEntries(Object.entries(allTransactionViolations).filter((entry): entry is [string, TransactionViolations] => !!entry[1]))
+                    : {};
+                bulkDeleteReports(hash, selectedTransactions, currentUserPersonalDetails.email ?? '', reportTransactions, transactionsViolations, bankAccountList);
                 clearSelectedTransactions();
             });
         });
-    }, [isOffline, showConfirmModal, translate, selectedTransactionsKeys, hash, clearSelectedTransactions]);
+    }, [
+        isOffline,
+        hash,
+        showConfirmModal,
+        deleteModalTitle,
+        deleteModalPrompt,
+        translate,
+        allTransactions,
+        allTransactionViolations,
+        selectedTransactions,
+        currentUserPersonalDetails.email,
+        bankAccountList,
+        clearSelectedTransactions,
+    ]);
 
     const onBulkPaySelected = useCallback(
         (paymentMethod?: PaymentMethodType, additionalData?: Record<string, unknown>) => {
@@ -524,13 +578,9 @@ function SearchPage({route}: SearchPageProps) {
                         );
                         return;
                     }
-                    // Get transactions for this report
-                    const reportTransactions = Object.values(allTransactions ?? {}).filter(
-                        (transaction): transaction is NonNullable<typeof transaction> => !!transaction && transaction.reportID === itemReportID,
-                    );
-                    const invite = moveIOUReportToPolicyAndInviteSubmitter(itemReportID, adminPolicy, formatPhoneNumber, reportTransactions, isCustomReportNamesBetaEnabled);
+                    const invite = moveIOUReportToPolicyAndInviteSubmitter(itemReportID, adminPolicy, formatPhoneNumber);
                     if (!invite?.policyExpenseChatReportID) {
-                        moveIOUReportToPolicy(itemReportID, adminPolicy, false, reportTransactions, isCustomReportNamesBetaEnabled);
+                        moveIOUReportToPolicy(itemReportID, adminPolicy);
                     }
                 }
             }
@@ -588,8 +638,6 @@ function SearchPage({route}: SearchPageProps) {
             isDelegateAccessRestricted,
             showDelegateNoAccessModal,
             personalPolicyID,
-            allTransactions,
-            isCustomReportNamesBetaEnabled,
         ],
     );
 
@@ -631,8 +679,6 @@ function SearchPage({route}: SearchPageProps) {
         const options: Array<DropdownOption<SearchHeaderOptionValue>> = [];
         const isAnyTransactionOnHold = Object.values(selectedTransactions).some((transaction) => transaction.isHeld);
 
-        const typeExpenseReport = queryJSON?.type === CONST.SEARCH.DATA_TYPES.EXPENSE_REPORT;
-
         // Gets the list of options for the export sub-menu
         // Gets the list of options for the export sub-menu
         const getExportOptions = () => {
@@ -651,6 +697,7 @@ function SearchPage({route}: SearchPageProps) {
 
             // Determine if only full reports are selected by comparing the reportIDs of the selected transactions and the reportIDs of the selected reports
             const areFullReportsSelected = selectedTransactionReportIDs.length === selectedReportIDs.length && selectedTransactionReportIDs.every((id) => selectedReportIDs.includes(id));
+            const typeExpenseReport = queryJSON?.type === CONST.SEARCH.DATA_TYPES.EXPENSE_REPORT;
             const typeInvoice = queryJSON?.type === CONST.REPORT.TYPE.INVOICE;
             const typeExpense = queryJSON?.type === CONST.REPORT.TYPE.EXPENSE;
             const isAllOneTransactionReport = Object.values(selectedTransactions).every((transaction) => transaction.isFromOneTransactionReport);
@@ -851,11 +898,6 @@ function SearchPage({route}: SearchPageProps) {
                         return;
                     }
 
-                    if (isDelegateAccessRestricted) {
-                        showDelegateNoAccessModal();
-                        return;
-                    }
-
                     unholdMoneyRequestOnSearch(hash, selectedTransactionsKeys);
                     // eslint-disable-next-line @typescript-eslint/no-deprecated
                     InteractionManager.runAfterInteractions(() => {
@@ -902,7 +944,7 @@ function SearchPage({route}: SearchPageProps) {
 
         const canAllTransactionsBeMoved = selectedTransactionsKeys.every((id) => selectedTransactions[id].canChangeReport);
 
-        if (canAllTransactionsBeMoved && !hasMultipleOwners && !typeExpenseReport) {
+        if (canAllTransactionsBeMoved && !hasMultipleOwners) {
             options.push({
                 text: translate('iou.moveExpenses', {count: selectedTransactionsKeys.length}),
                 icon: expensifyIcons.DocumentMerge,
@@ -934,20 +976,41 @@ function SearchPage({route}: SearchPageProps) {
 
         const shouldShowDeleteOption =
             !isOffline &&
-            selectedTransactionsKeys.every((id) => {
-                const transaction = currentSearchResults?.data?.[`${ONYXKEYS.COLLECTION.TRANSACTION}${id}`];
-                if (!transaction) {
-                    return false;
-                }
-                const parentReportID = transaction.reportID;
-                const parentReport = currentSearchResults?.data?.[`${ONYXKEYS.COLLECTION.REPORT}${parentReportID}`];
-                const reportActions = currentSearchResults?.data?.[`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${parentReportID}`];
-                const parentReportAction =
-                    Object.values(reportActions ?? {}).find(
-                        (action) => (isMoneyRequestAction(action) ? getOriginalMessage(action)?.IOUTransactionID : undefined) === transaction.transactionID,
-                    ) ?? selectedTransactions[id].reportAction;
-                return canDeleteMoneyRequestReport(parentReport, [transaction], parentReportAction ? [parentReportAction] : []);
-            });
+            (selectedReports.length
+                ? selectedReports.every((selectedReport) => {
+                      const fullReport = currentSearchResults?.data?.[`${ONYXKEYS.COLLECTION.REPORT}${selectedReport.reportID}`];
+                      if (!fullReport) {
+                          return false;
+                      }
+                      const reportActionsData = currentSearchResults?.data?.[`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${selectedReport.reportID}`];
+                      const reportActionsArray = Object.values(reportActionsData ?? {});
+                      const reportTransactions: Transaction[] = [];
+                      const searchData = currentSearchResults?.data ?? {};
+                      for (const key of Object.keys(searchData)) {
+                          if (!key.startsWith(ONYXKEYS.COLLECTION.TRANSACTION)) {
+                              continue;
+                          }
+                          const item = searchData[key as keyof typeof searchData] as Transaction | undefined;
+                          if (item && 'transactionID' in item && 'reportID' in item && item.reportID === selectedReport.reportID) {
+                              reportTransactions.push(item);
+                          }
+                      }
+                      return canDeleteMoneyRequestReport(fullReport, reportTransactions, reportActionsArray);
+                  })
+                : selectedTransactionsKeys.every((id) => {
+                      const transaction = currentSearchResults?.data?.[`${ONYXKEYS.COLLECTION.TRANSACTION}${id}`];
+                      if (!transaction) {
+                          return false;
+                      }
+                      const parentReportID = transaction.reportID;
+                      const parentReport = currentSearchResults?.data?.[`${ONYXKEYS.COLLECTION.REPORT}${parentReportID}`];
+                      const reportActions = currentSearchResults?.data?.[`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${parentReportID}`];
+                      const parentReportAction =
+                          Object.values(reportActions ?? {}).find(
+                              (action) => (isMoneyRequestAction(action) ? getOriginalMessage(action)?.IOUTransactionID : undefined) === transaction.transactionID,
+                          ) ?? selectedTransactions[id].reportAction;
+                      return canDeleteMoneyRequestReport(parentReport, [transaction], parentReportAction ? [parentReportAction] : []);
+                  }));
 
         if (shouldShowDeleteOption) {
             options.push({
@@ -1156,11 +1219,20 @@ function SearchPage({route}: SearchPageProps) {
         const shouldUseClientTotal = !metadata?.count || (selectedTransactionsKeys.length > 0 && !areAllMatchingItemsSelected);
         const selectedTransactionItems = Object.values(selectedTransactions);
         const currency = metadata?.currency ?? selectedTransactionItems.at(0)?.groupCurrency;
-        const count = shouldUseClientTotal ? selectedTransactionsKeys.length : metadata?.count;
+        const numberOfExpense = shouldUseClientTotal
+            ? selectedTransactionsKeys.reduce((count, key) => {
+                  const item = selectedTransactions[key];
+                  // Skip empty reports (where key is the reportID itself, not a transactionID)
+                  if (item.action === CONST.SEARCH.ACTION_TYPES.VIEW && key === item.reportID) {
+                      return count;
+                  }
+                  return count + 1;
+              }, 0)
+            : metadata?.count;
         const total = shouldUseClientTotal ? selectedTransactionItems.reduce((acc, transaction) => acc - (transaction.groupAmount ?? 0), 0) : metadata?.total;
 
-        return {count, total, currency};
-    }, [areAllMatchingItemsSelected, metadata?.count, metadata?.currency, metadata?.total, selectedTransactions, selectedTransactionsKeys.length]);
+        return {count: numberOfExpense, total, currency};
+    }, [areAllMatchingItemsSelected, metadata?.count, metadata?.currency, metadata?.total, selectedTransactions, selectedTransactionsKeys]);
 
     const onSortPressedCallback = useCallback(() => {
         setIsSorting(true);
@@ -1270,15 +1342,6 @@ function SearchPage({route}: SearchPageProps) {
                         isVisible={isOfflineModalVisible}
                         onClose={handleOfflineModalClose}
                     />
-                    <DecisionModal
-                        title={translate('common.downloadFailedTitle')}
-                        prompt={translate('common.downloadFailedDescription')}
-                        isSmallScreenWidth={isSmallScreenWidth}
-                        onSecondOptionSubmit={handleDownloadErrorModalClose}
-                        secondOptionText={translate('common.buttonConfirm')}
-                        isVisible={isDownloadErrorModalVisible}
-                        onClose={handleDownloadErrorModalClose}
-                    />
                     {!!rejectModalAction && (
                         <HoldOrRejectEducationalModal
                             onClose={dismissRejectModalBasedOnAction}
@@ -1293,6 +1356,15 @@ function SearchPage({route}: SearchPageProps) {
                     )}
                 </View>
             )}
+            <DecisionModal
+                title={translate('common.downloadFailedTitle')}
+                prompt={emptyReportsCount ? translate('common.downloadFailedEmptyReportDescription', {count: emptyReportsCount}) : translate('common.downloadFailedDescription')}
+                isSmallScreenWidth={isSmallScreenWidth}
+                onSecondOptionSubmit={handleDownloadErrorModalClose}
+                secondOptionText={translate('common.buttonConfirm')}
+                isVisible={isDownloadErrorModalVisible}
+                onClose={handleDownloadErrorModalClose}
+            />
         </>
     );
 }
diff --git a/src/pages/Search/SearchPageNarrow.tsx b/src/pages/Search/SearchPageNarrow.tsx
index b76f44407b9b..5efc0be59900 100644
--- a/src/pages/Search/SearchPageNarrow.tsx
+++ b/src/pages/Search/SearchPageNarrow.tsx
@@ -23,6 +23,7 @@ import type {BankAccountMenuItem, SearchParams, SearchQueryJSON} from '@componen
 import useHandleBackButton from '@hooks/useHandleBackButton';
 import useLocalize from '@hooks/useLocalize';
 import useNetwork from '@hooks/useNetwork';
+import useOnyx from '@hooks/useOnyx';
 import useResponsiveLayout from '@hooks/useResponsiveLayout';
 import useScrollEventEmitter from '@hooks/useScrollEventEmitter';
 import useStyleUtils from '@hooks/useStyleUtils';
@@ -35,6 +36,8 @@ import {isSearchDataLoaded} from '@libs/SearchUIUtils';
 import variables from '@styles/variables';
 import {searchInServer} from '@userActions/Report';
 import {search} from '@userActions/Search';
+import CONST from '@src/CONST';
+import ONYXKEYS from '@src/ONYXKEYS';
 import ROUTES from '@src/ROUTES';
 import type {SearchResults} from '@src/types/onyx';
 import type {SearchResultsInfo} from '@src/types/onyx/SearchResults';
@@ -80,6 +83,8 @@ function SearchPageNarrow({
     const {clearSelectedTransactions, selectedTransactions} = useSearchContext();
     const [searchRouterListVisible, setSearchRouterListVisible] = useState(false);
     const {isOffline} = useNetwork();
+    const currentSearchResultsKey = queryJSON?.hash ?? CONST.DEFAULT_NUMBER_ID;
+    const [currentSearchResults] = useOnyx(`${ONYXKEYS.COLLECTION.SNAPSHOT}${currentSearchResultsKey}`, {canBeMissing: true});
     // Controls the visibility of the educational tooltip based on user scrolling.
     // Hides the tooltip when the user is scrolling and displays it once scrolling stops.
     const triggerScrollEvent = useScrollEventEmitter();
@@ -178,7 +183,7 @@ function SearchPageNarrow({
 
     const shouldShowFooter = !!metadata?.count || Object.keys(selectedTransactions).length > 0;
     const isDataLoaded = isSearchDataLoaded(searchResults, queryJSON);
-    const shouldShowLoadingState = !isOffline && (!isDataLoaded || !!metadata?.isLoading);
+    const shouldShowLoadingState = !isOffline && (!isDataLoaded || !!currentSearchResults?.search?.isLoading);
 
     return (
         <ScreenWrapper
diff --git a/src/pages/Search/SearchRejectReasonPage.tsx b/src/pages/Search/SearchRejectReasonPage.tsx
index 770fa6af237c..583aa0f8f1d2 100644
--- a/src/pages/Search/SearchRejectReasonPage.tsx
+++ b/src/pages/Search/SearchRejectReasonPage.tsx
@@ -1,5 +1,4 @@
-import React, {useCallback, useContext, useEffect, useMemo} from 'react';
-import {DelegateNoAccessContext} from '@components/DelegateNoAccessModalProvider';
+import React, {useCallback, useEffect, useMemo} from 'react';
 import type {FormInputErrors, FormOnyxValues} from '@components/Form/types';
 import {useSearchContext} from '@components/Search/SearchContext';
 import useOnyx from '@hooks/useOnyx';
@@ -36,26 +35,20 @@ function SearchRejectReasonPage({route}: SearchRejectReasonPageProps) {
         return context.selectedTransactions;
     }, [route.name, reportID, context.selectedTransactionIDs, context.selectedTransactions]);
 
-    const {isDelegateAccessRestricted, showDelegateNoAccessModal} = useContext(DelegateNoAccessContext);
     const onSubmit = useCallback(
         ({comment}: FormOnyxValues<typeof ONYXKEYS.FORMS.MONEY_REQUEST_REJECT_FORM>) => {
-            if (isDelegateAccessRestricted) {
-                showDelegateNoAccessModal();
-                return;
-            }
-
             const urlToNavigateBack = rejectMoneyRequestsOnSearch(context.currentSearchHash, selectedTransactionsForReject, comment, allPolicies, allReports);
             if (route.name === SCREENS.SEARCH.MONEY_REQUEST_REPORT_REJECT_TRANSACTIONS) {
                 context.clearSelectedTransactions(true);
             } else {
                 context.clearSelectedTransactions();
             }
-            Navigation.dismissToSuperWideRHP();
+            Navigation.dismissModal();
             if (urlToNavigateBack) {
                 Navigation.isNavigationReady().then(() => Navigation.goBack(urlToNavigateBack as Route));
             }
         },
-        [context, allPolicies, allReports, route.name, selectedTransactionsForReject, isDelegateAccessRestricted, showDelegateNoAccessModal],
+        [context, allPolicies, allReports, route.name, selectedTransactionsForReject],
     );
 
     const validate = useCallback((values: FormOnyxValues<typeof ONYXKEYS.FORMS.MONEY_REQUEST_REJECT_FORM>) => {
diff --git a/src/pages/Search/SearchReportVerifyAccountPage.tsx b/src/pages/Search/SearchReportVerifyAccountPage.tsx
index dec305ae790c..7591ee456b9a 100644
--- a/src/pages/Search/SearchReportVerifyAccountPage.tsx
+++ b/src/pages/Search/SearchReportVerifyAccountPage.tsx
@@ -1,5 +1,4 @@
 import React from 'react';
-import Navigation from '@libs/Navigation/Navigation';
 import type {PlatformStackScreenProps} from '@libs/Navigation/PlatformStackNavigation/types';
 import type {SearchReportActionsParamList} from '@libs/Navigation/types';
 import VerifyAccountPageBase from '@pages/settings/VerifyAccountPageBase';
@@ -9,10 +8,7 @@ import type SCREENS from '@src/SCREENS';
 type SearchReportVerifyAccountPageProps = PlatformStackScreenProps<SearchReportActionsParamList, typeof SCREENS.SEARCH.REPORT_VERIFY_ACCOUNT>;
 
 function SearchReportVerifyAccountPage({route}: SearchReportVerifyAccountPageProps) {
-    const {reportID, backTo} = Navigation.getTopmostSearchReportRouteParams() ?? {};
-    const navigateBackTo =
-        reportID === route.params.reportID ? ROUTES.SEARCH_REPORT.getRoute({reportID: route.params.reportID, backTo}) : ROUTES.SEARCH_REPORT.getRoute({reportID: route.params.reportID});
-    return <VerifyAccountPageBase navigateBackTo={navigateBackTo} />;
+    return <VerifyAccountPageBase navigateBackTo={ROUTES.SEARCH_REPORT.getRoute({reportID: route.params.reportID})} />;
 }
 
 export default SearchReportVerifyAccountPage;
diff --git a/src/pages/Search/SearchTransactionsChangeReport.tsx b/src/pages/Search/SearchTransactionsChangeReport.tsx
index 2b43ee2eb795..92808341df00 100644
--- a/src/pages/Search/SearchTransactionsChangeReport.tsx
+++ b/src/pages/Search/SearchTransactionsChangeReport.tsx
@@ -1,10 +1,10 @@
 import React, {useMemo} from 'react';
 import {InteractionManager} from 'react-native';
-import type {OnyxCollection} from 'react-native-onyx';
-import {usePersonalDetails, useSession} from '@components/OnyxListItemProvider';
+import {useSession} from '@components/OnyxListItemProvider';
 import {useSearchContext} from '@components/Search/SearchContext';
 import type {ListItem} from '@components/SelectionListWithSections/types';
 import useConditionalCreateEmptyReportConfirmation from '@hooks/useConditionalCreateEmptyReportConfirmation';
+import useCurrentUserPersonalDetails from '@hooks/useCurrentUserPersonalDetails';
 import useHasPerDiemTransactions from '@hooks/useHasPerDiemTransactions';
 import useOnyx from '@hooks/useOnyx';
 import usePermissions from '@hooks/usePermissions';
@@ -13,13 +13,12 @@ import {createNewReport} from '@libs/actions/Report';
 import {changeTransactionsReport} from '@libs/actions/Transaction';
 import setNavigationActionToMicrotaskQueue from '@libs/Navigation/helpers/setNavigationActionToMicrotaskQueue';
 import Navigation from '@libs/Navigation/Navigation';
-import {getPersonalDetailsForAccountID, getReportOrDraftReport, hasViolations as hasViolationsReportUtils} from '@libs/ReportUtils';
+import {getReportOrDraftReport, hasViolations as hasViolationsReportUtils} from '@libs/ReportUtils';
 import {shouldRestrictUserBillableActions} from '@libs/SubscriptionUtils';
 import IOURequestEditReportCommon from '@pages/iou/request/step/IOURequestEditReportCommon';
 import CONST from '@src/CONST';
 import ONYXKEYS from '@src/ONYXKEYS';
 import ROUTES from '@src/ROUTES';
-import type {PersonalDetails, Transaction} from '@src/types/onyx';
 
 type TransactionGroupListItem = ListItem & {
     /** reportID of the report */
@@ -29,18 +28,6 @@ type TransactionGroupListItem = ListItem & {
 function SearchTransactionsChangeReport() {
     const {selectedTransactions, clearSelectedTransactions} = useSearchContext();
     const selectedTransactionsKeys = useMemo(() => Object.keys(selectedTransactions), [selectedTransactions]);
-    const transactions = useMemo(
-        () =>
-            Object.values(selectedTransactions).reduce(
-                (transactionsCollection, transactionItem) => {
-                    // eslint-disable-next-line no-param-reassign
-                    transactionsCollection[`${ONYXKEYS.COLLECTION.TRANSACTION}${transactionItem.transaction.transactionID}`] = transactionItem.transaction;
-                    return transactionsCollection;
-                },
-                {} as NonNullable<OnyxCollection<Transaction>>,
-            ),
-        [selectedTransactions],
-    );
     const [allReportNextSteps] = useOnyx(ONYXKEYS.COLLECTION.NEXT_STEP, {canBeMissing: true});
     const [allReports] = useOnyx(ONYXKEYS.COLLECTION.REPORT, {canBeMissing: false});
     const [allPolicies] = useOnyx(ONYXKEYS.COLLECTION.POLICY, {canBeMissing: true});
@@ -48,11 +35,12 @@ function SearchTransactionsChangeReport() {
     const hasPerDiemTransactions = useHasPerDiemTransactions(selectedTransactionsKeys);
     const {policyForMovingExpensesID, shouldSelectPolicy} = usePolicyForMovingExpenses(hasPerDiemTransactions);
     const [transactionViolations] = useOnyx(ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS, {canBeMissing: true});
+    const [allTransactions] = useOnyx(ONYXKEYS.COLLECTION.TRANSACTION, {canBeMissing: true});
     const {isBetaEnabled} = usePermissions();
     const isASAPSubmitBetaEnabled = isBetaEnabled(CONST.BETAS.ASAP_SUBMIT);
     const session = useSession();
-    const personalDetails = usePersonalDetails();
     const hasViolations = hasViolationsReportUtils(undefined, transactionViolations, session?.accountID ?? CONST.DEFAULT_NUMBER_ID, session?.email ?? '');
+    const currentUserPersonalDetails = useCurrentUserPersonalDetails();
     const policyForMovingExpenses = policyForMovingExpensesID ? allPolicies?.[`${ONYXKEYS.COLLECTION.POLICY}${policyForMovingExpensesID}`] : undefined;
     const firstTransactionKey = selectedTransactionsKeys.at(0);
     const firstTransactionReportID = firstTransactionKey ? selectedTransactions[firstTransactionKey]?.reportID : undefined;
@@ -84,9 +72,9 @@ function SearchTransactionsChangeReport() {
         const report = getReportOrDraftReport(reportIDWithOwner);
         return report?.ownerAccountID;
     }, [selectedTransactions, selectedTransactionsKeys]);
-    const targetOwnerPersonalDetails = useMemo(() => getPersonalDetailsForAccountID(targetOwnerAccountID, personalDetails) as PersonalDetails, [personalDetails, targetOwnerAccountID]);
+
     const createReportForPolicy = (shouldDismissEmptyReportsConfirmation?: boolean) => {
-        const optimisticReport = createNewReport(targetOwnerPersonalDetails, hasViolations, isASAPSubmitBetaEnabled, policyForMovingExpenses, false, shouldDismissEmptyReportsConfirmation);
+        const optimisticReport = createNewReport(currentUserPersonalDetails, hasViolations, isASAPSubmitBetaEnabled, policyForMovingExpenses, false, shouldDismissEmptyReportsConfirmation);
         const reportNextStep = allReportNextSteps?.[`${ONYXKEYS.COLLECTION.NEXT_STEP}${optimisticReport.reportID}`];
         setNavigationActionToMicrotaskQueue(() => {
             changeTransactionsReport({
@@ -98,7 +86,7 @@ function SearchTransactionsChangeReport() {
                 policy: policyForMovingExpenses,
                 reportNextStep,
                 policyCategories: allPolicyCategories?.[`${ONYXKEYS.COLLECTION.POLICY_CATEGORIES}${policyForMovingExpensesID}`],
-                allTransactions: transactions,
+                allTransactionsCollection: allTransactions,
             });
             clearSelectedTransactions();
         });
@@ -140,7 +128,7 @@ function SearchTransactionsChangeReport() {
             policy: allPolicies?.[`${ONYXKEYS.COLLECTION.POLICY}${item.policyID}`],
             reportNextStep,
             policyCategories: allPolicyCategories?.[`${ONYXKEYS.COLLECTION.POLICY_CATEGORIES}${item.policyID}`],
-            allTransactions: transactions,
+            allTransactionsCollection: allTransactions,
         });
         // eslint-disable-next-line @typescript-eslint/no-deprecated
         InteractionManager.runAfterInteractions(() => {
@@ -159,7 +147,7 @@ function SearchTransactionsChangeReport() {
             isASAPSubmitBetaEnabled,
             accountID: session?.accountID ?? CONST.DEFAULT_NUMBER_ID,
             email: session?.email ?? '',
-            allTransactions: transactions,
+            allTransactionsCollection: allTransactions,
         });
         clearSelectedTransactions();
         Navigation.goBack();
diff --git a/src/pages/Share/ShareDetailsPage.tsx b/src/pages/Share/ShareDetailsPage.tsx
index 95328ed7b151..be33fba7787b 100644
--- a/src/pages/Share/ShareDetailsPage.tsx
+++ b/src/pages/Share/ShareDetailsPage.tsx
@@ -7,7 +7,6 @@ import AttachmentPreview from '@components/AttachmentPreview';
 import Button from '@components/Button';
 import FixedFooter from '@components/FixedFooter';
 import HeaderWithBackButton from '@components/HeaderWithBackButton';
-import {usePersonalDetails} from '@components/OnyxListItemProvider';
 import {PressableWithoutFeedback} from '@components/Pressable';
 import ScreenWrapper from '@components/ScreenWrapper';
 import ScrollView from '@components/ScrollView';
@@ -19,9 +18,8 @@ import useCurrentUserPersonalDetails from '@hooks/useCurrentUserPersonalDetails'
 import {useMemoizedLazyExpensifyIcons} from '@hooks/useLazyAsset';
 import useLocalize from '@hooks/useLocalize';
 import useOnyx from '@hooks/useOnyx';
-import usePrivateIsArchivedMap from '@hooks/usePrivateIsArchivedMap';
 import useThemeStyles from '@hooks/useThemeStyles';
-import {addAttachmentWithComment, addComment, openReport} from '@libs/actions/Report';
+import {addAttachmentWithComment, addComment, getCurrentUserAccountID, openReport} from '@libs/actions/Report';
 import {canUseTouchScreen} from '@libs/DeviceCapabilities';
 import {getFileName, readFileAsync} from '@libs/fileDownload/FileUtils';
 import Navigation from '@libs/Navigation/Navigation';
@@ -55,7 +53,6 @@ function ShareDetailsPage({route}: ShareDetailsPageProps) {
     const [validatedFile] = useOnyx(ONYXKEYS.VALIDATED_FILE_OBJECT, {canBeMissing: true});
 
     const [reportAttributesDerived] = useOnyx(ONYXKEYS.DERIVED.REPORT_ATTRIBUTES, {canBeMissing: true, selector: reportsSelector});
-    const personalDetails = usePersonalDetails();
     const personalDetail = useCurrentUserPersonalDetails();
     const isTextShared = currentAttachment?.mimeType === CONST.SHARE_FILE_MIMETYPE.TXT;
     const shouldUsePreValidatedFile = shouldValidateFile(currentAttachment);
@@ -64,13 +61,8 @@ function ShareDetailsPage({route}: ShareDetailsPageProps) {
     const [errorMessage, setErrorMessage] = useState<string | undefined>(undefined);
 
     const report: OnyxEntry<ReportType> = getReportOrDraftReport(reportOrAccountID);
-    const privateIsArchivedMap = usePrivateIsArchivedMap();
-    const privateIsArchived = privateIsArchivedMap[`${ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS}${report?.reportID}`];
     const ancestors = useAncestors(report);
-    const displayReport = useMemo(
-        () => getReportDisplayOption(report, unknownUserDetails, personalDetails, privateIsArchived, reportAttributesDerived),
-        [report, unknownUserDetails, personalDetails, privateIsArchived, reportAttributesDerived],
-    );
+    const displayReport = useMemo(() => getReportDisplayOption(report, unknownUserDetails, reportAttributesDerived), [report, unknownUserDetails, reportAttributesDerived]);
 
     const shouldShowAttachment = !isTextShared;
     const fileSource = shouldUsePreValidatedFile ? (validatedFile?.uri ?? '') : (currentAttachment?.content ?? '');
@@ -126,6 +118,7 @@ function ShareDetailsPage({route}: ShareDetailsPageProps) {
     }
 
     const isDraft = isDraftReport(reportOrAccountID);
+    const currentUserID = getCurrentUserAccountID();
 
     const handleShare = () => {
         if (!currentAttachment || (shouldUsePreValidatedFile && !validatedFile)) {
@@ -147,7 +140,7 @@ function ShareDetailsPage({route}: ShareDetailsPageProps) {
                     openReport(
                         report.reportID,
                         '',
-                        displayReport.participantsList?.filter((u) => u.accountID !== personalDetail.accountID).map((u) => u.login ?? '') ?? [],
+                        displayReport.participantsList?.filter((u) => u.accountID !== currentUserID).map((u) => u.login ?? '') ?? [],
                         report,
                         undefined,
                         undefined,
diff --git a/src/pages/Share/ShareTab.tsx b/src/pages/Share/ShareTab.tsx
index 1e83dea0e327..1eda39749bf9 100644
--- a/src/pages/Share/ShareTab.tsx
+++ b/src/pages/Share/ShareTab.tsx
@@ -51,7 +51,6 @@ function ShareTab({ref}: ShareTabProps) {
     const [loginList] = useOnyx(ONYXKEYS.LOGIN_LIST, {canBeMissing: true});
     const [draftComments] = useOnyx(ONYXKEYS.COLLECTION.REPORT_DRAFT_COMMENT, {canBeMissing: true});
     const [nvpDismissedProductTraining] = useOnyx(ONYXKEYS.NVP_DISMISSED_PRODUCT_TRAINING, {canBeMissing: true});
-    const [visibleReportActionsData] = useOnyx(ONYXKEYS.DERIVED.VISIBLE_REPORT_ACTIONS, {canBeMissing: true});
     const {accountID: currentUserAccountID} = useCurrentUserPersonalDetails();
     useImperativeHandle(ref, () => ({
         focus: selectionListRef.current?.focusTextInput,
@@ -80,9 +79,8 @@ function ShareTab({ref}: ShareTabProps) {
             includeUserToInvite: true,
             countryCode,
             loginList,
-            visibleReportActionsData,
         });
-    }, [areOptionsInitialized, options, draftComments, nvpDismissedProductTraining, betas, textInputValue, countryCode, loginList, visibleReportActionsData]);
+    }, [areOptionsInitialized, options, draftComments, nvpDismissedProductTraining, betas, textInputValue, countryCode, loginList]);
 
     const recentReportsOptions = useMemo(() => {
         if (textInputValue.trim() === '') {
diff --git a/src/pages/Share/SubmitDetailsPage.tsx b/src/pages/Share/SubmitDetailsPage.tsx
index 3705b202264d..1777ffefcef3 100644
--- a/src/pages/Share/SubmitDetailsPage.tsx
+++ b/src/pages/Share/SubmitDetailsPage.tsx
@@ -13,7 +13,6 @@ import useLocalize from '@hooks/useLocalize';
 import useOnyx from '@hooks/useOnyx';
 import usePermissions from '@hooks/usePermissions';
 import usePersonalPolicy from '@hooks/usePersonalPolicy';
-import usePrivateIsArchivedMap from '@hooks/usePrivateIsArchivedMap';
 import useReportIsArchived from '@hooks/useReportIsArchived';
 import useThemeStyles from '@hooks/useThemeStyles';
 import type {GpsPoint} from '@libs/actions/IOU';
@@ -57,7 +56,6 @@ function SubmitDetailsPage({
     const [lastLocationPermissionPrompt] = useOnyx(ONYXKEYS.NVP_LAST_LOCATION_PERMISSION_PROMPT, {canBeMissing: false});
     const [quickAction] = useOnyx(ONYXKEYS.NVP_QUICK_ACTION_GLOBAL_CREATE, {canBeMissing: true});
     const [reportAttributesDerived] = useOnyx(ONYXKEYS.DERIVED.REPORT_ATTRIBUTES, {canBeMissing: true, selector: reportsSelector});
-    const privateIsArchivedMap = usePrivateIsArchivedMap();
     const [currentDate] = useOnyx(ONYXKEYS.CURRENT_DATE, {canBeMissing: true});
     const [validFilesToUpload] = useOnyx(ONYXKEYS.VALIDATED_FILE_OBJECT, {canBeMissing: true});
     const [policyRecentlyUsedCategories] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY_RECENTLY_USED_CATEGORIES}${getIOURequestPolicyID(transaction, report)}`, {canBeMissing: true});
@@ -109,10 +107,9 @@ function SubmitDetailsPage({
     }, [reportOrAccountID, policy, personalPolicy, report, parentReport, currentDate, currentUserPersonalDetails, hasOnlyPersonalPolicies]);
 
     const selectedParticipants = unknownUserDetails ? [unknownUserDetails] : getMoneyRequestParticipantsFromReport(report, currentUserPersonalDetails.accountID);
-    const participants = selectedParticipants.map((participant) => {
-        const privateIsArchived = privateIsArchivedMap[`${ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS}${participant.reportID}`];
-        return participant?.accountID ? getParticipantsOption(participant, personalDetails) : getReportOption(participant, privateIsArchived, policy, reportAttributesDerived);
-    });
+    const participants = selectedParticipants.map((participant) =>
+        participant?.accountID ? getParticipantsOption(participant, personalDetails) : getReportOption(participant, reportAttributesDerived),
+    );
     const trimmedComment = transaction?.comment?.comment?.trim() ?? '';
     const transactionAmount = transaction?.amount ?? 0;
     const transactionTaxAmount = transaction?.taxAmount ?? 0;
diff --git a/src/pages/ShareCodePage.tsx b/src/pages/ShareCodePage.tsx
index 86e18454748a..f415b2ec3491 100644
--- a/src/pages/ShareCodePage.tsx
+++ b/src/pages/ShareCodePage.tsx
@@ -30,7 +30,6 @@ import {
     getParentNavigationSubtitle,
     getParticipantsAccountIDsForDisplay,
     getPolicyName,
-    getReportForHeader,
     getReportName,
     isExpenseReport,
     isMoneyRequestReport,
@@ -100,10 +99,8 @@ function ShareCodePage({report, policy, backTo}: ShareCodePageProps) {
         return currentUserPersonalDetails.login;
     }, [report, currentUserPersonalDetails.login, isReport, isReportArchived, isParentReportArchived, formatPhoneNumber]);
 
-    const reportForTitle = useMemo(() => getReportForHeader(report), [report]);
-
     // eslint-disable-next-line @typescript-eslint/no-deprecated
-    const title = isReport ? getReportName(reportForTitle) : (currentUserPersonalDetails.displayName ?? '');
+    const title = isReport ? getReportName(report) : (currentUserPersonalDetails.displayName ?? '');
     const urlWithTrailingSlash = addTrailingForwardSlash(environmentURL);
     const url = isReport
         ? `${urlWithTrailingSlash}${ROUTES.REPORT_WITH_ID.getRoute(report.reportID)}`
diff --git a/src/pages/TransactionDuplicate/Confirmation.tsx b/src/pages/TransactionDuplicate/Confirmation.tsx
index eba4c10cdc0d..a923c5c75b12 100644
--- a/src/pages/TransactionDuplicate/Confirmation.tsx
+++ b/src/pages/TransactionDuplicate/Confirmation.tsx
@@ -1,5 +1,5 @@
 import {useRoute} from '@react-navigation/native';
-import React, {useCallback, useContext, useMemo} from 'react';
+import React, {useCallback, useMemo} from 'react';
 import {View} from 'react-native';
 import type {OnyxEntry} from 'react-native-onyx';
 import FullPageNotFoundView from '@components/BlockingViews/FullPageNotFoundView';
@@ -12,7 +12,6 @@ import ScreenWrapper from '@components/ScreenWrapper';
 import ScrollView from '@components/ScrollView';
 import {ShowContextMenuContext} from '@components/ShowContextMenuContext';
 import Text from '@components/Text';
-import {WideRHPContext} from '@components/WideRHPContextProvider';
 import useCurrentUserPersonalDetails from '@hooks/useCurrentUserPersonalDetails';
 import useLocalize from '@hooks/useLocalize';
 import useOnyx from '@hooks/useOnyx';
@@ -65,8 +64,6 @@ function Confirmation() {
     const reportAction = Object.values(reportActions ?? {}).find(
         (action) => ReportActionsUtils.isMoneyRequestAction(action) && ReportActionsUtils.getOriginalMessage(action)?.IOUTransactionID === reviewDuplicates?.transactionID,
     );
-    const {superWideRHPRouteKeys} = useContext(WideRHPContext);
-    const isSuperWideRHPDisplayed = superWideRHPRouteKeys.length > 0;
 
     const [duplicates] = useTransactionsByID(reviewDuplicates?.duplicates);
     const [policy] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY}${report?.policyID}`, {canBeMissing: true});
@@ -82,16 +79,12 @@ function Confirmation() {
             transactionsMergeParams.transactionThreadReportID = transactionThreadReportID;
         }
         mergeDuplicates(transactionsMergeParams);
-        if (isSuperWideRHPDisplayed) {
-            Navigation.dismissToSuperWideRHP();
-            return;
-        }
         Navigation.dismissModal();
-    }, [reportAction?.childReportID, transactionsMergeParams, isSuperWideRHPDisplayed]);
+    }, [reportAction?.childReportID, transactionsMergeParams]);
 
     const handleResolveDuplicates = useCallback(() => {
         resolveDuplicates(transactionsMergeParams);
-        Navigation.dismissToSuperWideRHP();
+        Navigation.dismissModal();
     }, [transactionsMergeParams]);
 
     const contextValue = useMemo(
diff --git a/src/pages/TransactionDuplicate/Review.tsx b/src/pages/TransactionDuplicate/Review.tsx
index f0940abb5522..d8633034acfa 100644
--- a/src/pages/TransactionDuplicate/Review.tsx
+++ b/src/pages/TransactionDuplicate/Review.tsx
@@ -16,7 +16,7 @@ import usePermissions from '@hooks/usePermissions';
 import useThemeStyles from '@hooks/useThemeStyles';
 import useTransactionViolations from '@hooks/useTransactionViolations';
 import {openReport} from '@libs/actions/Report';
-import {dismissDuplicateTransactionViolation, getDuplicateTransactionDetails} from '@libs/actions/Transaction';
+import {dismissDuplicateTransactionViolation} from '@libs/actions/Transaction';
 import {setActiveTransactionIDs} from '@libs/actions/TransactionThreadNavigation';
 import Navigation from '@libs/Navigation/Navigation';
 import type {PlatformStackRouteProp} from '@libs/Navigation/PlatformStackNavigation/types';
@@ -59,9 +59,14 @@ function TransactionDuplicateReview() {
         [transactionIDs],
     );
 
-    const [allTransactions] = useOnyx(ONYXKEYS.COLLECTION.TRANSACTION, {canBeMissing: true});
-    const transactions = useMemo(() => transactionsSelector(allTransactions ?? {}), [allTransactions, transactionsSelector]);
-
+    const [transactions] = useOnyx(
+        ONYXKEYS.COLLECTION.TRANSACTION,
+        {
+            selector: transactionsSelector,
+            canBeMissing: true,
+        },
+        [transactionIDs],
+    );
     const originalTransactionIDsListRef = useRef<string[] | null>(null);
     const [transactionIDsList = getEmptyArray<string>()] = useOnyx(ONYXKEYS.TRANSACTION_THREAD_NAVIGATION_TRANSACTION_IDS, {
         canBeMissing: true,
@@ -92,14 +97,7 @@ function TransactionDuplicateReview() {
     );
 
     const keepAll = () => {
-        dismissDuplicateTransactionViolation({
-            transactionIDs,
-            dismissedPersonalDetails: currentPersonalDetails,
-            expenseReport,
-            policy,
-            isASAPSubmitBetaEnabled,
-            allTransactions,
-        });
+        dismissDuplicateTransactionViolation(transactionIDs, currentPersonalDetails, expenseReport, policy, isASAPSubmitBetaEnabled);
         Navigation.goBack();
     };
 
@@ -112,13 +110,6 @@ function TransactionDuplicateReview() {
         openReport(route.params.threadReportID);
     }, [report?.reportID, route.params.threadReportID]);
 
-    useEffect(() => {
-        if (!transactionID) {
-            return;
-        }
-        getDuplicateTransactionDetails(transactionID);
-    }, [transactionID]);
-
     const isLoadingPage = (!report?.reportID && reportMetadata?.isLoadingInitialReportActions !== false) || !reportAction?.reportActionID;
 
     // eslint-disable-next-line rulesdir/no-negated-variables
diff --git a/src/pages/TransactionMerge/ConfirmationPage.tsx b/src/pages/TransactionMerge/ConfirmationPage.tsx
index 2bf99902001d..72a673fb5fb3 100644
--- a/src/pages/TransactionMerge/ConfirmationPage.tsx
+++ b/src/pages/TransactionMerge/ConfirmationPage.tsx
@@ -59,9 +59,6 @@ function ConfirmationPage({route}: ConfirmationPageProps) {
     const targetTransactionThreadReportID = getTransactionThreadReportID(targetTransaction);
     const [targetTransactionThreadReport] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${targetTransactionThreadReportID}`, {canBeMissing: true});
     const [targetTransactionThreadParentReport] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${getNonEmptyStringOnyxID(targetTransactionThreadReport?.parentReportID)}`, {canBeMissing: true});
-    const [targetTransactionThreadParentReportNextStep] = useOnyx(`${ONYXKEYS.COLLECTION.NEXT_STEP}${getNonEmptyStringOnyxID(targetTransactionThreadReport?.parentReportID)}`, {
-        canBeMissing: true,
-    });
 
     // Build the merged transaction data for display
     const mergedTransactionData = buildMergedTransactionData(targetTransaction, mergeTransaction);
@@ -80,7 +77,6 @@ function ConfirmationPage({route}: ConfirmationPageProps) {
             sourceTransaction,
             targetTransactionThreadReport,
             targetTransactionThreadParentReport,
-            targetTransactionThreadParentReportNextStep,
             allTransactionViolations,
             policy,
             policyTags,
@@ -107,7 +103,7 @@ function ConfirmationPage({route}: ConfirmationPageProps) {
                 Navigation.dismissModalWithReport({reportID: reportIDToDismiss});
             }
         } else {
-            Navigation.dismissToSuperWideRHP();
+            Navigation.dismissModal();
         }
     };
 
diff --git a/src/pages/Travel/FlightTripDetails.tsx b/src/pages/Travel/FlightTripDetails.tsx
index dfa715410781..469d1a59eaf8 100644
--- a/src/pages/Travel/FlightTripDetails.tsx
+++ b/src/pages/Travel/FlightTripDetails.tsx
@@ -60,7 +60,7 @@ function FlightTripDetails({reservation, prevReservation, personalDetails}: Flig
                         width={variables.iconSizeNormal}
                         fill={theme.icon}
                     />
-                    <RenderHTML html={translate('travel.flightDetails.layover', layover)} />
+                    <RenderHTML html={translate('travel.flightDetails.layover', {layover})} />
                 </View>
             )}
             <MenuItemWithTopDescription
diff --git a/src/pages/Travel/PublicDomainErrorPage.tsx b/src/pages/Travel/PublicDomainErrorPage.tsx
index cad665b12a4e..e9a719b16373 100644
--- a/src/pages/Travel/PublicDomainErrorPage.tsx
+++ b/src/pages/Travel/PublicDomainErrorPage.tsx
@@ -7,13 +7,9 @@ import HeaderWithBackButton from '@components/HeaderWithBackButton';
 import ScreenWrapper from '@components/ScreenWrapper';
 import Text from '@components/Text';
 import useLocalize from '@hooks/useLocalize';
-import useOnyx from '@hooks/useOnyx';
 import useThemeStyles from '@hooks/useThemeStyles';
 import Navigation from '@libs/Navigation/Navigation';
 import type {TravelNavigatorParamList} from '@libs/Navigation/types';
-import AccessOrNotFoundWrapper from '@pages/workspace/AccessOrNotFoundWrapper';
-import CONST from '@src/CONST';
-import ONYXKEYS from '@src/ONYXKEYS';
 import type SCREENS from '@src/SCREENS';
 
 type PublicDomainErrorPageProps = StackScreenProps<TravelNavigatorParamList, typeof SCREENS.TRAVEL.PUBLIC_DOMAIN_ERROR>;
@@ -21,40 +17,34 @@ type PublicDomainErrorPageProps = StackScreenProps<TravelNavigatorParamList, typ
 function PublicDomainErrorPage({route}: PublicDomainErrorPageProps) {
     const styles = useThemeStyles();
     const {translate} = useLocalize();
-    const [activePolicyID] = useOnyx(ONYXKEYS.NVP_ACTIVE_POLICY_ID, {canBeMissing: true});
 
     return (
-        <AccessOrNotFoundWrapper
-            policyID={activePolicyID}
-            featureName={CONST.POLICY.MORE_FEATURES.IS_TRAVEL_ENABLED}
+        <ScreenWrapper
+            shouldEnableMaxHeight
+            testID="PublicDomainErrorPage"
         >
-            <ScreenWrapper
-                shouldEnableMaxHeight
-                testID="PublicDomainErrorPage"
-            >
-                <HeaderWithBackButton
-                    title={translate('travel.header')}
-                    onBackButtonPress={() => Navigation.goBack(route.params.backTo)}
-                />
-                <View style={[styles.flex1]}>
-                    <View style={[styles.mt3, styles.mr5, styles.ml5]}>
-                        <Text style={styles.headerAnonymousFooter}>{`${translate('travel.publicDomainError.title')}`}</Text>
-                    </View>
-                    <View style={[styles.mt3, styles.mr5, styles.mb5, styles.ml5]}>
-                        <Text>{translate('travel.publicDomainError.message')}</Text>
-                    </View>
+            <HeaderWithBackButton
+                title={translate('travel.header')}
+                onBackButtonPress={() => Navigation.goBack(route.params.backTo)}
+            />
+            <View style={[styles.flex1]}>
+                <View style={[styles.mt3, styles.mr5, styles.ml5]}>
+                    <Text style={styles.headerAnonymousFooter}>{`${translate('travel.publicDomainError.title')}`}</Text>
+                </View>
+                <View style={[styles.mt3, styles.mr5, styles.mb5, styles.ml5]}>
+                    <Text>{translate('travel.publicDomainError.message')}</Text>
                 </View>
-                <FixedFooter>
-                    <Button
-                        success
-                        large
-                        style={[styles.w100]}
-                        onPress={() => Navigation.closeRHPFlow()}
-                        text={translate('common.buttonConfirm')}
-                    />
-                </FixedFooter>
-            </ScreenWrapper>
-        </AccessOrNotFoundWrapper>
+            </View>
+            <FixedFooter>
+                <Button
+                    success
+                    large
+                    style={[styles.w100]}
+                    onPress={() => Navigation.closeRHPFlow()}
+                    text={translate('common.buttonConfirm')}
+                />
+            </FixedFooter>
+        </ScreenWrapper>
     );
 }
 
diff --git a/src/pages/Travel/VerifyAccountPage.tsx b/src/pages/Travel/VerifyAccountPage.tsx
index 01559efd09fc..1f78d99ee2c6 100644
--- a/src/pages/Travel/VerifyAccountPage.tsx
+++ b/src/pages/Travel/VerifyAccountPage.tsx
@@ -29,11 +29,8 @@ function VerifyAccountPage({route}: VerifyAccountPageProps) {
     // Determine where to navigate after successful OTP validation
     const navigateForwardTo = isTravelVerifiedBetaEnabled ? (travelProvisioning?.nextStepRoute ?? ROUTES.TRAVEL_TCS.getRoute(domain ?? '', policyID)) : undefined;
 
-    const handleValidationSuccess = useCallback(() => {
-        requestTravelAccess();
-    }, []);
-
     const handleClose = useCallback(() => {
+        requestTravelAccess();
         Navigation.goBack(backTo);
     }, [backTo]);
 
@@ -42,7 +39,6 @@ function VerifyAccountPage({route}: VerifyAccountPageProps) {
             navigateBackTo={backTo}
             navigateForwardTo={navigateForwardTo}
             handleClose={!isTravelVerifiedBetaEnabled ? handleClose : undefined}
-            onValidationSuccess={!isTravelVerifiedBetaEnabled ? handleValidationSuccess : undefined}
         />
     );
 }
diff --git a/src/pages/TripChatNameEditPage.tsx b/src/pages/TripChatNameEditPage.tsx
index 44c86e47fdc0..ebce4b2b4e7f 100644
--- a/src/pages/TripChatNameEditPage.tsx
+++ b/src/pages/TripChatNameEditPage.tsx
@@ -1,4 +1,4 @@
-import React from 'react';
+import React, {useCallback} from 'react';
 import FormProvider from '@components/Form/FormProvider';
 import InputWrapper from '@components/Form/InputWrapper';
 import type {FormOnyxValues} from '@components/Form/types';
@@ -34,29 +34,35 @@ function TripChatNameEditPage({report}: TripChatNameEditPageProps) {
     const reportID = report?.reportID;
     const currentChatName = getReportName(report);
 
-    const validate = (values: FormOnyxValues<typeof ONYXKEYS.FORMS.NEW_CHAT_NAME_FORM>): Errors => {
-        const errors: Errors = {};
-        const name = values[INPUT_IDS.NEW_CHAT_NAME] ?? '';
-        // Uses the spread syntax to count the number of Unicode code points instead of the number of UTF-16 code units.
-        const nameLength = [...name.trim()].length;
-        if (nameLength > CONST.REPORT_NAME_LIMIT) {
-            errors.newChatName = translate('common.error.characterLimitExceedCounter', nameLength, CONST.REPORT_NAME_LIMIT);
-        }
+    const validate = useCallback(
+        (values: FormOnyxValues<typeof ONYXKEYS.FORMS.NEW_CHAT_NAME_FORM>): Errors => {
+            const errors: Errors = {};
+            const name = values[INPUT_IDS.NEW_CHAT_NAME] ?? '';
+            // Uses the spread syntax to count the number of Unicode code points instead of the number of UTF-16 code units.
+            const nameLength = [...name.trim()].length;
+            if (nameLength > CONST.REPORT_NAME_LIMIT) {
+                errors.newChatName = translate('common.error.characterLimitExceedCounter', nameLength, CONST.REPORT_NAME_LIMIT);
+            }
 
-        if (StringUtils.isEmptyString(values[INPUT_IDS.NEW_CHAT_NAME] ?? '')) {
-            errors.newChatName = translate('common.error.fieldRequired');
-        }
+            if (StringUtils.isEmptyString(values[INPUT_IDS.NEW_CHAT_NAME] ?? '')) {
+                errors.newChatName = translate('common.error.fieldRequired');
+            }
 
-        return errors;
-    };
+            return errors;
+        },
+        [translate],
+    );
 
-    const editName = (values: FormOnyxValues<typeof ONYXKEYS.FORMS.NEW_CHAT_NAME_FORM>) => {
-        if (values[INPUT_IDS.NEW_CHAT_NAME] !== currentChatName) {
-            updateChatName(reportID, report.reportName, values[INPUT_IDS.NEW_CHAT_NAME] ?? '', CONST.REPORT.CHAT_TYPE.TRIP_ROOM);
-        }
+    const editName = useCallback(
+        (values: FormOnyxValues<typeof ONYXKEYS.FORMS.NEW_CHAT_NAME_FORM>) => {
+            if (values[INPUT_IDS.NEW_CHAT_NAME] !== currentChatName) {
+                updateChatName(reportID, report.reportName, values[INPUT_IDS.NEW_CHAT_NAME] ?? '', CONST.REPORT.CHAT_TYPE.TRIP_ROOM);
+            }
 
-        return Navigation.setNavigationActionToMicrotaskQueue(() => Navigation.goBack(ROUTES.REPORT_WITH_ID_DETAILS.getRoute(reportID)));
-    };
+            return Navigation.setNavigationActionToMicrotaskQueue(() => Navigation.goBack(ROUTES.REPORT_WITH_ID_DETAILS.getRoute(reportID)));
+        },
+        [reportID, currentChatName, report?.reportName],
+    );
 
     return (
         <ScreenWrapper
diff --git a/src/pages/domain/Admins/DomainAddAdminPage.tsx b/src/pages/domain/Admins/DomainAddAdminPage.tsx
index b3439dae3b86..2540dcbefbbe 100644
--- a/src/pages/domain/Admins/DomainAddAdminPage.tsx
+++ b/src/pages/domain/Admins/DomainAddAdminPage.tsx
@@ -53,7 +53,7 @@ function DomainAddAdminPage({route}: DomainAddAdminProps) {
     const didInvite = useRef<boolean>(false);
 
     const domainName = domainEmail ? Str.extractEmailDomain(domainEmail) : undefined;
-    const {searchTerm, debouncedSearchTerm, setSearchTerm, availableOptions, toggleSelection, areOptionsInitialized, onListEndReached} = useSearchSelector({
+    const {searchTerm, setSearchTerm, availableOptions, toggleSelection, areOptionsInitialized, onListEndReached} = useSearchSelector({
         selectionMode: CONST.SEARCH_SELECTOR.SELECTION_MODE_SINGLE,
         searchContext: CONST.SEARCH_SELECTOR.SEARCH_CONTEXT_MEMBER_INVITE,
         includeRecentReports: false,
@@ -64,8 +64,8 @@ function DomainAddAdminPage({route}: DomainAddAdminProps) {
     });
 
     useEffect(() => {
-        searchInServer(debouncedSearchTerm);
-    }, [debouncedSearchTerm]);
+        searchInServer(searchTerm);
+    }, [searchTerm]);
 
     const inviteUser = () => {
         if (didInvite.current || !currentlySelectedUser || !currentlySelectedUser.accountID || !currentlySelectedUser.login || !domainName) {
@@ -116,19 +116,6 @@ function DomainAddAdminPage({route}: DomainAddAdminProps) {
         />
     );
 
-    const headerMessage = () => {
-        const searchValue = debouncedSearchTerm.trim().toLowerCase();
-        if (!availableOptions.userToInvite && CONST.EXPENSIFY_EMAILS_OBJECT[searchValue]) {
-            return translate('messages.errorMessageInvalidEmail');
-        }
-
-        const searchedUserPersonalDetails = availableOptions.personalDetails.find(({login}) => login?.toLowerCase() === searchValue);
-        if (!availableOptions.userToInvite && searchedUserPersonalDetails?.accountID && adminIDs?.includes(searchedUserPersonalDetails.accountID)) {
-            return translate('messages.userIsAlreadyAnAdmin', {login: searchValue, name: domainName ?? ''});
-        }
-        return getHeaderMessage(filteredOptions.length > 0 || !!currentlySelectedUser, !!availableOptions.userToInvite, searchValue, countryCode, false);
-    };
-
     return (
         <DomainNotFoundPageWrapper domainAccountID={domainAccountID}>
             <ScreenWrapper
@@ -144,7 +131,13 @@ function DomainAddAdminPage({route}: DomainAddAdminProps) {
                 />
                 <SelectionList
                     sections={sections}
-                    headerMessage={headerMessage()}
+                    headerMessage={getHeaderMessage(
+                        filteredOptions.length > 0 || !!currentlySelectedUser,
+                        !!availableOptions.userToInvite,
+                        searchTerm.trim().toLowerCase(),
+                        countryCode,
+                        false,
+                    )}
                     ListItem={InviteMemberListItem}
                     textInputLabel={translate('selectionList.nameEmailOrPhoneNumber')}
                     textInputValue={searchTerm}
diff --git a/src/pages/domain/Admins/DomainAdminDetailsPage.tsx b/src/pages/domain/Admins/DomainAdminDetailsPage.tsx
index 76656a6f6d80..a36c705c946f 100644
--- a/src/pages/domain/Admins/DomainAdminDetailsPage.tsx
+++ b/src/pages/domain/Admins/DomainAdminDetailsPage.tsx
@@ -7,6 +7,7 @@ import useConfirmModal from '@hooks/useConfirmModal';
 import {useMemoizedLazyExpensifyIcons} from '@hooks/useLazyAsset';
 import useLocalize from '@hooks/useLocalize';
 import useOnyx from '@hooks/useOnyx';
+import useThemeStyles from '@hooks/useThemeStyles';
 import {getDisplayNameOrDefault} from '@libs/PersonalDetailsUtils';
 import Navigation from '@navigation/Navigation';
 import type {PlatformStackScreenProps} from '@navigation/PlatformStackNavigation/types';
@@ -14,7 +15,6 @@ import type {SettingsNavigatorParamList} from '@navigation/types';
 import BaseDomainMemberDetailsComponent from '@pages/domain/BaseDomainMemberDetailsComponent';
 import {revokeDomainAdminAccess} from '@userActions/Domain';
 import ONYXKEYS from '@src/ONYXKEYS';
-import ROUTES from '@src/ROUTES';
 import type SCREENS from '@src/SCREENS';
 import type {PersonalDetailsList} from '@src/types/onyx';
 
@@ -23,6 +23,7 @@ type DomainAdminDetailsPageProps = PlatformStackScreenProps<SettingsNavigatorPar
 function DomainAdminDetailsPage({route}: DomainAdminDetailsPageProps) {
     const {domainAccountID, accountID} = route.params;
 
+    const styles = useThemeStyles();
     const {translate, formatPhoneNumber} = useLocalize();
     const icons = useMemoizedLazyExpensifyIcons(['Info', 'ClosedSign'] as const);
 
@@ -71,17 +72,11 @@ function DomainAdminDetailsPage({route}: DomainAdminDetailsPageProps) {
             domainAccountID={domainAccountID}
             accountID={accountID}
         >
-            {domainHasOnlyOneAdmin && (
-                <MenuItem
-                    title={translate('domain.admins.resetDomain')}
-                    icon={icons.ClosedSign}
-                    onPress={() => Navigation.navigate(ROUTES.DOMAIN_RESET_DOMAIN.getRoute(domainAccountID, accountID))}
-                />
-            )}
             {!domainHasOnlyOneAdmin && (
                 <MenuItem
                     disabled={isCurrentUserPrimaryContact}
                     hintText={isCurrentUserPrimaryContact ? translate('domain.admins.cantRevokeAdminAccess') : undefined}
+                    style={styles.mb5}
                     title={translate('domain.admins.revokeAdminAccess')}
                     icon={icons.ClosedSign}
                     onPress={handleRevokeAdminAccess}
diff --git a/src/pages/domain/Admins/DomainAdminsPage.tsx b/src/pages/domain/Admins/DomainAdminsPage.tsx
index 7ab5949017c2..c241395abf69 100644
--- a/src/pages/domain/Admins/DomainAdminsPage.tsx
+++ b/src/pages/domain/Admins/DomainAdminsPage.tsx
@@ -2,7 +2,6 @@ import {adminAccountIDsSelector, adminPendingActionSelector, technicalContactSet
 import React from 'react';
 import Badge from '@components/Badge';
 import Button from '@components/Button';
-import useCurrentUserPersonalDetails from '@hooks/useCurrentUserPersonalDetails';
 import {useMemoizedLazyExpensifyIcons, useMemoizedLazyIllustrations} from '@hooks/useLazyAsset';
 import useLocalize from '@hooks/useLocalize';
 import useOnyx from '@hooks/useOnyx';
@@ -13,6 +12,7 @@ import type {PlatformStackScreenProps} from '@navigation/PlatformStackNavigation
 import type {DomainSplitNavigatorParamList} from '@navigation/types';
 import BaseDomainMembersPage from '@pages/domain/BaseDomainMembersPage';
 import {clearAdminError} from '@userActions/Domain';
+import {getCurrentUserAccountID} from '@userActions/Report';
 import ONYXKEYS from '@src/ONYXKEYS';
 import ROUTES from '@src/ROUTES';
 import type SCREENS from '@src/SCREENS';
@@ -47,7 +47,7 @@ function DomainAdminsPage({route}: DomainAdminsPageProps) {
         selector: technicalContactSettingsSelector,
     });
 
-    const {accountID: currentUserAccountID} = useCurrentUserPersonalDetails();
+    const currentUserAccountID = getCurrentUserAccountID();
     const isAdmin = adminAccountIDs?.includes(currentUserAccountID);
 
     const getCustomRightElement = (accountID: number) => {
diff --git a/src/pages/domain/BaseDomainMemberDetailsComponent.tsx b/src/pages/domain/BaseDomainMemberDetailsComponent.tsx
index de64be477c5a..2ebd59248263 100644
--- a/src/pages/domain/BaseDomainMemberDetailsComponent.tsx
+++ b/src/pages/domain/BaseDomainMemberDetailsComponent.tsx
@@ -94,6 +94,7 @@ function BaseDomainMemberDetailsComponent({domainAccountID, accountID, children}
                             />
                             {children}
                             <MenuItem
+                                style={styles.mb5}
                                 title={translate('common.profile')}
                                 icon={icons.Info}
                                 onPress={() => Navigation.navigate(ROUTES.PROFILE.getRoute(accountID, Navigation.getActiveRoute()))}
diff --git a/src/pages/domain/DomainAddedPage.tsx b/src/pages/domain/DomainAddedPage.tsx
index a9227ee0d028..d86188a1f281 100644
--- a/src/pages/domain/DomainAddedPage.tsx
+++ b/src/pages/domain/DomainAddedPage.tsx
@@ -23,8 +23,8 @@ function DomainAddedPage({route}: DomainAddedPageProps) {
     const {asset: Encryption} = useMemoizedLazyAsset(() => loadIllustration('Encryption'));
     const {translate} = useLocalize();
     const styles = useThemeStyles();
-    const domainAccountID = route.params.domainAccountID;
-    const [isAdmin, isAdminResults] = useOnyx(`${ONYXKEYS.COLLECTION.SHARED_NVP_PRIVATE_ADMIN_ACCESS}${domainAccountID}`, {canBeMissing: true});
+    const accountID = route.params.accountID;
+    const [isAdmin, isAdminResults] = useOnyx(`${ONYXKEYS.COLLECTION.SHARED_NVP_PRIVATE_ADMIN_ACCESS}${accountID}`, {canBeMissing: true});
 
     if (isLoadingOnyxValue(isAdminResults)) {
         return <FullScreenLoadingIndicator />;
@@ -45,7 +45,7 @@ function DomainAddedPage({route}: DomainAddedPageProps) {
                 descriptionStyle={styles.textSupporting}
                 buttonText={translate('domain.domainAdded.configure')}
                 shouldShowButton
-                onButtonPress={() => Navigation.navigate(ROUTES.DOMAIN_INITIAL.getRoute(domainAccountID))}
+                onButtonPress={() => Navigation.navigate(ROUTES.DOMAIN_INITIAL.getRoute(accountID))}
             />
         </ScreenWrapper>
     );
diff --git a/src/pages/domain/DomainInitialPage.tsx b/src/pages/domain/DomainInitialPage.tsx
index 5973bba18762..a46df07b1440 100644
--- a/src/pages/domain/DomainInitialPage.tsx
+++ b/src/pages/domain/DomainInitialPage.tsx
@@ -1,6 +1,6 @@
 import {findFocusedRoute, useNavigationState} from '@react-navigation/native';
 import {Str} from 'expensify-common';
-import React, {useCallback, useEffect} from 'react';
+import React, {useCallback, useEffect, useMemo} from 'react';
 import {View} from 'react-native';
 import type {ValueOf} from 'type-fest';
 import FullPageNotFoundView from '@components/BlockingViews/FullPageNotFoundView';
@@ -46,7 +46,7 @@ type DomainMenuItem = {
 type DomainInitialPageProps = PlatformStackScreenProps<DomainSplitNavigatorParamList, typeof SCREENS.DOMAIN.INITIAL>;
 
 function DomainInitialPage({route}: DomainInitialPageProps) {
-    const icons = useMemoizedLazyExpensifyIcons(['UserLock', 'UserShield']);
+    const icons = useMemoizedLazyExpensifyIcons(['UserLock']);
     const styles = useThemeStyles();
     const waitForNavigate = useWaitForNavigation();
     const {singleExecution, isExecuting} = useSingleExecution();
@@ -57,23 +57,21 @@ function DomainInitialPage({route}: DomainInitialPageProps) {
 
     const domainAccountID = route.params?.domainAccountID;
     const [domain] = useOnyx(`${ONYXKEYS.COLLECTION.DOMAIN}${domainAccountID}`, {canBeMissing: true});
-    const domainName = domain?.email ? Str.extractEmailDomain(domain.email) : undefined;
+    const domainName = domain ? Str.extractEmailDomain(domain.email) : undefined;
     const [isAdmin] = useOnyx(`${ONYXKEYS.COLLECTION.SHARED_NVP_PRIVATE_ADMIN_ACCESS}${domainAccountID}`, {canBeMissing: false});
 
-    const domainMenuItems: DomainMenuItem[] = [
-        {
-            translationKey: 'domain.domainAdmins',
-            icon: icons.UserShield,
-            action: singleExecution(waitForNavigate(() => Navigation.navigate(ROUTES.DOMAIN_ADMINS.getRoute(domainAccountID)))),
-            screenName: SCREENS.DOMAIN.ADMINS,
-        },
-        {
-            translationKey: 'domain.saml',
-            icon: icons.UserLock,
-            action: singleExecution(waitForNavigate(() => Navigation.navigate(ROUTES.DOMAIN_SAML.getRoute(domainAccountID)))),
-            screenName: SCREENS.DOMAIN.SAML,
-        },
-    ];
+    const domainMenuItems: DomainMenuItem[] = useMemo(() => {
+        const menuItems: DomainMenuItem[] = [
+            {
+                translationKey: 'domain.saml',
+                icon: icons.UserLock,
+                action: singleExecution(waitForNavigate(() => Navigation.navigate(ROUTES.DOMAIN_SAML.getRoute(domainAccountID)))),
+                screenName: SCREENS.DOMAIN.SAML,
+            },
+        ];
+
+        return menuItems;
+    }, [domainAccountID, singleExecution, waitForNavigate, icons.UserLock]);
 
     const fetchDomainData = useCallback(() => {
         if (!domainName) {
@@ -100,7 +98,7 @@ function DomainInitialPage({route}: DomainInitialPageProps) {
                 !shouldDisplayLHB && (
                     <NavigationTabBar
                         selectedTab={NAVIGATION_TABS.WORKSPACES}
-                        shouldShowFloatingButtons={false}
+                        shouldShowFloatingCameraButton={false}
                     />
                 )
             }
diff --git a/src/pages/domain/DomainNotFoundPageWrapper.tsx b/src/pages/domain/DomainNotFoundPageWrapper.tsx
index 3c81a55b6398..817ea44a4cb2 100644
--- a/src/pages/domain/DomainNotFoundPageWrapper.tsx
+++ b/src/pages/domain/DomainNotFoundPageWrapper.tsx
@@ -3,10 +3,10 @@ import {adminAccountIDsSelector} from '@selectors/Domain';
 import React, {useEffect} from 'react';
 import type {FullPageNotFoundViewProps} from '@components/BlockingViews/FullPageNotFoundView';
 import FullscreenLoadingIndicator from '@components/FullscreenLoadingIndicator';
-import useCurrentUserPersonalDetails from '@hooks/useCurrentUserPersonalDetails';
 import useOnyx from '@hooks/useOnyx';
 import Navigation from '@navigation/Navigation';
 import NotFoundPage from '@pages/ErrorPage/NotFoundPage';
+import {getCurrentUserAccountID} from '@userActions/Report';
 import ONYXKEYS from '@src/ONYXKEYS';
 import ROUTES from '@src/ROUTES';
 import isLoadingOnyxValue from '@src/types/utils/isLoadingOnyxValue';
@@ -31,7 +31,7 @@ function DomainNotFoundPageWrapper({domainAccountID, shouldBeBlocked, fullPageNo
         canBeMissing: true,
         selector: adminAccountIDsSelector,
     });
-    const {accountID: currentUserAccountID} = useCurrentUserPersonalDetails();
+    const currentUserAccountID = getCurrentUserAccountID();
     const isAdmin = adminAccountIDs?.includes(currentUserAccountID);
 
     const shouldShowFullScreenLoadingIndicator = isLoadingOnyxValue(domainMetadata);
diff --git a/src/pages/domain/DomainResetPage.tsx b/src/pages/domain/DomainResetPage.tsx
deleted file mode 100644
index 260f2bf9d63f..000000000000
--- a/src/pages/domain/DomainResetPage.tsx
+++ /dev/null
@@ -1,127 +0,0 @@
-import React, {useEffect} from 'react';
-import {View} from 'react-native';
-import FormProvider from '@components/Form/FormProvider';
-import InputWrapper from '@components/Form/InputWrapper';
-import type {FormOnyxValues} from '@components/Form/types';
-import HeaderWithBackButton from '@components/HeaderWithBackButton';
-import RenderHTML from '@components/RenderHTML';
-import ScreenWrapper from '@components/ScreenWrapper';
-import TextInput from '@components/TextInput';
-import useLocalize from '@hooks/useLocalize';
-import useOnyx from '@hooks/useOnyx';
-import useThemeStyles from '@hooks/useThemeStyles';
-import Log from '@libs/Log';
-import {sanitizePhoneOrEmail} from '@libs/LoginUtils';
-import {getFieldRequiredErrors} from '@libs/ValidationUtils';
-import Navigation from '@navigation/Navigation';
-import type {PlatformStackScreenProps} from '@navigation/PlatformStackNavigation/types';
-import type {DomainSplitNavigatorParamList} from '@navigation/types';
-import {resetDomain} from '@userActions/Domain';
-import CONST from '@src/CONST';
-import ONYXKEYS from '@src/ONYXKEYS';
-import ROUTES from '@src/ROUTES';
-import type SCREENS from '@src/SCREENS';
-import {adminAccountIDsSelector, domainNameSelector} from '@src/selectors/Domain';
-import INPUT_IDS from '@src/types/form/ResetDomainForm';
-import isLoadingOnyxValue from '@src/types/utils/isLoadingOnyxValue';
-
-type DomainResetDomainPageProps = PlatformStackScreenProps<DomainSplitNavigatorParamList, typeof SCREENS.DOMAIN.RESET_DOMAIN>;
-
-function DomainResetDomainPage({route}: DomainResetDomainPageProps) {
-    const {domainAccountID, accountID} = route.params;
-
-    const {translate} = useLocalize();
-    const styles = useThemeStyles();
-
-    const [domain, domainMetadata] = useOnyx(`${ONYXKEYS.COLLECTION.DOMAIN}${route.params.domainAccountID}`, {canBeMissing: true});
-
-    // Selectors used this way bc when useOnyx with it the metadata is wrong + we're already have domain data here
-    const domainName = domainNameSelector(domain);
-    const adminAccountIDs = adminAccountIDsSelector(domain);
-    const domainHasOnlyOneAdmin = adminAccountIDs?.length === 1;
-    const isLoadingDomain = isLoadingOnyxValue(domainMetadata);
-
-    useEffect(() => {
-        // Make sure reset domain page cannot be accessed if there is more than 1 admin
-        if (isLoadingDomain || domainHasOnlyOneAdmin) {
-            return;
-        }
-        Navigation.goBack(ROUTES.DOMAIN_ADMIN_DETAILS.getRoute(domainAccountID, accountID));
-    }, [accountID, domainAccountID, domainHasOnlyOneAdmin, isLoadingDomain]);
-
-    const missingDomainData = !domain || !domainName;
-    const isSubmitDisabled = missingDomainData || !domainHasOnlyOneAdmin;
-
-    const handleResetDomain = () => {
-        if (isSubmitDisabled) {
-            Log.hmmm('Domain data is missing or there are more than 1 admin left');
-            return;
-        }
-        resetDomain(route.params.domainAccountID, domainName, domain);
-        Navigation.goBack(ROUTES.WORKSPACES_LIST.route);
-    };
-
-    const validate = (values: FormOnyxValues<typeof ONYXKEYS.FORMS.RESET_DOMAIN_FORM>) => {
-        const errors = getFieldRequiredErrors(values, ['domainName']);
-
-        if (values.domainName && domainName) {
-            const isValid = sanitizePhoneOrEmail(domainName) === sanitizePhoneOrEmail(values.domainName);
-
-            if (!isValid) {
-                errors.domainName = translate('domain.admins.error.removeDomainNameInvalid');
-            }
-        }
-
-        return errors;
-    };
-
-    return (
-        <ScreenWrapper
-            shouldEnableMaxHeight
-            shouldUseCachedViewportHeight
-            testID="DomainResetDomainPage"
-            enableEdgeToEdgeBottomSafeAreaPadding
-        >
-            <HeaderWithBackButton
-                title={translate('domain.admins.resetDomain')}
-                onBackButtonPress={() => Navigation.goBack()}
-            />
-
-            <FormProvider
-                formID={ONYXKEYS.FORMS.RESET_DOMAIN_FORM}
-                validate={validate}
-                onSubmit={handleResetDomain}
-                submitButtonText={translate('domain.admins.resetDomain')}
-                style={[styles.flexGrow1, styles.mh5]}
-                isSubmitActionDangerous
-                isSubmitDisabled={isSubmitDisabled}
-            >
-                <View
-                    fsClass={CONST.FULLSTORY.CLASS.UNMASK}
-                    style={styles.flexGrow1}
-                >
-                    <View style={styles.mt5}>
-                        <RenderHTML
-                            html={translate('domain.admins.resetDomainInfo')}
-                            onLinkPress={() => Navigation.navigate(ROUTES.SETTINGS_CONTACT_METHODS.getRoute(Navigation.getActiveRoute()))}
-                        />
-                    </View>
-                    <View style={styles.mt5}>
-                        <RenderHTML html={translate('domain.admins.resetDomainExplanation', {domainName})} />
-                    </View>
-                    <InputWrapper
-                        InputComponent={TextInput}
-                        inputID={INPUT_IDS.DOMAIN_NAME}
-                        label={translate('domain.admins.enterDomainName')}
-                        aria-label={translate('domain.admins.enterDomainName')}
-                        role={CONST.ROLE.PRESENTATION}
-                        containerStyles={styles.mt5}
-                        forwardedFSClass={CONST.FULLSTORY.CLASS.UNMASK}
-                    />
-                </View>
-            </FormProvider>
-        </ScreenWrapper>
-    );
-}
-
-export default DomainResetDomainPage;
diff --git a/src/pages/home/HeaderView.tsx b/src/pages/home/HeaderView.tsx
index 22b7934d13a2..699d249accd4 100644
--- a/src/pages/home/HeaderView.tsx
+++ b/src/pages/home/HeaderView.tsx
@@ -48,8 +48,6 @@ import {
     getPolicyName,
     getReportDescription,
     getReportName,
-    getReportStatusColorStyle,
-    getReportStatusTranslation,
     hasReportNameError,
     isAdminRoom,
     isArchivedReport,
@@ -61,7 +59,6 @@ import {
     isDeprecatedGroupDM,
     isExpenseRequest,
     isGroupChat as isGroupChatReportUtils,
-    isInvoiceReport,
     isInvoiceRoom,
     isOneTransactionThread,
     isOpenTaskReport,
@@ -142,9 +139,7 @@ function HeaderView({report, parentReportAction, onNavigationMenuButtonClicked,
     const isChatRoom = isChatRoomReportUtils(report);
     const isPolicyExpenseChat = isPolicyExpenseChatReportUtils(report);
     const isTaskReport = isTaskReportReportUtils(report);
-    // This is used to check if the report is a chat thread and has a parent invoice report.
-    const isParentInvoiceAndIsChatThread = isChatThread && !!parentReport && isInvoiceReport(parentReport);
-    const reportHeaderData = (!isTaskReport && !isChatThread && report?.parentReportID) || isParentInvoiceAndIsChatThread ? parentReport : report;
+    const reportHeaderData = !isTaskReport && !isChatThread && report?.parentReportID ? parentReport : report;
     const isParentOneTransactionThread = isOneTransactionThread(parentReport, grandParentReport, grandParentReportActions?.[`${parentReport?.parentReportActionID}`]);
     const parentNavigationReport = isParentOneTransactionThread ? parentReport : reportHeaderData;
     const isReportHeaderDataArchived = useReportIsArchived(reportHeaderData?.reportID);
@@ -153,11 +148,6 @@ function HeaderView({report, parentReportAction, onNavigationMenuButtonClicked,
     // eslint-disable-next-line @typescript-eslint/no-deprecated
     const title = getReportName(reportHeaderData, policy, parentReportAction, personalDetails, invoiceReceiverPolicy, undefined, undefined, isReportHeaderDataArchived);
     const subtitle = getChatRoomSubtitle(reportHeaderData, false, isReportHeaderDataArchived);
-    // This is used to get the status badge for invoice report subtitle.
-    const statusTextForInvoiceReport = isParentInvoiceAndIsChatThread
-        ? getReportStatusTranslation({stateNum: reportHeaderData?.stateNum, statusNum: reportHeaderData?.statusNum, translate})
-        : undefined;
-    const statusColorForInvoiceReport = isParentInvoiceAndIsChatThread ? getReportStatusColorStyle(theme, reportHeaderData?.stateNum, reportHeaderData?.statusNum) : {};
     const isParentReportHeaderDataArchived = useReportIsArchived(reportHeaderData?.parentReportID);
     const parentNavigationSubtitleData = getParentNavigationSubtitle(parentNavigationReport, isParentReportHeaderDataArchived);
     const reportDescription = Parser.htmlToText(getReportDescription(report));
@@ -330,9 +320,6 @@ function HeaderView({report, parentReportAction, onNavigationMenuButtonClicked,
                                         </CaretWrapper>
                                         {!isEmptyObject(parentNavigationSubtitleData) && (
                                             <ParentNavigationSubtitle
-                                                statusText={statusTextForInvoiceReport}
-                                                statusTextColor={statusColorForInvoiceReport?.textColor}
-                                                statusTextBackgroundColor={statusColorForInvoiceReport?.backgroundColor}
                                                 parentNavigationSubtitleData={parentNavigationSubtitleData}
                                                 reportID={parentNavigationReport?.reportID}
                                                 parentReportID={parentNavigationReport?.parentReportID}
diff --git a/src/pages/home/ReportScreen.tsx b/src/pages/home/ReportScreen.tsx
index 625d5a4a7a97..e6a752a84ed4 100644
--- a/src/pages/home/ReportScreen.tsx
+++ b/src/pages/home/ReportScreen.tsx
@@ -59,10 +59,10 @@ import {
     isCreatedAction,
     isDeletedParentAction,
     isMoneyRequestAction,
-    isReportActionVisible,
     isSentMoneyReportAction,
     isTransactionThread,
     isWhisperAction,
+    shouldReportActionBeVisible,
 } from '@libs/ReportActionsUtils';
 import {
     canEditReportAction,
@@ -303,7 +303,6 @@ function ReportScreen({route, navigation, isInSidePanel = false}: ReportScreenPr
 
     const [currentUserAccountID = -1] = useOnyx(ONYXKEYS.SESSION, {selector: accountIDSelector, canBeMissing: false});
     const [isLoadingApp] = useOnyx(ONYXKEYS.IS_LOADING_APP, {canBeMissing: true});
-    const [visibleReportActionsData] = useOnyx(ONYXKEYS.DERIVED.VISIBLE_REPORT_ACTIONS, {canBeMissing: true});
     const {reportActions: unfilteredReportActions, linkedAction, sortedAllReportActions, hasNewerActions, hasOlderActions} = usePaginatedReportActions(reportID, reportActionIDFromRoute);
     // wrapping in useMemo because this is array operation and can cause performance issues
     const reportActions = useMemo(() => getFilteredReportActionsForReportView(unfilteredReportActions), [unfilteredReportActions]);
@@ -358,28 +357,12 @@ function ReportScreen({route, navigation, isInSidePanel = false}: ReportScreenPr
     const isMoneyRequestOrInvoiceReport = isMoneyRequestReport(report) || isInvoiceReport(report);
     // Prevent the empty state flash by ensuring transaction data is fully loaded before deciding which view to render
     // We need to wait for both the selector to finish AND ensure we're not in a loading state where transactions could still populate
-    const shouldWaitForTransactions = shouldWaitForTransactionsUtil(report, reportTransactions, reportMetadata, isOffline);
+    const shouldWaitForTransactions = !isOffline && shouldWaitForTransactionsUtil(report, reportTransactions, reportMetadata);
 
     const newTransactions = useNewTransactions(reportMetadata?.hasOnceLoadedReportActions, reportTransactions);
 
     const {closeSidePanel} = useSidePanel();
 
-    useEffect(() => {
-        if (
-            !isFocused ||
-            !reportIDFromRoute ||
-            report?.reportID ||
-            reportMetadata?.isLoadingInitialReportActions ||
-            reportMetadata?.isOptimisticReport ||
-            isLoadingApp ||
-            userLeavingStatus
-        ) {
-            return;
-        }
-
-        Navigation.goBack();
-    }, [isFocused, reportIDFromRoute, report?.reportID, reportMetadata?.isLoadingInitialReportActions, reportMetadata?.isOptimisticReport, isLoadingApp, userLeavingStatus]);
-
     useEffect(() => {
         if (!prevIsFocused || isFocused) {
             return;
@@ -411,7 +394,7 @@ function ReportScreen({route, navigation, isInSidePanel = false}: ReportScreenPr
                 return;
             }
             if (isInNarrowPaneModal) {
-                Navigation.goBack();
+                Navigation.dismissModal();
                 return;
             }
             if (backTo) {
@@ -472,16 +455,10 @@ function ReportScreen({route, navigation, isInSidePanel = false}: ReportScreenPr
     const isReportArchived = useReportIsArchived(report?.reportID);
     const {isEditingDisabled, isCurrentReportLoadedFromOnyx} = useIsReportReadyToDisplay(report, reportIDFromRoute, isReportArchived);
 
-    const isLinkedActionDeleted = useMemo(() => {
-        if (!linkedAction) {
-            return false;
-        }
-        const actionReportID = linkedAction.reportID ?? reportID;
-        if (!actionReportID) {
-            return true;
-        }
-        return !isReportActionVisible(linkedAction, actionReportID, canUserPerformWriteAction(report, isReportArchived), visibleReportActionsData);
-    }, [linkedAction, report, isReportArchived, reportID, visibleReportActionsData]);
+    const isLinkedActionDeleted = useMemo(
+        () => !!linkedAction && !shouldReportActionBeVisible(linkedAction, linkedAction.reportActionID, canUserPerformWriteAction(report, isReportArchived)),
+        [linkedAction, report, isReportArchived],
+    );
 
     const prevIsLinkedActionDeleted = usePrevious(linkedAction ? isLinkedActionDeleted : undefined);
 
@@ -614,15 +591,7 @@ function ReportScreen({route, navigation, isInSidePanel = false}: ReportScreenPr
 
     const prevTransactionThreadReportID = usePrevious(transactionThreadReportID);
     useEffect(() => {
-        // If transactionThreadReportID is undefined or CONST.FAKE_REPORT_ID, we do not call fetchReport.
-        // Only when transactionThreadReportID changes to a valid value, the fetchReport will be called to fetch the data again for the current report.
-        // Since fetchReport is always called once when opening a report,
-        // if that initial call is used to create a transactionThreadReport,
-        // then fetchReport needs to be called again after the transactionThreadReport has been fully created.
-        const prevTransactionThreadReportIDWasValid = !!prevTransactionThreadReportID && prevTransactionThreadReportID !== CONST.FAKE_REPORT_ID;
-        const transactionThreadReportIDUpdatedFromValidToFake = transactionThreadReportID === CONST.FAKE_REPORT_ID && !!prevTransactionThreadReportID;
-
-        if (prevTransactionThreadReportIDWasValid || !transactionThreadReportID || transactionThreadReportIDUpdatedFromValidToFake) {
+        if (!!prevTransactionThreadReportID || !transactionThreadReportID) {
             return;
         }
 
@@ -754,7 +723,7 @@ function ReportScreen({route, navigation, isInSidePanel = false}: ReportScreenPr
             (prevDeletedParentAction && !deletedParentAction)
         ) {
             const currentRoute = navigationRef.getCurrentRoute();
-            const topmostReportIDInSearchRHP = Navigation.getTopmostSearchReportID();
+            const topmostReportIDInSearchRHP = Navigation.getTopmostReportIDInSearchRHP();
             const isTopmostSearchReportID = reportIDFromRoute === topmostReportIDInSearchRHP;
             const isHoldScreenOpenInRHP =
                 currentRoute?.name === SCREENS.MONEY_REQUEST.HOLD && (route.name === SCREENS.RIGHT_MODAL.SEARCH_REPORT ? isTopmostSearchReportID : isTopMostReportId);
diff --git a/src/pages/home/report/ContextMenu/BaseReportActionContextMenu.tsx b/src/pages/home/report/ContextMenu/BaseReportActionContextMenu.tsx
index abcc7380d415..b0c80ac45b24 100755
--- a/src/pages/home/report/ContextMenu/BaseReportActionContextMenu.tsx
+++ b/src/pages/home/report/ContextMenu/BaseReportActionContextMenu.tsx
@@ -8,7 +8,6 @@ import type {OnyxEntry} from 'react-native-onyx';
 import * as ActionSheetAwareScrollView from '@components/ActionSheetAwareScrollView';
 import type {ContextMenuItemHandle} from '@components/ContextMenuItem';
 import ContextMenuItem from '@components/ContextMenuItem';
-import {DelegateNoAccessContext} from '@components/DelegateNoAccessModalProvider';
 import FocusTrapForModal from '@components/FocusTrap/FocusTrapForModal';
 import useArrowKeyFocusManager from '@hooks/useArrowKeyFocusManager';
 import useCurrentUserPersonalDetails from '@hooks/useCurrentUserPersonalDetails';
@@ -135,7 +134,6 @@ function BaseReportActionContextMenu({
     setIsEmojiPickerActive,
 }: BaseReportActionContextMenuProps) {
     const actionSheetAwareScrollViewContext = useContext(ActionSheetAwareScrollView.ActionSheetAwareScrollViewContext);
-    const {isDelegateAccessRestricted, showDelegateNoAccessModal} = useContext(DelegateNoAccessContext);
     const icons = useMemoizedLazyExpensifyIcons([
         'Download',
         'ThreeDots',
@@ -409,8 +407,6 @@ function BaseReportActionContextMenu({
                             policyTags,
                             translate,
                             harvestReport,
-                            isDelegateAccessRestricted,
-                            showDelegateNoAccessModal,
                             currentUserAccountID,
                         };
 
diff --git a/src/pages/home/report/ContextMenu/ContextMenuActions.tsx b/src/pages/home/report/ContextMenu/ContextMenuActions.tsx
index c175999e7589..c6b1593b10ad 100644
--- a/src/pages/home/report/ContextMenu/ContextMenuActions.tsx
+++ b/src/pages/home/report/ContextMenu/ContextMenuActions.tsx
@@ -41,8 +41,6 @@ import {
     getForwardsToUpdateMessage,
     getHarvestCreatedExpenseReportMessage,
     getIntegrationSyncFailedMessage,
-    getInvoiceCompanyNameUpdateMessage,
-    getInvoiceCompanyWebsiteUpdateMessage,
     getIOUReportIDFromReportActionPreview,
     getJoinRequestMessage,
     getMarkedReimbursedMessage,
@@ -55,11 +53,9 @@ import {
     getPolicyChangeLogDefaultTitleEnforcedMessage,
     getPolicyChangeLogDefaultTitleMessage,
     getPolicyChangeLogDeleteMemberMessage,
-    getPolicyChangeLogMaxExpenseAgeMessage,
     getPolicyChangeLogMaxExpenseAmountMessage,
     getPolicyChangeLogMaxExpenseAmountNoReceiptMessage,
     getPolicyChangeLogUpdateEmployee,
-    getReimburserUpdateMessage,
     getRemovedConnectionMessage,
     getRenamedAction,
     getReportAction,
@@ -68,7 +64,6 @@ import {
     getSubmitsToUpdateMessage,
     getTagListNameUpdatedMessage,
     getTravelUpdateMessage,
-    getUpdateACHAccountMessage,
     getUpdatedApprovalRuleMessage,
     getUpdatedAuditRateMessage,
     getUpdatedManualApprovalThresholdMessage,
@@ -245,8 +240,6 @@ type ContextMenuActionPayload = {
     policyTags: OnyxEntry<PolicyTagLists>;
     translate: LocalizedTranslate;
     harvestReport?: OnyxEntry<ReportType>;
-    isDelegateAccessRestricted?: boolean;
-    showDelegateNoAccessModal?: () => void;
 };
 
 type OnPress = (closePopover: boolean, payload: ContextMenuActionPayload, selection?: string, reportID?: string, draftMessage?: string) => void;
@@ -467,12 +460,7 @@ const ContextMenuActions: ContextMenuAction[] = [
             const holdReportAction = getReportAction(moneyRequestAction?.childReportID, `${iouTransaction?.comment?.hold ?? ''}`);
             return canHoldUnholdReportAction(moneyRequestReport, moneyRequestAction, holdReportAction, iouTransaction, moneyRequestPolicy).canUnholdRequest;
         },
-        onPress: (closePopover, {moneyRequestAction, isDelegateAccessRestricted, showDelegateNoAccessModal}) => {
-            if (isDelegateAccessRestricted) {
-                hideContextMenu(false, showDelegateNoAccessModal);
-                return;
-            }
-
+        onPress: (closePopover, {moneyRequestAction}) => {
             if (closePopover) {
                 hideContextMenu(false, () => changeMoneyRequestHoldStatus(moneyRequestAction));
                 return;
@@ -495,12 +483,7 @@ const ContextMenuActions: ContextMenuAction[] = [
             const holdReportAction = getReportAction(moneyRequestAction?.childReportID, `${iouTransaction?.comment?.hold ?? ''}`);
             return canHoldUnholdReportAction(moneyRequestReport, moneyRequestAction, holdReportAction, iouTransaction, moneyRequestPolicy).canHoldRequest;
         },
-        onPress: (closePopover, {moneyRequestAction, isDelegateAccessRestricted, showDelegateNoAccessModal}) => {
-            if (isDelegateAccessRestricted) {
-                hideContextMenu(false, showDelegateNoAccessModal);
-                return;
-            }
-
+        onPress: (closePopover, {moneyRequestAction}) => {
             if (closePopover) {
                 hideContextMenu(false, () => changeMoneyRequestHoldStatus(moneyRequestAction));
                 return;
@@ -764,24 +747,14 @@ const ContextMenuActions: ContextMenuAction[] = [
                     Clipboard.setString(getSubmitsToUpdateMessage(translate, reportAction));
                 } else if (reportAction.actionName === CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_FORWARDS_TO) {
                     Clipboard.setString(getForwardsToUpdateMessage(translate, reportAction));
-                } else if (reportAction.actionName === CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_INVOICE_COMPANY_NAME) {
-                    Clipboard.setString(getInvoiceCompanyNameUpdateMessage(translate, reportAction));
-                } else if (reportAction.actionName === CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_INVOICE_COMPANY_WEBSITE) {
-                    Clipboard.setString(getInvoiceCompanyWebsiteUpdateMessage(translate, reportAction));
-                } else if (reportAction.actionName === CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_REIMBURSER) {
-                    Clipboard.setString(getReimburserUpdateMessage(translate, reportAction));
                 } else if (reportAction.actionName === CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_REIMBURSEMENT_ENABLED) {
                     Clipboard.setString(getWorkspaceReimbursementUpdateMessage(translate, reportAction));
-                } else if (reportAction.actionName === CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_ACH_ACCOUNT) {
-                    Clipboard.setString(getUpdateACHAccountMessage(translate, reportAction));
                 } else if (reportAction.actionName === CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_ADDRESS) {
                     Clipboard.setString(getCompanyAddressUpdateMessage(translate, reportAction));
                 } else if (reportAction.actionName === CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_MAX_EXPENSE_AMOUNT_NO_RECEIPT) {
                     Clipboard.setString(getPolicyChangeLogMaxExpenseAmountNoReceiptMessage(translate, reportAction));
                 } else if (reportAction.actionName === CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_MAX_EXPENSE_AMOUNT) {
                     Clipboard.setString(getPolicyChangeLogMaxExpenseAmountMessage(translate, reportAction));
-                } else if (reportAction.actionName === CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_MAX_EXPENSE_AGE) {
-                    Clipboard.setString(getPolicyChangeLogMaxExpenseAgeMessage(translate, reportAction));
                 } else if (reportAction.actionName === CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_DEFAULT_BILLABLE) {
                     Clipboard.setString(getPolicyChangeLogDefaultBillableMessage(translate, reportAction));
                 } else if (reportAction.actionName === CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_DEFAULT_REIMBURSABLE) {
@@ -1109,9 +1082,8 @@ const ContextMenuActions: ContextMenuAction[] = [
             );
         },
         onPress: (closePopover, {reportID: reportIDParam, reportAction, moneyRequestAction}) => {
-            const iouReportID = isMoneyRequestAction(moneyRequestAction) ? getOriginalMessage(moneyRequestAction)?.IOUReportID : undefined;
             // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
-            const reportID = iouReportID && Number(iouReportID) !== 0 ? iouReportID : reportIDParam;
+            const reportID = isMoneyRequestAction(moneyRequestAction) ? getOriginalMessage(moneyRequestAction)?.IOUReportID || reportIDParam : reportIDParam;
             if (closePopover) {
                 // Hide popover, then call showDeleteConfirmModal
                 hideContextMenu(false, () => showDeleteModal(reportID, moneyRequestAction ?? reportAction));
diff --git a/src/pages/home/report/ContextMenu/PopoverReportActionContextMenu.tsx b/src/pages/home/report/ContextMenu/PopoverReportActionContextMenu.tsx
index d1baeb28af1c..52843af4f1c1 100644
--- a/src/pages/home/report/ContextMenu/PopoverReportActionContextMenu.tsx
+++ b/src/pages/home/report/ContextMenu/PopoverReportActionContextMenu.tsx
@@ -85,8 +85,6 @@ function PopoverReportActionContextMenu({ref}: PopoverReportActionContextMenuPro
     const [disabledActions, setDisabledActions] = useState<ContextMenuAction[]>([]);
     const [shouldSwitchPositionIfOverflow, setShouldSwitchPositionIfOverflow] = useState(false);
     const [isWithoutOverlay, setIsWithoutOverlay] = useState<boolean>(true);
-    const [allTransactionViolations] = useOnyx(ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS, {canBeMissing: true});
-    const [visibleReportActionsData] = useOnyx(ONYXKEYS.DERIVED.VISIBLE_REPORT_ACTIONS, {canBeMissing: true});
 
     const contentRef = useRef<View>(null);
     const anchorRef = useRef<View | HTMLDivElement | null>(null);
@@ -338,7 +336,7 @@ function PopoverReportActionContextMenu({ref}: PopoverReportActionContextMenuPro
     });
     const ancestorsRef = useRef<typeof ancestors>([]);
     const ancestors = useAncestors(originalReport);
-    const {transactions: reportTransactions} = useTransactionsAndViolationsForReport(originalReport?.iouReportID);
+    const {transactions: reportTransactions, violations} = useTransactionsAndViolationsForReport(originalReport?.iouReportID);
     useEffect(() => {
         if (!originalReport) {
             return;
@@ -363,17 +361,16 @@ function PopoverReportActionContextMenu({ref}: PopoverReportActionContextMenuPro
                     isSingleTransactionView: undefined,
                     isChatReportArchived: isReportArchived,
                     isChatIOUReportArchived,
-                    allTransactionViolationsParam: allTransactionViolations,
                 });
             } else if (originalMessage?.IOUTransactionID) {
                 deleteTransactions([originalMessage.IOUTransactionID], duplicateTransactions, duplicateTransactionViolations, currentSearchHash);
             }
         } else if (isReportPreviewAction(reportAction)) {
-            deleteAppReport(reportAction.childReportID, email ?? '', reportTransactions, allTransactionViolations, bankAccountList);
+            deleteAppReport(reportAction.childReportID, email ?? '', reportTransactions, violations, bankAccountList);
         } else if (reportAction) {
             // eslint-disable-next-line @typescript-eslint/no-deprecated
             InteractionManager.runAfterInteractions(() => {
-                deleteReportComment(reportIDRef.current, reportAction, ancestorsRef.current, isReportArchived, isOriginalReportArchived, email ?? '', visibleReportActionsData ?? undefined);
+                deleteReportComment(reportIDRef.current, reportAction, ancestorsRef.current, isReportArchived, isOriginalReportArchived, email ?? '');
             });
         }
 
@@ -391,10 +388,9 @@ function PopoverReportActionContextMenu({ref}: PopoverReportActionContextMenuPro
         currentSearchHash,
         email,
         reportTransactions,
+        violations,
         isOriginalReportArchived,
-        allTransactionViolations,
         bankAccountList,
-        visibleReportActionsData,
     ]);
 
     const hideDeleteModal = () => {
diff --git a/src/pages/home/report/ExpenseReportVerifyAccountPage.tsx b/src/pages/home/report/ExpenseReportVerifyAccountPage.tsx
deleted file mode 100644
index e1d7ca5f5a58..000000000000
--- a/src/pages/home/report/ExpenseReportVerifyAccountPage.tsx
+++ /dev/null
@@ -1,21 +0,0 @@
-import React from 'react';
-import Navigation from '@libs/Navigation/Navigation';
-import type {PlatformStackScreenProps} from '@libs/Navigation/PlatformStackNavigation/types';
-import type {ReportVerifyAccountNavigatorParamList} from '@libs/Navigation/types';
-import VerifyAccountPageBase from '@pages/settings/VerifyAccountPageBase';
-import ROUTES from '@src/ROUTES';
-import type SCREENS from '@src/SCREENS';
-
-type ExpenseReportVerifyAccountPageProps = PlatformStackScreenProps<ReportVerifyAccountNavigatorParamList, typeof SCREENS.EXPENSE_REPORT_VERIFY_ACCOUNT>;
-
-function ExpenseReportVerifyAccountPage({route}: ExpenseReportVerifyAccountPageProps) {
-    const topmostSuperWideRHPReportParams = Navigation.getTopmostSuperWideRHPReportParams();
-    const {reportID, backTo} = topmostSuperWideRHPReportParams ?? {};
-    const navigateBackTo =
-        reportID === route.params.reportID
-            ? ROUTES.EXPENSE_REPORT_RHP.getRoute({reportID: route.params.reportID, backTo})
-            : ROUTES.EXPENSE_REPORT_RHP.getRoute({reportID: route.params.reportID});
-    return <VerifyAccountPageBase navigateBackTo={navigateBackTo} />;
-}
-
-export default ExpenseReportVerifyAccountPage;
diff --git a/src/pages/home/report/PureReportActionItem.tsx b/src/pages/home/report/PureReportActionItem.tsx
index 0119571e5bd3..38b2546fd784 100644
--- a/src/pages/home/report/PureReportActionItem.tsx
+++ b/src/pages/home/report/PureReportActionItem.tsx
@@ -62,7 +62,7 @@ import Navigation from '@libs/Navigation/Navigation';
 import Parser from '@libs/Parser';
 import Permissions from '@libs/Permissions';
 import {getDisplayNameOrDefault} from '@libs/PersonalDetailsUtils';
-import {getCleanedTagName, hasDynamicExternalWorkflow, isPolicyAdmin, isPolicyMember, isPolicyOwner} from '@libs/PolicyUtils';
+import {getCleanedTagName, getPersonalPolicy, hasDynamicExternalWorkflow, isPolicyAdmin, isPolicyMember, isPolicyOwner} from '@libs/PolicyUtils';
 import {
     extractLinksFromMessageHtml,
     getActionableCardFraudAlertMessage,
@@ -80,8 +80,6 @@ import {
     getForwardsToUpdateMessage,
     getHarvestCreatedExpenseReportMessage,
     getIntegrationSyncFailedMessage,
-    getInvoiceCompanyNameUpdateMessage,
-    getInvoiceCompanyWebsiteUpdateMessage,
     getIOUReportIDFromReportActionPreview,
     getJoinRequestMessage,
     getMarkedReimbursedMessage,
@@ -92,11 +90,9 @@ import {
     getPolicyChangeLogDefaultTitleEnforcedMessage,
     getPolicyChangeLogDefaultTitleMessage,
     getPolicyChangeLogDeleteMemberMessage,
-    getPolicyChangeLogMaxExpenseAgeMessage,
     getPolicyChangeLogMaxExpenseAmountMessage,
     getPolicyChangeLogMaxExpenseAmountNoReceiptMessage,
     getPolicyChangeLogUpdateEmployee,
-    getReimburserUpdateMessage,
     getRemovedConnectionMessage,
     getRemovedFromApprovalChainMessage,
     getRenamedAction,
@@ -105,7 +101,6 @@ import {
     getSubmitsToUpdateMessage,
     getTagListNameUpdatedMessage,
     getTravelUpdateMessage,
-    getUpdateACHAccountMessage,
     getUpdatedApprovalRuleMessage,
     getUpdatedAuditRateMessage,
     getUpdatedManualApprovalThresholdMessage,
@@ -238,15 +233,9 @@ type PureReportActionItemProps = {
     /** All the data of the policy collection */
     policies: OnyxCollection<OnyxTypes.Policy>;
 
-    /** The personal policy ID */
-    personalPolicyID: string | undefined;
-
     /** Model of onboarding selected */
     introSelected?: OnyxEntry<OnyxTypes.IntroSelected>;
 
-    /** All transaction drafts */
-    allTransactionDrafts: OnyxCollection<OnyxTypes.Transaction>;
-
     /** Report for this action */
     report: OnyxEntry<OnyxTypes.Report>;
 
@@ -371,7 +360,6 @@ type PureReportActionItemProps = {
         actionName: IOUAction,
         reportActionID: string,
         introSelected: OnyxEntry<OnyxTypes.IntroSelected>,
-        allTransactionDrafts: OnyxCollection<OnyxTypes.Transaction>,
         activePolicy: OnyxEntry<OnyxTypes.Policy>,
         isRestrictedToPreferredPolicy?: boolean,
         preferredPolicyID?: string,
@@ -462,9 +450,7 @@ const isEmptyHTML = <T extends React.JSX.Element>({props: {html}}: T): boolean =
 function PureReportActionItem({
     allReports,
     policies,
-    personalPolicyID,
     introSelected,
-    allTransactionDrafts,
     action,
     report,
     policy,
@@ -895,7 +881,6 @@ function PureReportActionItem({
                             CONST.IOU.ACTION.SUBMIT,
                             action.reportActionID,
                             introSelected,
-                            allTransactionDrafts,
                             activePolicy,
                             isRestrictedToPreferredPolicy,
                             preferredPolicyID,
@@ -916,7 +901,6 @@ function PureReportActionItem({
                                 CONST.IOU.ACTION.CATEGORIZE,
                                 action.reportActionID,
                                 introSelected,
-                                allTransactionDrafts,
                                 activePolicy,
                             );
                         },
@@ -931,7 +915,6 @@ function PureReportActionItem({
                                 CONST.IOU.ACTION.SHARE,
                                 action.reportActionID,
                                 introSelected,
-                                allTransactionDrafts,
                                 activePolicy,
                             );
                         },
@@ -1023,7 +1006,8 @@ function PureReportActionItem({
         }
 
         const actionableMentionWhisperOptions = [];
-        const isReportInPolicy = !!report?.policyID && report.policyID !== CONST.POLICY.ID_FAKE && personalPolicyID !== report.policyID;
+        // eslint-disable-next-line @typescript-eslint/no-deprecated
+        const isReportInPolicy = !!report?.policyID && report.policyID !== CONST.POLICY.ID_FAKE && getPersonalPolicy()?.id !== report.policyID;
 
         // Show the invite to submit expense button even if one of the mentioned users is a not a policy member
         const hasMentionedPolicyMembers = getOriginalMessage(action)?.inviteeEmails?.every((login) => isPolicyMember(policy, login)) ?? false;
@@ -1072,11 +1056,9 @@ function PureReportActionItem({
         isOriginalReportArchived,
         resolveActionableMentionWhisper,
         introSelected,
-        allTransactionDrafts,
         activePolicy,
         report,
         originalReport,
-        personalPolicyID,
     ]);
 
     /**
@@ -1493,24 +1475,14 @@ function PureReportActionItem({
             children = <ReportActionItemBasicMessage message={getSubmitsToUpdateMessage(translate, action)} />;
         } else if (isActionOfType(action, CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_FORWARDS_TO)) {
             children = <ReportActionItemBasicMessage message={getForwardsToUpdateMessage(translate, action)} />;
-        } else if (isActionOfType(action, CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_INVOICE_COMPANY_NAME)) {
-            children = <ReportActionItemBasicMessage message={getInvoiceCompanyNameUpdateMessage(translate, action)} />;
-        } else if (isActionOfType(action, CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_INVOICE_COMPANY_WEBSITE)) {
-            children = <ReportActionItemBasicMessage message={getInvoiceCompanyWebsiteUpdateMessage(translate, action)} />;
-        } else if (isActionOfType(action, CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_REIMBURSER)) {
-            children = <ReportActionItemBasicMessage message={getReimburserUpdateMessage(translate, action)} />;
         } else if (isActionOfType(action, CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_REIMBURSEMENT_ENABLED)) {
             children = <ReportActionItemBasicMessage message={getWorkspaceReimbursementUpdateMessage(translate, action)} />;
-        } else if (isActionOfType(action, CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_ACH_ACCOUNT)) {
-            children = <ReportActionItemBasicMessage message={getUpdateACHAccountMessage(translate, action)} />;
         } else if (isActionOfType(action, CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_ADDRESS)) {
             children = <ReportActionItemBasicMessage message={getCompanyAddressUpdateMessage(translate, action)} />;
         } else if (isActionOfType(action, CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_MAX_EXPENSE_AMOUNT_NO_RECEIPT)) {
             children = <ReportActionItemBasicMessage message={getPolicyChangeLogMaxExpenseAmountNoReceiptMessage(translate, action)} />;
         } else if (isActionOfType(action, CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_MAX_EXPENSE_AMOUNT)) {
             children = <ReportActionItemBasicMessage message={getPolicyChangeLogMaxExpenseAmountMessage(translate, action)} />;
-        } else if (isActionOfType(action, CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_MAX_EXPENSE_AGE)) {
-            children = <ReportActionItemBasicMessage message={getPolicyChangeLogMaxExpenseAgeMessage(translate, action)} />;
         } else if (isActionOfType(action, CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_DEFAULT_BILLABLE)) {
             children = <ReportActionItemBasicMessage message={getPolicyChangeLogDefaultBillableMessage(translate, action)} />;
         } else if (isActionOfType(action, CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_DEFAULT_REIMBURSABLE)) {
@@ -2022,7 +1994,6 @@ export default memo(PureReportActionItem, (prevProps, nextProps) => {
     const prevParentReportAction = prevProps.parentReportAction;
     const nextParentReportAction = nextProps.parentReportAction;
     return (
-        prevProps.personalPolicyID === nextProps.personalPolicyID &&
         prevProps.displayAsGroup === nextProps.displayAsGroup &&
         prevProps.isMostRecentIOUReportAction === nextProps.isMostRecentIOUReportAction &&
         prevProps.shouldDisplayNewMarker === nextProps.shouldDisplayNewMarker &&
diff --git a/src/pages/home/report/ReportActionCompose/ComposerWithSuggestions/ComposerWithSuggestions.tsx b/src/pages/home/report/ReportActionCompose/ComposerWithSuggestions/ComposerWithSuggestions.tsx
index 632cec2cf829..0a9736126678 100644
--- a/src/pages/home/report/ReportActionCompose/ComposerWithSuggestions/ComposerWithSuggestions.tsx
+++ b/src/pages/home/report/ReportActionCompose/ComposerWithSuggestions/ComposerWithSuggestions.tsx
@@ -1,7 +1,7 @@
-import {useIsFocused, useNavigation, useRoute} from '@react-navigation/native';
+import {useIsFocused, useNavigation} from '@react-navigation/native';
 import lodashDebounce from 'lodash/debounce';
 import type {ForwardedRef, RefObject} from 'react';
-import React, {memo, useCallback, useContext, useEffect, useImperativeHandle, useMemo, useRef, useState} from 'react';
+import React, {memo, useCallback, useEffect, useImperativeHandle, useMemo, useRef, useState} from 'react';
 import type {BlurEvent, LayoutChangeEvent, MeasureInWindowOnSuccessCallback, TextInput, TextInputContentSizeChangeEvent, TextInputKeyPressEvent, TextInputScrollEvent} from 'react-native';
 import {DeviceEventEmitter, InteractionManager, NativeModules, StyleSheet, View} from 'react-native';
 import {useFocusedInputHandler} from 'react-native-keyboard-controller';
@@ -11,7 +11,6 @@ import type {Emoji} from '@assets/emojis/types';
 import type {MeasureParentContainerAndCursorCallback} from '@components/AutoCompleteSuggestions/types';
 import Composer from '@components/Composer';
 import type {CustomSelectionChangeEvent, TextSelection} from '@components/Composer/types';
-import {WideRHPContext} from '@components/WideRHPContextProvider';
 import useCurrentUserPersonalDetails from '@hooks/useCurrentUserPersonalDetails';
 import useKeyboardState from '@hooks/useKeyboardState';
 import useLocalize from '@hooks/useLocalize';
@@ -50,7 +49,6 @@ import {areAllModalsHidden} from '@userActions/Modal';
 import {broadcastUserIsTyping, saveReportActionDraft, saveReportDraftComment} from '@userActions/Report';
 import CONST from '@src/CONST';
 import ONYXKEYS from '@src/ONYXKEYS';
-import SCREENS from '@src/SCREENS';
 import type * as OnyxTypes from '@src/types/onyx';
 import type {FileObject} from '@src/types/utils/Attachment';
 import type ChildrenProps from '@src/types/utils/ChildrenProps';
@@ -234,7 +232,6 @@ function ComposerWithSuggestions({
     // Fullstory
     forwardedFSClass,
 }: ComposerWithSuggestionsProps) {
-    const route = useRoute();
     const {isKeyboardShown} = useKeyboardState();
     const theme = useTheme();
     const styles = useThemeStyles();
@@ -258,10 +255,6 @@ function ComposerWithSuggestions({
 
     const commentRef = useRef(value);
 
-    const {superWideRHPRouteKeys} = useContext(WideRHPContext);
-    // Autofocus is disabled on SearchReport when another RHP is displayed below as it causes animation issues
-    const shouldDisableAutoFocus = superWideRHPRouteKeys.length > 0 && route.name === SCREENS.RIGHT_MODAL.SEARCH_REPORT;
-
     const [modal] = useOnyx(ONYXKEYS.MODAL, {canBeMissing: true});
     const [preferredSkinTone = CONST.EMOJI_DEFAULT_SKIN_TONE] = useOnyx(ONYXKEYS.PREFERRED_EMOJI_SKIN_TONE, {canBeMissing: true});
     const [editFocused] = useOnyx(ONYXKEYS.INPUT_FOCUSED, {canBeMissing: true});
@@ -273,8 +266,7 @@ function ComposerWithSuggestions({
 
     const {shouldUseNarrowLayout} = useResponsiveLayout();
     const maxComposerLines = shouldUseNarrowLayout ? CONST.COMPOSER.MAX_LINES_SMALL_SCREEN : CONST.COMPOSER.MAX_LINES;
-    const shouldAutoFocus =
-        (shouldFocusInputOnScreenFocus || !!draftComment) && shouldShowComposeInput && areAllModalsHidden() && isFocused && !didHideComposerInput && !shouldDisableAutoFocus;
+    const shouldAutoFocus = (shouldFocusInputOnScreenFocus || !!draftComment) && shouldShowComposeInput && areAllModalsHidden() && isFocused && !didHideComposerInput;
 
     const valueRef = useRef(value);
     valueRef.current = value;
diff --git a/src/pages/home/report/ReportActionCompose/SuggestionMention.tsx b/src/pages/home/report/ReportActionCompose/SuggestionMention.tsx
index a5ef4ec2aa45..96548c51a32c 100644
--- a/src/pages/home/report/ReportActionCompose/SuggestionMention.tsx
+++ b/src/pages/home/report/ReportActionCompose/SuggestionMention.tsx
@@ -76,7 +76,6 @@ function SuggestionMention({
     suggestionValuesRef.current = suggestionValues;
 
     const [reports] = useOnyx(ONYXKEYS.COLLECTION.REPORT, {canBeMissing: false});
-    const [conciergeReportID = ''] = useOnyx(ONYXKEYS.CONCIERGE_REPORT_ID, {canBeMissing: true});
 
     const currentUserPersonalDetails = useCurrentUserPersonalDetails();
     const isMentionSuggestionsMenuVisible = !!suggestionValues.suggestedMentions.length && suggestionValues.shouldShowSuggestionMenu;
@@ -100,7 +99,7 @@ function SuggestionMention({
     );
     const weightedPersonalDetails: PersonalDetailsList | SuggestionPersonalDetailsList | undefined = useMemo(() => {
         const policyEmployeeAccountIDs = getPolicyEmployeeAccountIDs(policy, currentUserPersonalDetails.accountID);
-        if (!isGroupChat(currentReport) && !doesReportBelongToWorkspace(currentReport, policyEmployeeAccountIDs, policyID, conciergeReportID)) {
+        if (!isGroupChat(currentReport) && !doesReportBelongToWorkspace(currentReport, policyEmployeeAccountIDs, policyID)) {
             return personalDetails;
         }
         return lodashMapValues(personalDetails, (detail) =>
@@ -111,7 +110,7 @@ function SuggestionMention({
                   }
                 : null,
         );
-    }, [policyID, policy, currentReport, personalDetails, getPersonalDetailsWeight, currentUserPersonalDetails.accountID, conciergeReportID]);
+    }, [policyID, policy, currentReport, personalDetails, getPersonalDetailsWeight, currentUserPersonalDetails.accountID]);
 
     const [highlightedMentionIndex, setHighlightedMentionIndex] = useArrowKeyFocusManager({
         isActive: isMentionSuggestionsMenuVisible,
diff --git a/src/pages/home/report/ReportActionItem.tsx b/src/pages/home/report/ReportActionItem.tsx
index 12831f3e17d6..6302e306eeab 100644
--- a/src/pages/home/report/ReportActionItem.tsx
+++ b/src/pages/home/report/ReportActionItem.tsx
@@ -35,10 +35,7 @@ import type {Errors} from '@src/types/onyx/OnyxCommon';
 import type {PureReportActionItemProps} from './PureReportActionItem';
 import PureReportActionItem from './PureReportActionItem';
 
-type ReportActionItemProps = Omit<
-    PureReportActionItemProps,
-    'taskReport' | 'linkedReport' | 'iouReportOfLinkedReport' | 'currentUserAccountID' | 'personalPolicyID' | 'allTransactionDrafts'
-> & {
+type ReportActionItemProps = Omit<PureReportActionItemProps, 'taskReport' | 'linkedReport' | 'iouReportOfLinkedReport' | 'currentUserAccountID'> & {
     /** All the data of the report collection */
     allReports: OnyxCollection<Report>;
 
@@ -99,14 +96,12 @@ function ReportActionItem({
     const isOriginalReportArchived = useReportIsArchived(originalReportID);
     const {accountID: currentUserAccountID} = useCurrentUserPersonalDetails();
     const [introSelected] = useOnyx(ONYXKEYS.NVP_INTRO_SELECTED, {canBeMissing: true});
-    const [allTransactionDrafts] = useOnyx(ONYXKEYS.COLLECTION.TRANSACTION_DRAFT, {canBeMissing: true});
     const [reportMetadata] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT_METADATA}${reportID}`, {canBeMissing: true});
     const iouReport = allReports?.[`${ONYXKEYS.COLLECTION.REPORT}${getIOUReportIDFromReportActionPreview(action)}`];
     const movedFromReport = allReports?.[`${ONYXKEYS.COLLECTION.REPORT}${getMovedReportID(action, CONST.REPORT.MOVE_TYPE.FROM)}`];
     const movedToReport = allReports?.[`${ONYXKEYS.COLLECTION.REPORT}${getMovedReportID(action, CONST.REPORT.MOVE_TYPE.TO)}`];
     const policy = policies?.[`${ONYXKEYS.COLLECTION.POLICY}${report?.policyID}`];
     const [bankAccountList] = useOnyx(ONYXKEYS.BANK_ACCOUNT_LIST, {canBeMissing: true});
-    const [personalPolicyID] = useOnyx(ONYXKEYS.PERSONAL_POLICY_ID, {canBeMissing: true});
     const {policyForMovingExpensesID} = usePolicyForMovingExpenses();
     // The app would crash due to subscribing to the entire report collection if parentReportID is an empty string. So we should have a fallback ID here.
     // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
@@ -125,9 +120,7 @@ function ReportActionItem({
             {...props}
             allReports={allReports}
             introSelected={introSelected}
-            allTransactionDrafts={allTransactionDrafts}
             policies={policies}
-            personalPolicyID={personalPolicyID}
             action={action}
             report={report}
             policy={policy}
diff --git a/src/pages/home/report/ReportActionItemMessageEdit.tsx b/src/pages/home/report/ReportActionItemMessageEdit.tsx
index 7a600cce5a0f..682e0801c2a8 100644
--- a/src/pages/home/report/ReportActionItemMessageEdit.tsx
+++ b/src/pages/home/report/ReportActionItemMessageEdit.tsx
@@ -12,6 +12,7 @@ import type {TextSelection} from '@components/Composer/types';
 import EmojiPickerButton from '@components/EmojiPicker/EmojiPickerButton';
 import ExceededCommentLength from '@components/ExceededCommentLength';
 import Icon from '@components/Icon';
+import * as Expensicons from '@components/Icon/Expensicons';
 import PressableWithFeedback from '@components/Pressable/PressableWithFeedback';
 import Tooltip from '@components/Tooltip';
 import useAncestors from '@hooks/useAncestors';
@@ -19,7 +20,6 @@ import useCurrentUserPersonalDetails from '@hooks/useCurrentUserPersonalDetails'
 import useHandleExceedMaxCommentLength from '@hooks/useHandleExceedMaxCommentLength';
 import useIsScrollLikelyLayoutTriggered from '@hooks/useIsScrollLikelyLayoutTriggered';
 import useKeyboardState from '@hooks/useKeyboardState';
-import {useMemoizedLazyExpensifyIcons} from '@hooks/useLazyAsset';
 import useLocalize from '@hooks/useLocalize';
 import useOnyx from '@hooks/useOnyx';
 import usePrevious from '@hooks/usePrevious';
@@ -151,12 +151,10 @@ function ReportActionItemMessageEdit({
     // The ref to check whether the comment saving is in progress
     const isCommentPendingSaved = useRef(false);
     const [originalReport] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${originalReportID}`, {canBeMissing: true});
-    const [visibleReportActionsData] = useOnyx(ONYXKEYS.DERIVED.VISIBLE_REPORT_ACTIONS, {canBeMissing: true});
     const isOriginalReportArchived = useReportIsArchived(originalReportID);
     const originalParentReportID = getOriginalReportID(originalReportID, action);
     const isOriginalParentReportArchived = useReportIsArchived(originalParentReportID);
     const ancestors = useAncestors(originalReport);
-    const icons = useMemoizedLazyExpensifyIcons(['Checkmark', 'Close']);
 
     useEffect(() => {
         draftMessageVideoAttributeCache.clear();
@@ -326,7 +324,6 @@ function ReportActionItemMessageEdit({
             isOriginalParentReportArchived,
             email ?? '',
             Object.fromEntries(draftMessageVideoAttributeCache),
-            visibleReportActionsData ?? undefined,
         );
         deleteDraft();
     }, [
@@ -341,7 +338,6 @@ function ReportActionItemMessageEdit({
         isOriginalParentReportArchived,
         debouncedValidateCommentMaxLength,
         email,
-        visibleReportActionsData,
     ]);
 
     /**
@@ -514,7 +510,7 @@ function ReportActionItemMessageEdit({
                             >
                                 <Icon
                                     fill={theme.icon}
-                                    src={icons.Close}
+                                    src={Expensicons.Close}
                                 />
                             </PressableWithFeedback>
                         </Tooltip>
@@ -531,7 +527,6 @@ function ReportActionItemMessageEdit({
                                     ref.current = el;
                                 }
                             }}
-                            autoFocus={!shouldUseNarrowLayout}
                             onChangeText={updateDraft} // Debounced saveDraftComment
                             onKeyPress={triggerSaveOrCancel}
                             value={draft}
@@ -631,7 +626,7 @@ function ReportActionItemMessageEdit({
                                 sentryLabel={CONST.SENTRY_LABEL.REPORT.REPORT_ACTION_ITEM_MESSAGE_EDIT_SAVE_BUTTON}
                             >
                                 <Icon
-                                    src={icons.Checkmark}
+                                    src={Expensicons.Checkmark}
                                     fill={hasExceededMaxCommentLength ? theme.icon : theme.textLight}
                                 />
                             </PressableWithFeedback>
diff --git a/src/pages/home/report/ReportActionItemSingle.tsx b/src/pages/home/report/ReportActionItemSingle.tsx
index ef41c6480159..64b50b075144 100644
--- a/src/pages/home/report/ReportActionItemSingle.tsx
+++ b/src/pages/home/report/ReportActionItemSingle.tsx
@@ -1,4 +1,4 @@
-import React from 'react';
+import React, {useCallback, useMemo} from 'react';
 import type {StyleProp, ViewStyle} from 'react-native';
 import {View} from 'react-native';
 import type {OnyxEntry} from 'react-native-onyx';
@@ -125,7 +125,7 @@ function ReportActionItemSingle({
           ]
         : action?.person;
 
-    const showActorDetails = () => {
+    const showActorDetails = useCallback(() => {
         if (details.isWorkspaceActor) {
             showWorkspaceDetails(reportID);
         } else {
@@ -136,11 +136,14 @@ function ReportActionItemSingle({
             }
             showUserDetails(Number(primaryAvatar.id));
         }
-    };
+    }, [details.isWorkspaceActor, reportID, iouReportID, details.shouldDisplayAllActors, primaryAvatar.id]);
 
-    const shouldDisableDetailPage =
-        CONST.RESTRICTED_ACCOUNT_IDS.includes(details.accountID ?? CONST.DEFAULT_NUMBER_ID) ||
-        (!details.isWorkspaceActor && isOptimisticPersonalDetail(action?.delegateAccountID ? Number(action.delegateAccountID) : (details.accountID ?? CONST.DEFAULT_NUMBER_ID)));
+    const shouldDisableDetailPage = useMemo(
+        () =>
+            CONST.RESTRICTED_ACCOUNT_IDS.includes(details.accountID ?? CONST.DEFAULT_NUMBER_ID) ||
+            (!details.isWorkspaceActor && isOptimisticPersonalDetail(action?.delegateAccountID ? Number(action.delegateAccountID) : (details.accountID ?? CONST.DEFAULT_NUMBER_ID))),
+        [action?.delegateAccountID, details.isWorkspaceActor, details.accountID],
+    );
 
     const getBackgroundColor = () => {
         if (isActive) {
diff --git a/src/pages/home/report/ReportActionsList.tsx b/src/pages/home/report/ReportActionsList.tsx
index d33222752e84..367db0380bfe 100644
--- a/src/pages/home/report/ReportActionsList.tsx
+++ b/src/pages/home/report/ReportActionsList.tsx
@@ -1,6 +1,7 @@
 import type {ListRenderItemInfo} from '@react-native/virtualized-lists/Lists/VirtualizedList';
 import {useIsFocused, useRoute} from '@react-navigation/native';
 import {isUserValidatedSelector} from '@selectors/Account';
+import {accountIDSelector} from '@selectors/Session';
 import {tierNameSelector} from '@selectors/UserWallet';
 import React, {memo, useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState} from 'react';
 import type {LayoutChangeEvent, NativeScrollEvent, NativeSyntheticEvent} from 'react-native';
@@ -62,7 +63,7 @@ import {
 import Visibility from '@libs/Visibility';
 import type {ReportsSplitNavigatorParamList} from '@navigation/types';
 import variables from '@styles/variables';
-import {openReport, readNewestAction, subscribeToNewActionEvent} from '@userActions/Report';
+import {getCurrentUserAccountID, openReport, readNewestAction, subscribeToNewActionEvent} from '@userActions/Report';
 import CONST from '@src/CONST';
 import ONYXKEYS from '@src/ONYXKEYS';
 import ROUTES from '@src/ROUTES';
@@ -161,7 +162,7 @@ function ReportActionsList({
     hasCreatedActionAdded,
 }: ReportActionsListProps) {
     const prevHasCreatedActionAdded = usePrevious(hasCreatedActionAdded);
-    const {accountID: currentUserAccountID} = useCurrentUserPersonalDetails();
+    const currentUserPersonalDetails = useCurrentUserPersonalDetails();
     const personalDetailsList = usePersonalDetails();
     const styles = useThemeStyles();
     const {translate} = useLocalize();
@@ -180,6 +181,7 @@ function ReportActionsList({
     const [allReports] = useOnyx(ONYXKEYS.COLLECTION.REPORT, {canBeMissing: false});
     const [policies] = useOnyx(ONYXKEYS.COLLECTION.POLICY, {canBeMissing: true});
     const [transactions] = useOnyx(ONYXKEYS.COLLECTION.TRANSACTION, {canBeMissing: true});
+    const [accountID] = useOnyx(ONYXKEYS.SESSION, {selector: accountIDSelector, canBeMissing: true});
     const isReportArchived = useReportIsArchived(report?.reportID);
     const [userWalletTierName] = useOnyx(ONYXKEYS.USER_WALLET, {selector: tierNameSelector, canBeMissing: false});
     const [isUserValidated] = useOnyx(ONYXKEYS.ACCOUNT, {selector: isUserValidatedSelector, canBeMissing: true});
@@ -288,7 +290,7 @@ function ReportActionsList({
                     message: reportAction,
                     nextMessage: nextAction,
                     isEarliestReceivedOfflineMessage,
-                    currentUserAccountID,
+                    accountID,
                     prevSortedVisibleReportActionsObjects,
                     unreadMarkerTime,
                     scrollingVerticalOffset: scrollingVerticalOffset.current,
@@ -300,7 +302,7 @@ function ReportActionsList({
         }
 
         return [null, -1];
-    }, [currentUserAccountID, isAnonymousUser, earliestReceivedOfflineMessageIndex, prevSortedVisibleReportActionsObjects, sortedVisibleReportActions, unreadMarkerTime]);
+    }, [accountID, isAnonymousUser, earliestReceivedOfflineMessageIndex, prevSortedVisibleReportActionsObjects, sortedVisibleReportActions, unreadMarkerTime]);
     prevUnreadMarkerReportActionID.current = unreadMarkerReportActionID;
 
     /**
@@ -448,7 +450,7 @@ function ReportActionsList({
             (reportAction) =>
                 newMessageTimeReference &&
                 newMessageTimeReference < reportAction.created &&
-                (isReportPreviewAction(reportAction) ? reportAction.childLastActorAccountID : reportAction.actorAccountID) !== currentUserAccountID,
+                (isReportPreviewAction(reportAction) ? reportAction.childLastActorAccountID : reportAction.actorAccountID) !== getCurrentUserAccountID(),
         );
 
         if (!isArchivedReport && (!hasNewMessagesInView || !hasUnreadReportAction)) {
@@ -622,7 +624,13 @@ function ReportActionsList({
         setIsFloatingMessageCounterVisible(false);
 
         if (!hasNewestReportAction) {
-            if (!Navigation.getReportRHPActiveRoute()) {
+            if (isSearchTopmostFullScreenRoute()) {
+                if (Navigation.getReportRHPActiveRoute()) {
+                    Navigation.navigate(ROUTES.SEARCH_REPORT.getRoute({reportID: report.reportID, backTo}));
+                } else {
+                    Navigation.navigate(ROUTES.SEARCH_MONEY_REQUEST_REPORT.getRoute({reportID: report.reportID, backTo}));
+                }
+            } else {
                 Navigation.navigate(ROUTES.REPORT_WITH_ID.getRoute(report.reportID, undefined, undefined, backTo));
             }
             openReport(report.reportID);
@@ -764,7 +772,7 @@ function ReportActionsList({
         [unreadMarkerReportActionID, shouldUseNarrowLayout, report, isReportArchived],
     );
     const hideComposer = !canUserPerformWriteAction(report, isReportArchived);
-    const shouldShowReportRecipientLocalTime = canShowReportRecipientLocalTime(personalDetailsList, report, currentUserAccountID) && !isComposerFullSize;
+    const shouldShowReportRecipientLocalTime = canShowReportRecipientLocalTime(personalDetailsList, report, currentUserPersonalDetails.accountID) && !isComposerFullSize;
     const canShowHeader = isOffline || hasHeaderRendered.current;
 
     const onLayoutInner = useCallback(
diff --git a/src/pages/home/report/ReportActionsView.tsx b/src/pages/home/report/ReportActionsView.tsx
index 0a72d597aa5c..a1e2c00310d7 100755
--- a/src/pages/home/report/ReportActionsView.tsx
+++ b/src/pages/home/report/ReportActionsView.tsx
@@ -25,11 +25,11 @@ import {
     getMostRecentIOURequestActionID,
     getOriginalMessage,
     getSortedReportActionsForDisplay,
-    isActionableWhisperRequiringWritePermission,
     isCreatedAction,
     isDeletedParentAction,
     isIOUActionMatchingTransactionList,
     isMoneyRequestAction,
+    shouldReportActionBeVisible,
 } from '@libs/ReportActionsUtils';
 import {buildOptimisticCreatedReportAction, buildOptimisticIOUReportAction, canUserPerformWriteAction, isInvoiceReport, isMoneyRequestReport} from '@libs/ReportUtils';
 import markOpenReportEnd from '@libs/telemetry/markOpenReportEnd';
@@ -102,7 +102,6 @@ function ReportActionsView({
     );
     const [transactionThreadReport] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${transactionThreadReportID}`, {canBeMissing: true});
     const [isLoadingApp] = useOnyx(ONYXKEYS.IS_LOADING_APP, {canBeMissing: true});
-    const [visibleReportActionsData] = useOnyx(ONYXKEYS.DERIVED.VISIBLE_REPORT_ACTIONS, {canBeMissing: true});
     const prevTransactionThreadReport = usePrevious(transactionThreadReport);
     const reportActionID = route?.params?.reportActionID;
     const prevReportActionID = usePrevious(reportActionID);
@@ -219,33 +218,13 @@ function ReportActionsView({
 
     const visibleReportActions = useMemo(
         () =>
-            reportActions.filter((reportAction) => {
-                const passesOfflineCheck =
-                    isOffline || isDeletedParentAction(reportAction) || reportAction.pendingAction !== CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE || reportAction.errors;
-
-                if (!passesOfflineCheck) {
-                    return false;
-                }
-
-                const actionReportID = reportAction.reportID ?? reportID;
-                const isStaticallyVisible = visibleReportActionsData?.[actionReportID]?.[reportAction.reportActionID];
-
-                const passesStaticVisibility = isStaticallyVisible ?? true;
-                if (!passesStaticVisibility) {
-                    return false;
-                }
-
-                if (!canPerformWriteAction && isActionableWhisperRequiringWritePermission(reportAction)) {
-                    return false;
-                }
-
-                if (!isIOUActionMatchingTransactionList(reportAction, reportTransactionIDs)) {
-                    return false;
-                }
-
-                return true;
-            }),
-        [reportActions, isOffline, canPerformWriteAction, reportTransactionIDs, visibleReportActionsData, reportID],
+            reportActions.filter(
+                (reportAction) =>
+                    (isOffline || isDeletedParentAction(reportAction) || reportAction.pendingAction !== CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE || reportAction.errors) &&
+                    shouldReportActionBeVisible(reportAction, reportAction.reportActionID, canPerformWriteAction) &&
+                    isIOUActionMatchingTransactionList(reportAction, reportTransactionIDs),
+            ),
+        [reportActions, isOffline, canPerformWriteAction, reportTransactionIDs],
     );
 
     const newestReportAction = useMemo(() => reportActions?.at(0), [reportActions]);
diff --git a/src/pages/home/report/comment/TextCommentFragment.tsx b/src/pages/home/report/comment/TextCommentFragment.tsx
index e81cc1388fa0..7ad1069b78a8 100644
--- a/src/pages/home/report/comment/TextCommentFragment.tsx
+++ b/src/pages/home/report/comment/TextCommentFragment.tsx
@@ -1,6 +1,6 @@
 import {Str} from 'expensify-common';
 import isEmpty from 'lodash/isEmpty';
-import React, {useEffect} from 'react';
+import React, {memo, useEffect, useMemo} from 'react';
 import type {StyleProp, TextStyle} from 'react-native';
 import Text from '@components/Text';
 import ZeroWidthView from '@components/ZeroWidthView';
@@ -62,7 +62,7 @@ function TextCommentFragment({fragment, styleAsDeleted, reportActionID, styleAsM
 
     const message = isEmpty(iouMessage) ? text : iouMessage;
 
-    const processedTextArray = splitTextWithEmojis(message);
+    const processedTextArray = useMemo(() => splitTextWithEmojis(message), [message]);
 
     useEffect(() => {
         Performance.markEnd(CONST.TIMING.SEND_MESSAGE, {message: text});
@@ -74,7 +74,7 @@ function TextCommentFragment({fragment, styleAsDeleted, reportActionID, styleAsM
     // on native, we render it as text, not as html
     // on other device, only render it as text if the only difference is <br /> tag
     const containsOnlyEmojis = containsOnlyEmojisUtil(text ?? '');
-    const containsOnlyCustomEmoji = containsOnlyCustomEmojiUtil(text);
+    const containsOnlyCustomEmoji = useMemo(() => containsOnlyCustomEmojiUtil(text), [text]);
     const containsEmojis = CONST.REGEX.ALL_EMOJIS.test(text ?? '');
     if (!shouldRenderAsText(html, text ?? '') && !(containsOnlyEmojis && styleAsDeleted)) {
         const editedTag = fragment?.isEdited ? `<edited ${styleAsDeleted ? 'deleted' : ''}></edited>` : '';
@@ -158,4 +158,4 @@ function TextCommentFragment({fragment, styleAsDeleted, reportActionID, styleAsM
     );
 }
 
-export default TextCommentFragment;
+export default memo(TextCommentFragment);
diff --git a/src/pages/home/report/shouldDisplayNewMarkerOnReportAction.ts b/src/pages/home/report/shouldDisplayNewMarkerOnReportAction.ts
index 3e9eb04c5abb..ae272c1bca42 100644
--- a/src/pages/home/report/shouldDisplayNewMarkerOnReportAction.ts
+++ b/src/pages/home/report/shouldDisplayNewMarkerOnReportAction.ts
@@ -16,7 +16,7 @@ type ShouldDisplayNewMarkerOnReportActionParams = {
     unreadMarkerTime: string | undefined;
 
     /** User accountID */
-    currentUserAccountID: number;
+    accountID: number | undefined;
 
     /** Map of reportActions saved via usePrev */
     prevSortedVisibleReportActionsObjects: Record<string, OnyxTypes.ReportAction>;
@@ -37,7 +37,7 @@ const shouldDisplayNewMarkerOnReportAction = ({
     nextMessage,
     isEarliestReceivedOfflineMessage,
     unreadMarkerTime,
-    currentUserAccountID,
+    accountID,
     prevSortedVisibleReportActionsObjects,
     prevUnreadMarkerReportActionID,
     scrollingVerticalOffset,
@@ -66,7 +66,7 @@ const shouldDisplayNewMarkerOnReportAction = ({
     };
 
     // If no unread marker exists, don't set an unread marker for newly added messages from the current user.
-    const isFromCurrentUser = currentUserAccountID === (isReportPreviewAction(message) ? message.childLastActorAccountID : message.actorAccountID);
+    const isFromCurrentUser = accountID === (isReportPreviewAction(message) ? message.childLastActorAccountID : message.actorAccountID);
     const isNewMessage = !prevSortedVisibleReportActionsObjects[message.reportActionID];
 
     // The unread marker will show if the action's `created` time is later than `unreadMarkerTime`.
diff --git a/src/pages/home/sidebar/NavigationTabBarAvatar.tsx b/src/pages/home/sidebar/NavigationTabBarAvatar.tsx
index 6c11d3895078..480e32d84363 100644
--- a/src/pages/home/sidebar/NavigationTabBarAvatar.tsx
+++ b/src/pages/home/sidebar/NavigationTabBarAvatar.tsx
@@ -69,7 +69,7 @@ function NavigationTabBarAvatar({onPress, isSelected = false, style}: Navigation
         <PressableWithFeedback
             onPress={onPress}
             role={CONST.ROLE.BUTTON}
-            accessibilityLabel={`${translate('initialSettingsPage.account')}, ${translate('sidebarScreen.buttonMySettings')}`}
+            accessibilityLabel={translate('sidebarScreen.buttonMySettings')}
             wrapperStyle={styles.flex1}
             style={({hovered}) => [style, hovered && styles.navigationTabBarItemHovered]}
             sentryLabel={CONST.SENTRY_LABEL.NAVIGATION_TAB_BAR.ACCOUNT}
diff --git a/src/pages/iou/HoldReasonPage.tsx b/src/pages/iou/HoldReasonPage.tsx
index a14b9897670f..cca028e70168 100644
--- a/src/pages/iou/HoldReasonPage.tsx
+++ b/src/pages/iou/HoldReasonPage.tsx
@@ -1,5 +1,4 @@
-import React, {useCallback, useContext, useEffect} from 'react';
-import {DelegateNoAccessContext} from '@components/DelegateNoAccessModalProvider';
+import React, {useCallback, useEffect} from 'react';
 import type {FormInputErrors, FormOnyxValues} from '@components/Form/types';
 import useAncestors from '@hooks/useAncestors';
 import useLocalize from '@hooks/useLocalize';
@@ -35,13 +34,7 @@ function HoldReasonPage({route}: HoldReasonPageProps) {
     const isWorkspaceRequest = isReportInGroupPolicy(report);
     const parentReportAction = getReportAction(report?.parentReportID, report?.parentReportActionID);
 
-    const {isDelegateAccessRestricted, showDelegateNoAccessModal} = useContext(DelegateNoAccessContext);
     const onSubmit = (values: FormOnyxValues<typeof ONYXKEYS.FORMS.MONEY_REQUEST_HOLD_FORM>) => {
-        if (isDelegateAccessRestricted) {
-            showDelegateNoAccessModal();
-            return;
-        }
-
         // We have extra isWorkspaceRequest condition since, for 1:1 requests, canEditMoneyRequest will rightly return false
         // as we do not allow requestee to edit fields like description and amount.
         // But, we still want the requestee to be able to put the request on hold
diff --git a/src/pages/iou/MoneyRequestAmountForm.tsx b/src/pages/iou/MoneyRequestAmountForm.tsx
index a982bb682762..68896c1fe423 100644
--- a/src/pages/iou/MoneyRequestAmountForm.tsx
+++ b/src/pages/iou/MoneyRequestAmountForm.tsx
@@ -8,7 +8,6 @@ import type {NumberWithSymbolFormRef} from '@components/NumberWithSymbolForm';
 import ScrollView from '@components/ScrollView';
 import SettlementButton from '@components/SettlementButton';
 import useLocalize from '@hooks/useLocalize';
-import usePermissions from '@hooks/usePermissions';
 import useResponsiveLayout from '@hooks/useResponsiveLayout';
 import useThemeStyles from '@hooks/useThemeStyles';
 import {convertToDisplayString, convertToFrontendAmountAsInteger, convertToFrontendAmountAsString} from '@libs/CurrencyUtils';
@@ -53,31 +52,9 @@ type MoneyRequestAmountFormProps = Omit<MoneyRequestAmountInputProps, 'shouldSho
 
     /** The chatReportID of the request */
     chatReportID?: string;
-
-    /** Whether this is a P2P (1:1) request */
-    isP2P?: boolean;
 };
 
-const nonZeroExpenses = new Set<ValueOf<typeof CONST.IOU.TYPE>>([CONST.IOU.TYPE.PAY, CONST.IOU.TYPE.INVOICE, CONST.IOU.TYPE.SPLIT]);
-const isAmountInvalid = (amount: string, iouType: ValueOf<typeof CONST.IOU.TYPE>, isP2P: boolean, isZeroAmountBetaEnabled: boolean) => {
-    if (!isZeroAmountBetaEnabled) {
-        return !amount.length || parseFloat(amount) < 0.01;
-    }
-
-    if (!amount.length || parseFloat(amount) < 0) {
-        return true;
-    }
-
-    if ((iouType === CONST.IOU.TYPE.REQUEST || iouType === CONST.IOU.TYPE.SUBMIT) && parseFloat(amount) < 0.01 && isP2P) {
-        return true;
-    }
-
-    if (parseFloat(amount) < 0.01 && nonZeroExpenses.has(iouType)) {
-        return true;
-    }
-
-    return false;
-};
+const isAmountInvalid = (amount: string) => !amount.length || parseFloat(amount) < 0.01;
 const isTaxAmountInvalid = (currentAmount: string, taxAmount: number, isTaxAmountForm: boolean, currency: string) =>
     isTaxAmountForm && Number.parseFloat(currentAmount) > convertToFrontendAmountAsInteger(Math.abs(taxAmount), currency);
 
@@ -100,7 +77,6 @@ function MoneyRequestAmountForm({
     chatReportID,
     hideCurrencySymbol = false,
     allowFlippingAmount = false,
-    isP2P = false,
     ref,
 }: MoneyRequestAmountFormProps) {
     const styles = useThemeStyles();
@@ -112,8 +88,6 @@ function MoneyRequestAmountForm({
 
     const [isNegative, setIsNegative] = useState(false);
 
-    const {isBetaEnabled} = usePermissions();
-
     const [formError, setFormError] = useState<string>('');
 
     const formattedTaxAmount = convertToDisplayString(Math.abs(taxAmount), currency);
@@ -169,7 +143,7 @@ function MoneyRequestAmountForm({
 
             // Skip the check for tax amount form as 0 is a valid input
             const currentAmount = moneyRequestAmountInputRef.current?.getNumber() ?? '';
-            if (!currentAmount.length || (!isTaxAmountForm && isAmountInvalid(currentAmount, iouType, isP2P, isBetaEnabled(CONST.BETAS.ZERO_EXPENSES)))) {
+            if (!currentAmount.length || (!isTaxAmountForm && isAmountInvalid(currentAmount))) {
                 setFormError(translate('iou.error.invalidAmount'));
                 return;
             }
@@ -183,7 +157,7 @@ function MoneyRequestAmountForm({
 
             onSubmitButtonPress({amount: newAmount, currency, paymentMethod: iouPaymentType});
         },
-        [taxAmount, currency, isNegative, onSubmitButtonPress, translate, formattedTaxAmount, iouType, isP2P, isBetaEnabled],
+        [taxAmount, currency, isNegative, onSubmitButtonPress, translate, formattedTaxAmount],
     );
 
     const buttonText: string = useMemo(() => {
diff --git a/src/pages/iou/RejectReasonPage.tsx b/src/pages/iou/RejectReasonPage.tsx
index f70f5beacab1..929cbb58347d 100644
--- a/src/pages/iou/RejectReasonPage.tsx
+++ b/src/pages/iou/RejectReasonPage.tsx
@@ -1,13 +1,10 @@
 import {getReportPolicyID} from '@selectors/Report';
-import React, {useCallback, useContext, useEffect} from 'react';
-import {DelegateNoAccessContext} from '@components/DelegateNoAccessModalProvider';
+import React, {useCallback, useEffect} from 'react';
 import type {FormInputErrors, FormOnyxValues} from '@components/Form/types';
 import {useSearchContext} from '@components/Search/SearchContext';
-import {WideRHPContext} from '@components/WideRHPContextProvider';
 import useLocalize from '@hooks/useLocalize';
 import useOnyx from '@hooks/useOnyx';
 import usePolicy from '@hooks/usePolicy';
-import getIsSmallScreenWidth from '@libs/getIsSmallScreenWidth';
 import getNonEmptyStringOnyxID from '@libs/getNonEmptyStringOnyxID';
 import Navigation from '@libs/Navigation/Navigation';
 import type {PlatformStackScreenProps} from '@libs/Navigation/PlatformStackNavigation/types';
@@ -31,24 +28,12 @@ function RejectReasonPage({route}: RejectReasonPageProps) {
     const {removeTransaction} = useSearchContext();
     const [reportPolicyID] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${getNonEmptyStringOnyxID(reportID)}`, {canBeMissing: false, selector: getReportPolicyID});
     const policy = usePolicy(reportPolicyID);
-    const {superWideRHPRouteKeys} = useContext(WideRHPContext);
 
-    const {isDelegateAccessRestricted, showDelegateNoAccessModal} = useContext(DelegateNoAccessContext);
     const onSubmit = (values: FormOnyxValues<typeof ONYXKEYS.FORMS.MONEY_REQUEST_REJECT_FORM>) => {
-        if (isDelegateAccessRestricted) {
-            showDelegateNoAccessModal();
-            return;
-        }
-
         const urlToNavigateBack = rejectMoneyRequest(transactionID, reportID, values.comment, policy);
         removeTransaction(transactionID);
-        // If the super wide rhp is not opened, dismiss the entire modal.
-        if (superWideRHPRouteKeys.length > 0) {
-            Navigation.dismissToSuperWideRHP();
-        } else {
-            Navigation.dismissModal();
-        }
-        if (urlToNavigateBack && getIsSmallScreenWidth()) {
+        Navigation.dismissModal();
+        if (urlToNavigateBack) {
             Navigation.isNavigationReady().then(() => Navigation.goBack(urlToNavigateBack));
         }
     };
diff --git a/src/pages/iou/SplitBillDetailsPage.tsx b/src/pages/iou/SplitBillDetailsPage.tsx
index 4e6279000dae..0f41962fde96 100644
--- a/src/pages/iou/SplitBillDetailsPage.tsx
+++ b/src/pages/iou/SplitBillDetailsPage.tsx
@@ -14,8 +14,7 @@ import useOnyx from '@hooks/useOnyx';
 import usePermissions from '@hooks/usePermissions';
 import useTheme from '@hooks/useTheme';
 import useThemeStyles from '@hooks/useThemeStyles';
-import {setDraftSplitTransaction} from '@libs/actions/IOU';
-import {completeSplitBill} from '@libs/actions/IOU/Split';
+import {completeSplitBill, setDraftSplitTransaction} from '@libs/actions/IOU';
 import getNonEmptyStringOnyxID from '@libs/getNonEmptyStringOnyxID';
 import Navigation from '@libs/Navigation/Navigation';
 import type {PlatformStackScreenProps} from '@libs/Navigation/PlatformStackNavigation/types';
@@ -52,7 +51,6 @@ function SplitBillDetailsPage({route, report, reportAction}: SplitBillDetailsPag
     const [transaction] = useOnyx(`${ONYXKEYS.COLLECTION.TRANSACTION}${getNonEmptyStringOnyxID(IOUTransactionID)}`, {canBeMissing: true});
     const [draftTransaction] = useOnyx(`${ONYXKEYS.COLLECTION.SPLIT_TRANSACTION_DRAFT}${IOUTransactionID}`, {canBeMissing: true});
     const [personalDetails] = useOnyx(ONYXKEYS.PERSONAL_DETAILS_LIST, {canBeMissing: true});
-    const [transactionReport] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${transaction?.reportID}`, {canBeMissing: true});
     const [quickAction] = useOnyx(ONYXKEYS.NVP_QUICK_ACTION_GLOBAL_CREATE, {canBeMissing: true});
     const [session] = useOnyx(ONYXKEYS.SESSION, {canBeMissing: false});
     const [reportAttributesDerived] = useOnyx(ONYXKEYS.DERIVED.REPORT_ATTRIBUTES, {canBeMissing: true, selector: reportsSelector});
@@ -74,8 +72,7 @@ function SplitBillDetailsPage({route, report, reportAction}: SplitBillDetailsPag
 
     const hasSmartScanFailed = hasReceipt(transaction) && transaction?.receipt?.state === CONST.IOU.RECEIPT_STATE.SCAN_FAILED;
     const isDistanceRequest = isDistanceRequestUtil(transaction);
-    const isEditingSplitBill =
-        session?.accountID === actorAccountID && (areRequiredFieldsEmpty(transaction, transactionReport) || (transaction?.amount === 0 && !hasReceipt(transaction))) && !isDistanceRequest;
+    const isEditingSplitBill = session?.accountID === actorAccountID && areRequiredFieldsEmpty(transaction) && !isDistanceRequest;
     const isManualDistanceRequest = isManualDistanceRequestUtil(transaction);
     const isMapDistanceRequest = isDistanceRequest && !isManualDistanceRequest;
     const [isConfirmed, setIsConfirmed] = useState(false);
diff --git a/src/pages/iou/SplitExpenseCreateDateRagePage.tsx b/src/pages/iou/SplitExpenseCreateDateRagePage.tsx
index d2976e3d1dff..405a35bb085d 100644
--- a/src/pages/iou/SplitExpenseCreateDateRagePage.tsx
+++ b/src/pages/iou/SplitExpenseCreateDateRagePage.tsx
@@ -33,11 +33,14 @@ type SplitExpenseCreateDateRagePageProps = PlatformStackScreenProps<SplitExpense
 function SplitExpenseCreateDateRagePage({route}: SplitExpenseCreateDateRagePageProps) {
     const styles = useThemeStyles();
     const {translate} = useLocalize();
-    const {currentSearchResults} = useSearchContext();
+    const searchContext = useSearchContext();
 
     const {reportID, transactionID, backTo} = route.params;
 
     const [draftTransaction] = useOnyx(`${ONYXKEYS.COLLECTION.SPLIT_TRANSACTION_DRAFT}${transactionID}`, {canBeMissing: false});
+
+    const searchHash = searchContext?.currentSearchHash ?? CONST.DEFAULT_NUMBER_ID;
+    const [currentSearchResults] = useOnyx(`${ONYXKEYS.COLLECTION.SNAPSHOT}${searchHash}`, {canBeMissing: true});
     const allTransactions = useAllTransactions();
 
     const transaction = allTransactions?.[`${ONYXKEYS.COLLECTION.TRANSACTION}${getNonEmptyStringOnyxID(transactionID)}`];
@@ -50,14 +53,14 @@ function SplitExpenseCreateDateRagePage({route}: SplitExpenseCreateDateRagePageP
     const currentPolicy = Object.keys(policy?.employeeList ?? {}).length
         ? policy
         : currentSearchResults?.data?.[`${ONYXKEYS.COLLECTION.POLICY}${getNonEmptyStringOnyxID(currentReport?.policyID)}`];
-    const {login, accountID: currentUserAccountID} = useCurrentUserPersonalDetails();
+    const {login} = useCurrentUserPersonalDetails();
 
     const updateDate = (value: FormOnyxValues<typeof ONYXKEYS.FORMS.SPLIT_EXPENSE_EDIT_DATES>) => {
         resetSplitExpensesByDateRange(transaction, value[INPUT_IDS.START_DATE], value[INPUT_IDS.END_DATE]);
         Navigation.goBack(backTo);
     };
 
-    const isSplitAvailable = report && transaction && isSplitAction(currentReport, [transaction], originalTransaction, login ?? '', currentUserAccountID, currentPolicy);
+    const isSplitAvailable = report && transaction && isSplitAction(currentReport, [transaction], originalTransaction, login ?? '', currentPolicy);
 
     const validate = (values: FormOnyxValues<typeof ONYXKEYS.FORMS.SPLIT_EXPENSE_EDIT_DATES>) => {
         const errors: FormInputErrors<typeof ONYXKEYS.FORMS.SPLIT_EXPENSE_EDIT_DATES> = {};
diff --git a/src/pages/iou/SplitExpenseEditPage.tsx b/src/pages/iou/SplitExpenseEditPage.tsx
index 2efe9885075c..aa9ecb5e02a8 100644
--- a/src/pages/iou/SplitExpenseEditPage.tsx
+++ b/src/pages/iou/SplitExpenseEditPage.tsx
@@ -43,7 +43,7 @@ type SplitExpensePageProps = PlatformStackScreenProps<SplitExpenseParamList, typ
 function SplitExpenseEditPage({route}: SplitExpensePageProps) {
     const styles = useThemeStyles();
     const {translate} = useLocalize();
-    const {currentSearchResults} = useSearchContext();
+    const searchContext = useSearchContext();
 
     const {reportID, transactionID, splitExpenseTransactionID = '', backTo} = route.params;
 
@@ -53,6 +53,9 @@ function SplitExpenseEditPage({route}: SplitExpensePageProps) {
     ]);
 
     const splitExpenseDraftTransactionDetails = useMemo<Partial<TransactionDetails>>(() => getTransactionDetails(splitExpenseDraftTransaction) ?? {}, [splitExpenseDraftTransaction]);
+
+    const searchHash = searchContext?.currentSearchHash ?? CONST.DEFAULT_NUMBER_ID;
+    const [currentSearchResults] = useOnyx(`${ONYXKEYS.COLLECTION.SNAPSHOT}${searchHash}`, {canBeMissing: true});
     const allTransactions = useAllTransactions();
 
     const transaction = allTransactions?.[`${ONYXKEYS.COLLECTION.TRANSACTION}${getNonEmptyStringOnyxID(transactionID)}`];
@@ -69,7 +72,7 @@ function SplitExpenseEditPage({route}: SplitExpensePageProps) {
     const [policyCategories] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY_CATEGORIES}${currentReport?.policyID}`, {canBeMissing: false});
 
     const [policyTags] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY_TAGS}${currentReport?.policyID}`, {canBeMissing: false});
-    const {login, accountID: currentUserAccountID} = useCurrentUserPersonalDetails();
+    const {login} = useCurrentUserPersonalDetails();
 
     const fetchData = useCallback(() => {
         if (!policyCategories) {
@@ -102,10 +105,10 @@ function SplitExpenseEditPage({route}: SplitExpensePageProps) {
     const transactionTag = getTag(splitExpenseDraftTransaction);
     const policyTagLists = useMemo(() => getTagLists(policyTags), [policyTags]);
 
-    const isSplitAvailable = report && transaction && isSplitAction(currentReport, [transaction], originalTransaction, login ?? '', currentUserAccountID, currentPolicy);
+    const isSplitAvailable = report && transaction && isSplitAction(currentReport, [transaction], originalTransaction, login ?? '', currentPolicy);
 
     const isCategoryRequired = !!currentPolicy?.requiresCategory;
-    const reportName = computeReportName(currentReport, undefined, undefined, undefined, undefined, undefined, undefined, currentUserAccountID);
+    const reportName = computeReportName(currentReport);
     const isDescriptionRequired = isCategoryDescriptionRequired(policyCategories, splitExpenseDraftTransactionDetails?.category, currentPolicy?.areRulesEnabled);
 
     const shouldShowTags = !!currentPolicy?.areTagsEnabled && !!(transactionTag || hasEnabledTags(policyTagLists));
diff --git a/src/pages/iou/SplitExpensePage.tsx b/src/pages/iou/SplitExpensePage.tsx
index 015ef2c6fe09..b1c36fe24f97 100644
--- a/src/pages/iou/SplitExpensePage.tsx
+++ b/src/pages/iou/SplitExpensePage.tsx
@@ -1,5 +1,5 @@
 import {deepEqual} from 'fast-equals';
-import React, {useEffect} from 'react';
+import React, {useCallback, useEffect, useMemo} from 'react';
 import {InteractionManager, Keyboard, View} from 'react-native';
 import type {ValueOf} from 'type-fest';
 import FullPageNotFoundView from '@components/BlockingViews/FullPageNotFoundView';
@@ -15,7 +15,6 @@ import type {SplitListItemType} from '@components/SelectionList/ListItem/types';
 import TabSelector from '@components/TabSelector/TabSelector';
 import useAllTransactions from '@hooks/useAllTransactions';
 import useConfirmModal from '@hooks/useConfirmModal';
-import useCurrencyList from '@hooks/useCurrencyList';
 import useCurrentUserPersonalDetails from '@hooks/useCurrentUserPersonalDetails';
 import useGetIOUReportFromReportAction from '@hooks/useGetIOUReportFromReportAction';
 import {useMemoizedLazyExpensifyIcons} from '@hooks/useLazyAsset';
@@ -33,9 +32,9 @@ import {
     initDraftSplitExpenseDataForEdit,
     initSplitExpenseItemData,
     updateSplitExpenseAmountField,
+    updateSplitTransactionsFromSplitExpensesFlow,
 } from '@libs/actions/IOU';
 import {getIOUActionForTransactions} from '@libs/actions/IOU/Duplicate';
-import {updateSplitTransactionsFromSplitExpensesFlow} from '@libs/actions/IOU/Split';
 import {convertToBackendAmount, convertToDisplayString} from '@libs/CurrencyUtils';
 import DateUtils from '@libs/DateUtils';
 import {canUseTouchScreen} from '@libs/DeviceCapabilities';
@@ -71,9 +70,8 @@ function SplitExpensePage({route}: SplitExpensePageProps) {
     const {showConfirmModal} = useConfirmModal();
 
     const [errorMessage, setErrorMessage] = React.useState<string>('');
-    const searchContext = useSearchContext();
 
-    const {getCurrencySymbol} = useCurrencyList();
+    const searchContext = useSearchContext();
 
     const [selectedTab] = useOnyx(`${ONYXKEYS.COLLECTION.SELECTED_TAB}${CONST.TAB.SPLIT_EXPENSE_TAB_TYPE}`, {canBeMissing: true});
     const [draftTransaction, draftTransactionMetadata] = useOnyx(`${ONYXKEYS.COLLECTION.SPLIT_TRANSACTION_DRAFT}${transactionID}`, {canBeMissing: false});
@@ -83,47 +81,46 @@ function SplitExpensePage({route}: SplitExpensePageProps) {
     const expenseReport = transactionReport?.type === CONST.REPORT.TYPE.EXPENSE ? transactionReport : parentTransactionReport;
     const [policyCategories] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY_CATEGORIES}${getNonEmptyStringOnyxID(expenseReport?.policyID)}`, {canBeMissing: true});
     const [expenseReportPolicy] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY}${getNonEmptyStringOnyxID(expenseReport?.policyID)}`, {canBeMissing: true});
+    const searchHash = searchContext?.currentSearchHash ?? CONST.DEFAULT_NUMBER_ID;
+    const [currentSearchResults] = useOnyx(`${ONYXKEYS.COLLECTION.SNAPSHOT}${searchHash}`, {canBeMissing: true});
     const allTransactions = useAllTransactions();
     const currentUserPersonalDetails = useCurrentUserPersonalDetails();
 
     const transaction = allTransactions?.[`${ONYXKEYS.COLLECTION.TRANSACTION}${getNonEmptyStringOnyxID(transactionID)}`];
     const originalTransaction = allTransactions?.[`${ONYXKEYS.COLLECTION.TRANSACTION}${getNonEmptyStringOnyxID(transaction?.comment?.originalTransactionID)}`];
+    const [currencyList] = useOnyx(ONYXKEYS.CURRENCY_LIST, {canBeMissing: true});
     const [allReports] = useOnyx(ONYXKEYS.COLLECTION.REPORT, {canBeMissing: false});
     const [allReportNameValuePairs] = useOnyx(ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS, {canBeMissing: true});
     const [report] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${getNonEmptyStringOnyxID(reportID)}`, {canBeMissing: true});
-    const currentReport = report ?? searchContext?.currentSearchResults?.data?.[`${ONYXKEYS.COLLECTION.REPORT}${getNonEmptyStringOnyxID(reportID)}`];
+    const currentReport = report ?? currentSearchResults?.data?.[`${ONYXKEYS.COLLECTION.REPORT}${getNonEmptyStringOnyxID(reportID)}`];
     const [policyRecentlyUsedCurrencies] = useOnyx(ONYXKEYS.RECENTLY_USED_CURRENCIES, {canBeMissing: true});
     const [policyRecentlyUsedCategories] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY_RECENTLY_USED_CATEGORIES}${getIOURequestPolicyID(transaction, currentReport)}`, {canBeMissing: true});
 
     const policy = usePolicy(currentReport?.policyID);
     const currentPolicy = Object.keys(policy?.employeeList ?? {}).length
         ? policy
-        : searchContext?.currentSearchResults?.data?.[`${ONYXKEYS.COLLECTION.POLICY}${getNonEmptyStringOnyxID(currentReport?.policyID)}`];
+        : currentSearchResults?.data?.[`${ONYXKEYS.COLLECTION.POLICY}${getNonEmptyStringOnyxID(currentReport?.policyID)}`];
 
-    const isSplitAvailable =
-        report &&
-        transaction &&
-        isSplitAction(currentReport, [transaction], originalTransaction, currentUserPersonalDetails.login ?? '', currentUserPersonalDetails.accountID, currentPolicy);
+    const isSplitAvailable = report && transaction && isSplitAction(currentReport, [transaction], originalTransaction, currentUserPersonalDetails.login ?? '', currentPolicy);
 
-    const transactionDetails: Partial<TransactionDetails> = getTransactionDetails(transaction) ?? {};
+    const transactionDetails = useMemo<Partial<TransactionDetails>>(() => getTransactionDetails(transaction) ?? {}, [transaction]);
     const transactionDetailsAmount = transactionDetails?.amount ?? 0;
-    const sumOfSplitExpenses = (draftTransaction?.comment?.splitExpenses ?? []).reduce((acc, item) => acc + (item.amount ?? 0), 0);
-    const splitExpenses = draftTransaction?.comment?.splitExpenses ?? [];
+    const sumOfSplitExpenses = useMemo(() => (draftTransaction?.comment?.splitExpenses ?? []).reduce((acc, item) => acc + (item.amount ?? 0), 0), [draftTransaction?.comment?.splitExpenses]);
+    const splitExpenses = useMemo(() => draftTransaction?.comment?.splitExpenses ?? [], [draftTransaction?.comment?.splitExpenses]);
 
-    const currencySymbol = getCurrencySymbol(transactionDetails.currency ?? '') ?? transactionDetails.currency ?? CONST.CURRENCY.USD;
+    const currencySymbol = currencyList?.[transactionDetails.currency ?? '']?.symbol ?? transactionDetails.currency ?? CONST.CURRENCY.USD;
 
     const isPerDiem = isPerDiemRequest(transaction);
     const isCard = isManagedCardTransaction(transaction);
     const originalTransactionID = draftTransaction?.comment?.originalTransactionID ?? CONST.IOU.OPTIMISTIC_TRANSACTION_ID;
     const iouActions = getIOUActionForTransactions([originalTransactionID], expenseReport?.reportID);
     const {iouReport} = useGetIOUReportFromReportAction(iouActions.at(0));
-    const [iouReportNextStep] = useOnyx(`${ONYXKEYS.COLLECTION.NEXT_STEP}${getNonEmptyStringOnyxID(iouReport?.reportID)}`, {canBeMissing: true});
 
     const isPercentageMode = (selectedTab as string) === CONST.TAB.SPLIT.PERCENTAGE;
     const isDateMode = (selectedTab as string) === CONST.TAB.SPLIT.DATE;
-    const childTransactions = getChildTransactions(allTransactions, allReports, transactionID);
-    const splitFieldDataFromChildTransactions = childTransactions.map((currentTransaction) => initSplitExpenseItemData(currentTransaction));
-    const splitFieldDataFromOriginalTransaction = initSplitExpenseItemData(transaction);
+    const childTransactions = useMemo(() => getChildTransactions(allTransactions, allReports, transactionID), [allReports, allTransactions, transactionID]);
+    const splitFieldDataFromChildTransactions = useMemo(() => childTransactions.map((currentTransaction) => initSplitExpenseItemData(currentTransaction)), [childTransactions]);
+    const splitFieldDataFromOriginalTransaction = useMemo(() => initSplitExpenseItemData(transaction), [transaction]);
     const [transactionViolations] = useOnyx(ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS, {canBeMissing: true});
     const [quickAction] = useOnyx(ONYXKEYS.NVP_QUICK_ACTION_GLOBAL_CREATE, {canBeMissing: true});
     const icons = useMemoizedLazyExpensifyIcons(['ArrowsLeftRight', 'Plus'] as const);
@@ -142,21 +139,21 @@ function SplitExpensePage({route}: SplitExpensePageProps) {
         setErrorMessage('');
     }, [sumOfSplitExpenses, splitExpenses]);
 
-    const onAddSplitExpense = () => {
+    const onAddSplitExpense = useCallback(() => {
         if (draftTransaction?.errors) {
             clearSplitTransactionDraftErrors(transactionID);
         }
         addSplitExpenseField(transaction, draftTransaction);
-    };
+    }, [draftTransaction, transaction, transactionID]);
 
-    const onMakeSplitsEven = () => {
+    const onMakeSplitsEven = useCallback(() => {
         if (!draftTransaction) {
             return;
         }
         evenlyDistributeSplitExpenseAmounts(draftTransaction);
-    };
+    }, [draftTransaction]);
 
-    const onSaveSplitExpense = () => {
+    const onSaveSplitExpense = useCallback(() => {
         if (splitExpenses.length > CONST.IOU.SPLITS_LIMIT) {
             setErrorMessage(translate('iou.error.manySplitsProvided'));
             return;
@@ -166,12 +163,12 @@ function SplitExpensePage({route}: SplitExpensePageProps) {
             const splitExpenseWithoutID = {...splitExpenses.at(0), transactionID: ''};
             // When we try to save one split during splits creation and if the data is identical to the original transaction we should close the split flow
             if (!childTransactions.length && deepEqual(splitFieldDataFromOriginalTransactionWithoutID, splitExpenseWithoutID)) {
-                Navigation.dismissToPreviousRHP();
+                Navigation.dismissModal();
                 return;
             }
             // When we try to save splits during editing splits and if the data is identical to the already created transactions we should close the split flow
             if (childTransactions.length && deepEqual(splitFieldDataFromChildTransactions, splitExpenses)) {
-                Navigation.dismissToPreviousRHP();
+                Navigation.dismissModal();
                 return;
             }
             // When we try to save one split during splits creation and if the data is not identical to the original transaction we should show the error
@@ -199,7 +196,7 @@ function SplitExpensePage({route}: SplitExpensePageProps) {
 
         // When we try to save splits during editing splits and if the data is identical to the already created transactions we should close the split flow
         if (deepEqual(splitFieldDataFromChildTransactions, splitExpenses)) {
-            Navigation.dismissToPreviousRHP();
+            Navigation.dismissModal();
             return;
         }
 
@@ -224,173 +221,248 @@ function SplitExpensePage({route}: SplitExpensePageProps) {
             transactionViolations,
             policyRecentlyUsedCurrencies: policyRecentlyUsedCurrencies ?? [],
             quickAction,
-            iouReportNextStep,
         });
-    };
-
-    const onSplitExpenseValueChange = (id: string, value: number, mode: ValueOf<typeof CONST.TAB.SPLIT>) => {
-        if (mode === CONST.TAB.SPLIT.AMOUNT || mode === CONST.TAB.SPLIT.DATE) {
-            const amountInCents = convertToBackendAmount(value);
-            updateSplitExpenseAmountField(draftTransaction, id, amountInCents);
-        } else {
-            const amountInCents = calculateSplitAmountFromPercentage(transactionDetailsAmount, value);
-            updateSplitExpenseAmountField(draftTransaction, id, amountInCents);
-        }
-    };
-
-    const getTranslatedText = (item: TranslationPathOrText) => (item.translationPath ? translate(item.translationPath) : (item.text ?? ''));
-
-    const dotSeparator: TranslationPathOrText = {text: ` ${CONST.DOT_SEPARATOR} `};
-    const isTransactionMadeWithCard = isManagedCardTransaction(transaction);
-    const showCashOrCard: TranslationPathOrText = {translationPath: isTransactionMadeWithCard ? 'iou.card' : 'iou.cash'};
-    const splitExpensesArray = draftTransaction?.comment?.splitExpenses ?? [];
-
-    const splitAmounts = splitExpensesArray.map((item) => Number(item.amount ?? 0));
-    const adjustedPercentages = calculateSplitPercentagesFromAmounts(splitAmounts, transactionDetailsAmount);
-
-    const options: SplitListItemType[] = splitExpensesArray.map((item, index): SplitListItemType => {
-        const previewHeaderText: TranslationPathOrText[] = [showCashOrCard];
-        const currentTransaction = allTransactions?.[`${ONYXKEYS.COLLECTION.TRANSACTION}${item?.transactionID}`];
-        const currentItemReport = getReportOrDraftReport(currentTransaction?.reportID);
-        const isApproved = isReportApproved({report: currentItemReport});
-        const isSettled = isSettledReportUtils(currentItemReport?.reportID);
-        const isCancelled = currentItemReport && currentItemReport?.isCancelledIOU;
-        const percentage = adjustedPercentages.at(index) ?? 0;
-
-        const date = DateUtils.formatWithUTCTimeZone(
-            item.created,
-            DateUtils.doesDateBelongToAPastYear(item.created) ? CONST.DATE.MONTH_DAY_YEAR_ABBR_FORMAT : CONST.DATE.MONTH_DAY_ABBR_FORMAT,
-        );
-        previewHeaderText.unshift({text: date}, dotSeparator);
-
-        if (isCancelled) {
-            previewHeaderText.push(dotSeparator, {text: translate('iou.canceled')});
-        } else if (isApproved) {
-            previewHeaderText.push(dotSeparator, {text: translate('iou.approved')});
-        } else if (isSettled) {
-            previewHeaderText.push(dotSeparator, {text: translate('iou.settledExpensify')});
-        }
+    }, [
+        splitExpenses,
+        childTransactions.length,
+        draftTransaction?.errors,
+        draftTransaction?.reportID,
+        draftTransaction?.comment?.originalTransactionID,
+        draftTransaction?.comment?.splitExpensesTotal,
+        sumOfSplitExpenses,
+        transactionDetailsAmount,
+        isPerDiem,
+        isCard,
+        splitFieldDataFromChildTransactions,
+        allTransactions,
+        allReports,
+        allReportNameValuePairs,
+        searchContext,
+        policyCategories,
+        expenseReportPolicy,
+        policyRecentlyUsedCategories,
+        iouReport,
+        iouActions,
+        currentUserPersonalDetails,
+        splitFieldDataFromOriginalTransaction,
+        translate,
+        transactionID,
+        transactionDetails?.currency,
+        isBetaEnabled,
+        transactionViolations,
+        policyRecentlyUsedCurrencies,
+        quickAction,
+    ]);
+
+    const onSplitExpenseValueChange = useCallback(
+        (id: string, value: number, mode: ValueOf<typeof CONST.TAB.SPLIT>) => {
+            if (mode === CONST.TAB.SPLIT.AMOUNT || mode === CONST.TAB.SPLIT.DATE) {
+                const amountInCents = convertToBackendAmount(value);
+                updateSplitExpenseAmountField(draftTransaction, id, amountInCents);
+            } else {
+                const amountInCents = calculateSplitAmountFromPercentage(transactionDetailsAmount, value);
+                updateSplitExpenseAmountField(draftTransaction, id, amountInCents);
+            }
+        },
+        [draftTransaction, transactionDetailsAmount],
+    );
+
+    const getTranslatedText = useCallback((item: TranslationPathOrText) => (item.translationPath ? translate(item.translationPath) : (item.text ?? '')), [translate]);
+
+    const options = useMemo(() => {
+        const dotSeparator: TranslationPathOrText = {text: ` ${CONST.DOT_SEPARATOR} `};
+        const isTransactionMadeWithCard = isManagedCardTransaction(transaction);
+        const showCashOrCard: TranslationPathOrText = {translationPath: isTransactionMadeWithCard ? 'iou.card' : 'iou.cash'};
+        const splitExpensesArray = draftTransaction?.comment?.splitExpenses ?? [];
+
+        const splitAmounts = splitExpensesArray.map((item) => Number(item.amount ?? 0));
+        const adjustedPercentages = calculateSplitPercentagesFromAmounts(splitAmounts, transactionDetailsAmount);
+
+        const items: SplitListItemType[] = splitExpensesArray.map((item, index): SplitListItemType => {
+            const previewHeaderText: TranslationPathOrText[] = [showCashOrCard];
+            const currentTransaction = allTransactions?.[`${ONYXKEYS.COLLECTION.TRANSACTION}${item?.transactionID}`];
+            const currentItemReport = getReportOrDraftReport(currentTransaction?.reportID);
+            const isApproved = isReportApproved({report: currentItemReport});
+            const isSettled = isSettledReportUtils(currentItemReport?.reportID);
+            const isCancelled = currentItemReport && currentItemReport?.isCancelledIOU;
+            const percentage = adjustedPercentages.at(index) ?? 0;
+
+            const date = DateUtils.formatWithUTCTimeZone(
+                item.created,
+                DateUtils.doesDateBelongToAPastYear(item.created) ? CONST.DATE.MONTH_DAY_YEAR_ABBR_FORMAT : CONST.DATE.MONTH_DAY_ABBR_FORMAT,
+            );
+            previewHeaderText.unshift({text: date}, dotSeparator);
+
+            if (isCancelled) {
+                previewHeaderText.push(dotSeparator, {text: translate('iou.canceled')});
+            } else if (isApproved) {
+                previewHeaderText.push(dotSeparator, {text: translate('iou.approved')});
+            } else if (isSettled) {
+                previewHeaderText.push(dotSeparator, {text: translate('iou.settledExpensify')});
+            }
+
+            const headerText = previewHeaderText.reduce((text, currentKey) => {
+                return `${text}${getTranslatedText(currentKey)}`;
+            }, '');
+
+            return {
+                ...item,
+                headerText,
+                originalAmount: transactionDetailsAmount,
+                amount: Number(item.amount),
+                merchant: item?.merchant ?? '',
+                currency: draftTransaction?.currency ?? CONST.CURRENCY.USD,
+                transactionID: item?.transactionID ?? CONST.IOU.OPTIMISTIC_TRANSACTION_ID,
+                currencySymbol,
+                mode: CONST.TAB.SPLIT.AMOUNT,
+                percentage,
+                onSplitExpenseValueChange,
+                isSelected: splitExpenseTransactionID === item.transactionID,
+                keyForList: item?.transactionID,
+                isEditable: (item.statusNum ?? 0) < CONST.REPORT.STATUS_NUM.CLOSED,
+            };
+        });
 
-        const headerText = previewHeaderText.reduce((text, currentKey) => {
-            return `${text}${getTranslatedText(currentKey)}`;
-        }, '');
-
-        return {
-            ...item,
-            headerText,
-            originalAmount: transactionDetailsAmount,
-            amount: Number(item.amount),
-            merchant: item?.merchant ?? '',
-            currency: draftTransaction?.currency ?? CONST.CURRENCY.USD,
-            transactionID: item?.transactionID ?? CONST.IOU.OPTIMISTIC_TRANSACTION_ID,
-            currencySymbol,
-            mode: CONST.TAB.SPLIT.AMOUNT,
-            percentage,
-            onSplitExpenseValueChange,
-            isSelected: splitExpenseTransactionID === item.transactionID,
-            keyForList: item?.transactionID,
-            isEditable: (item.statusNum ?? 0) < CONST.REPORT.STATUS_NUM.CLOSED,
-        };
-    });
-
-    const isInitialSplit = childTransactions.length === 0;
-
-    const listFooterContent = (
-        <View style={[styles.w100, styles.flexColumn, styles.mt1, shouldUseNarrowLayout && styles.mb3]}>
-            <MenuItem
-                onPress={onAddSplitExpense}
-                title={translate('iou.addSplit')}
-                icon={icons.Plus}
-                style={[styles.ph4]}
-            />
-            {isInitialSplit && (
+        return items;
+    }, [
+        transaction,
+        draftTransaction?.comment?.splitExpenses,
+        draftTransaction?.currency,
+        allTransactions,
+        transactionDetailsAmount,
+        currencySymbol,
+        splitExpenseTransactionID,
+        translate,
+        getTranslatedText,
+        onSplitExpenseValueChange,
+    ]);
+
+    const isInitialSplit = useMemo(() => childTransactions.length === 0, [childTransactions.length]);
+
+    const listFooterContent = useMemo(() => {
+        return (
+            <View style={[styles.w100, styles.flexColumn, styles.mt1, shouldUseNarrowLayout && styles.mb3]}>
                 <MenuItem
-                    onPress={onMakeSplitsEven}
-                    title={translate('iou.makeSplitsEven')}
-                    icon={icons.ArrowsLeftRight}
+                    onPress={onAddSplitExpense}
+                    title={translate('iou.addSplit')}
+                    icon={icons.Plus}
                     style={[styles.ph4]}
                 />
-            )}
-        </View>
-    );
-
-    const shouldShowWarningMessage = sumOfSplitExpenses < transactionDetailsAmount;
-    const warningMessage = shouldShowWarningMessage
-        ? translate('iou.totalAmountLessThanOriginal', {amount: convertToDisplayString(transactionDetailsAmount - sumOfSplitExpenses, transactionDetails.currency)})
-        : '';
-    const footerContent = (
-        <View style={[styles.ph5, styles.pb5]}>
-            {(!!errorMessage || !!warningMessage) && (
-                <FormHelpMessage
-                    style={[styles.ph1, styles.mb2]}
-                    isError={!!errorMessage}
-                    isInfo={!errorMessage && shouldShowWarningMessage}
-                    message={errorMessage || warningMessage}
+                {isInitialSplit && (
+                    <MenuItem
+                        onPress={onMakeSplitsEven}
+                        title={translate('iou.makeSplitsEven')}
+                        icon={icons.ArrowsLeftRight}
+                        style={[styles.ph4]}
+                    />
+                )}
+            </View>
+        );
+    }, [
+        styles.w100,
+        styles.flexColumn,
+        styles.mt1,
+        styles.mb3,
+        styles.ph4,
+        shouldUseNarrowLayout,
+        onAddSplitExpense,
+        translate,
+        icons.Plus,
+        icons.ArrowsLeftRight,
+        isInitialSplit,
+        onMakeSplitsEven,
+    ]);
+
+    const footerContent = useMemo(() => {
+        const shouldShowWarningMessage = sumOfSplitExpenses < transactionDetailsAmount;
+        const warningMessage = shouldShowWarningMessage
+            ? translate('iou.totalAmountLessThanOriginal', {amount: convertToDisplayString(transactionDetailsAmount - sumOfSplitExpenses, transactionDetails.currency)})
+            : '';
+        return (
+            <View style={[styles.ph5, styles.pb5]}>
+                {(!!errorMessage || !!warningMessage) && (
+                    <FormHelpMessage
+                        style={[styles.ph1, styles.mb2]}
+                        isError={!!errorMessage}
+                        isInfo={!errorMessage && shouldShowWarningMessage}
+                        message={errorMessage || warningMessage}
+                    />
+                )}
+                <Button
+                    success
+                    large
+                    style={[styles.w100]}
+                    text={translate('common.save')}
+                    onPress={onSaveSplitExpense}
+                    pressOnEnter
+                    enterKeyEventListenerPriority={1}
                 />
-            )}
-            <Button
-                success
-                large
-                style={[styles.w100]}
-                text={translate('common.save')}
-                onPress={onSaveSplitExpense}
-                pressOnEnter
-                enterKeyEventListenerPriority={1}
-            />
-        </View>
-    );
+            </View>
+        );
+    }, [sumOfSplitExpenses, transactionDetailsAmount, translate, transactionDetails.currency, errorMessage, styles.ph1, styles.mb2, styles.w100, styles.ph5, styles.pb5, onSaveSplitExpense]);
 
-    const splitStartDate = draftTransaction?.comment?.splitsStartDate;
-    const splitEndDate = draftTransaction?.comment?.splitsEndDate;
-    const splitDatesTitle = DateUtils.getFormattedSplitDateRange(translate, splitStartDate, splitEndDate);
+    const splitDatesTitle = useMemo(() => {
+        const startDate = draftTransaction?.comment?.splitsStartDate;
+        const endDate = draftTransaction?.comment?.splitsEndDate;
+        return DateUtils.getFormattedSplitDateRange(translate, startDate, endDate);
+    }, [draftTransaction?.comment?.splitsStartDate, draftTransaction?.comment?.splitsEndDate, translate]);
 
-    const handleDatePress = () => {
+    const handleDatePress = useCallback(() => {
         Navigation.navigate(ROUTES.SPLIT_EXPENSE_CREATE_DATE_RANGE.getRoute(reportID, transactionID, Navigation.getActiveRoute()));
-    };
-
-    const headerDateContent = (
-        <View style={styles.pb3}>
-            <MenuItemWithTopDescription
-                shouldShowRightIcon
-                shouldRenderAsHTML
-                key={translate('iou.splitDates')}
-                description={translate('iou.splitDates')}
-                title={splitDatesTitle}
-                onPress={handleDatePress}
-                style={[styles.moneyRequestMenuItem]}
-                titleWrapperStyle={styles.flex1}
-                numberOfLinesTitle={2}
-            />
-        </View>
-    );
+    }, [reportID, transactionID]);
+
+    const headerDateContent = useMemo(() => {
+        return (
+            <View style={styles.pb3}>
+                <MenuItemWithTopDescription
+                    shouldShowRightIcon
+                    shouldRenderAsHTML
+                    key={translate('iou.splitDates')}
+                    description={translate('iou.splitDates')}
+                    title={splitDatesTitle}
+                    onPress={handleDatePress}
+                    style={[styles.moneyRequestMenuItem]}
+                    titleWrapperStyle={styles.flex1}
+                    numberOfLinesTitle={2}
+                />
+            </View>
+        );
+    }, [styles.pb3, styles.moneyRequestMenuItem, styles.flex1, translate, splitDatesTitle, handleDatePress]);
 
     const initiallyFocusedOptionKey = options.find((option) => option.transactionID === splitExpenseTransactionID)?.keyForList;
 
-    let headerTitle = translate('iou.split');
-    if (Number(splitExpenseTransactionID)) {
-        headerTitle = translate('iou.editSplits');
-    } else if (isPercentageMode) {
-        headerTitle = translate('iou.splitByPercentage');
-    } else if (isDateMode) {
-        headerTitle = translate('iou.splitByDate');
-    }
-
-    const onSelectRow = (item: SplitListItemType) => {
-        if (!item.isEditable) {
-            showConfirmModal({
-                title: translate('iou.splitExpenseCannotBeEditedModalTitle'),
-                prompt: translate('iou.splitExpenseCannotBeEditedModalDescription'),
-                confirmText: translate('common.buttonConfirm'),
-                shouldShowCancelButton: false,
-            });
-            return;
+    const headerTitle = useMemo(() => {
+        if (Number(splitExpenseTransactionID)) {
+            return translate('iou.editSplits');
         }
-        Keyboard.dismiss();
-        // eslint-disable-next-line @typescript-eslint/no-deprecated
-        InteractionManager.runAfterInteractions(() => {
-            initDraftSplitExpenseDataForEdit(draftTransaction, item.transactionID, item.reportID ?? reportID);
-        });
-    };
+        if (isPercentageMode) {
+            return translate('iou.splitByPercentage');
+        }
+        if (isDateMode) {
+            return translate('iou.splitByDate');
+        }
+        return translate('iou.split');
+    }, [splitExpenseTransactionID, isDateMode, isPercentageMode, translate]);
+
+    const onSelectRow = useCallback(
+        (item: SplitListItemType) => {
+            if (!item.isEditable) {
+                showConfirmModal({
+                    title: translate('iou.splitExpenseCannotBeEditedModalTitle'),
+                    prompt: translate('iou.splitExpenseCannotBeEditedModalDescription'),
+                    confirmText: translate('common.buttonConfirm'),
+                    shouldShowCancelButton: false,
+                });
+                return;
+            }
+            Keyboard.dismiss();
+            // eslint-disable-next-line @typescript-eslint/no-deprecated
+            InteractionManager.runAfterInteractions(() => {
+                initDraftSplitExpenseDataForEdit(draftTransaction, item.transactionID, item.reportID ?? reportID);
+            });
+        },
+        [draftTransaction, reportID, showConfirmModal, translate],
+    );
 
     if (isLoadingDraftTransaction) {
         return <FullScreenLoadingIndicator style={[styles.opacity1]} />;
diff --git a/src/pages/iou/request/IOURequestStartPage.tsx b/src/pages/iou/request/IOURequestStartPage.tsx
index fb6356974cd4..5e067196a4fd 100644
--- a/src/pages/iou/request/IOURequestStartPage.tsx
+++ b/src/pages/iou/request/IOURequestStartPage.tsx
@@ -6,7 +6,6 @@ import DragAndDropProvider from '@components/DragAndDrop/Provider';
 import FocusTrapContainerElement from '@components/FocusTrap/FocusTrapContainerElement';
 import HeaderWithBackButton from '@components/HeaderWithBackButton';
 import {useProductTrainingContext} from '@components/ProductTrainingContext';
-import type {AnimatedTextInputRef} from '@components/RNTextInput';
 import ScreenWrapper from '@components/ScreenWrapper';
 import TabSelector from '@components/TabSelector/TabSelector';
 import useCurrentUserPersonalDetails from '@hooks/useCurrentUserPersonalDetails';
@@ -94,8 +93,6 @@ function IOURequestStartPage({
     const [nvpDismissedProductTraining] = useOnyx(ONYXKEYS.NVP_DISMISSED_PRODUCT_TRAINING, {canBeMissing: true});
     const hasOnlyPersonalPolicies = useMemo(() => hasOnlyPersonalPoliciesUtil(allPolicies), [allPolicies]);
 
-    const perDiemInputRef = useRef<AnimatedTextInputRef | null>(null);
-
     const tabTitles = {
         [CONST.IOU.TYPE.REQUEST]: translate('iou.createExpense'),
         [CONST.IOU.TYPE.SUBMIT]: translate('iou.createExpense'),
@@ -108,18 +105,6 @@ function IOURequestStartPage({
         [CONST.IOU.TYPE.CREATE]: translate('iou.createExpense'),
     };
 
-    const onTabSelectFocusHandler = ({index}: {index: number}) => {
-        // We requestAnimationFrame since the function is called in the animate block in the web implementation
-        // which fixes a locked animation glitch when swiping between tabs, and aligns with the native implementation internal delay
-        requestAnimationFrame(() => {
-            //  2 - PerDiem
-            if (index !== 2) {
-                return;
-            }
-            perDiemInputRef.current?.focus?.();
-        });
-    };
-
     const isFromGlobalCreate = isEmptyObject(report?.reportID);
     const currentUserPersonalDetails = useCurrentUserPersonalDetails();
     const policiesWithPerDiemEnabledAndHasRates = useMemo(
@@ -271,8 +256,6 @@ function IOURequestStartPage({
 
     useHandleBackButton(onBackButtonPress);
 
-    const shouldShowWorkspaceSelectForPerDiem = moreThanOnePerDiemExist && !hasCurrentPolicyPerDiemEnabled;
-
     return (
         <AccessOrNotFoundWrapper
             reportID={reportID}
@@ -305,7 +288,6 @@ function IOURequestStartPage({
                                 id={CONST.TAB.IOU_REQUEST_TYPE}
                                 defaultSelectedTab={defaultSelectedTab}
                                 onTabSelected={onTabSelected}
-                                onTabSelect={onTabSelectFocusHandler}
                                 tabBar={TabSelector}
                                 onTabBarFocusTrapContainerElementChanged={setTabBarContainerElement}
                                 onActiveTabFocusTrapContainerElementChanged={setActiveTabContainerElement}
@@ -357,16 +339,14 @@ function IOURequestStartPage({
                                     <TopTab.Screen name={CONST.TAB_REQUEST.PER_DIEM}>
                                         {() => (
                                             <TabScreenWithFocusTrapWrapper>
-                                                {shouldShowWorkspaceSelectForPerDiem ? (
+                                                {moreThanOnePerDiemExist && !hasCurrentPolicyPerDiemEnabled ? (
                                                     <IOURequestStepPerDiemWorkspace
                                                         route={route}
                                                         navigation={navigation}
                                                     />
                                                 ) : (
                                                     <IOURequestStepDestination
-                                                        shouldAutoFocusInput={false}
                                                         openedFromStartPage
-                                                        ref={perDiemInputRef}
                                                         explicitPolicyID={moreThanOnePerDiemExist ? undefined : policiesWithPerDiemEnabledAndHasRates.at(0)?.id}
                                                         route={route}
                                                         navigation={navigation}
diff --git a/src/pages/iou/request/MoneyRequestAccountantSelector.tsx b/src/pages/iou/request/MoneyRequestAccountantSelector.tsx
index 031cc9b2c76e..cbcbe5739374 100644
--- a/src/pages/iou/request/MoneyRequestAccountantSelector.tsx
+++ b/src/pages/iou/request/MoneyRequestAccountantSelector.tsx
@@ -66,7 +66,6 @@ function MoneyRequestAccountantSelector({onFinish, onAccountantSelected, iouType
     const [draftComments] = useOnyx(ONYXKEYS.COLLECTION.REPORT_DRAFT_COMMENT, {canBeMissing: true});
     const [nvpDismissedProductTraining] = useOnyx(ONYXKEYS.NVP_DISMISSED_PRODUCT_TRAINING, {canBeMissing: true});
     const [loginList] = useOnyx(ONYXKEYS.LOGIN_LIST, {canBeMissing: true});
-    const [allPolicies] = useOnyx(ONYXKEYS.COLLECTION.POLICY, {canBeMissing: true});
 
     useEffect(() => {
         searchInServer(debouncedSearchTerm.trim());
@@ -82,7 +81,6 @@ function MoneyRequestAccountantSelector({onFinish, onAccountantSelected, iouType
                 reports: options.reports,
                 personalDetails: options.personalDetails,
             },
-            allPolicies,
             draftComments,
             nvpDismissedProductTraining,
             loginList,
@@ -100,19 +98,7 @@ function MoneyRequestAccountantSelector({onFinish, onAccountantSelected, iouType
             ...optionList,
             ...orderedOptions,
         };
-    }, [
-        areOptionsInitialized,
-        didScreenTransitionEnd,
-        options.reports,
-        options.personalDetails,
-        allPolicies,
-        draftComments,
-        nvpDismissedProductTraining,
-        loginList,
-        betas,
-        action,
-        countryCode,
-    ]);
+    }, [areOptionsInitialized, didScreenTransitionEnd, options.reports, options.personalDetails, draftComments, nvpDismissedProductTraining, loginList, betas, action, countryCode]);
 
     const chatOptions = useMemo(() => {
         if (!areOptionsInitialized) {
diff --git a/src/pages/iou/request/MoneyRequestParticipantsSelector.tsx b/src/pages/iou/request/MoneyRequestParticipantsSelector.tsx
index 83fc46c0e8a6..664f5170bab1 100644
--- a/src/pages/iou/request/MoneyRequestParticipantsSelector.tsx
+++ b/src/pages/iou/request/MoneyRequestParticipantsSelector.tsx
@@ -52,7 +52,7 @@ import ImportContactButton from './ImportContactButton';
 
 type MoneyRequestParticipantsSelectorProps = {
     /** Callback to request parent modal to go to next step, which should be split */
-    onFinish?: (value?: string, participants?: Participant[]) => void;
+    onFinish?: (value?: string) => void;
 
     /** Callback to add participants in MoneyRequestModal */
     onParticipantsAdded: (value: Participant[]) => void;
@@ -92,7 +92,7 @@ const sanitizedSelectedParticipant = (option: Option | OptionData, iouType: IOUT
 function MoneyRequestParticipantsSelector({
     participants = CONST.EMPTY_ARRAY,
     // eslint-disable-next-line @typescript-eslint/no-unused-vars
-    onFinish = (_value?: string, _participants?: Participant[]) => {},
+    onFinish = (_value?: string) => {},
     onParticipantsAdded,
     iouType,
     action,
@@ -163,7 +163,7 @@ function MoneyRequestParticipantsSelector({
             onParticipantsAdded(newParticipants);
 
             if (!option.isSelfDM) {
-                onFinish(undefined, newParticipants);
+                onFinish();
             }
         },
         // eslint-disable-next-line react-hooks/exhaustive-deps -- we don't want to trigger this callback when iouType changes
@@ -504,7 +504,7 @@ function MoneyRequestParticipantsSelector({
         [isIOUSplit, addParticipantToSelection, addSingleParticipant],
     );
 
-    const importContactsButtonComponent = useMemo(() => {
+    const footerContentAbovePaginationComponent = useMemo(() => {
         const shouldShowImportContactsButton = contactState?.showImportUI ?? showImportContacts;
         if (!shouldShowImportContactsButton) {
             return null;
@@ -515,9 +515,10 @@ function MoneyRequestParticipantsSelector({
                 icon={icons.UserPlus}
                 onPress={goToSettings}
                 shouldShowRightIcon
+                style={styles.mb3}
             />
         );
-    }, [icons.UserPlus, contactState?.showImportUI, showImportContacts, translate]);
+    }, [icons.UserPlus, contactState?.showImportUI, showImportContacts, styles.mb3, translate]);
 
     const ClickableImportContactTextComponent = useMemo(() => {
         if (searchTerm.length || isSearchingForReports) {
@@ -579,8 +580,7 @@ function MoneyRequestParticipantsSelector({
                 }
                 footerContent={footerContent}
                 listEmptyContent={EmptySelectionListContentWithPermission}
-                listHeaderContent={importContactsButtonComponent}
-                showSectionTitleWithListHeaderContent
+                footerContentAbovePagination={footerContentAbovePaginationComponent}
                 headerMessage={header}
                 showLoadingPlaceholder={showLoadingPlaceholder}
                 canSelectMultiple={isIOUSplit && isAllowedToSplit}
diff --git a/src/pages/iou/request/step/IOURequestEditReport.tsx b/src/pages/iou/request/step/IOURequestEditReport.tsx
index 1b923a9e0f5b..03ee0e7fe4c9 100644
--- a/src/pages/iou/request/step/IOURequestEditReport.tsx
+++ b/src/pages/iou/request/step/IOURequestEditReport.tsx
@@ -1,9 +1,10 @@
-import React, {useMemo} from 'react';
+import React from 'react';
 import type {OnyxEntry} from 'react-native-onyx';
-import {usePersonalDetails, useSession} from '@components/OnyxListItemProvider';
+import {useSession} from '@components/OnyxListItemProvider';
 import {useSearchContext} from '@components/Search/SearchContext';
 import type {ListItem} from '@components/SelectionListWithSections/types';
 import useConditionalCreateEmptyReportConfirmation from '@hooks/useConditionalCreateEmptyReportConfirmation';
+import useCurrentUserPersonalDetails from '@hooks/useCurrentUserPersonalDetails';
 import useHasPerDiemTransactions from '@hooks/useHasPerDiemTransactions';
 import useOnyx from '@hooks/useOnyx';
 import usePermissions from '@hooks/usePermissions';
@@ -12,14 +13,14 @@ import {turnOffMobileSelectionMode} from '@libs/actions/MobileSelectionMode';
 import {changeTransactionsReport} from '@libs/actions/Transaction';
 import setNavigationActionToMicrotaskQueue from '@libs/Navigation/helpers/setNavigationActionToMicrotaskQueue';
 import Navigation from '@libs/Navigation/Navigation';
-import {getPersonalDetailsForAccountID, hasViolations as hasViolationsReportUtils} from '@libs/ReportUtils';
+import {hasViolations as hasViolationsReportUtils} from '@libs/ReportUtils';
 import {shouldRestrictUserBillableActions} from '@libs/SubscriptionUtils';
 import {createNewReport} from '@userActions/Report';
 import CONST from '@src/CONST';
 import ONYXKEYS from '@src/ONYXKEYS';
 import ROUTES from '@src/ROUTES';
 import type SCREENS from '@src/SCREENS';
-import type {PersonalDetails, Report} from '@src/types/onyx';
+import type {Report} from '@src/types/onyx';
 import IOURequestEditReportCommon from './IOURequestEditReportCommon';
 import withWritableReportOrNotFound from './withWritableReportOrNotFound';
 import type {WithWritableReportOrNotFoundProps} from './withWritableReportOrNotFound';
@@ -43,11 +44,7 @@ function IOURequestEditReport({route}: IOURequestEditReportProps) {
     const session = useSession();
     const [allPolicies] = useOnyx(ONYXKEYS.COLLECTION.POLICY, {canBeMissing: true});
     const [allPolicyCategories] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY_CATEGORIES}`, {canBeMissing: true});
-    const personalDetails = usePersonalDetails();
-    const ownerPersonalDetails = useMemo(
-        () => getPersonalDetailsForAccountID(selectedReport?.ownerAccountID, personalDetails) as PersonalDetails,
-        [personalDetails, selectedReport?.ownerAccountID],
-    );
+    const currentUserPersonalDetails = useCurrentUserPersonalDetails();
     const selectedReportPolicy = allPolicies?.[`${ONYXKEYS.COLLECTION.POLICY}${selectedReport?.policyID}`];
 
     const hasPerDiemTransactions = useHasPerDiemTransactions(selectedTransactionIDs);
@@ -60,7 +57,7 @@ function IOURequestEditReport({route}: IOURequestEditReportProps) {
 
     const selectReport = (item: TransactionGroupListItem, report?: OnyxEntry<Report>) => {
         if (selectedTransactionIDs.length === 0 || item.value === reportID) {
-            Navigation.dismissToSuperWideRHP();
+            Navigation.dismissModal();
             return;
         }
 
@@ -76,13 +73,13 @@ function IOURequestEditReport({route}: IOURequestEditReportProps) {
                 policy: allPolicies?.[`${ONYXKEYS.COLLECTION.POLICY}${item.policyID}`],
                 reportNextStep,
                 policyCategories: allPolicyCategories?.[`${ONYXKEYS.COLLECTION.POLICY_CATEGORIES}${item.policyID}`],
-                allTransactions,
+                allTransactionsCollection: allTransactions,
             });
             turnOffMobileSelectionMode();
             clearSelectedTransactions(true);
         });
 
-        Navigation.dismissToSuperWideRHP();
+        Navigation.dismissModal();
     };
 
     const removeFromReport = () => {
@@ -94,13 +91,13 @@ function IOURequestEditReport({route}: IOURequestEditReportProps) {
             isASAPSubmitBetaEnabled,
             accountID: session?.accountID ?? CONST.DEFAULT_NUMBER_ID,
             email: session?.email ?? '',
-            allTransactions,
+            allTransactionsCollection: allTransactions,
         });
         if (shouldTurnOffSelectionMode) {
             turnOffMobileSelectionMode();
         }
         clearSelectedTransactions(true);
-        Navigation.dismissToSuperWideRHP();
+        Navigation.dismissModal();
     };
 
     const createReportForPolicy = (shouldDismissEmptyReportsConfirmation?: boolean) => {
@@ -109,7 +106,7 @@ function IOURequestEditReport({route}: IOURequestEditReportProps) {
         }
 
         const policyForNewReport = hasPerDiemTransactions ? selectedReportPolicy : policyForMovingExpenses;
-        const optimisticReport = createNewReport(ownerPersonalDetails, hasViolations, isASAPSubmitBetaEnabled, policyForNewReport, false, shouldDismissEmptyReportsConfirmation);
+        const optimisticReport = createNewReport(currentUserPersonalDetails, hasViolations, isASAPSubmitBetaEnabled, policyForNewReport, false, shouldDismissEmptyReportsConfirmation);
         selectReport({value: optimisticReport.reportID}, optimisticReport);
     };
 
diff --git a/src/pages/iou/request/step/IOURequestEditReportCommon.tsx b/src/pages/iou/request/step/IOURequestEditReportCommon.tsx
index 39c55ed9cc11..579d85eb012a 100644
--- a/src/pages/iou/request/step/IOURequestEditReportCommon.tsx
+++ b/src/pages/iou/request/step/IOURequestEditReportCommon.tsx
@@ -1,5 +1,6 @@
+import {createPoliciesSelector} from '@selectors/Policy';
 import React, {useCallback, useMemo, useState} from 'react';
-import type {OnyxEntry} from 'react-native-onyx';
+import type {OnyxCollection, OnyxEntry} from 'react-native-onyx';
 import ConfirmModal from '@components/ConfirmModal';
 // eslint-disable-next-line no-restricted-imports
 import * as Expensicons from '@components/Icon/Expensicons';
@@ -13,18 +14,27 @@ import useDebouncedState from '@hooks/useDebouncedState';
 import {useMemoizedLazyExpensifyIcons} from '@hooks/useLazyAsset';
 import useLocalize from '@hooks/useLocalize';
 import useOnyx from '@hooks/useOnyx';
-import useOutstandingReports from '@hooks/useOutstandingReports';
 import usePolicy from '@hooks/usePolicy';
 import usePolicyForMovingExpenses from '@hooks/usePolicyForMovingExpenses';
 import useReportTransactions from '@hooks/useReportTransactions';
 import Navigation from '@libs/Navigation/Navigation';
-import {isPolicyAdmin} from '@libs/PolicyUtils';
-import {canAddTransaction, getPolicyName, getReportName, isIOUReport, isOpenReport, isReportOwner, sortOutstandingReportsBySelected} from '@libs/ReportUtils';
+import {getPersonalPolicy, isPolicyAdmin} from '@libs/PolicyUtils';
+import {
+    canAddTransaction,
+    getOutstandingReportsForUser,
+    getPolicyName,
+    getReportName,
+    isIOUReport,
+    isOpenReport,
+    isReportOwner,
+    isSelfDM,
+    sortOutstandingReportsBySelected,
+} from '@libs/ReportUtils';
 import {isPerDiemRequest as isPerDiemRequestUtil} from '@libs/TransactionUtils';
 import CONST from '@src/CONST';
 import ONYXKEYS from '@src/ONYXKEYS';
 import type {Route} from '@src/ROUTES';
-import type {Report} from '@src/types/onyx';
+import type {Policy, Report} from '@src/types/onyx';
 import {isEmptyObject} from '@src/types/utils/EmptyObject';
 import StepScreenWrapper from './StepScreenWrapper';
 
@@ -48,6 +58,10 @@ type Props = {
     isPerDiemRequest: boolean;
 };
 
+const policyIdSelector = (policy: OnyxEntry<Policy>) => policy?.id;
+
+const policiesSelector = (policies: OnyxCollection<Policy>) => createPoliciesSelector(policies, policyIdSelector);
+
 function IOURequestEditReportCommon({
     backTo,
     transactionIDs,
@@ -65,6 +79,7 @@ function IOURequestEditReportCommon({
     const icons = useMemoizedLazyExpensifyIcons(['Document']);
     const {translate, localeCompare} = useLocalize();
     const {options} = useOptionsList();
+    const [outstandingReportsByPolicyID] = useOnyx(ONYXKEYS.DERIVED.OUTSTANDING_REPORTS_BY_POLICY_ID, {canBeMissing: true});
     const [allPolicies] = useOnyx(ONYXKEYS.COLLECTION.POLICY, {canBeMissing: true});
     const [allTransactions] = useOnyx(ONYXKEYS.COLLECTION.TRANSACTION, {canBeMissing: true});
     const currentUserPersonalDetails = useCurrentUserPersonalDetails();
@@ -85,6 +100,10 @@ function IOURequestEditReportCommon({
 
     const [perDiemWarningModalVisible, setPerDiemWarningModalVisible] = useState(false);
 
+    const [reportNameValuePairs] = useOnyx(ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS, {canBeMissing: true});
+
+    const [allPoliciesID] = useOnyx(ONYXKEYS.COLLECTION.POLICY, {selector: policiesSelector, canBeMissing: false});
+
     const [searchValue, debouncedSearchValue, setSearchValue] = useDebouncedState('');
     const isSelectedReportUnreported = useMemo(() => !!(isUnreported ?? selectedReportID === CONST.REPORT.UNREPORTED_REPORT_ID), [isUnreported, selectedReportID]);
     const isOwner = useMemo(
@@ -107,14 +126,45 @@ function IOURequestEditReportCommon({
     const shouldShowRemoveFromReport =
         !!(selectedReportID && selectedReportID !== CONST.REPORT.UNREPORTED_REPORT_ID && selectedReport) && isEditing && isOwner && !isReportIOU && !isCardTransaction;
 
-    const outstandingReports = useOutstandingReports(selectedReportID, selectedPolicyID, resolvedReportOwnerAccountID, isEditing);
+    const expenseReports = useMemo(() => {
+        // Early return if no reports are available to prevent useless loop
+        if (!outstandingReportsByPolicyID || isEmptyObject(outstandingReportsByPolicyID)) {
+            return [];
+        }
+        const personalPolicyID = getPersonalPolicy()?.id;
+        if (!selectedPolicyID || selectedPolicyID === personalPolicyID || isSelfDM(selectedReport)) {
+            return Object.values(allPoliciesID ?? {})
+                .filter((policyID) => personalPolicyID !== policyID)
+                .flatMap((policyID) => {
+                    if (!policyID) {
+                        return [];
+                    }
+                    const reports = getOutstandingReportsForUser(
+                        policyID,
+                        resolvedReportOwnerAccountID,
+                        outstandingReportsByPolicyID?.[policyID ?? CONST.DEFAULT_NUMBER_ID] ?? {},
+                        reportNameValuePairs,
+                        isEditing,
+                    );
+
+                    return reports;
+                });
+        }
+        return getOutstandingReportsForUser(
+            selectedPolicyID,
+            resolvedReportOwnerAccountID,
+            outstandingReportsByPolicyID?.[selectedPolicyID ?? CONST.DEFAULT_NUMBER_ID] ?? {},
+            reportNameValuePairs,
+            isEditing,
+        );
+    }, [outstandingReportsByPolicyID, resolvedReportOwnerAccountID, allPoliciesID, reportNameValuePairs, selectedReport, selectedPolicyID, isEditing]);
 
     const reportOptions: TransactionGroupListItem[] = useMemo(() => {
-        if (outstandingReports.length === 0) {
+        if (!outstandingReportsByPolicyID || isEmptyObject(outstandingReportsByPolicyID)) {
             return [];
         }
 
-        return outstandingReports
+        return expenseReports
             .sort((report1, report2) => sortOutstandingReportsBySelected(report1, report2, selectedReportID, localeCompare))
             .filter((report) => !debouncedSearchValue || report?.reportName?.toLowerCase().includes(debouncedSearchValue.toLowerCase()))
             .filter((report): report is NonNullable<typeof report> => report !== undefined)
@@ -144,7 +194,7 @@ function IOURequestEditReportCommon({
                     policyID: matchingOption?.policyID ?? report.policyID,
                 };
             });
-    }, [debouncedSearchValue, outstandingReports, selectedReportID, options.reports, localeCompare, allPolicies, currentUserPersonalDetails.accountID]);
+    }, [outstandingReportsByPolicyID, debouncedSearchValue, expenseReports, selectedReportID, options.reports, localeCompare, allPolicies, currentUserPersonalDetails.accountID]);
 
     const navigateBack = () => {
         Navigation.goBack(backTo);
@@ -218,7 +268,7 @@ function IOURequestEditReportCommon({
     const headerMessage = useMemo(() => (searchValue && !reportOptions.length ? translate('common.noResultsFound') : ''), [searchValue, reportOptions.length, translate]);
 
     const createReportOption = useMemo(() => {
-        if (!createReport) {
+        if (!createReport || (isEditing && !isOwner)) {
             return undefined;
         }
 
@@ -230,7 +280,7 @@ function IOURequestEditReportCommon({
                 icon={icons.Document}
             />
         );
-    }, [icons.Document, createReport, translate, policyForMovingExpenses?.name, handleCreateReport]);
+    }, [icons.Document, createReport, isEditing, isOwner, translate, policyForMovingExpenses?.name, handleCreateReport]);
 
     // eslint-disable-next-line rulesdir/no-negated-variables
     const shouldShowNotFoundPage = useMemo(() => {
@@ -238,7 +288,7 @@ function IOURequestEditReportCommon({
             return false;
         }
 
-        if (outstandingReports.length === 0 || shouldShowNotFoundPageFromProps) {
+        if (expenseReports.length === 0 || shouldShowNotFoundPageFromProps) {
             return true;
         }
 
@@ -251,7 +301,7 @@ function IOURequestEditReportCommon({
         const isSubmitter = isReportOwner(selectedReport);
         // If the report is Open, then only submitters, admins can move expenses
         return isOpen && !isAdmin && !isSubmitter;
-    }, [createReportOption, outstandingReports.length, shouldShowNotFoundPageFromProps, selectedReport, reportPolicy]);
+    }, [createReportOption, expenseReports.length, shouldShowNotFoundPageFromProps, selectedReport, reportPolicy]);
 
     const hidePerDiemWarningModal = () => setPerDiemWarningModalVisible(false);
 
@@ -267,8 +317,7 @@ function IOURequestEditReportCommon({
             <SelectionList
                 data={reportOptions}
                 onSelectRow={handleSelectReport}
-                isRowMultilineSupported
-                shouldShowTextInput={outstandingReports.length >= CONST.STANDARD_LIST_ITEM_LIMIT}
+                shouldShowTextInput={expenseReports.length >= CONST.STANDARD_LIST_ITEM_LIMIT}
                 textInputOptions={{
                     value: searchValue,
                     label: translate('common.search'),
diff --git a/src/pages/iou/request/step/IOURequestStepAmount.tsx b/src/pages/iou/request/step/IOURequestStepAmount.tsx
index 2049e518ef14..abb4ccf23a79 100644
--- a/src/pages/iou/request/step/IOURequestStepAmount.tsx
+++ b/src/pages/iou/request/step/IOURequestStepAmount.tsx
@@ -11,18 +11,16 @@ import useLocalize from '@hooks/useLocalize';
 import useOnyx from '@hooks/useOnyx';
 import usePermissions from '@hooks/usePermissions';
 import usePersonalPolicy from '@hooks/usePersonalPolicy';
-import usePolicyForMovingExpenses from '@hooks/usePolicyForMovingExpenses';
-import usePrivateIsArchivedMap from '@hooks/usePrivateIsArchivedMap';
 import useReportIsArchived from '@hooks/useReportIsArchived';
 import useShowNotFoundPageInIOUStep from '@hooks/useShowNotFoundPageInIOUStep';
 import {setTransactionReport} from '@libs/actions/Transaction';
 import {convertToBackendAmount} from '@libs/CurrencyUtils';
 import getNonEmptyStringOnyxID from '@libs/getNonEmptyStringOnyxID';
-import {isMovingTransactionFromTrackExpense, navigateToConfirmationPage, navigateToParticipantPage} from '@libs/IOUUtils';
+import {navigateToParticipantPage} from '@libs/IOUUtils';
 import Navigation from '@libs/Navigation/Navigation';
 import {getParticipantsOption, getReportOption} from '@libs/OptionsListUtils';
 import {isPaidGroupPolicy} from '@libs/PolicyUtils';
-import {getPolicyExpenseChat, getReportOrDraftReport, getTransactionDetails, isMoneyRequestReport, isPolicyExpenseChat, isSelfDM, shouldEnableNegative} from '@libs/ReportUtils';
+import {getPolicyExpenseChat, getReportOrDraftReport, getTransactionDetails, isPolicyExpenseChat, isSelfDM, shouldEnableNegative} from '@libs/ReportUtils';
 import {shouldRestrictUserBillableActions} from '@libs/SubscriptionUtils';
 import {calculateTaxAmount, getAmount, getCurrency, getDefaultTaxCode, getRequestType, getTaxValue, isDistanceRequest, isExpenseUnreported} from '@libs/TransactionUtils';
 import MoneyRequestAmountForm from '@pages/iou/MoneyRequestAmountForm';
@@ -33,8 +31,6 @@ import {
     setDraftSplitTransaction,
     setMoneyRequestAmount,
     setMoneyRequestParticipantsFromReport,
-    setMoneyRequestTaxAmount,
-    setMoneyRequestTaxRate,
     setSplitShares,
     trackExpense,
     updateMoneyRequestAmountAndCurrency,
@@ -83,15 +79,12 @@ function IOURequestStepAmount({
     const focusTimeoutRef = useRef<NodeJS.Timeout | null>(null);
     const isSaveButtonPressed = useRef(false);
     const iouRequestType = getRequestType(transaction);
-    const isTrackExpense = iouType === CONST.IOU.TYPE.TRACK;
-    const {policyForMovingExpensesID} = usePolicyForMovingExpenses();
-    const policyID = isTrackExpense ? policyForMovingExpensesID : report?.policyID;
+    const policyID = report?.policyID;
 
     const isReportArchived = useReportIsArchived(report?.reportID);
     const [policy] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY}${policyID}`, {canBeMissing: true});
     const [policyCategories] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY_CATEGORIES}${policyID}`, {canBeMissing: true});
     const [parentReport] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${getNonEmptyStringOnyxID(report?.parentReportID)}`, {canBeMissing: true});
-    const [parentReportNextStep] = useOnyx(`${ONYXKEYS.COLLECTION.NEXT_STEP}${getNonEmptyStringOnyxID(report?.parentReportID)}`, {canBeMissing: true});
     const [personalDetails] = useOnyx(ONYXKEYS.PERSONAL_DETAILS_LIST, {canBeMissing: false});
     const [draftTransaction] = useOnyx(`${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${transactionID}`, {canBeMissing: true});
     const [splitDraftTransaction] = useOnyx(`${ONYXKEYS.COLLECTION.SPLIT_TRANSACTION_DRAFT}${transactionID}`, {canBeMissing: true});
@@ -104,7 +97,6 @@ function IOURequestStepAmount({
     const personalPolicy = usePersonalPolicy();
     const {duplicateTransactions, duplicateTransactionViolations} = useDuplicateTransactionsAndViolations(transactionID ? [transactionID] : []);
     const [reportAttributesDerived] = useOnyx(ONYXKEYS.DERIVED.REPORT_ATTRIBUTES, {canBeMissing: true, selector: reportsSelector});
-    const privateIsArchivedMap = usePrivateIsArchivedMap();
     const isEditing = action === CONST.IOU.ACTION.EDIT;
     const isSplitBill = iouType === CONST.IOU.TYPE.SPLIT;
     const isCreateAction = action === CONST.IOU.ACTION.CREATE;
@@ -137,26 +129,6 @@ function IOURequestStepAmount({
         return !(isReportArchived || isPolicyExpenseChat(report));
     }, [report, isSplitBill, skipConfirmation, isReportArchived]);
 
-    // When editing, the `report` is the transaction thread which only has the current user as participant.
-    // To correctly determine if this is a P2P expense, we need to traverse to the actual chat report
-    // (e.g., the 1:1 DM) via the IOU/expense report's chatReportID.
-    const chatReportForP2PCheck = useMemo(() => {
-        if (!isEditing) {
-            return report;
-        }
-
-        // When editing, report is the transaction thread. We need to get the actual chat report.
-        // Transaction thread's chatReportID points to the IOU/expense report,
-        // and the IOU/expense report's chatReportID points to the actual chat.
-        const iouOrExpenseReport = report?.chatReportID ? getReportOrDraftReport(report.chatReportID) : undefined;
-        if (iouOrExpenseReport && isMoneyRequestReport(iouOrExpenseReport) && iouOrExpenseReport.chatReportID) {
-            return getReportOrDraftReport(iouOrExpenseReport.chatReportID);
-        }
-
-        // Fallback to the passed report if we can't traverse
-        return report;
-    }, [isEditing, report]);
-
     useFocusEffect(
         useCallback(() => {
             if (isCurrencyPickerVisible) {
@@ -181,6 +153,19 @@ function IOURequestStepAmount({
         Navigation.goBack(backTo);
     };
 
+    const navigateToConfirmationPage = () => {
+        switch (iouType) {
+            case CONST.IOU.TYPE.REQUEST:
+                Navigation.navigate(ROUTES.MONEY_REQUEST_STEP_CONFIRMATION.getRoute(CONST.IOU.ACTION.CREATE, CONST.IOU.TYPE.SUBMIT, transactionID, reportID, backToReport));
+                break;
+            case CONST.IOU.TYPE.SEND:
+                Navigation.navigate(ROUTES.MONEY_REQUEST_STEP_CONFIRMATION.getRoute(CONST.IOU.ACTION.CREATE, CONST.IOU.TYPE.PAY, transactionID, reportID));
+                break;
+            default:
+                Navigation.navigate(ROUTES.MONEY_REQUEST_STEP_CONFIRMATION.getRoute(CONST.IOU.ACTION.CREATE, iouType, transactionID, reportID, backToReport));
+        }
+    };
+
     const navigateToNextPage = ({amount, paymentMethod}: AmountParams) => {
         isSaveButtonPressed.current = true;
         const amountInSmallestCurrencyUnits = convertToBackendAmount(Number.parseFloat(amount));
@@ -188,16 +173,6 @@ function IOURequestStepAmount({
         // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
         setMoneyRequestAmount(transactionID, amountInSmallestCurrencyUnits, selectedCurrency || CONST.CURRENCY.USD, shouldKeepUserInput);
 
-        if (isMovingTransactionFromTrackExpense(action)) {
-            const taxCode = selectedCurrency !== policy?.outputCurrency ? policy?.taxRates?.foreignTaxDefault : policy?.taxRates?.defaultExternalID;
-            if (taxCode) {
-                setMoneyRequestTaxRate(transactionID, taxCode);
-                const taxPercentage = getTaxValue(policy, transaction, taxCode) ?? '';
-                const taxAmount = convertToBackendAmount(calculateTaxAmount(taxPercentage, amountInSmallestCurrencyUnits, selectedCurrency || CONST.CURRENCY.USD));
-                setMoneyRequestTaxAmount(transactionID, taxAmount);
-            }
-        }
-
         if (backTo) {
             Navigation.goBack(backTo);
             return;
@@ -213,8 +188,7 @@ function IOURequestStepAmount({
             const selectedParticipants = getMoneyRequestParticipantsFromReport(report, currentUserPersonalDetails.accountID);
             const participants = selectedParticipants.map((participant) => {
                 const participantAccountID = participant?.accountID ?? CONST.DEFAULT_NUMBER_ID;
-                const privateIsArchived = privateIsArchivedMap[`${ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS}${participant.reportID}`];
-                return participantAccountID ? getParticipantsOption(participant, personalDetails) : getReportOption(participant, privateIsArchived, policy, reportAttributesDerived);
+                return participantAccountID ? getParticipantsOption(participant, personalDetails) : getReportOption(participant, reportAttributesDerived);
             });
             const backendAmount = convertToBackendAmount(Number.parseFloat(amount));
 
@@ -283,7 +257,7 @@ function IOURequestStepAmount({
                 setSplitShares(transaction, amountInSmallestCurrencyUnits, selectedCurrency || CONST.CURRENCY.USD, participantAccountIDs);
             }
             setMoneyRequestParticipantsFromReport(transactionID, report, currentUserPersonalDetails.accountID).then(() => {
-                navigateToConfirmationPage(iouType, transactionID, reportID, backToReport);
+                navigateToConfirmationPage();
             });
             return;
         }
@@ -375,7 +349,6 @@ function IOURequestStepAmount({
             transactionID,
             transactionThreadReport: report,
             parentReport,
-            parentReportNextStep,
             transactions: duplicateTransactions,
             transactionViolations: duplicateTransactionViolations,
             currency: selectedCurrency,
@@ -383,7 +356,6 @@ function IOURequestStepAmount({
             taxAmount,
             policy,
             taxCode,
-            taxValue: taxPercentage,
             policyCategories,
             currentUserAccountIDParam,
             currentUserEmailParam,
@@ -440,7 +412,6 @@ function IOURequestStepAmount({
                 allowFlippingAmount={!isSplitBill && allowNegative}
                 selectedTab={iouRequestType as SelectedTabRequest}
                 chatReportID={reportID}
-                isP2P={isParticipantP2P(getMoneyRequestParticipantsFromReport(chatReportForP2PCheck, currentUserPersonalDetails.accountID).at(0))}
                 isCurrencyPressable={!isUnreportedDistanceExpense}
             />
         </StepScreenWrapper>
diff --git a/src/pages/iou/request/step/IOURequestStepAttendees.tsx b/src/pages/iou/request/step/IOURequestStepAttendees.tsx
index bd99bf997c71..4f38d4b27cd0 100644
--- a/src/pages/iou/request/step/IOURequestStepAttendees.tsx
+++ b/src/pages/iou/request/step/IOURequestStepAttendees.tsx
@@ -1,5 +1,6 @@
 import {deepEqual} from 'fast-equals';
 import React, {useCallback, useState} from 'react';
+import type {OnyxEntry} from 'react-native-onyx';
 import useCurrentUserPersonalDetails from '@hooks/useCurrentUserPersonalDetails';
 import useLocalize from '@hooks/useLocalize';
 import useOnyx from '@hooks/useOnyx';
@@ -15,30 +16,40 @@ import MoneyRequestAttendeeSelector from '@pages/iou/request/MoneyRequestAttende
 import CONST from '@src/CONST';
 import ONYXKEYS from '@src/ONYXKEYS';
 import type SCREENS from '@src/SCREENS';
+import type * as OnyxTypes from '@src/types/onyx';
 import type {Attendee} from '@src/types/onyx/IOU';
 import StepScreenWrapper from './StepScreenWrapper';
 import type {WithWritableReportOrNotFoundProps} from './withWritableReportOrNotFound';
 import withWritableReportOrNotFound from './withWritableReportOrNotFound';
 
-type IOURequestStepAttendeesProps = WithWritableReportOrNotFoundProps<typeof SCREENS.MONEY_REQUEST.STEP_ATTENDEES>;
+type IOURequestStepAttendeesOnyxProps = {
+    /** The policy of the report */
+    policy: OnyxEntry<OnyxTypes.Policy>;
+
+    /** Collection of categories attached to a policy */
+    policyCategories: OnyxEntry<OnyxTypes.PolicyCategories>;
+
+    /** Collection of tags attached to a policy */
+    policyTags: OnyxEntry<OnyxTypes.PolicyTagLists>;
+};
+
+type IOURequestStepAttendeesProps = IOURequestStepAttendeesOnyxProps & WithWritableReportOrNotFoundProps<typeof SCREENS.MONEY_REQUEST.STEP_ATTENDEES>;
 
 function IOURequestStepAttendees({
     route: {
         params: {transactionID, reportID, iouType, backTo, action},
     },
+    report,
+    policy,
+    policyTags,
+    policyCategories,
 }: IOURequestStepAttendeesProps) {
     const currentUserPersonalDetails = useCurrentUserPersonalDetails();
     const isEditing = action === CONST.IOU.ACTION.EDIT;
     // eslint-disable-next-line rulesdir/no-default-id-values
     const [transaction] = useOnyx(`${isEditing ? ONYXKEYS.COLLECTION.TRANSACTION : ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${transactionID || CONST.DEFAULT_NUMBER_ID}`, {canBeMissing: true});
-    const [report] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${reportID}`, {canBeMissing: true});
-    const policyID = report?.policyID;
-    const [policy] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY}${policyID}`, {canBeMissing: true});
-    const [policyCategories] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY_CATEGORIES}${policyID}`, {canBeMissing: true});
-    const [policyTags] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY_TAGS}${policyID}`, {canBeMissing: true});
     const [attendees, setAttendees] = useState<Attendee[]>(() => getOriginalAttendees(transaction, currentUserPersonalDetails));
     const [parentReport] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${getNonEmptyStringOnyxID(report?.parentReportID)}`, {canBeMissing: true});
-    const [parentReportNextStep] = useOnyx(`${ONYXKEYS.COLLECTION.NEXT_STEP}${getNonEmptyStringOnyxID(report?.parentReportID)}`, {canBeMissing: true});
     const previousAttendees = usePrevious(attendees);
     const {translate} = useLocalize();
     const transactionViolations = useTransactionViolations(transactionID);
@@ -67,7 +78,6 @@ function IOURequestStepAttendees({
                     currentUserAccountIDParam,
                     currentUserEmailParam,
                     isASAPSubmitBetaEnabled,
-                    parentReportNextStep,
                 });
             }
         }
@@ -88,7 +98,6 @@ function IOURequestStepAttendees({
         currentUserAccountIDParam,
         currentUserEmailParam,
         isASAPSubmitBetaEnabled,
-        parentReportNextStep,
     ]);
 
     const navigateBack = () => {
diff --git a/src/pages/iou/request/step/IOURequestStepCategory.tsx b/src/pages/iou/request/step/IOURequestStepCategory.tsx
index f06ecdc65e1b..b6ec45def42b 100644
--- a/src/pages/iou/request/step/IOURequestStepCategory.tsx
+++ b/src/pages/iou/request/step/IOURequestStepCategory.tsx
@@ -72,7 +72,6 @@ function IOURequestStepCategory({
     const [policyTags] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY_TAGS}${policyID}`, {canBeMissing: true});
     const [policyRecentlyUsedCategories] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY_RECENTLY_USED_CATEGORIES}${policyID}`, {canBeMissing: true});
     const [parentReport] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${getNonEmptyStringOnyxID(report?.parentReportID)}`, {canBeMissing: true});
-    const [parentReportNextStep] = useOnyx(`${ONYXKEYS.COLLECTION.NEXT_STEP}${getNonEmptyStringOnyxID(report?.parentReportID)}`, {canBeMissing: true});
 
     const policyCategories = policyCategoriesReal ?? policyCategoriesDraft;
     const policyData = usePolicyData(policy?.id);
@@ -138,7 +137,6 @@ function IOURequestStepCategory({
                     transactionID: transaction.transactionID,
                     transactionThreadReport: report,
                     parentReport,
-                    parentReportNextStep,
                     category: updatedCategory,
                     policy,
                     policyTagList: policyTags,
diff --git a/src/pages/iou/request/step/IOURequestStepConfirmation.tsx b/src/pages/iou/request/step/IOURequestStepConfirmation.tsx
index 06e9ac71d688..fd8d5a1523d7 100644
--- a/src/pages/iou/request/step/IOURequestStepConfirmation.tsx
+++ b/src/pages/iou/request/step/IOURequestStepConfirmation.tsx
@@ -13,6 +13,7 @@ import MoneyRequestConfirmationList from '@components/MoneyRequestConfirmationLi
 import {usePersonalDetails, usePolicyCategories} from '@components/OnyxListItemProvider';
 import PrevNextButtons from '@components/PrevNextButtons';
 import ScreenWrapper from '@components/ScreenWrapper';
+import useArchivedReportsIdSet from '@hooks/useArchivedReportsIdSet';
 import useConfirmModal from '@hooks/useConfirmModal';
 import useCurrentUserPersonalDetails from '@hooks/useCurrentUserPersonalDetails';
 import useDeepCompareRef from '@hooks/useDeepCompareRef';
@@ -27,7 +28,6 @@ import useParentReportAction from '@hooks/useParentReportAction';
 import useParticipantsInvoiceReport from '@hooks/useParticipantsInvoiceReport';
 import usePermissions from '@hooks/usePermissions';
 import usePolicyForMovingExpenses from '@hooks/usePolicyForMovingExpenses';
-import usePrivateIsArchivedMap from '@hooks/usePrivateIsArchivedMap';
 import useTheme from '@hooks/useTheme';
 import useThemeStyles from '@hooks/useThemeStyles';
 import {completeTestDriveTask} from '@libs/actions/Task';
@@ -61,8 +61,8 @@ import {
 } from '@libs/ReportUtils';
 import {endSpan} from '@libs/telemetry/activeSpans';
 import {
-    getAttendees,
     getDefaultTaxCode,
+    getOriginalAttendees,
     getRateID,
     getRequestType,
     getValidWaypoints,
@@ -82,14 +82,16 @@ import {
     setMoneyRequestParticipantsFromReport,
     setMoneyRequestReceipt,
     setMoneyRequestReimbursable,
+    splitBill,
+    splitBillAndOpenReport,
     startMoneyRequest,
+    startSplitBill,
     submitPerDiemExpense as submitPerDiemExpenseIOUActions,
     trackExpense as trackExpenseIOUActions,
     updateLastLocationPermissionPrompt,
 } from '@userActions/IOU';
 import {getReceiverType, sendInvoice} from '@userActions/IOU/SendInvoice';
 import {sendMoneyElsewhere, sendMoneyWithWallet} from '@userActions/IOU/SendMoney';
-import {splitBill, splitBillAndOpenReport, startSplitBill} from '@userActions/IOU/Split';
 import {openDraftWorkspaceRequest} from '@userActions/Policy/Policy';
 import {removeDraftTransaction, removeDraftTransactions, replaceDefaultDraftTransaction} from '@userActions/TransactionEdit';
 import CONST from '@src/CONST';
@@ -257,7 +259,7 @@ function IOURequestStepConfirmation({
         isOnboardingTaskParentReportArchived: isViewTourTaskParentReportArchived,
         hasOutstandingChildTask,
     } = useOnboardingTaskInformation(CONST.ONBOARDING_TASK_TYPE.VIEW_TOUR);
-    const privateIsArchivedMap = usePrivateIsArchivedMap();
+    const archivedReportsIdSet = useArchivedReportsIdSet();
     const parentReportAction = useParentReportAction(viewTourTaskReport);
 
     const receiptFilename = transaction?.receipt?.filename;
@@ -302,12 +304,9 @@ function IOURequestStepConfirmation({
                 if (participant.isSender && iouType === CONST.IOU.TYPE.INVOICE) {
                     return participant;
                 }
-                const privateIsArchived = privateIsArchivedMap[`${ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS}${participant.reportID}`];
-                return participant.accountID
-                    ? getParticipantsOption(participant, personalDetails)
-                    : getReportOption(participant, privateIsArchived, policy, reportAttributesDerived, reportDrafts);
+                return participant.accountID ? getParticipantsOption(participant, personalDetails) : getReportOption(participant, reportAttributesDerived, reportDrafts);
             }) ?? [],
-        [transaction?.participants, iouType, personalDetails, reportAttributesDerived, reportDrafts, privateIsArchivedMap, policy],
+        [transaction?.participants, iouType, personalDetails, reportAttributesDerived, reportDrafts],
     );
     const isPolicyExpenseChat = useMemo(() => participants?.some((participant) => participant.isPolicyExpenseChat), [participants]);
     const shouldGenerateTransactionThreadReport = !isBetaEnabled(CONST.BETAS.NO_OPTIMISTIC_TRANSACTION_THREADS);
@@ -410,7 +409,7 @@ function IOURequestStepConfirmation({
             if (!isDistanceRequest || !!item?.category) {
                 continue;
             }
-            setMoneyRequestCategory(item.transactionID, defaultCategory, policy, isMovingTransactionFromTrackExpense);
+            setMoneyRequestCategory(item.transactionID, defaultCategory, policy);
         }
         // Prevent resetting to default when unselect category
         // eslint-disable-next-line react-hooks/exhaustive-deps
@@ -435,6 +434,9 @@ function IOURequestStepConfirmation({
             Navigation.goBack(ROUTES.MONEY_REQUEST_STEP_SUBRATE.getRoute(action, iouType, initialTransactionID, reportID));
             return;
         }
+        if (isTimeRequest) {
+            return Navigation.goBack(ROUTES.MONEY_REQUEST_CREATE_TAB_TIME.getRoute(action, iouType, initialTransactionID, reportID));
+        }
 
         if (transaction?.isFromGlobalCreate && !transaction.receipt?.isTestReceipt) {
             // If the participants weren't automatically added to the transaction, then we should go back to the IOURequestStepParticipants.
@@ -476,6 +478,7 @@ function IOURequestStepConfirmation({
         isMovingTransactionFromTrackExpense,
         participantsAutoAssignedFromRoute,
         backTo,
+        isTimeRequest,
     ]);
 
     // When the component mounts, if there is a receipt, see if the image can be read from the disk. If not, redirect the user to the starting step of the flow.
@@ -560,7 +563,7 @@ function IOURequestStepConfirmation({
                 const isTestReceipt = receipt?.isTestReceipt ?? false;
                 const isTestDriveReceipt = receipt?.isTestDriveReceipt ?? false;
                 const isLinkedTrackedExpenseReportArchived =
-                    !!item.linkedTrackedExpenseReportID && !!privateIsArchivedMap[`${ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS}${item.linkedTrackedExpenseReportID}`];
+                    !!item.linkedTrackedExpenseReportID && archivedReportsIdSet.has(`${ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS}${item.linkedTrackedExpenseReportID}`);
 
                 if (isTestDriveReceipt) {
                     completeTestDriveTask(
@@ -596,7 +599,7 @@ function IOURequestStepConfirmation({
                     action,
                     transactionParams: {
                         amount: isTestReceipt ? CONST.TEST_RECEIPT.AMOUNT : item.amount,
-                        distance: isManualDistanceRequest && typeof item.comment?.customUnit?.quantity === 'number' ? roundToTwoDecimalPlaces(item.comment.customUnit.quantity) : undefined,
+                        distance: isManualDistanceRequest && item.comment?.customUnit?.quantity ? roundToTwoDecimalPlaces(item.comment.customUnit.quantity) : undefined,
                         attendees: item.comment?.attendees,
                         currency: isTestReceipt ? CONST.TEST_RECEIPT.CURRENCY : item.currency,
                         created: item.created,
@@ -638,7 +641,7 @@ function IOURequestStepConfirmation({
         [
             transactions,
             receiptFiles,
-            privateIsArchivedMap,
+            archivedReportsIdSet,
             report,
             currentUserPersonalDetails.login,
             currentUserPersonalDetails.accountID,
@@ -742,7 +745,7 @@ function IOURequestStepConfirmation({
             }
             for (const [index, item] of transactions.entries()) {
                 const isLinkedTrackedExpenseReportArchived =
-                    !!item.linkedTrackedExpenseReportID && !!privateIsArchivedMap[`${ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS}${item.linkedTrackedExpenseReportID}`];
+                    !!item.linkedTrackedExpenseReportID && archivedReportsIdSet.has(`${ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS}${item.linkedTrackedExpenseReportID}`);
                 const itemDistance = isManualDistanceRequest || isOdometerDistanceRequest ? (item.comment?.customUnit?.quantity ?? undefined) : undefined;
 
                 trackExpenseIOUActions({
@@ -813,7 +816,7 @@ function IOURequestStepConfirmation({
             isDraftPolicy,
             isManualDistanceRequest,
             isOdometerDistanceRequest,
-            privateIsArchivedMap,
+            archivedReportsIdSet,
             isASAPSubmitBetaEnabled,
             introSelected,
             activePolicyID,
@@ -1333,7 +1336,8 @@ function IOURequestStepConfirmation({
 
     const showReceiptEmptyState = shouldShowReceiptEmptyState(iouType, action, policy, isPerDiemRequest);
 
-    const shouldShowSmartScanFields = !!transaction?.receipt?.isTestDriveReceipt || isMovingTransactionFromTrackExpense || requestType !== CONST.IOU.REQUEST_TYPE.SCAN;
+    const shouldShowSmartScanFields =
+        !!transaction?.receipt?.isTestDriveReceipt || (isMovingTransactionFromTrackExpense ? transaction?.amount !== 0 : requestType !== CONST.IOU.REQUEST_TYPE.SCAN);
     return (
         <ScreenWrapper
             shouldEnableMaxHeight={canUseTouchScreen()}
@@ -1392,7 +1396,7 @@ function IOURequestStepConfirmation({
                         transaction={transaction}
                         selectedParticipants={participants}
                         iouAmount={transaction?.amount ?? 0}
-                        iouAttendees={getAttendees(transaction, currentUserPersonalDetails)}
+                        iouAttendees={getOriginalAttendees(transaction, currentUserPersonalDetails)}
                         iouComment={transaction?.comment?.comment ?? ''}
                         iouCurrencyCode={transaction?.currency}
                         iouIsBillable={transaction?.billable}
@@ -1425,8 +1429,6 @@ function IOURequestStepConfirmation({
                         expensesNumber={transactions.length}
                         isReceiptEditable
                         isTimeRequest={isTimeRequest}
-                        iouTimeCount={transaction?.comment?.units?.count}
-                        iouTimeRate={transaction?.comment?.units?.rate}
                     />
                 </View>
             </DragAndDropProvider>
diff --git a/src/pages/iou/request/step/IOURequestStepDate.tsx b/src/pages/iou/request/step/IOURequestStepDate.tsx
index 23c11f3176bc..5adc82529181 100644
--- a/src/pages/iou/request/step/IOURequestStepDate.tsx
+++ b/src/pages/iou/request/step/IOURequestStepDate.tsx
@@ -51,7 +51,6 @@ function IOURequestStepDate({
     const [policyCategories] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY_CATEGORIES}${report?.policyID}`, {canBeMissing: false});
     const [policyTags] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY_TAGS}${report?.policyID}`, {canBeMissing: false});
     const [parentReport] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${getNonEmptyStringOnyxID(report?.parentReportID)}`, {canBeMissing: true});
-    const [parentReportNextStep] = useOnyx(`${ONYXKEYS.COLLECTION.NEXT_STEP}${getNonEmptyStringOnyxID(report?.parentReportID)}`, {canBeMissing: true});
 
     const [splitDraftTransaction] = useOnyx(`${ONYXKEYS.COLLECTION.SPLIT_TRANSACTION_DRAFT}${transactionID}`, {canBeMissing: true});
     const currentUserPersonalDetails = useCurrentUserPersonalDetails();
@@ -106,7 +105,6 @@ function IOURequestStepDate({
                 currentUserAccountIDParam: currentUserPersonalDetails.accountID,
                 currentUserEmailParam: currentUserPersonalDetails.login ?? '',
                 isASAPSubmitBetaEnabled,
-                parentReportNextStep,
             });
         }
 
diff --git a/src/pages/iou/request/step/IOURequestStepDescription.tsx b/src/pages/iou/request/step/IOURequestStepDescription.tsx
index efaecde259e7..98b6dfad1a5a 100644
--- a/src/pages/iou/request/step/IOURequestStepDescription.tsx
+++ b/src/pages/iou/request/step/IOURequestStepDescription.tsx
@@ -22,6 +22,7 @@ import getNonEmptyStringOnyxID from '@libs/getNonEmptyStringOnyxID';
 import {shouldUseTransactionDraft} from '@libs/IOUUtils';
 import Navigation from '@libs/Navigation/Navigation';
 import Parser from '@libs/Parser';
+import {getPersonalPolicy} from '@libs/PolicyUtils';
 import variables from '@styles/variables';
 import {setDraftSplitTransaction, setMoneyRequestDescription, updateMoneyRequestDescription} from '@userActions/IOU';
 import CONST from '@src/CONST';
@@ -51,12 +52,9 @@ function IOURequestStepDescription({
     const [splitDraftTransaction] = useOnyx(`${ONYXKEYS.COLLECTION.SPLIT_TRANSACTION_DRAFT}${transactionID}`, {canBeMissing: true});
     const [policyCategories] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY_CATEGORIES}${report?.policyID}`, {canBeMissing: true});
     const [parentReport] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${getNonEmptyStringOnyxID(report?.parentReportID)}`, {canBeMissing: true});
-    const [parentReportNextStep] = useOnyx(`${ONYXKEYS.COLLECTION.NEXT_STEP}${getNonEmptyStringOnyxID(report?.parentReportID)}`, {canBeMissing: true});
 
     const [policyTags] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY_TAGS}${report?.policyID}`, {canBeMissing: true});
 
-    const [personalPolicyID] = useOnyx(ONYXKEYS.PERSONAL_POLICY_ID, {canBeMissing: true});
-
     const styles = useThemeStyles();
     const {translate} = useLocalize();
     const {inputCallbackRef, inputRef} = useAutoFocusInput(true);
@@ -155,19 +153,18 @@ function IOURequestStepDescription({
         setMoneyRequestDescription(transaction?.transactionID, newComment, isTransactionDraft);
 
         if (action === CONST.IOU.ACTION.EDIT) {
-            updateMoneyRequestDescription({
-                transactionID: transaction?.transactionID,
-                transactionThreadReport: report,
+            updateMoneyRequestDescription(
+                transaction?.transactionID,
+                report,
                 parentReport,
-                comment: newComment,
+                newComment,
                 policy,
-                policyTagList: policyTags,
+                policyTags,
                 policyCategories,
                 currentUserAccountIDParam,
                 currentUserEmailParam,
                 isASAPSubmitBetaEnabled,
-                parentReportNextStep,
-            });
+            );
         }
 
         setIsSaved(true);
@@ -177,7 +174,8 @@ function IOURequestStepDescription({
     // eslint-disable-next-line rulesdir/no-negated-variables
     const shouldShowNotFoundPage = useShowNotFoundPageInIOUStep(action, iouType, reportActionID, report, transaction);
 
-    const isReportInGroupPolicy = !!report?.policyID && report.policyID !== CONST.POLICY.ID_FAKE && personalPolicyID !== report.policyID;
+    // eslint-disable-next-line @typescript-eslint/no-deprecated
+    const isReportInGroupPolicy = !!report?.policyID && report.policyID !== CONST.POLICY.ID_FAKE && getPersonalPolicy()?.id !== report.policyID;
     const getDescriptionHint = () => {
         return transaction?.category && policyCategories ? (policyCategories[transaction?.category]?.commentHint ?? '') : '';
     };
diff --git a/src/pages/iou/request/step/IOURequestStepDestination.tsx b/src/pages/iou/request/step/IOURequestStepDestination.tsx
index bd759ce66449..859c535ef14d 100644
--- a/src/pages/iou/request/step/IOURequestStepDestination.tsx
+++ b/src/pages/iou/request/step/IOURequestStepDestination.tsx
@@ -1,5 +1,4 @@
-import React, {useEffect, useImperativeHandle, useRef} from 'react';
-import type {ForwardedRef} from 'react';
+import React, {useEffect} from 'react';
 import {InteractionManager, View} from 'react-native';
 import ActivityIndicator from '@components/ActivityIndicator';
 import FullPageOfflineBlockingView from '@components/BlockingViews/FullPageOfflineBlockingView';
@@ -7,7 +6,7 @@ import Button from '@components/Button';
 import DestinationPicker from '@components/DestinationPicker';
 import FixedFooter from '@components/FixedFooter';
 import ScreenWrapper from '@components/ScreenWrapper';
-import type {ListItem, SelectionListHandle} from '@components/SelectionListWithSections/types';
+import type {ListItem} from '@components/SelectionListWithSections/types';
 import WorkspaceEmptyStateSection from '@components/WorkspaceEmptyStateSection';
 import useCurrentUserPersonalDetails from '@hooks/useCurrentUserPersonalDetails';
 import {useMemoizedLazyIllustrations} from '@hooks/useLazyAsset';
@@ -44,16 +43,10 @@ import withFullTransactionOrNotFound from './withFullTransactionOrNotFound';
 import type {WithWritableReportOrNotFoundProps} from './withWritableReportOrNotFound';
 import withWritableReportOrNotFound from './withWritableReportOrNotFound';
 
-type IOURequestStepDestinationRef = {
-    focus?: () => void;
-};
-
 type IOURequestStepDestinationProps = WithWritableReportOrNotFoundProps<typeof SCREENS.MONEY_REQUEST.STEP_DESTINATION | typeof SCREENS.MONEY_REQUEST.CREATE> &
     WithFullTransactionOrNotFoundProps<typeof SCREENS.MONEY_REQUEST.STEP_DESTINATION | typeof SCREENS.MONEY_REQUEST.CREATE> & {
         openedFromStartPage?: boolean;
         explicitPolicyID?: string;
-        shouldAutoFocusInput?: boolean;
-        ref: ForwardedRef<IOURequestStepDestinationRef>;
     };
 
 function IOURequestStepDestination({
@@ -64,8 +57,6 @@ function IOURequestStepDestination({
     transaction,
     openedFromStartPage = false,
     explicitPolicyID,
-    shouldAutoFocusInput = true,
-    ref,
 }: IOURequestStepDestinationProps) {
     const [policy, policyMetadata] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY}${explicitPolicyID ?? getIOURequestPolicyID(transaction, report)}`, {canBeMissing: false});
     const personalPolicy = usePersonalPolicy();
@@ -79,12 +70,6 @@ function IOURequestStepDestination({
     const illustrations = useMemoizedLazyIllustrations(['EmptyStateExpenses']);
     const {translate} = useLocalize();
 
-    const destinationSelectionListRef = useRef<SelectionListHandle | null>(null);
-
-    useImperativeHandle(ref, () => ({
-        focus: destinationSelectionListRef.current?.focusTextInput,
-    }));
-
     // eslint-disable-next-line rulesdir/no-negated-variables
     const shouldShowNotFoundPage = isEmptyObject(policy);
 
@@ -211,8 +196,6 @@ function IOURequestStepDestination({
                 )}
                 {!shouldShowEmptyState && !isLoading && !shouldShowOfflineView && !!policy?.id && (
                     <DestinationPicker
-                        textInputAutoFocus={shouldAutoFocusInput}
-                        ref={destinationSelectionListRef}
                         selectedDestination={selectedDestination}
                         policyID={policy.id}
                         onSubmit={updateDestination}
diff --git a/src/pages/iou/request/step/IOURequestStepDistance.tsx b/src/pages/iou/request/step/IOURequestStepDistance.tsx
index 93c5d2b9f55d..463e6ecb3026 100644
--- a/src/pages/iou/request/step/IOURequestStepDistance.tsx
+++ b/src/pages/iou/request/step/IOURequestStepDistance.tsx
@@ -25,21 +25,35 @@ import usePolicy from '@hooks/usePolicy';
 import usePrevious from '@hooks/usePrevious';
 import useShowNotFoundPageInIOUStep from '@hooks/useShowNotFoundPageInIOUStep';
 import useThemeStyles from '@hooks/useThemeStyles';
-import {getIOURequestPolicyID, setMoneyRequestAmount, setSplitShares, updateMoneyRequestDistance} from '@libs/actions/IOU';
-import {handleMoneyRequestStepDistanceNavigation} from '@libs/actions/IOU/MoneyRequest';
+import {
+    createDistanceRequest,
+    getIOURequestPolicyID,
+    getMoneyRequestParticipantsFromReport,
+    resetSplitShares,
+    setCustomUnitRateID,
+    setMoneyRequestAmount,
+    setMoneyRequestMerchant,
+    setMoneyRequestParticipantsFromReport,
+    setMoneyRequestPendingFields,
+    setSplitShares,
+    trackExpense,
+    updateMoneyRequestDistance,
+} from '@libs/actions/IOU';
 import {init, stop} from '@libs/actions/MapboxToken';
 import {openReport} from '@libs/actions/Report';
-import {openDraftDistanceExpense, removeWaypoint, updateWaypoints as updateWaypointsUtil} from '@libs/actions/Transaction';
+import {openDraftDistanceExpense, removeWaypoint, setTransactionReport, updateWaypoints as updateWaypointsUtil} from '@libs/actions/Transaction';
 import {createBackupTransaction, removeBackupTransaction, restoreOriginalTransactionFromBackup} from '@libs/actions/TransactionEdit';
 import DistanceRequestUtils from '@libs/DistanceRequestUtils';
 import type {MileageRate} from '@libs/DistanceRequestUtils';
 import {getLatestErrorField} from '@libs/ErrorUtils';
 import getNonEmptyStringOnyxID from '@libs/getNonEmptyStringOnyxID';
-import {shouldUseTransactionDraft} from '@libs/IOUUtils';
+import {navigateToParticipantPage, shouldUseTransactionDraft} from '@libs/IOUUtils';
 import Navigation from '@libs/Navigation/Navigation';
-import {getPolicy} from '@libs/PolicyUtils';
-import {isArchivedReport, isPolicyExpenseChat as isPolicyExpenseChatUtil} from '@libs/ReportUtils';
-import {getDistanceInMeters, getRateID, getRequestType, hasRoute, isCustomUnitRateIDForP2P, isWaypointNullIsland} from '@libs/TransactionUtils';
+import {getParticipantsOption, getReportOption} from '@libs/OptionsListUtils';
+import {getPolicy, isPaidGroupPolicy} from '@libs/PolicyUtils';
+import {getPolicyExpenseChat, isArchivedReport, isPolicyExpenseChat as isPolicyExpenseChatUtil} from '@libs/ReportUtils';
+import {shouldRestrictUserBillableActions} from '@libs/SubscriptionUtils';
+import {getDistanceInMeters, getRateID, getRequestType, getValidWaypoints, hasRoute, isCustomUnitRateIDForP2P} from '@libs/TransactionUtils';
 import CONST from '@src/CONST';
 import ONYXKEYS from '@src/ONYXKEYS';
 import ROUTES from '@src/ROUTES';
@@ -73,14 +87,10 @@ function IOURequestStepDistance({
     const {isBetaEnabled} = usePermissions();
     const [allReports] = useOnyx(ONYXKEYS.COLLECTION.REPORT, {canBeMissing: false});
     const [reportNameValuePairs] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS}${report?.reportID}`, {canBeMissing: true});
-    const isArchived = isArchivedReport(reportNameValuePairs);
     const [parentReport] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${getNonEmptyStringOnyxID(report?.parentReportID)}`, {canBeMissing: true});
-    const [parentReportNextStep] = useOnyx(`${ONYXKEYS.COLLECTION.NEXT_STEP}${getNonEmptyStringOnyxID(report?.parentReportID)}`, {canBeMissing: true});
 
     const [transactionBackup] = useOnyx(`${ONYXKEYS.COLLECTION.TRANSACTION_BACKUP}${transactionID}`, {canBeMissing: true});
     const policy = usePolicy(report?.policyID);
-    const [policyCategories] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY_CATEGORIES}${policy?.id}`, {canBeMissing: true});
-    const [policyTags] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY_TAGS}${policy?.id}`, {canBeMissing: true});
     const personalPolicy = usePersonalPolicy();
     const [personalDetails] = useOnyx(ONYXKEYS.PERSONAL_DETAILS_LIST, {canBeMissing: false});
     const defaultExpensePolicy = useDefaultExpensePolicy();
@@ -133,7 +143,6 @@ function IOURequestStepDistance({
     const nonEmptyWaypointsCount = useMemo(() => Object.keys(waypoints).filter((key) => !isWaypointEmpty(waypoints[key])).length, [waypoints]);
     const currentUserAccountIDParam = currentUserPersonalDetails.accountID;
     const currentUserEmailParam = currentUserPersonalDetails.login ?? '';
-    const isWaypointsNullIslandError = useMemo(() => Object.values(waypoints).some(isWaypointNullIsland), [waypoints]);
     const duplicateWaypointsError = useMemo(
         () => nonEmptyWaypointsCount >= 2 && Object.keys(validatedWaypoints).length !== nonEmptyWaypointsCount,
         [nonEmptyWaypointsCount, validatedWaypoints],
@@ -193,8 +202,12 @@ function IOURequestStepDistance({
             return false;
         }
 
-        return iouType !== CONST.IOU.TYPE.SPLIT && !isArchived && !(isPolicyExpenseChatUtil(report) && ((policy?.requiresCategory ?? false) || (policy?.requiresTag ?? false)));
-    }, [report, skipConfirmation, policy?.requiresCategory, policy?.requiresTag, isArchived, iouType]);
+        return (
+            iouType !== CONST.IOU.TYPE.SPLIT &&
+            !isArchivedReport(reportNameValuePairs) &&
+            !(isPolicyExpenseChatUtil(report) && ((policy?.requiresCategory ?? false) || (policy?.requiresTag ?? false)))
+        );
+    }, [report, skipConfirmation, policy?.requiresCategory, policy?.requiresTag, reportNameValuePairs, iouType]);
     let buttonText = !isCreatingNewRequest ? translate('common.save') : translate('common.next');
     if (shouldSkipConfirmation) {
         if (iouType === CONST.IOU.TYPE.SPLIT) {
@@ -280,44 +293,155 @@ function IOURequestStepDistance({
         [action, transactionID, report?.reportID, reportID],
     );
 
+    const navigateToConfirmationPage = useCallback(() => {
+        switch (iouType) {
+            case CONST.IOU.TYPE.REQUEST:
+                Navigation.navigate(ROUTES.MONEY_REQUEST_STEP_CONFIRMATION.getRoute(CONST.IOU.ACTION.CREATE, CONST.IOU.TYPE.SUBMIT, transactionID, reportID, backToReport));
+                break;
+            case CONST.IOU.TYPE.SEND:
+                Navigation.navigate(ROUTES.MONEY_REQUEST_STEP_CONFIRMATION.getRoute(CONST.IOU.ACTION.CREATE, CONST.IOU.TYPE.PAY, transactionID, reportID));
+                break;
+            default:
+                Navigation.navigate(ROUTES.MONEY_REQUEST_STEP_CONFIRMATION.getRoute(CONST.IOU.ACTION.CREATE, iouType, transactionID, reportID, backToReport));
+        }
+    }, [backToReport, iouType, reportID, transactionID]);
+
     const navigateToNextStep = useCallback(() => {
-        handleMoneyRequestStepDistanceNavigation({
-            iouType,
-            report,
-            policy,
-            transaction,
-            reportID,
-            transactionID,
-            reportAttributesDerived,
-            personalDetails,
-            waypoints,
-            customUnitRateID,
-            currentUserLogin: currentUserEmailParam,
-            currentUserAccountID: currentUserAccountIDParam,
-            backTo,
-            backToReport,
-            shouldSkipConfirmation,
-            defaultExpensePolicy,
-            isArchivedExpenseReport: isArchived,
-            isAutoReporting: !!personalPolicy?.autoReporting,
-            isASAPSubmitBetaEnabled,
-            transactionViolations,
-            lastSelectedDistanceRates,
-            setDistanceRequestData,
-            translate,
-            quickAction,
-            policyRecentlyUsedCurrencies,
-            introSelected,
-            activePolicyID,
-            privateIsArchived: reportNameValuePairs?.private_isArchived,
-        });
+        if (transaction?.splitShares) {
+            resetSplitShares(transaction);
+        }
+        if (backTo) {
+            Navigation.goBack(backTo);
+            return;
+        }
+
+        // If a reportID exists in the report object, it's because either:
+        // - The user started this flow from using the + button in the composer inside a report.
+        // - The user started this flow from using the global create menu by selecting the Track expense option.
+        // In this case, the participants can be automatically assigned from the report and the user can skip the participants step and go straight
+        // to the confirm step.
+        // If the user started this flow using the Create expense option (combined submit/track flow), they should be redirected to the participants page.
+        if (report?.reportID && !isArchivedReport(reportNameValuePairs) && iouType !== CONST.IOU.TYPE.CREATE) {
+            const selectedParticipants = getMoneyRequestParticipantsFromReport(report, currentUserPersonalDetails.accountID);
+            const participants = selectedParticipants.map((participant) => {
+                const participantAccountID = participant?.accountID ?? CONST.DEFAULT_NUMBER_ID;
+                return participantAccountID ? getParticipantsOption(participant, personalDetails) : getReportOption(participant, reportAttributesDerived);
+            });
+            setDistanceRequestData(participants);
+            if (shouldSkipConfirmation) {
+                setMoneyRequestPendingFields(transactionID, {waypoints: CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD});
+                setMoneyRequestMerchant(transactionID, translate('iou.fieldPending'), false);
+                const participant = participants.at(0);
+                if (iouType === CONST.IOU.TYPE.TRACK && participant) {
+                    trackExpense({
+                        report,
+                        isDraftPolicy: false,
+                        participantParams: {
+                            payeeEmail: currentUserEmailParam,
+                            payeeAccountID: currentUserAccountIDParam,
+                            participant,
+                        },
+                        policyParams: {
+                            policy,
+                        },
+                        transactionParams: {
+                            amount: 0,
+                            currency: transaction?.currency ?? 'USD',
+                            created: transaction?.created ?? '',
+                            merchant: translate('iou.fieldPending'),
+                            receipt: {},
+                            billable: false,
+                            reimbursable: true,
+                            validWaypoints: getValidWaypoints(waypoints, true),
+                            customUnitRateID,
+                            attendees: transaction?.comment?.attendees,
+                        },
+                        isASAPSubmitBetaEnabled,
+                        currentUserAccountIDParam,
+                        currentUserEmailParam,
+                        introSelected,
+                        activePolicyID,
+                        quickAction,
+                    });
+                    return;
+                }
+
+                const isPolicyExpenseChat = !!participant?.isPolicyExpenseChat;
+
+                createDistanceRequest({
+                    report,
+                    participants,
+                    currentUserLogin: currentUserEmailParam,
+                    currentUserAccountID: currentUserAccountIDParam,
+                    iouType,
+                    existingTransaction: transaction,
+                    transactionParams: {
+                        amount: 0,
+                        comment: '',
+                        created: transaction?.created ?? '',
+                        currency: transaction?.currency ?? 'USD',
+                        merchant: translate('iou.fieldPending'),
+                        billable: !!policy?.defaultBillable,
+                        reimbursable: !!policy?.defaultReimbursable,
+                        validWaypoints: getValidWaypoints(waypoints, true),
+                        customUnitRateID: DistanceRequestUtils.getCustomUnitRateID({reportID: report.reportID, isPolicyExpenseChat, policy, lastSelectedDistanceRates}),
+                        splitShares: transaction?.splitShares,
+                        attendees: transaction?.comment?.attendees,
+                    },
+                    backToReport,
+                    isASAPSubmitBetaEnabled,
+                    transactionViolations,
+                    quickAction,
+                    policyRecentlyUsedCurrencies: policyRecentlyUsedCurrencies ?? [],
+                });
+                return;
+            }
+            setMoneyRequestParticipantsFromReport(transactionID, report, currentUserPersonalDetails.accountID).then(() => {
+                navigateToConfirmationPage();
+            });
+            return;
+        }
+
+        // If there was no reportID, then that means the user started this flow from the global menu
+        // and an optimistic reportID was generated. In that case, the next step is to select the participants for this expense.
+        if (
+            iouType === CONST.IOU.TYPE.CREATE &&
+            isPaidGroupPolicy(defaultExpensePolicy) &&
+            defaultExpensePolicy?.isPolicyExpenseChatEnabled &&
+            !shouldRestrictUserBillableActions(defaultExpensePolicy.id)
+        ) {
+            const activePolicyExpenseChat = getPolicyExpenseChat(currentUserAccountIDParam, defaultExpensePolicy?.id);
+            const shouldAutoReport = !!defaultExpensePolicy?.autoReporting || !!personalPolicy?.autoReporting;
+            const transactionReportID = shouldAutoReport ? activePolicyExpenseChat?.reportID : CONST.REPORT.UNREPORTED_REPORT_ID;
+            const rateID = DistanceRequestUtils.getCustomUnitRateID({
+                reportID: transactionReportID,
+                isPolicyExpenseChat: true,
+                policy: defaultExpensePolicy,
+                lastSelectedDistanceRates,
+            });
+            setTransactionReport(transactionID, {reportID: transactionReportID}, true);
+            setCustomUnitRateID(transactionID, rateID);
+            setMoneyRequestParticipantsFromReport(transactionID, activePolicyExpenseChat, currentUserPersonalDetails.accountID).then(() => {
+                Navigation.navigate(
+                    ROUTES.MONEY_REQUEST_STEP_CONFIRMATION.getRoute(
+                        CONST.IOU.ACTION.CREATE,
+                        iouType === CONST.IOU.TYPE.CREATE ? CONST.IOU.TYPE.SUBMIT : iouType,
+                        transactionID,
+                        activePolicyExpenseChat?.reportID,
+                    ),
+                );
+            });
+        } else {
+            navigateToParticipantPage(iouType, transactionID, reportID);
+        }
     }, [
         transaction,
         backTo,
         report,
-        isArchived,
+        reportNameValuePairs,
         iouType,
         defaultExpensePolicy,
+        currentUserPersonalDetails.accountID,
         setDistanceRequestData,
         shouldSkipConfirmation,
         transactionID,
@@ -337,6 +461,7 @@ function IOURequestStepDistance({
         customUnitRateID,
         introSelected,
         activePolicyID,
+        navigateToConfirmationPage,
         personalPolicy?.autoReporting,
         reportID,
     ]);
@@ -346,9 +471,6 @@ function IOURequestStepDistance({
         if (hasRouteError) {
             return getLatestErrorField(transaction, 'route');
         }
-        if (isWaypointsNullIslandError) {
-            return {isWaypointsNullIslandError: `${translate('common.please')} ${translate('common.fixTheErrors')} ${translate('common.inTheFormBeforeContinuing')}.`} as Errors;
-        }
         if (duplicateWaypointsError) {
             return {duplicateWaypointsError: translate('iou.error.duplicateWaypointsErrorMessage')} as Errors;
         }
@@ -417,13 +539,10 @@ function IOURequestStepDistance({
                     waypoints,
                     ...(hasRouteChanged ? {routes: transaction?.routes} : {}),
                     policy,
-                    policyTagList: policyTags,
-                    policyCategories,
                     transactionBackup,
                     currentUserAccountIDParam,
                     currentUserEmailParam,
                     isASAPSubmitBetaEnabled,
-                    parentReportNextStep,
                 });
             }
             transactionWasSaved.current = true;
@@ -449,8 +568,6 @@ function IOURequestStepDistance({
         navigateBack,
         parentReport,
         policy,
-        policyTags,
-        policyCategories,
         currentUserAccountIDParam,
         currentUserEmailParam,
         isASAPSubmitBetaEnabled,
diff --git a/src/pages/iou/request/step/IOURequestStepDistanceGPS/DistanceCounter/index.tsx b/src/pages/iou/request/step/IOURequestStepDistanceGPS/DistanceCounter/index.tsx
index c14bdcc5d8d3..49461172adf3 100644
--- a/src/pages/iou/request/step/IOURequestStepDistanceGPS/DistanceCounter/index.tsx
+++ b/src/pages/iou/request/step/IOURequestStepDistanceGPS/DistanceCounter/index.tsx
@@ -29,8 +29,8 @@ function DistanceCounter({report, transaction}: DistanceCounterProps) {
 
     return (
         <View style={[styles.flex1, styles.pb40]}>
-            <View style={[styles.justifyContentCenter, styles.h100, styles.w100]}>
-                <View style={[styles.pRelative, styles.w100, styles.alignItemsCenter]}>
+            <View style={[styles.justifyContentCenter, styles.h100, styles.alignSelfCenter]}>
+                <View style={(styles.pRelative, styles.w100)}>
                     <TripStatusIndicator />
 
                     <Text style={[styles.iouAmountTextInput, styles.colorMuted]}>
diff --git a/src/pages/iou/request/step/IOURequestStepDistanceGPS/GPSButtons/index.tsx b/src/pages/iou/request/step/IOURequestStepDistanceGPS/GPSButtons/index.tsx
index c893b1e45d10..efabc682052e 100644
--- a/src/pages/iou/request/step/IOURequestStepDistanceGPS/GPSButtons/index.tsx
+++ b/src/pages/iou/request/step/IOURequestStepDistanceGPS/GPSButtons/index.tsx
@@ -1,4 +1,3 @@
-import {hasServicesEnabledAsync, startLocationUpdatesAsync, stopLocationUpdatesAsync} from 'expo-location';
 import React, {useState} from 'react';
 import {Linking, View} from 'react-native';
 import Button from '@components/Button';
@@ -8,28 +7,24 @@ import {useMemoizedLazyAsset} from '@hooks/useLazyAsset';
 import useLocalize from '@hooks/useLocalize';
 import useOnyx from '@hooks/useOnyx';
 import useThemeStyles from '@hooks/useThemeStyles';
-import {initGpsDraft, resetGPSDraftDetails, setEndAddress, setIsTracking} from '@libs/actions/GPSDraftDetails';
+import {addGpsPoints, initGpsDraft, resetGPSDraftDetails, setEndAddress, setIsTracking, setStartAddress} from '@libs/actions/GPSDraftDetails';
 import BackgroundLocationPermissionsFlow from '@pages/iou/request/step/IOURequestStepDistanceGPS/BackgroundLocationPermissionsFlow';
-import {BACKGROUND_LOCATION_TRACKING_TASK_NAME, getBackgroundLocationTaskOptions} from '@pages/iou/request/step/IOURequestStepDistanceGPS/const';
-import addressFromGpsPoint from '@pages/iou/request/step/IOURequestStepDistanceGPS/utils/addressFromGpsPoint';
-import coordinatesToString from '@pages/iou/request/step/IOURequestStepDistanceGPS/utils/coordinatesToString';
 import ONYXKEYS from '@src/ONYXKEYS';
-import openSettings from './openSettings';
 
 type ButtonsProps = {
     navigateToNextStep: () => void;
     setShouldShowStartError: React.Dispatch<React.SetStateAction<boolean>>;
     setShouldShowPermissionsError: React.Dispatch<React.SetStateAction<boolean>>;
-    reportID: string;
 };
 
-function GPSButtons({navigateToNextStep, setShouldShowStartError, setShouldShowPermissionsError, reportID}: ButtonsProps) {
+// next line will be removed in a follow-up PR where the currently unused props will be used
+// eslint-disable-next-line @typescript-eslint/no-unused-vars
+function GPSButtons({navigateToNextStep, setShouldShowStartError, setShouldShowPermissionsError}: ButtonsProps) {
     const [startPermissionsFlow, setStartPermissionsFlow] = useState(false);
-    const [showLocationRequiredModal, setShowLocationRequiredModal] = useState(false);
     const [showDiscardConfirmation, setShowDiscardConfirmation] = useState(false);
     const [showStopConfirmation, setShowStopConfirmation] = useState(false);
     const [showZeroDistanceModal, setShowZeroDistanceModal] = useState(false);
-    const [showDisabledServicesModal, setShowDisabledServicesModal] = useState(false);
+    const [showLocationRequiredModal, setShowLocationRequiredModal] = useState(false);
 
     const {asset: ReceiptLocationMarker} = useMemoizedLazyAsset(() => loadIllustration('ReceiptLocationMarker'));
     const [gpsDraftDetails] = useOnyx(ONYXKEYS.GPS_DRAFT_DETAILS, {canBeMissing: true});
@@ -38,54 +33,24 @@ function GPSButtons({navigateToNextStep, setShouldShowStartError, setShouldShowP
 
     const isTripCaptured = !gpsDraftDetails?.isTracking && (gpsDraftDetails?.gpsPoints?.length ?? 0) > 0;
 
-    const checkSettingsAndPermissions = async () => {
-        setShouldShowStartError(false);
-
-        const hasLocationServicesEnabled = await hasServicesEnabledAsync();
+    /**
+     * todo: startGpsTrip, onNext, checkPermissions and stopGpsTrip are implemented like this to show
+     * all UI components to test as of now, their proper implementation will be added in follow-up PRs
+     */
+    const startGpsTrip = () => {
+        initGpsDraft();
 
-        if (!hasLocationServicesEnabled) {
-            setShowDisabledServicesModal(true);
-            return;
-        }
-
-        setStartPermissionsFlow(true);
+        setIsTracking(true);
+        setStartAddress({value: '181 3rd St, San Francisco, CA', type: 'address'});
+        addGpsPoints([]);
     };
 
-    const stopGpsTrip = async () => {
-        await stopLocationUpdatesAsync(BACKGROUND_LOCATION_TRACKING_TASK_NAME).catch((error) => console.error('[GPS distance request] Failed to stop location tracking', error));
-
+    const stopGpsTrip = () => {
         setIsTracking(false);
 
-        const lastPoint = gpsDraftDetails?.gpsPoints?.at(-1);
-
-        if (!lastPoint) {
-            return;
-        }
-
-        const endAddress = await addressFromGpsPoint(lastPoint);
-
-        if (endAddress === null) {
-            const formattedCoordinates = coordinatesToString(lastPoint);
-            setEndAddress({value: formattedCoordinates, type: 'coordinates'});
-            return;
-        }
-
-        setEndAddress({value: endAddress, type: 'address'});
-    };
-
-    const startGpsTrip = async () => {
-        try {
-            await startLocationUpdatesAsync(
-                BACKGROUND_LOCATION_TRACKING_TASK_NAME,
-                getBackgroundLocationTaskOptions(translate('gps.notification.title'), translate('gps.notification.body')),
-            );
-        } catch (error) {
-            console.error('[GPS distance request] Failed to start location tracking', error);
-            setShouldShowStartError(true);
-            return;
-        }
-
-        initGpsDraft(reportID);
+        setTimeout(() => {
+            setEndAddress({value: '181 3rd St, San Francisco, CA', type: 'address'});
+        }, 500);
     };
 
     const onNext = () => {
@@ -96,9 +61,8 @@ function GPSButtons({navigateToNextStep, setShouldShowStartError, setShouldShowP
         navigateToNextStep();
     };
 
-    const openSettingsForLocationServices = () => {
-        setShowDisabledServicesModal(false);
-        openSettings();
+    const checkPermissions = () => {
+        setStartPermissionsFlow(true);
     };
 
     return (
@@ -125,7 +89,7 @@ function GPSButtons({navigateToNextStep, setShouldShowStartError, setShouldShowP
                 </View>
             ) : (
                 <Button
-                    onPress={gpsDraftDetails?.isTracking ? () => setShowStopConfirmation(true) : checkSettingsAndPermissions}
+                    onPress={gpsDraftDetails?.isTracking ? () => setShowStopConfirmation(true) : checkPermissions}
                     success={!gpsDraftDetails?.isTracking}
                     danger={gpsDraftDetails?.isTracking}
                     allowBubble
@@ -180,8 +144,8 @@ function GPSButtons({navigateToNextStep, setShouldShowStartError, setShouldShowP
                 prompt={translate('gps.zeroDistanceTripModal.prompt')}
             />
             <ConfirmModal
-                isVisible={showLocationRequiredModal}
                 title={translate('gps.locationRequiredModal.title')}
+                isVisible={showLocationRequiredModal}
                 onConfirm={() => {
                     setShowLocationRequiredModal(false);
                     Linking.openSettings();
@@ -197,16 +161,6 @@ function GPSButtons({navigateToNextStep, setShouldShowStartError, setShouldShowP
                 shouldCenterIcon
                 shouldReverseStackedButtons
             />
-            <ConfirmModal
-                title={translate('gps.locationServicesRequiredModal.title')}
-                isVisible={showDisabledServicesModal}
-                onConfirm={openSettingsForLocationServices}
-                onCancel={() => setShowDisabledServicesModal(false)}
-                confirmText={translate('gps.locationServicesRequiredModal.confirm')}
-                cancelText={translate('common.dismiss')}
-                prompt={translate('gps.locationServicesRequiredModal.prompt')}
-                shouldReverseStackedButtons
-            />
         </>
     );
 }
diff --git a/src/pages/iou/request/step/IOURequestStepDistanceGPS/GPSButtons/openSettings/index.android.ts b/src/pages/iou/request/step/IOURequestStepDistanceGPS/GPSButtons/openSettings/index.android.ts
deleted file mode 100644
index 2953ee58d235..000000000000
--- a/src/pages/iou/request/step/IOURequestStepDistanceGPS/GPSButtons/openSettings/index.android.ts
+++ /dev/null
@@ -1,9 +0,0 @@
-import {Linking} from 'react-native';
-
-const ANDROID_SETTINGS_INTENT = 'android.settings.SETTINGS';
-
-function openSettings() {
-    Linking.sendIntent(ANDROID_SETTINGS_INTENT);
-}
-
-export default openSettings;
diff --git a/src/pages/iou/request/step/IOURequestStepDistanceGPS/GPSButtons/openSettings/index.ios.ts b/src/pages/iou/request/step/IOURequestStepDistanceGPS/GPSButtons/openSettings/index.ios.ts
deleted file mode 100644
index 5cbdc074dafe..000000000000
--- a/src/pages/iou/request/step/IOURequestStepDistanceGPS/GPSButtons/openSettings/index.ios.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-import {Linking} from 'react-native';
-
-// cspell:disable-next-line
-const IOS_SETTINGS_URL = 'App-Prefs:General';
-
-function openSettings() {
-    Linking.openURL(IOS_SETTINGS_URL);
-}
-
-export default openSettings;
diff --git a/src/pages/iou/request/step/IOURequestStepDistanceGPS/GPSButtons/openSettings/index.ts b/src/pages/iou/request/step/IOURequestStepDistanceGPS/GPSButtons/openSettings/index.ts
deleted file mode 100644
index f8ae5116fbf6..000000000000
--- a/src/pages/iou/request/step/IOURequestStepDistanceGPS/GPSButtons/openSettings/index.ts
+++ /dev/null
@@ -1,4 +0,0 @@
-// Implementation only needed for iOS and Android
-function openSettings() {}
-
-export default openSettings;
diff --git a/src/pages/iou/request/step/IOURequestStepDistanceGPS/const.ts b/src/pages/iou/request/step/IOURequestStepDistanceGPS/const.ts
deleted file mode 100644
index bca161490f13..000000000000
--- a/src/pages/iou/request/step/IOURequestStepDistanceGPS/const.ts
+++ /dev/null
@@ -1,19 +0,0 @@
-import {Accuracy} from 'expo-location';
-import type {LocationTaskOptions} from 'expo-location';
-
-function getBackgroundLocationTaskOptions(notificationTitle: string, notificationBody: string): LocationTaskOptions {
-    return {
-        accuracy: Accuracy.Highest,
-        distanceInterval: 100,
-        showsBackgroundLocationIndicator: true,
-        foregroundService: {
-            notificationTitle,
-            notificationBody,
-            killServiceOnDestroy: true,
-        },
-    };
-}
-
-const BACKGROUND_LOCATION_TRACKING_TASK_NAME = 'background-location-tracking';
-
-export {getBackgroundLocationTaskOptions, BACKGROUND_LOCATION_TRACKING_TASK_NAME};
diff --git a/src/pages/iou/request/step/IOURequestStepDistanceGPS/index.native.tsx b/src/pages/iou/request/step/IOURequestStepDistanceGPS/index.native.tsx
index d94dca891858..8e0ceb334118 100644
--- a/src/pages/iou/request/step/IOURequestStepDistanceGPS/index.native.tsx
+++ b/src/pages/iou/request/step/IOURequestStepDistanceGPS/index.native.tsx
@@ -20,7 +20,7 @@ import Waypoints from './Waypoints';
 function IOURequestStepDistanceGPS({
     report,
     route: {
-        params: {action, reportID, iouType, reportActionID},
+        params: {action, iouType, reportActionID},
     },
     transaction,
 }: IOURequestStepDistanceGPSProps) {
@@ -71,7 +71,6 @@ function IOURequestStepDistanceGPS({
                     navigateToNextStep={() => {}}
                     setShouldShowStartError={setShouldShowStartError}
                     setShouldShowPermissionsError={setShouldShowPermissionsError}
-                    reportID={reportID}
                 />
             </View>
         </StepScreenWrapper>
diff --git a/src/pages/iou/request/step/IOURequestStepDistanceGPS/index.tsx b/src/pages/iou/request/step/IOURequestStepDistanceGPS/index.tsx
index f35469bb7a15..ad7d278f2ce3 100644
--- a/src/pages/iou/request/step/IOURequestStepDistanceGPS/index.tsx
+++ b/src/pages/iou/request/step/IOURequestStepDistanceGPS/index.tsx
@@ -20,7 +20,7 @@ function IOURequestStepDistanceGPS(props: IOURequestStepDistanceGPSProps) {
     const {translate} = useLocalize();
 
     return (
-        <View style={[styles.ph5, styles.pv10, styles.alignItemsCenter, styles.justifyContentCenter, styles.h100]}>
+        <View style={[styles.p10, styles.alignItemsCenter, styles.justifyContentCenter, styles.h100]}>
             <View style={[styles.gpsWebIllustrationContainer]}>
                 <ImageSVG
                     src={ToddInCar}
diff --git a/src/pages/iou/request/step/IOURequestStepDistanceGPS/utils/addressFromGpsPoint.ts b/src/pages/iou/request/step/IOURequestStepDistanceGPS/utils/addressFromGpsPoint.ts
deleted file mode 100644
index 403e077a0995..000000000000
--- a/src/pages/iou/request/step/IOURequestStepDistanceGPS/utils/addressFromGpsPoint.ts
+++ /dev/null
@@ -1,20 +0,0 @@
-import {reverseGeocodeAsync} from 'expo-location';
-
-async function addressFromGpsPoint(gpsPoint: {lat: number; long: number}): Promise<string | null> {
-    try {
-        const [location] = await reverseGeocodeAsync({latitude: gpsPoint.lat, longitude: gpsPoint.long});
-
-        if (!location) {
-            return null;
-        }
-
-        const address: string = location?.formattedAddress ?? [location?.name, location?.city, location?.region].filter(Boolean).join(', ');
-
-        return address;
-    } catch (error) {
-        console.error('[GPS distance request] Failed to reverse geocode location to postal address: ', error);
-        return null;
-    }
-}
-
-export default addressFromGpsPoint;
diff --git a/src/pages/iou/request/step/IOURequestStepDistanceGPS/utils/coordinatesToString.ts b/src/pages/iou/request/step/IOURequestStepDistanceGPS/utils/coordinatesToString.ts
deleted file mode 100644
index 9e049c5046d2..000000000000
--- a/src/pages/iou/request/step/IOURequestStepDistanceGPS/utils/coordinatesToString.ts
+++ /dev/null
@@ -1,5 +0,0 @@
-function coordinatesToString(gpsPoint: {lat: number; long: number}): string {
-    return `${gpsPoint.lat},${gpsPoint.long}`;
-}
-
-export default coordinatesToString;
diff --git a/src/pages/iou/request/step/IOURequestStepDistanceManual.tsx b/src/pages/iou/request/step/IOURequestStepDistanceManual.tsx
index c8757c03fcd6..761e650c2b43 100644
--- a/src/pages/iou/request/step/IOURequestStepDistanceManual.tsx
+++ b/src/pages/iou/request/step/IOURequestStepDistanceManual.tsx
@@ -17,25 +17,36 @@ import usePersonalPolicy from '@hooks/usePersonalPolicy';
 import usePolicy from '@hooks/usePolicy';
 import useResponsiveLayout from '@hooks/useResponsiveLayout';
 import useThemeStyles from '@hooks/useThemeStyles';
-import {getMoneyRequestParticipantsFromReport, setMoneyRequestDistance, updateMoneyRequestDistance} from '@libs/actions/IOU';
-import {handleMoneyRequestStepDistanceNavigation} from '@libs/actions/IOU/MoneyRequest';
+import {
+    createDistanceRequest,
+    getMoneyRequestParticipantsFromReport,
+    setCustomUnitRateID,
+    setMoneyRequestDistance,
+    setMoneyRequestMerchant,
+    setMoneyRequestParticipantsFromReport,
+    setMoneyRequestPendingFields,
+    trackExpense,
+    updateMoneyRequestDistance,
+} from '@libs/actions/IOU';
+import {setTransactionReport} from '@libs/actions/Transaction';
 import {canUseTouchScreen} from '@libs/DeviceCapabilities';
 import DistanceRequestUtils from '@libs/DistanceRequestUtils';
 import getNonEmptyStringOnyxID from '@libs/getNonEmptyStringOnyxID';
-import {shouldUseTransactionDraft} from '@libs/IOUUtils';
+import {navigateToParticipantPage, shouldUseTransactionDraft} from '@libs/IOUUtils';
 import Navigation from '@libs/Navigation/Navigation';
 import {roundToTwoDecimalPlaces} from '@libs/NumberUtils';
+import {getParticipantsOption, getReportOption} from '@libs/OptionsListUtils';
 import {isPaidGroupPolicy} from '@libs/PolicyUtils';
-import {isArchivedReport, isPolicyExpenseChat as isPolicyExpenseChatUtils} from '@libs/ReportUtils';
+import {getPolicyExpenseChat, isArchivedReport, isPolicyExpenseChat as isPolicyExpenseChatUtils} from '@libs/ReportUtils';
 import {shouldRestrictUserBillableActions} from '@libs/SubscriptionUtils';
 import {getRateID} from '@libs/TransactionUtils';
 import variables from '@styles/variables';
 import CONST from '@src/CONST';
 import ONYXKEYS from '@src/ONYXKEYS';
+import ROUTES from '@src/ROUTES';
 import type SCREENS from '@src/SCREENS';
 import type Transaction from '@src/types/onyx/Transaction';
 import isLoadingOnyxValue from '@src/types/utils/isLoadingOnyxValue';
-import {isParticipantP2P} from './IOURequestStepAmount';
 import StepScreenWrapper from './StepScreenWrapper';
 import withFullTransactionOrNotFound from './withFullTransactionOrNotFound';
 import type {WithWritableReportOrNotFoundProps} from './withWritableReportOrNotFound';
@@ -67,12 +78,9 @@ function IOURequestStepDistanceManual({
     const [formError, setFormError] = useState<string>('');
 
     const [reportNameValuePairs] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS}${report?.reportID}`, {canBeMissing: true});
-    const isArchived = isArchivedReport(reportNameValuePairs);
     const [selectedTab, selectedTabResult] = useOnyx(`${ONYXKEYS.COLLECTION.SELECTED_TAB}${CONST.TAB.DISTANCE_REQUEST_TYPE}`, {canBeMissing: true});
     const isLoadingSelectedTab = isLoadingOnyxValue(selectedTabResult);
     const policy = usePolicy(report?.policyID);
-    const [policyCategories] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY_CATEGORIES}${policy?.id}`, {canBeMissing: true});
-    const [policyTags] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY_TAGS}${policy?.id}`, {canBeMissing: true});
     const personalPolicy = usePersonalPolicy();
     const [personalDetails] = useOnyx(ONYXKEYS.PERSONAL_DETAILS_LIST, {canBeMissing: false});
     const defaultExpensePolicy = useDefaultExpensePolicy();
@@ -85,7 +93,6 @@ function IOURequestStepDistanceManual({
     const [introSelected] = useOnyx(ONYXKEYS.NVP_INTRO_SELECTED, {canBeMissing: true});
     const [activePolicyID] = useOnyx(ONYXKEYS.NVP_ACTIVE_POLICY_ID, {canBeMissing: true});
     const [parentReport] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${getNonEmptyStringOnyxID(report?.parentReportID)}`, {canBeMissing: true});
-    const [parentReportNextStep] = useOnyx(`${ONYXKEYS.COLLECTION.NEXT_STEP}${getNonEmptyStringOnyxID(report?.parentReportID)}`, {canBeMissing: true});
 
     const isEditing = action === CONST.IOU.ACTION.EDIT;
     const isCreatingNewRequest = !(backTo || isEditing);
@@ -105,7 +112,7 @@ function IOURequestStepDistanceManual({
 
     const customUnitRateID = getRateID(transaction);
     const unit = DistanceRequestUtils.getRate({transaction, policy: shouldUseDefaultExpensePolicy ? defaultExpensePolicy : policy}).unit;
-    const distance = typeof transaction?.comment?.customUnit?.quantity === 'number' ? roundToTwoDecimalPlaces(transaction.comment.customUnit.quantity) : undefined;
+    const distance = transaction?.comment?.customUnit?.quantity ? roundToTwoDecimalPlaces(transaction.comment.customUnit.quantity) : undefined;
     const isASAPSubmitBetaEnabled = isBetaEnabled(CONST.BETAS.ASAP_SUBMIT);
 
     useEffect(() => {
@@ -120,8 +127,8 @@ function IOURequestStepDistanceManual({
             return false;
         }
 
-        return !(isArchived || isPolicyExpenseChatUtils(report));
-    }, [report, skipConfirmation, isArchived]);
+        return !(isArchivedReport(reportNameValuePairs) || isPolicyExpenseChatUtils(report));
+    }, [report, skipConfirmation, reportNameValuePairs]);
 
     useFocusEffect(
         useCallback(() => {
@@ -147,6 +154,16 @@ function IOURequestStepDistanceManual({
         return isCreatingNewRequest ? translate('common.next') : translate('common.save');
     }, [shouldSkipConfirmation, translate, isCreatingNewRequest]);
 
+    const navigateToConfirmationPage = useCallback(() => {
+        switch (iouType) {
+            case CONST.IOU.TYPE.REQUEST:
+                Navigation.navigate(ROUTES.MONEY_REQUEST_STEP_CONFIRMATION.getRoute(CONST.IOU.ACTION.CREATE, CONST.IOU.TYPE.SUBMIT, transactionID, reportID, backToReport));
+                break;
+            default:
+                Navigation.navigate(ROUTES.MONEY_REQUEST_STEP_CONFIRMATION.getRoute(CONST.IOU.ACTION.CREATE, iouType, transactionID, reportID, backToReport));
+        }
+    }, [iouType, transactionID, reportID, backToReport]);
+
     const navigateToNextPage = useCallback(
         (amount: string) => {
             const distanceAsFloat = roundToTwoDecimalPlaces(parseFloat(amount));
@@ -162,47 +179,125 @@ function IOURequestStepDistanceManual({
                         // Not required for manual distance request
                         transactionBackup: undefined,
                         policy,
-                        policyTagList: policyTags,
-                        policyCategories,
                         currentUserAccountIDParam,
                         currentUserEmailParam,
                         isASAPSubmitBetaEnabled,
-                        parentReportNextStep,
                     });
                 }
                 Navigation.goBack(backTo);
                 return;
             }
 
-            handleMoneyRequestStepDistanceNavigation({
-                iouType,
-                report,
-                policy,
-                transaction,
-                reportID,
-                transactionID,
-                reportAttributesDerived,
-                personalDetails,
-                customUnitRateID,
-                manualDistance: distanceAsFloat,
-                currentUserLogin: currentUserEmailParam,
-                currentUserAccountID: currentUserAccountIDParam,
-                backTo,
-                backToReport,
-                shouldSkipConfirmation,
-                defaultExpensePolicy,
-                isArchivedExpenseReport: isArchived,
-                isAutoReporting: !!personalPolicy?.autoReporting,
-                isASAPSubmitBetaEnabled,
-                transactionViolations,
-                lastSelectedDistanceRates,
-                translate,
-                quickAction,
-                policyRecentlyUsedCurrencies,
-                introSelected,
-                activePolicyID,
-                privateIsArchived: reportNameValuePairs?.private_isArchived,
-            });
+            if (backTo) {
+                Navigation.goBack(backTo);
+                return;
+            }
+
+            if (report?.reportID && !isArchivedReport(reportNameValuePairs) && iouType !== CONST.IOU.TYPE.CREATE) {
+                const selectedParticipants = getMoneyRequestParticipantsFromReport(report, currentUserAccountIDParam);
+                const participants = selectedParticipants.map((participant) => {
+                    const participantAccountID = participant?.accountID ?? CONST.DEFAULT_NUMBER_ID;
+                    return participantAccountID ? getParticipantsOption(participant, personalDetails) : getReportOption(participant, reportAttributesDerived);
+                });
+                if (shouldSkipConfirmation) {
+                    setMoneyRequestPendingFields(transactionID, {waypoints: CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD});
+                    setMoneyRequestMerchant(transactionID, translate('iou.fieldPending'), false);
+                    const participant = participants.at(0);
+                    if (iouType === CONST.IOU.TYPE.TRACK && participant) {
+                        trackExpense({
+                            report,
+                            isDraftPolicy: false,
+                            participantParams: {
+                                payeeEmail: currentUserEmailParam,
+                                payeeAccountID: currentUserAccountIDParam,
+                                participant,
+                            },
+                            policyParams: {
+                                policy,
+                            },
+                            transactionParams: {
+                                amount: 0,
+                                distance: distanceAsFloat,
+                                currency: transaction?.currency ?? 'USD',
+                                created: transaction?.created ?? '',
+                                merchant: translate('iou.fieldPending'),
+                                receipt: {},
+                                billable: false,
+                                customUnitRateID,
+                                attendees: transaction?.comment?.attendees,
+                            },
+                            isASAPSubmitBetaEnabled,
+                            currentUserAccountIDParam,
+                            currentUserEmailParam,
+                            introSelected,
+                            activePolicyID,
+                            quickAction,
+                        });
+                        return;
+                    }
+
+                    const isPolicyExpenseChat = !!participant?.isPolicyExpenseChat;
+
+                    createDistanceRequest({
+                        report,
+                        participants,
+                        currentUserLogin: currentUserEmailParam,
+                        currentUserAccountID: currentUserAccountIDParam,
+                        iouType,
+                        existingTransaction: transaction,
+                        transactionParams: {
+                            amount: 0,
+                            distance: distanceAsFloat,
+                            comment: '',
+                            created: transaction?.created ?? '',
+                            currency: transaction?.currency ?? 'USD',
+                            merchant: translate('iou.fieldPending'),
+                            billable: !!policy?.defaultBillable,
+                            customUnitRateID: DistanceRequestUtils.getCustomUnitRateID({reportID: report.reportID, isPolicyExpenseChat, policy, lastSelectedDistanceRates}),
+                            splitShares: transaction?.splitShares,
+                            attendees: transaction?.comment?.attendees,
+                        },
+                        backToReport,
+                        isASAPSubmitBetaEnabled,
+                        transactionViolations,
+                        quickAction,
+                        policyRecentlyUsedCurrencies: policyRecentlyUsedCurrencies ?? [],
+                    });
+                    return;
+                }
+                setMoneyRequestParticipantsFromReport(transactionID, report, currentUserAccountIDParam).then(() => {
+                    navigateToConfirmationPage();
+                });
+                return;
+            }
+
+            // If there was no reportID, then that means the user started this flow from the global menu
+            // and an optimistic reportID was generated. In that case, the next step is to select the participants for this expense.
+            if (shouldUseDefaultExpensePolicy) {
+                const activePolicyExpenseChat = getPolicyExpenseChat(currentUserAccountIDParam, defaultExpensePolicy?.id);
+                const shouldAutoReport = !!defaultExpensePolicy?.autoReporting || !!personalPolicy?.autoReporting;
+                const transactionReportID = shouldAutoReport ? activePolicyExpenseChat?.reportID : CONST.REPORT.UNREPORTED_REPORT_ID;
+                const rateID = DistanceRequestUtils.getCustomUnitRateID({
+                    reportID: transactionReportID,
+                    isPolicyExpenseChat: true,
+                    policy: defaultExpensePolicy,
+                    lastSelectedDistanceRates,
+                });
+                setTransactionReport(transactionID, {reportID: transactionReportID}, true);
+                setCustomUnitRateID(transactionID, rateID);
+                setMoneyRequestParticipantsFromReport(transactionID, activePolicyExpenseChat, currentUserAccountIDParam).then(() => {
+                    Navigation.navigate(
+                        ROUTES.MONEY_REQUEST_STEP_CONFIRMATION.getRoute(
+                            CONST.IOU.ACTION.CREATE,
+                            iouType === CONST.IOU.TYPE.CREATE ? CONST.IOU.TYPE.SUBMIT : iouType,
+                            transactionID,
+                            activePolicyExpenseChat?.reportID,
+                        ),
+                    );
+                });
+            } else {
+                navigateToParticipantPage(iouType, transactionID, reportID);
+            }
         },
         [
             transactionID,
@@ -210,14 +305,13 @@ function IOURequestStepDistanceManual({
             action,
             backTo,
             report,
-            isArchived,
+            reportNameValuePairs,
             iouType,
+            shouldUseDefaultExpensePolicy,
             distance,
             transaction,
             parentReport,
             policy,
-            policyTags,
-            policyCategories,
             currentUserAccountIDParam,
             currentUserEmailParam,
             isASAPSubmitBetaEnabled,
@@ -233,6 +327,7 @@ function IOURequestStepDistanceManual({
             customUnitRateID,
             introSelected,
             activePolicyID,
+            navigateToConfirmationPage,
             defaultExpensePolicy,
             personalPolicy?.autoReporting,
             reportID,
@@ -241,31 +336,18 @@ function IOURequestStepDistanceManual({
 
     const submitAndNavigateToNextPage = useCallback(() => {
         const value = numberFormRef.current?.getNumber() ?? '';
-        const isP2P = isParticipantP2P(getMoneyRequestParticipantsFromReport(report, currentUserAccountIDParam).at(0));
-
-        if (isBetaEnabled(CONST.BETAS.ZERO_EXPENSES)) {
-            if (!value.length || parseFloat(value) < 0) {
-                setFormError(translate('iou.error.invalidDistance'));
-                return;
-            }
-        } else if (!value.length || parseFloat(value) <= 0) {
-            setFormError(translate('iou.error.invalidDistance'));
-            return;
-        }
-
-        if ((iouType === CONST.IOU.TYPE.REQUEST || iouType === CONST.IOU.TYPE.SUBMIT) && parseFloat(value) === 0 && isP2P) {
+        if (!value.length || parseFloat(value) < 0.01) {
             setFormError(translate('iou.error.invalidDistance'));
             return;
         }
 
         navigateToNextPage(value);
-    }, [navigateToNextPage, translate, report, iouType, currentUserAccountIDParam, isBetaEnabled]);
+    }, [navigateToNextPage, translate]);
 
     useEffect(() => {
         if (isLoadingSelectedTab) {
             return;
         }
-        // eslint-disable-next-line react-hooks/set-state-in-effect -- Clear form error when tab changes
         setFormError('');
     }, [selectedTab, isLoadingSelectedTab]);
 
@@ -296,9 +378,7 @@ function IOURequestStepDistanceManual({
                 style={styles.iouAmountTextInput}
                 containerStyle={styles.iouAmountTextInputContainer}
                 autoGrowExtraSpace={variables.w80}
-                touchableInputWrapperStyle={styles.heightUndefined}
                 errorText={formError}
-                accessibilityLabel={`${translate('common.distance')} (${translate(`common.${unit}`)})`}
                 footer={
                     <Button
                         success
diff --git a/src/pages/iou/request/step/IOURequestStepDistanceMap.tsx b/src/pages/iou/request/step/IOURequestStepDistanceMap.tsx
index e9d06da84fec..e9bc1de5706a 100644
--- a/src/pages/iou/request/step/IOURequestStepDistanceMap.tsx
+++ b/src/pages/iou/request/step/IOURequestStepDistanceMap.tsx
@@ -25,21 +25,35 @@ import usePolicy from '@hooks/usePolicy';
 import usePrevious from '@hooks/usePrevious';
 import useShowNotFoundPageInIOUStep from '@hooks/useShowNotFoundPageInIOUStep';
 import useThemeStyles from '@hooks/useThemeStyles';
-import {getIOURequestPolicyID, setMoneyRequestAmount, setSplitShares, updateMoneyRequestDistance} from '@libs/actions/IOU';
-import {handleMoneyRequestStepDistanceNavigation} from '@libs/actions/IOU/MoneyRequest';
+import {
+    createDistanceRequest,
+    getIOURequestPolicyID,
+    getMoneyRequestParticipantsFromReport,
+    resetSplitShares,
+    setCustomUnitRateID,
+    setMoneyRequestAmount,
+    setMoneyRequestMerchant,
+    setMoneyRequestParticipantsFromReport,
+    setMoneyRequestPendingFields,
+    setSplitShares,
+    trackExpense,
+    updateMoneyRequestDistance,
+} from '@libs/actions/IOU';
 import {init, stop} from '@libs/actions/MapboxToken';
 import {openReport} from '@libs/actions/Report';
-import {openDraftDistanceExpense, removeWaypoint, updateWaypoints as updateWaypointsUtil} from '@libs/actions/Transaction';
+import {openDraftDistanceExpense, removeWaypoint, setTransactionReport, updateWaypoints as updateWaypointsUtil} from '@libs/actions/Transaction';
 import {createBackupTransaction, removeBackupTransaction, restoreOriginalTransactionFromBackup} from '@libs/actions/TransactionEdit';
 import DistanceRequestUtils from '@libs/DistanceRequestUtils';
 import type {MileageRate} from '@libs/DistanceRequestUtils';
 import {getLatestErrorField} from '@libs/ErrorUtils';
 import getNonEmptyStringOnyxID from '@libs/getNonEmptyStringOnyxID';
-import {shouldUseTransactionDraft} from '@libs/IOUUtils';
+import {navigateToParticipantPage, shouldUseTransactionDraft} from '@libs/IOUUtils';
 import Navigation from '@libs/Navigation/Navigation';
-import {getPolicy} from '@libs/PolicyUtils';
-import {isArchivedReport, isPolicyExpenseChat as isPolicyExpenseChatUtil} from '@libs/ReportUtils';
-import {getDistanceInMeters, getRateID, getRequestType, hasRoute, isCustomUnitRateIDForP2P, isWaypointNullIsland} from '@libs/TransactionUtils';
+import {getParticipantsOption, getReportOption} from '@libs/OptionsListUtils';
+import {getPolicy, isPaidGroupPolicy} from '@libs/PolicyUtils';
+import {getPolicyExpenseChat, isArchivedReport, isPolicyExpenseChat as isPolicyExpenseChatUtil} from '@libs/ReportUtils';
+import {shouldRestrictUserBillableActions} from '@libs/SubscriptionUtils';
+import {getDistanceInMeters, getRateID, getRequestType, getValidWaypoints, hasRoute, isCustomUnitRateIDForP2P} from '@libs/TransactionUtils';
 import CONST from '@src/CONST';
 import ONYXKEYS from '@src/ONYXKEYS';
 import ROUTES from '@src/ROUTES';
@@ -74,13 +88,9 @@ function IOURequestStepDistanceMap({
 
     const [allReports] = useOnyx(ONYXKEYS.COLLECTION.REPORT, {canBeMissing: false});
     const [reportNameValuePairs] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS}${report?.reportID}`, {canBeMissing: true});
-    const isArchived = isArchivedReport(reportNameValuePairs);
     const [parentReport] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${getNonEmptyStringOnyxID(report?.parentReportID)}`, {canBeMissing: true});
-    const [parentReportNextStep] = useOnyx(`${ONYXKEYS.COLLECTION.NEXT_STEP}${getNonEmptyStringOnyxID(report?.parentReportID)}`, {canBeMissing: true});
     const [transactionBackup] = useOnyx(`${ONYXKEYS.COLLECTION.TRANSACTION_BACKUP}${transactionID}`, {canBeMissing: true});
     const policy = usePolicy(report?.policyID);
-    const [policyCategories] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY_CATEGORIES}${policy?.id}`, {canBeMissing: true});
-    const [policyTags] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY_TAGS}${policy?.id}`, {canBeMissing: true});
     const personalPolicy = usePersonalPolicy();
     const [personalDetails] = useOnyx(ONYXKEYS.PERSONAL_DETAILS_LIST, {canBeMissing: false});
     const defaultExpensePolicy = useDefaultExpensePolicy();
@@ -130,7 +140,7 @@ function IOURequestStepDistanceMap({
         return isEmpty(waypointWithoutKey);
     };
     const nonEmptyWaypointsCount = useMemo(() => Object.keys(waypoints).filter((key) => !isWaypointEmpty(waypoints[key])).length, [waypoints]);
-    const isWaypointsNullIslandError = useMemo(() => Object.values(waypoints).some(isWaypointNullIsland), [waypoints]);
+
     const duplicateWaypointsError = useMemo(
         () => nonEmptyWaypointsCount >= 2 && Object.keys(validatedWaypoints).length !== nonEmptyWaypointsCount,
         [nonEmptyWaypointsCount, validatedWaypoints],
@@ -193,8 +203,12 @@ function IOURequestStepDistanceMap({
             return false;
         }
 
-        return iouType !== CONST.IOU.TYPE.SPLIT && !isArchived && !(isPolicyExpenseChatUtil(report) && ((policy?.requiresCategory ?? false) || (policy?.requiresTag ?? false)));
-    }, [report, skipConfirmation, policy?.requiresCategory, policy?.requiresTag, isArchived, iouType]);
+        return (
+            iouType !== CONST.IOU.TYPE.SPLIT &&
+            !isArchivedReport(reportNameValuePairs) &&
+            !(isPolicyExpenseChatUtil(report) && ((policy?.requiresCategory ?? false) || (policy?.requiresTag ?? false)))
+        );
+    }, [report, skipConfirmation, policy?.requiresCategory, policy?.requiresTag, reportNameValuePairs, iouType]);
     let buttonText = !isCreatingNewRequest ? translate('common.save') : translate('common.next');
     if (shouldSkipConfirmation) {
         if (iouType === CONST.IOU.TYPE.SPLIT) {
@@ -280,42 +294,152 @@ function IOURequestStepDistanceMap({
         [action, transactionID, report?.reportID, reportID],
     );
 
+    const navigateToConfirmationPage = useCallback(() => {
+        switch (iouType) {
+            case CONST.IOU.TYPE.REQUEST:
+                Navigation.navigate(ROUTES.MONEY_REQUEST_STEP_CONFIRMATION.getRoute(CONST.IOU.ACTION.CREATE, CONST.IOU.TYPE.SUBMIT, transactionID, reportID, backToReport));
+                break;
+            case CONST.IOU.TYPE.SEND:
+                Navigation.navigate(ROUTES.MONEY_REQUEST_STEP_CONFIRMATION.getRoute(CONST.IOU.ACTION.CREATE, CONST.IOU.TYPE.PAY, transactionID, reportID));
+                break;
+            default:
+                Navigation.navigate(ROUTES.MONEY_REQUEST_STEP_CONFIRMATION.getRoute(CONST.IOU.ACTION.CREATE, iouType, transactionID, reportID, backToReport));
+        }
+    }, [backToReport, iouType, reportID, transactionID]);
+
     const navigateToNextStep = useCallback(() => {
-        handleMoneyRequestStepDistanceNavigation({
-            iouType,
-            report,
-            policy,
-            transaction,
-            reportID,
-            transactionID,
-            reportAttributesDerived,
-            personalDetails,
-            waypoints,
-            customUnitRateID,
-            currentUserLogin: currentUserEmailParam,
-            currentUserAccountID: currentUserAccountIDParam,
-            backTo,
-            backToReport,
-            shouldSkipConfirmation,
-            defaultExpensePolicy,
-            isArchivedExpenseReport: isArchived,
-            isAutoReporting: !!personalPolicy?.autoReporting,
-            isASAPSubmitBetaEnabled,
-            transactionViolations,
-            lastSelectedDistanceRates,
-            setDistanceRequestData,
-            translate,
-            quickAction,
-            policyRecentlyUsedCurrencies,
-            introSelected,
-            activePolicyID,
-            privateIsArchived: reportNameValuePairs?.private_isArchived,
-        });
+        if (transaction?.splitShares) {
+            resetSplitShares(transaction);
+        }
+        if (backTo) {
+            Navigation.goBack(backTo);
+            return;
+        }
+
+        // If a reportID exists in the report object, it's because either:
+        // - The user started this flow from using the + button in the composer inside a report.
+        // - The user started this flow from using the global create menu by selecting the Track expense option.
+        // In this case, the participants can be automatically assigned from the report and the user can skip the participants step and go straight
+        // to the confirm step.
+        // If the user started this flow using the Create expense option (combined submit/track flow), they should be redirected to the participants page.
+        if (report?.reportID && !isArchivedReport(reportNameValuePairs) && iouType !== CONST.IOU.TYPE.CREATE) {
+            const selectedParticipants = getMoneyRequestParticipantsFromReport(report, currentUserAccountIDParam);
+            const participants = selectedParticipants.map((participant) => {
+                const participantAccountID = participant?.accountID ?? CONST.DEFAULT_NUMBER_ID;
+                return participantAccountID ? getParticipantsOption(participant, personalDetails) : getReportOption(participant, reportAttributesDerived);
+            });
+            setDistanceRequestData(participants);
+            if (shouldSkipConfirmation) {
+                setMoneyRequestPendingFields(transactionID, {waypoints: CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD});
+                setMoneyRequestMerchant(transactionID, translate('iou.fieldPending'), false);
+                const participant = participants.at(0);
+                if (iouType === CONST.IOU.TYPE.TRACK && participant) {
+                    trackExpense({
+                        report,
+                        isDraftPolicy: false,
+                        participantParams: {
+                            payeeEmail: currentUserEmailParam,
+                            payeeAccountID: currentUserAccountIDParam,
+                            participant,
+                        },
+                        policyParams: {
+                            policy,
+                        },
+                        transactionParams: {
+                            amount: 0,
+                            currency: transaction?.currency ?? 'USD',
+                            created: transaction?.created ?? '',
+                            merchant: translate('iou.fieldPending'),
+                            receipt: {},
+                            billable: false,
+                            reimbursable: true,
+                            validWaypoints: getValidWaypoints(waypoints, true),
+                            customUnitRateID,
+                            attendees: transaction?.comment?.attendees,
+                        },
+                        isASAPSubmitBetaEnabled,
+                        currentUserAccountIDParam,
+                        currentUserEmailParam,
+                        introSelected,
+                        activePolicyID,
+                        quickAction,
+                    });
+                    return;
+                }
+
+                const isPolicyExpenseChat = !!participant?.isPolicyExpenseChat;
+
+                createDistanceRequest({
+                    report,
+                    participants,
+                    currentUserLogin: currentUserEmailParam,
+                    currentUserAccountID: currentUserAccountIDParam,
+                    iouType,
+                    existingTransaction: transaction,
+                    transactionParams: {
+                        amount: 0,
+                        comment: '',
+                        created: transaction?.created ?? '',
+                        currency: transaction?.currency ?? 'USD',
+                        merchant: translate('iou.fieldPending'),
+                        billable: !!policy?.defaultBillable,
+                        reimbursable: !!policy?.defaultReimbursable,
+                        validWaypoints: getValidWaypoints(waypoints, true),
+                        customUnitRateID: DistanceRequestUtils.getCustomUnitRateID({reportID: report.reportID, isPolicyExpenseChat, policy, lastSelectedDistanceRates}),
+                        splitShares: transaction?.splitShares,
+                        attendees: transaction?.comment?.attendees,
+                    },
+                    backToReport,
+                    isASAPSubmitBetaEnabled,
+                    transactionViolations,
+                    quickAction,
+                    policyRecentlyUsedCurrencies: policyRecentlyUsedCurrencies ?? [],
+                });
+                return;
+            }
+            setMoneyRequestParticipantsFromReport(transactionID, report, currentUserAccountIDParam).then(() => {
+                navigateToConfirmationPage();
+            });
+            return;
+        }
+
+        // If there was no reportID, then that means the user started this flow from the global menu
+        // and an optimistic reportID was generated. In that case, the next step is to select the participants for this expense.
+        if (
+            iouType === CONST.IOU.TYPE.CREATE &&
+            isPaidGroupPolicy(defaultExpensePolicy) &&
+            defaultExpensePolicy?.isPolicyExpenseChatEnabled &&
+            !shouldRestrictUserBillableActions(defaultExpensePolicy.id)
+        ) {
+            const activePolicyExpenseChat = getPolicyExpenseChat(currentUserAccountIDParam, defaultExpensePolicy?.id);
+            const shouldAutoReport = !!defaultExpensePolicy?.autoReporting || !!personalPolicy?.autoReporting;
+            const transactionReportID = shouldAutoReport ? activePolicyExpenseChat?.reportID : CONST.REPORT.UNREPORTED_REPORT_ID;
+            const rateID = DistanceRequestUtils.getCustomUnitRateID({
+                reportID: transactionReportID,
+                isPolicyExpenseChat: true,
+                policy: defaultExpensePolicy,
+                lastSelectedDistanceRates,
+            });
+            setTransactionReport(transactionID, {reportID: transactionReportID}, true);
+            setCustomUnitRateID(transactionID, rateID);
+            setMoneyRequestParticipantsFromReport(transactionID, activePolicyExpenseChat, currentUserAccountIDParam).then(() => {
+                Navigation.navigate(
+                    ROUTES.MONEY_REQUEST_STEP_CONFIRMATION.getRoute(
+                        CONST.IOU.ACTION.CREATE,
+                        iouType === CONST.IOU.TYPE.CREATE ? CONST.IOU.TYPE.SUBMIT : iouType,
+                        transactionID,
+                        activePolicyExpenseChat?.reportID,
+                    ),
+                );
+            });
+        } else {
+            navigateToParticipantPage(iouType, transactionID, reportID);
+        }
     }, [
         transaction,
         backTo,
         report,
-        isArchived,
+        reportNameValuePairs,
         iouType,
         defaultExpensePolicy,
         currentUserAccountIDParam,
@@ -337,6 +461,7 @@ function IOURequestStepDistanceMap({
         customUnitRateID,
         introSelected,
         activePolicyID,
+        navigateToConfirmationPage,
         personalPolicy?.autoReporting,
         reportID,
     ]);
@@ -346,9 +471,6 @@ function IOURequestStepDistanceMap({
         if (hasRouteError) {
             return getLatestErrorField(transaction, 'route');
         }
-        if (isWaypointsNullIslandError) {
-            return {isWaypointsNullIslandError: `${translate('common.please')} ${translate('common.fixTheErrors')} ${translate('common.inTheFormBeforeContinuing')}.`} as Errors;
-        }
         if (duplicateWaypointsError) {
             return {duplicateWaypointsError: translate('iou.error.duplicateWaypointsErrorMessage')} as Errors;
         }
@@ -417,13 +539,10 @@ function IOURequestStepDistanceMap({
                     waypoints,
                     ...(hasRouteChanged ? {routes: transaction?.routes} : {}),
                     policy,
-                    policyTagList: policyTags,
-                    policyCategories,
                     transactionBackup,
                     currentUserAccountIDParam,
                     currentUserEmailParam,
                     isASAPSubmitBetaEnabled,
-                    parentReportNextStep,
                 });
             }
             transactionWasSaved.current = true;
@@ -447,8 +566,6 @@ function IOURequestStepDistanceMap({
         navigateToNextStep,
         parentReport,
         policy,
-        policyTags,
-        policyCategories,
         report,
         transaction?.routes,
         transaction?.transactionID,
diff --git a/src/pages/iou/request/step/IOURequestStepDistanceOdometer.tsx b/src/pages/iou/request/step/IOURequestStepDistanceOdometer.tsx
index 2e7cb49d6e8c..939856581cb8 100644
--- a/src/pages/iou/request/step/IOURequestStepDistanceOdometer.tsx
+++ b/src/pages/iou/request/step/IOURequestStepDistanceOdometer.tsx
@@ -43,7 +43,7 @@ import {shouldRestrictUserBillableActions} from '@libs/SubscriptionUtils';
 import CONST from '@src/CONST';
 import ONYXKEYS from '@src/ONYXKEYS';
 import ROUTES from '@src/ROUTES';
-import SCREENS from '@src/SCREENS';
+import type SCREENS from '@src/SCREENS';
 import type {ReportAttributesDerivedValue} from '@src/types/onyx/DerivedValues';
 import type Transaction from '@src/types/onyx/Transaction';
 import DiscardChangesConfirmation from './DiscardChangesConfirmation';
@@ -61,8 +61,7 @@ type IOURequestStepDistanceOdometerProps = WithCurrentUserPersonalDetailsProps &
 function IOURequestStepDistanceOdometer({
     report,
     route: {
-        params: {action, iouType, reportID, transactionID, backToReport},
-        name: routeName,
+        params: {action, iouType, reportID, transactionID, backTo, backToReport},
     },
     transaction,
     currentUserPersonalDetails,
@@ -94,7 +93,6 @@ function IOURequestStepDistanceOdometer({
     const endReadingRef = useRef<string>('');
 
     const [reportNameValuePairs] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS}${report?.reportID}`, {canBeMissing: true});
-    const isArchived = isArchivedReport(reportNameValuePairs);
     const [lastSelectedDistanceRates] = useOnyx(ONYXKEYS.NVP_LAST_SELECTED_DISTANCE_RATES, {canBeMissing: true});
     const [personalDetails] = useOnyx(ONYXKEYS.PERSONAL_DETAILS_LIST, {canBeMissing: false});
     const [reportAttributesDerived] = useOnyx(ONYXKEYS.DERIVED.REPORT_ATTRIBUTES, {canBeMissing: true, selector: reportsSelector});
@@ -105,21 +103,15 @@ function IOURequestStepDistanceOdometer({
     const [policyRecentlyUsedCurrencies] = useOnyx(ONYXKEYS.RECENTLY_USED_CURRENCIES, {canBeMissing: true});
     const [skipConfirmation] = useOnyx(`${ONYXKEYS.COLLECTION.SKIP_CONFIRMATION}${transactionID}`, {canBeMissing: true});
     const [parentReport] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${getNonEmptyStringOnyxID(report?.parentReportID)}`, {canBeMissing: true});
-    const [parentReportNextStep] = useOnyx(`${ONYXKEYS.COLLECTION.NEXT_STEP}${getNonEmptyStringOnyxID(report?.parentReportID)}`, {canBeMissing: true});
     const policy = usePolicy(report?.policyID);
-    const [policyCategories] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY_CATEGORIES}${policy?.id}`, {canBeMissing: true});
-    const [policyTags] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY_TAGS}${policy?.id}`, {canBeMissing: true});
     const personalPolicy = usePersonalPolicy();
     const defaultExpensePolicy = useDefaultExpensePolicy();
 
-    // isEditing: we're changing an already existing odometer expense; isEditingConfirmation: we navigated here by pressing 'Distance' field from the confirmation step during the creation of a new odometer expense to adjust the input before submitting
     const isEditing = action === CONST.IOU.ACTION.EDIT;
-    const isEditingConfirmation = routeName !== SCREENS.MONEY_REQUEST.DISTANCE_CREATE && !isEditing;
-    const isCreatingNewRequest = !isEditingConfirmation && !isEditing;
+    const isCreatingNewRequest = !(backTo ?? isEditing);
     const isTransactionDraft = shouldUseTransactionDraft(action, iouType);
     const currentUserAccountIDParam = currentUserPersonalDetails.accountID;
     const currentUserEmailParam = currentUserPersonalDetails.login ?? '';
-    const [shouldEnableDiscardConfirmation, setShouldEnableDiscardConfirmation] = useState(!isEditingConfirmation && !isEditing);
 
     const shouldUseDefaultExpensePolicy = useMemo(
         () =>
@@ -132,13 +124,7 @@ function IOURequestStepDistanceOdometer({
 
     const unit = DistanceRequestUtils.getRate({transaction, policy: shouldUseDefaultExpensePolicy ? defaultExpensePolicy : policy}).unit;
 
-    const shouldSkipConfirmation: boolean = !skipConfirmation || !report?.reportID ? false : !(isArchived || isPolicyExpenseChatUtils(report));
-
-    const confirmationRoute = ROUTES.MONEY_REQUEST_STEP_CONFIRMATION.getRoute(action, iouType, transactionID, reportID, backToReport);
-
-    useEffect(() => {
-        setShouldEnableDiscardConfirmation(!isEditingConfirmation && !isEditing);
-    }, [isEditing, isEditingConfirmation]);
+    const shouldSkipConfirmation: boolean = !skipConfirmation || !report?.reportID ? false : !(isArchivedReport(reportNameValuePairs) || isPolicyExpenseChatUtils(report));
 
     // Reset component state when transaction has no odometer data (happens when switching tabs)
     // In Phase 1, we don't persist data from transaction since users can't save and exit
@@ -165,7 +151,7 @@ function IOURequestStepDistanceOdometer({
         const shouldReset =
             hasInitializedRefs.current &&
             !isEditing &&
-            !isEditingConfirmation &&
+            !backToReport &&
             !hasTransactionData &&
             (wasCleared || (prevTransactionStartRef.current === undefined && prevTransactionEndRef.current === undefined));
 
@@ -184,7 +170,7 @@ function IOURequestStepDistanceOdometer({
         // Update refs to track previous values
         prevTransactionStartRef.current = currentStart;
         prevTransactionEndRef.current = currentEnd;
-    }, [isFocused, isEditing, isEditingConfirmation, transaction?.comment?.odometerStart, transaction?.comment?.odometerEnd]);
+    }, [isFocused, isEditing, backToReport, transaction?.comment?.odometerStart, transaction?.comment?.odometerEnd]);
 
     // Initialize initial values refs on mount for DiscardChangesConfirmation
     // These should never be updated after mount - they represent the "baseline" state
@@ -247,7 +233,7 @@ function IOURequestStepDistanceOdometer({
         if (shouldSkipConfirmation) {
             return translate('iou.createExpense');
         }
-        const shouldShowSave = isEditing || isEditingConfirmation;
+        const shouldShowSave = isEditing || backToReport;
         return shouldShowSave ? translate('common.save') : translate('common.next');
     })();
 
@@ -302,11 +288,7 @@ function IOURequestStepDistanceOdometer({
     };
 
     const navigateBack = () => {
-        if (isEditingConfirmation) {
-            Navigation.goBack(confirmationRoute);
-            return;
-        }
-        Navigation.goBack();
+        Navigation.goBack(backTo);
     };
 
     // Navigate to next page following Manual tab pattern
@@ -343,37 +325,31 @@ function IOURequestStepDistanceOdometer({
                     // Not required for odometer distance request
                     transactionBackup: undefined,
                     policy,
-                    policyTagList: policyTags,
-                    policyCategories,
                     currentUserAccountIDParam,
                     currentUserEmailParam,
                     isASAPSubmitBetaEnabled: false,
-                    parentReportNextStep,
                 });
             }
             Navigation.goBack();
             return;
         }
 
-        if (isEditingConfirmation) {
-            Navigation.goBack(confirmationRoute);
+        if (backToReport) {
+            Navigation.goBack(backTo);
             return;
         }
 
         // If a reportID exists in the report object, use it to set participants and navigate to confirmation
         // Following Manual tab pattern
-        if (report?.reportID && !isArchived && iouType !== CONST.IOU.TYPE.CREATE) {
+        if (report?.reportID && !isArchivedReport(reportNameValuePairs) && iouType !== CONST.IOU.TYPE.CREATE) {
             const selectedParticipants = getMoneyRequestParticipantsFromReport(report, currentUserPersonalDetails.accountID);
             const derivedReports = (reportAttributesDerived as ReportAttributesDerivedValue | undefined)?.reports;
             const participants = selectedParticipants.map((participant) => {
                 const participantAccountID = participant?.accountID ?? CONST.DEFAULT_NUMBER_ID;
-                return participantAccountID
-                    ? getParticipantsOption(participant, personalDetails)
-                    : getReportOption(participant, reportNameValuePairs?.private_isArchived, policy, derivedReports);
+                return participantAccountID ? getParticipantsOption(participant, personalDetails) : getReportOption(participant, derivedReports);
             });
 
             if (shouldSkipConfirmation) {
-                setShouldEnableDiscardConfirmation(false);
                 setMoneyRequestPendingFields(transactionID, {waypoints: CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD});
                 setMoneyRequestMerchant(transactionID, translate('iou.fieldPending'), false);
 
@@ -512,6 +488,8 @@ function IOURequestStepDistanceOdometer({
         navigateToNextPage();
     };
 
+    const shouldEnableDiscardConfirmation = !backToReport && !shouldSkipConfirmation && !isEditing;
+
     return (
         <StepScreenWrapper
             headerTitle={translate('common.distance')}
diff --git a/src/pages/iou/request/step/IOURequestStepDistanceRate.tsx b/src/pages/iou/request/step/IOURequestStepDistanceRate.tsx
index 6a9f2ffe9076..46443e69ac0d 100644
--- a/src/pages/iou/request/step/IOURequestStepDistanceRate.tsx
+++ b/src/pages/iou/request/step/IOURequestStepDistanceRate.tsx
@@ -3,7 +3,6 @@ import type {OnyxEntry} from 'react-native-onyx';
 import SelectionList from '@components/SelectionList';
 import RadioListItem from '@components/SelectionList/ListItem/RadioListItem';
 import Text from '@components/Text';
-import useCurrencyList from '@hooks/useCurrencyList';
 import useCurrentUserPersonalDetails from '@hooks/useCurrentUserPersonalDetails';
 import useLocalize from '@hooks/useLocalize';
 import useOnyx from '@hooks/useOnyx';
@@ -55,7 +54,6 @@ function IOURequestStepDistanceRate({
     const [policyCategories] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY_CATEGORIES}${report?.policyID}`, {canBeMissing: true});
     const [policyTags] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY_TAGS}${report?.policyID}`, {canBeMissing: true});
     const [parentReport] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${getNonEmptyStringOnyxID(report?.parentReportID)}`, {canBeMissing: true});
-    const [parentReportNextStep] = useOnyx(`${ONYXKEYS.COLLECTION.NEXT_STEP}${getNonEmptyStringOnyxID(report?.parentReportID)}`, {canBeMissing: true});
 
     /* eslint-enable @typescript-eslint/prefer-nullish-coalescing */
 
@@ -63,7 +61,6 @@ function IOURequestStepDistanceRate({
 
     const styles = useThemeStyles();
     const {translate, toLocaleDigit, localeCompare} = useLocalize();
-    const {getCurrencySymbol} = useCurrencyList();
     const isDistanceRequest = isDistanceRequestTransactionUtils(transaction);
     const isPolicyExpenseChat = isReportInGroupPolicy(report);
     const shouldShowTax = isTaxTrackingEnabled(isPolicyExpenseChat, policy, isDistanceRequest);
@@ -87,7 +84,7 @@ function IOURequestStepDistanceRate({
     const options = sortedRates.map((rate) => {
         const unit = transaction?.comment?.customUnit?.customUnitRateID === rate.customUnitRateID ? DistanceRequestUtils.getDistanceUnit(transaction, rate) : rate.unit;
         const isSelected = currentRateID ? currentRateID === rate.customUnitRateID : DistanceRequestUtils.getDefaultMileageRate(policy)?.customUnitRateID === rate.customUnitRateID;
-        const rateForDisplay = DistanceRequestUtils.getRateForDisplay(unit, rate.rate, isSelected ? transactionCurrency : rate.currency, translate, toLocaleDigit, getCurrencySymbol);
+        const rateForDisplay = DistanceRequestUtils.getRateForDisplay(unit, rate.rate, isSelected ? transactionCurrency : rate.currency, translate, toLocaleDigit);
         return {
             text: rate.name ?? rateForDisplay,
             alternateText: rate.name ? rateForDisplay : '',
@@ -126,7 +123,6 @@ function IOURequestStepDistanceRate({
                     transactionID: transaction.transactionID,
                     transactionThreadReport: report,
                     parentReport,
-                    parentReportNextStep,
                     rateID: customUnitRateID,
                     policy,
                     policyTagList: policyTags,
diff --git a/src/pages/iou/request/step/IOURequestStepHours.tsx b/src/pages/iou/request/step/IOURequestStepHours.tsx
index 1a25f4b28779..78a44fbdab12 100644
--- a/src/pages/iou/request/step/IOURequestStepHours.tsx
+++ b/src/pages/iou/request/step/IOURequestStepHours.tsx
@@ -20,33 +20,29 @@ import {setMoneyRequestAmount, setMoneyRequestMerchant, setMoneyRequestParticipa
 import CONST from '@src/CONST';
 import ONYXKEYS from '@src/ONYXKEYS';
 import ROUTES from '@src/ROUTES';
-import SCREENS from '@src/SCREENS';
+import type SCREENS from '@src/SCREENS';
 import StepScreenWrapper from './StepScreenWrapper';
 import type {WithFullTransactionOrNotFoundProps} from './withFullTransactionOrNotFound';
 import withFullTransactionOrNotFound from './withFullTransactionOrNotFound';
 import type {WithWritableReportOrNotFoundProps} from './withWritableReportOrNotFound';
 import withWritableReportOrNotFound from './withWritableReportOrNotFound';
 
-type IOURequestStepHoursProps = WithWritableReportOrNotFoundProps<typeof SCREENS.MONEY_REQUEST.CREATE | typeof SCREENS.MONEY_REQUEST.STEP_HOURS> &
-    WithFullTransactionOrNotFoundProps<typeof SCREENS.MONEY_REQUEST.CREATE | typeof SCREENS.MONEY_REQUEST.STEP_HOURS>;
+type IOURequestStepHoursProps = WithWritableReportOrNotFoundProps<typeof SCREENS.MONEY_REQUEST.CREATE> & WithFullTransactionOrNotFoundProps<typeof SCREENS.MONEY_REQUEST.CREATE>;
 
 function IOURequestStepHours({
     report,
     route: {
         params: {iouType, reportID, transactionID = '-1', action, reportActionID},
-        name: routeName,
     },
     transaction,
 }: IOURequestStepHoursProps) {
-    const isEditingConfirmation = routeName === SCREENS.MONEY_REQUEST.STEP_HOURS;
     const policyID = report?.policyID;
     const isTransactionDraft = shouldUseTransactionDraft(action);
     const [selectedTab] = useOnyx(`${ONYXKEYS.COLLECTION.SELECTED_TAB}${CONST.TAB.IOU_REQUEST_TYPE}`, {canBeMissing: true});
     const {accountID} = useCurrentUserPersonalDetails();
     const [policy] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY}${policyID}`, {canBeMissing: true});
     const currency = policy?.outputCurrency ?? CONST.CURRENCY.USD;
-    const defaultPolicyRate = policy ? getDefaultTimeTrackingRate(policy) : undefined;
-    const rate = transaction?.comment?.units?.rate ?? defaultPolicyRate;
+    const rate = policy ? getDefaultTimeTrackingRate(policy) : undefined;
 
     const {translate} = useLocalize();
     const styles = useThemeStyles();
@@ -62,8 +58,8 @@ function IOURequestStepHours({
     useEffect(() => {
         // eslint-disable-next-line react-hooks/set-state-in-effect
         setFormError('');
-        moneyRequestTimeInputRef.current?.updateNumber(`${transaction?.comment?.units?.count ?? ''}`);
-    }, [selectedTab, transaction?.comment?.units?.count]);
+        moneyRequestTimeInputRef.current?.updateNumber('');
+    }, [selectedTab]);
 
     useFocusEffect(() => {
         focusTimeoutRef.current = setTimeout(() => textInputRef.current?.focus(), CONST.ANIMATED_TRANSITION);
@@ -75,8 +71,6 @@ function IOURequestStepHours({
         };
     });
 
-    const navigateBack = () => Navigation.goBack(isEditingConfirmation ? ROUTES.MONEY_REQUEST_STEP_CONFIRMATION.getRoute(action, iouType, transactionID, reportID) : undefined);
-
     const saveTime = () => {
         if (rate === undefined) {
             return;
@@ -90,13 +84,9 @@ function IOURequestStepHours({
 
         setMoneyRequestAmount(transactionID, computeTimeAmount(rate, count), currency);
         setMoneyRequestMerchant(transactionID, formatTimeMerchant(count, rate, currency, translate), isTransactionDraft);
+        setMoneyRequestTimeRate(transactionID, rate, isTransactionDraft);
         setMoneyRequestTimeCount(transactionID, count, isTransactionDraft);
 
-        if (isEditingConfirmation) {
-            navigateBack();
-            return;
-        }
-        setMoneyRequestTimeRate(transactionID, rate, isTransactionDraft);
         setMoneyRequestParticipantsFromReport(transactionID, report, accountID).then(() =>
             Navigation.navigate(ROUTES.MONEY_REQUEST_STEP_CONFIRMATION.getRoute(CONST.IOU.ACTION.CREATE, iouType, transactionID, reportID)),
         );
@@ -105,9 +95,9 @@ function IOURequestStepHours({
     return (
         <StepScreenWrapper
             headerTitle={translate('iou.time')}
-            onBackButtonPress={navigateBack}
+            onBackButtonPress={Navigation.goBack}
             testID="IOURequestStepHours"
-            shouldShowWrapper={isEditingConfirmation}
+            shouldShowWrapper={false}
             includeSafeAreaPaddingBottom
             shouldShowNotFoundPage={shouldShowNotFoundPage}
         >
@@ -123,7 +113,6 @@ function IOURequestStepHours({
                 style={styles.iouAmountTextInput}
                 containerStyle={styles.iouAmountTextInputContainer}
                 errorText={formError}
-                touchableInputWrapperStyle={styles.heightUndefined}
                 onInputChange={() => {
                     if (!formError) {
                         return;
@@ -138,7 +127,7 @@ function IOURequestStepHours({
                         large={!isExtraSmallScreenHeight}
                         style={[styles.w100, canUseTouchScreen ? styles.mt5 : styles.mt0]}
                         onPress={saveTime}
-                        text={translate(isEditingConfirmation ? 'common.save' : 'common.next')}
+                        text={translate('common.next')}
                     />
                 }
             />
diff --git a/src/pages/iou/request/step/IOURequestStepMerchant.tsx b/src/pages/iou/request/step/IOURequestStepMerchant.tsx
index 949fa2633c25..2a95d127b3bd 100644
--- a/src/pages/iou/request/step/IOURequestStepMerchant.tsx
+++ b/src/pages/iou/request/step/IOURequestStepMerchant.tsx
@@ -45,7 +45,6 @@ function IOURequestStepMerchant({
     const [policyCategories] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY_CATEGORIES}${report?.policyID}`, {canBeMissing: true});
     const [policyTags] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY_TAGS}${report?.policyID}`, {canBeMissing: true});
     const [parentReport] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${getNonEmptyStringOnyxID(report?.parentReportID)}`, {canBeMissing: true});
-    const [parentReportNextStep] = useOnyx(`${ONYXKEYS.COLLECTION.NEXT_STEP}${getNonEmptyStringOnyxID(report?.parentReportID)}`, {canBeMissing: true});
     const styles = useThemeStyles();
     const {translate} = useLocalize();
     const {inputCallbackRef, inputRef} = useAutoFocusInput();
@@ -57,7 +56,7 @@ function IOURequestStepMerchant({
     // In the split flow, when editing we use SPLIT_TRANSACTION_DRAFT to save draft value
     const isEditingSplitBill = iouType === CONST.IOU.TYPE.SPLIT && isEditing;
     const merchant = getTransactionDetails(isEditingSplitBill && !isEmptyObject(splitDraftTransaction) ? splitDraftTransaction : transaction)?.merchant;
-    const isEmptyMerchant = merchant === '' || merchant === CONST.TRANSACTION.PARTIAL_TRANSACTION_MERCHANT || merchant === CONST.TRANSACTION.DEFAULT_MERCHANT;
+    const isEmptyMerchant = merchant === '' || merchant === CONST.TRANSACTION.PARTIAL_TRANSACTION_MERCHANT;
     const initialMerchant = isEmptyMerchant ? '' : merchant;
     const [currentMerchant, setCurrentMerchant] = useState(initialMerchant);
     const [isSaved, setIsSaved] = useState(false);
@@ -89,10 +88,7 @@ function IOURequestStepMerchant({
 
             if (isMerchantRequired && !value.moneyRequestMerchant) {
                 errors.moneyRequestMerchant = translate('common.error.fieldRequired');
-            } else if (
-                isMerchantRequired &&
-                (value.moneyRequestMerchant === CONST.TRANSACTION.PARTIAL_TRANSACTION_MERCHANT || value.moneyRequestMerchant === CONST.TRANSACTION.DEFAULT_MERCHANT)
-            ) {
+            } else if (isMerchantRequired && value.moneyRequestMerchant === CONST.TRANSACTION.PARTIAL_TRANSACTION_MERCHANT) {
                 errors.moneyRequestMerchant = translate('iou.error.invalidMerchant');
             } else if (!isValid) {
                 errors.moneyRequestMerchant = translate('common.error.characterLimitExceedCounter', byteLength, CONST.MERCHANT_NAME_MAX_BYTES);
@@ -124,19 +120,18 @@ function IOURequestStepMerchant({
         }
         setMoneyRequestMerchant(transactionID, newMerchant || CONST.TRANSACTION.PARTIAL_TRANSACTION_MERCHANT, !isEditing);
         if (isEditing) {
-            updateMoneyRequestMerchant({
+            updateMoneyRequestMerchant(
                 transactionID,
-                transactionThreadReport: report,
+                report,
                 parentReport,
-                value: newMerchant || CONST.TRANSACTION.PARTIAL_TRANSACTION_MERCHANT,
+                newMerchant || CONST.TRANSACTION.PARTIAL_TRANSACTION_MERCHANT,
                 policy,
-                policyTagList: policyTags,
+                policyTags,
                 policyCategories,
                 currentUserAccountIDParam,
                 currentUserEmailParam,
                 isASAPSubmitBetaEnabled,
-                parentReportNextStep,
-            });
+            );
         }
         setIsSaved(true);
         shouldNavigateAfterSaveRef.current = true;
diff --git a/src/pages/iou/request/step/IOURequestStepParticipants.tsx b/src/pages/iou/request/step/IOURequestStepParticipants.tsx
index a83880c8a876..284f8ce8fd03 100644
--- a/src/pages/iou/request/step/IOURequestStepParticipants.tsx
+++ b/src/pages/iou/request/step/IOURequestStepParticipants.tsx
@@ -7,7 +7,6 @@ import FormHelpMessage from '@components/FormHelpMessage';
 import useCurrentUserPersonalDetails from '@hooks/useCurrentUserPersonalDetails';
 import useLocalize from '@hooks/useLocalize';
 import useOnyx from '@hooks/useOnyx';
-import usePolicyForMovingExpenses from '@hooks/usePolicyForMovingExpenses';
 import useThemeStyles from '@hooks/useThemeStyles';
 import {setTransactionReport} from '@libs/actions/Transaction';
 import {READ_COMMANDS} from '@libs/API/types';
@@ -22,7 +21,7 @@ import {isPaidGroupPolicy} from '@libs/PolicyUtils';
 import {findSelfDMReportID, generateReportID, isInvoiceRoomWithID} from '@libs/ReportUtils';
 import {shouldRestrictUserBillableActions} from '@libs/SubscriptionUtils';
 import {endSpan} from '@libs/telemetry/activeSpans';
-import {getRequestType, hasRoute, isCorporateCardTransaction, isDistanceRequest, isPerDiemRequest} from '@libs/TransactionUtils';
+import {getRequestType, isCorporateCardTransaction, isPerDiemRequest} from '@libs/TransactionUtils';
 import MoneyRequestParticipantsSelector from '@pages/iou/request/MoneyRequestParticipantsSelector';
 import {
     navigateToStartStepIfScanFileCannotBeRead,
@@ -78,7 +77,6 @@ function IOURequestStepParticipants({
     const {translate} = useLocalize();
     const styles = useThemeStyles();
     const isFocused = useIsFocused();
-    const {policyForMovingExpenses} = usePolicyForMovingExpenses();
     const [skipConfirmation] = useOnyx(`${ONYXKEYS.COLLECTION.SKIP_CONFIRMATION}${initialTransactionID}`, {canBeMissing: true});
     const [optimisticTransactions] = useOnyx(ONYXKEYS.COLLECTION.TRANSACTION_DRAFT, {
         selector: transactionDraftValuesSelector,
@@ -216,16 +214,16 @@ function IOURequestStepParticipants({
         const iouConfirmationPageRoute = ROUTES.MONEY_REQUEST_STEP_CONFIRMATION.getRoute(action, CONST.IOU.TYPE.TRACK, initialTransactionID, selfDMReportID);
         waitForKeyboardDismiss(() => {
             // If the backTo parameter is set, we should navigate back to the confirmation screen that is already on the stack.
-            Navigation.setNavigationActionToMicrotaskQueue(() => {
-                if (backTo) {
-                    // We don't want to compare params because we just changed the participants.
-                    Navigation.goBack(iouConfirmationPageRoute, {compareParams: false});
-                } else {
-                    // We wrap navigation in setNavigationActionToMicrotaskQueue so that data loading in Onyx and navigation do not occur simultaneously, which resets the amount to 0.
-                    // More information can be found here: https://github.com/Expensify/App/issues/73728
+            if (backTo) {
+                // We don't want to compare params because we just changed the participants.
+                Navigation.goBack(iouConfirmationPageRoute, {compareParams: false});
+            } else {
+                // We wrap navigation in setNavigationActionToMicrotaskQueue so that data loading in Onyx and navigation do not occur simultaneously, which resets the amount to 0.
+                // More information can be found here: https://github.com/Expensify/App/issues/73728
+                Navigation.setNavigationActionToMicrotaskQueue(() => {
                     Navigation.navigate(iouConfirmationPageRoute);
-                }
-            });
+                });
+            }
         });
     }, [selfDMReportID, transactions, action, initialTransactionID, waitForKeyboardDismiss, iouType, selfDMReport, currentUserPersonalDetails.accountID, isActivePolicyRequest, backTo]);
 
@@ -315,103 +313,80 @@ function IOURequestStepParticipants({
         ],
     );
 
-    const goToNextStep = useCallback(
-        (_value?: string, _participants?: Participant[]) => {
-            const isCategorizing = action === CONST.IOU.ACTION.CATEGORIZE;
-            const isShareAction = action === CONST.IOU.ACTION.SHARE;
+    const goToNextStep = useCallback(() => {
+        const isCategorizing = action === CONST.IOU.ACTION.CATEGORIZE;
+        const isShareAction = action === CONST.IOU.ACTION.SHARE;
 
-            const isPolicyExpenseChat = participants?.some((participant) => participant.isPolicyExpenseChat);
-            if (iouType === CONST.IOU.TYPE.SPLIT && !isPolicyExpenseChat && initialTransaction?.amount && initialTransaction?.currency) {
-                const participantAccountIDs = participants?.map((participant) => participant.accountID) as number[];
-                setSplitShares(initialTransaction, initialTransaction.amount, initialTransaction.currency, participantAccountIDs);
-            }
+        const isPolicyExpenseChat = participants?.some((participant) => participant.isPolicyExpenseChat);
+        if (iouType === CONST.IOU.TYPE.SPLIT && !isPolicyExpenseChat && initialTransaction?.amount && initialTransaction?.currency) {
+            const participantAccountIDs = participants?.map((participant) => participant.accountID) as number[];
+            setSplitShares(initialTransaction, initialTransaction.amount, initialTransaction.currency, participantAccountIDs);
+        }
 
-            const newReportID = selectedReportID.current;
-            const shouldUpdateTransactionReportID = participants?.at(0)?.reportID !== newReportID;
-            const transactionReportID = shouldAutoReport.current ? newReportID : CONST.REPORT.UNREPORTED_REPORT_ID;
-            // TODO: probably should also change participants here for selectedParticipants.current, but out of scope of this PR
+        const newReportID = selectedReportID.current;
+        const shouldUpdateTransactionReportID = participants?.at(0)?.reportID !== newReportID;
+        const transactionReportID = shouldAutoReport.current ? newReportID : CONST.REPORT.UNREPORTED_REPORT_ID;
+        // TODO: probably should also change participants here for selectedParticipants.current, but out of scope of this PR
+        for (const transaction of transactions) {
+            const tag = isMovingTransactionFromTrackExpense && transaction?.tag ? transaction?.tag : '';
+            setMoneyRequestTag(transaction.transactionID, tag);
+            const category = isMovingTransactionFromTrackExpense && transaction?.category ? transaction?.category : '';
+            setMoneyRequestCategory(transaction.transactionID, category, undefined);
+            if (shouldUpdateTransactionReportID) {
+                setTransactionReport(transaction.transactionID, {reportID: transactionReportID}, true);
+            }
+        }
+        if ((isCategorizing || isShareAction) && numberOfParticipants.current === 0) {
+            const {expenseChatReportID, policyID, policyName} = createDraftWorkspace(introSelected);
             for (const transaction of transactions) {
-                const tag = isMovingTransactionFromTrackExpense && transaction?.tag ? transaction?.tag : '';
-                setMoneyRequestTag(transaction.transactionID, tag);
-                const firstParticipant = _participants?.at(0);
-                const policy = isPolicyExpenseChat && firstParticipant?.policyID ? allPolicies?.[`${ONYXKEYS.COLLECTION.POLICY}${firstParticipant.policyID}`] : undefined;
-                const policyDistance = Object.values(policy?.customUnits ?? {}).find((customUnit) => customUnit.name === CONST.CUSTOM_UNITS.NAME_DISTANCE);
-                const defaultCategory = isDistanceRequest(transaction) && policyDistance?.defaultCategory ? policyDistance?.defaultCategory : '';
-                const category = isMovingTransactionFromTrackExpense ? (transaction?.category ?? '') : defaultCategory;
-                setMoneyRequestCategory(transaction.transactionID, category, isMovingTransactionFromTrackExpense ? policyForMovingExpenses : undefined, isMovingTransactionFromTrackExpense);
-                if (shouldUpdateTransactionReportID) {
-                    setTransactionReport(transaction.transactionID, {reportID: transactionReportID}, true);
-                }
+                setMoneyRequestParticipants(transaction.transactionID, [
+                    {
+                        selected: true,
+                        accountID: 0,
+                        isPolicyExpenseChat: true,
+                        reportID: expenseChatReportID,
+                        policyID,
+                        searchText: policyName,
+                    },
+                ]);
             }
-            if ((isCategorizing || isShareAction) && numberOfParticipants.current === 0) {
-                const {expenseChatReportID, policyID, policyName} = createDraftWorkspace(introSelected);
-                for (const transaction of transactions) {
-                    setMoneyRequestParticipants(transaction.transactionID, [
-                        {
-                            selected: true,
-                            accountID: 0,
-                            isPolicyExpenseChat: true,
-                            reportID: expenseChatReportID,
-                            policyID,
-                            searchText: policyName,
-                        },
-                    ]);
-                }
-                Navigation.setNavigationActionToMicrotaskQueue(() => {
-                    if (isCategorizing) {
-                        Navigation.navigate(ROUTES.MONEY_REQUEST_STEP_CATEGORY.getRoute(action, CONST.IOU.TYPE.SUBMIT, initialTransactionID, expenseChatReportID));
-                    } else {
-                        Navigation.navigate(ROUTES.MONEY_REQUEST_STEP_CONFIRMATION.getRoute(action, CONST.IOU.TYPE.SUBMIT, initialTransactionID, expenseChatReportID, undefined, true));
-                    }
-                });
-                return;
+            if (isCategorizing) {
+                Navigation.navigate(ROUTES.MONEY_REQUEST_STEP_CATEGORY.getRoute(action, CONST.IOU.TYPE.SUBMIT, initialTransactionID, expenseChatReportID));
+            } else {
+                Navigation.navigate(ROUTES.MONEY_REQUEST_STEP_CONFIRMATION.getRoute(action, CONST.IOU.TYPE.SUBMIT, initialTransactionID, expenseChatReportID, undefined, true));
             }
+            return;
+        }
 
-            const iouConfirmationPageRoute = ROUTES.MONEY_REQUEST_STEP_CONFIRMATION.getRoute(
-                action,
-                iouType === CONST.IOU.TYPE.CREATE || iouType === CONST.IOU.TYPE.TRACK ? CONST.IOU.TYPE.SUBMIT : iouType,
-                initialTransactionID,
-                newReportID,
-                undefined,
-                undefined,
-                action === CONST.IOU.ACTION.SHARE ? Navigation.getActiveRoute() : undefined,
-            );
+        const iouConfirmationPageRoute = ROUTES.MONEY_REQUEST_STEP_CONFIRMATION.getRoute(
+            action,
+            iouType === CONST.IOU.TYPE.CREATE || iouType === CONST.IOU.TYPE.TRACK ? CONST.IOU.TYPE.SUBMIT : iouType,
+            initialTransactionID,
+            newReportID,
+            undefined,
+            undefined,
+            action === CONST.IOU.ACTION.SHARE ? Navigation.getActiveRoute() : undefined,
+        );
 
-            const route = isCategorizing
-                ? ROUTES.MONEY_REQUEST_STEP_CATEGORY.getRoute(action, iouType, initialTransactionID, selectedReportID.current || reportID, iouConfirmationPageRoute)
-                : iouConfirmationPageRoute;
+        const route = isCategorizing
+            ? ROUTES.MONEY_REQUEST_STEP_CATEGORY.getRoute(action, iouType, initialTransactionID, selectedReportID.current || reportID, iouConfirmationPageRoute)
+            : iouConfirmationPageRoute;
 
-            Performance.markStart(CONST.TIMING.OPEN_CREATE_EXPENSE_APPROVE);
-            waitForKeyboardDismiss(() => {
-                // If the backTo parameter is set, we should navigate back to the confirmation screen that is already on the stack.
+        Performance.markStart(CONST.TIMING.OPEN_CREATE_EXPENSE_APPROVE);
+        waitForKeyboardDismiss(() => {
+            // If the backTo parameter is set, we should navigate back to the confirmation screen that is already on the stack.
+            if (backTo) {
+                // We don't want to compare params because we just changed the participants.
+                Navigation.goBack(route, {compareParams: false});
+            } else {
                 // We wrap navigation in setNavigationActionToMicrotaskQueue so that data loading in Onyx and navigation do not occur simultaneously, which resets the amount to 0.
                 // More information can be found here: https://github.com/Expensify/App/issues/73728
                 Navigation.setNavigationActionToMicrotaskQueue(() => {
-                    if (backTo) {
-                        // We don't want to compare params because we just changed the participants.
-                        Navigation.goBack(route, {compareParams: false});
-                    } else {
-                        Navigation.navigate(route);
-                    }
+                    Navigation.navigate(route);
                 });
-            });
-        },
-        [
-            action,
-            participants,
-            iouType,
-            initialTransaction,
-            initialTransactionID,
-            reportID,
-            waitForKeyboardDismiss,
-            transactions,
-            isMovingTransactionFromTrackExpense,
-            allPolicies,
-            policyForMovingExpenses,
-            introSelected,
-            backTo,
-        ],
-    );
+            }
+        });
+    }, [action, participants, iouType, initialTransaction, transactions, initialTransactionID, reportID, waitForKeyboardDismiss, isMovingTransactionFromTrackExpense, backTo, introSelected]);
 
     const navigateBack = useCallback(() => {
         if (backTo) {
@@ -441,16 +416,8 @@ function IOURequestStepParticipants({
     }, [isFocused, action]);
 
     const isWorkspacesOnly = useMemo(() => {
-        if (isDistanceRequest(initialTransaction)) {
-            // For distance requests, only restrict to workspaces if a route exists and the distance is 0
-            // If no route exists yet, the distance hasn't been calculated and we should allow P2P
-            if (!hasRoute(initialTransaction, true)) {
-                return false;
-            }
-            return initialTransaction?.comment?.customUnit?.quantity === 0;
-        }
-        return initialTransaction?.amount !== undefined && initialTransaction?.amount !== null && initialTransaction?.amount <= 0;
-    }, [initialTransaction]);
+        return !!(initialTransaction?.amount && initialTransaction?.amount < 0);
+    }, [initialTransaction?.amount]);
 
     return (
         <StepScreenWrapper
diff --git a/src/pages/iou/request/step/IOURequestStepReport.tsx b/src/pages/iou/request/step/IOURequestStepReport.tsx
index 74a0ec44640f..b9625fd07474 100644
--- a/src/pages/iou/request/step/IOURequestStepReport.tsx
+++ b/src/pages/iou/request/step/IOURequestStepReport.tsx
@@ -1,10 +1,11 @@
-import React, {useMemo} from 'react';
+import React from 'react';
 import {InteractionManager} from 'react-native';
 import type {OnyxEntry} from 'react-native-onyx';
-import {usePersonalDetails, useSession} from '@components/OnyxListItemProvider';
+import {useSession} from '@components/OnyxListItemProvider';
 import {useSearchContext} from '@components/Search/SearchContext';
 import type {ListItem} from '@components/SelectionListWithSections/types';
 import useConditionalCreateEmptyReportConfirmation from '@hooks/useConditionalCreateEmptyReportConfirmation';
+import useCurrentUserPersonalDetails from '@hooks/useCurrentUserPersonalDetails';
 import useOnyx from '@hooks/useOnyx';
 import usePermissions from '@hooks/usePermissions';
 import usePolicyForMovingExpenses from '@hooks/usePolicyForMovingExpenses';
@@ -14,15 +15,14 @@ import {createNewReport} from '@libs/actions/Report';
 import {changeTransactionsReport, setTransactionReport} from '@libs/actions/Transaction';
 import Navigation from '@libs/Navigation/Navigation';
 import {getPolicyByCustomUnitID} from '@libs/PolicyUtils';
-import {getOriginalMessage, isMoneyRequestAction} from '@libs/ReportActionsUtils';
-import {getPersonalDetailsForAccountID, getReportOrDraftReport, hasViolations as hasViolationsReportUtils, isPolicyExpenseChat, isReportOutstanding} from '@libs/ReportUtils';
+import {getReportOrDraftReport, hasViolations as hasViolationsReportUtils, isPolicyExpenseChat, isReportOutstanding} from '@libs/ReportUtils';
 import {shouldRestrictUserBillableActions} from '@libs/SubscriptionUtils';
 import {isPerDiemRequest} from '@libs/TransactionUtils';
 import CONST from '@src/CONST';
 import ONYXKEYS from '@src/ONYXKEYS';
 import ROUTES from '@src/ROUTES';
 import type SCREENS from '@src/SCREENS';
-import type {PersonalDetails, Report, ReportAction, ReportActions} from '@src/types/onyx';
+import type {Report} from '@src/types/onyx';
 import IOURequestEditReportCommon from './IOURequestEditReportCommon';
 import withFullTransactionOrNotFound from './withFullTransactionOrNotFound';
 import type {WithFullTransactionOrNotFoundProps} from './withFullTransactionOrNotFound';
@@ -36,10 +36,6 @@ type TransactionGroupListItem = ListItem & {
 
 type IOURequestStepReportProps = WithWritableReportOrNotFoundProps<typeof SCREENS.MONEY_REQUEST.STEP_REPORT> & WithFullTransactionOrNotFoundProps<typeof SCREENS.MONEY_REQUEST.STEP_REPORT>;
 
-const getIOUActionsSelector = (actions: OnyxEntry<ReportActions>): ReportAction[] => {
-    return Object.values(actions ?? {}).filter(isMoneyRequestAction);
-};
-
 function IOURequestStepReport({route, transaction}: IOURequestStepReportProps) {
     const {backTo, action, iouType, transactionID, reportID: reportIDFromRoute, reportActionID} = route.params;
     const [allReports] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}`, {canBeMissing: false});
@@ -50,27 +46,17 @@ function IOURequestStepReport({route, transaction}: IOURequestStepReportProps) {
     const shouldUseTransactionReport = (!!transactionReport && isReportOutstanding(transactionReport, transactionReport?.policyID)) || isUnreported;
     const outstandingReportID = isPolicyExpenseChat(participantReport) ? participantReport?.iouReportID : participantReportID;
     const selectedReportID = shouldUseTransactionReport ? transactionReport?.reportID : outstandingReportID;
-    const [selectedReport] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${selectedReportID}`, {canBeMissing: false});
     const [allPolicies] = useOnyx(ONYXKEYS.COLLECTION.POLICY, {canBeMissing: true});
     const [allPolicyCategories] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY_CATEGORIES}`, {canBeMissing: true});
     const {removeTransaction, setSelectedTransactions} = useSearchContext();
     const reportOrDraftReport = getReportOrDraftReport(reportIDFromRoute);
-    const [iouActions] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${reportOrDraftReport?.parentReportID}`, {canBeMissing: true, selector: getIOUActionsSelector});
     const isEditing = action === CONST.IOU.ACTION.EDIT;
     const isCreateReport = action === CONST.IOU.ACTION.CREATE;
     const isFromGlobalCreate = !!transaction?.isFromGlobalCreate;
     const {isBetaEnabled} = usePermissions();
     const isASAPSubmitBetaEnabled = isBetaEnabled(CONST.BETAS.ASAP_SUBMIT);
     const session = useSession();
-    const personalDetails = usePersonalDetails();
-    const ownerAccountID = useMemo(() => {
-        if (isUnreported) {
-            return iouActions?.find((iouAction) => getOriginalMessage(iouAction as ReportAction<typeof CONST.REPORT.ACTIONS.TYPE.IOU>)?.IOUTransactionID === transaction.transactionID)
-                ?.actorAccountID;
-        }
-        return selectedReport?.ownerAccountID;
-    }, [isUnreported, selectedReport?.ownerAccountID, iouActions, transaction?.transactionID]);
-    const ownerPersonalDetails = useMemo(() => getPersonalDetailsForAccountID(ownerAccountID, personalDetails) as PersonalDetails, [personalDetails, ownerAccountID]);
+    const currentUserPersonalDetails = useCurrentUserPersonalDetails();
     const {policyForMovingExpensesID, shouldSelectPolicy} = usePolicyForMovingExpenses(isPerDiemRequest(transaction));
     const [transactionViolations] = useOnyx(ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS, {canBeMissing: true});
     const [allTransactions] = useOnyx(ONYXKEYS.COLLECTION.TRANSACTION, {canBeMissing: true});
@@ -82,7 +68,7 @@ function IOURequestStepReport({route, transaction}: IOURequestStepReportProps) {
 
     const handleGoBack = () => {
         if (isEditing) {
-            Navigation.dismissToSuperWideRHP();
+            Navigation.dismissModal();
         } else {
             Navigation.goBack(backTo);
         }
@@ -147,7 +133,7 @@ function IOURequestStepReport({route, transaction}: IOURequestStepReportProps) {
                     policy: allPolicies?.[`${ONYXKEYS.COLLECTION.POLICY}${item.policyID}`],
                     reportNextStep: undefined,
                     policyCategories: allPolicyCategories?.[`${ONYXKEYS.COLLECTION.POLICY_CATEGORIES}${item.policyID}`],
-                    allTransactions,
+                    allTransactionsCollection: allTransactions,
                 });
                 removeTransaction(transaction.transactionID);
             }
@@ -181,7 +167,7 @@ function IOURequestStepReport({route, transaction}: IOURequestStepReportProps) {
         if (!transaction) {
             return;
         }
-        Navigation.dismissToSuperWideRHP();
+        Navigation.dismissModal();
         // eslint-disable-next-line @typescript-eslint/no-deprecated
         InteractionManager.runAfterInteractions(() => {
             changeTransactionsReport({
@@ -189,7 +175,7 @@ function IOURequestStepReport({route, transaction}: IOURequestStepReportProps) {
                 isASAPSubmitBetaEnabled,
                 accountID: session?.accountID ?? CONST.DEFAULT_NUMBER_ID,
                 email: session?.email ?? '',
-                allTransactions,
+                allTransactionsCollection: allTransactions,
             });
             removeTransaction(transaction.transactionID);
         });
@@ -204,7 +190,7 @@ function IOURequestStepReport({route, transaction}: IOURequestStepReportProps) {
         }
 
         const policyForNewReport = isPerDiemTransaction && perDiemOriginalPolicy ? perDiemOriginalPolicy : policyForMovingExpenses;
-        const optimisticReport = createNewReport(ownerPersonalDetails, hasViolations, isASAPSubmitBetaEnabled, policyForNewReport, false, shouldDismissEmptyReportsConfirmation);
+        const optimisticReport = createNewReport(currentUserPersonalDetails, hasViolations, isASAPSubmitBetaEnabled, policyForNewReport, false, shouldDismissEmptyReportsConfirmation);
         handleRegularReportSelection({value: optimisticReport.reportID}, optimisticReport);
     };
 
@@ -235,13 +221,6 @@ function IOURequestStepReport({route, transaction}: IOURequestStepReportProps) {
         handleCreateReport();
     };
 
-    let selectedPolicyID;
-    if (isPerDiemTransaction) {
-        selectedPolicyID = perDiemOriginalPolicy?.id;
-    } else {
-        selectedPolicyID = !isEditing && !isFromGlobalCreate ? reportOrDraftReport?.policyID : undefined;
-    }
-
     return (
         <>
             {CreateReportConfirmationModal}
@@ -250,14 +229,13 @@ function IOURequestStepReport({route, transaction}: IOURequestStepReportProps) {
                 selectReport={selectReport}
                 transactionIDs={transaction ? [transaction.transactionID] : []}
                 selectedReportID={selectedReportID}
-                selectedPolicyID={selectedPolicyID}
+                selectedPolicyID={!isEditing && !isFromGlobalCreate ? reportOrDraftReport?.policyID : undefined}
                 removeFromReport={removeFromReport}
                 isEditing={isEditing}
                 isUnreported={isUnreported}
                 shouldShowNotFoundPage={shouldShowNotFoundPage}
                 isPerDiemRequest={transaction ? isPerDiemRequest(transaction) : false}
                 createReport={action === CONST.IOU.ACTION.EDIT && (policyForMovingExpensesID || shouldSelectPolicy || isPerDiemTransaction) ? createReport : undefined}
-                targetOwnerAccountID={ownerAccountID}
             />
         </>
     );
diff --git a/src/pages/iou/request/step/IOURequestStepScan/index.native.tsx b/src/pages/iou/request/step/IOURequestStepScan/index.native.tsx
index bac2bb429b38..48d793c96d3e 100644
--- a/src/pages/iou/request/step/IOURequestStepScan/index.native.tsx
+++ b/src/pages/iou/request/step/IOURequestStepScan/index.native.tsx
@@ -6,6 +6,7 @@ import {Alert, AppState, InteractionManager, StyleSheet, View} from 'react-nativ
 import type {LayoutRectangle} from 'react-native';
 import ReactNativeBlobUtil from 'react-native-blob-util';
 import {Gesture, GestureDetector} from 'react-native-gesture-handler';
+import type {OnyxEntry} from 'react-native-onyx';
 import {RESULTS} from 'react-native-permissions';
 import Animated, {useAnimatedStyle, useSharedValue, withDelay, withSequence, withSpring, withTiming} from 'react-native-reanimated';
 import type {Camera, PhotoFile, Point} from 'react-native-vision-camera';
@@ -34,30 +35,49 @@ import usePersonalPolicy from '@hooks/usePersonalPolicy';
 import usePolicy from '@hooks/usePolicy';
 import useTheme from '@hooks/useTheme';
 import useThemeStyles from '@hooks/useThemeStyles';
-import {handleMoneyRequestStepScanParticipants} from '@libs/actions/IOU/MoneyRequest';
 import setTestReceipt from '@libs/actions/setTestReceipt';
+import {setTransactionReport} from '@libs/actions/Transaction';
 import {dismissProductTraining} from '@libs/actions/Welcome';
 import {showCameraPermissionsAlert} from '@libs/fileDownload/FileUtils';
 import getPhotoSource from '@libs/fileDownload/getPhotoSource';
+import getCurrentPosition from '@libs/getCurrentPosition';
 import getPlatform from '@libs/getPlatform';
 import type Platform from '@libs/getPlatform/types';
 import getReceiptsUploadFolderPath from '@libs/getReceiptsUploadFolderPath';
 import HapticFeedback from '@libs/HapticFeedback';
+import {navigateToParticipantPage} from '@libs/IOUUtils';
 import Log from '@libs/Log';
 import Navigation from '@libs/Navigation/Navigation';
 import navigationRef from '@libs/Navigation/navigationRef';
-import {isArchivedReport, isPolicyExpenseChat} from '@libs/ReportUtils';
+import {getManagerMcTestParticipant, getParticipantsOption, getReportOption} from '@libs/OptionsListUtils';
+import {isPaidGroupPolicy} from '@libs/PolicyUtils';
+import {findSelfDMReportID, generateReportID, getPolicyExpenseChat, isArchivedReport, isPolicyExpenseChat} from '@libs/ReportUtils';
+import {shouldRestrictUserBillableActions} from '@libs/SubscriptionUtils';
 import {getDefaultTaxCode, shouldReuseInitialTransaction} from '@libs/TransactionUtils';
 import StepScreenWrapper from '@pages/iou/request/step/StepScreenWrapper';
 import withFullTransactionOrNotFound from '@pages/iou/request/step/withFullTransactionOrNotFound';
 import withWritableReportOrNotFound from '@pages/iou/request/step/withWritableReportOrNotFound';
-import {replaceReceipt, setMoneyRequestReceipt, updateLastLocationPermissionPrompt} from '@userActions/IOU';
+import {
+    getMoneyRequestParticipantsFromReport,
+    replaceReceipt,
+    requestMoney,
+    setMoneyRequestParticipants,
+    setMoneyRequestParticipantsFromReport,
+    setMoneyRequestReceipt,
+    startSplitBill,
+    trackExpense,
+    updateLastLocationPermissionPrompt,
+} from '@userActions/IOU';
+import type {GpsPoint} from '@userActions/IOU';
 import {buildOptimisticTransactionAndCreateDraft, removeDraftTransactions, removeTransactionReceipt} from '@userActions/TransactionEdit';
 import CONST from '@src/CONST';
 import ONYXKEYS from '@src/ONYXKEYS';
 import type {Route} from '@src/ROUTES';
 import ROUTES from '@src/ROUTES';
+import type {Policy} from '@src/types/onyx';
+import type {Participant} from '@src/types/onyx/IOU';
 import type Transaction from '@src/types/onyx/Transaction';
+import type {Receipt} from '@src/types/onyx/Transaction';
 import type {FileObject} from '@src/types/utils/Attachment';
 import {getEmptyObject} from '@src/types/utils/EmptyObject';
 import CameraPermission from './CameraPermission';
@@ -96,7 +116,6 @@ function IOURequestStepScan({
     const [startLocationPermissionFlow, setStartLocationPermissionFlow] = useState(false);
     const [receiptFiles, setReceiptFiles] = useState<ReceiptFile[]>([]);
     const [reportNameValuePairs] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS}${report?.reportID}`, {canBeMissing: true});
-    const isArchived = isArchivedReport(reportNameValuePairs);
     const policy = usePolicy(report?.policyID);
     const personalPolicy = usePersonalPolicy();
     const [personalDetails] = useOnyx(ONYXKEYS.PERSONAL_DETAILS_LIST, {canBeMissing: false});
@@ -136,6 +155,8 @@ function IOURequestStepScan({
 
     const shouldAcceptMultipleFiles = !isEditing && !backTo;
 
+    const selfDMReportID = useMemo(() => findSelfDMReportID(), []);
+
     const blinkOpacity = useSharedValue(0);
     const blinkStyle = useAnimatedStyle(() => ({
         opacity: blinkOpacity.get(),
@@ -157,8 +178,8 @@ function IOURequestStepScan({
             return false;
         }
 
-        return !isArchived && !(isPolicyExpenseChat(report) && ((policy?.requiresCategory ?? false) || (policy?.requiresTag ?? false)));
-    }, [report, skipConfirmation, policy?.requiresCategory, policy?.requiresTag, isArchived]);
+        return !isArchivedReport(reportNameValuePairs) && !(isPolicyExpenseChat(report) && ((policy?.requiresCategory ?? false) || (policy?.requiresTag ?? false)));
+    }, [report, skipConfirmation, policy?.requiresCategory, policy?.requiresTag, reportNameValuePairs]);
 
     const {translate} = useLocalize();
 
@@ -256,76 +277,292 @@ function IOURequestStepScan({
         Navigation.goBack();
     };
 
+    const navigateToConfirmationPage = useCallback(
+        (isTestTransaction = false, reportIDParam: string | undefined = undefined) => {
+            switch (iouType) {
+                case CONST.IOU.TYPE.REQUEST:
+                    Navigation.navigate(ROUTES.MONEY_REQUEST_STEP_CONFIRMATION.getRoute(CONST.IOU.ACTION.CREATE, CONST.IOU.TYPE.SUBMIT, initialTransactionID, reportID, backToReport));
+                    break;
+                case CONST.IOU.TYPE.SEND:
+                    Navigation.navigate(ROUTES.MONEY_REQUEST_STEP_CONFIRMATION.getRoute(CONST.IOU.ACTION.CREATE, CONST.IOU.TYPE.PAY, initialTransactionID, reportID));
+                    break;
+                default:
+                    Navigation.navigate(
+                        ROUTES.MONEY_REQUEST_STEP_CONFIRMATION.getRoute(
+                            CONST.IOU.ACTION.CREATE,
+                            isTestTransaction ? CONST.IOU.TYPE.SUBMIT : iouType,
+                            initialTransactionID,
+                            // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
+                            reportIDParam || reportID,
+                            backToReport,
+                        ),
+                    );
+            }
+        },
+        [backToReport, iouType, reportID, initialTransactionID],
+    );
+
+    const createTransaction = useCallback(
+        (
+            files: ReceiptFile[],
+            participant: Participant,
+            gpsPoint?: GpsPoint,
+            policyParams?: {
+                policy: OnyxEntry<Policy>;
+            },
+            billable?: boolean,
+            reimbursable = true,
+        ) => {
+            for (const [index, receiptFile] of files.entries()) {
+                const transaction = transactions.find((item) => item.transactionID === receiptFile.transactionID);
+                const receipt: Receipt = receiptFile.file ?? {};
+                receipt.source = receiptFile.source;
+                receipt.state = CONST.IOU.RECEIPT_STATE.SCAN_READY;
+                if (iouType === CONST.IOU.TYPE.TRACK && report) {
+                    trackExpense({
+                        report,
+                        isDraftPolicy: false,
+                        participantParams: {
+                            payeeEmail: currentUserPersonalDetails.login,
+                            payeeAccountID: currentUserPersonalDetails.accountID,
+                            participant,
+                        },
+                        transactionParams: {
+                            amount: 0,
+                            currency: transaction?.currency ?? 'USD',
+                            created: transaction?.created,
+                            receipt,
+                            billable,
+                            reimbursable,
+                            gpsPoint,
+                        },
+                        ...(policyParams ?? {}),
+                        shouldHandleNavigation: index === files.length - 1,
+                        isASAPSubmitBetaEnabled,
+                        currentUserAccountIDParam: currentUserPersonalDetails.accountID,
+                        currentUserEmailParam: currentUserPersonalDetails.email ?? '',
+                        introSelected,
+                        activePolicyID,
+                        quickAction,
+                    });
+                } else {
+                    requestMoney({
+                        report,
+                        participantParams: {
+                            payeeEmail: currentUserPersonalDetails.login,
+                            payeeAccountID: currentUserPersonalDetails.accountID,
+                            participant,
+                        },
+                        ...(policyParams ?? {}),
+                        gpsPoint,
+                        transactionParams: {
+                            amount: 0,
+                            attendees: transaction?.comment?.attendees,
+                            currency: transaction?.currency ?? 'USD',
+                            created: transaction?.created ?? '',
+                            merchant: '',
+                            receipt,
+                            billable,
+                        },
+                        shouldHandleNavigation: index === files.length - 1,
+                        backToReport,
+                        shouldGenerateTransactionThreadReport,
+                        isASAPSubmitBetaEnabled,
+                        currentUserAccountIDParam: currentUserPersonalDetails.accountID,
+                        currentUserEmailParam: currentUserPersonalDetails.email ?? '',
+                        transactionViolations,
+                        quickAction,
+                        policyRecentlyUsedCurrencies: policyRecentlyUsedCurrencies ?? [],
+                    });
+                }
+            }
+        },
+        [
+            transactions,
+            iouType,
+            report,
+            currentUserPersonalDetails.login,
+            currentUserPersonalDetails.email,
+            currentUserPersonalDetails.accountID,
+            backToReport,
+            shouldGenerateTransactionThreadReport,
+            isASAPSubmitBetaEnabled,
+            transactionViolations,
+            introSelected,
+            activePolicyID,
+            quickAction,
+            policyRecentlyUsedCurrencies,
+        ],
+    );
+
     const navigateToConfirmationStep = useCallback(
         (files: ReceiptFile[], locationPermissionGranted = false, isTestTransaction = false) => {
-            handleMoneyRequestStepScanParticipants({
-                iouType,
-                policy,
-                report,
-                reportID,
-                reportAttributesDerived,
-                transactions,
-                initialTransaction: {
-                    transactionID: initialTransactionID,
-                    reportID: initialTransaction?.reportID,
-                    taxCode: transactionTaxCode,
-                    taxAmount: transactionTaxAmount,
-                    currency: initialTransaction?.currency,
-                    isFromGlobalCreate: initialTransaction?.isFromGlobalCreate,
-                    participants: initialTransaction?.participants,
-                },
-                personalDetails,
-                currentUserLogin: currentUserPersonalDetails.login,
-                currentUserAccountID: currentUserPersonalDetails.accountID,
-                backTo,
-                backToReport,
-                shouldSkipConfirmation,
-                defaultExpensePolicy,
-                shouldGenerateTransactionThreadReport,
-                isArchivedExpenseReport: isArchived,
-                isAutoReporting: !!personalPolicy?.autoReporting,
-                isASAPSubmitBetaEnabled,
-                transactionViolations,
-                quickAction,
-                policyRecentlyUsedCurrencies,
-                introSelected,
-                activePolicyID,
-                privateIsArchived: reportNameValuePairs?.private_isArchived,
-                files,
-                isTestTransaction,
-                locationPermissionGranted,
-            });
+            if (backTo) {
+                Navigation.goBack(backTo);
+                return;
+            }
+
+            if (isTestTransaction) {
+                const managerMcTestParticipant = getManagerMcTestParticipant() ?? {};
+                let reportIDParam = managerMcTestParticipant.reportID;
+                if (!managerMcTestParticipant.reportID && report?.reportID) {
+                    reportIDParam = generateReportID();
+                }
+                setMoneyRequestParticipants(
+                    initialTransactionID,
+                    [
+                        {
+                            ...managerMcTestParticipant,
+                            reportID: reportIDParam,
+                            selected: true,
+                        },
+                    ],
+                    true,
+                ).then(() => {
+                    navigateToConfirmationPage(true, reportIDParam);
+                });
+                return;
+            }
+
+            // If the user started this flow from using the + button in the composer inside a report
+            // the participants can be automatically assigned from the report and the user can skip the participants step and go straight
+            // to the confirmation step.
+            // If the user is started this flow using the Create expense option (combined submit/track flow), they should be redirected to the participants page.
+            if (!initialTransaction?.isFromGlobalCreate && !isArchivedReport(reportNameValuePairs) && iouType !== CONST.IOU.TYPE.CREATE) {
+                const selectedParticipants = getMoneyRequestParticipantsFromReport(report, currentUserPersonalDetails.accountID);
+                const participants = selectedParticipants.map((participant) => {
+                    const participantAccountID = participant?.accountID ?? CONST.DEFAULT_NUMBER_ID;
+                    return participantAccountID ? getParticipantsOption(participant, personalDetails) : getReportOption(participant, reportAttributesDerived);
+                });
+
+                if (shouldSkipConfirmation) {
+                    const firstReceiptFile = files.at(0);
+                    if (iouType === CONST.IOU.TYPE.SPLIT && firstReceiptFile) {
+                        const splitReceipt: Receipt = firstReceiptFile.file ?? {};
+                        splitReceipt.source = firstReceiptFile.source;
+                        splitReceipt.state = CONST.IOU.RECEIPT_STATE.SCAN_READY;
+                        startSplitBill({
+                            participants,
+                            currentUserLogin: currentUserPersonalDetails?.login ?? '',
+                            currentUserAccountID: currentUserPersonalDetails.accountID,
+                            comment: '',
+                            receipt: splitReceipt,
+                            existingSplitChatReportID: reportID,
+                            billable: false,
+                            category: '',
+                            tag: '',
+                            currency: initialTransaction?.currency ?? 'USD',
+                            taxCode: transactionTaxCode,
+                            taxAmount: transactionTaxAmount,
+                            quickAction,
+                            policyRecentlyUsedCurrencies: policyRecentlyUsedCurrencies ?? [],
+                            // No need to update recently used tags because no tags are used when the confirmation step is skipped
+                            policyRecentlyUsedTags: undefined,
+                        });
+                        return;
+                    }
+                    const participant = participants.at(0);
+                    if (!participant) {
+                        return;
+                    }
+                    if (locationPermissionGranted) {
+                        getCurrentPosition(
+                            (successData) => {
+                                const policyParams = {policy};
+                                const gpsPoint = {
+                                    lat: successData.coords.latitude,
+                                    long: successData.coords.longitude,
+                                };
+                                createTransaction(files, participant, gpsPoint, policyParams, false);
+                            },
+                            (errorData) => {
+                                Log.info('[IOURequestStepScan] getCurrentPosition failed', false, errorData);
+                                // When there is an error, the money can still be requested, it just won't include the GPS coordinates
+                                createTransaction(files, participant);
+                            },
+                        );
+                        return;
+                    }
+                    createTransaction(files, participant);
+                    return;
+                }
+
+                const setParticipantsPromises = files.map((receiptFile) => setMoneyRequestParticipantsFromReport(receiptFile.transactionID, report, currentUserPersonalDetails.accountID));
+                Promise.all(setParticipantsPromises).then(() => navigateToConfirmationPage());
+                return;
+            }
+
+            // If there was no reportID, then that means the user started this flow from the global + menu
+            // and an optimistic reportID was generated. In that case, the next step is to select the participants for this expense.
+            if (
+                iouType === CONST.IOU.TYPE.CREATE &&
+                isPaidGroupPolicy(defaultExpensePolicy) &&
+                defaultExpensePolicy?.isPolicyExpenseChatEnabled &&
+                !shouldRestrictUserBillableActions(defaultExpensePolicy.id)
+            ) {
+                const activePolicyExpenseChat = getPolicyExpenseChat(currentUserPersonalDetails.accountID, defaultExpensePolicy?.id);
+                const shouldAutoReport = !!defaultExpensePolicy?.autoReporting || !!personalPolicy?.autoReporting;
+                const transactionReportID = shouldAutoReport ? activePolicyExpenseChat?.reportID : CONST.REPORT.UNREPORTED_REPORT_ID;
+
+                // If the initial transaction has different participants selected that means that the user has changed the participant in the confirmation step
+                if (initialTransaction?.participants && initialTransaction?.participants?.at(0)?.reportID !== activePolicyExpenseChat?.reportID) {
+                    const isTrackExpense = initialTransaction?.participants?.at(0)?.reportID === selfDMReportID;
+
+                    const setParticipantsPromises = files.map((receiptFile) => setMoneyRequestParticipants(receiptFile.transactionID, initialTransaction?.participants));
+                    Promise.all(setParticipantsPromises).then(() => {
+                        if (isTrackExpense) {
+                            Navigation.navigate(ROUTES.MONEY_REQUEST_STEP_CONFIRMATION.getRoute(CONST.IOU.ACTION.CREATE, CONST.IOU.TYPE.TRACK, initialTransactionID, selfDMReportID));
+                        } else {
+                            navigateToConfirmationPage(iouType === CONST.IOU.TYPE.CREATE, initialTransaction?.reportID);
+                        }
+                    });
+                    return;
+                }
+
+                const setParticipantsPromises = files.map((receiptFile) => {
+                    setTransactionReport(receiptFile.transactionID, {reportID: transactionReportID}, true);
+                    return setMoneyRequestParticipantsFromReport(receiptFile.transactionID, activePolicyExpenseChat, currentUserPersonalDetails.accountID);
+                });
+                Promise.all(setParticipantsPromises).then(() =>
+                    Navigation.navigate(
+                        ROUTES.MONEY_REQUEST_STEP_CONFIRMATION.getRoute(
+                            CONST.IOU.ACTION.CREATE,
+                            iouType === CONST.IOU.TYPE.CREATE ? CONST.IOU.TYPE.SUBMIT : iouType,
+                            initialTransactionID,
+                            activePolicyExpenseChat?.reportID,
+                        ),
+                    ),
+                );
+            } else {
+                navigateToParticipantPage(iouType, initialTransactionID, reportID);
+            }
         },
         [
             backTo,
-            backToReport,
-            shouldGenerateTransactionThreadReport,
-            transactions,
             initialTransaction?.isFromGlobalCreate,
             initialTransaction?.currency,
             initialTransaction?.participants,
             initialTransaction?.reportID,
-            isArchived,
+            reportNameValuePairs,
             iouType,
             defaultExpensePolicy,
             report,
             initialTransactionID,
+            navigateToConfirmationPage,
             currentUserPersonalDetails.accountID,
             currentUserPersonalDetails?.login,
             shouldSkipConfirmation,
             personalDetails,
             reportAttributesDerived,
+            createTransaction,
             reportID,
             transactionTaxCode,
             transactionTaxAmount,
             quickAction,
             policy,
             personalPolicy?.autoReporting,
-            isASAPSubmitBetaEnabled,
-            transactionViolations,
+            selfDMReportID,
             policyRecentlyUsedCurrencies,
-            introSelected,
-            activePolicyID,
         ],
     );
 
diff --git a/src/pages/iou/request/step/IOURequestStepScan/index.tsx b/src/pages/iou/request/step/IOURequestStepScan/index.tsx
index d87664bd01a3..6924b9ab7c83 100644
--- a/src/pages/iou/request/step/IOURequestStepScan/index.tsx
+++ b/src/pages/iou/request/step/IOURequestStepScan/index.tsx
@@ -4,6 +4,7 @@ import {transactionDraftValuesSelector} from '@selectors/TransactionDraft';
 import React, {useCallback, useContext, useEffect, useMemo, useReducer, useRef, useState} from 'react';
 import type {LayoutRectangle} from 'react-native';
 import {InteractionManager, PanResponder, StyleSheet, View} from 'react-native';
+import type {OnyxEntry} from 'react-native-onyx';
 import {RESULTS} from 'react-native-permissions';
 import Animated, {useAnimatedStyle, useSharedValue, withTiming} from 'react-native-reanimated';
 import type Webcam from 'react-webcam';
@@ -34,24 +35,46 @@ import usePolicy from '@hooks/usePolicy';
 import useResponsiveLayout from '@hooks/useResponsiveLayout';
 import useTheme from '@hooks/useTheme';
 import useThemeStyles from '@hooks/useThemeStyles';
-import {handleMoneyRequestStepScanParticipants} from '@libs/actions/IOU/MoneyRequest';
 import setTestReceipt from '@libs/actions/setTestReceipt';
+import {setTransactionReport} from '@libs/actions/Transaction';
 import {clearUserLocation, setUserLocation} from '@libs/actions/UserLocation';
 import {dismissProductTraining} from '@libs/actions/Welcome';
 import {isMobile, isMobileWebKit} from '@libs/Browser';
 import {base64ToFile, isLocalFile as isLocalFileFileUtils} from '@libs/fileDownload/FileUtils';
 import getCurrentPosition from '@libs/getCurrentPosition';
+import {navigateToParticipantPage} from '@libs/IOUUtils';
+import Log from '@libs/Log';
 import Navigation from '@libs/Navigation/Navigation';
-import {isArchivedReport, isPolicyExpenseChat} from '@libs/ReportUtils';
+import {getManagerMcTestParticipant, getParticipantsOption, getReportOption} from '@libs/OptionsListUtils';
+import {isPaidGroupPolicy} from '@libs/PolicyUtils';
+import {findSelfDMReportID, generateReportID, getPolicyExpenseChat, isArchivedReport, isPolicyExpenseChat} from '@libs/ReportUtils';
+import {shouldRestrictUserBillableActions} from '@libs/SubscriptionUtils';
 import {getDefaultTaxCode, hasReceipt, shouldReuseInitialTransaction} from '@libs/TransactionUtils';
 import StepScreenDragAndDropWrapper from '@pages/iou/request/step/StepScreenDragAndDropWrapper';
 import withFullTransactionOrNotFound from '@pages/iou/request/step/withFullTransactionOrNotFound';
 import withWritableReportOrNotFound from '@pages/iou/request/step/withWritableReportOrNotFound';
-import {checkIfScanFileCanBeRead, replaceReceipt, setMoneyRequestReceipt, updateLastLocationPermissionPrompt} from '@userActions/IOU';
+import type {GpsPoint} from '@userActions/IOU';
+import {
+    checkIfScanFileCanBeRead,
+    getMoneyRequestParticipantsFromReport,
+    replaceReceipt,
+    requestMoney,
+    setMoneyRequestParticipants,
+    setMoneyRequestParticipantsFromReport,
+    setMoneyRequestReceipt,
+    setMultipleMoneyRequestParticipantsFromReport,
+    startSplitBill,
+    trackExpense,
+    updateLastLocationPermissionPrompt,
+} from '@userActions/IOU';
 import {buildOptimisticTransactionAndCreateDraft, removeDraftTransactions, removeTransactionReceipt} from '@userActions/TransactionEdit';
 import CONST from '@src/CONST';
 import ONYXKEYS from '@src/ONYXKEYS';
+import ROUTES from '@src/ROUTES';
+import type {Policy} from '@src/types/onyx';
+import type {Participant} from '@src/types/onyx/IOU';
 import type Transaction from '@src/types/onyx/Transaction';
+import type {Receipt} from '@src/types/onyx/Transaction';
 import type {FileObject} from '@src/types/utils/Attachment';
 import {isEmptyObject} from '@src/types/utils/EmptyObject';
 import {cropImageToAspectRatio} from './cropImageToAspectRatio';
@@ -95,7 +118,6 @@ function IOURequestStepScan({
 
     const getScreenshotTimeoutRef = useRef<NodeJS.Timeout | null>(null);
     const [reportNameValuePairs] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS}${report?.reportID}`, {canBeMissing: true});
-    const isArchived = isArchivedReport(reportNameValuePairs);
     const policy = usePolicy(report?.policyID);
     const personalPolicy = usePersonalPolicy();
     const [personalDetails] = useOnyx(ONYXKEYS.PERSONAL_DETAILS_LIST, {canBeMissing: false});
@@ -135,6 +157,8 @@ function IOURequestStepScan({
 
     const shouldAcceptMultipleFiles = !isEditing && !backTo;
 
+    const selfDMReportID = useMemo(() => findSelfDMReportID(), []);
+
     const isASAPSubmitBetaEnabled = isBetaEnabled(CONST.BETAS.ASAP_SUBMIT);
 
     const blinkOpacity = useSharedValue(0);
@@ -157,8 +181,8 @@ function IOURequestStepScan({
             return false;
         }
 
-        return !isArchived && !(isPolicyExpenseChat(report) && ((policy?.requiresCategory ?? false) || (policy?.requiresTag ?? false)));
-    }, [report, skipConfirmation, policy?.requiresCategory, policy?.requiresTag, isArchived]);
+        return !isArchivedReport(reportNameValuePairs) && !(isPolicyExpenseChat(report) && ((policy?.requiresCategory ?? false) || (policy?.requiresTag ?? false)));
+    }, [report, skipConfirmation, policy?.requiresCategory, policy?.requiresTag, reportNameValuePairs]);
 
     /**
      * On phones that have ultra-wide lens, react-webcam uses ultra-wide by default.
@@ -309,65 +333,284 @@ function IOURequestStepScan({
         Navigation.goBack(backTo);
     }, [backTo]);
 
+    const navigateToConfirmationPage = useCallback(
+        (shouldNavigateToSubmit = false, reportIDParam: string | undefined = undefined) => {
+            switch (iouType) {
+                case CONST.IOU.TYPE.REQUEST:
+                    Navigation.navigate(ROUTES.MONEY_REQUEST_STEP_CONFIRMATION.getRoute(CONST.IOU.ACTION.CREATE, CONST.IOU.TYPE.SUBMIT, initialTransactionID, reportID, backToReport));
+                    break;
+                case CONST.IOU.TYPE.SEND:
+                    Navigation.navigate(ROUTES.MONEY_REQUEST_STEP_CONFIRMATION.getRoute(CONST.IOU.ACTION.CREATE, CONST.IOU.TYPE.PAY, initialTransactionID, reportID));
+                    break;
+                default:
+                    Navigation.navigate(
+                        ROUTES.MONEY_REQUEST_STEP_CONFIRMATION.getRoute(
+                            CONST.IOU.ACTION.CREATE,
+                            shouldNavigateToSubmit ? CONST.IOU.TYPE.SUBMIT : iouType,
+                            initialTransactionID,
+                            // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
+                            reportIDParam || reportID,
+                            backToReport,
+                        ),
+                    );
+            }
+        },
+        [backToReport, iouType, reportID, initialTransactionID],
+    );
+
+    const createTransaction = useCallback(
+        (
+            files: ReceiptFile[],
+            participant: Participant,
+            gpsPoint?: GpsPoint,
+            policyParams?: {
+                policy: OnyxEntry<Policy>;
+            },
+            billable?: boolean,
+            reimbursable = true,
+        ) => {
+            for (const [index, receiptFile] of files.entries()) {
+                const transaction = transactions.find((item) => item.transactionID === receiptFile.transactionID);
+                const receipt: Receipt = receiptFile.file ?? {};
+                receipt.source = receiptFile.source;
+                receipt.state = CONST.IOU.RECEIPT_STATE.SCAN_READY;
+                if (iouType === CONST.IOU.TYPE.TRACK && report) {
+                    trackExpense({
+                        report,
+                        isDraftPolicy: false,
+                        participantParams: {
+                            payeeEmail: currentUserPersonalDetails.login,
+                            payeeAccountID: currentUserPersonalDetails.accountID,
+                            participant,
+                        },
+                        transactionParams: {
+                            amount: 0,
+                            currency: transaction?.currency ?? 'USD',
+                            created: transaction?.created,
+                            receipt,
+                            billable,
+                            reimbursable,
+                            gpsPoint,
+                        },
+                        ...(policyParams ?? {}),
+                        shouldHandleNavigation: index === files.length - 1,
+                        isASAPSubmitBetaEnabled,
+                        currentUserAccountIDParam: currentUserPersonalDetails.accountID,
+                        currentUserEmailParam: currentUserPersonalDetails.email ?? '',
+                        introSelected,
+                        activePolicyID,
+                        quickAction,
+                    });
+                } else {
+                    requestMoney({
+                        report,
+                        participantParams: {
+                            payeeEmail: currentUserPersonalDetails.login,
+                            payeeAccountID: currentUserPersonalDetails.accountID,
+                            participant,
+                        },
+                        ...(policyParams ?? {}),
+                        gpsPoint,
+                        transactionParams: {
+                            amount: 0,
+                            attendees: transaction?.comment?.attendees,
+                            currency: transaction?.currency ?? 'USD',
+                            created: transaction?.created ?? '',
+                            merchant: '',
+                            receipt,
+                            billable,
+                            reimbursable,
+                        },
+                        shouldHandleNavigation: index === files.length - 1,
+                        backToReport,
+                        shouldGenerateTransactionThreadReport,
+                        isASAPSubmitBetaEnabled,
+                        currentUserAccountIDParam: currentUserPersonalDetails.accountID,
+                        currentUserEmailParam: currentUserPersonalDetails.email ?? '',
+                        transactionViolations,
+                        quickAction,
+                        policyRecentlyUsedCurrencies: policyRecentlyUsedCurrencies ?? [],
+                    });
+                }
+            }
+        },
+        [
+            backToReport,
+            currentUserPersonalDetails.accountID,
+            currentUserPersonalDetails.email,
+            currentUserPersonalDetails.login,
+            iouType,
+            report,
+            transactions,
+            shouldGenerateTransactionThreadReport,
+            isASAPSubmitBetaEnabled,
+            transactionViolations,
+            introSelected,
+            activePolicyID,
+            quickAction,
+            policyRecentlyUsedCurrencies,
+        ],
+    );
+
     const navigateToConfirmationStep = useCallback(
         (files: ReceiptFile[], locationPermissionGranted = false, isTestTransaction = false) => {
-            handleMoneyRequestStepScanParticipants({
-                iouType,
-                policy,
-                report,
-                reportID,
-                reportAttributesDerived,
-                transactions,
-                initialTransaction: {
-                    transactionID: initialTransactionID,
-                    reportID: initialTransaction?.reportID,
-                    taxCode: transactionTaxCode,
-                    taxAmount: transactionTaxAmount,
-                    currency: initialTransaction?.currency,
-                    isFromGlobalCreate: initialTransaction?.isFromGlobalCreate,
-                    participants: initialTransaction?.participants,
-                },
-                personalDetails,
-                currentUserLogin: currentUserPersonalDetails.login,
-                currentUserAccountID: currentUserPersonalDetails.accountID,
-                backTo,
-                backToReport,
-                shouldSkipConfirmation,
-                defaultExpensePolicy,
-                shouldGenerateTransactionThreadReport,
-                isArchivedExpenseReport: isArchived,
-                isAutoReporting: !!personalPolicy?.autoReporting,
-                isASAPSubmitBetaEnabled,
-                transactionViolations,
-                quickAction,
-                policyRecentlyUsedCurrencies,
-                introSelected,
-                activePolicyID,
-                privateIsArchived: reportNameValuePairs?.private_isArchived,
-                files,
-                isTestTransaction,
-                locationPermissionGranted,
-            });
+            if (backTo) {
+                Navigation.goBack(backTo);
+                return;
+            }
+
+            if (isTestTransaction) {
+                const managerMcTestParticipant = getManagerMcTestParticipant() ?? {};
+                let reportIDParam = managerMcTestParticipant.reportID;
+                if (!managerMcTestParticipant.reportID && report?.reportID) {
+                    reportIDParam = generateReportID();
+                }
+                setMoneyRequestParticipants(
+                    initialTransactionID,
+                    [
+                        {
+                            ...managerMcTestParticipant,
+                            reportID: reportIDParam,
+                            selected: true,
+                        },
+                    ],
+                    true,
+                ).then(() => {
+                    navigateToConfirmationPage(true, reportIDParam);
+                });
+                return;
+            }
+
+            // If the user started this flow from using the + button in the composer inside a report
+            // the participants can be automatically assigned from the report and the user can skip the participants step and go straight
+            // to the confirmation step.
+            // If the user is started this flow using the Create expense option (combined submit/track flow), they should be redirected to the participants page.
+            if (!initialTransaction?.isFromGlobalCreate && !isArchivedReport(reportNameValuePairs) && iouType !== CONST.IOU.TYPE.CREATE) {
+                const selectedParticipants = getMoneyRequestParticipantsFromReport(report, currentUserPersonalDetails.accountID);
+                const participants = selectedParticipants.map((participant) => {
+                    const participantAccountID = participant?.accountID ?? CONST.DEFAULT_NUMBER_ID;
+                    return participantAccountID ? getParticipantsOption(participant, personalDetails) : getReportOption(participant, reportAttributesDerived);
+                });
+
+                if (shouldSkipConfirmation) {
+                    const firstReceiptFile = files.at(0);
+                    if (iouType === CONST.IOU.TYPE.SPLIT && firstReceiptFile) {
+                        const splitReceipt: Receipt = firstReceiptFile.file ?? {};
+                        splitReceipt.source = firstReceiptFile.source;
+                        splitReceipt.state = CONST.IOU.RECEIPT_STATE.SCAN_READY;
+                        startSplitBill({
+                            participants,
+                            currentUserLogin: currentUserPersonalDetails?.login ?? '',
+                            currentUserAccountID: currentUserPersonalDetails.accountID,
+                            comment: '',
+                            receipt: splitReceipt,
+                            existingSplitChatReportID: reportID,
+                            billable: false,
+                            category: '',
+                            tag: '',
+                            currency: initialTransaction?.currency ?? 'USD',
+                            taxCode: transactionTaxCode,
+                            taxAmount: transactionTaxAmount,
+                            quickAction,
+                            policyRecentlyUsedCurrencies: policyRecentlyUsedCurrencies ?? [],
+                            // No need to update recently used tags because no tags are used when the confirmation step is skipped
+                            policyRecentlyUsedTags: undefined,
+                        });
+                        return;
+                    }
+                    const participant = participants.at(0);
+                    if (!participant) {
+                        return;
+                    }
+                    if (locationPermissionGranted) {
+                        getCurrentPosition(
+                            (successData) => {
+                                const policyParams = {policy};
+                                const gpsPoint = {
+                                    lat: successData.coords.latitude,
+                                    long: successData.coords.longitude,
+                                };
+                                createTransaction(files, participant, gpsPoint, policyParams, false, true);
+                            },
+                            (errorData) => {
+                                Log.info('[IOURequestStepScan] getCurrentPosition failed', false, errorData);
+                                // When there is an error, the money can still be requested, it just won't include the GPS coordinates
+                                createTransaction(files, participant);
+                            },
+                        );
+                        return;
+                    }
+                    createTransaction(files, participant);
+                    return;
+                }
+                const transactionIDs = files.map((receiptFile) => receiptFile.transactionID);
+                setMultipleMoneyRequestParticipantsFromReport(transactionIDs, report, currentUserPersonalDetails.accountID).then(() => navigateToConfirmationPage());
+                return;
+            }
+
+            // If there was no reportID, then that means the user started this flow from the global + menu
+            // and an optimistic reportID was generated. In that case, the next step is to select the participants for this expense.
+            if (
+                iouType === CONST.IOU.TYPE.CREATE &&
+                isPaidGroupPolicy(defaultExpensePolicy) &&
+                defaultExpensePolicy?.isPolicyExpenseChatEnabled &&
+                !shouldRestrictUserBillableActions(defaultExpensePolicy.id)
+            ) {
+                const activePolicyExpenseChat = getPolicyExpenseChat(currentUserPersonalDetails.accountID, defaultExpensePolicy?.id);
+                const shouldAutoReport = !!defaultExpensePolicy?.autoReporting || !!personalPolicy?.autoReporting;
+                const transactionReportID = shouldAutoReport ? activePolicyExpenseChat?.reportID : CONST.REPORT.UNREPORTED_REPORT_ID;
+
+                // If the initial transaction has different participants selected that means that the user has changed the participant in the confirmation step
+                if (initialTransaction?.participants && initialTransaction?.participants?.at(0)?.reportID !== activePolicyExpenseChat?.reportID) {
+                    const isTrackExpense = initialTransaction?.participants?.at(0)?.reportID === selfDMReportID;
+
+                    const setParticipantsPromises = files.map((receiptFile) => setMoneyRequestParticipants(receiptFile.transactionID, initialTransaction?.participants));
+                    Promise.all(setParticipantsPromises).then(() => {
+                        if (isTrackExpense) {
+                            Navigation.navigate(ROUTES.MONEY_REQUEST_STEP_CONFIRMATION.getRoute(CONST.IOU.ACTION.CREATE, CONST.IOU.TYPE.TRACK, initialTransactionID, selfDMReportID));
+                        } else {
+                            navigateToConfirmationPage(iouType === CONST.IOU.TYPE.CREATE, initialTransaction?.reportID);
+                        }
+                    });
+                    return;
+                }
+
+                const setParticipantsPromises = files.map((receiptFile) => {
+                    setTransactionReport(receiptFile.transactionID, {reportID: transactionReportID}, true);
+                    return setMoneyRequestParticipantsFromReport(receiptFile.transactionID, activePolicyExpenseChat, currentUserPersonalDetails.accountID);
+                });
+                Promise.all(setParticipantsPromises).then(() =>
+                    Navigation.navigate(
+                        ROUTES.MONEY_REQUEST_STEP_CONFIRMATION.getRoute(
+                            CONST.IOU.ACTION.CREATE,
+                            iouType === CONST.IOU.TYPE.CREATE ? CONST.IOU.TYPE.SUBMIT : iouType,
+                            initialTransactionID,
+                            activePolicyExpenseChat?.reportID,
+                        ),
+                    ),
+                );
+            } else {
+                navigateToParticipantPage(iouType, initialTransactionID, reportID);
+            }
         },
         [
             backTo,
-            backToReport,
-            shouldGenerateTransactionThreadReport,
-            transactions,
             initialTransaction?.isFromGlobalCreate,
             initialTransaction?.currency,
             initialTransaction?.participants,
             initialTransaction?.reportID,
-            isArchived,
+            reportNameValuePairs,
             iouType,
             defaultExpensePolicy,
             report,
             initialTransactionID,
+            navigateToConfirmationPage,
             currentUserPersonalDetails.accountID,
             currentUserPersonalDetails?.login,
             shouldSkipConfirmation,
             personalDetails,
             reportAttributesDerived,
+            createTransaction,
             reportID,
             transactionTaxCode,
             transactionTaxAmount,
@@ -375,10 +618,8 @@ function IOURequestStepScan({
             policyRecentlyUsedCurrencies,
             policy,
             personalPolicy?.autoReporting,
-            isASAPSubmitBetaEnabled,
-            transactionViolations,
-            introSelected,
-            activePolicyID,
+            selfDMReportID,
+            policyRecentlyUsedCurrencies,
         ],
     );
 
diff --git a/src/pages/iou/request/step/IOURequestStepTag.tsx b/src/pages/iou/request/step/IOURequestStepTag.tsx
index 48686a78f632..a40063f8e7f6 100644
--- a/src/pages/iou/request/step/IOURequestStepTag.tsx
+++ b/src/pages/iou/request/step/IOURequestStepTag.tsx
@@ -54,7 +54,6 @@ function IOURequestStepTag({
     const [policyTags] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY_TAGS}${policyID}`, {canBeMissing: false});
     const [policyRecentlyUsedTags] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY_RECENTLY_USED_TAGS}${policyID}`, {canBeMissing: true});
     const [parentReport] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${getNonEmptyStringOnyxID(report?.parentReportID)}`, {canBeMissing: true});
-    const [parentReportNextStep] = useOnyx(`${ONYXKEYS.COLLECTION.NEXT_STEP}${getNonEmptyStringOnyxID(report?.parentReportID)}`, {canBeMissing: true});
 
     const currentUserPersonalDetails = useCurrentUserPersonalDetails();
     const currentUserAccountIDParam = currentUserPersonalDetails.accountID;
@@ -150,7 +149,6 @@ function IOURequestStepTag({
                 currentUserEmailParam,
                 isASAPSubmitBetaEnabled,
                 hash: currentSearchHash,
-                parentReportNextStep,
             });
             navigateBack();
             return;
diff --git a/src/pages/iou/request/step/IOURequestStepTaxAmountPage.tsx b/src/pages/iou/request/step/IOURequestStepTaxAmountPage.tsx
index 251b0861bcee..b073f2926fd1 100644
--- a/src/pages/iou/request/step/IOURequestStepTaxAmountPage.tsx
+++ b/src/pages/iou/request/step/IOURequestStepTaxAmountPage.tsx
@@ -6,7 +6,6 @@ import useCurrentUserPersonalDetails from '@hooks/useCurrentUserPersonalDetails'
 import useLocalize from '@hooks/useLocalize';
 import useOnyx from '@hooks/useOnyx';
 import usePermissions from '@hooks/usePermissions';
-import usePolicyForTransaction from '@hooks/usePolicyForTransaction';
 import useRestartOnReceiptFailure from '@hooks/useRestartOnReceiptFailure';
 import {setDraftSplitTransaction, setMoneyRequestCurrency, setMoneyRequestParticipantsFromReport, setMoneyRequestTaxAmount, updateMoneyRequestTaxAmount} from '@libs/actions/IOU';
 import {convertToBackendAmount} from '@libs/CurrencyUtils';
@@ -53,13 +52,11 @@ function IOURequestStepTaxAmountPage({
     transaction,
     report,
 }: IOURequestStepTaxAmountPageProps) {
-    const {policy} = usePolicyForTransaction({transaction, report, action, iouType});
-
-    const [policyCategories] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY_CATEGORIES}${policy?.id}`, {canBeMissing: true});
-    const [policyTags] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY_TAGS}${policy?.id}`, {canBeMissing: true});
+    const [policy] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY}${report?.policyID}`, {canBeMissing: true});
+    const [policyCategories] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY_CATEGORIES}${report?.policyID}`, {canBeMissing: true});
+    const [policyTags] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY_TAGS}${report?.policyID}`, {canBeMissing: true});
     const [splitDraftTransaction] = useOnyx(`${ONYXKEYS.COLLECTION.SPLIT_TRANSACTION_DRAFT}${transactionID}`, {canBeMissing: true});
     const [parentReport] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${getNonEmptyStringOnyxID(report?.parentReportID)}`, {canBeMissing: true});
-    const [parentReportNextStep] = useOnyx(`${ONYXKEYS.COLLECTION.NEXT_STEP}${getNonEmptyStringOnyxID(report?.parentReportID)}`, {canBeMissing: true});
 
     const {translate} = useLocalize();
     const textInput = useRef<BaseTextInputRef | null>(null);
@@ -107,19 +104,18 @@ function IOURequestStepTaxAmountPage({
                 navigateBack();
                 return;
             }
-            updateMoneyRequestTaxAmount({
+            updateMoneyRequestTaxAmount(
                 transactionID,
-                transactionThreadReport: report,
+                report,
                 parentReport,
-                taxAmount: taxAmountInSmallestCurrencyUnits,
+                taxAmountInSmallestCurrencyUnits,
                 policy,
-                policyTagList: policyTags,
+                policyTags,
                 policyCategories,
                 currentUserAccountIDParam,
                 currentUserEmailParam,
                 isASAPSubmitBetaEnabled,
-                parentReportNextStep,
-            });
+            );
             navigateBack();
             return;
         }
diff --git a/src/pages/iou/request/step/IOURequestStepTaxRatePage.tsx b/src/pages/iou/request/step/IOURequestStepTaxRatePage.tsx
index c6a6970e54a7..c3b911781dab 100644
--- a/src/pages/iou/request/step/IOURequestStepTaxRatePage.tsx
+++ b/src/pages/iou/request/step/IOURequestStepTaxRatePage.tsx
@@ -5,7 +5,6 @@ import useCurrentUserPersonalDetails from '@hooks/useCurrentUserPersonalDetails'
 import useLocalize from '@hooks/useLocalize';
 import useOnyx from '@hooks/useOnyx';
 import usePermissions from '@hooks/usePermissions';
-import usePolicyForTransaction from '@hooks/usePolicyForTransaction';
 import useRestartOnReceiptFailure from '@hooks/useRestartOnReceiptFailure';
 import {convertToBackendAmount} from '@libs/CurrencyUtils';
 import getNonEmptyStringOnyxID from '@libs/getNonEmptyStringOnyxID';
@@ -42,12 +41,11 @@ function IOURequestStepTaxRatePage({
     report,
 }: IOURequestStepTaxRatePageProps) {
     const {translate} = useLocalize();
-    const {policy} = usePolicyForTransaction({transaction, report, action, iouType});
 
+    const [policy] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY}${report?.policyID}`, {canBeMissing: true});
     const [policyCategories] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY_CATEGORIES}${policy?.id}`, {canBeMissing: true});
     const [policyTags] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY_TAGS}${policy?.id}`, {canBeMissing: true});
     const [parentReport] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${getNonEmptyStringOnyxID(report?.parentReportID)}`, {canBeMissing: true});
-    const [parentReportNextStep] = useOnyx(`${ONYXKEYS.COLLECTION.NEXT_STEP}${getNonEmptyStringOnyxID(report?.parentReportID)}`, {canBeMissing: true});
 
     const [splitDraftTransaction] = useOnyx(`${ONYXKEYS.COLLECTION.SPLIT_TRANSACTION_DRAFT}${transactionID}`, {canBeMissing: true});
     useRestartOnReceiptFailure(transaction, reportIDFromRoute, iouType, action);
@@ -75,7 +73,6 @@ function IOURequestStepTaxRatePage({
         }
 
         const taxAmount = getTaxAmount(policy, currentTransaction, taxes.code, getAmount(currentTransaction, false, true));
-        const taxValue = getTaxValue(policy, currentTransaction, taxes.code) ?? '';
 
         if (isEditingSplitBill) {
             setDraftSplitTransaction(currentTransaction.transactionID, splitDraftTransaction, {
@@ -93,7 +90,6 @@ function IOURequestStepTaxRatePage({
                 transactionThreadReport: report,
                 parentReport,
                 taxCode: newTaxCode,
-                taxValue,
                 taxAmount: convertToBackendAmount(taxAmount ?? 0),
                 policy,
                 policyTagList: policyTags,
@@ -101,7 +97,6 @@ function IOURequestStepTaxRatePage({
                 currentUserAccountIDParam,
                 currentUserEmailParam,
                 isASAPSubmitBetaEnabled,
-                parentReportNextStep,
             });
             navigateBack();
             return;
diff --git a/src/pages/iou/request/step/IOURequestStepTimeRate.tsx b/src/pages/iou/request/step/IOURequestStepTimeRate.tsx
deleted file mode 100644
index 6862b7fc85f1..000000000000
--- a/src/pages/iou/request/step/IOURequestStepTimeRate.tsx
+++ /dev/null
@@ -1,101 +0,0 @@
-import {useFocusEffect} from '@react-navigation/native';
-import React, {useRef} from 'react';
-import type {OnyxEntry} from 'react-native-onyx';
-import type {BaseTextInputRef} from '@components/TextInput/BaseTextInput/types';
-import useLocalize from '@hooks/useLocalize';
-import useRestartOnReceiptFailure from '@hooks/useRestartOnReceiptFailure';
-import useShowNotFoundPageInIOUStep from '@hooks/useShowNotFoundPageInIOUStep';
-import {setMoneyRequestAmount, setMoneyRequestMerchant, setMoneyRequestTimeRate} from '@libs/actions/IOU';
-import {convertToBackendAmount} from '@libs/CurrencyUtils';
-import {shouldUseTransactionDraft} from '@libs/IOUUtils';
-import Navigation from '@libs/Navigation/Navigation';
-import {computeTimeAmount, formatTimeMerchant} from '@libs/TimeTrackingUtils';
-import type {CurrentMoney} from '@pages/iou/MoneyRequestAmountForm';
-import MoneyRequestAmountForm from '@pages/iou/MoneyRequestAmountForm';
-import CONST from '@src/CONST';
-import ROUTES from '@src/ROUTES';
-import type SCREENS from '@src/SCREENS';
-import type {Transaction} from '@src/types/onyx';
-import StepScreenWrapper from './StepScreenWrapper';
-import withFullTransactionOrNotFound from './withFullTransactionOrNotFound';
-import type {WithWritableReportOrNotFoundProps} from './withWritableReportOrNotFound';
-import withWritableReportOrNotFound from './withWritableReportOrNotFound';
-
-type IOURequestStepTimeRateProps = WithWritableReportOrNotFoundProps<typeof SCREENS.MONEY_REQUEST.STEP_TIME_RATE> & {
-    transaction: OnyxEntry<Transaction>;
-};
-
-function IOURequestStepTimeRate({
-    route: {
-        params: {action, iouType, reportID, reportActionID, transactionID},
-    },
-    transaction,
-    report,
-}: IOURequestStepTimeRateProps) {
-    const {translate} = useLocalize();
-    const textInput = useRef<BaseTextInputRef | null>(null);
-    const focusTimeoutRef = useRef<NodeJS.Timeout | null>(null);
-    useRestartOnReceiptFailure(transaction, reportID, iouType, action);
-    // eslint-disable-next-line rulesdir/no-negated-variables
-    const shouldShowNotFoundPage = useShowNotFoundPageInIOUStep(action, iouType, reportActionID, report, transaction);
-
-    const isTransactionDraft = shouldUseTransactionDraft(action);
-    const currency = transaction?.currency;
-    const count = transaction?.comment?.units?.count;
-
-    useFocusEffect(() => {
-        focusTimeoutRef.current = setTimeout(() => textInput.current?.focus(), CONST.ANIMATED_TRANSITION + 100);
-        return () => {
-            if (!focusTimeoutRef.current) {
-                return;
-            }
-            clearTimeout(focusTimeoutRef.current);
-        };
-    });
-
-    const navigateBack = () => {
-        Navigation.goBack(ROUTES.MONEY_REQUEST_STEP_CONFIRMATION.getRoute(action, iouType, transactionID, reportID));
-    };
-
-    const saveRate = (currentMoney: CurrentMoney) => {
-        const rate = convertToBackendAmount(Number.parseFloat(currentMoney.amount));
-        if (count === undefined || !currency) {
-            return;
-        }
-
-        setMoneyRequestAmount(transactionID, computeTimeAmount(rate, count), currency);
-        setMoneyRequestMerchant(transactionID, formatTimeMerchant(count, rate, currency, translate), isTransactionDraft);
-        setMoneyRequestTimeRate(transactionID, rate, isTransactionDraft);
-
-        navigateBack();
-    };
-
-    return (
-        <StepScreenWrapper
-            headerTitle={translate('common.rate')}
-            onBackButtonPress={navigateBack}
-            testID="IOURequestStepTimeRate"
-            shouldShowWrapper
-            includeSafeAreaPaddingBottom
-            shouldShowNotFoundPage={shouldShowNotFoundPage}
-        >
-            <MoneyRequestAmountForm
-                isEditing
-                amount={transaction?.comment?.units?.rate}
-                currency={currency}
-                isCurrencyPressable={false}
-                ref={(e: BaseTextInputRef | null) => {
-                    textInput.current = e;
-                }}
-                onSubmitButtonPress={saveRate}
-            />
-        </StepScreenWrapper>
-    );
-}
-
-// eslint-disable-next-line rulesdir/no-negated-variables
-const IOURequestStepTimeRateWithFullTransactionOrNotFound = withFullTransactionOrNotFound(IOURequestStepTimeRate);
-// eslint-disable-next-line rulesdir/no-negated-variables
-const IOURequestStepTimeRateWithWritableReportOrNotFound = withWritableReportOrNotFound(IOURequestStepTimeRateWithFullTransactionOrNotFound);
-
-export default IOURequestStepTimeRateWithWritableReportOrNotFound;
diff --git a/src/pages/iou/request/step/IOURequestStepUpgrade.tsx b/src/pages/iou/request/step/IOURequestStepUpgrade.tsx
index a19e7033d872..bfe3d38d5960 100644
--- a/src/pages/iou/request/step/IOURequestStepUpgrade.tsx
+++ b/src/pages/iou/request/step/IOURequestStepUpgrade.tsx
@@ -1,4 +1,4 @@
-import React, {useRef, useState} from 'react';
+import React, {useCallback, useMemo, useRef, useState} from 'react';
 import ConfirmModal from '@components/ConfirmModal';
 import HeaderWithBackButton from '@components/HeaderWithBackButton';
 import {usePersonalDetails} from '@components/OnyxListItemProvider';
@@ -60,19 +60,26 @@ function IOURequestStepUpgrade({
     const [introSelected] = useOnyx(ONYXKEYS.NVP_INTRO_SELECTED, {canBeMissing: true});
     const [activePolicyID] = useOnyx(ONYXKEYS.NVP_ACTIVE_POLICY_ID, {canBeMissing: true});
 
-    const feature = Object.values(CONST.UPGRADE_FEATURE_INTRO_MAPPING)
-        .filter((value) => value.id !== CONST.UPGRADE_FEATURE_INTRO_MAPPING.policyPreventMemberChangingTitle.id)
-        .find((f) => f.alias === upgradePath);
+    const feature = useMemo(
+        () =>
+            Object.values(CONST.UPGRADE_FEATURE_INTRO_MAPPING)
+                .filter((value) => value.id !== CONST.UPGRADE_FEATURE_INTRO_MAPPING.policyPreventMemberChangingTitle.id)
+                .find((f) => f.alias === upgradePath),
+        [upgradePath],
+    );
 
-    const navigateWithMicrotask = (route: Route) => {
-        if (isWeb) {
-            Navigation.setNavigationActionToMicrotaskQueue(() => Navigation.navigate(route));
-        } else {
-            Navigation.navigate(route);
-        }
-    };
+    const navigateWithMicrotask = useCallback(
+        (route: Route) => {
+            if (isWeb) {
+                Navigation.setNavigationActionToMicrotaskQueue(() => Navigation.navigate(route));
+            } else {
+                Navigation.navigate(route);
+            }
+        },
+        [isWeb],
+    );
 
-    const afterUpgradeAcknowledged = () => {
+    const afterUpgradeAcknowledged = useCallback(() => {
         const expenseReportID = policyDataRef.current?.expenseChatReportID ?? reportID;
         const policyID = policyDataRef.current?.policyID;
         if (shouldSubmitExpense) {
@@ -112,12 +119,18 @@ function IOURequestStepUpgrade({
                 break;
             default:
         }
-    };
+    }, [action, backTo, navigateWithMicrotask, reportID, shouldSubmitExpense, transactionID, upgradePath]);
 
-    const participant = transaction?.participants?.[0];
-    const adminParticipant = isDistanceRateUpgrade && participant?.accountID ? getParticipantsOption(participant, personalDetails) : undefined;
+    const adminParticipant = useMemo(() => {
+        const participant = transaction?.participants?.[0];
+        if (!isDistanceRateUpgrade || !participant?.accountID) {
+            return;
+        }
+
+        return getParticipantsOption(participant, personalDetails);
+    }, [isDistanceRateUpgrade, transaction?.participants, personalDetails]);
 
-    const onUpgrade = () => {
+    const onUpgrade = useCallback(() => {
         if (isRestrictedPolicyCreation) {
             setIsUpgradeWarningModalOpen(true);
             return;
@@ -150,13 +163,25 @@ function IOURequestStepUpgrade({
         });
         setIsUpgraded(true);
         policyDataRef.current = policyData;
-    };
+    }, [
+        isCategorizing,
+        isReporting,
+        currentUserPersonalDetails?.localCurrencyCode,
+        isDistanceRateUpgrade,
+        adminParticipant,
+        activePolicyID,
+        currentUserPersonalDetails.accountID,
+        currentUserPersonalDetails.email,
+        introSelected,
+        onboardingPurposeSelected,
+        isRestrictedPolicyCreation,
+    ]);
 
     const [session] = useOnyx(ONYXKEYS.SESSION, {canBeMissing: false});
 
-    const handleConfirmUpgradeWarning = () => {
+    const handleConfirmUpgradeWarning = useCallback(() => {
         setIsUpgradeWarningModalOpen(false);
-    };
+    }, []);
 
     const onWorkspaceConfirmationSubmit = (params: WorkspaceConfirmationSubmitFunctionParams) => {
         const policyData = Policy.createWorkspace({
diff --git a/src/pages/iou/request/step/IOURequestStepWaypoint.tsx b/src/pages/iou/request/step/IOURequestStepWaypoint.tsx
index 755ab23b2a7c..0f2f0b7f1c69 100644
--- a/src/pages/iou/request/step/IOURequestStepWaypoint.tsx
+++ b/src/pages/iou/request/step/IOURequestStepWaypoint.tsx
@@ -140,10 +140,10 @@ function IOURequestStepWaypoint({
         // Therefore, we're going to save the waypoint as just the address, and the lat/long will be filled in on the backend
         if (isOffline && waypointValue) {
             const waypoint = {
-                address: waypointValue,
-                name: values.name,
-                lat: values.lat,
-                lng: values.lng,
+                address: waypointValue ?? '',
+                name: values.name ?? '',
+                lat: values.lat ?? 0,
+                lng: values.lng ?? 0,
                 keyForList: `${(values.name ?? 'waypoint') as string}_${Date.now()}`,
             };
             save(waypoint);
@@ -175,10 +175,10 @@ function IOURequestStepWaypoint({
 
     const selectWaypoint = (values: Waypoint) => {
         const waypoint = {
-            lat: values.lat,
-            lng: values.lng,
-            address: values.address,
-            name: values.name,
+            lat: values.lat ?? 0,
+            lng: values.lng ?? 0,
+            address: values.address ?? '',
+            name: values.name ?? '',
             keyForList: `${values.name ?? 'waypoint'}_${Date.now()}`,
         };
 
diff --git a/src/pages/iou/request/step/withFullTransactionOrNotFound.tsx b/src/pages/iou/request/step/withFullTransactionOrNotFound.tsx
index 1344153a0ae2..05e8af7a788f 100644
--- a/src/pages/iou/request/step/withFullTransactionOrNotFound.tsx
+++ b/src/pages/iou/request/step/withFullTransactionOrNotFound.tsx
@@ -51,9 +51,7 @@ type MoneyRequestRouteName =
     | typeof SCREENS.MONEY_REQUEST.STEP_DISTANCE_GPS
     | typeof SCREENS.MONEY_REQUEST.DISTANCE_CREATE
     | typeof SCREENS.MONEY_REQUEST.STEP_DISTANCE_MANUAL
-    | typeof SCREENS.MONEY_REQUEST.STEP_DISTANCE_ODOMETER
-    | typeof SCREENS.MONEY_REQUEST.STEP_TIME_RATE
-    | typeof SCREENS.MONEY_REQUEST.STEP_HOURS;
+    | typeof SCREENS.MONEY_REQUEST.STEP_DISTANCE_ODOMETER;
 
 type WithFullTransactionOrNotFoundProps<RouteName extends MoneyRequestRouteName> = WithFullTransactionOrNotFoundOnyxProps &
     PlatformStackScreenProps<MoneyRequestNavigatorParamList, RouteName>;
diff --git a/src/pages/iou/request/step/withWritableReportOrNotFound.tsx b/src/pages/iou/request/step/withWritableReportOrNotFound.tsx
index 2c5c19a1ca84..889f5db33033 100644
--- a/src/pages/iou/request/step/withWritableReportOrNotFound.tsx
+++ b/src/pages/iou/request/step/withWritableReportOrNotFound.tsx
@@ -55,9 +55,7 @@ type MoneyRequestRouteName =
     | typeof SCREENS.MONEY_REQUEST.STEP_DISTANCE_MAP
     | typeof SCREENS.MONEY_REQUEST.STEP_DISTANCE_GPS
     | typeof SCREENS.MONEY_REQUEST.STEP_DISTANCE_ODOMETER
-    | typeof SCREENS.MONEY_REQUEST.STEP_DISTANCE_MANUAL
-    | typeof SCREENS.MONEY_REQUEST.STEP_TIME_RATE
-    | typeof SCREENS.MONEY_REQUEST.STEP_HOURS;
+    | typeof SCREENS.MONEY_REQUEST.STEP_DISTANCE_MANUAL;
 
 type WithWritableReportOrNotFoundProps<RouteName extends MoneyRequestRouteName> = WithWritableReportOrNotFoundOnyxProps & PlatformStackScreenProps<MoneyRequestNavigatorParamList, RouteName>;
 
diff --git a/src/pages/media/AttachmentModalScreen/routes/TransactionReceiptModalContent.tsx b/src/pages/media/AttachmentModalScreen/routes/TransactionReceiptModalContent.tsx
index accf772c046a..d58dd6d0fb9c 100644
--- a/src/pages/media/AttachmentModalScreen/routes/TransactionReceiptModalContent.tsx
+++ b/src/pages/media/AttachmentModalScreen/routes/TransactionReceiptModalContent.tsx
@@ -70,7 +70,6 @@ function TransactionReceiptModalContent({navigation, route}: AttachmentModalScre
         return transactionMain;
     }, [isDraftTransaction, mergeTransaction, mergeTransactionID, transactionDraft, transactionMain]);
 
-    const [transactionReport] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${transaction?.reportID}`, {canBeMissing: true});
     const receiptURIs = getThumbnailAndImageURIs(transaction);
     const isLocalFile = receiptURIs.isLocalFile;
     const isAuthTokenRequired = !isLocalFile && !isDraftTransaction;
@@ -280,13 +279,7 @@ function TransactionReceiptModalContent({navigation, route}: AttachmentModalScre
             }
 
             const hasOnlyEReceipt = hasEReceipt(transaction) && !hasReceiptSource(transaction);
-            if (
-                shouldShowDeleteReceiptButton &&
-                !hasOnlyEReceipt &&
-                hasReceipt(transaction) &&
-                !isReceiptBeingScanned(transaction) &&
-                !hasMissingSmartscanFields(transaction, transactionReport)
-            ) {
+            if (shouldShowDeleteReceiptButton && !hasOnlyEReceipt && hasReceipt(transaction) && !isReceiptBeingScanned(transaction) && !hasMissingSmartscanFields(transaction)) {
                 menuItems.push({
                     icon: Expensicons.Trashcan,
                     text: translate('receipt.deleteReceipt'),
@@ -299,20 +292,19 @@ function TransactionReceiptModalContent({navigation, route}: AttachmentModalScre
             // eslint-disable-next-line react-hooks/exhaustive-deps
         },
         [
+            icons.Download,
             shouldShowReplaceReceiptButton,
             isOffline,
             allowDownload,
             draftTransactionID,
             transaction,
             shouldShowDeleteReceiptButton,
-            transactionReport,
-            expensifyIcons.Camera,
             translate,
             action,
             iouType,
             report?.reportID,
-            icons.Download,
             onDownloadAttachment,
+            expensifyIcons.Camera,
         ],
     );
 
diff --git a/src/pages/settings/AppDownloadLinks.tsx b/src/pages/settings/AppDownloadLinks.tsx
index 5a4e551ff7e3..fb71fdb24125 100644
--- a/src/pages/settings/AppDownloadLinks.tsx
+++ b/src/pages/settings/AppDownloadLinks.tsx
@@ -87,7 +87,6 @@ function AppDownloadLinksPage() {
                         iconRight={item.iconRight}
                         shouldBlockSelection
                         shouldShowRightIcon
-                        role={CONST.ROLE.LINK}
                     />
                 ))}
             </ScrollView>
diff --git a/src/pages/settings/InitialSettingsPage.tsx b/src/pages/settings/InitialSettingsPage.tsx
index 6165b60e050f..d3be766079bf 100755
--- a/src/pages/settings/InitialSettingsPage.tsx
+++ b/src/pages/settings/InitialSettingsPage.tsx
@@ -1,6 +1,6 @@
 import {findFocusedRoute, useNavigationState, useRoute} from '@react-navigation/native';
 import {differenceInDays} from 'date-fns';
-import React, {useContext, useEffect, useLayoutEffect, useRef, useState} from 'react';
+import React, {useCallback, useContext, useEffect, useLayoutEffect, useMemo, useRef, useState} from 'react';
 // eslint-disable-next-line no-restricted-imports
 import type {GestureResponderEvent, ScrollView as RNScrollView, ScrollViewProps, StyleProp, ViewStyle} from 'react-native';
 import {View} from 'react-native';
@@ -146,24 +146,31 @@ function InitialSettingsPage({currentUserPersonalDetails}: InitialSettingsPagePr
 
     const hasBrokenFeedConnection = checkIfFeedConnectionIsBroken(allCards, CONST.EXPENSIFY_CARD.BANK);
     const hasPendingCardAction = hasPendingExpensifyCardAction(allCards, privatePersonalDetails);
-    let walletBrickRoadIndicator;
-    if (
-        hasPaymentMethodError(bankAccountList, fundList, allCards) ||
-        !isEmptyObject(userWallet?.errors) ||
-        !isEmptyObject(walletTerms?.errors) ||
-        !isEmptyObject(unsharedBankAccount?.errors) ||
-        hasBrokenFeedConnection
-    ) {
-        walletBrickRoadIndicator = CONST.BRICK_ROAD_INDICATOR_STATUS.ERROR;
-    } else if (hasPartiallySetupBankAccount(bankAccountList)) {
-        walletBrickRoadIndicator = CONST.BRICK_ROAD_INDICATOR_STATUS.INFO;
-    } else if (hasPendingCardAction) {
-        walletBrickRoadIndicator = CONST.BRICK_ROAD_INDICATOR_STATUS.INFO;
-    }
+    const walletBrickRoadIndicator = useMemo(() => {
+        if (
+            hasPaymentMethodError(bankAccountList, fundList, allCards) ||
+            !isEmptyObject(userWallet?.errors) ||
+            !isEmptyObject(walletTerms?.errors) ||
+            !isEmptyObject(unsharedBankAccount?.errors) ||
+            hasBrokenFeedConnection
+        ) {
+            return CONST.BRICK_ROAD_INDICATOR_STATUS.ERROR;
+        }
+        if (hasPartiallySetupBankAccount(bankAccountList)) {
+            return CONST.BRICK_ROAD_INDICATOR_STATUS.INFO;
+        }
+        if (hasPendingCardAction) {
+            return CONST.BRICK_ROAD_INDICATOR_STATUS.INFO;
+        }
+        return undefined;
+    }, [allCards, bankAccountList, fundList, hasBrokenFeedConnection, hasPendingCardAction, unsharedBankAccount?.errors, userWallet?.errors, walletTerms?.errors]);
 
     const [shouldShowSignoutConfirmModal, setShouldShowSignoutConfirmModal] = useState(false);
 
-    const hasAccountBeenSwitched = currentUserPersonalDetails.accountID !== previousUserPersonalDetails.accountID;
+    const hasAccountBeenSwitched = useMemo(
+        () => currentUserPersonalDetails.accountID !== previousUserPersonalDetails.accountID,
+        [currentUserPersonalDetails.accountID, previousUserPersonalDetails.accountID],
+    );
 
     useEffect(() => {
         if (!hasAccountBeenSwitched) {
@@ -182,83 +189,117 @@ function InitialSettingsPage({currentUserPersonalDetails}: InitialSettingsPagePr
         setShouldShowSignoutConfirmModal(value);
     };
 
-    const signOut = (shouldForceSignout = false) => {
-        if (!network.isOffline || shouldForceSignout) {
-            return signOutAndRedirectToSignIn();
-        }
+    const signOut = useCallback(
+        (shouldForceSignout = false) => {
+            if (!network.isOffline || shouldForceSignout) {
+                return signOutAndRedirectToSignIn();
+            }
 
-        // When offline, warn the user that any actions they took while offline will be lost if they sign out
-        toggleSignoutConfirmModal(true);
-    };
+            // When offline, warn the user that any actions they took while offline will be lost if they sign out
+            toggleSignoutConfirmModal(true);
+        },
+        [network.isOffline],
+    );
 
-    const surveyThresholdInDays = 30;
-    let surveyCompletedWithinLastMonth = false;
-    if (tryNewDot?.classicRedirect?.timestamp && tryNewDot?.classicRedirect?.dismissed) {
+    const surveyCompletedWithinLastMonth = useMemo(() => {
+        const surveyThresholdInDays = 30;
+        if (!tryNewDot?.classicRedirect?.timestamp || !tryNewDot?.classicRedirect?.dismissed) {
+            return false;
+        }
         const daysSinceLastSurvey = differenceInDays(new Date(), new Date(tryNewDot.classicRedirect.timestamp));
-        surveyCompletedWithinLastMonth = daysSinceLastSurvey < surveyThresholdInDays;
-    }
+        return daysSinceLastSurvey < surveyThresholdInDays;
+    }, [tryNewDot?.classicRedirect?.timestamp, tryNewDot?.classicRedirect?.dismissed]);
 
     /**
      * Return a list of menu items data for account section
      * @returns object with translationKey, style and items for the account section
      */
-    const profileBrickRoadIndicator = getProfilePageBrickRoadIndicator(loginList, privatePersonalDetails, vacationDelegate, session?.email);
-    const accountItems: MenuData[] = [
-        {
-            translationKey: 'common.profile',
-            icon: icons.Profile,
-            screenName: SCREENS.SETTINGS.PROFILE.ROOT,
-            brickRoadIndicator: profileBrickRoadIndicator,
-            action: () => Navigation.navigate(ROUTES.SETTINGS_PROFILE.getRoute()),
-        },
-        {
-            translationKey: 'common.wallet',
-            icon: icons.Wallet,
-            screenName: SCREENS.SETTINGS.WALLET.ROOT,
-            brickRoadIndicator: walletBrickRoadIndicator,
-            action: () => Navigation.navigate(ROUTES.SETTINGS_WALLET),
-            badgeText: hasActivatedWallet ? convertToDisplayString(userWallet?.currentBalance) : undefined,
-        },
-        {
-            translationKey: 'common.preferences',
-            icon: icons.Gear,
-            screenName: SCREENS.SETTINGS.PREFERENCES.ROOT,
-            action: () => Navigation.navigate(ROUTES.SETTINGS_PREFERENCES),
-        },
-        {
-            translationKey: 'initialSettingsPage.security',
-            icon: icons.Lock,
-            screenName: SCREENS.SETTINGS.SECURITY,
-            action: () => Navigation.navigate(ROUTES.SETTINGS_SECURITY),
-        },
-    ];
-
-    if (subscriptionPlan) {
-        accountItems.splice(1, 0, {
-            translationKey: 'allSettingsScreen.subscription',
-            icon: icons.CreditCard,
-            screenName: SCREENS.SETTINGS.SUBSCRIPTION.ROOT,
-            brickRoadIndicator:
-                !!privateSubscription?.errors || hasSubscriptionRedDotError(stripeCustomerId, retryBillingSuccessful, billingDisputePending, retryBillingFailed, fundList, billingStatus)
-                    ? CONST.BRICK_ROAD_INDICATOR_STATUS.ERROR
-                    : undefined,
-            badgeText: freeTrialText,
-            badgeStyle: freeTrialText ? styles.badgeSuccess : undefined,
-            action: () => Navigation.navigate(ROUTES.SETTINGS_SUBSCRIPTION.route),
-        });
-    }
-
-    const accountMenuItemsData: Menu = {
-        sectionStyle: styles.accountSettingsSectionContainer,
-        sectionTranslationKey: 'initialSettingsPage.account',
-        items: accountItems,
-    };
+    const accountMenuItemsData: Menu = useMemo(() => {
+        const profileBrickRoadIndicator = getProfilePageBrickRoadIndicator(loginList, privatePersonalDetails, vacationDelegate, session?.email);
+        const items: MenuData[] = [
+            {
+                translationKey: 'common.profile',
+                icon: icons.Profile,
+                screenName: SCREENS.SETTINGS.PROFILE.ROOT,
+                brickRoadIndicator: profileBrickRoadIndicator,
+                action: () => Navigation.navigate(ROUTES.SETTINGS_PROFILE.getRoute()),
+            },
+            {
+                translationKey: 'common.wallet',
+                icon: icons.Wallet,
+                screenName: SCREENS.SETTINGS.WALLET.ROOT,
+                brickRoadIndicator: walletBrickRoadIndicator,
+                action: () => Navigation.navigate(ROUTES.SETTINGS_WALLET),
+                badgeText: hasActivatedWallet ? convertToDisplayString(userWallet?.currentBalance) : undefined,
+            },
+            {
+                translationKey: 'common.preferences',
+                icon: icons.Gear,
+                screenName: SCREENS.SETTINGS.PREFERENCES.ROOT,
+                action: () => Navigation.navigate(ROUTES.SETTINGS_PREFERENCES),
+            },
+            {
+                translationKey: 'initialSettingsPage.security',
+                icon: icons.Lock,
+                screenName: SCREENS.SETTINGS.SECURITY,
+                action: () => Navigation.navigate(ROUTES.SETTINGS_SECURITY),
+            },
+        ];
+
+        if (subscriptionPlan) {
+            items.splice(1, 0, {
+                translationKey: 'allSettingsScreen.subscription',
+                icon: icons.CreditCard,
+                screenName: SCREENS.SETTINGS.SUBSCRIPTION.ROOT,
+                brickRoadIndicator:
+                    !!privateSubscription?.errors || hasSubscriptionRedDotError(stripeCustomerId, retryBillingSuccessful, billingDisputePending, retryBillingFailed, fundList, billingStatus)
+                        ? CONST.BRICK_ROAD_INDICATOR_STATUS.ERROR
+                        : undefined,
+                badgeText: freeTrialText,
+                badgeStyle: freeTrialText ? styles.badgeSuccess : undefined,
+                action: () => Navigation.navigate(ROUTES.SETTINGS_SUBSCRIPTION.route),
+            });
+        }
+
+        return {
+            sectionStyle: styles.accountSettingsSectionContainer,
+            sectionTranslationKey: 'initialSettingsPage.account',
+            items,
+        };
+    }, [
+        loginList,
+        privatePersonalDetails,
+        vacationDelegate,
+        session?.email,
+        icons.Profile,
+        icons.Gear,
+        icons.Lock,
+        icons.Wallet,
+        icons.CreditCard,
+        walletBrickRoadIndicator,
+        hasActivatedWallet,
+        userWallet?.currentBalance,
+        subscriptionPlan,
+        styles.accountSettingsSectionContainer,
+        styles.badgeSuccess,
+        privateSubscription?.errors,
+        stripeCustomerId,
+        retryBillingSuccessful,
+        billingDisputePending,
+        retryBillingFailed,
+        fundList,
+        freeTrialText,
+        billingStatus,
+    ]);
+
+    const classicRedirectMenuItem: MenuData | null = useMemo(() => {
+        if (tryNewDot?.classicRedirect?.isLockedToNewDot) {
+            return null;
+        }
 
-    let classicRedirectMenuItem: MenuData | null = null;
-    if (!tryNewDot?.classicRedirect?.isLockedToNewDot) {
         const shouldOpenSurveyReasonPage = tryNewDot?.classicRedirect?.dismissed === false;
 
-        classicRedirectMenuItem = {
+        return {
             translationKey: 'exitSurvey.goToExpensifyClassic',
             icon: icons.ExpensifyLogoNew,
             ...(CONFIG.IS_HYBRID_APP
@@ -282,137 +323,142 @@ function InitialSettingsPage({currentUserPersonalDetails}: InitialSettingsPagePr
                       },
                   }),
         };
-    }
+    }, [tryNewDot?.classicRedirect?.isLockedToNewDot, tryNewDot?.classicRedirect?.dismissed, icons.ExpensifyLogoNew, surveyCompletedWithinLastMonth]);
 
     /**
      * Return a list of menu items data for general section
      * @returns object with translationKey, style and items for the general section
      */
-    const signOutTranslationKey = isSupportAuthToken() && hasStashedSession() ? 'initialSettingsPage.restoreStashed' : 'initialSettingsPage.signOut';
-    const generalMenuItemsData: Menu = {
-        sectionStyle: {
-            ...styles.pt4,
-        },
-        sectionTranslationKey: 'initialSettingsPage.general',
-        items: [
-            ...(classicRedirectMenuItem && tryNewDot?.nudgeMigration ? [classicRedirectMenuItem] : []),
-            {
-                translationKey: 'initialSettingsPage.help',
-                icon: icons.QuestionMark,
-                iconRight: icons.NewWindow,
-                shouldShowRightIcon: true,
-                link: CONST.NEWHELP_URL,
-                action: () => {
-                    openExternalLink(CONST.NEWHELP_URL);
-                },
+    const generalMenuItemsData: Menu = useMemo(() => {
+        const signOutTranslationKey = isSupportAuthToken() && hasStashedSession() ? 'initialSettingsPage.restoreStashed' : 'initialSettingsPage.signOut';
+        return {
+            sectionStyle: {
+                ...styles.pt4,
             },
-            {
-                translationKey: 'initialSettingsPage.whatIsNew',
-                icon: icons.TreasureChest,
-                iconRight: icons.NewWindow,
-                shouldShowRightIcon: true,
-                link: CONST.WHATS_NEW_URL,
-                action: () => {
-                    openExternalLink(CONST.WHATS_NEW_URL);
+            sectionTranslationKey: 'initialSettingsPage.general',
+            items: [
+                ...(classicRedirectMenuItem && tryNewDot?.nudgeMigration ? [classicRedirectMenuItem] : []),
+                {
+                    translationKey: 'initialSettingsPage.help',
+                    icon: icons.QuestionMark,
+                    iconRight: icons.NewWindow,
+                    shouldShowRightIcon: true,
+                    link: CONST.NEWHELP_URL,
+                    action: () => {
+                        openExternalLink(CONST.NEWHELP_URL);
+                    },
                 },
-            },
-            {
-                translationKey: 'initialSettingsPage.about',
-                icon: icons.Info,
-                screenName: SCREENS.SETTINGS.ABOUT,
-                action: () => Navigation.navigate(ROUTES.SETTINGS_ABOUT),
-            },
-            {
-                translationKey: 'initialSettingsPage.aboutPage.troubleshoot',
-                icon: icons.Lightbulb,
-                screenName: SCREENS.SETTINGS.TROUBLESHOOT,
-                action: () => Navigation.navigate(ROUTES.SETTINGS_TROUBLESHOOT),
-            },
-            {
-                translationKey: 'sidebarScreen.saveTheWorld',
-                icon: icons.Heart,
-                screenName: SCREENS.SETTINGS.SAVE_THE_WORLD,
-                action: () => Navigation.navigate(ROUTES.SETTINGS_SAVE_THE_WORLD),
-            },
-            {
-                translationKey: signOutTranslationKey,
-                icon: icons.Exit,
-                action: () => {
-                    signOut(false);
+                {
+                    translationKey: 'initialSettingsPage.whatIsNew',
+                    icon: icons.TreasureChest,
+                    iconRight: icons.NewWindow,
+                    shouldShowRightIcon: true,
+                    link: CONST.WHATS_NEW_URL,
+                    action: () => {
+                        openExternalLink(CONST.WHATS_NEW_URL);
+                    },
                 },
-            },
-        ],
-    };
+                {
+                    translationKey: 'initialSettingsPage.about',
+                    icon: icons.Info,
+                    screenName: SCREENS.SETTINGS.ABOUT,
+                    action: () => Navigation.navigate(ROUTES.SETTINGS_ABOUT),
+                },
+                {
+                    translationKey: 'initialSettingsPage.aboutPage.troubleshoot',
+                    icon: icons.Lightbulb,
+                    screenName: SCREENS.SETTINGS.TROUBLESHOOT,
+                    action: () => Navigation.navigate(ROUTES.SETTINGS_TROUBLESHOOT),
+                },
+                {
+                    translationKey: 'sidebarScreen.saveTheWorld',
+                    icon: icons.Heart,
+                    screenName: SCREENS.SETTINGS.SAVE_THE_WORLD,
+                    action: () => Navigation.navigate(ROUTES.SETTINGS_SAVE_THE_WORLD),
+                },
+                {
+                    translationKey: signOutTranslationKey,
+                    icon: icons.Exit,
+                    action: () => {
+                        signOut(false);
+                    },
+                },
+            ],
+        };
+    }, [icons, styles.pt4, classicRedirectMenuItem, tryNewDot?.nudgeMigration, signOut]);
 
     /**
      * Return JSX.Element with menu items
      * @param menuItemsData list with menu items data
      * @returns the menu items for passed data
      */
-    const getMenuItemsSection = (menuItemsData: Menu) => {
-        const openPopover = (link: string | (() => Promise<string>) | undefined, event: GestureResponderEvent | MouseEvent) => {
-            if (!isScreenFocused) {
-                return;
-            }
-
-            if (typeof link === 'function') {
-                link?.()?.then((url) =>
+    const getMenuItemsSection = useCallback(
+        (menuItemsData: Menu) => {
+            const openPopover = (link: string | (() => Promise<string>) | undefined, event: GestureResponderEvent | MouseEvent) => {
+                if (!isScreenFocused) {
+                    return;
+                }
+
+                if (typeof link === 'function') {
+                    link?.()?.then((url) =>
+                        showContextMenu({
+                            type: CONST.CONTEXT_MENU_TYPES.LINK,
+                            event,
+                            selection: url,
+                            contextMenuAnchor: popoverAnchor.current,
+                        }),
+                    );
+                } else if (link) {
                     showContextMenu({
                         type: CONST.CONTEXT_MENU_TYPES.LINK,
                         event,
-                        selection: url,
+                        selection: link,
                         contextMenuAnchor: popoverAnchor.current,
-                    }),
-                );
-            } else if (link) {
-                showContextMenu({
-                    type: CONST.CONTEXT_MENU_TYPES.LINK,
-                    event,
-                    selection: link,
-                    contextMenuAnchor: popoverAnchor.current,
-                });
-            }
-        };
-
-        return (
-            <View style={[menuItemsData.sectionStyle, styles.pb4, styles.mh3]}>
-                <Text style={styles.sectionTitle}>{translate(menuItemsData.sectionTranslationKey)}</Text>
-                {menuItemsData.items.map((item) => {
-                    const keyTitle = item.translationKey ? translate(item.translationKey) : item.title;
-                    const isFocused = focusedRouteName ? focusedRouteName === item.screenName : false;
-
-                    return (
-                        <MenuItem
-                            key={keyTitle}
-                            wrapperStyle={styles.sectionMenuItem}
-                            title={keyTitle}
-                            icon={item.icon}
-                            iconType={item.iconType}
-                            disabled={isExecuting}
-                            onPress={singleExecution(item.action)}
-                            iconStyles={item.iconStyles}
-                            badgeText={item.badgeText}
-                            badgeStyle={item.badgeStyle}
-                            fallbackIcon={item.fallbackIcon}
-                            brickRoadIndicator={item.brickRoadIndicator}
-                            shouldStackHorizontally={item.shouldStackHorizontally}
-                            ref={popoverAnchor}
-                            shouldBlockSelection={!!item.link}
-                            onSecondaryInteraction={item.link ? (event) => openPopover(item.link, event) : undefined}
-                            focused={isFocused}
-                            isPaneMenu
-                            iconRight={item.iconRight}
-                            shouldShowRightIcon={item.shouldShowRightIcon}
-                            shouldIconUseAutoWidthStyle
-                        />
-                    );
-                })}
-            </View>
-        );
-    };
+                    });
+                }
+            };
+
+            return (
+                <View style={[menuItemsData.sectionStyle, styles.pb4, styles.mh3]}>
+                    <Text style={styles.sectionTitle}>{translate(menuItemsData.sectionTranslationKey)}</Text>
+                    {menuItemsData.items.map((item) => {
+                        const keyTitle = item.translationKey ? translate(item.translationKey) : item.title;
+                        const isFocused = focusedRouteName ? focusedRouteName === item.screenName : false;
+
+                        return (
+                            <MenuItem
+                                key={keyTitle}
+                                wrapperStyle={styles.sectionMenuItem}
+                                title={keyTitle}
+                                icon={item.icon}
+                                iconType={item.iconType}
+                                disabled={isExecuting}
+                                onPress={singleExecution(item.action)}
+                                iconStyles={item.iconStyles}
+                                badgeText={item.badgeText}
+                                badgeStyle={item.badgeStyle}
+                                fallbackIcon={item.fallbackIcon}
+                                brickRoadIndicator={item.brickRoadIndicator}
+                                shouldStackHorizontally={item.shouldStackHorizontally}
+                                ref={popoverAnchor}
+                                shouldBlockSelection={!!item.link}
+                                onSecondaryInteraction={item.link ? (event) => openPopover(item.link, event) : undefined}
+                                focused={isFocused}
+                                isPaneMenu
+                                iconRight={item.iconRight}
+                                shouldShowRightIcon={item.shouldShowRightIcon}
+                                shouldIconUseAutoWidthStyle
+                            />
+                        );
+                    })}
+                </View>
+            );
+        },
+        [styles.pb4, styles.mh3, styles.sectionTitle, styles.sectionMenuItem, translate, isScreenFocused, focusedRouteName, isExecuting, singleExecution],
+    );
 
-    const accountMenuItems = getMenuItemsSection(accountMenuItemsData);
-    const generalMenuItems = getMenuItemsSection(generalMenuItemsData);
+    const accountMenuItems = useMemo(() => getMenuItemsSection(accountMenuItemsData), [accountMenuItemsData, getMenuItemsSection]);
+    const generalMenuItems = useMemo(() => getMenuItemsSection(generalMenuItemsData), [generalMenuItemsData, getMenuItemsSection]);
 
     const headerContent = (
         <View style={[styles.ph5, styles.pv4]}>
@@ -423,7 +469,7 @@ function InitialSettingsPage({currentUserPersonalDetails}: InitialSettingsPagePr
                     <AccountSwitcher isScreenFocused={isScreenFocused} />
                     <Tooltip text={translate('statusPage.status')}>
                         <PressableWithFeedback
-                            accessibilityLabel={emojiCode ? `${translate('statusPage.status')}: ${emojiCode}` : translate('statusPage.status')}
+                            accessibilityLabel={translate('statusPage.status')}
                             accessibilityRole="button"
                             accessible
                             onPress={() => Navigation.navigate(ROUTES.SETTINGS_STATUS)}
@@ -451,14 +497,17 @@ function InitialSettingsPage({currentUserPersonalDetails}: InitialSettingsPagePr
     const route = useRoute();
     const scrollViewRef = useRef<RNScrollView>(null);
 
-    const onScroll: NonNullable<ScrollViewProps['onScroll']> = (e) => {
-        // If the layout measurement is 0, it means the flash list is not displayed but the onScroll may be triggered with offset value 0.
-        // We should ignore this case.
-        if (e.nativeEvent.layoutMeasurement.height === 0) {
-            return;
-        }
-        saveScrollOffset(route, e.nativeEvent.contentOffset.y);
-    };
+    const onScroll = useCallback<NonNullable<ScrollViewProps['onScroll']>>(
+        (e) => {
+            // If the layout measurement is 0, it means the flash list is not displayed but the onScroll may be triggered with offset value 0.
+            // We should ignore this case.
+            if (e.nativeEvent.layoutMeasurement.height === 0) {
+                return;
+            }
+            saveScrollOffset(route, e.nativeEvent.contentOffset.y);
+        },
+        [route, saveScrollOffset],
+    );
 
     useLayoutEffect(() => {
         const scrollOffset = getScrollOffset(route);
@@ -475,7 +524,6 @@ function InitialSettingsPage({currentUserPersonalDetails}: InitialSettingsPagePr
             bottomContent={!shouldDisplayLHB && <NavigationTabBar selectedTab={NAVIGATION_TABS.SETTINGS} />}
             shouldEnableKeyboardAvoidingView={false}
         >
-            {shouldDisplayLHB && <NavigationTabBar selectedTab={NAVIGATION_TABS.SETTINGS} />}
             {headerContent}
             <ScrollView
                 ref={scrollViewRef}
@@ -506,6 +554,7 @@ function InitialSettingsPage({currentUserPersonalDetails}: InitialSettingsPagePr
                     }}
                 />
             </ScrollView>
+            {shouldDisplayLHB && <NavigationTabBar selectedTab={NAVIGATION_TABS.SETTINGS} />}
         </ScreenWrapper>
     );
 }
diff --git a/src/pages/settings/Preferences/LanguagePage.tsx b/src/pages/settings/Preferences/LanguagePage.tsx
index 7ca0b748de82..12cd272064d4 100644
--- a/src/pages/settings/Preferences/LanguagePage.tsx
+++ b/src/pages/settings/Preferences/LanguagePage.tsx
@@ -23,7 +23,6 @@ function LanguagePage() {
         return SORTED_LOCALES.map((locale) => ({
             value: locale,
             text: LOCALE_TO_LANGUAGE_STRING[locale],
-            accessibilityLabel: LOCALE_TO_LANGUAGE_STRING[locale],
             keyForList: locale,
             isSelected: preferredLocale === locale,
         }));
diff --git a/src/pages/settings/Preferences/PreferencesPage.tsx b/src/pages/settings/Preferences/PreferencesPage.tsx
index 9aeb51765627..d49144fda010 100755
--- a/src/pages/settings/Preferences/PreferencesPage.tsx
+++ b/src/pages/settings/Preferences/PreferencesPage.tsx
@@ -7,7 +7,6 @@ import ScrollView from '@components/ScrollView';
 import Section from '@components/Section';
 import Switch from '@components/Switch';
 import Text from '@components/Text';
-import useCurrencyList from '@hooks/useCurrencyList';
 import {useMemoizedLazyIllustrations} from '@hooks/useLazyAsset';
 import useLocalize from '@hooks/useLocalize';
 import useOnyx from '@hooks/useOnyx';
@@ -15,6 +14,7 @@ import usePolicy from '@hooks/usePolicy';
 import useResponsiveLayout from '@hooks/useResponsiveLayout';
 import useThemeStyles from '@hooks/useThemeStyles';
 import {togglePlatformMute, updateNewsletterSubscription} from '@libs/actions/User';
+import {getCurrencySymbol} from '@libs/CurrencyUtils';
 import getPlatform from '@libs/getPlatform';
 import type Platform from '@libs/getPlatform/types';
 import Navigation from '@libs/Navigation/Navigation';
@@ -27,7 +27,6 @@ import {getEmptyObject} from '@src/types/utils/EmptyObject';
 import usePreferencesSectionIllustration from './usePreferencesSectionIllustration';
 
 function PreferencesPage() {
-    const {getCurrencySymbol} = useCurrencyList();
     const illustrations = useMemoizedLazyIllustrations(['Gears']);
     const preferencesIllustration = usePreferencesSectionIllustration();
     const [priorityMode] = useOnyx(ONYXKEYS.NVP_PRIORITY_MODE, {canBeMissing: true});
diff --git a/src/pages/settings/Rules/AddRulePage.tsx b/src/pages/settings/Rules/AddRulePage.tsx
deleted file mode 100644
index fa1806f5e62a..000000000000
--- a/src/pages/settings/Rules/AddRulePage.tsx
+++ /dev/null
@@ -1,13 +0,0 @@
-import React from 'react';
-import RulePageBase from './RulePageBase';
-
-function AddRulePage() {
-    return (
-        <RulePageBase
-            testID="AddRulePage"
-            titleKey="expenseRulesPage.addRule.title"
-        />
-    );
-}
-
-export default AddRulePage;
diff --git a/src/pages/settings/Rules/EditRulePage.tsx b/src/pages/settings/Rules/EditRulePage.tsx
deleted file mode 100644
index 71f9c027dd0a..000000000000
--- a/src/pages/settings/Rules/EditRulePage.tsx
+++ /dev/null
@@ -1,19 +0,0 @@
-import React from 'react';
-import type {PlatformStackScreenProps} from '@libs/Navigation/PlatformStackNavigation/types';
-import type {SettingsNavigatorParamList} from '@libs/Navigation/types';
-import type SCREENS from '@src/SCREENS';
-import RulePageBase from './RulePageBase';
-
-type EditRulePageProps = PlatformStackScreenProps<SettingsNavigatorParamList, typeof SCREENS.SETTINGS.RULES.EDIT>;
-
-function EditRulePage({route}: EditRulePageProps) {
-    return (
-        <RulePageBase
-            testID="EditRulePage"
-            titleKey="expenseRulesPage.editRule.title"
-            hash={route.params.hash}
-        />
-    );
-}
-
-export default EditRulePage;
diff --git a/src/pages/settings/Rules/ExpenseRulesPage.tsx b/src/pages/settings/Rules/ExpenseRulesPage.tsx
index a5c89811e635..14242a31e4df 100644
--- a/src/pages/settings/Rules/ExpenseRulesPage.tsx
+++ b/src/pages/settings/Rules/ExpenseRulesPage.tsx
@@ -1,10 +1,6 @@
-import React, {useEffect, useState} from 'react';
+import React from 'react';
 import {View} from 'react-native';
 import ActivityIndicator from '@components/ActivityIndicator';
-import Button from '@components/Button';
-import ButtonWithDropdownMenu from '@components/ButtonWithDropdownMenu';
-import type {DropdownOption} from '@components/ButtonWithDropdownMenu/types';
-import ConfirmModal from '@components/ConfirmModal';
 import EmptyStateComponent from '@components/EmptyStateComponent';
 import HeaderWithBackButton from '@components/HeaderWithBackButton';
 import LottieAnimations from '@components/LottieAnimations';
@@ -16,127 +12,36 @@ import SelectionListWithModal from '@components/SelectionListWithModal';
 import CustomListHeader from '@components/SelectionListWithModal/CustomListHeader';
 import TableListItemSkeleton from '@components/Skeletons/TableRowSkeleton';
 import Text from '@components/Text';
-import useAutoTurnSelectionModeOffWhenHasNoActiveOption from '@hooks/useAutoTurnSelectionModeOffWhenHasNoActiveOption';
-import {useMemoizedLazyExpensifyIcons, useMemoizedLazyIllustrations} from '@hooks/useLazyAsset';
+import {useMemoizedLazyIllustrations} from '@hooks/useLazyAsset';
 import useLocalize from '@hooks/useLocalize';
-import useMobileSelectionMode from '@hooks/useMobileSelectionMode';
 import useOnyx from '@hooks/useOnyx';
 import useResponsiveLayout from '@hooks/useResponsiveLayout';
 import useThemeStyles from '@hooks/useThemeStyles';
-import {turnOffMobileSelectionMode} from '@libs/actions/MobileSelectionMode';
-import {clearDraftRule, setDraftRule, setNameValuePair} from '@libs/actions/User';
 import {canUseTouchScreen} from '@libs/DeviceCapabilities';
-import {formatExpenseRuleChanges, getKeyForRule} from '@libs/ExpenseRuleUtils';
+import {formatExpenseRuleChanges} from '@libs/ExpenseRuleUtils';
 import Navigation from '@libs/Navigation/Navigation';
 import CONST from '@src/CONST';
 import ONYXKEYS from '@src/ONYXKEYS';
-import ROUTES from '@src/ROUTES';
-import type {ExpenseRule} from '@src/types/onyx';
-import type DeepValueOf from '@src/types/utils/DeepValueOf';
-import getEmptyArray from '@src/types/utils/getEmptyArray';
 import isLoadingOnyxValue from '@src/types/utils/isLoadingOnyxValue';
 
-const getKeyForList = (rule: ExpenseRule, index: number) => `${getKeyForRule(rule)}-${index}`;
-
 function ExpenseRulesPage() {
     const {translate} = useLocalize();
-    const icons = useMemoizedLazyExpensifyIcons(['Pencil', 'Plus', 'Trashcan']);
     const illustrations = useMemoizedLazyIllustrations(['Flash']);
-    const isMobileSelectionModeEnabled = useMobileSelectionMode();
-    const [expenseRules = getEmptyArray<ExpenseRule>(), expenseRulesResult] = useOnyx(ONYXKEYS.NVP_EXPENSE_RULES, {canBeMissing: true});
+    const [expenseRules, expenseRulesResult] = useOnyx(ONYXKEYS.NVP_EXPENSE_RULES, {canBeMissing: true});
     const {shouldUseNarrowLayout} = useResponsiveLayout();
-    const [selectedRules, setSelectedRules] = useState<string[]>([]);
-    const [deleteConfirmModalVisible, setDeleteConfirmModalVisible] = useState(false);
     const styles = useThemeStyles();
 
-    useEffect(() => {
-        // Clear selection when rule is changed as hash is outdated
-        // eslint-disable-next-line react-hooks/set-state-in-effect
-        setSelectedRules([]);
-    }, [expenseRules]);
-
-    const hasRules = expenseRules.length > 0;
+    const hasRules = expenseRules ? expenseRules.length > 0 : false;
     const isLoading = !hasRules && isLoadingOnyxValue(expenseRulesResult);
 
-    const canSelectMultiple = shouldUseNarrowLayout ? isMobileSelectionModeEnabled : true;
-    const selectionModeHeader = isMobileSelectionModeEnabled && shouldUseNarrowLayout;
-    const isInSelectionMode = shouldUseNarrowLayout ? canSelectMultiple : selectedRules.length > 0;
-
-    const toggleRule = (rule: ListItem) => {
-        setSelectedRules((prev) => {
-            if (prev.includes(rule.keyForList)) {
-                return prev.filter((key) => key !== rule.keyForList);
-            }
-            return [...prev, rule.keyForList];
-        });
-    };
-
-    const toggleAllRules = () => {
-        const someSelected = selectedRules.length > 0;
-        setSelectedRules(someSelected ? [] : expenseRules.map(getKeyForList));
-    };
-
-    const navigateToNewRulePage = () => {
-        clearDraftRule();
-        Navigation.navigate(ROUTES.SETTINGS_RULES_ADD.getRoute());
-    };
-
-    const navigateToEditRulePage = (keyForList?: string) => {
-        if (!keyForList) {
-            return;
-        }
-        const hash = keyForList.substring(0, keyForList.indexOf('-'));
-        const expenseRule = expenseRules.find((rule) => getKeyForRule(rule) === hash);
-        if (!expenseRule) {
-            return;
-        }
-        setDraftRule({
-            ...expenseRule,
-            tax: expenseRule.tax?.field_id_TAX ? expenseRule.tax.field_id_TAX.externalID : undefined,
-        });
-        Navigation.navigate(ROUTES.SETTINGS_RULES_EDIT.getRoute(hash));
-    };
-
-    const onSelectRow = (item: ListItem) => {
-        if (shouldUseNarrowLayout && isMobileSelectionModeEnabled) {
-            toggleRule(item);
-            return;
-        }
-        navigateToEditRulePage(item.keyForList);
-    };
-
-    const handleDeleteRules = () => {
-        if (selectedRules.length > 0) {
-            const rulesToDelete = expenseRules.filter((rule, index) => !selectedRules.includes(getKeyForList(rule, index)));
-            setNameValuePair(ONYXKEYS.NVP_EXPENSE_RULES, rulesToDelete, expenseRules);
-        }
-        setDeleteConfirmModalVisible(false);
-        setSelectedRules([]);
-    };
-
-    const headerDropdownOptions: Array<DropdownOption<DeepValueOf<typeof CONST.EXPENSE_RULES.BULK_ACTION_TYPES>>> = [
-        {
-            icon: icons.Trashcan,
-            text: translate(selectedRules.length === 1 ? 'expenseRulesPage.deleteRule.deleteSingle' : 'expenseRulesPage.deleteRule.deleteMultiple'),
-            value: CONST.EXPENSE_RULES.BULK_ACTION_TYPES.DELETE,
-            onSelected: () => setDeleteConfirmModalVisible(true),
-        },
-    ];
-    if (selectedRules.length === 1) {
-        headerDropdownOptions.unshift({
-            icon: icons.Pencil,
-            text: translate('expenseRulesPage.editRule.title'),
-            value: CONST.EXPENSE_RULES.BULK_ACTION_TYPES.EDIT,
-            onSelected: () => navigateToEditRulePage(selectedRules.at(0)),
-        });
-    }
-
-    const rulesList: ListItem[] = expenseRules.map((rule, index) => {
+    const rulesList: ListItem[] = (expenseRules ?? []).map((rule, index) => {
         const changes = formatExpenseRuleChanges(rule, translate);
         return {
             text: rule.merchantToMatch,
             alternateText: shouldUseNarrowLayout ? changes : undefined,
-            keyForList: getKeyForList(rule, index),
+            keyForList: `${rule.merchantToMatch}${index}`,
+            isDisabledCheckbox: true,
+            isDisabled: true,
             rightElement: !shouldUseNarrowLayout && (
                 <View style={[styles.flex1]}>
                     <Text
@@ -150,32 +55,6 @@ function ExpenseRulesPage() {
         };
     });
 
-    useAutoTurnSelectionModeOffWhenHasNoActiveOption(rulesList);
-
-    const headerButton = isInSelectionMode ? (
-        <ButtonWithDropdownMenu
-            buttonSize={CONST.DROPDOWN_BUTTON_SIZE.MEDIUM}
-            customText={translate('workspace.common.selected', {count: selectedRules.length})}
-            isDisabled={!selectedRules.length}
-            isSplitButton={false}
-            onPress={() => null}
-            options={headerDropdownOptions}
-            shouldAlwaysShowDropdownMenu
-            style={[shouldUseNarrowLayout && styles.flexGrow1, shouldUseNarrowLayout && styles.mb3]}
-            testID="ExpenseRulesPage-header-dropdown-menu-button"
-        />
-    ) : (
-        <View style={[styles.flexRow, styles.gap2, shouldUseNarrowLayout && styles.mb3]}>
-            <Button
-                success
-                onPress={navigateToNewRulePage}
-                icon={icons.Plus}
-                text={translate('expenseRulesPage.newRule')}
-                style={[shouldUseNarrowLayout && styles.flex1]}
-            />
-        </View>
-    );
-
     const headerContent = (
         <View style={[styles.ph5, styles.pb5, styles.pt3, shouldUseNarrowLayout && styles.workspaceSectionMobile]}>
             <Text style={[styles.textNormal, styles.colorMuted]}>{translate('expenseRulesPage.subtitle')}</Text>
@@ -185,11 +64,11 @@ function ExpenseRulesPage() {
     const getCustomListHeader = () =>
         !shouldUseNarrowLayout && (
             <CustomListHeader
-                canSelectMultiple={canSelectMultiple}
+                canSelectMultiple={false}
                 leftHeaderText={translate('common.merchant')}
                 rightHeaderText={translate('common.change')}
                 shouldDivideEqualWidth
-                shouldShowRightCaret
+                shouldShowRightCaret={false}
             />
         );
 
@@ -202,23 +81,14 @@ function ExpenseRulesPage() {
             offlineIndicatorStyle={styles.mtAuto}
         >
             <HeaderWithBackButton
-                icon={!selectionModeHeader ? illustrations.Flash : undefined}
+                icon={illustrations.Flash}
+                shouldUseHeadlineHeader
+                title={translate('expenseRulesPage.title')}
+                shouldShowBackButton={shouldUseNarrowLayout}
                 onBackButtonPress={() => {
-                    if (isMobileSelectionModeEnabled) {
-                        setSelectedRules([]);
-                        turnOffMobileSelectionMode();
-                        return;
-                    }
-
                     Navigation.popToSidebar();
                 }}
-                shouldShowBackButton={shouldUseNarrowLayout}
-                shouldUseHeadlineHeader={!selectionModeHeader}
-                title={selectionModeHeader ? translate('common.selectMultiple') : translate('expenseRulesPage.title')}
-            >
-                {!shouldUseNarrowLayout && headerButton}
-            </HeaderWithBackButton>
-            {shouldUseNarrowLayout && <View style={[styles.pl5, styles.pr5]}>{headerButton}</View>}
+            />
             {!hasRules && !isLoading && headerContent}
             {!hasRules && !isLoading && (
                 <ScrollView contentContainerStyle={[styles.flexGrow1, styles.flexShrink0]}>
@@ -242,37 +112,24 @@ function ExpenseRulesPage() {
             )}
             {hasRules && (
                 <SelectionListWithModal
+                    data={rulesList}
+                    onSelectRow={() => {}}
+                    ListItem={TableListItem}
                     addBottomSafeAreaPadding
-                    canSelectMultiple={canSelectMultiple}
+                    canSelectMultiple={false}
                     customListHeader={getCustomListHeader()}
                     customListHeaderContent={headerContent}
-                    data={rulesList}
-                    ListItem={TableListItem}
-                    onCheckboxPress={toggleRule}
-                    onSelectAll={expenseRules.length > 0 ? toggleAllRules : undefined}
-                    onSelectRow={onSelectRow}
-                    onTurnOnSelectionMode={(item) => item && toggleRule(item)}
-                    selectedItems={selectedRules}
-                    shouldHeaderBeInsideList
+                    style={{listHeaderWrapperStyle: [styles.ph9, styles.pv3, styles.pb5]}}
                     shouldPreventDefaultFocusOnSelectRow={!canUseTouchScreen()}
-                    shouldShowRightCaret
                     shouldUseDefaultRightHandSideCheckmark={false}
+                    turnOnSelectionModeOnLongPress={false}
                     showListEmptyContent={false}
+                    shouldShowRightCaret={false}
                     showScrollIndicator={false}
-                    style={{listHeaderWrapperStyle: [styles.ph9, styles.pv3, styles.pb5]}}
-                    turnOnSelectionModeOnLongPress={shouldUseNarrowLayout}
+                    shouldHeaderBeInsideList
+                    isDisabled
                 />
             )}
-            <ConfirmModal
-                isVisible={deleteConfirmModalVisible}
-                onConfirm={handleDeleteRules}
-                onCancel={() => setDeleteConfirmModalVisible(false)}
-                title={translate(selectedRules.length === 1 ? 'expenseRulesPage.deleteRule.deleteSingle' : 'expenseRulesPage.deleteRule.deleteMultiple')}
-                prompt={translate(selectedRules.length === 1 ? 'expenseRulesPage.deleteRule.deleteSinglePrompt' : 'expenseRulesPage.deleteRule.deleteMultiplePrompt')}
-                confirmText={translate('common.delete')}
-                cancelText={translate('common.cancel')}
-                danger
-            />
         </ScreenWrapper>
     );
 }
diff --git a/src/pages/settings/Rules/Fields/AddBillablePage.tsx b/src/pages/settings/Rules/Fields/AddBillablePage.tsx
deleted file mode 100644
index 81ba9c07df5c..000000000000
--- a/src/pages/settings/Rules/Fields/AddBillablePage.tsx
+++ /dev/null
@@ -1,20 +0,0 @@
-import React from 'react';
-import RuleBooleanBasePage from '@components/Rule/RuleBooleanBase';
-import type {PlatformStackScreenProps} from '@libs/Navigation/PlatformStackNavigation/types';
-import type {SettingsNavigatorParamList} from '@libs/Navigation/types';
-import CONST from '@src/CONST';
-import type SCREENS from '@src/SCREENS';
-
-type AddBillablePageProps = PlatformStackScreenProps<SettingsNavigatorParamList, typeof SCREENS.SETTINGS.RULES.EDIT_BILLABLE>;
-
-function AddBillablePage({route}: AddBillablePageProps) {
-    return (
-        <RuleBooleanBasePage
-            fieldID={CONST.EXPENSE_RULES.FIELDS.BILLABLE}
-            hash={route.params?.hash}
-            titleKey="common.billable"
-        />
-    );
-}
-
-export default AddBillablePage;
diff --git a/src/pages/settings/Rules/Fields/AddCategoryPage.tsx b/src/pages/settings/Rules/Fields/AddCategoryPage.tsx
deleted file mode 100644
index 4d9a50507179..000000000000
--- a/src/pages/settings/Rules/Fields/AddCategoryPage.tsx
+++ /dev/null
@@ -1,90 +0,0 @@
-import React, {useCallback, useMemo} from 'react';
-import {View} from 'react-native';
-import type {OnyxCollection} from 'react-native-onyx';
-import HeaderWithBackButton from '@components/HeaderWithBackButton';
-import RuleNotFoundPageWrapper from '@components/Rule/RuleNotFoundPageWrapper';
-import ScreenWrapper from '@components/ScreenWrapper';
-import SearchSingleSelectionPicker from '@components/Search/SearchSingleSelectionPicker';
-import useLocalize from '@hooks/useLocalize';
-import useOnyx from '@hooks/useOnyx';
-import useThemeStyles from '@hooks/useThemeStyles';
-import {updateDraftRule} from '@libs/actions/User';
-import {getAvailableNonPersonalPolicyCategories, getDecodedCategoryName} from '@libs/CategoryUtils';
-import Navigation from '@libs/Navigation/Navigation';
-import type {PlatformStackScreenProps} from '@libs/Navigation/PlatformStackNavigation/types';
-import type {SettingsNavigatorParamList} from '@libs/Navigation/types';
-import ONYXKEYS from '@src/ONYXKEYS';
-import ROUTES from '@src/ROUTES';
-import type SCREENS from '@src/SCREENS';
-import type {PolicyCategories} from '@src/types/onyx';
-import {getEmptyObject} from '@src/types/utils/EmptyObject';
-
-type AddCategoryPageProps = PlatformStackScreenProps<SettingsNavigatorParamList, typeof SCREENS.SETTINGS.RULES.EDIT_CATEGORY>;
-
-function AddCategoryPage({route}: AddCategoryPageProps) {
-    const styles = useThemeStyles();
-    const {translate} = useLocalize();
-
-    const [form] = useOnyx(ONYXKEYS.FORMS.EXPENSE_RULE_FORM, {canBeMissing: true});
-    const [personalPolicyID] = useOnyx(ONYXKEYS.PERSONAL_POLICY_ID, {canBeMissing: true});
-    const availableNonPersonalPolicyCategoriesSelector = useCallback(
-        (allPolicyCategories: OnyxCollection<PolicyCategories>) => getAvailableNonPersonalPolicyCategories(allPolicyCategories, personalPolicyID),
-        [personalPolicyID],
-    );
-    const [allPolicyCategories = getEmptyObject<NonNullable<OnyxCollection<PolicyCategories>>>()] = useOnyx(ONYXKEYS.COLLECTION.POLICY_CATEGORIES, {
-        canBeMissing: true,
-        selector: availableNonPersonalPolicyCategoriesSelector,
-    });
-
-    const selectedCategoryItem = form?.category ? {name: getDecodedCategoryName(form.category), value: form.category} : undefined;
-
-    const categoryItems = useMemo(() => {
-        const uniqueCategoryNames = new Set<string>();
-
-        const categories = Object.values(allPolicyCategories ?? {}).flatMap((policyCategories) => Object.values(policyCategories ?? {}));
-        for (const category of categories) {
-            uniqueCategoryNames.add(category.name);
-        }
-
-        return Array.from(uniqueCategoryNames)
-            .filter(Boolean)
-            .map((categoryName) => {
-                const decodedCategoryName = getDecodedCategoryName(categoryName);
-                return {name: decodedCategoryName, value: categoryName};
-            });
-    }, [allPolicyCategories]);
-
-    const hash = route.params?.hash;
-    const backToRoute = hash ? ROUTES.SETTINGS_RULES_EDIT.getRoute(hash) : ROUTES.SETTINGS_RULES_ADD.getRoute();
-
-    const onSave = (value?: string) => {
-        updateDraftRule({category: value});
-    };
-
-    return (
-        <RuleNotFoundPageWrapper hash={hash}>
-            <ScreenWrapper
-                testID="AddCategoryPage"
-                shouldShowOfflineIndicatorInWideScreen
-                offlineIndicatorStyle={styles.mtAuto}
-                shouldEnableMaxHeight
-            >
-                <HeaderWithBackButton
-                    title={translate('common.category')}
-                    onBackButtonPress={() => Navigation.goBack(backToRoute)}
-                />
-                <View style={[styles.flex1]}>
-                    <SearchSingleSelectionPicker
-                        backToRoute={backToRoute}
-                        initiallySelectedItem={selectedCategoryItem}
-                        items={categoryItems}
-                        onSaveSelection={onSave}
-                        shouldAutoSave
-                    />
-                </View>
-            </ScreenWrapper>
-        </RuleNotFoundPageWrapper>
-    );
-}
-
-export default AddCategoryPage;
diff --git a/src/pages/settings/Rules/Fields/AddDescriptionPage.tsx b/src/pages/settings/Rules/Fields/AddDescriptionPage.tsx
deleted file mode 100644
index a62365e955f8..000000000000
--- a/src/pages/settings/Rules/Fields/AddDescriptionPage.tsx
+++ /dev/null
@@ -1,22 +0,0 @@
-import React from 'react';
-import RuleTextBase from '@components/Rule/RuleTextBase';
-import type {PlatformStackScreenProps} from '@libs/Navigation/PlatformStackNavigation/types';
-import type {SettingsNavigatorParamList} from '@libs/Navigation/types';
-import CONST from '@src/CONST';
-import type SCREENS from '@src/SCREENS';
-
-type AddDescriptionPageProps = PlatformStackScreenProps<SettingsNavigatorParamList, typeof SCREENS.SETTINGS.RULES.EDIT_DESCRIPTION>;
-
-function AddDescriptionPage({route}: AddDescriptionPageProps) {
-    return (
-        <RuleTextBase
-            fieldID={CONST.EXPENSE_RULES.FIELDS.DESCRIPTION}
-            hash={route.params?.hash}
-            titleKey="common.description"
-            testID="AddDescriptionPage"
-            characterLimit={CONST.DESCRIPTION_LIMIT}
-        />
-    );
-}
-
-export default AddDescriptionPage;
diff --git a/src/pages/settings/Rules/Fields/AddMerchantPage.tsx b/src/pages/settings/Rules/Fields/AddMerchantPage.tsx
deleted file mode 100644
index 79db39824fb6..000000000000
--- a/src/pages/settings/Rules/Fields/AddMerchantPage.tsx
+++ /dev/null
@@ -1,24 +0,0 @@
-import React from 'react';
-import RuleTextBase from '@components/Rule/RuleTextBase';
-import type {PlatformStackScreenProps} from '@libs/Navigation/PlatformStackNavigation/types';
-import type {SettingsNavigatorParamList} from '@libs/Navigation/types';
-import CONST from '@src/CONST';
-import type SCREENS from '@src/SCREENS';
-
-type AddMerchantPageProps = PlatformStackScreenProps<SettingsNavigatorParamList, typeof SCREENS.SETTINGS.RULES.EDIT_MERCHANT>;
-
-function AddMerchantPage({route}: AddMerchantPageProps) {
-    return (
-        <RuleTextBase
-            fieldID={CONST.EXPENSE_RULES.FIELDS.MERCHANT}
-            hash={route.params?.hash}
-            hintKey="expenseRulesPage.addRule.merchantHint"
-            isRequired
-            titleKey="common.merchant"
-            testID="AddMerchantPage"
-            characterLimit={CONST.MERCHANT_NAME_MAX_BYTES}
-        />
-    );
-}
-
-export default AddMerchantPage;
diff --git a/src/pages/settings/Rules/Fields/AddReimbursablePage.tsx b/src/pages/settings/Rules/Fields/AddReimbursablePage.tsx
deleted file mode 100644
index 968b0a6ddb1f..000000000000
--- a/src/pages/settings/Rules/Fields/AddReimbursablePage.tsx
+++ /dev/null
@@ -1,20 +0,0 @@
-import React from 'react';
-import RuleBooleanBasePage from '@components/Rule/RuleBooleanBase';
-import type {PlatformStackScreenProps} from '@libs/Navigation/PlatformStackNavigation/types';
-import type {SettingsNavigatorParamList} from '@libs/Navigation/types';
-import CONST from '@src/CONST';
-import type SCREENS from '@src/SCREENS';
-
-type AddReimbursablePageProps = PlatformStackScreenProps<SettingsNavigatorParamList, typeof SCREENS.SETTINGS.RULES.EDIT_REIMBURSABLE>;
-
-function AddReimbursablePage({route}: AddReimbursablePageProps) {
-    return (
-        <RuleBooleanBasePage
-            fieldID={CONST.EXPENSE_RULES.FIELDS.REIMBURSABLE}
-            hash={route.params?.hash}
-            titleKey="common.reimbursable"
-        />
-    );
-}
-
-export default AddReimbursablePage;
diff --git a/src/pages/settings/Rules/Fields/AddRenameMerchantPage.tsx b/src/pages/settings/Rules/Fields/AddRenameMerchantPage.tsx
deleted file mode 100644
index 1418a8f9b357..000000000000
--- a/src/pages/settings/Rules/Fields/AddRenameMerchantPage.tsx
+++ /dev/null
@@ -1,22 +0,0 @@
-import React from 'react';
-import RuleTextBase from '@components/Rule/RuleTextBase';
-import type {PlatformStackScreenProps} from '@libs/Navigation/PlatformStackNavigation/types';
-import type {SettingsNavigatorParamList} from '@libs/Navigation/types';
-import CONST from '@src/CONST';
-import type SCREENS from '@src/SCREENS';
-
-type AddRenameMerchantPageProps = PlatformStackScreenProps<SettingsNavigatorParamList, typeof SCREENS.SETTINGS.RULES.EDIT_RENAME_MERCHANT>;
-
-function AddRenameMerchantPage({route}: AddRenameMerchantPageProps) {
-    return (
-        <RuleTextBase
-            fieldID={CONST.EXPENSE_RULES.FIELDS.RENAME_MERCHANT}
-            hash={route.params?.hash}
-            titleKey="common.merchant"
-            testID="AddRenameMerchantPage"
-            characterLimit={CONST.MERCHANT_NAME_MAX_BYTES}
-        />
-    );
-}
-
-export default AddRenameMerchantPage;
diff --git a/src/pages/settings/Rules/Fields/AddReportPage.tsx b/src/pages/settings/Rules/Fields/AddReportPage.tsx
deleted file mode 100644
index 46fc5dbc08a9..000000000000
--- a/src/pages/settings/Rules/Fields/AddReportPage.tsx
+++ /dev/null
@@ -1,23 +0,0 @@
-import React from 'react';
-import RuleTextBase from '@components/Rule/RuleTextBase';
-import type {PlatformStackScreenProps} from '@libs/Navigation/PlatformStackNavigation/types';
-import type {SettingsNavigatorParamList} from '@libs/Navigation/types';
-import CONST from '@src/CONST';
-import type SCREENS from '@src/SCREENS';
-
-type AddReportPageProps = PlatformStackScreenProps<SettingsNavigatorParamList, typeof SCREENS.SETTINGS.RULES.EDIT_REPORT>;
-
-function AddReportPage({route}: AddReportPageProps) {
-    return (
-        <RuleTextBase
-            fieldID={CONST.EXPENSE_RULES.FIELDS.REPORT}
-            hash={route.params?.hash}
-            labelKey="common.reportName"
-            titleKey="expenseRulesPage.addRule.addToReport"
-            testID="AddReportPage"
-            characterLimit={CONST.REPORT_NAME_LIMIT}
-        />
-    );
-}
-
-export default AddReportPage;
diff --git a/src/pages/settings/Rules/Fields/AddTagPage.tsx b/src/pages/settings/Rules/Fields/AddTagPage.tsx
deleted file mode 100644
index a96648ecce14..000000000000
--- a/src/pages/settings/Rules/Fields/AddTagPage.tsx
+++ /dev/null
@@ -1,79 +0,0 @@
-import React, {useMemo} from 'react';
-import {View} from 'react-native';
-import type {OnyxCollection} from 'react-native-onyx';
-import HeaderWithBackButton from '@components/HeaderWithBackButton';
-import RuleNotFoundPageWrapper from '@components/Rule/RuleNotFoundPageWrapper';
-import ScreenWrapper from '@components/ScreenWrapper';
-import SearchSingleSelectionPicker from '@components/Search/SearchSingleSelectionPicker';
-import useLocalize from '@hooks/useLocalize';
-import useOnyx from '@hooks/useOnyx';
-import useThemeStyles from '@hooks/useThemeStyles';
-import {updateDraftRule} from '@libs/actions/User';
-import Navigation from '@libs/Navigation/Navigation';
-import type {PlatformStackScreenProps} from '@libs/Navigation/PlatformStackNavigation/types';
-import type {SettingsNavigatorParamList} from '@libs/Navigation/types';
-import {getCleanedTagName, getTagNamesFromTagsLists} from '@libs/PolicyUtils';
-import ONYXKEYS from '@src/ONYXKEYS';
-import ROUTES from '@src/ROUTES';
-import type SCREENS from '@src/SCREENS';
-import type {PolicyTagLists} from '@src/types/onyx';
-import {getEmptyObject} from '@src/types/utils/EmptyObject';
-
-type AddTagPageProps = PlatformStackScreenProps<SettingsNavigatorParamList, typeof SCREENS.SETTINGS.RULES.EDIT_TAG>;
-
-function AddTagPage({route}: AddTagPageProps) {
-    const styles = useThemeStyles();
-    const {translate} = useLocalize();
-
-    const [form] = useOnyx(ONYXKEYS.FORMS.EXPENSE_RULE_FORM, {canBeMissing: true});
-    const [allPolicyTagLists = getEmptyObject<NonNullable<OnyxCollection<PolicyTagLists>>>()] = useOnyx(ONYXKEYS.COLLECTION.POLICY_TAGS, {
-        canBeMissing: true,
-    });
-
-    const selectedTagItem = form?.tag ? {name: getCleanedTagName(form.tag), value: form.tag} : undefined;
-
-    const tagItems = useMemo(() => {
-        const uniqueTagNames = new Set<string>();
-
-        const tagListsUnpacked = Object.values(allPolicyTagLists ?? {}).filter((item) => !!item);
-        for (const tag of tagListsUnpacked.map(getTagNamesFromTagsLists).flat()) {
-            uniqueTagNames.add(tag);
-        }
-
-        return Array.from(uniqueTagNames).map((tagName) => ({name: getCleanedTagName(tagName), value: tagName}));
-    }, [allPolicyTagLists]);
-
-    const hash = route.params?.hash;
-    const backToRoute = hash ? ROUTES.SETTINGS_RULES_EDIT.getRoute(hash) : ROUTES.SETTINGS_RULES_ADD.getRoute();
-
-    const onSave = (value?: string) => {
-        updateDraftRule({tag: value});
-    };
-
-    return (
-        <RuleNotFoundPageWrapper hash={hash}>
-            <ScreenWrapper
-                testID="AddTagPage"
-                shouldShowOfflineIndicatorInWideScreen
-                offlineIndicatorStyle={styles.mtAuto}
-                shouldEnableMaxHeight
-            >
-                <HeaderWithBackButton
-                    title={translate('common.tag')}
-                    onBackButtonPress={() => Navigation.goBack(backToRoute)}
-                />
-                <View style={[styles.flex1]}>
-                    <SearchSingleSelectionPicker
-                        backToRoute={backToRoute}
-                        initiallySelectedItem={selectedTagItem}
-                        items={tagItems}
-                        onSaveSelection={onSave}
-                        shouldAutoSave
-                    />
-                </View>
-            </ScreenWrapper>
-        </RuleNotFoundPageWrapper>
-    );
-}
-
-export default AddTagPage;
diff --git a/src/pages/settings/Rules/Fields/AddTaxRatePage.tsx b/src/pages/settings/Rules/Fields/AddTaxRatePage.tsx
deleted file mode 100644
index 8b799e9bf16e..000000000000
--- a/src/pages/settings/Rules/Fields/AddTaxRatePage.tsx
+++ /dev/null
@@ -1,67 +0,0 @@
-import React from 'react';
-import {View} from 'react-native';
-import HeaderWithBackButton from '@components/HeaderWithBackButton';
-import RuleNotFoundPageWrapper from '@components/Rule/RuleNotFoundPageWrapper';
-import ScreenWrapper from '@components/ScreenWrapper';
-import SearchSingleSelectionPicker from '@components/Search/SearchSingleSelectionPicker';
-import useLocalize from '@hooks/useLocalize';
-import useOnyx from '@hooks/useOnyx';
-import useThemeStyles from '@hooks/useThemeStyles';
-import {updateDraftRule} from '@libs/actions/User';
-import Navigation from '@libs/Navigation/Navigation';
-import type {PlatformStackScreenProps} from '@libs/Navigation/PlatformStackNavigation/types';
-import type {SettingsNavigatorParamList} from '@libs/Navigation/types';
-import {getAllTaxRatesNamesAndValues} from '@libs/PolicyUtils';
-import ONYXKEYS from '@src/ONYXKEYS';
-import ROUTES from '@src/ROUTES';
-import type SCREENS from '@src/SCREENS';
-
-type AddTaxRatePageProps = PlatformStackScreenProps<SettingsNavigatorParamList, typeof SCREENS.SETTINGS.RULES.EDIT_TAX>;
-
-function AddTaxRatePage({route}: AddTaxRatePageProps) {
-    const styles = useThemeStyles();
-    const {translate} = useLocalize();
-
-    const [form] = useOnyx(ONYXKEYS.FORMS.EXPENSE_RULE_FORM, {canBeMissing: true});
-    const [allTaxRates] = useOnyx(ONYXKEYS.COLLECTION.POLICY, {canBeMissing: true, selector: getAllTaxRatesNamesAndValues});
-
-    const taxItems = Object.entries(allTaxRates ?? {}).map(([taxRateKey, taxRate]) => ({
-        name: `${taxRate.name} (${taxRate.value})`,
-        value: taxRateKey,
-    }));
-    const selectedTaxItem = form?.tax ? taxItems.find(({value}) => value === form.tax) : undefined;
-
-    const hash = route.params?.hash;
-    const backToRoute = hash ? ROUTES.SETTINGS_RULES_EDIT.getRoute(hash) : ROUTES.SETTINGS_RULES_ADD.getRoute();
-
-    const onSave = (value?: string) => {
-        updateDraftRule({tax: value});
-    };
-
-    return (
-        <RuleNotFoundPageWrapper hash={hash}>
-            <ScreenWrapper
-                testID="AddTaxRatePage"
-                shouldShowOfflineIndicatorInWideScreen
-                offlineIndicatorStyle={styles.mtAuto}
-                shouldEnableMaxHeight
-            >
-                <HeaderWithBackButton
-                    title={translate('common.tax')}
-                    onBackButtonPress={() => Navigation.goBack(backToRoute)}
-                />
-                <View style={[styles.flex1]}>
-                    <SearchSingleSelectionPicker
-                        backToRoute={backToRoute}
-                        initiallySelectedItem={selectedTaxItem}
-                        items={taxItems}
-                        onSaveSelection={onSave}
-                        shouldAutoSave
-                    />
-                </View>
-            </ScreenWrapper>
-        </RuleNotFoundPageWrapper>
-    );
-}
-
-export default AddTaxRatePage;
diff --git a/src/pages/settings/Rules/RulePageBase.tsx b/src/pages/settings/Rules/RulePageBase.tsx
deleted file mode 100644
index f5717715be4e..000000000000
--- a/src/pages/settings/Rules/RulePageBase.tsx
+++ /dev/null
@@ -1,267 +0,0 @@
-import React, {useCallback, useEffect, useState} from 'react';
-import {View} from 'react-native';
-import type {OnyxCollection} from 'react-native-onyx';
-import type {ValueOf} from 'type-fest';
-import FormAlertWithSubmitButton from '@components/FormAlertWithSubmitButton';
-import HeaderWithBackButton from '@components/HeaderWithBackButton';
-import type {LocalizedTranslate} from '@components/LocaleContextProvider';
-import MenuItemWithTopDescription from '@components/MenuItemWithTopDescription';
-import RuleNotFoundPageWrapper from '@components/Rule/RuleNotFoundPageWrapper';
-import ScreenWrapper from '@components/ScreenWrapper';
-import ScrollView from '@components/ScrollView';
-import Text from '@components/Text';
-import useLocalize from '@hooks/useLocalize';
-import useOnyx from '@hooks/useOnyx';
-import useThemeStyles from '@hooks/useThemeStyles';
-import {clearDraftRule, setNameValuePair, updateDraftRule} from '@libs/actions/User';
-import {getAvailableNonPersonalPolicyCategories, getDecodedCategoryName} from '@libs/CategoryUtils';
-import {extractRuleFromForm, getKeyForRule} from '@libs/ExpenseRuleUtils';
-import Navigation from '@libs/Navigation/Navigation';
-import {getAllTaxRatesNamesAndValues, getCleanedTagName, getTagNamesFromTagsLists} from '@libs/PolicyUtils';
-import ToggleSettingOptionRow from '@pages/workspace/workflows/ToggleSettingsOptionRow';
-import CONST from '@src/CONST';
-import type {TranslationPaths} from '@src/languages/types';
-import ONYXKEYS from '@src/ONYXKEYS';
-import ROUTES from '@src/ROUTES';
-import type {ExpenseRuleForm} from '@src/types/form';
-import type {ExpenseRule, PolicyCategories, PolicyTagLists} from '@src/types/onyx';
-import getEmptyArray from '@src/types/utils/getEmptyArray';
-
-type RulePageBaseProps = {
-    titleKey: TranslationPaths;
-    testID: string;
-    hash?: string;
-};
-
-type SectionType = {
-    titleTranslationKey: TranslationPaths;
-    items: Array<
-        | {
-              descriptionTranslationKey: TranslationPaths;
-              required?: boolean;
-              title?: string;
-              onPress: () => void;
-          }
-        | undefined
-    >;
-};
-
-const navigateTo = (field: ValueOf<typeof CONST.EXPENSE_RULES.FIELDS>, hash?: string) => {
-    if (hash) {
-        Navigation.navigate(ROUTES.SETTINGS_RULES_EDIT.getRoute(hash, field));
-    } else {
-        Navigation.navigate(ROUTES.SETTINGS_RULES_ADD.getRoute(field));
-    }
-};
-
-const getErrorMessage = (translate: LocalizedTranslate, form?: ExpenseRuleForm) => {
-    const hasAtLeastOneUpdate = Object.entries(form ?? {}).some(([key, value]) => key !== CONST.EXPENSE_RULES.FIELDS.MERCHANT && key !== CONST.EXPENSE_RULES.FIELDS.CREATE_REPORT && !!value);
-    if (form?.merchantToMatch && hasAtLeastOneUpdate) {
-        return '';
-    }
-    if (hasAtLeastOneUpdate) {
-        return translate('expenseRulesPage.addRule.confirmErrorMerchant');
-    }
-    if (form?.merchantToMatch) {
-        return translate('expenseRulesPage.addRule.confirmErrorUpdate');
-    }
-    return translate('expenseRulesPage.addRule.confirmError');
-};
-
-const tagsSelector = (allPolicyTagLists: OnyxCollection<PolicyTagLists>) => {
-    const tagListsUnpacked = Object.values(allPolicyTagLists ?? {}).filter((item) => !!item);
-    return tagListsUnpacked.map(getTagNamesFromTagsLists).flat().length > 0;
-};
-
-function RulePageBase({titleKey, testID, hash}: RulePageBaseProps) {
-    const {translate} = useLocalize();
-    const [expenseRules = getEmptyArray<ExpenseRule>()] = useOnyx(ONYXKEYS.NVP_EXPENSE_RULES, {canBeMissing: true});
-    const [form] = useOnyx(ONYXKEYS.FORMS.EXPENSE_RULE_FORM, {canBeMissing: true});
-    // Cannot use useRef because react compiler fails
-    const [isSaving, setIsSaving] = useState(false);
-    const [shouldShowError, setShouldShowError] = useState(false);
-    const styles = useThemeStyles();
-
-    useEffect(() => () => clearDraftRule(), []);
-
-    const [personalPolicyID] = useOnyx(ONYXKEYS.PERSONAL_POLICY_ID, {canBeMissing: true});
-    const categoriesSelector = useCallback(
-        (allPolicyCategories: OnyxCollection<PolicyCategories>) => {
-            const categories = getAvailableNonPersonalPolicyCategories(allPolicyCategories, personalPolicyID);
-            return Object.values(categories ?? {}).flatMap((policyCategories) => Object.values(policyCategories ?? {})).length > 0;
-        },
-        [personalPolicyID],
-    );
-    const [hasPolicyCategories] = useOnyx(ONYXKEYS.COLLECTION.POLICY_CATEGORIES, {
-        canBeMissing: true,
-        selector: categoriesSelector,
-    });
-    const [hasPolicyTags] = useOnyx(ONYXKEYS.COLLECTION.POLICY_TAGS, {
-        canBeMissing: true,
-        selector: tagsSelector,
-    });
-
-    const [allTaxRates] = useOnyx(ONYXKEYS.COLLECTION.POLICY, {
-        canBeMissing: true,
-        selector: getAllTaxRatesNamesAndValues,
-    });
-    const hasTaxRates = Object.keys(allTaxRates ?? {}).length > 0;
-    const selectedTaxRate = form?.tax ? allTaxRates?.[form.tax] : undefined;
-
-    const errorMessage = getErrorMessage(translate, form);
-
-    const handleSubmit = () => {
-        if (errorMessage) {
-            setShouldShowError(true);
-            return;
-        }
-        if (!form) {
-            return;
-        }
-
-        setIsSaving(true);
-
-        const newRule = extractRuleFromForm(form, selectedTaxRate);
-        let newRules;
-        if (hash) {
-            let isUpdated = false;
-            newRules = expenseRules.map((rule) => {
-                if (!isUpdated && getKeyForRule(rule) === hash) {
-                    isUpdated = true;
-                    return newRule;
-                }
-                return rule;
-            });
-        } else {
-            newRules = [...expenseRules, newRule];
-        }
-        setNameValuePair(ONYXKEYS.NVP_EXPENSE_RULES, newRules, expenseRules);
-
-        Navigation.goBack();
-    };
-
-    const sections: SectionType[] = [
-        {
-            titleTranslationKey: 'expenseRulesPage.addRule.expenseContains',
-            items: [
-                {
-                    descriptionTranslationKey: 'common.merchant',
-                    required: true,
-                    title: form?.merchantToMatch,
-                    onPress: () => navigateTo(CONST.EXPENSE_RULES.FIELDS.MERCHANT, hash),
-                },
-            ],
-        },
-        {
-            titleTranslationKey: 'expenseRulesPage.addRule.applyUpdates',
-            items: [
-                {
-                    descriptionTranslationKey: 'common.merchant',
-                    title: form?.merchant,
-                    onPress: () => navigateTo(CONST.EXPENSE_RULES.FIELDS.RENAME_MERCHANT, hash),
-                },
-                hasPolicyCategories
-                    ? {
-                          descriptionTranslationKey: 'common.category',
-                          title: form?.category ? getDecodedCategoryName(form.category) : undefined,
-                          onPress: () => navigateTo(CONST.EXPENSE_RULES.FIELDS.CATEGORY, hash),
-                      }
-                    : undefined,
-                hasPolicyTags
-                    ? {
-                          descriptionTranslationKey: 'common.tag',
-                          title: form?.tag ? getCleanedTagName(form.tag) : undefined,
-                          onPress: () => navigateTo(CONST.EXPENSE_RULES.FIELDS.TAG, hash),
-                      }
-                    : undefined,
-                hasTaxRates
-                    ? {
-                          descriptionTranslationKey: 'common.tax',
-                          title: selectedTaxRate ? `${selectedTaxRate.name} (${selectedTaxRate.value})` : undefined,
-                          onPress: () => navigateTo(CONST.EXPENSE_RULES.FIELDS.TAX, hash),
-                      }
-                    : undefined,
-                {
-                    descriptionTranslationKey: 'common.description',
-                    title: form?.comment,
-                    onPress: () => navigateTo(CONST.EXPENSE_RULES.FIELDS.DESCRIPTION, hash),
-                },
-                {
-                    descriptionTranslationKey: 'common.reimbursable',
-                    title: form?.reimbursable ? translate(form.reimbursable === 'true' ? 'common.yes' : 'common.no') : '',
-                    onPress: () => navigateTo(CONST.EXPENSE_RULES.FIELDS.REIMBURSABLE, hash),
-                },
-                {
-                    descriptionTranslationKey: 'common.billable',
-                    title: form?.billable ? translate(form.billable === 'true' ? 'common.yes' : 'common.no') : '',
-                    onPress: () => navigateTo(CONST.EXPENSE_RULES.FIELDS.BILLABLE, hash),
-                },
-                {
-                    descriptionTranslationKey: 'expenseRulesPage.addRule.addToReport',
-                    title: form?.report,
-                    onPress: () => navigateTo(CONST.EXPENSE_RULES.FIELDS.REPORT, hash),
-                },
-            ],
-        },
-    ];
-
-    return (
-        <RuleNotFoundPageWrapper
-            hash={hash}
-            shouldPreventShow={isSaving}
-        >
-            <ScreenWrapper
-                testID={testID}
-                shouldShowOfflineIndicatorInWideScreen
-                offlineIndicatorStyle={styles.mtAuto}
-                includeSafeAreaPaddingBottom
-            >
-                <HeaderWithBackButton title={translate(titleKey)} />
-                <ScrollView contentContainerStyle={[styles.flexGrow1]}>
-                    {sections.map((section) => (
-                        <View key={section.titleTranslationKey}>
-                            <Text style={[styles.textHeadlineH2, styles.reportHorizontalRule, styles.mt4, styles.mb2]}>{translate(section.titleTranslationKey)}</Text>
-                            {section.items.map((item) => {
-                                if (!item) {
-                                    return null;
-                                }
-                                return (
-                                    <MenuItemWithTopDescription
-                                        key={item.descriptionTranslationKey}
-                                        description={translate(item.descriptionTranslationKey)}
-                                        errorText={shouldShowError && item.required && !item.title ? translate('common.error.fieldRequired') : ''}
-                                        onPress={item.onPress}
-                                        rightLabel={item.required ? translate('common.required') : undefined}
-                                        shouldShowRightIcon
-                                        title={item.title}
-                                        titleStyle={styles.flex1}
-                                    />
-                                );
-                            })}
-                        </View>
-                    ))}
-                    <View style={[styles.flexRow, styles.alignItemsCenter, styles.ml5, styles.mr8, styles.optionRow]}>
-                        <ToggleSettingOptionRow
-                            isActive={form?.createReport ?? false}
-                            onToggle={(isEnabled) => updateDraftRule({createReport: isEnabled})}
-                            switchAccessibilityLabel={translate('expenseRulesPage.addRule.createReport')}
-                            title={translate('expenseRulesPage.addRule.createReport')}
-                            titleStyle={styles.pv2}
-                            wrapperStyle={styles.flex1}
-                        />
-                    </View>
-                </ScrollView>
-                <FormAlertWithSubmitButton
-                    buttonText={translate('expenseRulesPage.addRule.saveRule')}
-                    containerStyles={[styles.m4, styles.mb5]}
-                    isAlertVisible={shouldShowError && !!errorMessage}
-                    message={errorMessage}
-                    onSubmit={handleSubmit}
-                    enabledWhenOffline
-                />
-            </ScreenWrapper>
-        </RuleNotFoundPageWrapper>
-    );
-}
-
-export default RulePageBase;
diff --git a/src/pages/settings/Security/AddDelegate/UpdateDelegateRole/ValidateCodeForm/BaseValidateCodeForm.tsx b/src/pages/settings/Security/AddDelegate/UpdateDelegateRole/ValidateCodeForm/BaseValidateCodeForm.tsx
index 48cfbce5f4ee..4483c3790ce4 100644
--- a/src/pages/settings/Security/AddDelegate/UpdateDelegateRole/ValidateCodeForm/BaseValidateCodeForm.tsx
+++ b/src/pages/settings/Security/AddDelegate/UpdateDelegateRole/ValidateCodeForm/BaseValidateCodeForm.tsx
@@ -1,6 +1,6 @@
 import {useFocusEffect} from '@react-navigation/native';
 import type {ForwardedRef} from 'react';
-import React, {useImperativeHandle, useRef, useState} from 'react';
+import React, {useCallback, useImperativeHandle, useRef, useState} from 'react';
 import {View} from 'react-native';
 import type {StyleProp, ViewStyle} from 'react-native';
 import Button from '@components/Button';
@@ -88,23 +88,25 @@ function BaseValidateCodeForm({autoComplete = 'one-time-code', innerRef = () =>
         },
     }));
 
-    useFocusEffect(() => {
-        if (!inputValidateCodeRef.current) {
-            return;
-        }
-        if (focusTimeoutRef.current) {
-            clearTimeout(focusTimeoutRef.current);
-        }
-        focusTimeoutRef.current = setTimeout(() => {
-            inputValidateCodeRef.current?.focusLastSelected();
-        }, CONST.ANIMATED_TRANSITION);
-        return () => {
-            if (!focusTimeoutRef.current) {
+    useFocusEffect(
+        useCallback(() => {
+            if (!inputValidateCodeRef.current) {
                 return;
             }
-            clearTimeout(focusTimeoutRef.current);
-        };
-    });
+            if (focusTimeoutRef.current) {
+                clearTimeout(focusTimeoutRef.current);
+            }
+            focusTimeoutRef.current = setTimeout(() => {
+                inputValidateCodeRef.current?.focusLastSelected();
+            }, CONST.ANIMATED_TRANSITION);
+            return () => {
+                if (!focusTimeoutRef.current) {
+                    return;
+                }
+                clearTimeout(focusTimeoutRef.current);
+            };
+        }, []),
+    );
 
     /**
      * Request a validate code / magic code be sent to verify this contact method
@@ -121,18 +123,21 @@ function BaseValidateCodeForm({autoComplete = 'one-time-code', innerRef = () =>
     /**
      * Handle text input and clear formError upon text change
      */
-    const onTextInput = (text: string) => {
-        setValidateCode(text);
-        setFormError({});
-        if (validateLoginError) {
-            clearDelegateErrorsByField({email: currentDelegate?.email ?? '', fieldName: 'updateDelegateRole', delegatedAccess: account?.delegatedAccess});
-        }
-    };
+    const onTextInput = useCallback(
+        (text: string) => {
+            setValidateCode(text);
+            setFormError({});
+            if (validateLoginError) {
+                clearDelegateErrorsByField({email: currentDelegate?.email ?? '', fieldName: 'updateDelegateRole', delegatedAccess: account?.delegatedAccess});
+            }
+        },
+        [currentDelegate?.email, validateLoginError, account?.delegatedAccess],
+    );
 
     /**
      * Check that all the form fields are valid, then trigger the submit callback
      */
-    const validateAndSubmitForm = () => {
+    const validateAndSubmitForm = useCallback(() => {
         if (!validateCode.trim()) {
             setFormError({validateCode: 'validateCodeForm.error.pleaseFillMagicCode'});
             return;
@@ -146,7 +151,7 @@ function BaseValidateCodeForm({autoComplete = 'one-time-code', innerRef = () =>
         setFormError({});
 
         updateDelegateRole({email: delegate, role, validateCode, delegatedAccess: account?.delegatedAccess});
-    };
+    }, [delegate, role, validateCode, account?.delegatedAccess]);
 
     return (
         <View style={[styles.flex1, styles.justifyContentBetween, wrapperStyle]}>
diff --git a/src/pages/settings/Security/CloseAccountPage.tsx b/src/pages/settings/Security/CloseAccountPage.tsx
index a9113ffc59bf..db99fe85ccba 100644
--- a/src/pages/settings/Security/CloseAccountPage.tsx
+++ b/src/pages/settings/Security/CloseAccountPage.tsx
@@ -13,7 +13,7 @@ import TextInput from '@components/TextInput';
 import useLocalize from '@hooks/useLocalize';
 import useOnyx from '@hooks/useOnyx';
 import useThemeStyles from '@hooks/useThemeStyles';
-import {formatE164PhoneNumber, getPhoneNumberWithoutSpecialChars, sanitizePhoneOrEmail} from '@libs/LoginUtils';
+import {formatE164PhoneNumber, getPhoneNumberWithoutSpecialChars} from '@libs/LoginUtils';
 import Navigation from '@libs/Navigation/Navigation';
 import {getFieldRequiredErrors} from '@libs/ValidationUtils';
 import variables from '@styles/variables';
@@ -57,6 +57,13 @@ function CloseAccountPage() {
 
     const userEmailOrPhone = session?.email ? formatPhoneNumber(session.email) : null;
 
+    /**
+     * Removes spaces and transform the input string to lowercase.
+     * @param phoneOrEmail - The input string to be sanitized.
+     * @returns The sanitized string
+     */
+    const sanitizePhoneOrEmail = (phoneOrEmail: string): string => phoneOrEmail.replaceAll(/\s+/g, '').toLowerCase();
+
     const validate = (values: FormOnyxValues<typeof ONYXKEYS.FORMS.CLOSE_ACCOUNT_FORM>): FormInputErrors<typeof ONYXKEYS.FORMS.CLOSE_ACCOUNT_FORM> => {
         const errors = getFieldRequiredErrors(values, ['phoneOrEmail']);
 
diff --git a/src/pages/settings/Security/MergeAccounts/AccountValidatePage.tsx b/src/pages/settings/Security/MergeAccounts/AccountValidatePage.tsx
index 22667c014369..c5fb9ffa2e8f 100644
--- a/src/pages/settings/Security/MergeAccounts/AccountValidatePage.tsx
+++ b/src/pages/settings/Security/MergeAccounts/AccountValidatePage.tsx
@@ -1,5 +1,5 @@
 import {useFocusEffect, useNavigation, useRoute} from '@react-navigation/native';
-import React, {useEffect, useRef} from 'react';
+import React, {useCallback, useEffect, useRef} from 'react';
 import {InteractionManager, View} from 'react-native';
 import type {OnyxEntry} from 'react-native-onyx';
 import type {ValueOf} from 'type-fest';
@@ -109,32 +109,40 @@ function AccountValidatePage() {
     const styles = useThemeStyles();
     const {translate} = useLocalize();
 
-    useFocusEffect(() => {
-        if (!isAccountMerged || !email) {
-            return;
-        }
-        return Navigation.navigate(ROUTES.SETTINGS_MERGE_ACCOUNTS_RESULT.getRoute(email, 'success'), {forceReplace: true});
-    });
-
-    useFocusEffect(() => {
-        if (!errorPage || !email) {
-            return;
-        }
-        return Navigation.navigate(ROUTES.SETTINGS_MERGE_ACCOUNTS_RESULT.getRoute(email, errorPage), {forceReplace: true});
-    });
-
-    useFocusEffect(() => {
-        // eslint-disable-next-line @typescript-eslint/no-deprecated
-        const task = InteractionManager.runAfterInteractions(() => {
-            if (privateSubscription?.type !== CONST.SUBSCRIPTION.TYPE.INVOICING) {
+    useFocusEffect(
+        useCallback(() => {
+            if (!isAccountMerged || !email) {
                 return;
             }
+            return Navigation.navigate(ROUTES.SETTINGS_MERGE_ACCOUNTS_RESULT.getRoute(email, 'success'), {forceReplace: true});
+        }, [isAccountMerged, email]),
+    );
 
-            Navigation.navigate(ROUTES.SETTINGS_MERGE_ACCOUNTS_RESULT.getRoute(currentUserPersonalDetails.login ?? '', CONST.MERGE_ACCOUNT_RESULTS.ERR_INVOICING, ROUTES.SETTINGS_SECURITY));
-        });
+    useFocusEffect(
+        useCallback(() => {
+            if (!errorPage || !email) {
+                return;
+            }
+            return Navigation.navigate(ROUTES.SETTINGS_MERGE_ACCOUNTS_RESULT.getRoute(email, errorPage), {forceReplace: true});
+        }, [errorPage, email]),
+    );
 
-        return () => task.cancel();
-    });
+    useFocusEffect(
+        useCallback(() => {
+            // eslint-disable-next-line @typescript-eslint/no-deprecated
+            const task = InteractionManager.runAfterInteractions(() => {
+                if (privateSubscription?.type !== CONST.SUBSCRIPTION.TYPE.INVOICING) {
+                    return;
+                }
+
+                Navigation.navigate(
+                    ROUTES.SETTINGS_MERGE_ACCOUNTS_RESULT.getRoute(currentUserPersonalDetails.login ?? '', CONST.MERGE_ACCOUNT_RESULTS.ERR_INVOICING, ROUTES.SETTINGS_SECURITY),
+                );
+            });
+
+            return () => task.cancel();
+        }, [privateSubscription?.type, currentUserPersonalDetails.login]),
+    );
 
     useEffect(() => {
         const unsubscribe = navigation.addListener('blur', () => {
diff --git a/src/pages/settings/Security/SecuritySettingsPage.tsx b/src/pages/settings/Security/SecuritySettingsPage.tsx
index 3e4e91133ee0..c90b07039067 100644
--- a/src/pages/settings/Security/SecuritySettingsPage.tsx
+++ b/src/pages/settings/Security/SecuritySettingsPage.tsx
@@ -385,7 +385,6 @@ function SecuritySettingsPage() {
                                             <TextLink
                                                 style={[styles.link]}
                                                 href={CONST.COPILOT_HELP_URL}
-                                                accessibilityLabel={translate('delegate.copilotDelegatedAccess')}
                                             >
                                                 {translate('common.learnMore')}
                                             </TextLink>
diff --git a/src/pages/settings/Security/TwoFactorAuth/CopyCodesPage.tsx b/src/pages/settings/Security/TwoFactorAuth/CopyCodesPage.tsx
index 133541baffe5..5616ffcaba45 100644
--- a/src/pages/settings/Security/TwoFactorAuth/CopyCodesPage.tsx
+++ b/src/pages/settings/Security/TwoFactorAuth/CopyCodesPage.tsx
@@ -1,4 +1,3 @@
-import {useIsFocused} from '@react-navigation/native';
 import React, {useEffect, useState} from 'react';
 import {View} from 'react-native';
 import ActivityIndicator from '@components/ActivityIndicator';
@@ -39,7 +38,6 @@ function CopyCodesPage({route}: TwoFactorAuthPageProps) {
     // eslint-disable-next-line rulesdir/prefer-shouldUseNarrowLayout-instead-of-isSmallScreenWidth
     const {isExtraSmallScreenWidth, isSmallScreenWidth} = useResponsiveLayout();
     const [error, setError] = useState('');
-    const isFocused = useIsFocused();
 
     const [account, accountMetadata] = useOnyx(ONYXKEYS.ACCOUNT, {canBeMissing: true});
 
@@ -55,16 +53,9 @@ function CopyCodesPage({route}: TwoFactorAuthPageProps) {
         if (isLoadingOnyxValue(accountMetadata) || account?.requiresTwoFactorAuth || account?.recoveryCodes || !isUserValidated) {
             return;
         }
-
-        // This screen is rendered underneath other 2FA screens. We don't want it making
-        // API calls in the background in response to state updates
-        if (!isFocused) {
-            return;
-        }
-
         toggleTwoFactorAuth(true);
         // eslint-disable-next-line react-hooks/exhaustive-deps -- We want to run this when component mounts
-    }, [isUserValidated, accountMetadata.status, isFocused]);
+    }, [isUserValidated, accountMetadata.status]);
 
     return (
         <TwoFactorAuthWrapper
diff --git a/src/pages/settings/Security/TwoFactorAuth/SuccessPage.tsx b/src/pages/settings/Security/TwoFactorAuth/SuccessPage.tsx
index 9a28bee33283..1b06f1293d7b 100644
--- a/src/pages/settings/Security/TwoFactorAuth/SuccessPage.tsx
+++ b/src/pages/settings/Security/TwoFactorAuth/SuccessPage.tsx
@@ -22,11 +22,19 @@ function SuccessPage({route}: SuccessPageProps) {
     const styles = useThemeStyles();
 
     const goBack = useCallback(() => {
+        if (route.params?.backTo === ROUTES.REQUIRE_TWO_FACTOR_AUTH) {
+            Navigation.dismissModal();
+            return;
+        }
         quitAndNavigateBack(route.params?.backTo ?? ROUTES.SETTINGS_2FA_ROOT.getRoute());
     }, [route.params?.backTo]);
 
     useEffect(() => {
         return () => {
+            // When the 2FA RHP is closed, we want to remove the 2FA required page from the navigation stack too.
+            if (route.params?.backTo !== ROUTES.REQUIRE_TWO_FACTOR_AUTH) {
+                return;
+            }
             Navigation.popRootToTop();
         };
         // eslint-disable-next-line react-hooks/exhaustive-deps
diff --git a/src/pages/settings/Security/TwoFactorAuth/TwoFactorAuthForm/BaseTwoFactorAuthForm.tsx b/src/pages/settings/Security/TwoFactorAuth/TwoFactorAuthForm/BaseTwoFactorAuthForm.tsx
index 05d1d516f226..21368eef5ffa 100644
--- a/src/pages/settings/Security/TwoFactorAuth/TwoFactorAuthForm/BaseTwoFactorAuthForm.tsx
+++ b/src/pages/settings/Security/TwoFactorAuth/TwoFactorAuthForm/BaseTwoFactorAuthForm.tsx
@@ -255,7 +255,6 @@ function BaseTwoFactorAuthForm({autoComplete, validateInsteadOfDisable, onFocus,
                     errorText={formError.twoFactorAuthCode ?? errorMessage}
                     ref={inputRef}
                     autoFocus={false}
-                    accessibilityLabel={translate('common.twoFactorCode')}
                     testID="twoFactorAuthCodeInput"
                 />
             )}
diff --git a/src/pages/settings/Subscription/SubscriptionPlan/SubscriptionPlanCardActionButton.tsx b/src/pages/settings/Subscription/SubscriptionPlan/SubscriptionPlanCardActionButton.tsx
index 45e5eb6c1910..80f71e011ddc 100644
--- a/src/pages/settings/Subscription/SubscriptionPlan/SubscriptionPlanCardActionButton.tsx
+++ b/src/pages/settings/Subscription/SubscriptionPlan/SubscriptionPlanCardActionButton.tsx
@@ -4,7 +4,6 @@ import {View} from 'react-native';
 import Button from '@components/Button';
 import MenuItemWithTopDescription from '@components/MenuItemWithTopDescription';
 import Text from '@components/Text';
-import useCurrentUserPersonalDetails from '@hooks/useCurrentUserPersonalDetails';
 import useHasTeam2025Pricing from '@hooks/useHasTeam2025Pricing';
 import useLocalize from '@hooks/useLocalize';
 import useOnyx from '@hooks/useOnyx';
@@ -14,6 +13,7 @@ import {upgradeToCorporate} from '@libs/actions/Policy/Policy';
 import {getOwnedPaidPolicies, isPolicyAdmin} from '@libs/PolicyUtils';
 import {isSubscriptionTypeOfInvoicing} from '@libs/SubscriptionUtils';
 import Navigation from '@navigation/Navigation';
+import {getCurrentUserAccountID} from '@userActions/Report';
 import CONST from '@src/CONST';
 import ONYXKEYS from '@src/ONYXKEYS';
 import ROUTES from '@src/ROUTES';
@@ -41,7 +41,7 @@ function SubscriptionPlanCardActionButton({subscriptionPlan, isFromComparisonMod
     const styles = useThemeStyles();
     const {translate} = useLocalize();
     const hasTeam2025Pricing = useHasTeam2025Pricing();
-    const {accountID: currentUserAccountID} = useCurrentUserPersonalDetails();
+    const currentUserAccountID = getCurrentUserAccountID();
     const [policies] = useOnyx(ONYXKEYS.COLLECTION.POLICY, {canBeMissing: false});
     const [account] = useOnyx(ONYXKEYS.ACCOUNT, {canBeMissing: false});
     const privateSubscription = usePrivateSubscription();
diff --git a/src/pages/settings/VerifyAccountPageBase.tsx b/src/pages/settings/VerifyAccountPageBase.tsx
index d31c52d20f73..088d6267677e 100644
--- a/src/pages/settings/VerifyAccountPageBase.tsx
+++ b/src/pages/settings/VerifyAccountPageBase.tsx
@@ -14,18 +14,12 @@ import ONYXKEYS from '@src/ONYXKEYS';
 import type {Route} from '@src/ROUTES';
 import {isEmptyObject} from '@src/types/utils/EmptyObject';
 
-type VerifyAccountPageBaseProps = {
-    navigateBackTo?: Route;
-    navigateForwardTo?: Route;
-    handleClose?: () => void;
-    /** Callback called ONLY when user successfully validates their account (not on dismiss/back) */
-    onValidationSuccess?: () => void;
-};
+type VerifyAccountPageBaseProps = {navigateBackTo?: Route; navigateForwardTo?: Route; handleClose?: () => void};
 
 /**
  * This is a base page as RHP for account verification. The back & forward url logic should be handled on per case basis in higher component.
  */
-function VerifyAccountPageBase({navigateBackTo, navigateForwardTo, handleClose, onValidationSuccess}: VerifyAccountPageBaseProps) {
+function VerifyAccountPageBase({navigateBackTo, navigateForwardTo, handleClose}: VerifyAccountPageBaseProps) {
     const styles = useThemeStyles();
     const [account] = useOnyx(ONYXKEYS.ACCOUNT, {canBeMissing: true});
     const [loginList] = useOnyx(ONYXKEYS.LOGIN_LIST, {canBeMissing: true});
@@ -60,15 +54,12 @@ function VerifyAccountPageBase({navigateBackTo, navigateForwardTo, handleClose,
         if (!isUserValidated) {
             return;
         }
-
-        onValidationSuccess?.();
-
         if (navigateForwardTo) {
             Navigation.navigate(navigateForwardTo, {forceReplace: true});
         } else {
             handleCloseWithFallback();
         }
-    }, [isUserValidated, navigateForwardTo, handleCloseWithFallback, handleClose, onValidationSuccess]);
+    }, [isUserValidated, navigateForwardTo, handleCloseWithFallback, handleClose]);
 
     // Once user is validated or the modal is dismissed, we don't want to show empty content.
     if (isUserValidated) {
diff --git a/src/pages/settings/Wallet/ExpensifyCardPage/index.tsx b/src/pages/settings/Wallet/ExpensifyCardPage/index.tsx
index 80ce19d3b4a0..0ba5fbc7e95c 100644
--- a/src/pages/settings/Wallet/ExpensifyCardPage/index.tsx
+++ b/src/pages/settings/Wallet/ExpensifyCardPage/index.tsx
@@ -14,7 +14,6 @@ import MenuItem from '@components/MenuItem';
 import MenuItemWithTopDescription from '@components/MenuItemWithTopDescription';
 import ScreenWrapper from '@components/ScreenWrapper';
 import ScrollView from '@components/ScrollView';
-import useCurrencyList from '@hooks/useCurrencyList';
 import useCurrentUserPersonalDetails from '@hooks/useCurrentUserPersonalDetails';
 import useEnvironment from '@hooks/useEnvironment';
 import {useMemoizedLazyExpensifyIcons} from '@hooks/useLazyAsset';
@@ -40,7 +39,8 @@ import type {TranslationPaths} from '@src/languages/types';
 import ONYXKEYS from '@src/ONYXKEYS';
 import ROUTES from '@src/ROUTES';
 import SCREENS from '@src/SCREENS';
-import type {Card, PrivatePersonalDetails} from '@src/types/onyx';
+import type {Card, CurrencyList, PrivatePersonalDetails} from '@src/types/onyx';
+import {getEmptyObject} from '@src/types/utils/EmptyObject';
 import useExpensifyCardContext from './useExpensifyCardContext';
 
 type ExpensifyCardPageProps =
@@ -82,9 +82,9 @@ function ExpensifyCardPage({route}: ExpensifyCardPageProps) {
     const {cardID} = route.params;
     const [account] = useOnyx(ONYXKEYS.ACCOUNT, {canBeMissing: false});
     const [cardList] = useOnyx(ONYXKEYS.CARD_LIST, {selector: filterPersonalCards, canBeMissing: false});
+    const [currencyList = getEmptyObject<CurrencyList>()] = useOnyx(ONYXKEYS.CURRENCY_LIST, {canBeMissing: true});
     const [pin] = useOnyx(ONYXKEYS.ACTIVATED_CARD_PIN, {canBeMissing: true});
     const [privatePersonalDetails] = useOnyx(ONYXKEYS.PRIVATE_PERSONAL_DETAILS, {canBeMissing: false});
-    const {currencyList} = useCurrencyList();
     const styles = useThemeStyles();
     const {isOffline} = useNetwork();
     const {translate} = useLocalize();
diff --git a/src/pages/settings/Wallet/InternationalDepositAccount/PersonalInfo/substeps/ConfirmationStep.tsx b/src/pages/settings/Wallet/InternationalDepositAccount/PersonalInfo/substeps/ConfirmationStep.tsx
index f2c534ff4502..387eb9baf5a6 100644
--- a/src/pages/settings/Wallet/InternationalDepositAccount/PersonalInfo/substeps/ConfirmationStep.tsx
+++ b/src/pages/settings/Wallet/InternationalDepositAccount/PersonalInfo/substeps/ConfirmationStep.tsx
@@ -4,8 +4,8 @@ import useLocalize from '@hooks/useLocalize';
 import useOnyx from '@hooks/useOnyx';
 import type {SubStepProps} from '@hooks/useSubStep/types';
 import {getLatestErrorMessage} from '@libs/ErrorUtils';
-import {formatE164PhoneNumber} from '@libs/LoginUtils';
 import {getCurrentAddress} from '@libs/PersonalDetailsUtils';
+import {parsePhoneNumber} from '@libs/PhoneNumber';
 import {clearPersonalBankAccountErrors} from '@userActions/BankAccounts';
 import CONST from '@src/CONST';
 import ONYXKEYS from '@src/ONYXKEYS';
@@ -22,7 +22,6 @@ function ConfirmationStep({onNext, onMove, isEditing}: SubStepProps) {
     const [bankAccountPersonalDetails] = useOnyx(ONYXKEYS.FORMS.PERSONAL_BANK_ACCOUNT_FORM_DRAFT, {canBeMissing: true});
     const [personalBankAccount] = useOnyx(ONYXKEYS.PERSONAL_BANK_ACCOUNT, {canBeMissing: true});
     const [plaidData] = useOnyx(ONYXKEYS.PLAID_DATA, {canBeMissing: true});
-    const [countryCode = CONST.DEFAULT_COUNTRY_CODE] = useOnyx(ONYXKEYS.COUNTRY_CODE, {canBeMissing: false});
 
     const isManual = bankAccountPersonalDetails?.setupType === CONST.BANK_ACCOUNT.SETUP_TYPE.MANUAL;
 
@@ -33,7 +32,7 @@ function ConfirmationStep({onNext, onMove, isEditing}: SubStepProps) {
         const currentAddress = getCurrentAddress(privatePersonalDetails);
         const phone = bankAccountPersonalDetails?.phoneNumber ?? privatePersonalDetails?.phoneNumber;
         return {
-            phoneNumber: (phone && formatE164PhoneNumber(phone, countryCode)) ?? '',
+            phoneNumber: (phone && parsePhoneNumber(phone, {regionCode: CONST.COUNTRY.US}).number?.significant) ?? '',
             legalFirstName: bankAccountPersonalDetails?.legalFirstName ?? privatePersonalDetails?.legalFirstName ?? '',
             legalLastName: bankAccountPersonalDetails?.legalLastName ?? privatePersonalDetails?.legalLastName ?? '',
             addressStreet: bankAccountPersonalDetails?.addressStreet ?? currentAddress?.street ?? '',
diff --git a/src/pages/settings/Wallet/InternationalDepositAccount/PersonalInfo/substeps/ManualBankAccountDetailsStep.tsx b/src/pages/settings/Wallet/InternationalDepositAccount/PersonalInfo/substeps/ManualBankAccountDetailsStep.tsx
index 54f7b578c351..fa6b3ccb67bc 100644
--- a/src/pages/settings/Wallet/InternationalDepositAccount/PersonalInfo/substeps/ManualBankAccountDetailsStep.tsx
+++ b/src/pages/settings/Wallet/InternationalDepositAccount/PersonalInfo/substeps/ManualBankAccountDetailsStep.tsx
@@ -28,6 +28,11 @@ function ManualBankAccountDetailsStep({onNext, isEditing}: ManualProps) {
     const styles = useThemeStyles();
     const {inputCallbackRef} = useAutoFocusInput();
 
+    const getDefaultValues = () => ({
+        routingNumber: bankAccountPersonalDetails?.routingNumber,
+        accountNumber: bankAccountPersonalDetails?.accountNumber,
+    });
+
     const validate = (values: FormOnyxValues<typeof ONYXKEYS.FORMS.PERSONAL_BANK_ACCOUNT_FORM>): FormInputErrors<typeof ONYXKEYS.FORMS.PERSONAL_BANK_ACCOUNT_FORM> => {
         const errors = getFieldRequiredErrors(values, STEP_FIELDS);
         const routingNumber = values.routingNumber?.trim();
@@ -54,6 +59,8 @@ function ManualBankAccountDetailsStep({onNext, isEditing}: ManualProps) {
         shouldSaveDraft: true,
     });
 
+    const defaultValues = getDefaultValues();
+
     return (
         <FormProvider
             formID={ONYXKEYS.FORMS.PERSONAL_BANK_ACCOUNT_FORM}
@@ -72,7 +79,7 @@ function ManualBankAccountDetailsStep({onNext, isEditing}: ManualProps) {
                 label={translate('bankAccount.routingNumber')}
                 aria-label={translate('bankAccount.routingNumber')}
                 role={CONST.ROLE.PRESENTATION}
-                value={bankAccountPersonalDetails?.routingNumber ?? ''}
+                defaultValue={defaultValues[BANK_INFO_STEP_KEYS.ROUTING_NUMBER]}
                 inputMode={CONST.INPUT_MODE.NUMERIC}
                 shouldSaveDraft
             />
@@ -83,7 +90,7 @@ function ManualBankAccountDetailsStep({onNext, isEditing}: ManualProps) {
                 label={translate('bankAccount.accountNumber')}
                 aria-label={translate('bankAccount.accountNumber')}
                 role={CONST.ROLE.PRESENTATION}
-                value={bankAccountPersonalDetails?.accountNumber ?? ''}
+                defaultValue={defaultValues[BANK_INFO_STEP_KEYS.ACCOUNT_NUMBER]}
                 inputMode={CONST.INPUT_MODE.NUMERIC}
                 shouldSaveDraft
             />
diff --git a/src/pages/settings/Wallet/InternationalDepositAccount/substeps/AccountFlowEntryPoint.tsx b/src/pages/settings/Wallet/InternationalDepositAccount/substeps/AccountFlowEntryPoint.tsx
index b710a50e8675..a2b23e43f804 100644
--- a/src/pages/settings/Wallet/InternationalDepositAccount/substeps/AccountFlowEntryPoint.tsx
+++ b/src/pages/settings/Wallet/InternationalDepositAccount/substeps/AccountFlowEntryPoint.tsx
@@ -1,4 +1,4 @@
-import React, {useEffect} from 'react';
+import React from 'react';
 import {View} from 'react-native';
 import HeaderWithBackButton from '@components/HeaderWithBackButton';
 import Icon from '@components/Icon';
@@ -17,7 +17,7 @@ import useResponsiveLayout from '@hooks/useResponsiveLayout';
 import useTheme from '@hooks/useTheme';
 import useThemeStyles from '@hooks/useThemeStyles';
 import Navigation from '@navigation/Navigation';
-import {clearPersonalBankAccount, updateAddPersonalBankAccountDraft} from '@userActions/BankAccounts';
+import {updateAddPersonalBankAccountDraft} from '@userActions/BankAccounts';
 import {openExternalLink} from '@userActions/Link';
 import CONST from '@src/CONST';
 import ONYXKEYS from '@src/ONYXKEYS';
@@ -40,10 +40,6 @@ function AccountFlowEntryPoint({policyName = '', onBackButtonPress}: AccountFlow
 
     const [isPlaidDisabled] = useOnyx(ONYXKEYS.IS_PLAID_DISABLED, {canBeMissing: true});
 
-    useEffect(() => {
-        clearPersonalBankAccount();
-    }, []);
-
     const handleConnectManually = () => {
         updateAddPersonalBankAccountDraft({
             setupType: CONST.BANK_ACCOUNT.SETUP_TYPE.MANUAL,
diff --git a/src/pages/settings/Wallet/InternationalDepositAccount/substeps/Confirmation.tsx b/src/pages/settings/Wallet/InternationalDepositAccount/substeps/Confirmation.tsx
index 22ccf3dbfa7b..b67d1f2ca264 100644
--- a/src/pages/settings/Wallet/InternationalDepositAccount/substeps/Confirmation.tsx
+++ b/src/pages/settings/Wallet/InternationalDepositAccount/substeps/Confirmation.tsx
@@ -8,11 +8,11 @@ import MenuItemWithTopDescription from '@components/MenuItemWithTopDescription';
 import RenderHTML from '@components/RenderHTML';
 import ScrollView from '@components/ScrollView';
 import Text from '@components/Text';
-import useCurrencyList from '@hooks/useCurrencyList';
 import useLocalize from '@hooks/useLocalize';
 import useNetwork from '@hooks/useNetwork';
 import useOnyx from '@hooks/useOnyx';
 import useThemeStyles from '@hooks/useThemeStyles';
+import {getCurrencySymbol} from '@libs/CurrencyUtils';
 import {getLatestErrorMessage} from '@libs/ErrorUtils';
 import type CustomSubStepProps from '@pages/settings/Wallet/InternationalDepositAccount/types';
 import {clearReimbursementAccountBankCreation, createCorpayBankAccountForWalletFlow, hideBankAccountErrors} from '@userActions/BankAccounts';
@@ -43,7 +43,6 @@ function Confirmation({onNext, onMove, formValues, fieldsMap}: CustomSubStepProp
     const [corpayFields] = useOnyx(ONYXKEYS.CORPAY_FIELDS, {canBeMissing: false});
     const [reimbursementAccount] = useOnyx(ONYXKEYS.REIMBURSEMENT_ACCOUNT, {canBeMissing: false});
     const {isOffline} = useNetwork();
-    const {getCurrencySymbol} = useCurrencyList();
 
     const getTitle = (field: CorpayFormField, fieldName: string) => {
         if ((field.valueSet ?? []).length > 0) {
diff --git a/src/pages/settings/Wallet/PaymentMethodList.tsx b/src/pages/settings/Wallet/PaymentMethodList.tsx
index b85b203c3945..6b02aa0656cc 100644
--- a/src/pages/settings/Wallet/PaymentMethodList.tsx
+++ b/src/pages/settings/Wallet/PaymentMethodList.tsx
@@ -371,7 +371,6 @@ function PaymentMethodList({
                 isMethodActive,
                 iconRight: itemIconRight ?? expensifyIcons.ThreeDots,
                 shouldShowRightIcon,
-                canDismissError: true,
             };
         });
         return combinedPaymentMethods;
diff --git a/src/pages/settings/Wallet/PaymentMethodListItem.tsx b/src/pages/settings/Wallet/PaymentMethodListItem.tsx
index 701473ec5cb2..bca259a45b00 100644
--- a/src/pages/settings/Wallet/PaymentMethodListItem.tsx
+++ b/src/pages/settings/Wallet/PaymentMethodListItem.tsx
@@ -17,7 +17,6 @@ import ONYXKEYS from '@src/ONYXKEYS';
 import type {BankIcon} from '@src/types/onyx/Bank';
 import type {Errors} from '@src/types/onyx/OnyxCommon';
 import type PaymentMethod from '@src/types/onyx/PaymentMethod';
-import {isEmptyObject} from '@src/types/utils/EmptyObject';
 import type IconAsset from '@src/types/utils/IconAsset';
 
 type PaymentMethodItem = PaymentMethod & {
@@ -62,7 +61,6 @@ function dismissError(item: PaymentMethodItem) {
         return;
     }
 
-    const hasErrors = !isEmptyObject(item.errors);
     const isBankAccount = item.accountType === CONST.PAYMENT_METHODS.PERSONAL_BANK_ACCOUNT;
     const paymentList = isBankAccount ? ONYXKEYS.BANK_ACCOUNT_LIST : ONYXKEYS.FUND_LIST;
     const paymentID = isBankAccount ? item.accountData?.bankAccountID : item.accountData?.fundID;
@@ -72,7 +70,7 @@ function dismissError(item: PaymentMethodItem) {
         return;
     }
 
-    if (item.pendingAction === CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE || hasErrors) {
+    if (item.pendingAction === CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE) {
         clearDeletePaymentMethodError(paymentList, paymentID);
         if (!isBankAccount) {
             clearDeletePaymentMethodError(ONYXKEYS.FUND_LIST, paymentID);
@@ -118,7 +116,8 @@ function PaymentMethodListItem({item, shouldShowDefaultBadge, threeDotsMenuItems
             onClose={item.canDismissError ? () => dismissError(item) : undefined}
             pendingAction={item.pendingAction}
             errors={item.errors}
-            errorRowStyles={styles.paymentMethodErrorRow}
+            errorRowStyles={styles.ph6}
+            shouldShowErrorMessages={false}
         >
             <MenuItem
                 onPress={handleRowPress}
diff --git a/src/pages/settings/Wallet/ReportVirtualCardFraudVerifyAccountPage.tsx b/src/pages/settings/Wallet/ReportVirtualCardFraudVerifyAccountPage.tsx
index caf22c52115a..8f8808f9ba2d 100644
--- a/src/pages/settings/Wallet/ReportVirtualCardFraudVerifyAccountPage.tsx
+++ b/src/pages/settings/Wallet/ReportVirtualCardFraudVerifyAccountPage.tsx
@@ -1,4 +1,4 @@
-import React, {useEffect} from 'react';
+import React, {useCallback, useEffect} from 'react';
 import ValidateCodeActionContent from '@components/ValidateCodeActionModal/ValidateCodeActionContent';
 import useLocalize from '@hooks/useLocalize';
 import useOnyx from '@hooks/useOnyx';
@@ -51,21 +51,24 @@ function ReportVirtualCardFraudVerifyAccountPage({
         }
     }, [formData?.isLoading, latestIssuedVirtualCardID, cardError, codeError, prevIsLoading]);
 
-    const handleValidateCodeEntered = (validateCode: string) => {
-        if (!virtualCard) {
-            return;
-        }
+    const handleValidateCodeEntered = useCallback(
+        (validateCode: string) => {
+            if (!virtualCard) {
+                return;
+            }
 
-        reportVirtualExpensifyCardFraud(virtualCard, validateCode);
-    };
+            reportVirtualExpensifyCardFraud(virtualCard, validateCode);
+        },
+        [virtualCard],
+    );
 
-    const handleClearError = () => {
+    const handleClearError = useCallback(() => {
         clearValidateCodeActionError(ONYXKEYS.VALIDATE_ACTION_CODE);
         if (!virtualCard?.cardID) {
             return;
         }
         clearCardListErrors(virtualCard.cardID);
-    };
+    }, [virtualCard?.cardID]);
 
     return (
         <ValidateCodeActionContent
diff --git a/src/pages/settings/Wallet/TransferBalancePage.tsx b/src/pages/settings/Wallet/TransferBalancePage.tsx
index 5ace2777e9b9..50d55a2041a4 100644
--- a/src/pages/settings/Wallet/TransferBalancePage.tsx
+++ b/src/pages/settings/Wallet/TransferBalancePage.tsx
@@ -54,10 +54,10 @@ function TransferBalancePage() {
         // {
         //     key: CONST.WALLET.TRANSFER_METHOD_TYPE.INSTANT,
         //     title: translate('transferAmountPage.instant'),
-        //     description: translate('transferAmountPage.instantSummary',
-        //         numberFormat(CONST.WALLET.TRANSFER_METHOD_TYPE_FEE.INSTANT.RATE),
-        //         convertToDisplayString(CONST.WALLET.TRANSFER_METHOD_TYPE_FEE.INSTANT.MINIMUM_FEE)
-        //     ),
+        //     description: translate('transferAmountPage.instantSummary', {
+        //         rate: numberFormat(CONST.WALLET.TRANSFER_METHOD_TYPE_FEE.INSTANT.RATE),
+        //         minAmount: convertToDisplayString(CONST.WALLET.TRANSFER_METHOD_TYPE_FEE.INSTANT.MINIMUM_FEE),
+        //     }),
         //     icon: Expensicons.Bolt,
         //     type: CONST.PAYMENT_METHODS.DEBIT_CARD,
         // },
diff --git a/src/pages/signin/EmailDeliveryFailurePage.tsx b/src/pages/signin/EmailDeliveryFailurePage.tsx
index 911065b1511e..7f4926af269e 100644
--- a/src/pages/signin/EmailDeliveryFailurePage.tsx
+++ b/src/pages/signin/EmailDeliveryFailurePage.tsx
@@ -1,4 +1,5 @@
-import React, {useEffect} from 'react';
+import {Str} from 'expensify-common';
+import React, {useEffect, useMemo} from 'react';
 import {Keyboard, View} from 'react-native';
 import PressableWithFeedback from '@components/Pressable/PressableWithFeedback';
 import RenderHTML from '@components/RenderHTML';
@@ -7,7 +8,6 @@ import useKeyboardState from '@hooks/useKeyboardState';
 import useLocalize from '@hooks/useLocalize';
 import useOnyx from '@hooks/useOnyx';
 import useThemeStyles from '@hooks/useThemeStyles';
-import {normalizeLogin} from '@libs/LoginUtils';
 import {clearSignInData} from '@userActions/Session';
 import ONYXKEYS from '@src/ONYXKEYS';
 
@@ -16,8 +16,12 @@ function EmailDeliveryFailurePage() {
     const styles = useThemeStyles();
     const {isKeyboardShown} = useKeyboardState();
     const {translate} = useLocalize();
-
-    const login = normalizeLogin(credentials?.login);
+    const login = useMemo(() => {
+        if (!credentials?.login) {
+            return '';
+        }
+        return Str.isSMSLogin(credentials.login) ? Str.removeSMSDomain(credentials.login) : credentials.login;
+    }, [credentials?.login]);
 
     // This view doesn't have a field for user input, so dismiss the device keyboard if shown
     useEffect(() => {
diff --git a/src/pages/signin/SMSDeliveryFailurePage.tsx b/src/pages/signin/SMSDeliveryFailurePage.tsx
index 801363ef408f..0bc245684fde 100644
--- a/src/pages/signin/SMSDeliveryFailurePage.tsx
+++ b/src/pages/signin/SMSDeliveryFailurePage.tsx
@@ -1,4 +1,5 @@
-import React, {useEffect, useState} from 'react';
+import {Str} from 'expensify-common';
+import React, {useEffect, useMemo, useState} from 'react';
 import {Keyboard, View} from 'react-native';
 import Button from '@components/Button';
 import FormAlertWithSubmitButton from '@components/FormAlertWithSubmitButton';
@@ -8,7 +9,6 @@ import useLocalize from '@hooks/useLocalize';
 import useOnyx from '@hooks/useOnyx';
 import useThemeStyles from '@hooks/useThemeStyles';
 import {getLatestErrorMessage} from '@libs/ErrorUtils';
-import {normalizeLogin} from '@libs/LoginUtils';
 import {beginSignIn, clearSignInData, resetSMSDeliveryFailureStatus} from '@userActions/Session';
 import ONYXKEYS from '@src/ONYXKEYS';
 import ChangeExpensifyLoginLink from './ChangeExpensifyLoginLink';
@@ -21,7 +21,12 @@ function SMSDeliveryFailurePage() {
     const [credentials] = useOnyx(ONYXKEYS.CREDENTIALS, {canBeMissing: true});
     const [account] = useOnyx(ONYXKEYS.ACCOUNT, {canBeMissing: true});
 
-    const login = normalizeLogin(credentials?.login);
+    const login = useMemo(() => {
+        if (!credentials?.login) {
+            return '';
+        }
+        return Str.isSMSLogin(credentials.login) ? Str.removeSMSDomain(credentials.login) : credentials.login;
+    }, [credentials?.login]);
 
     const SMSDeliveryFailureMessage = account?.smsDeliveryFailureStatus?.message;
     const isResettingSMSDeliveryFailureStatus = account?.smsDeliveryFailureStatus?.isLoading;
@@ -32,21 +37,26 @@ function SMSDeliveryFailurePage() {
         minutes?: number;
     };
 
-    let timeData: TimeData | null = null;
-    if (SMSDeliveryFailureMessage) {
+    const timeData = useMemo<TimeData | null>(() => {
+        if (!SMSDeliveryFailureMessage) {
+            return null;
+        }
+
         const parsedData = JSON.parse(SMSDeliveryFailureMessage) as TimeData | [];
 
-        if (!Array.isArray(parsedData) || parsedData.length > 0) {
-            timeData = parsedData as TimeData;
+        if (Array.isArray(parsedData) && !parsedData.length) {
+            return null;
         }
-    }
+
+        return parsedData as TimeData;
+    }, [SMSDeliveryFailureMessage]);
 
     const hasSMSDeliveryFailure = account?.smsDeliveryFailureStatus?.hasSMSDeliveryFailure;
 
     // We need to show two different messages after clicking validate button, based on API response for hasSMSDeliveryFailure.
     const [hasClickedValidate, setHasClickedValidate] = useState(false);
 
-    const errorText = account ? getLatestErrorMessage(account) : '';
+    const errorText = useMemo(() => (account ? getLatestErrorMessage(account) : ''), [account]);
     const shouldShowError = !!errorText;
 
     useEffect(() => {
diff --git a/src/pages/signin/UnlinkLoginForm.tsx b/src/pages/signin/UnlinkLoginForm.tsx
index 94a7206f24da..991cd8104218 100644
--- a/src/pages/signin/UnlinkLoginForm.tsx
+++ b/src/pages/signin/UnlinkLoginForm.tsx
@@ -1,4 +1,5 @@
-import React from 'react';
+import {Str} from 'expensify-common';
+import React, {useMemo} from 'react';
 import {View} from 'react-native';
 import Button from '@components/Button';
 import DotIndicatorMessage from '@components/DotIndicatorMessage';
@@ -9,7 +10,6 @@ import useNetwork from '@hooks/useNetwork';
 import useOnyx from '@hooks/useOnyx';
 import useThemeStyles from '@hooks/useThemeStyles';
 import {getErrorsWithTranslationData} from '@libs/ErrorUtils';
-import {normalizeLogin} from '@libs/LoginUtils';
 import {requestUnlinkValidationLink} from '@userActions/Session';
 import redirectToSignIn from '@userActions/SignInRedirect';
 import CONST from '@src/CONST';
@@ -25,8 +25,18 @@ function UnlinkLoginForm() {
 
     const unlinkMessage =
         account?.message === 'unlinkLoginForm.linkSent' || account?.message === 'unlinkLoginForm.successfullyUnlinkedLogin' ? translate(account?.message) : account?.message;
-    const primaryLogin = normalizeLogin(account?.primaryLogin);
-    const secondaryLogin = normalizeLogin(credentials?.login);
+    const primaryLogin = useMemo(() => {
+        if (!account?.primaryLogin) {
+            return '';
+        }
+        return Str.isSMSLogin(account.primaryLogin) ? Str.removeSMSDomain(account.primaryLogin) : account.primaryLogin;
+    }, [account?.primaryLogin]);
+    const secondaryLogin = useMemo(() => {
+        if (!credentials?.login) {
+            return '';
+        }
+        return Str.isSMSLogin(credentials.login) ? Str.removeSMSDomain(credentials.login) : credentials.login;
+    }, [credentials?.login]);
 
     return (
         <>
diff --git a/src/components/ValidateCodeCountdown/index.tsx b/src/pages/signin/ValidateCodeCountdown/index.tsx
similarity index 100%
rename from src/components/ValidateCodeCountdown/index.tsx
rename to src/pages/signin/ValidateCodeCountdown/index.tsx
diff --git a/src/components/ValidateCodeCountdown/types.ts b/src/pages/signin/ValidateCodeCountdown/types.ts
similarity index 100%
rename from src/components/ValidateCodeCountdown/types.ts
rename to src/pages/signin/ValidateCodeCountdown/types.ts
diff --git a/src/pages/signin/ValidateCodeForm/BaseValidateCodeForm.tsx b/src/pages/signin/ValidateCodeForm/BaseValidateCodeForm.tsx
index 6e2d73a0f065..86236e1d7155 100755
--- a/src/pages/signin/ValidateCodeForm/BaseValidateCodeForm.tsx
+++ b/src/pages/signin/ValidateCodeForm/BaseValidateCodeForm.tsx
@@ -9,8 +9,6 @@ import MagicCodeInput from '@components/MagicCodeInput';
 import PressableWithFeedback from '@components/Pressable/PressableWithFeedback';
 import Text from '@components/Text';
 import TextInput from '@components/TextInput';
-import ValidateCodeCountdown from '@components/ValidateCodeCountdown';
-import type {ValidateCodeCountdownHandle} from '@components/ValidateCodeCountdown/types';
 import type {WithToggleVisibilityViewProps} from '@components/withToggleVisibilityView';
 import withToggleVisibilityView from '@components/withToggleVisibilityView';
 import useLocalize from '@hooks/useLocalize';
@@ -25,6 +23,8 @@ import {getLatestErrorMessage} from '@libs/ErrorUtils';
 import {isValidRecoveryCode, isValidTwoFactorCode, isValidValidateCode} from '@libs/ValidationUtils';
 import ChangeExpensifyLoginLink from '@pages/signin/ChangeExpensifyLoginLink';
 import Terms from '@pages/signin/Terms';
+import ValidateCodeCountdown from '@pages/signin/ValidateCodeCountdown';
+import type {ValidateCodeCountdownHandle} from '@pages/signin/ValidateCodeCountdown/types';
 import {clearAccountMessages, clearSignInData as sessionActionsClearSignInData, signIn, signInWithValidateCode} from '@userActions/Session';
 import {resendValidateCode as userActionsResendValidateCode} from '@userActions/User';
 import CONST from '@src/CONST';
diff --git a/src/pages/tasks/NewTaskPage.tsx b/src/pages/tasks/NewTaskPage.tsx
index 4ff23004be22..561f4e8dd2cc 100644
--- a/src/pages/tasks/NewTaskPage.tsx
+++ b/src/pages/tasks/NewTaskPage.tsx
@@ -1,5 +1,5 @@
 import {useFocusEffect} from '@react-navigation/native';
-import React, {useEffect, useRef, useState} from 'react';
+import React, {useCallback, useEffect, useMemo, useRef, useState} from 'react';
 import {InteractionManager, View} from 'react-native';
 import FullPageNotFoundView from '@components/BlockingViews/FullPageNotFoundView';
 import FormAlertWithSubmitButton from '@components/FormAlertWithSubmitButton';
@@ -38,34 +38,39 @@ function NewTaskPage({route}: NewTaskPageProps) {
     const currentUserPersonalDetails = useCurrentUserPersonalDetails();
     const styles = useThemeStyles();
     const {translate, formatPhoneNumber, localeCompare} = useLocalize();
-    const assignee = getAssignee(task?.assigneeAccountID ?? CONST.DEFAULT_NUMBER_ID, personalDetails);
+    const assignee = useMemo(() => getAssignee(task?.assigneeAccountID ?? CONST.DEFAULT_NUMBER_ID, personalDetails), [task?.assigneeAccountID, personalDetails]);
     const assigneeTooltipDetails = getDisplayNamesWithTooltips(
         getPersonalDetailsForAccountIDs(task?.assigneeAccountID ? [task.assigneeAccountID] : [], personalDetails),
         false,
         localeCompare,
         formatPhoneNumber,
     );
-    const shareDestination = task?.shareDestination ? getShareDestination(task.shareDestination, reports, personalDetails, localeCompare) : undefined;
-    const parentReport = task?.shareDestination ? reports?.[`${ONYXKEYS.COLLECTION.REPORT}${task.shareDestination}`] : undefined;
+    const shareDestination = useMemo(
+        () => (task?.shareDestination ? getShareDestination(task.shareDestination, reports, personalDetails, localeCompare) : undefined),
+        [task?.shareDestination, reports, personalDetails, localeCompare],
+    );
+    const parentReport = useMemo(() => (task?.shareDestination ? reports?.[`${ONYXKEYS.COLLECTION.REPORT}${task.shareDestination}`] : undefined), [reports, task?.shareDestination]);
     const ancestors = useAncestors(parentReport);
     const [errorMessage, setErrorMessage] = useState('');
     const hasDestinationError = task?.skipConfirmation && !task?.parentReportID;
-    const isAllowedToCreateTask = isEmptyObject(parentReport) || isAllowedToComment(parentReport);
+    const isAllowedToCreateTask = useMemo(() => isEmptyObject(parentReport) || isAllowedToComment(parentReport), [parentReport]);
 
     const {paddingBottom} = useSafeAreaPaddings();
 
     const backTo = route.params?.backTo;
     const confirmButtonRef = useRef<View>(null);
     const focusTimeoutRef = useRef<NodeJS.Timeout | null>(null);
-    useFocusEffect(() => {
-        focusTimeoutRef.current = setTimeout(() => {
-            // eslint-disable-next-line @typescript-eslint/no-deprecated
-            InteractionManager.runAfterInteractions(() => {
-                blurActiveElement();
-            });
-        }, CONST.ANIMATED_TRANSITION);
-        return () => focusTimeoutRef.current && clearTimeout(focusTimeoutRef.current);
-    });
+    useFocusEffect(
+        useCallback(() => {
+            focusTimeoutRef.current = setTimeout(() => {
+                // eslint-disable-next-line @typescript-eslint/no-deprecated
+                InteractionManager.runAfterInteractions(() => {
+                    blurActiveElement();
+                });
+            }, CONST.ANIMATED_TRANSITION);
+            return () => focusTimeoutRef.current && clearTimeout(focusTimeoutRef.current);
+        }, []),
+    );
 
     useEffect(() => {
         setErrorMessage('');
diff --git a/src/pages/workspace/AccessOrNotFoundWrapper.tsx b/src/pages/workspace/AccessOrNotFoundWrapper.tsx
index e7425b90abc5..eb7a1361f17e 100644
--- a/src/pages/workspace/AccessOrNotFoundWrapper.tsx
+++ b/src/pages/workspace/AccessOrNotFoundWrapper.tsx
@@ -190,12 +190,10 @@ function AccessOrNotFoundWrapper({
         }
 
         // When a workspace feature linked to the current page is disabled we will navigate to the More Features page.
-        Navigation.setNavigationActionToMicrotaskQueue(() => {
-            Navigation.goBack(ROUTES.WORKSPACE_MORE_FEATURES.getRoute(policyID));
-        });
+        Navigation.isNavigationReady().then(() => Navigation.goBack(ROUTES.WORKSPACE_MORE_FEATURES.getRoute(policyID)));
         // We don't need to run the effect on policyID change as we only use it to get the route to navigate to.
         // eslint-disable-next-line react-hooks/exhaustive-deps
-    }, [pendingField, isOffline, isFeatureEnabled, shouldShowNotFoundPage, isFocused]);
+    }, [pendingField, isOffline, isFeatureEnabled, shouldShowNotFoundPage]);
 
     useEffect(() => {
         // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
diff --git a/src/pages/workspace/MemberRightIcon.tsx b/src/pages/workspace/MemberRightIcon.tsx
index bcd48b4385e0..84a7bdfe7632 100644
--- a/src/pages/workspace/MemberRightIcon.tsx
+++ b/src/pages/workspace/MemberRightIcon.tsx
@@ -1,5 +1,4 @@
 import React from 'react';
-import type {StyleProp, ViewStyle} from 'react-native';
 import Badge from '@components/Badge';
 import useLocalize from '@hooks/useLocalize';
 import CONST from '@src/CONST';
@@ -9,10 +8,9 @@ type MemberRightIconProps = {
     owner?: string;
     role?: string;
     login?: string;
-    badgeStyles?: StyleProp<ViewStyle>;
 };
 
-export default function MemberRightIcon({role, owner, login, badgeStyles}: MemberRightIconProps) {
+export default function MemberRightIcon({role, owner, login}: MemberRightIconProps) {
     const {translate} = useLocalize();
 
     let badgeText: TranslationPaths | undefined;
@@ -24,12 +22,7 @@ export default function MemberRightIcon({role, owner, login, badgeStyles}: Membe
         badgeText = 'common.auditor';
     }
     if (badgeText) {
-        return (
-            <Badge
-                text={translate(badgeText)}
-                badgeStyles={badgeStyles}
-            />
-        );
+        return <Badge text={translate(badgeText)} />;
     }
     return null;
 }
diff --git a/src/pages/workspace/WorkspaceInitialPage.tsx b/src/pages/workspace/WorkspaceInitialPage.tsx
index 255a8644516e..e3065f783d4d 100644
--- a/src/pages/workspace/WorkspaceInitialPage.tsx
+++ b/src/pages/workspace/WorkspaceInitialPage.tsx
@@ -504,7 +504,7 @@ function WorkspaceInitialPage({policyDraft, policy: policyProp, route}: Workspac
                 !shouldDisplayLHB && (
                     <NavigationTabBar
                         selectedTab={NAVIGATION_TABS.WORKSPACES}
-                        shouldShowFloatingButtons={false}
+                        shouldShowFloatingCameraButton={false}
                     />
                 )
             }
diff --git a/src/pages/workspace/WorkspaceMembersPage.tsx b/src/pages/workspace/WorkspaceMembersPage.tsx
index 1df601616142..e613a7b4af85 100644
--- a/src/pages/workspace/WorkspaceMembersPage.tsx
+++ b/src/pages/workspace/WorkspaceMembersPage.tsx
@@ -400,18 +400,6 @@ function WorkspaceMembersPage({personalDetails, route, policy}: WorkspaceMembers
 
             const isPendingDeleteOrError = isPolicyAdmin && (policyEmployee.pendingAction === CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE || !isEmptyObject(policyEmployee.errors));
 
-            let roleBadgeText = '';
-            if (policy?.owner === details.login) {
-                roleBadgeText = translate('common.owner');
-            } else if (policyEmployee.role === CONST.POLICY.ROLE.ADMIN) {
-                roleBadgeText = translate('common.admin');
-            } else if (policyEmployee.role === CONST.POLICY.ROLE.AUDITOR) {
-                roleBadgeText = translate('common.auditor');
-            }
-            const memberName = formatPhoneNumber(getDisplayNameOrDefault(details));
-            const memberEmail = formatPhoneNumber(details?.login ?? '');
-            const accessibilityLabel = [memberName, memberEmail, roleBadgeText].filter(Boolean).join(', ');
-
             result.push({
                 keyForList: details.login ?? '',
                 accountID,
@@ -422,9 +410,8 @@ function WorkspaceMembersPage({personalDetails, route, policy}: WorkspaceMembers
                 isDisabled: isPendingDeleteOrError,
                 isInteractive: !details.isOptimisticPersonalDetail,
                 cursorStyle: details.isOptimisticPersonalDetail ? styles.cursorDefault : {},
-                text: memberName,
-                alternateText: memberEmail,
-                accessibilityLabel,
+                text: formatPhoneNumber(getDisplayNameOrDefault(details)),
+                alternateText: formatPhoneNumber(details?.login ?? ''),
                 rightElement: isControlPolicyWithWideLayout ? (
                     <>
                         <View style={[styles.flex1, styles.pr3]}>
@@ -448,7 +435,6 @@ function WorkspaceMembersPage({personalDetails, route, policy}: WorkspaceMembers
                                 role={policyEmployee.role}
                                 owner={policy?.owner}
                                 login={details.login}
-                                badgeStyles={[styles.alignSelfEnd]}
                             />
                         </View>
                     </>
@@ -487,7 +473,6 @@ function WorkspaceMembersPage({personalDetails, route, policy}: WorkspaceMembers
         styles.flex1,
         styles.pr3,
         styles.alignSelfStart,
-        styles.alignSelfEnd,
         isControlPolicyWithWideLayout,
         StyleUtils,
         formatPhoneNumber,
diff --git a/src/pages/workspace/WorkspaceNewRoomPage.tsx b/src/pages/workspace/WorkspaceNewRoomPage.tsx
index 61e9188622f0..ca1fae805e60 100644
--- a/src/pages/workspace/WorkspaceNewRoomPage.tsx
+++ b/src/pages/workspace/WorkspaceNewRoomPage.tsx
@@ -110,7 +110,7 @@ function WorkspaceNewRoomPage({ref}: WorkspaceNewRoomPageProps) {
             return false;
         }
 
-        return isPolicyAdmin(policies?.[`${ONYXKEYS.COLLECTION.POLICY}${policyID}`]);
+        return isPolicyAdmin(policyID, policies);
     }, [policyID, policies]);
 
     /**
diff --git a/src/pages/workspace/WorkspaceOverviewPage.tsx b/src/pages/workspace/WorkspaceOverviewPage.tsx
index b34a25d18088..58bac49397ca 100644
--- a/src/pages/workspace/WorkspaceOverviewPage.tsx
+++ b/src/pages/workspace/WorkspaceOverviewPage.tsx
@@ -14,7 +14,6 @@ import OfflineWithFeedback from '@components/OfflineWithFeedback';
 import {usePersonalDetails} from '@components/OnyxListItemProvider';
 import Section from '@components/Section';
 import useCardFeeds from '@hooks/useCardFeeds';
-import useCurrencyList from '@hooks/useCurrencyList';
 import useCurrentUserPersonalDetails from '@hooks/useCurrentUserPersonalDetails';
 import useDefaultFundID from '@hooks/useDefaultFundID';
 import {useMemoizedLazyExpensifyIcons, useMemoizedLazyIllustrations} from '@hooks/useLazyAsset';
@@ -64,7 +63,8 @@ import ONYXKEYS from '@src/ONYXKEYS';
 import ROUTES from '@src/ROUTES';
 import type SCREENS from '@src/SCREENS';
 import {reimbursementAccountErrorSelector} from '@src/selectors/ReimbursementAccount';
-import {isEmptyObject} from '@src/types/utils/EmptyObject';
+import type {CurrencyList} from '@src/types/onyx';
+import {getEmptyObject, isEmptyObject} from '@src/types/utils/EmptyObject';
 import type {WithPolicyProps} from './withPolicy';
 import withPolicy from './withPolicy';
 import WorkspacePageWithSections from './WorkspacePageWithSections';
@@ -76,11 +76,11 @@ function WorkspaceOverviewPage({policyDraft, policy: policyProp, route}: Workspa
     const {translate, localeCompare} = useLocalize();
     const {shouldUseNarrowLayout} = useResponsiveLayout();
     const currentUserPersonalDetails = useCurrentUserPersonalDetails();
-    const {getCurrencySymbol} = useCurrencyList();
     const illustrationIcons = useMemoizedLazyIllustrations(['Building']);
     const expensifyIcons = useMemoizedLazyExpensifyIcons(['Exit', 'FallbackWorkspaceAvatar', 'ImageCropSquareMask', 'QrCode', 'Transfer', 'Trashcan', 'UserPlus']);
 
     const backTo = route.params.backTo;
+    const [currencyList = getEmptyObject<CurrencyList>()] = useOnyx(ONYXKEYS.CURRENCY_LIST, {canBeMissing: true});
     const [account] = useOnyx(ONYXKEYS.ACCOUNT, {canBeMissing: true});
     const [fundList] = useOnyx(ONYXKEYS.FUND_LIST, {canBeMissing: true});
     const [personalPolicyID] = useOnyx(ONYXKEYS.PERSONAL_POLICY_ID, {canBeMissing: true});
@@ -97,8 +97,8 @@ function WorkspaceOverviewPage({policyDraft, policy: policyProp, route}: Workspa
 
     const isPolicyAdmin = isPolicyAdminPolicyUtils(policy);
     const outputCurrency = policy?.outputCurrency ?? '';
-    const currencySymbol = getCurrencySymbol(outputCurrency) ?? '';
-    const formattedCurrency = !isEmptyObject(policy) ? `${outputCurrency} - ${currencySymbol}` : '';
+    const currencySymbol = currencyList?.[outputCurrency]?.symbol ?? '';
+    const formattedCurrency = !isEmptyObject(policy) && !isEmptyObject(currencyList) ? `${outputCurrency} - ${currencySymbol}` : '';
 
     // We need this to update translation for deleting a workspace when it has third party card feeds or expensify card assigned.
     const workspaceAccountID = policy?.workspaceAccountID ?? CONST.DEFAULT_NUMBER_ID;
diff --git a/src/pages/workspace/WorkspacesListPage.tsx b/src/pages/workspace/WorkspacesListPage.tsx
index 9bad1ba7a6fb..a6e8e5f107df 100755
--- a/src/pages/workspace/WorkspacesListPage.tsx
+++ b/src/pages/workspace/WorkspacesListPage.tsx
@@ -54,7 +54,6 @@ import {
     getConnectionExporters,
     getPolicyBrickRoadIndicatorStatus,
     getUberConnectionErrorDirectlyFromPolicy,
-    getUserFriendlyWorkspaceType,
     isPendingDeletePolicy,
     isPolicyAdmin,
     isPolicyAuditor,
@@ -151,7 +150,6 @@ function WorkspacesListPage() {
     const [reimbursementAccountError] = useOnyx(ONYXKEYS.REIMBURSEMENT_ACCOUNT, {canBeMissing: true, selector: reimbursementAccountErrorSelector});
 
     const [allDomains] = useOnyx(ONYXKEYS.COLLECTION.DOMAIN, {canBeMissing: false});
-    const [allDomainErrors] = useOnyx(ONYXKEYS.COLLECTION.DOMAIN_ERRORS, {canBeMissing: true});
     const [adminAccess] = useOnyx(ONYXKEYS.COLLECTION.SHARED_NVP_PRIVATE_ADMIN_ACCESS, {canBeMissing: false});
     const [personalPolicyID] = useOnyx(ONYXKEYS.PERSONAL_POLICY_ID, {canBeMissing: true});
 
@@ -446,22 +444,11 @@ function WorkspacesListPage() {
                 });
             }
 
-            const ownerDisplayName = personalDetails?.[item.ownerAccountID ?? CONST.DEFAULT_NUMBER_ID]?.displayName ?? '';
-            const workspaceType = item.type ? getUserFriendlyWorkspaceType(item.type, translate) : '';
-            const accessibilityLabel = [
-                `${translate('workspace.common.workspace')}: ${item.title}`,
-                isDefault ? translate('common.default') : '',
-                `${translate('workspace.common.workspaceOwner')}: ${ownerDisplayName}`,
-                `${translate('workspace.common.workspaceType')}: ${workspaceType}`,
-            ]
-                .filter(Boolean)
-                .join(', ');
-
             return (
                 <OfflineWithFeedback
                     key={`${item.title}_${index}`}
                     pendingAction={item.pendingAction}
-                    errorRowStyles={[styles.ph5, styles.mt3]}
+                    errorRowStyles={styles.ph5}
                     onClose={item.dismissError}
                     errors={item.errors}
                     style={styles.mb2}
@@ -470,7 +457,7 @@ function WorkspacesListPage() {
                 >
                     <PressableWithoutFeedback
                         role={CONST.ROLE.BUTTON}
-                        accessibilityLabel={accessibilityLabel}
+                        accessibilityLabel="row"
                         style={[styles.mh5]}
                         disabled={item.disabled}
                         onPress={item.action}
@@ -523,7 +510,6 @@ function WorkspacesListPage() {
             icons,
             expensifyIcons.Building,
             expensifyIcons.Exit,
-            personalDetails,
         ],
     );
 
@@ -624,6 +610,7 @@ function WorkspacesListPage() {
             if (!domain || !domain.accountID || !domain.email) {
                 return domainItems;
             }
+
             const isAdmin = !!adminAccess?.[`${ONYXKEYS.COLLECTION.SHARED_NVP_PRIVATE_ADMIN_ACCESS}${domain.accountID}`];
             domainItems.push({
                 listItemType: 'domain',
@@ -633,12 +620,11 @@ function WorkspacesListPage() {
                 isAdmin,
                 isValidated: domain.validated,
                 pendingAction: domain.pendingAction,
-                errors: allDomainErrors?.[`${ONYXKEYS.COLLECTION.DOMAIN_ERRORS}${domain.accountID}`]?.errors,
             });
 
             return domainItems;
         }, []);
-    }, [allDomains, allDomainErrors, adminAccess, navigateToDomain]);
+    }, [navigateToDomain, allDomains, adminAccess]);
 
     useEffect(() => {
         const duplicatedWSPolicyID = duplicateWorkspace?.policyID;
@@ -772,7 +758,7 @@ function WorkspacesListPage() {
                 shouldUseNarrowLayout && (
                     <NavigationTabBar
                         selectedTab={NAVIGATION_TABS.WORKSPACES}
-                        shouldShowFloatingButtons={false}
+                        shouldShowFloatingCameraButton={false}
                     />
                 )
             }
diff --git a/src/pages/workspace/WorkspacesListRow.tsx b/src/pages/workspace/WorkspacesListRow.tsx
index 30bf3330ea74..f25a4f281a80 100644
--- a/src/pages/workspace/WorkspacesListRow.tsx
+++ b/src/pages/workspace/WorkspacesListRow.tsx
@@ -1,4 +1,3 @@
-import {useIsFocused} from '@react-navigation/native';
 import {Str} from 'expensify-common';
 import React, {useCallback, useEffect, useRef} from 'react';
 import {View} from 'react-native';
@@ -127,7 +126,6 @@ function WorkspacesListRow({
     const {translate} = useLocalize();
     const {shouldUseNarrowLayout} = useResponsiveLayout();
     const theme = useTheme();
-    const isFocused = useIsFocused();
     const isNarrow = layoutWidth === CONST.LAYOUT_WIDTH.NARROW;
     const icons = useMemoizedLazyExpensifyIcons(['ArrowRight', 'Hourglass']);
     const illustrations = useMemoizedLazyIllustrations(['Mailbox', 'ShieldYellow']);
@@ -210,7 +208,6 @@ function WorkspacesListRow({
                         <BrickRoadIndicatorIcon brickRoadIndicator={brickRoadIndicator} />
                     </View>
                     <ThreeDotsMenu
-                        isContainerFocused={isFocused}
                         shouldSelfPosition
                         menuItems={menuItems}
                         anchorAlignment={{horizontal: CONST.MODAL.ANCHOR_ORIGIN_HORIZONTAL.RIGHT, vertical: CONST.MODAL.ANCHOR_ORIGIN_VERTICAL.TOP}}
diff --git a/src/pages/workspace/accounting/intacct/export/SageIntacctExportPage.tsx b/src/pages/workspace/accounting/intacct/export/SageIntacctExportPage.tsx
index aff0d217fbb0..93d0e5b8afca 100644
--- a/src/pages/workspace/accounting/intacct/export/SageIntacctExportPage.tsx
+++ b/src/pages/workspace/accounting/intacct/export/SageIntacctExportPage.tsx
@@ -1,5 +1,5 @@
 import {useRoute} from '@react-navigation/native';
-import React from 'react';
+import React, {useCallback, useMemo} from 'react';
 import ConnectionLayout from '@components/ConnectionLayout';
 import MenuItemWithTopDescription from '@components/MenuItemWithTopDescription';
 import OfflineWithFeedback from '@components/OfflineWithFeedback';
@@ -25,42 +25,45 @@ function SageIntacctExportPage({policy}: WithPolicyProps) {
     const {export: exportConfig, pendingFields, errorFields} = policy?.connections?.intacct?.config ?? {};
     const shouldGoBackToSpecificRoute = exportConfig?.reimbursable === CONST.SAGE_INTACCT_REIMBURSABLE_EXPENSE_TYPE.EXPENSE_REPORT;
 
-    const goBack = () => {
+    const goBack = useCallback(() => {
         return goBackFromExportConnection(shouldGoBackToSpecificRoute, backTo);
-    };
+    }, [backTo, shouldGoBackToSpecificRoute]);
 
-    const sections = [
-        {
-            description: translate('workspace.sageIntacct.preferredExporter'),
-            action: !policyID ? undefined : () => Navigation.navigate(ROUTES.POLICY_ACCOUNTING_SAGE_INTACCT_PREFERRED_EXPORTER.getRoute(policyID, Navigation.getActiveRoute())),
-            title: exportConfig?.exporter,
-            subscribedSettings: [CONST.SAGE_INTACCT_CONFIG.EXPORTER],
-        },
-        {
-            description: translate('workspace.sageIntacct.exportDate.label'),
-            action: !policyID ? undefined : () => Navigation.navigate(ROUTES.POLICY_ACCOUNTING_SAGE_INTACCT_EXPORT_DATE.getRoute(policyID, Navigation.getActiveRoute())),
-            title: exportConfig?.exportDate ? translate(`workspace.sageIntacct.exportDate.values.${exportConfig.exportDate}.label`) : undefined,
-            subscribedSettings: [CONST.SAGE_INTACCT_CONFIG.EXPORT_DATE],
-        },
-        {
-            description: translate('workspace.accounting.exportOutOfPocket'),
-            action: !policyID ? undefined : () => Navigation.navigate(ROUTES.POLICY_ACCOUNTING_SAGE_INTACCT_REIMBURSABLE_EXPENSES.getRoute(policyID, Navigation.getActiveRoute())),
-            title: exportConfig?.reimbursable ? translate(`workspace.sageIntacct.reimbursableExpenses.values.${exportConfig.reimbursable}`) : undefined,
-            subscribedSettings: [CONST.SAGE_INTACCT_CONFIG.REIMBURSABLE, CONST.SAGE_INTACCT_CONFIG.REIMBURSABLE_VENDOR],
-        },
-        {
-            description: translate('workspace.accounting.exportCompanyCard'),
-            action: !policyID ? undefined : () => Navigation.navigate(ROUTES.POLICY_ACCOUNTING_SAGE_INTACCT_NON_REIMBURSABLE_EXPENSES.getRoute(policyID, Navigation.getActiveRoute())),
-            title: exportConfig?.nonReimbursable ? translate(`workspace.sageIntacct.nonReimbursableExpenses.values.${exportConfig.nonReimbursable}`) : undefined,
-            subscribedSettings: [
-                CONST.SAGE_INTACCT_CONFIG.NON_REIMBURSABLE,
-                CONST.SAGE_INTACCT_CONFIG.NON_REIMBURSABLE_ACCOUNT,
-                exportConfig?.nonReimbursable === CONST.SAGE_INTACCT_NON_REIMBURSABLE_EXPENSE_TYPE.VENDOR_BILL
-                    ? CONST.SAGE_INTACCT_CONFIG.NON_REIMBURSABLE_VENDOR
-                    : CONST.SAGE_INTACCT_CONFIG.NON_REIMBURSABLE_CREDIT_CARD_VENDOR,
-            ],
-        },
-    ];
+    const sections = useMemo(
+        () => [
+            {
+                description: translate('workspace.sageIntacct.preferredExporter'),
+                action: !policyID ? undefined : () => Navigation.navigate(ROUTES.POLICY_ACCOUNTING_SAGE_INTACCT_PREFERRED_EXPORTER.getRoute(policyID, Navigation.getActiveRoute())),
+                title: exportConfig?.exporter,
+                subscribedSettings: [CONST.SAGE_INTACCT_CONFIG.EXPORTER],
+            },
+            {
+                description: translate('workspace.sageIntacct.exportDate.label'),
+                action: !policyID ? undefined : () => Navigation.navigate(ROUTES.POLICY_ACCOUNTING_SAGE_INTACCT_EXPORT_DATE.getRoute(policyID, Navigation.getActiveRoute())),
+                title: exportConfig?.exportDate ? translate(`workspace.sageIntacct.exportDate.values.${exportConfig.exportDate}.label`) : undefined,
+                subscribedSettings: [CONST.SAGE_INTACCT_CONFIG.EXPORT_DATE],
+            },
+            {
+                description: translate('workspace.accounting.exportOutOfPocket'),
+                action: !policyID ? undefined : () => Navigation.navigate(ROUTES.POLICY_ACCOUNTING_SAGE_INTACCT_REIMBURSABLE_EXPENSES.getRoute(policyID, Navigation.getActiveRoute())),
+                title: exportConfig?.reimbursable ? translate(`workspace.sageIntacct.reimbursableExpenses.values.${exportConfig.reimbursable}`) : undefined,
+                subscribedSettings: [CONST.SAGE_INTACCT_CONFIG.REIMBURSABLE, CONST.SAGE_INTACCT_CONFIG.REIMBURSABLE_VENDOR],
+            },
+            {
+                description: translate('workspace.accounting.exportCompanyCard'),
+                action: !policyID ? undefined : () => Navigation.navigate(ROUTES.POLICY_ACCOUNTING_SAGE_INTACCT_NON_REIMBURSABLE_EXPENSES.getRoute(policyID, Navigation.getActiveRoute())),
+                title: exportConfig?.nonReimbursable ? translate(`workspace.sageIntacct.nonReimbursableExpenses.values.${exportConfig.nonReimbursable}`) : undefined,
+                subscribedSettings: [
+                    CONST.SAGE_INTACCT_CONFIG.NON_REIMBURSABLE,
+                    CONST.SAGE_INTACCT_CONFIG.NON_REIMBURSABLE_ACCOUNT,
+                    exportConfig?.nonReimbursable === CONST.SAGE_INTACCT_NON_REIMBURSABLE_EXPENSE_TYPE.VENDOR_BILL
+                        ? CONST.SAGE_INTACCT_CONFIG.NON_REIMBURSABLE_VENDOR
+                        : CONST.SAGE_INTACCT_CONFIG.NON_REIMBURSABLE_CREDIT_CARD_VENDOR,
+                ],
+            },
+        ],
+        [exportConfig?.exporter, exportConfig?.exportDate, exportConfig?.reimbursable, exportConfig?.nonReimbursable, policyID, translate],
+    );
 
     return (
         <ConnectionLayout
diff --git a/src/pages/workspace/accounting/netsuite/NetSuiteTokenInput/NetSuiteTokenInputPage.tsx b/src/pages/workspace/accounting/netsuite/NetSuiteTokenInput/NetSuiteTokenInputPage.tsx
index 484dbf3a19c1..fbd68539c5e0 100644
--- a/src/pages/workspace/accounting/netsuite/NetSuiteTokenInput/NetSuiteTokenInputPage.tsx
+++ b/src/pages/workspace/accounting/netsuite/NetSuiteTokenInput/NetSuiteTokenInputPage.tsx
@@ -24,8 +24,6 @@ function NetSuiteTokenInputPage({policy}: WithPolicyConnectionsProps) {
     const styles = useThemeStyles();
     const ref: ForwardedRef<InteractiveStepSubHeaderHandle> = useRef(null);
 
-    const hasAuthError = isAuthenticationError(policy, CONST.POLICY.CONNECTIONS.NAME.NETSUITE);
-
     const submit = () => {
         Navigation.dismissModal();
     };
@@ -37,7 +35,7 @@ function NetSuiteTokenInputPage({policy}: WithPolicyConnectionsProps) {
         prevScreen,
         screenIndex,
         moveTo,
-    } = useSubStep<SubStepWithPolicy>({bodyContent: tokenInputSteps, startFrom: hasAuthError ? 4 : 0, onFinished: submit});
+    } = useSubStep<SubStepWithPolicy>({bodyContent: tokenInputSteps, startFrom: 0, onFinished: submit});
 
     const handleBackButtonPress = () => {
         if (screenIndex === 0) {
@@ -53,7 +51,7 @@ function NetSuiteTokenInputPage({policy}: WithPolicyConnectionsProps) {
         nextScreen();
     };
 
-    const shouldPageBeBlocked = !isEmptyObject(policy?.connections?.[CONST.POLICY.CONNECTIONS.NAME.NETSUITE]) && !hasAuthError;
+    const shouldPageBeBlocked = !isEmptyObject(policy?.connections?.[CONST.POLICY.CONNECTIONS.NAME.NETSUITE]) && !isAuthenticationError(policy, CONST.POLICY.CONNECTIONS.NAME.NETSUITE);
 
     return (
         <ConnectionLayout
diff --git a/src/pages/workspace/accounting/netsuite/export/NetSuiteExportConfigurationPage.tsx b/src/pages/workspace/accounting/netsuite/export/NetSuiteExportConfigurationPage.tsx
index f79b079f636b..7ad1c83cb44c 100644
--- a/src/pages/workspace/accounting/netsuite/export/NetSuiteExportConfigurationPage.tsx
+++ b/src/pages/workspace/accounting/netsuite/export/NetSuiteExportConfigurationPage.tsx
@@ -1,5 +1,5 @@
 import {useRoute} from '@react-navigation/native';
-import React from 'react';
+import React, {useCallback, useMemo} from 'react';
 import {View} from 'react-native';
 import ConnectionLayout from '@components/ConnectionLayout';
 import MenuItemWithTopDescription from '@components/MenuItemWithTopDescription';
@@ -56,29 +56,36 @@ function NetSuiteExportConfigurationPage({policy}: WithPolicyConnectionsProps) {
         config?.reimbursableExpensesExportDestination === CONST.NETSUITE_EXPORT_DESTINATION.EXPENSE_REPORT ||
         config?.nonreimbursableExpensesExportDestination === CONST.NETSUITE_EXPORT_DESTINATION.EXPENSE_REPORT;
 
-    const goBack = () => {
+    const goBack = useCallback(() => {
         return goBackFromExportConnection(shouldGoBackToSpecificRoute, backTo);
-    };
+    }, [backTo, shouldGoBackToSpecificRoute]);
 
     const {subsidiaryList, receivableList, taxAccountsList, items} = policy?.connections?.netsuite?.options?.data ?? {};
-    const selectedSubsidiary = (subsidiaryList ?? []).find((subsidiary) => subsidiary.internalID === config?.subsidiaryID);
+    const selectedSubsidiary = useMemo(() => (subsidiaryList ?? []).find((subsidiary) => subsidiary.internalID === config?.subsidiaryID), [subsidiaryList, config?.subsidiaryID]);
 
-    const selectedReceivable = findSelectedBankAccountWithDefaultSelect(receivableList, config?.receivableAccount);
+    const selectedReceivable = useMemo(() => findSelectedBankAccountWithDefaultSelect(receivableList, config?.receivableAccount), [receivableList, config?.receivableAccount]);
 
-    const selectedItem = findSelectedInvoiceItemWithDefaultSelect(items, config?.invoiceItem);
+    const selectedItem = useMemo(() => findSelectedInvoiceItemWithDefaultSelect(items, config?.invoiceItem), [items, config?.invoiceItem]);
 
-    let invoiceItemValue = translate('workspace.netsuite.invoiceItem.values.create.label');
-    if (config?.invoiceItemPreference === CONST.NETSUITE_INVOICE_ITEM_PREFERENCE.CREATE) {
-        invoiceItemValue = translate('workspace.netsuite.invoiceItem.values.create.label');
-    } else if (selectedItem) {
-        invoiceItemValue = selectedItem.name;
-    } else if (config?.invoiceItemPreference) {
-        invoiceItemValue = translate('workspace.netsuite.invoiceItem.values.select.label');
-    }
+    const invoiceItemValue = useMemo(() => {
+        if (!config?.invoiceItemPreference) {
+            return translate('workspace.netsuite.invoiceItem.values.create.label');
+        }
+        if (config.invoiceItemPreference === CONST.NETSUITE_INVOICE_ITEM_PREFERENCE.CREATE) {
+            return translate('workspace.netsuite.invoiceItem.values.create.label');
+        }
+        if (!selectedItem) {
+            return translate('workspace.netsuite.invoiceItem.values.select.label');
+        }
+        return selectedItem.name;
+    }, [config?.invoiceItemPreference, selectedItem, translate]);
 
-    const selectedTaxPostingAccount = findSelectedTaxAccountWithDefaultSelect(taxAccountsList, config?.taxPostingAccount);
+    const selectedTaxPostingAccount = useMemo(() => findSelectedTaxAccountWithDefaultSelect(taxAccountsList, config?.taxPostingAccount), [taxAccountsList, config?.taxPostingAccount]);
 
-    const selectedProvTaxPostingAccount = findSelectedTaxAccountWithDefaultSelect(taxAccountsList, config?.provincialTaxPostingAccount);
+    const selectedProvTaxPostingAccount = useMemo(
+        () => findSelectedTaxAccountWithDefaultSelect(taxAccountsList, config?.provincialTaxPostingAccount),
+        [taxAccountsList, config?.provincialTaxPostingAccount],
+    );
 
     const menuItems: Array<MenuItemWithSubscribedSettings | ToggleItem | DividerLineItem> = [
         {
diff --git a/src/pages/workspace/accounting/netsuite/import/NetSuiteImportMappingPage.tsx b/src/pages/workspace/accounting/netsuite/import/NetSuiteImportMappingPage.tsx
index 40fb57c6d571..d10b79d85519 100644
--- a/src/pages/workspace/accounting/netsuite/import/NetSuiteImportMappingPage.tsx
+++ b/src/pages/workspace/accounting/netsuite/import/NetSuiteImportMappingPage.tsx
@@ -53,7 +53,7 @@ function NetSuiteImportMappingPage({
     const listFooterContent = useMemo(
         () => (
             <View style={[styles.ph5, styles.mt3, styles.mb4]}>
-                <Text>{translate(`workspace.netsuite.import.importTypes.${importValue}.footerContent`, importField)}</Text>
+                <Text>{translate(`workspace.netsuite.import.importTypes.${importValue}.footerContent`, {importField})}</Text>
             </View>
         ),
         [importField, importValue, styles.mb4, styles.mt3, styles.ph5, translate],
diff --git a/src/pages/workspace/categories/CategoryRequiredFieldsPage.tsx b/src/pages/workspace/categories/CategoryRequiredFieldsPage.tsx
deleted file mode 100644
index c6086e463ba1..000000000000
--- a/src/pages/workspace/categories/CategoryRequiredFieldsPage.tsx
+++ /dev/null
@@ -1,103 +0,0 @@
-import React from 'react';
-import {View} from 'react-native';
-import HeaderWithBackButton from '@components/HeaderWithBackButton';
-import OfflineWithFeedback from '@components/OfflineWithFeedback';
-import RenderHTML from '@components/RenderHTML';
-import ScreenWrapper from '@components/ScreenWrapper';
-import ScrollView from '@components/ScrollView';
-import Switch from '@components/Switch';
-import Text from '@components/Text';
-import useLocalize from '@hooks/useLocalize';
-import useOnyx from '@hooks/useOnyx';
-import useThemeStyles from '@hooks/useThemeStyles';
-import {getDecodedCategoryName} from '@libs/CategoryUtils';
-import Navigation from '@libs/Navigation/Navigation';
-import type {PlatformStackScreenProps} from '@libs/Navigation/PlatformStackNavigation/types';
-import type {SettingsNavigatorParamList} from '@navigation/types';
-import AccessOrNotFoundWrapper from '@pages/workspace/AccessOrNotFoundWrapper';
-import {setPolicyCategoryAttendeesRequired, setPolicyCategoryDescriptionRequired} from '@userActions/Policy/Category';
-import CONST from '@src/CONST';
-import ONYXKEYS from '@src/ONYXKEYS';
-import ROUTES from '@src/ROUTES';
-import type SCREENS from '@src/SCREENS';
-
-type CategoryRequiredFieldsPageProps = PlatformStackScreenProps<SettingsNavigatorParamList, typeof SCREENS.WORKSPACE.CATEGORY_REQUIRED_FIELDS>;
-
-function CategoryRequiredFieldsPage({
-    route: {
-        params: {policyID, categoryName},
-    },
-}: CategoryRequiredFieldsPageProps) {
-    const styles = useThemeStyles();
-    const {translate} = useLocalize();
-    const [policyCategories] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY_CATEGORIES}${policyID}`, {canBeMissing: true});
-    const [policy] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY}${policyID}`, {canBeMissing: true});
-    const decodedCategoryName = getDecodedCategoryName(categoryName);
-
-    const policyCategory = policyCategories?.[categoryName];
-    const areCommentsRequired = policyCategory?.areCommentsRequired ?? false;
-    const areAttendeesRequired = policyCategory?.areAttendeesRequired ?? false;
-    const isAttendeeTrackingEnabled = policy?.isAttendeeTrackingEnabled ?? false;
-
-    return (
-        <AccessOrNotFoundWrapper
-            accessVariants={[CONST.POLICY.ACCESS_VARIANTS.ADMIN, CONST.POLICY.ACCESS_VARIANTS.CONTROL]}
-            policyID={policyID}
-            featureName={CONST.POLICY.MORE_FEATURES.ARE_CATEGORIES_ENABLED}
-        >
-            <ScreenWrapper
-                enableEdgeToEdgeBottomSafeAreaPadding
-                style={[styles.defaultModalContainer]}
-                testID={CategoryRequiredFieldsPage.displayName}
-                shouldEnableMaxHeight
-            >
-                <HeaderWithBackButton
-                    title={translate('workspace.rules.categoryRules.requiredFieldsTitle')}
-                    onBackButtonPress={() => Navigation.goBack(ROUTES.WORKSPACE_CATEGORY_SETTINGS.getRoute(policyID, categoryName))}
-                />
-                <ScrollView
-                    contentContainerStyle={[styles.flexGrow1]}
-                    addBottomSafeAreaPadding
-                >
-                    <View style={[styles.mh5, styles.pb5]}>
-                        <RenderHTML html={translate('workspace.rules.categoryRules.requiredFieldsDescription', decodedCategoryName)} />
-                    </View>
-                    <OfflineWithFeedback pendingAction={policyCategory?.pendingFields?.areCommentsRequired}>
-                        <View style={[styles.mt2, styles.mh5]}>
-                            <View style={[styles.flexRow, styles.mb5, styles.mr2, styles.alignItemsCenter, styles.justifyContentBetween]}>
-                                <Text style={[styles.flexShrink1, styles.mr2]}>{translate('workspace.rules.categoryRules.requireDescription')}</Text>
-                                <Switch
-                                    isOn={areCommentsRequired}
-                                    accessibilityLabel={translate('workspace.rules.categoryRules.requireDescription')}
-                                    onToggle={() => {
-                                        setPolicyCategoryDescriptionRequired(policyID, categoryName, !areCommentsRequired, policyCategories);
-                                    }}
-                                />
-                            </View>
-                        </View>
-                    </OfflineWithFeedback>
-                    {isAttendeeTrackingEnabled && !CONST.IS_ATTENDEES_REQUIRED_FEATURE_DISABLED && (
-                        <OfflineWithFeedback pendingAction={policyCategory?.pendingFields?.areAttendeesRequired}>
-                            <View style={[styles.mh5]}>
-                                <View style={[styles.flexRow, styles.mv5, styles.mr2, styles.alignItemsCenter, styles.justifyContentBetween]}>
-                                    <Text style={[styles.flexShrink1, styles.mr2]}>{translate('workspace.rules.categoryRules.requireAttendees')}</Text>
-                                    <Switch
-                                        isOn={areAttendeesRequired}
-                                        accessibilityLabel={translate('workspace.rules.categoryRules.requireAttendees')}
-                                        onToggle={() => {
-                                            setPolicyCategoryAttendeesRequired(policyID, categoryName, !areAttendeesRequired, policyCategories);
-                                        }}
-                                    />
-                                </View>
-                            </View>
-                        </OfflineWithFeedback>
-                    )}
-                </ScrollView>
-            </ScreenWrapper>
-        </AccessOrNotFoundWrapper>
-    );
-}
-
-CategoryRequiredFieldsPage.displayName = 'CategoryRequiredFieldsPage';
-
-export default CategoryRequiredFieldsPage;
diff --git a/src/pages/workspace/categories/CategorySettingsPage.tsx b/src/pages/workspace/categories/CategorySettingsPage.tsx
index f7c66a2ab7e7..e22c8bc46aa1 100644
--- a/src/pages/workspace/categories/CategorySettingsPage.tsx
+++ b/src/pages/workspace/categories/CategorySettingsPage.tsx
@@ -1,5 +1,5 @@
 import {useIsFocused} from '@react-navigation/native';
-import React, {useCallback, useEffect, useMemo, useState} from 'react';
+import React, {useEffect, useMemo, useState} from 'react';
 import {View} from 'react-native';
 import ConfirmModal from '@components/ConfirmModal';
 import HeaderWithBackButton from '@components/HeaderWithBackButton';
@@ -15,10 +15,8 @@ import useCurrentUserPersonalDetails from '@hooks/useCurrentUserPersonalDetails'
 import useEnvironment from '@hooks/useEnvironment';
 import useLocalize from '@hooks/useLocalize';
 import useOnboardingTaskInformation from '@hooks/useOnboardingTaskInformation';
-import useOnyx from '@hooks/useOnyx';
 import usePolicyData from '@hooks/usePolicyData';
 import useThemeStyles from '@hooks/useThemeStyles';
-import {formatRequiredFieldsTitle} from '@libs/AttendeeUtils';
 import {formatDefaultTaxRateText, formatRequireReceiptsOverText, getCategoryApproverRule, getCategoryDefaultTaxRate, getDecodedCategoryName} from '@libs/CategoryUtils';
 import {convertToDisplayString} from '@libs/CurrencyUtils';
 import {getLatestErrorMessageField} from '@libs/ErrorUtils';
@@ -26,13 +24,18 @@ import Navigation from '@libs/Navigation/Navigation';
 import type {PlatformStackScreenProps} from '@libs/Navigation/PlatformStackNavigation/types';
 import {isDisablingOrDeletingLastEnabledCategory} from '@libs/OptionsListUtils';
 import {getPersonalDetailByEmail} from '@libs/PersonalDetailsUtils';
-import {getWorkflowApprovalsUnavailable, hasTags, isControlPolicy} from '@libs/PolicyUtils';
+import {getWorkflowApprovalsUnavailable, isControlPolicy} from '@libs/PolicyUtils';
 import type {SettingsNavigatorParamList} from '@navigation/types';
 import NotFoundPage from '@pages/ErrorPage/NotFoundPage';
 import AccessOrNotFoundWrapper from '@pages/workspace/AccessOrNotFoundWrapper';
-import {clearCategoryErrors, deleteWorkspaceCategories, setWorkspaceCategoryEnabled} from '@userActions/Policy/Category';
+import {
+    clearCategoryErrors,
+    deleteWorkspaceCategories,
+    setPolicyCategoryDescriptionRequired,
+    setWorkspaceCategoryDescriptionHint,
+    setWorkspaceCategoryEnabled,
+} from '@userActions/Policy/Category';
 import CONST from '@src/CONST';
-import ONYXKEYS from '@src/ONYXKEYS';
 import ROUTES from '@src/ROUTES';
 import SCREENS from '@src/SCREENS';
 
@@ -72,18 +75,6 @@ function CategorySettingsPage({
         parentReportAction,
     } = useOnboardingTaskInformation(CONST.ONBOARDING_TASK_TYPE.SETUP_CATEGORIES);
 
-    const {
-        taskReport: setupCategoriesAndTagsTaskReport,
-        taskParentReport: setupCategoriesAndTagsTaskParentReport,
-        isOnboardingTaskParentReportArchived: isSetupCategoriesAndTagsTaskParentReportArchived,
-        hasOutstandingChildTask: setupCategoriesAndTagsHasOutstandingChildTask,
-        parentReportAction: setupCategoriesAndTagsParentReportAction,
-    } = useOnboardingTaskInformation(CONST.ONBOARDING_TASK_TYPE.SETUP_CATEGORIES_AND_TAGS);
-
-    const [policyTags] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY_TAGS}${policyID}`, {canBeMissing: true});
-
-    const policyHasTags = hasTags(policyTags);
-
     const navigateBack = () => {
         Navigation.goBack(isQuickSettingsFlow ? ROUTES.SETTINGS_CATEGORIES_ROOT.getRoute(policyID, backTo) : undefined);
     };
@@ -134,67 +125,28 @@ function CategorySettingsPage({
             return '';
         }
         return formatRequireReceiptsOverText(translate, policy, policyCategory?.maxAmountNoReceipt);
-        // eslint-disable-next-line react-hooks/exhaustive-deps
     }, [policy, policyCategory?.maxAmountNoReceipt, translate]);
 
-    const requiredFieldsTitle = useMemo(() => {
-        if (!policyCategory) {
-            return '';
-        }
-        return formatRequiredFieldsTitle(translate, policyCategory, policy?.isAttendeeTrackingEnabled);
-    }, [policyCategory, translate, policy?.isAttendeeTrackingEnabled]);
+    if (!policyCategory) {
+        return <NotFoundPage />;
+    }
 
-    const requireFieldsPendingAction = useMemo(() => {
-        if (policy?.isAttendeeTrackingEnabled) {
-            // Pending fields are objects so we can't use nullish coalescing
-            // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
-            return policyCategory?.pendingFields?.areAttendeesRequired || policyCategory?.pendingFields?.areCommentsRequired;
+    const updateWorkspaceCategoryEnabled = (value: boolean) => {
+        if (shouldPreventDisableOrDelete) {
+            setIsCannotDeleteOrDisableLastCategoryModalVisible(true);
+            return;
         }
-        return policyCategory?.pendingFields?.areCommentsRequired;
-    }, [policyCategory?.pendingFields, policy?.isAttendeeTrackingEnabled]);
-
-    const updateWorkspaceCategoryEnabled = useCallback(
-        (value: boolean) => {
-            if (shouldPreventDisableOrDelete) {
-                setIsCannotDeleteOrDisableLastCategoryModalVisible(true);
-                return;
-            }
-            setWorkspaceCategoryEnabled({
-                policyData,
-                categoriesToUpdate: {[policyCategory.name]: {name: policyCategory.name, enabled: value}},
-                isSetupCategoriesTaskParentReportArchived: isSetupCategoryTaskParentReportArchived,
-                setupCategoryTaskReport,
-                setupCategoryTaskParentReport,
-                currentUserAccountID: currentUserPersonalDetails.accountID,
-                hasOutstandingChildTask,
-                parentReportAction,
-                setupCategoriesAndTagsTaskReport,
-                setupCategoriesAndTagsTaskParentReport,
-                isSetupCategoriesAndTagsTaskParentReportArchived,
-                setupCategoriesAndTagsHasOutstandingChildTask,
-                setupCategoriesAndTagsParentReportAction,
-                policyHasTags,
-            });
-        },
-        [
-            setIsCannotDeleteOrDisableLastCategoryModalVisible,
-            shouldPreventDisableOrDelete,
+        setWorkspaceCategoryEnabled(
             policyData,
-            policyCategory.name,
+            {[policyCategory.name]: {name: policyCategory.name, enabled: value}},
             isSetupCategoryTaskParentReportArchived,
             setupCategoryTaskReport,
             setupCategoryTaskParentReport,
             currentUserPersonalDetails.accountID,
             hasOutstandingChildTask,
             parentReportAction,
-            setupCategoriesAndTagsTaskReport,
-            setupCategoriesAndTagsTaskParentReport,
-            isSetupCategoriesAndTagsTaskParentReportArchived,
-            setupCategoriesAndTagsHasOutstandingChildTask,
-            setupCategoriesAndTagsParentReportAction,
-            policyHasTags,
-        ],
-    );
+        );
+    };
 
     const navigateToEditCategory = () => {
         Navigation.navigate(
@@ -221,10 +173,6 @@ function CategorySettingsPage({
     const workflowApprovalsUnavailable = getWorkflowApprovalsUnavailable(policy);
     const approverDisabled = !policy?.areWorkflowsEnabled || workflowApprovalsUnavailable;
 
-    if (!policyCategory) {
-        return <NotFoundPage />;
-    }
-
     return (
         <AccessOrNotFoundWrapper
             accessVariants={[CONST.POLICY.ACCESS_VARIANTS.ADMIN, CONST.POLICY.ACCESS_VARIANTS.PAID]}
@@ -340,38 +288,40 @@ function CategorySettingsPage({
                         />
                     </OfflineWithFeedback>
 
-                    {areCommentsRequired && (
-                        <OfflineWithFeedback pendingAction={policyCategory.pendingFields?.commentHint}>
-                            <MenuItemWithTopDescription
-                                title={policyCategory?.commentHint}
-                                description={translate('workspace.rules.categoryRules.descriptionHint')}
-                                onPress={() => {
-                                    Navigation.navigate(ROUTES.WORKSPACE_CATEGORY_DESCRIPTION_HINT.getRoute(policyID, policyCategory.name));
-                                }}
-                                shouldShowRightIcon
-                            />
-                        </OfflineWithFeedback>
-                    )}
-
-                    {!isThereAnyAccountingConnection && (
-                        <MenuItem
-                            icon={Trashcan}
-                            title={translate('workspace.categories.deleteCategory')}
-                            onPress={() => {
-                                if (shouldPreventDisableOrDelete) {
-                                    setIsCannotDeleteOrDisableLastCategoryModalVisible(true);
-                                    return;
-                                }
-                                setDeleteCategoryConfirmModalVisible(true);
-                            }}
-                        />
-                    )}
-
                     {!!policy?.areRulesEnabled && (
                         <>
                             <View style={[styles.mh5, styles.pt3, styles.borderTop]}>
                                 <Text style={[styles.textNormal, styles.textStrong, styles.mv3]}>{translate('workspace.rules.categoryRules.title')}</Text>
                             </View>
+                            <OfflineWithFeedback pendingAction={policyCategory?.pendingFields?.areCommentsRequired}>
+                                <View style={[styles.mt2, styles.mh5]}>
+                                    <View style={[styles.flexRow, styles.mb5, styles.mr2, styles.alignItemsCenter, styles.justifyContentBetween]}>
+                                        <Text style={[styles.flexShrink1, styles.mr2]}>{translate('workspace.rules.categoryRules.requireDescription')}</Text>
+                                        <Switch
+                                            isOn={policyCategory?.areCommentsRequired ?? false}
+                                            accessibilityLabel={translate('workspace.rules.categoryRules.requireDescription')}
+                                            onToggle={() => {
+                                                if (policyCategory.commentHint && areCommentsRequired) {
+                                                    setWorkspaceCategoryDescriptionHint(policyID, categoryName, '', policyCategories);
+                                                }
+                                                setPolicyCategoryDescriptionRequired(policyID, categoryName, !areCommentsRequired, policyCategories);
+                                            }}
+                                        />
+                                    </View>
+                                </View>
+                            </OfflineWithFeedback>
+                            {!!policyCategory?.areCommentsRequired && (
+                                <OfflineWithFeedback pendingAction={policyCategory.pendingFields?.commentHint}>
+                                    <MenuItemWithTopDescription
+                                        title={policyCategory?.commentHint}
+                                        description={translate('workspace.rules.categoryRules.descriptionHint')}
+                                        onPress={() => {
+                                            Navigation.navigate(ROUTES.WORKSPACE_CATEGORY_DESCRIPTION_HINT.getRoute(policyID, policyCategory.name));
+                                        }}
+                                        shouldShowRightIcon
+                                    />
+                                </OfflineWithFeedback>
+                            )}
                             <MenuItemWithTopDescription
                                 title={approverText}
                                 description={translate('workspace.rules.categoryRules.approver')}
@@ -420,18 +370,21 @@ function CategorySettingsPage({
                                     shouldShowRightIcon
                                 />
                             </OfflineWithFeedback>
-                            <OfflineWithFeedback pendingAction={requireFieldsPendingAction}>
-                                <MenuItemWithTopDescription
-                                    title={requiredFieldsTitle}
-                                    description={translate('workspace.rules.categoryRules.requireFields')}
-                                    onPress={() => {
-                                        Navigation.navigate(ROUTES.WORKSPACE_CATEGORY_REQUIRED_FIELDS.getRoute(policyID, policyCategory.name));
-                                    }}
-                                    shouldShowRightIcon
-                                />
-                            </OfflineWithFeedback>
                         </>
                     )}
+                    {!isThereAnyAccountingConnection && (
+                        <MenuItem
+                            icon={Trashcan}
+                            title={translate('common.delete')}
+                            onPress={() => {
+                                if (shouldPreventDisableOrDelete) {
+                                    setIsCannotDeleteOrDisableLastCategoryModalVisible(true);
+                                    return;
+                                }
+                                setDeleteCategoryConfirmModalVisible(true);
+                            }}
+                        />
+                    )}
                 </ScrollView>
             </ScreenWrapper>
         </AccessOrNotFoundWrapper>
diff --git a/src/pages/workspace/categories/CreateCategoryPage.tsx b/src/pages/workspace/categories/CreateCategoryPage.tsx
index 155bcd08df18..518121c848a7 100644
--- a/src/pages/workspace/categories/CreateCategoryPage.tsx
+++ b/src/pages/workspace/categories/CreateCategoryPage.tsx
@@ -10,7 +10,6 @@ import useThemeStyles from '@hooks/useThemeStyles';
 import {createPolicyCategory} from '@libs/actions/Policy/Category';
 import Navigation from '@libs/Navigation/Navigation';
 import type {PlatformStackScreenProps} from '@libs/Navigation/PlatformStackNavigation/types';
-import {hasTags} from '@libs/PolicyUtils';
 import type {SettingsNavigatorParamList} from '@navigation/types';
 import AccessOrNotFoundWrapper from '@pages/workspace/AccessOrNotFoundWrapper';
 import CONST from '@src/CONST';
@@ -25,7 +24,6 @@ type CreateCategoryPageProps =
 
 function CreateCategoryPage({route}: CreateCategoryPageProps) {
     const [policyCategories] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY_CATEGORIES}${route.params.policyID}`, {canBeMissing: true});
-    const [policyTags] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY_TAGS}${route.params.policyID}`, {canBeMissing: true});
     const styles = useThemeStyles();
     const {translate} = useLocalize();
     const backTo = route.params?.backTo;
@@ -39,34 +37,18 @@ function CreateCategoryPage({route}: CreateCategoryPageProps) {
         parentReportAction,
     } = useOnboardingTaskInformation(CONST.ONBOARDING_TASK_TYPE.SETUP_CATEGORIES);
 
-    const {
-        taskReport: setupCategoriesAndTagsTaskReport,
-        taskParentReport: setupCategoriesAndTagsTaskParentReport,
-        isOnboardingTaskParentReportArchived: isSetupCategoriesAndTagsTaskParentReportArchived,
-        hasOutstandingChildTask: setupCategoriesAndTagsHasOutstandingChildTask,
-        parentReportAction: setupCategoriesAndTagsParentReportAction,
-    } = useOnboardingTaskInformation(CONST.ONBOARDING_TASK_TYPE.SETUP_CATEGORIES_AND_TAGS);
-
-    const policyHasTags = hasTags(policyTags);
-
     const createCategory = useCallback(
         (values: FormOnyxValues<typeof ONYXKEYS.FORMS.WORKSPACE_CATEGORY_FORM>) => {
-            createPolicyCategory({
-                policyID: route.params.policyID,
-                categoryName: values.categoryName.trim(),
-                isSetupCategoriesTaskParentReportArchived: isSetupCategoryTaskParentReportArchived,
+            createPolicyCategory(
+                route.params.policyID,
+                values.categoryName.trim(),
+                isSetupCategoryTaskParentReportArchived,
                 setupCategoryTaskReport,
                 setupCategoryTaskParentReport,
-                currentUserAccountID: currentUserPersonalDetails.accountID,
+                currentUserPersonalDetails.accountID,
                 hasOutstandingChildTask,
                 parentReportAction,
-                setupCategoriesAndTagsTaskReport,
-                setupCategoriesAndTagsTaskParentReport,
-                isSetupCategoriesAndTagsTaskParentReportArchived,
-                setupCategoriesAndTagsHasOutstandingChildTask,
-                setupCategoriesAndTagsParentReportAction,
-                policyHasTags,
-            });
+            );
             Navigation.goBack(isQuickSettingsFlow ? ROUTES.SETTINGS_CATEGORIES_ROOT.getRoute(route.params.policyID, backTo) : undefined);
         },
         [
@@ -79,12 +61,6 @@ function CreateCategoryPage({route}: CreateCategoryPageProps) {
             backTo,
             hasOutstandingChildTask,
             parentReportAction,
-            setupCategoriesAndTagsTaskReport,
-            setupCategoriesAndTagsTaskParentReport,
-            isSetupCategoriesAndTagsTaskParentReportArchived,
-            setupCategoriesAndTagsHasOutstandingChildTask,
-            setupCategoriesAndTagsParentReportAction,
-            policyHasTags,
         ],
     );
 
diff --git a/src/pages/workspace/categories/ImportCategoriesPage.tsx b/src/pages/workspace/categories/ImportCategoriesPage.tsx
index f5bf1dda760a..1f195c8cb4d4 100644
--- a/src/pages/workspace/categories/ImportCategoriesPage.tsx
+++ b/src/pages/workspace/categories/ImportCategoriesPage.tsx
@@ -30,7 +30,6 @@ function ImportCategoriesPage({route}: ImportCategoriesPageProps) {
         <AccessOrNotFoundWrapper
             policyID={policyID}
             accessVariants={[CONST.POLICY.ACCESS_VARIANTS.ADMIN]}
-            featureName={CONST.POLICY.MORE_FEATURES.ARE_CATEGORIES_ENABLED}
             fullPageNotFoundViewProps={{subtitleKey: isEmptyObject(policy) ? undefined : 'workspace.common.notAuthorized', onLinkPress: goBackFromInvalidPolicy}}
         >
             <ImportSpreadsheet
diff --git a/src/pages/workspace/categories/ImportedCategoriesPage.tsx b/src/pages/workspace/categories/ImportedCategoriesPage.tsx
index 68e0fdb5bc2e..4f2c9a512933 100644
--- a/src/pages/workspace/categories/ImportedCategoriesPage.tsx
+++ b/src/pages/workspace/categories/ImportedCategoriesPage.tsx
@@ -66,7 +66,7 @@ function ImportedCategoriesPage({route}: ImportedCategoriesPageProps) {
 
         const missingRequiredColumns = requiredColumns.find((requiredColumn) => !columns.includes(requiredColumn.value));
         if (missingRequiredColumns) {
-            errors.required = translate('spreadsheet.fieldNotMapped', missingRequiredColumns.text);
+            errors.required = translate('spreadsheet.fieldNotMapped', {fieldName: missingRequiredColumns.text});
         } else {
             const duplicate = findDuplicate(columns);
             const duplicateColumn = columnRoles.find((role) => role.value === duplicate);
@@ -76,9 +76,9 @@ function ImportedCategoriesPage({route}: ImportedCategoriesPageProps) {
             const containsEmptyName = categoriesNames?.some((name, index) => (!containsHeader || index > 0) && !name?.toString().trim());
 
             if (duplicateColumn) {
-                errors.duplicates = translate('spreadsheet.singleFieldMultipleColumns', duplicateColumn.text);
+                errors.duplicates = translate('spreadsheet.singleFieldMultipleColumns', {fieldName: duplicateColumn.text});
             } else if (containsEmptyName) {
-                errors.emptyNames = translate('spreadsheet.emptyMappedField', translate('common.name'));
+                errors.emptyNames = translate('spreadsheet.emptyMappedField', {fieldName: translate('common.name')});
             } else {
                 errors = {};
             }
diff --git a/src/pages/workspace/categories/WorkspaceCategoriesPage.tsx b/src/pages/workspace/categories/WorkspaceCategoriesPage.tsx
index f15aa922d4b0..e0b7dbcb658f 100644
--- a/src/pages/workspace/categories/WorkspaceCategoriesPage.tsx
+++ b/src/pages/workspace/categories/WorkspaceCategoriesPage.tsx
@@ -47,7 +47,7 @@ import Navigation from '@libs/Navigation/Navigation';
 import type {PlatformStackScreenProps} from '@libs/Navigation/PlatformStackNavigation/types';
 import type {WorkspaceSplitNavigatorParamList} from '@libs/Navigation/types';
 import {isDisablingOrDeletingLastEnabledCategory} from '@libs/OptionsListUtils';
-import {getConnectedIntegration, getCurrentConnectionName, hasAccountingConnections, hasTags, isControlPolicy, shouldShowSyncError} from '@libs/PolicyUtils';
+import {getConnectedIntegration, getCurrentConnectionName, hasAccountingConnections, isControlPolicy, shouldShowSyncError} from '@libs/PolicyUtils';
 import tokenizedSearch from '@libs/tokenizedSearch';
 import AccessOrNotFoundWrapper from '@pages/workspace/AccessOrNotFoundWrapper';
 import variables from '@styles/variables';
@@ -102,18 +102,6 @@ function WorkspaceCategoriesPage({route}: WorkspaceCategoriesPageProps) {
         parentReportAction,
     } = useOnboardingTaskInformation(CONST.ONBOARDING_TASK_TYPE.SETUP_CATEGORIES);
 
-    const {
-        taskReport: setupCategoriesAndTagsTaskReport,
-        taskParentReport: setupCategoriesAndTagsTaskParentReport,
-        isOnboardingTaskParentReportArchived: isSetupCategoriesAndTagsTaskParentReportArchived,
-        hasOutstandingChildTask: setupCategoriesAndTagsHasOutstandingChildTask,
-        parentReportAction: setupCategoriesAndTagsParentReportAction,
-    } = useOnboardingTaskInformation(CONST.ONBOARDING_TASK_TYPE.SETUP_CATEGORIES_AND_TAGS);
-
-    const [policyTags] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY_TAGS}${policyId}`, {canBeMissing: true});
-
-    const policyHasTags = hasTags(policyTags);
-
     const fetchCategories = useCallback(() => {
         openPolicyCategoriesPage(policyId);
     }, [policyId]);
@@ -163,22 +151,16 @@ function WorkspaceCategoriesPage({route}: WorkspaceCategoriesPageProps) {
 
     const updateWorkspaceCategoryEnabled = useCallback(
         (value: boolean, categoryName: string) => {
-            setWorkspaceCategoryEnabled({
+            setWorkspaceCategoryEnabled(
                 policyData,
-                categoriesToUpdate: {[categoryName]: {name: categoryName, enabled: value}},
-                isSetupCategoriesTaskParentReportArchived: isSetupCategoryTaskParentReportArchived,
+                {[categoryName]: {name: categoryName, enabled: value}},
+                isSetupCategoryTaskParentReportArchived,
                 setupCategoryTaskReport,
                 setupCategoryTaskParentReport,
-                currentUserAccountID: currentUserPersonalDetails.accountID,
+                currentUserPersonalDetails.accountID,
                 hasOutstandingChildTask,
                 parentReportAction,
-                setupCategoriesAndTagsTaskReport,
-                setupCategoriesAndTagsTaskParentReport,
-                isSetupCategoriesAndTagsTaskParentReportArchived,
-                setupCategoriesAndTagsHasOutstandingChildTask,
-                setupCategoriesAndTagsParentReportAction,
-                policyHasTags,
-            });
+            );
         },
         [
             policyData,
@@ -188,12 +170,6 @@ function WorkspaceCategoriesPage({route}: WorkspaceCategoriesPageProps) {
             currentUserPersonalDetails.accountID,
             hasOutstandingChildTask,
             parentReportAction,
-            setupCategoriesAndTagsTaskReport,
-            setupCategoriesAndTagsTaskParentReport,
-            isSetupCategoriesAndTagsTaskParentReportArchived,
-            setupCategoriesAndTagsHasOutstandingChildTask,
-            setupCategoriesAndTagsParentReportAction,
-            policyHasTags,
         ],
     );
 
@@ -230,7 +206,7 @@ function WorkspaceCategoriesPage({route}: WorkspaceCategoriesPageProps) {
                             <Switch
                                 isOn={value.enabled}
                                 disabled={isDisabled}
-                                accessibilityLabel={`${translate('workspace.categories.enableCategory')}: ${getDecodedCategoryName(value.name)}`}
+                                accessibilityLabel={translate('workspace.categories.enableCategory')}
                                 onToggle={(newValue: boolean) => {
                                     if (isDisablingOrDeletingLastEnabledCategory(policy, policyCategories, [value])) {
                                         setIsCannotDeleteOrDisableLastCategoryModalVisible(true);
@@ -246,7 +222,7 @@ function WorkspaceCategoriesPage({route}: WorkspaceCategoriesPageProps) {
                     <Switch
                         isOn={value.enabled}
                         disabled={isDisabled}
-                        accessibilityLabel={`${translate('workspace.categories.enableCategory')}: ${getDecodedCategoryName(value.name)}`}
+                        accessibilityLabel={translate('workspace.categories.enableCategory')}
                         onToggle={(newValue: boolean) => {
                             if (isDisablingOrDeletingLastEnabledCategory(policy, policyCategories, [value])) {
                                 setIsCannotDeleteOrDisableLastCategoryModalVisible(true);
@@ -483,22 +459,16 @@ function WorkspaceCategoriesPage({route}: WorkspaceCategoriesPageProps) {
                             return;
                         }
                         setSelectedCategories([]);
-                        setWorkspaceCategoryEnabled({
+                        setWorkspaceCategoryEnabled(
                             policyData,
-                            categoriesToUpdate: categoriesToDisable,
-                            isSetupCategoriesTaskParentReportArchived: isSetupCategoryTaskParentReportArchived,
+                            categoriesToDisable,
+                            isSetupCategoryTaskParentReportArchived,
                             setupCategoryTaskReport,
                             setupCategoryTaskParentReport,
-                            currentUserAccountID: currentUserPersonalDetails.accountID,
+                            currentUserPersonalDetails.accountID,
                             hasOutstandingChildTask,
                             parentReportAction,
-                            setupCategoriesAndTagsTaskReport,
-                            setupCategoriesAndTagsTaskParentReport,
-                            isSetupCategoriesAndTagsTaskParentReportArchived,
-                            setupCategoriesAndTagsHasOutstandingChildTask,
-                            setupCategoriesAndTagsParentReportAction,
-                            policyHasTags,
-                        });
+                        );
                     },
                 });
             }
@@ -520,22 +490,16 @@ function WorkspaceCategoriesPage({route}: WorkspaceCategoriesPageProps) {
                     value: CONST.POLICY.BULK_ACTION_TYPES.ENABLE,
                     onSelected: () => {
                         setSelectedCategories([]);
-                        setWorkspaceCategoryEnabled({
+                        setWorkspaceCategoryEnabled(
                             policyData,
-                            categoriesToUpdate: categoriesToEnable,
-                            isSetupCategoriesTaskParentReportArchived: isSetupCategoryTaskParentReportArchived,
+                            categoriesToEnable,
+                            isSetupCategoryTaskParentReportArchived,
                             setupCategoryTaskReport,
                             setupCategoryTaskParentReport,
-                            currentUserAccountID: currentUserPersonalDetails.accountID,
+                            currentUserPersonalDetails.accountID,
                             hasOutstandingChildTask,
                             parentReportAction,
-                            setupCategoriesAndTagsTaskReport,
-                            setupCategoriesAndTagsTaskParentReport,
-                            isSetupCategoriesAndTagsTaskParentReportArchived,
-                            setupCategoriesAndTagsHasOutstandingChildTask,
-                            setupCategoriesAndTagsParentReportAction,
-                            policyHasTags,
-                        });
+                        );
                     },
                 });
             }
diff --git a/src/pages/workspace/companyCards/WorkspaceCompanyCardAccountSelectCardPage.tsx b/src/pages/workspace/companyCards/WorkspaceCompanyCardAccountSelectCardPage.tsx
index dbf4253aca5a..3a20af1c6d6a 100644
--- a/src/pages/workspace/companyCards/WorkspaceCompanyCardAccountSelectCardPage.tsx
+++ b/src/pages/workspace/companyCards/WorkspaceCompanyCardAccountSelectCardPage.tsx
@@ -1,4 +1,4 @@
-import React, {useState} from 'react';
+import React, {useMemo, useState} from 'react';
 import {View} from 'react-native';
 import BlockingView from '@components/BlockingViews/BlockingView';
 import RenderHTML from '@components/RenderHTML';
@@ -43,7 +43,7 @@ function WorkspaceCompanyCardAccountSelectCardPage({route}: WorkspaceCompanyCard
     const connectedIntegration = getConnectedIntegration(policy) ?? CONST.POLICY.CONNECTIONS.NAME.QBO;
     // We need to have an unchanged active route for getExportMenuItem so the export page link is not updated incorrectly when user is in other pages
     // See https://github.com/Expensify/App/issues/72352 for more details.
-    const activeRoute = Navigation.getActiveRoute();
+    const activeRoute = useMemo(() => Navigation.getActiveRoute(), []);
     const exportMenuItem = getExportMenuItem(connectedIntegration, policyID, translate, policy, card, activeRoute);
     const currentConnectionName = getCurrentConnectionName(policy);
     const shouldShowTextInput = (exportMenuItem?.data?.length ?? 0) >= CONST.STANDARD_LIST_ITEM_LIMIT;
@@ -56,7 +56,9 @@ function WorkspaceCompanyCardAccountSelectCardPage({route}: WorkspaceCompanyCard
     const companyFeeds = getCompanyFeeds(cardFeeds);
     const domainOrWorkspaceAccountID = getDomainOrWorkspaceAccountID(workspaceAccountID, companyFeeds[feed]);
 
-    const searchedListOptions = tokenizedSearch(exportMenuItem?.data ?? [], searchText, (option) => [option.value]);
+    const searchedListOptions = useMemo(() => {
+        return tokenizedSearch(exportMenuItem?.data ?? [], searchText, (option) => [option.value]);
+    }, [exportMenuItem?.data, searchText]);
 
     const listEmptyContent = (
         <BlockingView
diff --git a/src/pages/workspace/companyCards/WorkspaceCompanyCardDetailsPage.tsx b/src/pages/workspace/companyCards/WorkspaceCompanyCardDetailsPage.tsx
index 6f1d9be70cf3..29c093eeeaa8 100644
--- a/src/pages/workspace/companyCards/WorkspaceCompanyCardDetailsPage.tsx
+++ b/src/pages/workspace/companyCards/WorkspaceCompanyCardDetailsPage.tsx
@@ -112,7 +112,7 @@ function WorkspaceCompanyCardDetailsPage({route}: WorkspaceCompanyCardDetailsPag
     }, [getLocalDateFromDatetime, card?.lastScrape, translate]);
 
     // Don't show NotFoundPage if card is being unassigned or data is still loading
-    if ((!card && !isUnassigningRef.current && !isLoadingOnyxValue(allBankCardsMetadata) && !isLoadingOnyxValue(cardListMetadata)) || (isCardBeingUnassigned && !isUnassigningRef.current)) {
+    if (!card && !isUnassigningRef.current && !isLoadingOnyxValue(allBankCardsMetadata) && !isLoadingOnyxValue(cardListMetadata)) {
         return <NotFoundPage />;
     }
 
diff --git a/src/pages/workspace/companyCards/WorkspaceCompanyCardFeedSelectorPage.tsx b/src/pages/workspace/companyCards/WorkspaceCompanyCardFeedSelectorPage.tsx
index 6756024ae712..242a49502ee5 100644
--- a/src/pages/workspace/companyCards/WorkspaceCompanyCardFeedSelectorPage.tsx
+++ b/src/pages/workspace/companyCards/WorkspaceCompanyCardFeedSelectorPage.tsx
@@ -69,7 +69,7 @@ function WorkspaceCompanyCardFeedSelectorPage({route}: WorkspaceCompanyCardFeedS
             value: feedName,
             feed: feedSettings.feed,
             alternateText: domainName ?? policy?.name,
-            text: getCustomOrFormattedFeedName(translate, feedSettings.feed, feedSettings.customFeedName),
+            text: getCustomOrFormattedFeedName(feedSettings.feed, feedSettings.customFeedName),
             keyForList: feedName,
             isSelected: feedName === selectedFeedName,
             isDisabled: feedSettings.pendingAction === CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE,
diff --git a/src/pages/workspace/companyCards/WorkspaceCompanyCardPageEmptyState.tsx b/src/pages/workspace/companyCards/WorkspaceCompanyCardPageEmptyState.tsx
index b951c0b19494..059ea878a81f 100644
--- a/src/pages/workspace/companyCards/WorkspaceCompanyCardPageEmptyState.tsx
+++ b/src/pages/workspace/companyCards/WorkspaceCompanyCardPageEmptyState.tsx
@@ -1,4 +1,4 @@
-import React, {useContext} from 'react';
+import React, {useCallback, useContext, useMemo} from 'react';
 import {View} from 'react-native';
 import {DelegateNoAccessContext} from '@components/DelegateNoAccessModalProvider';
 import FeatureList from '@components/FeatureList';
@@ -35,30 +35,32 @@ function WorkspaceCompanyCardPageEmptyState({policy, shouldShowGBDisclaimer}: Wo
 
     const illustrations = useMemoizedLazyIllustrations(['CreditCardsNew', 'HandCard', 'MagnifyingGlassMoney', 'CompanyCardsEmptyState']);
 
-    const features = [
-        {
-            icon: illustrations.CreditCardsNew,
-            translationKey: 'workspace.moreFeatures.companyCards.feed.features.support' as const,
-        },
+    const companyCardFeatures = useMemo(() => {
+        const features = [
+            {
+                icon: illustrations.CreditCardsNew,
+                translationKey: 'workspace.moreFeatures.companyCards.feed.features.support' as const,
+            },
 
-        {
-            icon: illustrations.HandCard,
-            translationKey: 'workspace.moreFeatures.companyCards.feed.features.assignCards' as const,
-        },
+            {
+                icon: illustrations.HandCard,
+                translationKey: 'workspace.moreFeatures.companyCards.feed.features.assignCards' as const,
+            },
 
-        {
-            icon: illustrations.MagnifyingGlassMoney,
-            translationKey: 'workspace.moreFeatures.companyCards.feed.features.automaticImport' as const,
-        },
-    ];
-    const companyCardFeatures = features
-        .filter((feature) => feature.icon !== null)
-        .map((feature) => ({
-            icon: feature.icon,
-            translationKey: feature.translationKey,
-        }));
+            {
+                icon: illustrations.MagnifyingGlassMoney,
+                translationKey: 'workspace.moreFeatures.companyCards.feed.features.automaticImport' as const,
+            },
+        ];
+        return features
+            .filter((feature) => feature.icon !== null)
+            .map((feature) => ({
+                icon: feature.icon,
+                translationKey: feature.translationKey,
+            }));
+    }, [illustrations.CreditCardsNew, illustrations.HandCard, illustrations.MagnifyingGlassMoney]);
 
-    const handleCtaPress = () => {
+    const handleCtaPress = useCallback(() => {
         if (!policy?.id) {
             return;
         }
@@ -68,7 +70,7 @@ function WorkspaceCompanyCardPageEmptyState({policy, shouldShowGBDisclaimer}: Wo
         }
         clearAddNewCardFlow();
         Navigation.navigate(ROUTES.WORKSPACE_COMPANY_CARDS_ADD_NEW.getRoute(policy.id));
-    };
+    }, [policy?.id, isActingAsDelegate, showDelegateNoAccessModal]);
 
     return (
         <View style={[styles.mt3, shouldUseNarrowLayout ? styles.workspaceSectionMobile : styles.workspaceSection]}>
diff --git a/src/pages/workspace/companyCards/WorkspaceCompanyCardsSettingsFeedNamePage.tsx b/src/pages/workspace/companyCards/WorkspaceCompanyCardsSettingsFeedNamePage.tsx
index 29a3faaef64c..16b5a20a1089 100644
--- a/src/pages/workspace/companyCards/WorkspaceCompanyCardsSettingsFeedNamePage.tsx
+++ b/src/pages/workspace/companyCards/WorkspaceCompanyCardsSettingsFeedNamePage.tsx
@@ -46,7 +46,7 @@ function WorkspaceCompanyCardsSettingsFeedNamePage({
     const selectedFeed = getSelectedFeed(lastSelectedFeed, cardFeeds);
     const feed = selectedFeed ? getCompanyCardFeed(selectedFeed) : undefined;
     const companyFeeds = getCompanyFeeds(cardFeeds);
-    const feedName = selectedFeed ? getCustomOrFormattedFeedName(translate, feed, cardFeeds?.[selectedFeed]?.customFeedName) : undefined;
+    const feedName = selectedFeed ? getCustomOrFormattedFeedName(feed, cardFeeds?.[selectedFeed]?.customFeedName) : undefined;
     const domainOrWorkspaceAccountID = getDomainOrWorkspaceAccountID(workspaceAccountID, selectedFeed ? companyFeeds[selectedFeed] : undefined);
 
     const validate = useCallback(
diff --git a/src/pages/workspace/companyCards/WorkspaceCompanyCardsSettingsPage.tsx b/src/pages/workspace/companyCards/WorkspaceCompanyCardsSettingsPage.tsx
index e954f57c03be..2bcb609829af 100644
--- a/src/pages/workspace/companyCards/WorkspaceCompanyCardsSettingsPage.tsx
+++ b/src/pages/workspace/companyCards/WorkspaceCompanyCardsSettingsPage.tsx
@@ -48,7 +48,7 @@ function WorkspaceCompanyCardsSettingsPage({
     const feed = selectedFeed ? getCompanyCardFeed(selectedFeed) : undefined;
 
     const [cardsList] = useCardsList(selectedFeed);
-    const feedName = selectedFeed ? getCustomOrFormattedFeedName(translate, feed, cardFeeds?.[selectedFeed]?.customFeedName) : undefined;
+    const feedName = selectedFeed ? getCustomOrFormattedFeedName(feed, cardFeeds?.[selectedFeed]?.customFeedName) : undefined;
     const companyFeeds = getCompanyFeeds(cardFeeds);
     const selectedFeedData = selectedFeed ? companyFeeds[selectedFeed] : undefined;
     const liabilityType = selectedFeedData?.liabilityType;
diff --git a/src/pages/workspace/companyCards/WorkspaceCompanyCardsTable/WorkspaceCompanyCardsTableHeaderButtons.tsx b/src/pages/workspace/companyCards/WorkspaceCompanyCardsTable/WorkspaceCompanyCardsTableHeaderButtons.tsx
index bb06c017340f..29bcc8e33c7e 100644
--- a/src/pages/workspace/companyCards/WorkspaceCompanyCardsTable/WorkspaceCompanyCardsTableHeaderButtons.tsx
+++ b/src/pages/workspace/companyCards/WorkspaceCompanyCardsTable/WorkspaceCompanyCardsTableHeaderButtons.tsx
@@ -9,7 +9,6 @@ import Icon from '@components/Icon';
 import RenderHTML from '@components/RenderHTML';
 import Table from '@components/Table';
 import useCardFeeds from '@hooks/useCardFeeds';
-import useCurrencyList from '@hooks/useCurrencyList';
 import {useMemoizedLazyExpensifyIcons} from '@hooks/useLazyAsset';
 import useLocalize from '@hooks/useLocalize';
 import useOnyx from '@hooks/useOnyx';
@@ -25,7 +24,8 @@ import {setAddNewCompanyCardStepAndData, setAssignCardStepAndData} from '@userAc
 import CONST from '@src/CONST';
 import ONYXKEYS from '@src/ONYXKEYS';
 import ROUTES from '@src/ROUTES';
-import type {CompanyCardFeedWithDomainID} from '@src/types/onyx';
+import type {CompanyCardFeedWithDomainID, CurrencyList} from '@src/types/onyx';
+import {getEmptyObject} from '@src/types/utils/EmptyObject';
 
 const FEED_SELECTOR_SKELETON_WIDTH = 289;
 
@@ -51,7 +51,6 @@ function WorkspaceCompanyCardsTableHeaderButtons({policyID, feedName, isLoading,
 
     const {shouldUseNarrowLayout, isMediumScreenWidth} = useResponsiveLayout();
     const {translate} = useLocalize();
-    const {currencyList} = useCurrencyList();
     const theme = useTheme();
     const icons = useMemoizedLazyExpensifyIcons(['Gear']);
     const expensifyIcons = useMemoizedLazyExpensifyIcons(['DotIndicator']);
@@ -59,12 +58,13 @@ function WorkspaceCompanyCardsTableHeaderButtons({policyID, feedName, isLoading,
     const [cardFeeds] = useCardFeeds(policyID);
     const policy = usePolicy(policyID);
     const feed = getCompanyCardFeed(feedName);
-    const formattedFeedName = feedName ? getCustomOrFormattedFeedName(translate, feed, cardFeeds?.[feedName]?.customFeedName) : undefined;
+    const formattedFeedName = feedName ? getCustomOrFormattedFeedName(feed, cardFeeds?.[feedName]?.customFeedName) : undefined;
     const isCommercialFeed = isCustomFeed(feedName);
     const companyFeeds = getCompanyFeeds(cardFeeds);
     const currentFeedData = feedName ? companyFeeds?.[feedName] : undefined;
     const [domain] = useOnyx(`${ONYXKEYS.COLLECTION.DOMAIN}${currentFeedData?.domainID}`, {canBeMissing: true});
     const [countryByIp] = useOnyx(ONYXKEYS.COUNTRY, {canBeMissing: false});
+    const [currencyList = getEmptyObject<CurrencyList>()] = useOnyx(ONYXKEYS.CURRENCY_LIST, {canBeMissing: true});
 
     const {hasFeedError, isFeedConnectionBroken} = useCompanyCardFeedErrors({policyID, feedName});
     const hasCompanyCardFeedError = useHasWorkspaceCompanyCardErrors({policyID});
diff --git a/src/pages/workspace/companyCards/WorkspaceCompanyCardsTable/WorkspaceCompanyCardsTableItem.tsx b/src/pages/workspace/companyCards/WorkspaceCompanyCardsTable/WorkspaceCompanyCardsTableItem.tsx
index e49f4c98f32a..926e9822e0c3 100644
--- a/src/pages/workspace/companyCards/WorkspaceCompanyCardsTable/WorkspaceCompanyCardsTableItem.tsx
+++ b/src/pages/workspace/companyCards/WorkspaceCompanyCardsTable/WorkspaceCompanyCardsTableItem.tsx
@@ -6,12 +6,10 @@ import Button from '@components/Button';
 import Icon from '@components/Icon';
 import OfflineWithFeedback from '@components/OfflineWithFeedback';
 import {PressableWithFeedback} from '@components/Pressable';
-import TableRowSkeleton from '@components/Skeletons/TableRowSkeleton';
 import Text from '@components/Text';
 import TextWithTooltip from '@components/TextWithTooltip';
 import {useMemoizedLazyExpensifyIcons} from '@hooks/useLazyAsset';
 import useLocalize from '@hooks/useLocalize';
-import useNetwork from '@hooks/useNetwork';
 import useTheme from '@hooks/useTheme';
 import useThemeStyles from '@hooks/useThemeStyles';
 import {resetFailedWorkspaceCompanyCardAssignment} from '@libs/actions/CompanyCards';
@@ -20,23 +18,13 @@ import Navigation from '@libs/Navigation/Navigation';
 import {getDefaultAvatarURL} from '@libs/UserAvatarUtils';
 import CONST from '@src/CONST';
 import ROUTES from '@src/ROUTES';
-import type {Card, CompanyCardFeed, CompanyCardFeedWithDomainID, PersonalDetails} from '@src/types/onyx';
-import type {Errors, PendingAction} from '@src/types/onyx/OnyxCommon';
+import type {Card, CompanyCardFeed, CompanyCardFeedWithDomainID, FailedCompanyCardAssignment, PersonalDetails} from '@src/types/onyx';
 
 type WorkspaceCompanyCardTableItemData = {
-    /**
-     * The masked card number displayed to users (e.g., "XXXX1234" or "VISA - 1234").
-     */
+    /** Card number */
     cardName: string;
 
-    /**
-     * The card identifier sent to backend.
-     * For direct feeds (Plaid/OAuth): equals cardName
-     * For commercial feeds (Visa/Mastercard/Amex): encrypted value
-     */
-    encryptedCardNumber: string;
-
-    /** User-defined name for the card (e.g., "John's card") */
+    /** Card name */
     customCardName?: string;
 
     /** Cardholder personal details */
@@ -45,14 +33,8 @@ type WorkspaceCompanyCardTableItemData = {
     /** Assigned card */
     assignedCard: Card | undefined;
 
-    /** Failed company card assignment */
-    hasFailedCardAssignment: boolean;
-
-    /** Errors */
-    errors?: Errors;
-
-    /** Pending action */
-    pendingAction?: PendingAction;
+    /** Pending company card assignment */
+    failedCompanyCardAssignment: FailedCompanyCardAssignment | undefined;
 
     /** Whether the card is deleted */
     isCardDeleted: boolean;
@@ -89,12 +71,8 @@ type WorkspaceCompanyCardTableItemProps = {
     /** Number of columns in the table */
     columnCount: number;
 
-    /**
-     * Callback when assigning a card.
-     * @param cardName - The masked card number displayed to users
-     * @param cardID - The identifier sent to backend (equals cardName for direct feeds)
-     */
-    onAssignCard: (cardName: string, cardID: string) => void;
+    /** On assign card callback */
+    onAssignCard: (cardID: string) => void;
 };
 
 function WorkspaceCompanyCardTableItem({
@@ -113,9 +91,22 @@ function WorkspaceCompanyCardTableItem({
     const theme = useTheme();
     const {translate} = useLocalize();
     const Expensicons = useMemoizedLazyExpensifyIcons(['ArrowRight']);
-    const {isOffline} = useNetwork();
 
-    const {cardName, encryptedCardNumber, customCardName, cardholder, assignedCard, isAssigned, isCardDeleted, hasFailedCardAssignment, errors, pendingAction} = item;
+    const {failedCompanyCardAssignment} = item;
+    let {cardName, customCardName, cardholder, assignedCard, isAssigned, isCardDeleted} = item;
+    let errors = assignedCard?.errors;
+    let pendingAction = assignedCard?.pendingAction;
+
+    if (failedCompanyCardAssignment) {
+        cardName = failedCompanyCardAssignment.cardNumber;
+        customCardName = failedCompanyCardAssignment.cardName;
+        cardholder = failedCompanyCardAssignment.cardholder;
+        assignedCard = undefined;
+        isAssigned = true;
+        isCardDeleted = false;
+        errors = failedCompanyCardAssignment?.errors;
+        pendingAction = failedCompanyCardAssignment?.pendingAction;
+    }
 
     const lastCardNumbers = isPlaidCardFeed ? lastFourNumbersFromCardName(cardName) : splitMaskedCardNumber(cardName)?.lastDigits;
     const cardholderLoginText = !shouldUseNarrowTableLayout && isAssigned ? Str.removeSMSDomain(cardholder?.login ?? '') : undefined;
@@ -125,15 +116,14 @@ function WorkspaceCompanyCardTableItem({
     const leftColumnSubtitle = shouldUseNarrowTableLayout ? narrowWidthCardName : cardholderLoginText;
 
     const resetFailedCompanyCardAssignment = () => {
-        if (!hasFailedCardAssignment) {
+        if (!failedCompanyCardAssignment) {
             return;
         }
 
-        resetFailedWorkspaceCompanyCardAssignment(domainOrWorkspaceAccountID, feed, encryptedCardNumber);
+        resetFailedWorkspaceCompanyCardAssignment(domainOrWorkspaceAccountID, feed, cardName);
     };
 
-    const assignCard = () => onAssignCard(cardName, encryptedCardNumber);
-    const isDeleting = !isOffline && pendingAction === CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE;
+    const assignCard = () => onAssignCard(cardName);
 
     return (
         <OfflineWithFeedback
@@ -141,127 +131,117 @@ function WorkspaceCompanyCardTableItem({
             errors={errors}
             pendingAction={pendingAction}
             onClose={resetFailedCompanyCardAssignment}
-            shouldHideOnDelete={false}
         >
-            {isDeleting ? (
-                <View style={[styles.mh5, styles.flexRow, styles.br3, styles.mb2, styles.highlightBG, styles.overflowHidden]}>
-                    <TableRowSkeleton
-                        fixedNumItems={1}
-                        useCompanyCardsLayout
-                    />
-                </View>
-            ) : (
-                <PressableWithFeedback
-                    role={isAssigned ? CONST.ROLE.BUTTON : CONST.ROLE.PRESENTATION}
-                    style={[styles.mh5, styles.flexRow, styles.br3, styles.mb2, styles.highlightBG, styles.overflowHidden]}
-                    accessibilityLabel="row"
-                    hoverStyle={isAssigned && styles.hoveredComponentBG}
-                    disabled={isCardDeleted}
-                    interactive={isAssigned}
-                    pressDimmingValue={isAssigned ? undefined : 1}
-                    onPress={() => {
-                        if (!assignedCard) {
-                            assignCard();
-                            return;
-                        }
-
-                        if (!assignedCard?.accountID || !assignedCard?.fundID) {
-                            return;
-                        }
-
-                        const feedName = getCompanyCardFeedWithDomainID(assignedCard?.bank as CompanyCardFeed, assignedCard.fundID);
-
-                        return Navigation.navigate(ROUTES.WORKSPACE_COMPANY_CARD_DETAILS.getRoute(policyID, feedName, assignedCard.cardID.toString()));
-                    }}
-                >
-                    {({hovered}) => (
-                        <View
-                            style={[
-                                styles.flex1,
-                                styles.flexRow,
-                                styles.alignItemsCenter,
-                                styles.p4,
-                                styles.gap3,
-                                styles.dFlex,
-                                // Use Grid on web when available (will override flex if supported)
-                                !shouldUseNarrowTableLayout && [styles.dGrid, {gridTemplateColumns: `repeat(${columnCount}, 1fr)`}],
-                            ]}
-                        >
-                            <View style={[styles.flex1, styles.flexRow, styles.alignItemsCenter, styles.gap3]}>
-                                {isAssigned ? (
-                                    <Avatar
-                                        source={
-                                            cardholder?.avatar ??
-                                            getDefaultAvatarURL({
-                                                accountID: cardholder?.accountID,
-                                            })
-                                        }
-                                        avatarID={cardholder?.accountID}
-                                        type={CONST.ICON_TYPE_AVATAR}
-                                        size={CONST.AVATAR_SIZE.DEFAULT}
-                                    />
-                                ) : (
-                                    CardFeedIcon
-                                )}
+            <PressableWithFeedback
+                role={isAssigned ? CONST.ROLE.BUTTON : CONST.ROLE.PRESENTATION}
+                style={[styles.mh5, styles.flexRow, styles.br3, styles.mb2, styles.highlightBG, styles.overflowHidden]}
+                accessibilityLabel="row"
+                hoverStyle={isAssigned && styles.hoveredComponentBG}
+                disabled={isCardDeleted}
+                interactive={isAssigned}
+                pressDimmingValue={isAssigned ? undefined : 1}
+                onPress={() => {
+                    if (!assignedCard) {
+                        assignCard();
+                        return;
+                    }
+
+                    if (!assignedCard?.accountID || !assignedCard?.fundID) {
+                        return;
+                    }
+
+                    const feedName = getCompanyCardFeedWithDomainID(assignedCard?.bank as CompanyCardFeed, assignedCard.fundID);
+
+                    return Navigation.navigate(ROUTES.WORKSPACE_COMPANY_CARD_DETAILS.getRoute(policyID, feedName, assignedCard.cardID.toString()));
+                }}
+            >
+                {({hovered}) => (
+                    <View
+                        style={[
+                            styles.flex1,
+                            styles.flexRow,
+                            styles.alignItemsCenter,
+                            styles.p4,
+                            styles.gap3,
+                            styles.dFlex,
+                            // Use Grid on web when available (will override flex if supported)
+                            !shouldUseNarrowTableLayout && [styles.dGrid, {gridTemplateColumns: `repeat(${columnCount}, 1fr)`}],
+                        ]}
+                    >
+                        <View style={[styles.flex1, styles.flexRow, styles.alignItemsCenter, styles.gap3]}>
+                            {isAssigned ? (
+                                <Avatar
+                                    source={
+                                        cardholder?.avatar ??
+                                        getDefaultAvatarURL({
+                                            accountID: cardholder?.accountID,
+                                        })
+                                    }
+                                    avatarID={cardholder?.accountID}
+                                    type={CONST.ICON_TYPE_AVATAR}
+                                    size={CONST.AVATAR_SIZE.DEFAULT}
+                                />
+                            ) : (
+                                CardFeedIcon
+                            )}
 
-                                <View style={[styles.flex1, styles.flexColumn, styles.justifyContentCenter, styles.alignItemsStretch]}>
+                            <View style={[styles.flex1, styles.flexColumn, styles.justifyContentCenter, styles.alignItemsStretch]}>
+                                <TextWithTooltip
+                                    text={leftColumnTitle}
+                                    style={[styles.optionDisplayName, styles.sidebarLinkTextBold, styles.pre, styles.justifyContentCenter, !isAssigned && styles.cursorText]}
+                                />
+                                {!!leftColumnSubtitle && (
                                     <TextWithTooltip
-                                        text={leftColumnTitle}
-                                        style={[styles.optionDisplayName, styles.sidebarLinkTextBold, styles.pre, styles.justifyContentCenter, !isAssigned && styles.cursorText]}
+                                        text={leftColumnSubtitle}
+                                        style={[styles.textLabelSupporting, styles.lh16, styles.pre, styles.mr3, !isAssigned && styles.cursorText]}
                                     />
-                                    {!!leftColumnSubtitle && (
-                                        <TextWithTooltip
-                                            text={leftColumnSubtitle}
-                                            style={[styles.textLabelSupporting, styles.lh16, styles.pre, styles.mr3, !isAssigned && styles.cursorText]}
-                                        />
-                                    )}
-                                </View>
+                                )}
                             </View>
+                        </View>
 
-                            {!shouldUseNarrowTableLayout && (
-                                <View style={[styles.flex1]}>
-                                    <Text
-                                        numberOfLines={1}
-                                        style={[styles.lh16, styles.optionDisplayName, styles.pre, !isAssigned && styles.cursorText]}
-                                    >
-                                        {cardName}
-                                    </Text>
+                        {!shouldUseNarrowTableLayout && (
+                            <View style={[styles.flex1]}>
+                                <Text
+                                    numberOfLines={1}
+                                    style={[styles.lh16, styles.optionDisplayName, styles.pre, !isAssigned && styles.cursorText]}
+                                >
+                                    {cardName}
+                                </Text>
+                            </View>
+                        )}
+
+                        <View style={[styles.flexRow, styles.flexRow, styles.alignItemsCenter, styles.justifyContentEnd]}>
+                            {isAssigned ? (
+                                <View style={[styles.flexRow, styles.ml2, styles.gap3, styles.mw100]}>
+                                    {!shouldUseNarrowTableLayout && (
+                                        <Text
+                                            numberOfLines={1}
+                                            style={[styles.optionDisplayName, styles.pre]}
+                                        >
+                                            {customCardName}
+                                        </Text>
+                                    )}
+                                    <Icon
+                                        src={Expensicons.ArrowRight}
+                                        fill={theme.icon}
+                                        additionalStyles={[styles.alignSelfCenter, !hovered && styles.opacitySemiTransparent]}
+                                        medium
+                                        isButtonIcon
+                                    />
                                 </View>
+                            ) : (
+                                <Button
+                                    success
+                                    small={shouldUseNarrowTableLayout}
+                                    text={shouldUseNarrowTableLayout ? translate('workspace.companyCards.assign') : translate('workspace.companyCards.assignCard')}
+                                    onPress={assignCard}
+                                    isDisabled={isAssigningCardDisabled}
+                                />
                             )}
-
-                            <View style={[styles.flexRow, styles.flexRow, styles.alignItemsCenter, styles.justifyContentEnd]}>
-                                {isAssigned ? (
-                                    <View style={[styles.flexRow, styles.ml2, styles.gap3, styles.mw100]}>
-                                        {!shouldUseNarrowTableLayout && (
-                                            <Text
-                                                numberOfLines={1}
-                                                style={[styles.optionDisplayName, styles.pre]}
-                                            >
-                                                {customCardName}
-                                            </Text>
-                                        )}
-                                        <Icon
-                                            src={Expensicons.ArrowRight}
-                                            fill={theme.icon}
-                                            additionalStyles={[styles.alignSelfCenter, !hovered && styles.opacitySemiTransparent]}
-                                            medium
-                                            isButtonIcon
-                                        />
-                                    </View>
-                                ) : (
-                                    <Button
-                                        success
-                                        small={shouldUseNarrowTableLayout}
-                                        text={shouldUseNarrowTableLayout ? translate('workspace.companyCards.assign') : translate('workspace.companyCards.assignCard')}
-                                        onPress={assignCard}
-                                        isDisabled={isAssigningCardDisabled}
-                                    />
-                                )}
-                            </View>
                         </View>
-                    )}
-                </PressableWithFeedback>
-            )}
+                    </View>
+                )}
+            </PressableWithFeedback>
         </OfflineWithFeedback>
     );
 }
diff --git a/src/pages/workspace/companyCards/WorkspaceCompanyCardsTable/index.tsx b/src/pages/workspace/companyCards/WorkspaceCompanyCardsTable/index.tsx
index f5ad1194c7cd..7a6a488ec59a 100644
--- a/src/pages/workspace/companyCards/WorkspaceCompanyCardsTable/index.tsx
+++ b/src/pages/workspace/companyCards/WorkspaceCompanyCardsTable/index.tsx
@@ -6,14 +6,13 @@ import ScrollView from '@components/ScrollView';
 import TableRowSkeleton from '@components/Skeletons/TableRowSkeleton';
 import Table from '@components/Table';
 import type {ActiveSorting, CompareItemsCallback, FilterConfig, IsItemInFilterCallback, IsItemInSearchCallback, TableColumn, TableHandle} from '@components/Table';
-import useBottomSafeSafeAreaPaddingStyle from '@hooks/useBottomSafeSafeAreaPaddingStyle';
 import useCompanyCards from '@hooks/useCompanyCards';
 import useLocalize from '@hooks/useLocalize';
 import useNetwork from '@hooks/useNetwork';
 import useOnyx from '@hooks/useOnyx';
 import useResponsiveLayout from '@hooks/useResponsiveLayout';
 import useThemeStyles from '@hooks/useThemeStyles';
-import {getDefaultCardName, getDomainOrWorkspaceAccountID} from '@libs/CardUtils';
+import {getDomainOrWorkspaceAccountID, isMaskedCardNumberEqual} from '@libs/CardUtils';
 import tokenizedSearch from '@libs/tokenizedSearch';
 import WorkspaceCompanyCardPageEmptyState from '@pages/workspace/companyCards/WorkspaceCompanyCardPageEmptyState';
 import WorkspaceCompanyCardsFeedAddedEmptyPage from '@pages/workspace/companyCards/WorkspaceCompanyCardsFeedAddedEmptyPage';
@@ -34,7 +33,7 @@ type WorkspaceCompanyCardsTableProps = {
     policy: Policy | undefined;
 
     /** On assign card callback */
-    onAssignCard: (cardID: string, encryptedCardNumber: string) => void;
+    onAssignCard: (cardID: string) => void;
 
     /** Whether to disable assign card button */
     isAssigningCardDisabled: boolean;
@@ -59,13 +58,12 @@ function WorkspaceCompanyCardsTable({policy, onAssignCard, isAssigningCardDisabl
 
     const workspaceAccountID = policy?.workspaceAccountID ?? CONST.DEFAULT_NUMBER_ID;
     const domainOrWorkspaceAccountID = getDomainOrWorkspaceAccountID(workspaceAccountID, selectedFeed);
-
     const [countryByIp] = useOnyx(ONYXKEYS.COUNTRY, {canBeMissing: false});
     const [personalDetails, personalDetailsMetadata] = useOnyx(ONYXKEYS.PERSONAL_DETAILS_LIST, {canBeMissing: false});
     const [customCardNames] = useOnyx(ONYXKEYS.NVP_EXPENSIFY_COMPANY_CARDS_CUSTOM_NAMES, {canBeMissing: true});
+    const [failedCompanyCardAssignments] = useOnyx(`${ONYXKEYS.COLLECTION.FAILED_COMPANY_CARDS_ASSIGNMENTS}${domainOrWorkspaceAccountID}_${feedName ?? ''}`, {canBeMissing: true});
 
     const hasNoAssignedCard = Object.keys(assignedCards ?? {}).length === 0;
-    const [failedCompanyCardAssignments] = useOnyx(`${ONYXKEYS.COLLECTION.FAILED_COMPANY_CARDS_ASSIGNMENTS}${domainOrWorkspaceAccountID}_${feedName ?? ''}`, {canBeMissing: true});
     const isInitiallyLoadingFeeds = isLoadingOnyxValue(allCardFeedsMetadata);
 
     const isNoFeed = !selectedFeed && !isInitiallyLoadingFeeds;
@@ -108,37 +106,25 @@ function WorkspaceCompanyCardsTable({policy, onAssignCard, isAssigningCardDisabl
     const cardsData: WorkspaceCompanyCardTableItemData[] = isLoadingCards
         ? []
         : (cardNames?.map((cardName) => {
-              // For direct feeds cardID equals cardName, for commercial feeds it's looked up from cardList
-              const cardID = isDirectCardFeed ? cardName : (cardList?.[cardName] ?? '');
-              const failedCompanyCardAssignment = failedCompanyCardAssignments?.[cardID];
-
-              if (failedCompanyCardAssignment) {
-                  return failedCompanyCardAssignment;
-              }
-              const assignedCard = Object.values(assignedCards ?? {}).find((card: Card) => card.encryptedCardNumber === cardID || card.cardName === cardName);
+              const assignedCardPredicate = (card: Card) => (isDirectCardFeed ? card.cardName === cardName : isMaskedCardNumberEqual(card.cardName, cardName));
+
+              const assignedCard = Object.values(assignedCards ?? {}).find(assignedCardPredicate);
+
+              const failedCompanyCardAssignment = failedCompanyCardAssignments?.[cardName];
+
               const cardholder = assignedCard?.accountID ? personalDetails?.[assignedCard.accountID] : undefined;
 
-              return {
-                  cardName,
-                  encryptedCardNumber: cardID,
-                  customCardName: assignedCard?.cardID && customCardNames?.[assignedCard.cardID] ? customCardNames?.[assignedCard.cardID] : getDefaultCardName(cardholder?.displayName ?? ''),
-                  isCardDeleted: assignedCard?.pendingAction === CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE,
-                  isAssigned: !!assignedCard,
-                  hasFailedCardAssignment: false,
-                  assignedCard,
-                  cardholder,
-                  errors: assignedCard?.errors,
-                  pendingAction: assignedCard?.pendingAction,
-              };
+              const customCardName = assignedCard?.cardID ? customCardNames?.[assignedCard.cardID] : undefined;
+
+              const isCardDeleted = assignedCard?.pendingAction === CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE;
+
+              const isAssigned = !!assignedCard;
+
+              return {cardName, customCardName, isCardDeleted, isAssigned, assignedCard, cardholder, failedCompanyCardAssignment};
           }) ?? []);
 
     const keyExtractor = (item: WorkspaceCompanyCardTableItemData, index: number) => `${item.cardName}_${index}`;
 
-    const tableBodyContentContainerStyle = useBottomSafeSafeAreaPaddingStyle({
-        addBottomSafeAreaPadding: true,
-        addOfflineIndicatorBottomSafeAreaPadding: true,
-    });
-
     const compareItems: CompareItemsCallback<WorkspaceCompanyCardTableItemData, CompanyCardsTableColumnKey> = (a, b, activeSorting) => {
         const orderMultiplier = activeSorting.order === 'asc' ? 1 : -1;
 
@@ -227,7 +213,6 @@ function WorkspaceCompanyCardsTable({policy, onAssignCard, isAssigningCardDisabl
                 additionalStyles: styles.cardIcon,
             }}
             selectedFeed={feedName}
-            useSkeletonLoader
         />
     );
 
@@ -322,7 +307,7 @@ function WorkspaceCompanyCardsTable({policy, onAssignCard, isAssigningCardDisabl
             {showCards && (
                 <>
                     {!shouldUseNarrowTableLayout && !isLoadingFeed && <Table.Header />}
-                    <Table.Body contentContainerStyle={tableBodyContentContainerStyle} />
+                    <Table.Body />
                 </>
             )}
         </Table>
diff --git a/src/pages/workspace/companyCards/addNew/AddNewCardPage.tsx b/src/pages/workspace/companyCards/addNew/AddNewCardPage.tsx
index 409e1836cfbe..ab2f0ac7cad0 100644
--- a/src/pages/workspace/companyCards/addNew/AddNewCardPage.tsx
+++ b/src/pages/workspace/companyCards/addNew/AddNewCardPage.tsx
@@ -12,7 +12,6 @@ import useThemeStyles from '@hooks/useThemeStyles';
 import useWorkspaceAccountID from '@hooks/useWorkspaceAccountID';
 import {navigateToConciergeChat} from '@libs/actions/Report';
 import Navigation from '@navigation/Navigation';
-import AccessOrNotFoundWrapper from '@pages/workspace/AccessOrNotFoundWrapper';
 import BankConnection from '@pages/workspace/companyCards/BankConnection';
 import withPolicyAndFullscreenLoading from '@pages/workspace/withPolicyAndFullscreenLoading';
 import type {WithPolicyAndFullscreenLoadingProps} from '@pages/workspace/withPolicyAndFullscreenLoading';
@@ -134,11 +133,7 @@ function AddNewCardPage({policy}: WithPolicyAndFullscreenLoadingProps) {
     }
 
     return (
-        <AccessOrNotFoundWrapper
-            policyID={policyID}
-            accessVariants={[CONST.POLICY.ACCESS_VARIANTS.ADMIN, CONST.POLICY.ACCESS_VARIANTS.PAID]}
-            featureName={CONST.POLICY.MORE_FEATURES.ARE_COMPANY_CARDS_ENABLED}
-        >
+        <>
             <View style={styles.flex1}>{CurrentStep}</View>
             <ConfirmModal
                 isVisible={isModalVisible}
@@ -153,7 +148,7 @@ function AddNewCardPage({policy}: WithPolicyAndFullscreenLoadingProps) {
                     navigateToConciergeChat();
                 }}
             />
-        </AccessOrNotFoundWrapper>
+        </>
     );
 }
 
diff --git a/src/pages/workspace/companyCards/addNew/CardInstructionsStep.tsx b/src/pages/workspace/companyCards/addNew/CardInstructionsStep.tsx
index f6c4f2b5cc29..b135b9f1acc5 100644
--- a/src/pages/workspace/companyCards/addNew/CardInstructionsStep.tsx
+++ b/src/pages/workspace/companyCards/addNew/CardInstructionsStep.tsx
@@ -94,7 +94,9 @@ function CardInstructionsStep({policyID}: CardInstructionsStepProps) {
                 contentContainerStyle={styles.flexGrow1}
                 addBottomSafeAreaPadding
             >
-                <Text style={[styles.textHeadlineLineHeightXXL, styles.ph5, styles.mv3]}>{translate('workspace.companyCards.addNewCard.enableFeed.title', getBankName(feedProvider))}</Text>
+                <Text style={[styles.textHeadlineLineHeightXXL, styles.ph5, styles.mv3]}>
+                    {translate('workspace.companyCards.addNewCard.enableFeed.title', {provider: getBankName(feedProvider)})}
+                </Text>
                 <Text style={[styles.ph5, styles.mb3]}>{translate(translationKey)}</Text>
                 <View style={[styles.ph5]}>
                     <RenderHTML html={Parser.replace(feedProvider ? translate(`workspace.companyCards.addNewCard.enableFeed.${feedProvider}`) : '')} />
diff --git a/src/pages/workspace/companyCards/addNew/DetailsStep.tsx b/src/pages/workspace/companyCards/addNew/DetailsStep.tsx
index 255f6830f0e8..f226911f8c7c 100644
--- a/src/pages/workspace/companyCards/addNew/DetailsStep.tsx
+++ b/src/pages/workspace/companyCards/addNew/DetailsStep.tsx
@@ -1,4 +1,4 @@
-import React from 'react';
+import React, {useCallback} from 'react';
 import {View} from 'react-native';
 import FormProvider from '@components/Form/FormProvider';
 import InputWrapper from '@components/Form/InputWrapper';
@@ -36,18 +36,21 @@ function DetailsStep() {
     const bank = addNewCard?.data?.selectedBank;
     const isOtherBankSelected = bank === CONST.COMPANY_CARDS.BANKS.OTHER;
 
-    const submit = (values: FormOnyxValues<typeof ONYXKEYS.FORMS.ADD_NEW_CARD_FEED_FORM>) => {
-        if (!addNewCard?.data) {
-            return;
-        }
+    const submit = useCallback(
+        (values: FormOnyxValues<typeof ONYXKEYS.FORMS.ADD_NEW_CARD_FEED_FORM>) => {
+            if (!addNewCard?.data) {
+                return;
+            }
 
-        const feedDetails = {
-            ...values,
-            bankName: addNewCard.data.bankName ?? 'Amex',
-        };
+            const feedDetails = {
+                ...values,
+                bankName: addNewCard.data.bankName ?? 'Amex',
+            };
 
-        setAddNewCompanyCardStepAndData({step: CONST.COMPANY_CARDS.STEP.SELECT_STATEMENT_CLOSE_DATE, data: {feedDetails}});
-    };
+            setAddNewCompanyCardStepAndData({step: CONST.COMPANY_CARDS.STEP.SELECT_STATEMENT_CLOSE_DATE, data: {feedDetails}});
+        },
+        [addNewCard?.data],
+    );
 
     const handleBackButtonPress = () => {
         if (isOtherBankSelected) {
@@ -57,46 +60,53 @@ function DetailsStep() {
         setAddNewCompanyCardStepAndData({step: CONST.COMPANY_CARDS.STEP.CARD_INSTRUCTIONS});
     };
 
-    const validate = (values: FormOnyxValues<typeof ONYXKEYS.FORMS.ADD_NEW_CARD_FEED_FORM>): FormInputErrors<typeof ONYXKEYS.FORMS.ADD_NEW_CARD_FEED_FORM> => {
-        const errors = getFieldRequiredErrors(values, [INPUT_IDS.BANK_ID]);
+    const validate = useCallback(
+        (values: FormOnyxValues<typeof ONYXKEYS.FORMS.ADD_NEW_CARD_FEED_FORM>): FormInputErrors<typeof ONYXKEYS.FORMS.ADD_NEW_CARD_FEED_FORM> => {
+            const errors = getFieldRequiredErrors(values, [INPUT_IDS.BANK_ID]);
 
-        switch (feedProvider) {
-            case CONST.COMPANY_CARD.FEED_BANK_NAME.VISA:
-                if (!values[INPUT_IDS.BANK_ID]) {
-                    errors[INPUT_IDS.BANK_ID] = translate('common.error.fieldRequired');
-                } else if (values[INPUT_IDS.BANK_ID].length > CONST.STANDARD_LENGTH_LIMIT) {
-                    errors[INPUT_IDS.BANK_ID] = translate('common.error.characterLimitExceedCounter', values[INPUT_IDS.BANK_ID].length, CONST.STANDARD_LENGTH_LIMIT);
-                }
-                if (!values[INPUT_IDS.PROCESSOR_ID]) {
-                    errors[INPUT_IDS.PROCESSOR_ID] = translate('common.error.fieldRequired');
-                } else if (values[INPUT_IDS.PROCESSOR_ID].length > CONST.STANDARD_LENGTH_LIMIT) {
-                    errors[INPUT_IDS.PROCESSOR_ID] = translate('common.error.characterLimitExceedCounter', values[INPUT_IDS.PROCESSOR_ID].length, CONST.STANDARD_LENGTH_LIMIT);
-                }
-                if (!values[INPUT_IDS.COMPANY_ID]) {
-                    errors[INPUT_IDS.COMPANY_ID] = translate('common.error.fieldRequired');
-                } else if (values[INPUT_IDS.COMPANY_ID].length > CONST.STANDARD_LENGTH_LIMIT) {
-                    errors[INPUT_IDS.COMPANY_ID] = translate('common.error.characterLimitExceedCounter', values[INPUT_IDS.COMPANY_ID].length, CONST.STANDARD_LENGTH_LIMIT);
-                }
-                break;
-            case CONST.COMPANY_CARD.FEED_BANK_NAME.MASTER_CARD:
-                if (!values[INPUT_IDS.DISTRIBUTION_ID]) {
-                    errors[INPUT_IDS.DISTRIBUTION_ID] = translate('common.error.fieldRequired');
-                } else if (values[INPUT_IDS.DISTRIBUTION_ID].length > CONST.STANDARD_LENGTH_LIMIT) {
-                    errors[INPUT_IDS.DISTRIBUTION_ID] = translate('common.error.characterLimitExceedCounter', values[INPUT_IDS.DISTRIBUTION_ID].length, CONST.STANDARD_LENGTH_LIMIT);
-                }
-                break;
-            case CONST.COMPANY_CARD.FEED_BANK_NAME.AMEX:
-                if (!values[INPUT_IDS.DELIVERY_FILE_NAME]) {
-                    errors[INPUT_IDS.DELIVERY_FILE_NAME] = translate('common.error.fieldRequired');
-                } else if (values[INPUT_IDS.DELIVERY_FILE_NAME].length > CONST.STANDARD_LENGTH_LIMIT) {
-                    errors[INPUT_IDS.DELIVERY_FILE_NAME] = translate('common.error.characterLimitExceedCounter', values[INPUT_IDS.DELIVERY_FILE_NAME].length, CONST.STANDARD_LENGTH_LIMIT);
-                }
-                break;
-            default:
-                break;
-        }
-        return errors;
-    };
+            switch (feedProvider) {
+                case CONST.COMPANY_CARD.FEED_BANK_NAME.VISA:
+                    if (!values[INPUT_IDS.BANK_ID]) {
+                        errors[INPUT_IDS.BANK_ID] = translate('common.error.fieldRequired');
+                    } else if (values[INPUT_IDS.BANK_ID].length > CONST.STANDARD_LENGTH_LIMIT) {
+                        errors[INPUT_IDS.BANK_ID] = translate('common.error.characterLimitExceedCounter', values[INPUT_IDS.BANK_ID].length, CONST.STANDARD_LENGTH_LIMIT);
+                    }
+                    if (!values[INPUT_IDS.PROCESSOR_ID]) {
+                        errors[INPUT_IDS.PROCESSOR_ID] = translate('common.error.fieldRequired');
+                    } else if (values[INPUT_IDS.PROCESSOR_ID].length > CONST.STANDARD_LENGTH_LIMIT) {
+                        errors[INPUT_IDS.PROCESSOR_ID] = translate('common.error.characterLimitExceedCounter', values[INPUT_IDS.PROCESSOR_ID].length, CONST.STANDARD_LENGTH_LIMIT);
+                    }
+                    if (!values[INPUT_IDS.COMPANY_ID]) {
+                        errors[INPUT_IDS.COMPANY_ID] = translate('common.error.fieldRequired');
+                    } else if (values[INPUT_IDS.COMPANY_ID].length > CONST.STANDARD_LENGTH_LIMIT) {
+                        errors[INPUT_IDS.COMPANY_ID] = translate('common.error.characterLimitExceedCounter', values[INPUT_IDS.COMPANY_ID].length, CONST.STANDARD_LENGTH_LIMIT);
+                    }
+                    break;
+                case CONST.COMPANY_CARD.FEED_BANK_NAME.MASTER_CARD:
+                    if (!values[INPUT_IDS.DISTRIBUTION_ID]) {
+                        errors[INPUT_IDS.DISTRIBUTION_ID] = translate('common.error.fieldRequired');
+                    } else if (values[INPUT_IDS.DISTRIBUTION_ID].length > CONST.STANDARD_LENGTH_LIMIT) {
+                        errors[INPUT_IDS.DISTRIBUTION_ID] = translate('common.error.characterLimitExceedCounter', values[INPUT_IDS.DISTRIBUTION_ID].length, CONST.STANDARD_LENGTH_LIMIT);
+                    }
+                    break;
+                case CONST.COMPANY_CARD.FEED_BANK_NAME.AMEX:
+                    if (!values[INPUT_IDS.DELIVERY_FILE_NAME]) {
+                        errors[INPUT_IDS.DELIVERY_FILE_NAME] = translate('common.error.fieldRequired');
+                    } else if (values[INPUT_IDS.DELIVERY_FILE_NAME].length > CONST.STANDARD_LENGTH_LIMIT) {
+                        errors[INPUT_IDS.DELIVERY_FILE_NAME] = translate(
+                            'common.error.characterLimitExceedCounter',
+                            values[INPUT_IDS.DELIVERY_FILE_NAME].length,
+                            CONST.STANDARD_LENGTH_LIMIT,
+                        );
+                    }
+                    break;
+                default:
+                    break;
+            }
+            return errors;
+        },
+        [feedProvider, translate],
+    );
 
     const renderInputs = () => {
         switch (feedProvider) {
diff --git a/src/pages/workspace/companyCards/addNew/SelectCountryStep.tsx b/src/pages/workspace/companyCards/addNew/SelectCountryStep.tsx
index 8a64ea2f4397..8a081da6042f 100644
--- a/src/pages/workspace/companyCards/addNew/SelectCountryStep.tsx
+++ b/src/pages/workspace/companyCards/addNew/SelectCountryStep.tsx
@@ -7,7 +7,6 @@ import ScreenWrapper from '@components/ScreenWrapper';
 import SelectionList from '@components/SelectionList';
 import RadioListItem from '@components/SelectionList/ListItem/RadioListItem';
 import Text from '@components/Text';
-import useCurrencyList from '@hooks/useCurrencyList';
 import useDebouncedState from '@hooks/useDebouncedState';
 import useLocalize from '@hooks/useLocalize';
 import useOnyx from '@hooks/useOnyx';
@@ -25,6 +24,8 @@ import CONST from '@src/CONST';
 import type {TranslationPaths} from '@src/languages/types';
 import ONYXKEYS from '@src/ONYXKEYS';
 import type SCREENS from '@src/SCREENS';
+import type {CurrencyList} from '@src/types/onyx';
+import {getEmptyObject} from '@src/types/utils/EmptyObject';
 
 type CountryStepProps = {
     policyID?: string;
@@ -35,7 +36,7 @@ function SelectCountryStep({policyID}: CountryStepProps) {
     const route = useRoute<PlatformStackRouteProp<WorkspaceSplitNavigatorParamList, typeof SCREENS.WORKSPACE.COMPANY_CARDS_ADD_NEW>>();
     const styles = useThemeStyles();
     const policy = usePolicy(policyID);
-    const {currencyList} = useCurrencyList();
+    const [currencyList = getEmptyObject<CurrencyList>()] = useOnyx(ONYXKEYS.CURRENCY_LIST, {canBeMissing: true});
     const [countryByIp] = useOnyx(ONYXKEYS.COUNTRY, {canBeMissing: false});
     const [addNewCard] = useOnyx(ONYXKEYS.ADD_NEW_COMPANY_CARD, {canBeMissing: true});
 
diff --git a/src/pages/workspace/companyCards/addNew/StatementCloseDateStep.tsx b/src/pages/workspace/companyCards/addNew/StatementCloseDateStep.tsx
index a2eff8451566..b2a73930aa6e 100644
--- a/src/pages/workspace/companyCards/addNew/StatementCloseDateStep.tsx
+++ b/src/pages/workspace/companyCards/addNew/StatementCloseDateStep.tsx
@@ -1,4 +1,4 @@
-import React from 'react';
+import React, {useCallback} from 'react';
 import useOnyx from 'react-native-onyx/dist/useOnyx';
 import useCardFeeds from '@hooks/useCardFeeds';
 import useLocalize from '@hooks/useLocalize';
@@ -26,34 +26,37 @@ function StatementCloseDateStep({policyID, workspaceAccountID}: StatementCloseDa
 
     const isPlaid = !!addNewCard?.data?.publicToken;
 
-    const submit = (statementPeriodEnd: StatementPeriodEnd | undefined, statementPeriodEndDay: StatementPeriodEndDay | undefined) => {
-        if (isPlaid) {
-            setAddNewCompanyCardStepAndData({
-                step: CONST.COMPANY_CARDS.STEP.BANK_CONNECTION,
-                // Fallback to null to clear old value (if any) because `undefined` is a no-op in Onyx.merge
-                data: {statementPeriodEnd: statementPeriodEnd ?? null, statementPeriodEndDay: statementPeriodEndDay ?? null},
-            });
-            return;
-        }
+    const submit = useCallback(
+        (statementPeriodEnd: StatementPeriodEnd | undefined, statementPeriodEndDay: StatementPeriodEndDay | undefined) => {
+            if (isPlaid) {
+                setAddNewCompanyCardStepAndData({
+                    step: CONST.COMPANY_CARDS.STEP.BANK_CONNECTION,
+                    // Fallback to null to clear old value (if any) because `undefined` is a no-op in Onyx.merge
+                    data: {statementPeriodEnd: statementPeriodEnd ?? null, statementPeriodEndDay: statementPeriodEndDay ?? null},
+                });
+                return;
+            }
 
-        if (addNewCard?.data.feedDetails) {
-            addNewCompanyCardsFeed(
-                policyID,
-                workspaceAccountID,
-                addNewCard.data.feedType,
-                addNewCard.data.feedDetails,
-                cardFeeds,
-                statementPeriodEnd,
-                statementPeriodEndDay,
-                lastSelectedFeed,
-            );
-            Navigation.goBack(ROUTES.WORKSPACE_COMPANY_CARDS.getRoute(policyID));
-        }
-    };
+            if (addNewCard?.data.feedDetails) {
+                addNewCompanyCardsFeed(
+                    policyID,
+                    workspaceAccountID,
+                    addNewCard.data.feedType,
+                    addNewCard.data.feedDetails,
+                    cardFeeds,
+                    statementPeriodEnd,
+                    statementPeriodEndDay,
+                    lastSelectedFeed,
+                );
+                Navigation.goBack(ROUTES.WORKSPACE_COMPANY_CARDS.getRoute(policyID));
+            }
+        },
+        [policyID, workspaceAccountID, addNewCard?.data.feedType, addNewCard?.data.feedDetails, cardFeeds, lastSelectedFeed, isPlaid],
+    );
 
-    const goBack = () => {
+    const goBack = useCallback(() => {
         setAddNewCompanyCardStepAndData({step: isPlaid ? CONST.COMPANY_CARDS.STEP.PLAID_CONNECTION : CONST.COMPANY_CARDS.STEP.CARD_DETAILS});
-    };
+    }, [isPlaid]);
 
     return (
         <WorkspaceCompanyCardStatementCloseDateSelectionList
diff --git a/src/pages/workspace/companyCards/assignCard/AssigneeStep.tsx b/src/pages/workspace/companyCards/assignCard/AssigneeStep.tsx
index 4f8620f3c48c..29f08344f134 100644
--- a/src/pages/workspace/companyCards/assignCard/AssigneeStep.tsx
+++ b/src/pages/workspace/companyCards/assignCard/AssigneeStep.tsx
@@ -1,6 +1,6 @@
 import {format} from 'date-fns';
 import {Str} from 'expensify-common';
-import React, {useEffect, useState} from 'react';
+import React, {useEffect, useMemo, useState} from 'react';
 import {Keyboard} from 'react-native';
 import InteractiveStepWrapper from '@components/InteractiveStepWrapper';
 import SelectionList from '@components/SelectionList';
@@ -48,11 +48,16 @@ function AssigneeStep({route}: AssigneeStepProps) {
     const [didScreenTransitionEnd, setDidScreenTransitionEnd] = useState(false);
     const [isSearchingForReports] = useOnyx(ONYXKEYS.IS_SEARCHING_FOR_REPORTS, {initWithStoredValues: false, canBeMissing: true});
 
-    const ineligibleInvites = getIneligibleInvitees(policy?.employeeList);
-    const excludedUsers: Record<string, boolean> = {};
-    for (const login of ineligibleInvites) {
-        excludedUsers[login] = true;
-    }
+    const excludedUsers = useMemo(() => {
+        const ineligibleInvites = getIneligibleInvitees(policy?.employeeList);
+        return ineligibleInvites.reduce(
+            (acc, login) => {
+                acc[login] = true;
+                return acc;
+            },
+            {} as Record<string, boolean>,
+        );
+    }, [policy?.employeeList]);
 
     const {searchTerm, setSearchTerm, debouncedSearchTerm, availableOptions, selectedOptionsForDisplay, areOptionsInitialized} = useSearchSelector({
         selectionMode: CONST.SEARCH_SELECTOR.SELECTION_MODE_MULTI,
@@ -68,10 +73,9 @@ function AssigneeStep({route}: AssigneeStepProps) {
     const submit = (assignee: ListItem) => {
         const personalDetail = getPersonalDetailByEmail(assignee?.login ?? '');
         const memberName = personalDetail?.firstName ? personalDetail.firstName : Str.removeSMSDomain(personalDetail?.login ?? '');
-        const defaultCardName = getDefaultCardName(memberName);
         const cardToAssign: Partial<AssignCardData> = {
             email: assignee?.login ?? '',
-            ...(!assignCard?.cardToAssign?.customCardName ? {customCardName: defaultCardName} : {}),
+            ...(!assignCard?.cardToAssign?.cardName ? {cardName: getDefaultCardName(memberName)} : {}),
         };
 
         Keyboard.dismiss();
@@ -81,8 +85,7 @@ function AssigneeStep({route}: AssigneeStepProps) {
         if (assignee?.login === assignCard?.cardToAssign?.email) {
             if (assignCard?.cardToAssign?.encryptedCardNumber) {
                 cardToAssign.encryptedCardNumber = assignCard.cardToAssign.encryptedCardNumber;
-                cardToAssign.cardName = assignCard.cardToAssign.cardName;
-                cardToAssign.customCardName = assignCard.cardToAssign.customCardName ?? defaultCardName;
+                cardToAssign.cardNumber = assignCard.cardToAssign.cardNumber;
                 cardToAssign.startDate = !isEditing
                     ? format(new Date(), CONST.DATE.FNS_FORMAT_STRING)
                     : (assignCard?.cardToAssign?.startDate ?? format(new Date(), CONST.DATE.FNS_FORMAT_STRING));
@@ -118,8 +121,7 @@ function AssigneeStep({route}: AssigneeStepProps) {
 
         if (assignCard?.cardToAssign?.encryptedCardNumber) {
             cardToAssign.encryptedCardNumber = assignCard.cardToAssign.encryptedCardNumber;
-            cardToAssign.cardName = assignCard.cardToAssign.cardName;
-            cardToAssign.customCardName = assignCard.cardToAssign.customCardName ?? defaultCardName;
+            cardToAssign.cardNumber = assignCard.cardToAssign.cardNumber;
             cardToAssign.startDate = !isEditing
                 ? format(new Date(), CONST.DATE.FNS_FORMAT_STRING)
                 : (assignCard?.cardToAssign?.startDate ?? format(new Date(), CONST.DATE.FNS_FORMAT_STRING));
@@ -149,15 +151,19 @@ function AssigneeStep({route}: AssigneeStepProps) {
         Navigation.goBack();
     };
 
-    const membersDetails: ListItem[] = [];
-    if (policy?.employeeList) {
+    const membersDetails = useMemo(() => {
+        let membersList: ListItem[] = [];
+        if (!policy?.employeeList) {
+            return membersList;
+        }
+
         for (const [email, policyEmployee] of Object.entries(policy.employeeList ?? {})) {
             if (isDeletedPolicyEmployee(policyEmployee, isOffline)) {
                 continue;
             }
 
             const personalDetail = getPersonalDetailByEmail(email);
-            membersDetails.push({
+            membersList.push({
                 keyForList: email,
                 text: personalDetail?.displayName,
                 alternateText: email,
@@ -175,11 +181,20 @@ function AssigneeStep({route}: AssigneeStepProps) {
             });
         }
 
-        sortAlphabetically(membersDetails, 'text', localeCompare);
-    }
+        membersList = sortAlphabetically(membersList, 'text', localeCompare);
+
+        return membersList;
+    }, [isOffline, policy?.employeeList, assignCard?.cardToAssign?.email, formatPhoneNumber, localeCompare, icons.FallbackAvatar]);
+
+    const assignees = useMemo(() => {
+        if (!debouncedSearchTerm) {
+            return membersDetails;
+        }
+
+        if (!areOptionsInitialized) {
+            return [];
+        }
 
-    let assignees = membersDetails;
-    if (debouncedSearchTerm && areOptionsInitialized) {
         const searchValueForOptions = getSearchValueForPhoneOrEmail(debouncedSearchTerm, countryCode).toLowerCase();
         const filteredOptions = tokenizedSearch(membersDetails, searchValueForOptions, (option) => [option.text ?? '', option.alternateText ?? '']);
 
@@ -191,30 +206,42 @@ function AssigneeStep({route}: AssigneeStepProps) {
             ...(availableOptions.userToInvite ? [availableOptions.userToInvite] : []),
         ];
 
-        assignees = options.map((option) => ({
+        return options.map((option) => ({
             ...option,
             keyForList: option.keyForList ?? option.login ?? '',
         }));
-    } else if (debouncedSearchTerm) {
-        assignees = [];
-    }
+    }, [
+        areOptionsInitialized,
+        availableOptions.personalDetails,
+        availableOptions.recentReports,
+        availableOptions.userToInvite,
+        countryCode,
+        debouncedSearchTerm,
+        membersDetails,
+        selectedOptionsForDisplay,
+    ]);
 
     useEffect(() => {
         searchInServer(debouncedSearchTerm);
     }, [debouncedSearchTerm]);
 
-    const searchValue = debouncedSearchTerm.trim().toLowerCase();
-    const headerMessage =
-        !availableOptions.userToInvite && CONST.EXPENSIFY_EMAILS_OBJECT[searchValue]
-            ? translate('messages.errorMessageInvalidEmail')
-            : getHeaderMessage(assignees.length > 0, !!availableOptions.userToInvite, searchValue, countryCode, false);
-
-    const textInputOptions = {
-        label: translate('selectionList.nameEmailOrPhoneNumber'),
-        value: searchTerm,
-        onChangeText: setSearchTerm,
-        headerMessage,
-    };
+    const headerMessage = useMemo(() => {
+        const searchValue = debouncedSearchTerm.trim().toLowerCase();
+        if (!availableOptions.userToInvite && CONST.EXPENSIFY_EMAILS_OBJECT[searchValue]) {
+            return translate('messages.errorMessageInvalidEmail');
+        }
+        return getHeaderMessage(assignees.length > 0, !!availableOptions.userToInvite, searchValue, countryCode, false);
+    }, [debouncedSearchTerm, availableOptions.userToInvite, assignees?.length, countryCode, translate]);
+
+    const textInputOptions = useMemo(
+        () => ({
+            label: translate('selectionList.nameEmailOrPhoneNumber'),
+            value: searchTerm,
+            onChangeText: setSearchTerm,
+            headerMessage,
+        }),
+        [headerMessage, searchTerm, setSearchTerm, translate],
+    );
 
     return (
         <InteractiveStepWrapper
diff --git a/src/pages/workspace/companyCards/assignCard/CardNameStep.tsx b/src/pages/workspace/companyCards/assignCard/CardNameStep.tsx
index 0c6c6fe3f946..5dd02d513167 100644
--- a/src/pages/workspace/companyCards/assignCard/CardNameStep.tsx
+++ b/src/pages/workspace/companyCards/assignCard/CardNameStep.tsx
@@ -37,7 +37,7 @@ function CardNameStep({route}: CardNameStepProps) {
     const submit = (values: FormOnyxValues<typeof ONYXKEYS.FORMS.EDIT_WORKSPACE_COMPANY_CARD_NAME_FORM>) => {
         setAssignCardStepAndData({
             cardToAssign: {
-                customCardName: values.name,
+                cardName: values.name,
             },
             isEditing: false,
         });
@@ -74,7 +74,7 @@ function CardNameStep({route}: CardNameStepProps) {
                 />
                 <Text style={[styles.mh5, styles.mt3, styles.mb5]}>{translate('workspace.moreFeatures.companyCards.giveItNameInstruction')}</Text>
                 <FormProvider
-                    key={cardToAssign?.customCardName}
+                    key={cardToAssign?.cardName}
                     formID={ONYXKEYS.FORMS.EDIT_WORKSPACE_COMPANY_CARD_NAME_FORM}
                     submitButtonText={translate('common.save')}
                     onSubmit={submit}
@@ -90,7 +90,7 @@ function CardNameStep({route}: CardNameStepProps) {
                         label={translate('workspace.moreFeatures.companyCards.cardName')}
                         aria-label={translate('workspace.moreFeatures.companyCards.cardName')}
                         role={CONST.ROLE.PRESENTATION}
-                        defaultValue={cardToAssign?.customCardName}
+                        defaultValue={cardToAssign?.cardName}
                         ref={inputCallbackRef}
                     />
                 </FormProvider>
diff --git a/src/pages/workspace/companyCards/assignCard/CardSelectionStep.tsx b/src/pages/workspace/companyCards/assignCard/CardSelectionStep.tsx
index 8b7b66c0a4dd..829ba510b324 100644
--- a/src/pages/workspace/companyCards/assignCard/CardSelectionStep.tsx
+++ b/src/pages/workspace/companyCards/assignCard/CardSelectionStep.tsx
@@ -31,7 +31,6 @@ import CONST from '@src/CONST';
 import ONYXKEYS from '@src/ONYXKEYS';
 import ROUTES from '@src/ROUTES';
 import type SCREENS from '@src/SCREENS';
-import type {UnassignedCard} from '@src/types/onyx/Card';
 
 type CardSelectionStepProps = PlatformStackScreenProps<SettingsNavigatorParamList, typeof SCREENS.WORKSPACE.COMPANY_CARDS_ASSIGN_CARD_CARD_SELECTION>;
 
@@ -58,12 +57,12 @@ function CardSelectionStep({route}: CardSelectionStepProps) {
     const [cardSelected, setCardSelected] = useState(assignCard?.cardToAssign?.encryptedCardNumber ?? '');
     const [shouldShowError, setShouldShowError] = useState(false);
 
-    const cardListOptions = filteredCardList.map((card: UnassignedCard) => ({
-        keyForList: card.cardID,
-        value: card.cardID,
-        text: maskCardNumber(card.cardName, feed),
-        alternateText: lastFourNumbersFromCardName(card.cardName),
-        isSelected: cardSelected === card.cardID,
+    const cardListOptions = Object.entries(filteredCardList).map(([cardNumber, encryptedCardNumber]) => ({
+        keyForList: encryptedCardNumber,
+        value: encryptedCardNumber,
+        text: maskCardNumber(cardNumber, feed),
+        alternateText: lastFourNumbersFromCardName(cardNumber),
+        isSelected: cardSelected === encryptedCardNumber,
         leftElement: plaidUrl ? (
             <PlaidCardFeedIcon
                 plaidUrl={plaidUrl}
@@ -101,14 +100,13 @@ function CardSelectionStep({route}: CardSelectionStepProps) {
             return;
         }
 
-        // Find the card by its ID to get the display name
-        const selectedCard = filteredCardList.find((card) => card.cardID === cardSelected);
-        const cardName = selectedCard?.cardName ?? '';
-
-        const customCardName = assignCard?.cardToAssign?.customCardName ?? '';
+        const cardNumber =
+            Object.entries(filteredCardList)
+                .find(([, encryptedCardNumber]) => encryptedCardNumber === cardSelected)
+                ?.at(0) ?? '';
 
         setAssignCardStepAndData({
-            cardToAssign: {encryptedCardNumber: cardSelected, cardName, customCardName},
+            cardToAssign: {encryptedCardNumber: cardSelected, cardNumber},
             isEditing: false,
         });
 
diff --git a/src/pages/workspace/companyCards/assignCard/ConfirmationStep.tsx b/src/pages/workspace/companyCards/assignCard/ConfirmationStep.tsx
index 5e28d16a352e..3e69fe7b2bb7 100644
--- a/src/pages/workspace/companyCards/assignCard/ConfirmationStep.tsx
+++ b/src/pages/workspace/companyCards/assignCard/ConfirmationStep.tsx
@@ -9,7 +9,6 @@ import OfflineWithFeedback from '@components/OfflineWithFeedback';
 import ScrollView from '@components/ScrollView';
 import Text from '@components/Text';
 import useCardFeeds from '@hooks/useCardFeeds';
-import useCurrencyList from '@hooks/useCurrencyList';
 import useLocalize from '@hooks/useLocalize';
 import useNetwork from '@hooks/useNetwork';
 import useOnyx from '@hooks/useOnyx';
@@ -28,7 +27,9 @@ import CONST from '@src/CONST';
 import ONYXKEYS from '@src/ONYXKEYS';
 import ROUTES from '@src/ROUTES';
 import type SCREENS from '@src/SCREENS';
+import type {CurrencyList} from '@src/types/onyx';
 import type {Errors} from '@src/types/onyx/OnyxCommon';
+import {getEmptyObject} from '@src/types/utils/EmptyObject';
 
 type ConfirmationStepProps = PlatformStackScreenProps<SettingsNavigatorParamList, typeof SCREENS.WORKSPACE.COMPANY_CARDS_ASSIGN_CARD_CONFIRMATION>;
 
@@ -45,8 +46,8 @@ function ConfirmationStep({route}: ConfirmationStepProps) {
     const [workspaceCardFeeds] = useOnyx(ONYXKEYS.COLLECTION.WORKSPACE_CARDS_LIST, {canBeMissing: true});
     const [cardError, setCardError] = useState<Errors>();
     const policy = usePolicy(policyID);
-    const {currencyList} = useCurrencyList();
     const [countryByIp] = useOnyx(ONYXKEYS.COUNTRY, {canBeMissing: false});
+    const [currencyList = getEmptyObject<CurrencyList>()] = useOnyx(ONYXKEYS.CURRENCY_LIST, {canBeMissing: true});
     const bankName = assignCard?.cardToAssign?.bankName ?? getCompanyCardFeed(feed);
     const [cardFeeds] = useCardFeeds(policyID);
 
@@ -98,10 +99,8 @@ function ConfirmationStep({route}: ConfirmationStepProps) {
             return;
         }
 
-        // Check both encryptedCardNumber and cardName since isCardAlreadyAssigned matches on either
-        // This handles cases where workspace card entries only have cardName (masked display name) stored
-        const cardIdentifier = cardToAssign?.encryptedCardNumber ?? cardToAssign?.cardName;
-        if (cardIdentifier && isCardAlreadyAssigned(cardIdentifier, workspaceCardFeeds)) {
+        const cardNumberToCheck = cardToAssign?.cardNumber ?? cardToAssign?.encryptedCardNumber;
+        if (cardNumberToCheck && isCardAlreadyAssigned(cardNumberToCheck, workspaceCardFeeds)) {
             setCardError(getMicroSecondOnyxErrorWithTranslationKey('workspace.companyCards.cardAlreadyAssignedError'));
             return;
         }
@@ -153,7 +152,7 @@ function ConfirmationStep({route}: ConfirmationStepProps) {
                 <Text style={[styles.textSupporting, styles.ph5, styles.mv3]}>{translate('workspace.companyCards.confirmationDescription')}</Text>
                 <MenuItemWithTopDescription
                     description={translate('workspace.companyCards.card')}
-                    title={maskCardNumber(cardToAssign?.cardName ?? '', cardToAssign?.bankName)}
+                    title={cardToAssign?.encryptedCardNumber ?? maskCardNumber(cardToAssign?.cardNumber ?? '', cardToAssign?.bankName)}
                     interactive={false}
                 />
                 <View style={[styles.optionsListSectionHeader, styles.justifyContentCenter]}>
@@ -179,7 +178,7 @@ function ConfirmationStep({route}: ConfirmationStepProps) {
                 />
                 <MenuItemWithTopDescription
                     description={translate('workspace.companyCards.cardName')}
-                    title={cardToAssign?.customCardName}
+                    title={cardToAssign?.cardName}
                     shouldShowRightIcon
                     onPress={() => editStep(CONST.COMPANY_CARD.STEP.CARD_NAME)}
                 />
diff --git a/src/pages/workspace/companyCards/assignCard/InviteNewMemberStep.tsx b/src/pages/workspace/companyCards/assignCard/InviteNewMemberStep.tsx
index c3f423b3b70a..55bb34cf8c6e 100644
--- a/src/pages/workspace/companyCards/assignCard/InviteNewMemberStep.tsx
+++ b/src/pages/workspace/companyCards/assignCard/InviteNewMemberStep.tsx
@@ -1,4 +1,4 @@
-import React, {useEffect} from 'react';
+import React, {useCallback, useEffect} from 'react';
 import InteractiveStepWrapper from '@components/InteractiveStepWrapper';
 import type {WithCurrentUserPersonalDetailsProps} from '@components/withCurrentUserPersonalDetails';
 import withCurrentUserPersonalDetails from '@components/withCurrentUserPersonalDetails';
@@ -49,11 +49,10 @@ function InviteNewMemberStep({route, currentUserPersonalDetails}: InviteeNewMemb
         Navigation.goBack();
     };
 
-    const goToNextStep = () => {
-        const defaultCardName = getDefaultCardName(assignCard?.cardToAssign?.invitingMemberEmail);
+    const goToNextStep = useCallback(() => {
         const cardToAssign: Partial<AssignCardData> = {
             email: assignCard?.cardToAssign?.invitingMemberEmail,
-            customCardName: defaultCardName,
+            cardName: getDefaultCardName(assignCard?.cardToAssign?.invitingMemberEmail),
             invitingMemberEmail: '',
         };
 
@@ -61,8 +60,7 @@ function InviteNewMemberStep({route, currentUserPersonalDetails}: InviteeNewMemb
 
         if (assignCard?.cardToAssign?.encryptedCardNumber) {
             cardToAssign.encryptedCardNumber = assignCard.cardToAssign.encryptedCardNumber;
-            cardToAssign.cardName = assignCard.cardToAssign.cardName;
-            cardToAssign.customCardName = assignCard.cardToAssign.customCardName ?? defaultCardName;
+            cardToAssign.cardNumber = assignCard.cardToAssign.cardNumber;
             cardToAssign.startDate = assignCard?.cardToAssign?.startDate ?? new Date().toISOString().split('T').at(0);
             cardToAssign.dateOption = assignCard?.cardToAssign?.dateOption ?? CONST.COMPANY_CARD.TRANSACTION_START_DATE_OPTIONS.CUSTOM;
             setAssignCardStepAndData({
@@ -72,9 +70,8 @@ function InviteNewMemberStep({route, currentUserPersonalDetails}: InviteeNewMemb
             });
             Navigation.navigate(ROUTES.WORKSPACE_COMPANY_CARDS_ASSIGN_CARD_CONFIRMATION.getRoute(routeParams));
         } else if (hasOnlyOneCardToAssign(filteredCardList)) {
-            const onlyCard = filteredCardList.at(0);
-            cardToAssign.cardName = onlyCard?.cardName;
-            cardToAssign.encryptedCardNumber = onlyCard?.cardID;
+            cardToAssign.cardNumber = Object.keys(filteredCardList).at(0);
+            cardToAssign.encryptedCardNumber = Object.values(filteredCardList).at(0);
             cardToAssign.startDate = assignCard?.cardToAssign?.startDate ?? new Date().toISOString().split('T').at(0);
             cardToAssign.dateOption = assignCard?.cardToAssign?.dateOption ?? CONST.COMPANY_CARD.TRANSACTION_START_DATE_OPTIONS.CUSTOM;
             setAssignCardStepAndData({
@@ -91,7 +88,7 @@ function InviteNewMemberStep({route, currentUserPersonalDetails}: InviteeNewMemb
             });
             Navigation.navigate(ROUTES.WORKSPACE_COMPANY_CARDS_ASSIGN_CARD_CARD_SELECTION.getRoute(routeParams));
         }
-    };
+    }, [assignCard?.cardToAssign, filteredCardList, policyID, feed, cardID]);
 
     // If the currently inviting member is already a member of the policy then we should just call goToNextStep
     // See https://github.com/Expensify/App/issues/74256 for more details
diff --git a/src/pages/workspace/expensifyCard/WorkspaceEditCardLimitTypePage.tsx b/src/pages/workspace/expensifyCard/WorkspaceEditCardLimitTypePage.tsx
index ea70a53a639e..13420f3fb68f 100644
--- a/src/pages/workspace/expensifyCard/WorkspaceEditCardLimitTypePage.tsx
+++ b/src/pages/workspace/expensifyCard/WorkspaceEditCardLimitTypePage.tsx
@@ -1,5 +1,5 @@
 import {useFocusEffect} from '@react-navigation/native';
-import React, {useState} from 'react';
+import React, {useCallback, useMemo, useState} from 'react';
 import FullPageOfflineBlockingView from '@components/BlockingViews/FullPageOfflineBlockingView';
 import Button from '@components/Button';
 import ConfirmModal from '@components/ConfirmModal';
@@ -57,17 +57,17 @@ function WorkspaceEditCardLimitTypePage({route}: WorkspaceEditCardLimitTypePageP
     const currency = useCurrencyForExpensifyCard({policyID});
     const isWorkspaceRhp = route.name === SCREENS.WORKSPACE.EXPENSIFY_CARD_LIMIT_TYPE;
 
-    const goBack = () => {
+    const goBack = useCallback(() => {
         if (backTo) {
             Navigation.goBack(backTo);
             return;
         }
         Navigation.goBack(isWorkspaceRhp ? ROUTES.WORKSPACE_EXPENSIFY_CARD_DETAILS.getRoute(policyID, cardID) : ROUTES.EXPENSIFY_CARD_DETAILS.getRoute(policyID, cardID));
-    };
+    }, [backTo, isWorkspaceRhp, policyID, cardID]);
 
-    const fetchCardLimitTypeData = () => {
+    const fetchCardLimitTypeData = useCallback(() => {
         openPolicyEditCardLimitTypePage(policyID, Number(cardID));
-    };
+    }, [policyID, cardID]);
 
     useFocusEffect(fetchCardLimitTypeData);
 
@@ -107,48 +107,52 @@ function WorkspaceEditCardLimitTypePage({route}: WorkspaceEditCardLimitTypePageP
         }
     };
 
-    const options = [];
-    let shouldShowFixedOption = true;
+    const data = useMemo(() => {
+        const options = [];
+        let shouldShowFixedOption = true;
+
+        if (card?.totalSpend && card?.nameValuePairs?.unapprovedExpenseLimit) {
+            const totalSpend = Math.abs(card.totalSpend);
+            if (
+                (initialLimitType === CONST.EXPENSIFY_CARD.LIMIT_TYPES.MONTHLY || initialLimitType === CONST.EXPENSIFY_CARD.LIMIT_TYPES.SMART) &&
+                totalSpend >= card.nameValuePairs?.unapprovedExpenseLimit
+            ) {
+                shouldShowFixedOption = false;
+            }
+        }
 
-    if (card?.totalSpend && card?.nameValuePairs?.unapprovedExpenseLimit) {
-        const totalSpend = Math.abs(card.totalSpend);
-        if (
-            (initialLimitType === CONST.EXPENSIFY_CARD.LIMIT_TYPES.MONTHLY || initialLimitType === CONST.EXPENSIFY_CARD.LIMIT_TYPES.SMART) &&
-            totalSpend >= card.nameValuePairs?.unapprovedExpenseLimit
-        ) {
-            shouldShowFixedOption = false;
+        if (areApprovalsConfigured) {
+            options.push({
+                value: CONST.EXPENSIFY_CARD.LIMIT_TYPES.SMART,
+                text: translate('workspace.card.issueNewCard.smartLimit'),
+                alternateText: translate('workspace.card.issueNewCard.smartLimitDescription'),
+                keyForList: CONST.EXPENSIFY_CARD.LIMIT_TYPES.SMART,
+                isSelected: typeSelected === CONST.EXPENSIFY_CARD.LIMIT_TYPES.SMART,
+            });
         }
-    }
 
-    if (areApprovalsConfigured) {
         options.push({
-            value: CONST.EXPENSIFY_CARD.LIMIT_TYPES.SMART,
-            text: translate('workspace.card.issueNewCard.smartLimit'),
-            alternateText: translate('workspace.card.issueNewCard.smartLimitDescription'),
-            keyForList: CONST.EXPENSIFY_CARD.LIMIT_TYPES.SMART,
-            isSelected: typeSelected === CONST.EXPENSIFY_CARD.LIMIT_TYPES.SMART,
-        });
-    }
-
-    options.push({
-        value: CONST.EXPENSIFY_CARD.LIMIT_TYPES.MONTHLY,
-        text: translate('workspace.card.issueNewCard.monthly'),
-        alternateText: translate('workspace.card.issueNewCard.monthlyDescription'),
-        keyForList: CONST.EXPENSIFY_CARD.LIMIT_TYPES.MONTHLY,
-        isMultilineSupported: true,
-        isSelected: typeSelected === CONST.EXPENSIFY_CARD.LIMIT_TYPES.MONTHLY,
-    });
-
-    if (shouldShowFixedOption) {
-        options.push({
-            value: CONST.EXPENSIFY_CARD.LIMIT_TYPES.FIXED,
-            text: translate('workspace.card.issueNewCard.fixedAmount'),
-            alternateText: translate('workspace.card.issueNewCard.fixedAmountDescription'),
-            keyForList: CONST.EXPENSIFY_CARD.LIMIT_TYPES.FIXED,
+            value: CONST.EXPENSIFY_CARD.LIMIT_TYPES.MONTHLY,
+            text: translate('workspace.card.issueNewCard.monthly'),
+            alternateText: translate('workspace.card.issueNewCard.monthlyDescription'),
+            keyForList: CONST.EXPENSIFY_CARD.LIMIT_TYPES.MONTHLY,
             isMultilineSupported: true,
-            isSelected: typeSelected === CONST.EXPENSIFY_CARD.LIMIT_TYPES.FIXED,
+            isSelected: typeSelected === CONST.EXPENSIFY_CARD.LIMIT_TYPES.MONTHLY,
         });
-    }
+
+        if (shouldShowFixedOption) {
+            options.push({
+                value: CONST.EXPENSIFY_CARD.LIMIT_TYPES.FIXED,
+                text: translate('workspace.card.issueNewCard.fixedAmount'),
+                alternateText: translate('workspace.card.issueNewCard.fixedAmountDescription'),
+                keyForList: CONST.EXPENSIFY_CARD.LIMIT_TYPES.FIXED,
+                isMultilineSupported: true,
+                isSelected: typeSelected === CONST.EXPENSIFY_CARD.LIMIT_TYPES.FIXED,
+            });
+        }
+
+        return options;
+    }, [areApprovalsConfigured, card?.totalSpend, card?.nameValuePairs?.unapprovedExpenseLimit, initialLimitType, translate, typeSelected]);
 
     return (
         <AccessOrNotFoundWrapper
@@ -169,7 +173,7 @@ function WorkspaceEditCardLimitTypePage({route}: WorkspaceEditCardLimitTypePageP
                     <SelectionList
                         ListItem={RadioListItem}
                         onSelectRow={({value}) => setTypeSelected(value)}
-                        data={options}
+                        data={data}
                         shouldUpdateFocusedIndex
                         alternateNumberOfSupportedLines={2}
                         initiallyFocusedItemKey={typeSelected}
diff --git a/src/pages/workspace/expensifyCard/WorkspaceExpensifyCardPage.tsx b/src/pages/workspace/expensifyCard/WorkspaceExpensifyCardPage.tsx
index 9aa1b9669711..3dc456553c5f 100644
--- a/src/pages/workspace/expensifyCard/WorkspaceExpensifyCardPage.tsx
+++ b/src/pages/workspace/expensifyCard/WorkspaceExpensifyCardPage.tsx
@@ -1,8 +1,9 @@
 import React, {useCallback, useEffect} from 'react';
-import FullScreenLoadingIndicator from '@components/FullscreenLoadingIndicator';
+import ActivityIndicator from '@components/ActivityIndicator';
 import useDefaultFundID from '@hooks/useDefaultFundID';
 import useNetwork from '@hooks/useNetwork';
 import useOnyx from '@hooks/useOnyx';
+import useThemeStyles from '@hooks/useThemeStyles';
 import {updateSelectedExpensifyCardFeed} from '@libs/actions/Card';
 import {filterInactiveCards} from '@libs/CardUtils';
 import type {PlatformStackScreenProps} from '@libs/Navigation/PlatformStackNavigation/types';
@@ -19,6 +20,7 @@ type WorkspaceExpensifyCardPageProps = PlatformStackScreenProps<WorkspaceSplitNa
 
 function WorkspaceExpensifyCardPage({route}: WorkspaceExpensifyCardPageProps) {
     const policyID = route.params.policyID;
+    const styles = useThemeStyles();
     const defaultFundID = useDefaultFundID(policyID);
 
     const [cardSettings] = useOnyx(`${ONYXKEYS.COLLECTION.PRIVATE_EXPENSIFY_CARD_SETTINGS}${defaultFundID}`, {canBeMissing: true});
@@ -40,7 +42,12 @@ function WorkspaceExpensifyCardPage({route}: WorkspaceExpensifyCardPageProps) {
 
     const renderContent = () => {
         if (!!isLoading && !paymentBankAccountID) {
-            return <FullScreenLoadingIndicator shouldUseGoBackButton />;
+            return (
+                <ActivityIndicator
+                    size={CONST.ACTIVITY_INDICATOR_SIZE.LARGE}
+                    style={styles.flex1}
+                />
+            );
         }
         if (paymentBankAccountID) {
             return (
diff --git a/src/pages/workspace/expensifyCard/issueNew/AssigneeStep.tsx b/src/pages/workspace/expensifyCard/issueNew/AssigneeStep.tsx
index ef0f306ebf79..8d2df39d9c84 100644
--- a/src/pages/workspace/expensifyCard/issueNew/AssigneeStep.tsx
+++ b/src/pages/workspace/expensifyCard/issueNew/AssigneeStep.tsx
@@ -1,4 +1,4 @@
-import React, {useEffect, useState} from 'react';
+import React, {useEffect, useMemo, useState} from 'react';
 import type {OnyxEntry} from 'react-native-onyx';
 import InteractiveStepWrapper from '@components/InteractiveStepWrapper';
 import SelectionList from '@components/SelectionList';
@@ -51,11 +51,16 @@ function AssigneeStep({policy, stepNames, startStepIndex, route}: AssigneeStepPr
     const [didScreenTransitionEnd, setDidScreenTransitionEnd] = useState(false);
     const [isSearchingForReports] = useOnyx(ONYXKEYS.IS_SEARCHING_FOR_REPORTS, {initWithStoredValues: false, canBeMissing: true});
 
-    const ineligibleInvites = getIneligibleInvitees(policy?.employeeList);
-    const excludedUsers: Record<string, boolean> = {};
-    for (const login of ineligibleInvites) {
-        excludedUsers[login] = true;
-    }
+    const excludedUsers = useMemo(() => {
+        const ineligibleInvites = getIneligibleInvitees(policy?.employeeList);
+        return ineligibleInvites.reduce(
+            (acc, login) => {
+                acc[login] = true;
+                return acc;
+            },
+            {} as Record<string, boolean>,
+        );
+    }, [policy?.employeeList]);
 
     const {searchTerm, setSearchTerm, debouncedSearchTerm, availableOptions, selectedOptionsForDisplay, areOptionsInitialized} = useSearchSelector({
         selectionMode: CONST.SEARCH_SELECTOR.SELECTION_MODE_MULTI,
@@ -111,15 +116,19 @@ function AssigneeStep({policy, stepNames, startStepIndex, route}: AssigneeStepPr
         clearIssueNewCardFlow(policyID);
     };
 
-    const membersDetails: ListItem[] = [];
-    if (policy?.employeeList) {
+    const membersDetails = useMemo(() => {
+        let membersList: ListItem[] = [];
+        if (!policy?.employeeList) {
+            return membersList;
+        }
+
         for (const [email, policyEmployee] of Object.entries(policy.employeeList ?? {})) {
             if (isDeletedPolicyEmployee(policyEmployee, isOffline)) {
                 continue;
             }
 
             const personalDetail = getPersonalDetailByEmail(email);
-            membersDetails.push({
+            membersList.push({
                 keyForList: email,
                 text: personalDetail?.displayName,
                 alternateText: email,
@@ -137,11 +146,20 @@ function AssigneeStep({policy, stepNames, startStepIndex, route}: AssigneeStepPr
             });
         }
 
-        sortAlphabetically(membersDetails, 'text', localeCompare);
-    }
+        membersList = sortAlphabetically(membersList, 'text', localeCompare);
+
+        return membersList;
+    }, [policy?.employeeList, localeCompare, isOffline, issueNewCard?.data?.assigneeEmail, formatPhoneNumber, icons.FallbackAvatar]);
+
+    const assignees = useMemo(() => {
+        if (!debouncedSearchTerm) {
+            return membersDetails;
+        }
+
+        if (!areOptionsInitialized) {
+            return [];
+        }
 
-    let assignees = membersDetails;
-    if (debouncedSearchTerm && areOptionsInitialized) {
         const searchValueForOptions = getSearchValueForPhoneOrEmail(debouncedSearchTerm, countryCode).toLowerCase();
 
         const filteredMembers = tokenizedSearch(membersDetails, searchValueForOptions, (option) => [option.text ?? '', option.alternateText ?? '']);
@@ -154,30 +172,42 @@ function AssigneeStep({policy, stepNames, startStepIndex, route}: AssigneeStepPr
             ...(availableOptions.userToInvite ? [availableOptions.userToInvite] : []),
         ];
 
-        assignees = options.map((option) => ({
+        return options.map((option) => ({
             ...option,
             keyForList: option.keyForList ?? option.login ?? '',
         }));
-    } else if (debouncedSearchTerm) {
-        assignees = [];
-    }
+    }, [
+        debouncedSearchTerm,
+        areOptionsInitialized,
+        countryCode,
+        membersDetails,
+        selectedOptionsForDisplay,
+        availableOptions.recentReports,
+        availableOptions.personalDetails,
+        availableOptions.userToInvite,
+    ]);
 
     useEffect(() => {
         searchInServer(debouncedSearchTerm);
     }, [debouncedSearchTerm]);
 
-    const searchValue = debouncedSearchTerm.trim().toLowerCase();
-    const headerMessage =
-        !availableOptions.userToInvite && CONST.EXPENSIFY_EMAILS_OBJECT[searchValue]
-            ? translate('messages.errorMessageInvalidEmail')
-            : getHeaderMessage(assignees.length > 0, !!availableOptions.userToInvite, searchValue, countryCode, false);
-
-    const textInputOptions = {
-        label: translate('selectionList.nameEmailOrPhoneNumber'),
-        value: searchTerm,
-        onChangeText: setSearchTerm,
-        headerMessage,
-    };
+    const headerMessage = useMemo(() => {
+        const searchValue = debouncedSearchTerm.trim().toLowerCase();
+        if (!availableOptions.userToInvite && CONST.EXPENSIFY_EMAILS_OBJECT[searchValue]) {
+            return translate('messages.errorMessageInvalidEmail');
+        }
+        return getHeaderMessage(assignees.length > 0, !!availableOptions.userToInvite, searchValue, countryCode, false);
+    }, [debouncedSearchTerm, availableOptions.userToInvite, assignees.length, countryCode, translate]);
+
+    const textInputOptions = useMemo(
+        () => ({
+            label: translate('selectionList.nameEmailOrPhoneNumber'),
+            value: searchTerm,
+            onChangeText: setSearchTerm,
+            headerMessage,
+        }),
+        [headerMessage, searchTerm, setSearchTerm, translate],
+    );
 
     return (
         <InteractiveStepWrapper
diff --git a/src/pages/workspace/expensifyCard/issueNew/ConfirmationStep.tsx b/src/pages/workspace/expensifyCard/issueNew/ConfirmationStep.tsx
index cff7a8a99fba..56289a63d2b3 100644
--- a/src/pages/workspace/expensifyCard/issueNew/ConfirmationStep.tsx
+++ b/src/pages/workspace/expensifyCard/issueNew/ConfirmationStep.tsx
@@ -1,18 +1,15 @@
-import React, {useCallback, useEffect, useRef} from 'react';
+import React, {useEffect, useRef} from 'react';
 import {View} from 'react-native';
 import FormAlertWithSubmitButton from '@components/FormAlertWithSubmitButton';
 import InteractiveStepWrapper from '@components/InteractiveStepWrapper';
 import MenuItemWithTopDescription from '@components/MenuItemWithTopDescription';
 import ScrollView from '@components/ScrollView';
 import Text from '@components/Text';
-import useDefaultFundID from '@hooks/useDefaultFundID';
 import useLocalize from '@hooks/useLocalize';
 import useNetwork from '@hooks/useNetwork';
 import useOnyx from '@hooks/useOnyx';
-import usePermissions from '@hooks/usePermissions';
 import useThemeStyles from '@hooks/useThemeStyles';
-import AccountUtils from '@libs/AccountUtils';
-import {clearIssueNewCardError, clearIssueNewCardFlow, issueExpensifyCard, setIssueNewCardStepAndData} from '@libs/actions/Card';
+import {setIssueNewCardStepAndData} from '@libs/actions/Card';
 import {resetValidateActionCodeSent} from '@libs/actions/User';
 import {getTranslationKeyForLimitType} from '@libs/CardUtils';
 import {convertToShortDisplayString} from '@libs/CurrencyUtils';
@@ -43,13 +40,9 @@ function ConfirmationStep({policyID, stepNames, startStepIndex, backTo}: Confirm
     const {translate} = useLocalize();
     const styles = useThemeStyles();
     const {isOffline} = useNetwork();
-    const [account] = useOnyx(ONYXKEYS.ACCOUNT, {canBeMissing: true});
     const [issueNewCard] = useOnyx(`${ONYXKEYS.COLLECTION.ISSUE_NEW_EXPENSIFY_CARD}${policyID}`, {canBeMissing: true});
     const [policy] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY}${policyID}`, {canBeMissing: true});
-    const defaultFundID = useDefaultFundID(policyID);
-    const {isBetaEnabled} = usePermissions();
     const data = issueNewCard?.data;
-    const isSuccessful = issueNewCard?.isSuccessful;
     const hasApprovalError = !!policy?.errorFields?.approvalMode;
     const isAddApprovalEnabled = policy?.approvalMode !== CONST.POLICY.APPROVAL_MODE.OPTIONAL && !hasApprovalError;
     const shouldDisableSubmitButton = !isAddApprovalEnabled && data?.limitType === CONST.EXPENSIFY_CARD.LIMIT_TYPES.SMART;
@@ -59,46 +52,7 @@ function ConfirmationStep({policyID, stepNames, startStepIndex, backTo}: Confirm
     useEffect(() => {
         submitButton.current?.focus();
         resetValidateActionCodeSent();
-        clearIssueNewCardError(policyID);
-    }, [policyID]);
-
-    useEffect(() => {
-        if (!policyID) {
-            return;
-        }
-
-        if (isSuccessful) {
-            Navigation.navigate(ROUTES.WORKSPACE_EXPENSIFY_CARD.getRoute(policyID), {forceReplace: true});
-            clearIssueNewCardFlow(policyID);
-            return;
-        }
-
-        const hasError = !!getLatestErrorMessage(issueNewCard);
-        if (hasError) {
-            const errorMessage = getLatestErrorMessage(issueNewCard);
-
-            // Redirect to the magic code page when there is an error with the user's validateCode authentication
-            if (errorMessage.toLowerCase().includes('request a new code')) {
-                clearIssueNewCardError(policyID);
-                Navigation.navigate(ROUTES.WORKSPACE_EXPENSIFY_CARD_ISSUE_NEW_CONFIRM_MAGIC_CODE.getRoute(policyID, ROUTES.WORKSPACE_EXPENSIFY_CARD.getRoute(policyID)));
-            }
-        }
-    }, [issueNewCard, isSuccessful, policyID]);
-
-    const handleIssueCard = useCallback(() => {
-        if (!policyID) {
-            return;
-        }
-
-        if (AccountUtils.hasValidateCodeExtendedAccess(account)) {
-            // Attempt to issue directly without magic code when user has extended access
-            // If this fails, the effect above will redirect to the magic code page
-            issueExpensifyCard(defaultFundID, policyID, isBetaEnabled(CONST.BETAS.EXPENSIFY_CARD_EU_UK) ? '' : CONST.COUNTRY.US, '', data);
-        } else {
-            // Navigate to magic code page
-            Navigation.navigate(ROUTES.WORKSPACE_EXPENSIFY_CARD_ISSUE_NEW_CONFIRM_MAGIC_CODE.getRoute(policyID, backTo));
-        }
-    }, [policyID, data, account, defaultFundID, isBetaEnabled, backTo]);
+    }, []);
 
     const errorMessage = getLatestErrorMessage(issueNewCard) || (shouldDisableSubmitButton ? translate('workspace.card.issueNewCard.disabledApprovalForSmartLimitError') : '');
 
@@ -111,8 +65,6 @@ function ConfirmationStep({policyID, stepNames, startStepIndex, backTo}: Confirm
     };
 
     const translationForLimitType = getTranslationKeyForLimitType(data?.limitType);
-    const isPhysicalCard = data?.cardType === CONST.EXPENSIFY_CARD.CARD_TYPE.PHYSICAL;
-    const cardReadyTranslationKey = isPhysicalCard ? 'workspace.card.issueNewCard.willBeReadyToShip' : 'workspace.card.issueNewCard.willBeReadyToUse';
 
     return (
         <InteractiveStepWrapper
@@ -132,7 +84,7 @@ function ConfirmationStep({policyID, stepNames, startStepIndex, backTo}: Confirm
                 addBottomSafeAreaPadding
             >
                 <Text style={[styles.textHeadlineLineHeightXXL, styles.ph5, styles.mt3]}>{translate('workspace.card.issueNewCard.letsDoubleCheck')}</Text>
-                <Text style={[styles.textSupporting, styles.ph5, styles.mv3]}>{translate(cardReadyTranslationKey)}</Text>
+                <Text style={[styles.textSupporting, styles.ph5, styles.mv3]}>{translate('workspace.card.issueNewCard.willBeReady')}</Text>
                 <MenuItemWithTopDescription
                     description={translate('workspace.card.issueNewCard.cardholder')}
                     title={getUserNameByEmail(data?.assigneeEmail ?? '', 'displayName')}
@@ -172,7 +124,12 @@ function ConfirmationStep({policyID, stepNames, startStepIndex, backTo}: Confirm
                         isDisabled={isOffline || shouldDisableSubmitButton}
                         isMessageHtml={shouldDisableSubmitButton}
                         isLoading={issueNewCard?.isLoading}
-                        onSubmit={handleIssueCard}
+                        onSubmit={() => {
+                            if (!policyID) {
+                                return;
+                            }
+                            Navigation.navigate(ROUTES.WORKSPACE_EXPENSIFY_CARD_ISSUE_NEW_CONFIRM_MAGIC_CODE.getRoute(policyID, backTo));
+                        }}
                         buttonText={translate('workspace.card.issueCard')}
                     />
                 </View>
diff --git a/src/pages/workspace/expensifyCard/issueNew/IssueNewCardPage.tsx b/src/pages/workspace/expensifyCard/issueNew/IssueNewCardPage.tsx
index 8512d8cfb122..9098b00fc6bd 100644
--- a/src/pages/workspace/expensifyCard/issueNew/IssueNewCardPage.tsx
+++ b/src/pages/workspace/expensifyCard/issueNew/IssueNewCardPage.tsx
@@ -46,7 +46,7 @@ function getStartStepIndex(issueNewCard: OnyxEntry<IssueNewCard>): number {
 
 function IssueNewCardPage({policy, route}: IssueNewCardPageProps) {
     const policyID = policy?.id;
-    const [issueNewCard] = useOnyx(`${ONYXKEYS.COLLECTION.ISSUE_NEW_EXPENSIFY_CARD}${policyID}`, {canBeMissing: true, initWithStoredValues: false});
+    const [issueNewCard] = useOnyx(`${ONYXKEYS.COLLECTION.ISSUE_NEW_EXPENSIFY_CARD}${policyID}`, {canBeMissing: true});
     const {currentStep} = issueNewCard ?? {};
     const backTo = route?.params?.backTo;
     const [isActingAsDelegate] = useOnyx(ONYXKEYS.ACCOUNT, {selector: isActingAsDelegateSelector, canBeMissing: true});
diff --git a/src/pages/workspace/members/ImportedMembersPage.tsx b/src/pages/workspace/members/ImportedMembersPage.tsx
index 939a641c3750..53cd1f7cb787 100644
--- a/src/pages/workspace/members/ImportedMembersPage.tsx
+++ b/src/pages/workspace/members/ImportedMembersPage.tsx
@@ -56,11 +56,11 @@ function ImportedMembersPage({route}: ImportedMembersPageProps) {
         let errors: Record<string, string | null> = {};
         const missingRequiredColumns = requiredColumns.find((requiredColumn) => !columns.includes(requiredColumn.value));
         if (missingRequiredColumns) {
-            errors.required = translate('spreadsheet.fieldNotMapped', missingRequiredColumns.text);
+            errors.required = translate('spreadsheet.fieldNotMapped', {fieldName: missingRequiredColumns.text});
         } else {
             const duplicate = findDuplicate(columns);
             if (duplicate) {
-                errors.duplicates = translate('spreadsheet.singleFieldMultipleColumns', duplicate);
+                errors.duplicates = translate('spreadsheet.singleFieldMultipleColumns', {fieldName: duplicate});
             } else {
                 errors = {};
             }
diff --git a/src/pages/workspace/members/WorkspaceMemberDetailsPage.tsx b/src/pages/workspace/members/WorkspaceMemberDetailsPage.tsx
index ca37d15b6fec..8475b26aadac 100644
--- a/src/pages/workspace/members/WorkspaceMemberDetailsPage.tsx
+++ b/src/pages/workspace/members/WorkspaceMemberDetailsPage.tsx
@@ -1,5 +1,5 @@
 import {Str} from 'expensify-common';
-import React, {useContext, useEffect, useState} from 'react';
+import React, {useCallback, useContext, useEffect, useMemo, useState} from 'react';
 import {View} from 'react-native';
 import type {OnyxEntry} from 'react-native-onyx';
 import type {ValueOf} from 'type-fest';
@@ -102,7 +102,7 @@ function WorkspaceMemberDetailsPage({personalDetails, policy, route}: WorkspaceM
     const isSelectedMemberCurrentUser = accountID === currentUserPersonalDetails?.accountID;
     const isCurrentUserAdmin = policy?.employeeList?.[personalDetails?.[currentUserPersonalDetails?.accountID]?.login ?? '']?.role === CONST.POLICY.ROLE.ADMIN;
     const isCurrentUserOwner = policy?.owner === currentUserPersonalDetails?.login;
-    const ownerDetails = personalDetails?.[policy?.ownerAccountID ?? CONST.DEFAULT_NUMBER_ID] ?? ({} as PersonalDetails);
+    const ownerDetails = useMemo(() => personalDetails?.[policy?.ownerAccountID ?? CONST.DEFAULT_NUMBER_ID] ?? ({} as PersonalDetails), [personalDetails, policy?.ownerAccountID]);
     const policyOwnerDisplayName = formatPhoneNumber(getDisplayNameOrDefault(ownerDetails)) ?? policy?.owner ?? '';
     const hasMultipleFeeds = Object.keys(getCompanyFeeds(cardFeeds, false, true)).length > 0;
     const {cardList: assignableCards, ...workspaceCards} = getAllCardsForWorkspace(workspaceAccountID, cardList, cardFeeds, expensifyCardSettings);
@@ -112,56 +112,75 @@ function WorkspaceMemberDetailsPage({personalDetails, policy, route}: WorkspaceM
     const [isCannotRemoveUser, setIsCannotRemoveUser] = useState(false);
     const {isAccountLocked, showLockedAccountModal} = useContext(LockedAccountContext);
 
-    const {approvalWorkflows} = convertPolicyEmployeesToApprovalWorkflows({
-        policy,
-        personalDetails: personalDetails ?? {},
-        localeCompare,
-    });
+    const {approvalWorkflows} = useMemo(
+        () =>
+            convertPolicyEmployeesToApprovalWorkflows({
+                policy,
+                personalDetails: personalDetails ?? {},
+                localeCompare,
+            }),
+        [personalDetails, policy, localeCompare],
+    );
 
     useEffect(() => {
         openPolicyMemberProfilePage(policyID, accountID);
     }, [policyID, accountID]);
 
-    const memberCards = workspaceCards ? Object.values(workspaceCards).filter((card) => card.accountID === accountID) : [];
-
-    const isApprover = isApproverUserAction(policy, memberLogin);
-    const isTechnicalContact = policy?.technicalContact === details?.login;
-    const exporters = [
-        policy?.connections?.intacct?.config?.export?.exporter,
-        policy?.connections?.quickbooksDesktop?.config?.export?.exporter,
-        policy?.connections?.quickbooksOnline?.config?.export?.exporter,
-        policy?.connections?.xero?.config?.export?.exporter,
-        policy?.connections?.netsuite?.options?.config?.exporter,
-    ];
-    const isUserExporter = exporters.includes(details.login);
-
-    let confirmModalPrompt = translate('workspace.people.removeMembersWarningPrompt', {
-        memberName: displayName,
-        ownerName: policyOwnerDisplayName,
-    });
-
-    if (isTechnicalContact) {
-        confirmModalPrompt = translate('workspace.people.removeMemberPromptTechContact', {
-            memberName: displayName,
-            workspaceOwner: policyOwnerDisplayName,
-        });
-    } else if (isReimburser) {
-        confirmModalPrompt = translate('workspace.people.removeMemberPromptReimburser', {
-            memberName: displayName,
-        });
-    } else if (isUserExporter) {
-        confirmModalPrompt = translate('workspace.people.removeMemberPromptExporter', {
+    const memberCards = useMemo(() => {
+        if (!workspaceCards) {
+            return [];
+        }
+        return Object.values(workspaceCards ?? {}).filter((card) => card.accountID === accountID);
+    }, [accountID, workspaceCards]);
+
+    const confirmModalPrompt = useMemo(() => {
+        const isApprover = isApproverUserAction(policy, memberLogin);
+        const isTechnicalContact = policy?.technicalContact === details?.login;
+        const exporters = [
+            policy?.connections?.intacct?.config?.export?.exporter,
+            policy?.connections?.quickbooksDesktop?.config?.export?.exporter,
+            policy?.connections?.quickbooksOnline?.config?.export?.exporter,
+            policy?.connections?.xero?.config?.export?.exporter,
+            policy?.connections?.netsuite?.options?.config?.exporter,
+        ];
+        const isUserExporter = exporters.includes(details.login);
+
+        if (isTechnicalContact) {
+            return translate('workspace.people.removeMemberPromptTechContact', {
+                memberName: displayName,
+                workspaceOwner: policyOwnerDisplayName,
+            });
+        }
+
+        if (isReimburser) {
+            return translate('workspace.people.removeMemberPromptReimburser', {
+                memberName: displayName,
+            });
+        }
+
+        if (isUserExporter) {
+            return translate('workspace.people.removeMemberPromptExporter', {
+                memberName: displayName,
+                workspaceOwner: policyOwnerDisplayName,
+            });
+        }
+
+        if (!isApprover) {
+            return translate('workspace.people.removeMemberPrompt', {memberName: displayName});
+        }
+
+        if (isApprover) {
+            return translate('workspace.people.removeMemberPromptApprover', {
+                approver: displayName,
+                workspaceOwner: policyOwnerDisplayName,
+            });
+        }
+
+        return translate('workspace.people.removeMembersWarningPrompt', {
             memberName: displayName,
-            workspaceOwner: policyOwnerDisplayName,
+            ownerName: policyOwnerDisplayName,
         });
-    } else if (!isApprover) {
-        confirmModalPrompt = translate('workspace.people.removeMemberPrompt', {memberName: displayName});
-    } else if (isApprover) {
-        confirmModalPrompt = translate('workspace.people.removeMemberPromptApprover', {
-            approver: displayName,
-            workspaceOwner: policyOwnerDisplayName,
-        });
-    }
+    }, [policy, memberLogin, details.login, isReimburser, translate, displayName, policyOwnerDisplayName]);
 
     useEffect(() => {
         if (!prevMember || prevMember?.pendingAction === CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE || member?.pendingAction !== CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE) {
@@ -179,7 +198,7 @@ function WorkspaceMemberDetailsPage({personalDetails, policy, route}: WorkspaceM
     };
 
     // Function to remove a member and close the modal
-    const removeMemberAndCloseModal = () => {
+    const removeMemberAndCloseModal = useCallback(() => {
         removeMembers(policyID, [memberLogin], {[memberLogin]: accountID});
         const previousEmployeesCount = Object.keys(policy?.employeeList ?? {}).length;
         const remainingEmployeeCount = previousEmployeesCount - 1;
@@ -188,9 +207,9 @@ function WorkspaceMemberDetailsPage({personalDetails, policy, route}: WorkspaceM
             setPolicyPreventSelfApproval(policyID, false);
         }
         setIsRemoveMemberConfirmModalVisible(false);
-    };
+    }, [accountID, memberLogin, policy?.employeeList, policy?.preventSelfApproval, policyID]);
 
-    const removeUser = () => {
+    const removeUser = useCallback(() => {
         const ownerEmail = ownerDetails?.login;
         const removedApprover = personalDetails?.[accountID];
 
@@ -219,34 +238,37 @@ function WorkspaceMemberDetailsPage({personalDetails, policy, route}: WorkspaceM
 
         // Remove the member and close the modal
         removeMemberAndCloseModal();
-    };
+    }, [accountID, approvalWorkflows, ownerDetails, personalDetails, policy, removeMemberAndCloseModal, memberLogin]);
 
-    const navigateToProfile = () => {
+    const navigateToProfile = useCallback(() => {
         Navigation.navigate(ROUTES.PROFILE.getRoute(accountID, Navigation.getActiveRoute()));
-    };
+    }, [accountID]);
 
-    const navigateToDetails = (card: MemberCard) => {
-        if (card.bank === CONST.EXPENSIFY_CARD.BANK) {
-            Navigation.navigate(ROUTES.WORKSPACE_EXPENSIFY_CARD_DETAILS.getRoute(policyID, card.cardID.toString(), Navigation.getActiveRoute()));
-            return;
-        }
-        if (!card.fundID) {
-            return;
-        }
-        Navigation.navigate(
-            ROUTES.WORKSPACE_COMPANY_CARD_DETAILS.getRoute(
-                policyID,
-                getCompanyCardFeedWithDomainID(card.bank as CompanyCardFeed, card.fundID),
-                card.cardID.toString(),
-                Navigation.getActiveRoute(),
-            ),
-        );
-    };
+    const navigateToDetails = useCallback(
+        (card: MemberCard) => {
+            if (card.bank === CONST.EXPENSIFY_CARD.BANK) {
+                Navigation.navigate(ROUTES.WORKSPACE_EXPENSIFY_CARD_DETAILS.getRoute(policyID, card.cardID.toString(), Navigation.getActiveRoute()));
+                return;
+            }
+            if (!card.fundID) {
+                return;
+            }
+            Navigation.navigate(
+                ROUTES.WORKSPACE_COMPANY_CARD_DETAILS.getRoute(
+                    policyID,
+                    getCompanyCardFeedWithDomainID(card.bank as CompanyCardFeed, card.fundID),
+                    card.cardID.toString(),
+                    Navigation.getActiveRoute(),
+                ),
+            );
+        },
+        [policyID],
+    );
 
-    const startChangeOwnershipFlow = () => {
+    const startChangeOwnershipFlow = useCallback(() => {
         clearWorkspaceOwnerChangeFlow(policyID);
         Navigation.navigate(ROUTES.WORKSPACE_OWNER_CHANGE_CHECK.getRoute(policyID, accountID, 'amountOwed' as ValueOf<typeof CONST.POLICY.OWNERSHIP_ERRORS>));
-    };
+    }, [accountID, policyID]);
 
     // eslint-disable-next-line rulesdir/no-negated-variables
     const shouldShowNotFoundPage =
diff --git a/src/pages/workspace/perDiem/EditPerDiemAmountPage.tsx b/src/pages/workspace/perDiem/EditPerDiemAmountPage.tsx
index 659f1e80cb12..be8603ea5202 100644
--- a/src/pages/workspace/perDiem/EditPerDiemAmountPage.tsx
+++ b/src/pages/workspace/perDiem/EditPerDiemAmountPage.tsx
@@ -1,4 +1,4 @@
-import React from 'react';
+import React, {useCallback} from 'react';
 import AmountWithoutCurrencyInput from '@components/AmountWithoutCurrencyInput';
 import FormProvider from '@components/Form/FormProvider';
 import InputWrapper from '@components/Form/InputWrapper';
@@ -42,26 +42,32 @@ function EditPerDiemAmountPage({route}: EditPerDiemAmountPageProps) {
 
     const {inputCallbackRef} = useAutoFocusInput();
 
-    const validate = (values: FormOnyxValues<typeof ONYXKEYS.FORMS.WORKSPACE_PER_DIEM_FORM>): FormInputErrors<typeof ONYXKEYS.FORMS.WORKSPACE_PER_DIEM_FORM> => {
-        const errors: FormInputErrors<typeof ONYXKEYS.FORMS.WORKSPACE_PER_DIEM_FORM> = {};
+    const validate = useCallback(
+        (values: FormOnyxValues<typeof ONYXKEYS.FORMS.WORKSPACE_PER_DIEM_FORM>): FormInputErrors<typeof ONYXKEYS.FORMS.WORKSPACE_PER_DIEM_FORM> => {
+            const errors: FormInputErrors<typeof ONYXKEYS.FORMS.WORKSPACE_PER_DIEM_FORM> = {};
 
-        const newAmount = values.amount.trim();
-        const backendAmount = newAmount ? convertToBackendAmount(Number(newAmount)) : 0;
-        if (backendAmount === 0 || newAmount === '-') {
-            errors.amount = translate('common.error.fieldRequired');
-        }
+            const newAmount = values.amount.trim();
+            const backendAmount = newAmount ? convertToBackendAmount(Number(newAmount)) : 0;
+            if (backendAmount === 0 || newAmount === '-') {
+                errors.amount = translate('common.error.fieldRequired');
+            }
 
-        return errors;
-    };
+            return errors;
+        },
+        [translate],
+    );
 
-    const editAmount = (values: FormOnyxValues<typeof ONYXKEYS.FORMS.WORKSPACE_PER_DIEM_FORM>) => {
-        const newAmount = values.amount.trim();
-        const backendAmount = newAmount ? convertToBackendAmount(Number(newAmount)) : 0;
-        if (backendAmount !== Number(selectedSubrate?.rate)) {
-            editPerDiemRateAmount(policyID, rateID, subRateID, customUnit, backendAmount);
-        }
-        Navigation.goBack(ROUTES.WORKSPACE_PER_DIEM_DETAILS.getRoute(policyID, rateID, subRateID));
-    };
+    const editAmount = useCallback(
+        (values: FormOnyxValues<typeof ONYXKEYS.FORMS.WORKSPACE_PER_DIEM_FORM>) => {
+            const newAmount = values.amount.trim();
+            const backendAmount = newAmount ? convertToBackendAmount(Number(newAmount)) : 0;
+            if (backendAmount !== Number(selectedSubrate?.rate)) {
+                editPerDiemRateAmount(policyID, rateID, subRateID, customUnit, backendAmount);
+            }
+            Navigation.goBack(ROUTES.WORKSPACE_PER_DIEM_DETAILS.getRoute(policyID, rateID, subRateID));
+        },
+        [selectedSubrate?.rate, policyID, rateID, subRateID, customUnit],
+    );
 
     return (
         <AccessOrNotFoundWrapper
diff --git a/src/pages/workspace/perDiem/EditPerDiemSubratePage.tsx b/src/pages/workspace/perDiem/EditPerDiemSubratePage.tsx
index e4b8f576cd61..c05da823aa88 100644
--- a/src/pages/workspace/perDiem/EditPerDiemSubratePage.tsx
+++ b/src/pages/workspace/perDiem/EditPerDiemSubratePage.tsx
@@ -1,4 +1,4 @@
-import React from 'react';
+import React, {useCallback} from 'react';
 import FormProvider from '@components/Form/FormProvider';
 import InputWrapper from '@components/Form/InputWrapper';
 import type {FormInputErrors, FormOnyxValues} from '@components/Form/types';
@@ -39,27 +39,33 @@ function EditPerDiemSubratePage({route}: EditPerDiemSubratePageProps) {
 
     const {inputCallbackRef} = useAutoFocusInput();
 
-    const validate = (values: FormOnyxValues<typeof ONYXKEYS.FORMS.WORKSPACE_PER_DIEM_FORM>): FormInputErrors<typeof ONYXKEYS.FORMS.WORKSPACE_PER_DIEM_FORM> => {
-        const errors: FormInputErrors<typeof ONYXKEYS.FORMS.WORKSPACE_PER_DIEM_FORM> = {};
+    const validate = useCallback(
+        (values: FormOnyxValues<typeof ONYXKEYS.FORMS.WORKSPACE_PER_DIEM_FORM>): FormInputErrors<typeof ONYXKEYS.FORMS.WORKSPACE_PER_DIEM_FORM> => {
+            const errors: FormInputErrors<typeof ONYXKEYS.FORMS.WORKSPACE_PER_DIEM_FORM> = {};
 
-        const subrateTrimmed = values.subrate.trim();
+            const subrateTrimmed = values.subrate.trim();
 
-        if (!subrateTrimmed) {
-            errors.subrate = translate('common.error.fieldRequired');
-        } else if (subrateTrimmed.length > CONST.MAX_LENGTH_256) {
-            errors.subrate = translate('common.error.characterLimitExceedCounter', subrateTrimmed.length, CONST.MAX_LENGTH_256);
-        }
+            if (!subrateTrimmed) {
+                errors.subrate = translate('common.error.fieldRequired');
+            } else if (subrateTrimmed.length > CONST.MAX_LENGTH_256) {
+                errors.subrate = translate('common.error.characterLimitExceedCounter', subrateTrimmed.length, CONST.MAX_LENGTH_256);
+            }
 
-        return errors;
-    };
+            return errors;
+        },
+        [translate],
+    );
 
-    const editSubrate = (values: FormOnyxValues<typeof ONYXKEYS.FORMS.WORKSPACE_PER_DIEM_FORM>) => {
-        const newSubrate = values.subrate.trim();
-        if (newSubrate !== selectedSubrate?.name) {
-            editPerDiemRateSubrate(policyID, rateID, subRateID, customUnit, newSubrate);
-        }
-        Navigation.goBack(ROUTES.WORKSPACE_PER_DIEM_DETAILS.getRoute(policyID, rateID, subRateID));
-    };
+    const editSubrate = useCallback(
+        (values: FormOnyxValues<typeof ONYXKEYS.FORMS.WORKSPACE_PER_DIEM_FORM>) => {
+            const newSubrate = values.subrate.trim();
+            if (newSubrate !== selectedSubrate?.name) {
+                editPerDiemRateSubrate(policyID, rateID, subRateID, customUnit, newSubrate);
+            }
+            Navigation.goBack(ROUTES.WORKSPACE_PER_DIEM_DETAILS.getRoute(policyID, rateID, subRateID));
+        },
+        [selectedSubrate?.name, policyID, rateID, subRateID, customUnit],
+    );
 
     return (
         <AccessOrNotFoundWrapper
diff --git a/src/pages/workspace/perDiem/ImportPerDiemPage.tsx b/src/pages/workspace/perDiem/ImportPerDiemPage.tsx
index 320d3aa594dc..48a39054799a 100644
--- a/src/pages/workspace/perDiem/ImportPerDiemPage.tsx
+++ b/src/pages/workspace/perDiem/ImportPerDiemPage.tsx
@@ -3,7 +3,7 @@ import ImportSpreadsheet from '@components/ImportSpreadsheet';
 import usePolicy from '@hooks/usePolicy';
 import type {PlatformStackScreenProps} from '@libs/Navigation/PlatformStackNavigation/types';
 import type {SettingsNavigatorParamList} from '@libs/Navigation/types';
-import {goBackFromInvalidPolicy} from '@libs/PolicyUtils';
+import * as PolicyUtils from '@libs/PolicyUtils';
 import AccessOrNotFoundWrapper from '@pages/workspace/AccessOrNotFoundWrapper';
 import CONST from '@src/CONST';
 import ROUTES from '@src/ROUTES';
@@ -20,8 +20,7 @@ function ImportPerDiemPage({route}: ImportPerDiemPageProps) {
         <AccessOrNotFoundWrapper
             policyID={policyID}
             accessVariants={[CONST.POLICY.ACCESS_VARIANTS.ADMIN]}
-            featureName={CONST.POLICY.MORE_FEATURES.ARE_PER_DIEM_RATES_ENABLED}
-            fullPageNotFoundViewProps={{subtitleKey: isEmptyObject(policy) ? undefined : 'workspace.common.notAuthorized', onLinkPress: goBackFromInvalidPolicy}}
+            fullPageNotFoundViewProps={{subtitleKey: isEmptyObject(policy) ? undefined : 'workspace.common.notAuthorized', onLinkPress: PolicyUtils.goBackFromInvalidPolicy}}
         >
             <ImportSpreadsheet
                 backTo={ROUTES.WORKSPACE_PER_DIEM.getRoute(policyID)}
diff --git a/src/pages/workspace/perDiem/ImportedPerDiemPage.tsx b/src/pages/workspace/perDiem/ImportedPerDiemPage.tsx
index b49b12ba64b1..999550dab36a 100644
--- a/src/pages/workspace/perDiem/ImportedPerDiemPage.tsx
+++ b/src/pages/workspace/perDiem/ImportedPerDiemPage.tsx
@@ -1,15 +1,15 @@
-import React, {useState} from 'react';
+import React, {useCallback, useState} from 'react';
 import HeaderWithBackButton from '@components/HeaderWithBackButton';
 import type {ColumnRole} from '@components/ImportColumn';
 import ImportSpreadsheetColumns from '@components/ImportSpreadsheetColumns';
 import ImportSpreadsheetConfirmModal from '@components/ImportSpreadsheetConfirmModal';
 import ScreenWrapper from '@components/ScreenWrapper';
 import useCloseImportPage from '@hooks/useCloseImportPage';
-import useCurrencyList from '@hooks/useCurrencyList';
 import useLocalize from '@hooks/useLocalize';
 import useOnyx from '@hooks/useOnyx';
 import usePolicy from '@hooks/usePolicy';
 import {generateCustomUnitID, importPerDiemRates} from '@libs/actions/Policy/PerDiem';
+import {sanitizeCurrencyCode} from '@libs/CurrencyUtils';
 import {findDuplicate, generateColumnNames} from '@libs/importSpreadsheetUtils';
 import Navigation from '@libs/Navigation/Navigation';
 import type {PlatformStackScreenProps} from '@libs/Navigation/PlatformStackNavigation/types';
@@ -49,7 +49,6 @@ function generatePerDiemUnits(perDiemDestination: string[], perDiemSubRate: stri
 type ImportedPerDiemPageProps = PlatformStackScreenProps<SettingsNavigatorParamList, typeof SCREENS.WORKSPACE.PER_DIEM_IMPORTED>;
 function ImportedPerDiemPage({route}: ImportedPerDiemPageProps) {
     const {translate} = useLocalize();
-    const {currencyList} = useCurrencyList();
     const [spreadsheet, spreadsheetMetadata] = useOnyx(ONYXKEYS.IMPORTED_SPREADSHEET, {canBeMissing: true});
     const [isImportingPerDiemRates, setIsImportingPerDiemRates] = useState(false);
     const {containsHeader = true} = spreadsheet ?? {};
@@ -77,34 +76,26 @@ function ImportedPerDiemPage({route}: ImportedPerDiemPageProps) {
 
     const requiredColumns = columnRoles.filter((role) => role.isRequired).map((role) => role);
 
-    const sanitizeCurrencyCode = (currencyCode: string) => {
-        if (currencyList[currencyCode]) {
-            return currencyCode;
-        }
-        // If the currency code is not found in the currency list, default to USD
-        return CONST.CURRENCY.USD;
-    };
-
-    const validate = () => {
+    const validate = useCallback(() => {
         const columns = Object.values(spreadsheet?.columns ?? {});
         let errors: Errors = {};
 
         const missingRequiredColumns = requiredColumns.find((requiredColumn) => !columns.includes(requiredColumn.value));
         if (missingRequiredColumns) {
-            errors.required = translate('spreadsheet.fieldNotMapped', missingRequiredColumns.text);
+            errors.required = translate('spreadsheet.fieldNotMapped', {fieldName: missingRequiredColumns.text});
         } else {
             const duplicate = findDuplicate(columns);
             const duplicateColumn = columnRoles.find((role) => role.value === duplicate);
             if (duplicateColumn) {
-                errors.duplicates = translate('spreadsheet.singleFieldMultipleColumns', duplicateColumn.text);
+                errors.duplicates = translate('spreadsheet.singleFieldMultipleColumns', {fieldName: duplicateColumn.text});
             } else {
                 errors = {};
             }
         }
         return errors;
-    };
+    }, [requiredColumns, spreadsheet?.columns, translate, columnRoles]);
 
-    const importRates = () => {
+    const importRates = useCallback(() => {
         setIsValidationEnabled(true);
         const errors = validate();
         if (Object.keys(errors).length > 0 || !perDiemCustomUnit?.customUnitID) {
@@ -133,7 +124,7 @@ function ImportedPerDiemPage({route}: ImportedPerDiemPageProps) {
             setIsImportingPerDiemRates(true);
             importPerDiemRates(policyID, perDiemCustomUnit.customUnitID, perDiemUnits, rowsLength);
         }
-    };
+    }, [validate, spreadsheet?.columns, spreadsheet?.data, containsHeader, policyID, perDiemCustomUnit?.customUnitID]);
 
     if (!spreadsheet && isLoadingOnyxValue(spreadsheetMetadata)) {
         return;
diff --git a/src/pages/workspace/perDiem/WorkspacePerDiemDetailsPage.tsx b/src/pages/workspace/perDiem/WorkspacePerDiemDetailsPage.tsx
index 80d710b0606d..7cf872eb2260 100644
--- a/src/pages/workspace/perDiem/WorkspacePerDiemDetailsPage.tsx
+++ b/src/pages/workspace/perDiem/WorkspacePerDiemDetailsPage.tsx
@@ -6,12 +6,11 @@ import MenuItem from '@components/MenuItem';
 import MenuItemWithTopDescription from '@components/MenuItemWithTopDescription';
 import ScreenWrapper from '@components/ScreenWrapper';
 import ScrollView from '@components/ScrollView';
-import useCurrencyList from '@hooks/useCurrencyList';
 import useLocalize from '@hooks/useLocalize';
 import useOnyx from '@hooks/useOnyx';
 import usePrevious from '@hooks/usePrevious';
 import useThemeStyles from '@hooks/useThemeStyles';
-import {convertToDisplayStringWithoutCurrency} from '@libs/CurrencyUtils';
+import {convertToDisplayStringWithoutCurrency, getCurrencySymbol} from '@libs/CurrencyUtils';
 import Navigation from '@libs/Navigation/Navigation';
 import type {PlatformStackScreenProps} from '@libs/Navigation/PlatformStackNavigation/types';
 import {getPerDiemCustomUnit} from '@libs/PolicyUtils';
@@ -35,7 +34,6 @@ function WorkspacePerDiemDetailsPage({route}: WorkspacePerDiemDetailsPageProps)
 
     const styles = useThemeStyles();
     const {translate} = useLocalize();
-    const {getCurrencySymbol} = useCurrencyList();
     const customUnit = getPerDiemCustomUnit(policy);
 
     const selectedRate = customUnit?.rates?.[rateID];
diff --git a/src/pages/workspace/receiptPartners/ChangeReceiptBillingAccountPage.tsx b/src/pages/workspace/receiptPartners/ChangeReceiptBillingAccountPage.tsx
index 909f2405de4f..eccd3cbd8f61 100644
--- a/src/pages/workspace/receiptPartners/ChangeReceiptBillingAccountPage.tsx
+++ b/src/pages/workspace/receiptPartners/ChangeReceiptBillingAccountPage.tsx
@@ -1,4 +1,4 @@
-import React, {useEffect, useState} from 'react';
+import React, {useCallback, useEffect, useMemo, useState} from 'react';
 import HeaderWithBackButton from '@components/HeaderWithBackButton';
 import ScreenWrapper from '@components/ScreenWrapper';
 import SelectionList from '@components/SelectionList';
@@ -46,8 +46,12 @@ function ChangeReceiptBillingAccountPage({route}: ChangeReceiptBillingAccountPag
 
     const shouldShowTextInput = policy?.employeeList && Object.keys(policy.employeeList).length >= CONST.STANDARD_LIST_ITEM_LIMIT;
     const textInputLabel = shouldShowTextInput ? translate('common.search') : undefined;
-    let workspaceMembers: MemberForList[] = [];
-    if (policy?.employeeList) {
+    const workspaceMembers = useMemo(() => {
+        let membersList: MemberForList[] = [];
+        if (!policy?.employeeList) {
+            return membersList;
+        }
+
         for (const [email, policyEmployee] of Object.entries(policy.employeeList)) {
             if (isDeletedPolicyEmployee(policyEmployee, isOffline)) {
                 continue;
@@ -73,20 +77,30 @@ function ChangeReceiptBillingAccountPage({route}: ChangeReceiptBillingAccountPag
                     isSelected: email === selectedOption || personalDetail?.login === selectedOption,
                 });
 
-                workspaceMembers.push(memberForList);
+                membersList.push(memberForList);
             }
         }
 
-        workspaceMembers = sortAlphabetically(workspaceMembers, 'text', localeCompare);
-    }
+        membersList = sortAlphabetically(membersList, 'text', localeCompare);
+
+        return membersList;
+    }, [policy?.employeeList, localeCompare, isOffline, icons.FallbackAvatar, selectedOption]);
+
+    const data = useMemo(() => {
+        if (workspaceMembers.length === 0) {
+            return [];
+        }
+
+        let membersToDisplay = workspaceMembers;
+
+        // Apply search filter if there's a search term
+        if (debouncedSearchTerm) {
+            const searchValue = getSearchValueForPhoneOrEmail(debouncedSearchTerm, countryCode).toLowerCase();
+            membersToDisplay = tokenizedSearch(workspaceMembers, searchValue, (option) => [option.text ?? '', option.alternateText ?? '']);
+        }
 
-    let data = workspaceMembers;
-    if (debouncedSearchTerm && workspaceMembers.length > 0) {
-        const searchValue = getSearchValueForPhoneOrEmail(debouncedSearchTerm, countryCode).toLowerCase();
-        data = tokenizedSearch(workspaceMembers, searchValue, (option) => [option.text ?? '', option.alternateText ?? '']);
-    } else if (workspaceMembers.length === 0) {
-        data = [];
-    }
+        return membersToDisplay;
+    }, [workspaceMembers, countryCode, debouncedSearchTerm]);
 
     useEffect(() => {
         if (!centralBillingAccountEmail) {
@@ -95,25 +109,34 @@ function ChangeReceiptBillingAccountPage({route}: ChangeReceiptBillingAccountPag
         setSelectedOption(centralBillingAccountEmail);
     }, [centralBillingAccountEmail]);
 
-    const toggleOption = (option: MemberForList) => {
-        if (!centralBillingAccountEmail) {
-            return;
-        }
-        setSelectedOption(option.login);
+    const toggleOption = useCallback(
+        (option: MemberForList) => {
+            if (!centralBillingAccountEmail) {
+                return;
+            }
+            setSelectedOption(option.login);
 
-        changePolicyUberBillingAccount(policyID, option.login, centralBillingAccountEmail);
-        Navigation.goBack();
-    };
+            changePolicyUberBillingAccount(policyID, option.login, centralBillingAccountEmail);
+            Navigation.goBack();
+        },
+        [policyID, centralBillingAccountEmail],
+    );
+
+    const headerMessage = useMemo(() => {
+        const searchValue = debouncedSearchTerm.trim().toLowerCase();
 
-    const searchValue = debouncedSearchTerm.trim().toLowerCase();
-    const headerMessage = getHeaderMessage(data.length !== 0, false, searchValue, countryCode);
+        return getHeaderMessage(data.length !== 0, false, searchValue, countryCode);
+    }, [debouncedSearchTerm, data.length, countryCode]);
 
-    const textInputOptions = {
-        label: textInputLabel,
-        value: searchTerm,
-        onChangeText: setSearchTerm,
-        headerMessage,
-    };
+    const textInputOptions = useMemo(
+        () => ({
+            label: textInputLabel,
+            value: searchTerm,
+            onChangeText: setSearchTerm,
+            headerMessage,
+        }),
+        [headerMessage, searchTerm, setSearchTerm, textInputLabel],
+    );
 
     return (
         <AccessOrNotFoundWrapper
diff --git a/src/pages/workspace/receiptPartners/InviteReceiptPartnerPolicyPage.tsx b/src/pages/workspace/receiptPartners/InviteReceiptPartnerPolicyPage.tsx
index a39f9ae8939b..a78d83072865 100644
--- a/src/pages/workspace/receiptPartners/InviteReceiptPartnerPolicyPage.tsx
+++ b/src/pages/workspace/receiptPartners/InviteReceiptPartnerPolicyPage.tsx
@@ -1,4 +1,4 @@
-import React, {useEffect, useState} from 'react';
+import React, {useCallback, useEffect, useMemo, useState} from 'react';
 import ConfirmationPage from '@components/ConfirmationPage';
 import HeaderWithBackButton from '@components/HeaderWithBackButton';
 // eslint-disable-next-line no-restricted-imports
@@ -44,9 +44,12 @@ function InviteReceiptPartnerPolicyPage({route}: InviteReceiptPartnerPolicyPageP
     const policyID = route.params?.policyID;
     const policy = usePolicy(policyID);
     const shouldShowTextInput = policy?.employeeList && Object.keys(policy.employeeList).length >= CONST.STANDARD_LIST_ITEM_LIMIT;
-    const textInputLabel = shouldShowTextInput ? translate('common.search') : undefined;
-    const workspaceMembers: MemberForList[] = [];
-    if (policy?.employeeList) {
+    const workspaceMembers = useMemo(() => {
+        let membersList: MemberForList[] = [];
+        if (!policy?.employeeList) {
+            return membersList;
+        }
+
         // Get the list of employees from the U4B organization
         const uberEmployees = policy?.receiptPartners?.uber?.employees ?? {};
 
@@ -85,15 +88,20 @@ function InviteReceiptPartnerPolicyPage({route}: InviteReceiptPartnerPolicyPageP
                     isSelected: true,
                 });
 
-                workspaceMembers.push(memberForList);
+                membersList.push(memberForList);
             }
         }
 
-        sortAlphabetically(workspaceMembers, 'text', localeCompare);
-    }
+        membersList = sortAlphabetically(membersList, 'text', localeCompare);
+
+        return membersList;
+    }, [policy?.employeeList, policy?.receiptPartners?.uber?.employees, localeCompare, isOffline, icons.FallbackAvatar]);
+
+    const data = useMemo(() => {
+        if (workspaceMembers.length === 0) {
+            return [];
+        }
 
-    const allMembersWithState: MemberForList[] = [];
-    if (workspaceMembers.length > 0) {
         let membersToDisplay = workspaceMembers;
 
         // Apply search filter if there's a search term
@@ -116,13 +124,16 @@ function InviteReceiptPartnerPolicyPage({route}: InviteReceiptPartnerPolicyPageP
         const selectedLogins = new Set(selectedOptions.map(({login}) => login));
         const unselectedMembers = membersToDisplay.filter(({login}) => !selectedLogins.has(login));
 
+        const allMembersWithState: MemberForList[] = [];
         for (const member of filterSelectedOptions) {
             allMembersWithState.push({...member, isSelected: true});
         }
         for (const member of unselectedMembers) {
             allMembersWithState.push({...member, isSelected: false});
         }
-    }
+
+        return allMembersWithState;
+    }, [workspaceMembers, countryCode, debouncedSearchTerm, selectedOptions]);
 
     // Pre-select all members only once on first load.
     useEffect(() => {
@@ -137,25 +148,31 @@ function InviteReceiptPartnerPolicyPage({route}: InviteReceiptPartnerPolicyPageP
         });
     }, [workspaceMembers]);
 
-    const toggleOption = (option: MemberForList) => {
-        clearErrors(policyID);
+    const toggleOption = useCallback(
+        (option: MemberForList) => {
+            clearErrors(policyID);
 
-        const isOptionInList = selectedOptions.some((selectedOption) => selectedOption.login === option.login);
+            const isOptionInList = selectedOptions.some((selectedOption) => selectedOption.login === option.login);
 
-        let newSelectedOptions: MemberForList[];
-        if (isOptionInList) {
-            newSelectedOptions = selectedOptions.filter((selectedOption) => selectedOption.login !== option.login);
-        } else {
-            newSelectedOptions = [...selectedOptions, {...option, isSelected: true}];
-        }
+            let newSelectedOptions: MemberForList[];
+            if (isOptionInList) {
+                newSelectedOptions = selectedOptions.filter((selectedOption) => selectedOption.login !== option.login);
+            } else {
+                newSelectedOptions = [...selectedOptions, {...option, isSelected: true}];
+            }
+
+            setSelectedOptions(newSelectedOptions);
+        },
+        [selectedOptions, policyID],
+    );
 
-        setSelectedOptions(newSelectedOptions);
-    };
+    const headerMessage = useMemo(() => {
+        const searchValue = debouncedSearchTerm.trim().toLowerCase();
 
-    const searchValue = debouncedSearchTerm.trim().toLowerCase();
-    const headerMessage = getHeaderMessage(allMembersWithState.length !== 0, false, searchValue, countryCode, false);
+        return getHeaderMessage(data.length !== 0, false, searchValue, countryCode, false);
+    }, [debouncedSearchTerm, data.length, countryCode]);
 
-    const handleConfirm = () => {
+    const handleConfirm = useCallback(() => {
         if (selectedOptions.length === 0) {
             return;
         }
@@ -164,29 +181,38 @@ function InviteReceiptPartnerPolicyPage({route}: InviteReceiptPartnerPolicyPageP
 
         inviteWorkspaceEmployeesToUber(policyID, emails);
         setIsInvitationSent(true);
-    };
+    }, [selectedOptions, policyID]);
 
-    const handleGotIt = () => {
+    const handleGotIt = useCallback(() => {
         Navigation.dismissModal();
-    };
+    }, []);
 
     // Check if we should skip to "All set" page immediately
-    const shouldSkipToAllSet = workspaceMembers.length === 0;
-
-    const confirmButtonOptions = {
-        showButton: true,
-        onConfirm: handleConfirm,
-        text: translate('workspace.receiptPartners.uber.confirm'),
-        isDisabled: selectedOptions.length === 0,
-    };
-
-    const textInputOptions = {
-        headerMessage,
-        label: textInputLabel,
-        value: searchTerm,
-        onChangeText: setSearchTerm,
-        shouldBeInsideList: true,
-    };
+    const shouldSkipToAllSet = useMemo(() => {
+        // Skip if no workspace members can be invited (covers all cases: no employees, only owner, already linked)
+        return workspaceMembers.length === 0;
+    }, [workspaceMembers.length]);
+
+    const confirmButtonOptions = useMemo(
+        () => ({
+            showButton: true,
+            onConfirm: handleConfirm,
+            text: translate('workspace.receiptPartners.uber.confirm'),
+            isDisabled: selectedOptions.length === 0,
+        }),
+        [handleConfirm, selectedOptions.length, translate],
+    );
+
+    const textInputOptions = useMemo(
+        () => ({
+            headerMessage,
+            label: shouldShowTextInput ? translate('common.search') : undefined,
+            value: searchTerm,
+            onChangeText: setSearchTerm,
+            shouldBeInsideList: true,
+        }),
+        [headerMessage, searchTerm, setSearchTerm, shouldShowTextInput, translate],
+    );
 
     if (isInvitationSent || shouldSkipToAllSet) {
         return (
@@ -221,7 +247,7 @@ function InviteReceiptPartnerPolicyPage({route}: InviteReceiptPartnerPolicyPageP
                     onBackButtonPress={() => Navigation.goBack()}
                 />
                 <SelectionList
-                    data={allMembersWithState}
+                    data={data}
                     ListItem={UserListItem}
                     onSelectRow={toggleOption}
                     customListHeader={<Text style={[styles.ph5, styles.pb3]}>{translate('workspace.receiptPartners.uber.sendInvitesDescription')}</Text>}
diff --git a/src/pages/workspace/receiptPartners/WorkspaceReceiptPartnersPage.tsx b/src/pages/workspace/receiptPartners/WorkspaceReceiptPartnersPage.tsx
index 502772883b59..458f2f201527 100644
--- a/src/pages/workspace/receiptPartners/WorkspaceReceiptPartnersPage.tsx
+++ b/src/pages/workspace/receiptPartners/WorkspaceReceiptPartnersPage.tsx
@@ -1,8 +1,8 @@
 import React, {useCallback, useEffect, useMemo, useRef, useState} from 'react';
 import {View} from 'react-native';
+import ActivityIndicator from '@components/ActivityIndicator';
 import Button from '@components/Button';
 import ConfirmModal from '@components/ConfirmModal';
-import FullScreenLoadingIndicator from '@components/FullscreenLoadingIndicator';
 import HeaderWithBackButton from '@components/HeaderWithBackButton';
 // eslint-disable-next-line no-restricted-imports
 import * as Expensicons from '@components/Icon/Expensicons';
@@ -256,8 +256,8 @@ function WorkspaceReceiptPartnersPage({route}: WorkspaceReceiptPartnersPageProps
             featureName={CONST.POLICY.MORE_FEATURES.ARE_RECEIPT_PARTNERS_ENABLED}
         >
             {isLoading ? (
-                <FullScreenLoadingIndicator
-                    shouldUseGoBackButton
+                <ActivityIndicator
+                    size={CONST.ACTIVITY_INDICATOR_SIZE.LARGE}
                     style={styles.flex1}
                 />
             ) : (
diff --git a/src/pages/workspace/reports/ReportFieldsAddListValuePage.tsx b/src/pages/workspace/reports/ReportFieldsAddListValuePage.tsx
index 31e2e8dc025e..006eb70829fe 100644
--- a/src/pages/workspace/reports/ReportFieldsAddListValuePage.tsx
+++ b/src/pages/workspace/reports/ReportFieldsAddListValuePage.tsx
@@ -51,8 +51,8 @@ function ReportFieldsAddListValuePage({
 
     const validate = useCallback(
         (values: FormOnyxValues<typeof ONYXKEYS.FORMS.WORKSPACE_REPORT_FIELDS_FORM>) =>
-            validateReportFieldListValueName(values[INPUT_IDS.VALUE_NAME].trim(), '', listValues, INPUT_IDS.VALUE_NAME, translate),
-        [listValues, translate],
+            validateReportFieldListValueName(values[INPUT_IDS.VALUE_NAME].trim(), '', listValues, INPUT_IDS.VALUE_NAME),
+        [listValues],
     );
 
     const createValue = useCallback(
diff --git a/src/pages/workspace/reports/ReportFieldsEditValuePage.tsx b/src/pages/workspace/reports/ReportFieldsEditValuePage.tsx
index be5e32401ae0..6035a251f55d 100644
--- a/src/pages/workspace/reports/ReportFieldsEditValuePage.tsx
+++ b/src/pages/workspace/reports/ReportFieldsEditValuePage.tsx
@@ -41,8 +41,8 @@ function ReportFieldsEditValuePage({
 
     const validate = useCallback(
         (values: FormOnyxValues<typeof ONYXKEYS.FORMS.WORKSPACE_REPORT_FIELDS_FORM>) =>
-            validateReportFieldListValueName(values[INPUT_IDS.NEW_VALUE_NAME].trim(), currentValueName, formDraft?.[INPUT_IDS.LIST_VALUES] ?? [], INPUT_IDS.NEW_VALUE_NAME, translate),
-        [currentValueName, formDraft, translate],
+            validateReportFieldListValueName(values[INPUT_IDS.NEW_VALUE_NAME].trim(), currentValueName, formDraft?.[INPUT_IDS.LIST_VALUES] ?? [], INPUT_IDS.NEW_VALUE_NAME),
+        [currentValueName, formDraft],
     );
 
     const editValue = useCallback(
diff --git a/src/pages/workspace/reports/ReportFieldsInitialValuePage.tsx b/src/pages/workspace/reports/ReportFieldsInitialValuePage.tsx
index 96ccdb309700..3415567625f0 100644
--- a/src/pages/workspace/reports/ReportFieldsInitialValuePage.tsx
+++ b/src/pages/workspace/reports/ReportFieldsInitialValuePage.tsx
@@ -42,7 +42,7 @@ function ReportFieldsInitialValuePage({
 
     const reportField = policy?.fieldList?.[getReportFieldKey(reportFieldID)] ?? null;
     const availableListValuesLength = (reportField?.disabledOptions ?? []).filter((disabledListValue) => !disabledListValue).length;
-    const currentInitialValue = getReportFieldInitialValue(reportField, translate);
+    const currentInitialValue = getReportFieldInitialValue(reportField);
     const [initialValue, setInitialValue] = useState(currentInitialValue);
 
     const submitForm = useCallback(
diff --git a/src/pages/workspace/reports/ReportFieldsSettingsPage.tsx b/src/pages/workspace/reports/ReportFieldsSettingsPage.tsx
index 26941cdd2347..b032c4b64289 100644
--- a/src/pages/workspace/reports/ReportFieldsSettingsPage.tsx
+++ b/src/pages/workspace/reports/ReportFieldsSettingsPage.tsx
@@ -111,7 +111,7 @@ function ReportFieldsSettingsPage({
                         <MenuItemWithTopDescription
                             style={[styles.moneyRequestMenuItem]}
                             titleStyle={styles.flex1}
-                            title={getReportFieldInitialValue(reportField, translate)}
+                            title={getReportFieldInitialValue(reportField)}
                             description={translate('common.initialValue')}
                             shouldShowRightIcon={!isDateFieldType}
                             interactive={!isDateFieldType}
diff --git a/src/pages/workspace/reports/WorkspaceReportsPage.tsx b/src/pages/workspace/reports/WorkspaceReportsPage.tsx
index a4a2a3d7bacf..0b1990b0b0be 100644
--- a/src/pages/workspace/reports/WorkspaceReportsPage.tsx
+++ b/src/pages/workspace/reports/WorkspaceReportsPage.tsx
@@ -1,7 +1,7 @@
 import {FlashList} from '@shopify/flash-list';
 import type {ListRenderItemInfo} from '@shopify/flash-list';
 import {Str} from 'expensify-common';
-import React, {useEffect, useMemo, useState} from 'react';
+import React, {useCallback, useEffect, useMemo, useState} from 'react';
 import {View} from 'react-native';
 import ActivityIndicator from '@components/ActivityIndicator';
 import ConfirmModal from '@components/ConfirmModal';
@@ -71,40 +71,56 @@ function WorkspaceReportFieldsPage({
     const isConnectionVerified = connectedIntegration && !isConnectionUnverified(policy, connectedIntegration);
     const currentConnectionName = getCurrentConnectionName(policy);
     const hasAccountingConnections = hasAccountingConnectionsPolicyUtils(policy);
+    const filteredPolicyFieldList = useMemo(() => {
+        if (!policy?.fieldList) {
+            return {};
+        }
+        // eslint-disable-next-line @typescript-eslint/no-unused-vars
+        return Object.fromEntries(Object.entries(policy.fieldList).filter(([_, value]) => value.fieldID !== 'text_title'));
+    }, [policy?.fieldList]);
     const [isOrganizeWarningModalOpen, setIsOrganizeWarningModalOpen] = useState(false);
 
     const illustrations = useMemoizedLazyIllustrations(['ReportReceipt']);
 
-    const onDisabledOrganizeSwitchPress = () => {
+    const onDisabledOrganizeSwitchPress = useCallback(() => {
         if (!hasAccountingConnections) {
             return;
         }
         setIsOrganizeWarningModalOpen(true);
-    };
+    }, [hasAccountingConnections]);
 
-    const {isOffline} = useNetwork({onReconnect: () => openPolicyReportFieldsPage(policyID)});
-
-    useEffect(() => {
+    const fetchReportFields = useCallback(() => {
         openPolicyReportFieldsPage(policyID);
     }, [policyID]);
 
-    const reportFieldsSections: ReportFieldForList[] = policy?.fieldList
-        ? Object.entries(policy.fieldList)
-              .filter(([, value]) => value.fieldID !== 'text_title')
-              .map(([, reportField]) => ({
-                  text: reportField.name,
-                  keyForList: String(reportField.fieldID),
-                  fieldID: reportField.fieldID,
-                  pendingAction: reportField.pendingAction,
-                  isDisabled: reportField.pendingAction === CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE,
-                  rightLabel: Str.recapitalize(translate(getReportFieldTypeTranslationKey(reportField.type ?? CONST.REPORT_FIELD_TYPES.TEXT))),
-              }))
-              .sort((a, b) => localeCompare(a.text, b.text))
-        : [];
+    const {isOffline} = useNetwork({onReconnect: fetchReportFields});
 
-    const navigateToReportFieldsSettings = (reportField: ReportFieldForList) => {
-        Navigation.navigate(ROUTES.WORKSPACE_REPORT_FIELDS_SETTINGS.getRoute(policyID, reportField.fieldID));
-    };
+    useEffect(() => {
+        fetchReportFields();
+    }, [fetchReportFields]);
+
+    const reportFieldsSections = useMemo(() => {
+        if (!policy) {
+            return [];
+        }
+        return Object.values(filteredPolicyFieldList)
+            .sort((a, b) => localeCompare(a.name, b.name))
+            .map((reportField) => ({
+                text: reportField.name,
+                keyForList: String(reportField.fieldID),
+                fieldID: reportField.fieldID,
+                pendingAction: reportField.pendingAction,
+                isDisabled: reportField.pendingAction === CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE,
+                rightLabel: Str.recapitalize(translate(getReportFieldTypeTranslationKey(reportField.type))),
+            }));
+    }, [filteredPolicyFieldList, policy, translate, localeCompare]);
+
+    const navigateToReportFieldsSettings = useCallback(
+        (reportField: ReportFieldForList) => {
+            Navigation.navigate(ROUTES.WORKSPACE_REPORT_FIELDS_SETTINGS.getRoute(policyID, reportField.fieldID));
+        },
+        [policyID],
+    );
 
     const getHeaderText = () =>
         !hasSyncError && isConnectionVerified && currentConnectionName ? (
@@ -122,19 +138,23 @@ function WorkspaceReportFieldsPage({
 
     const isLoading = !isOffline && policy === undefined;
 
-    const renderItem = ({item}: ListRenderItemInfo<ReportFieldForList>) => (
-        <OfflineWithFeedback pendingAction={item.pendingAction}>
-            <MenuItem
-                style={shouldUseNarrowLayout ? styles.ph5 : styles.ph8}
-                onPress={() => navigateToReportFieldsSettings(item)}
-                description={item.text}
-                disabled={item.isDisabled}
-                shouldShowRightIcon={!item.isDisabled}
-                interactive={!item.isDisabled}
-                rightLabel={item.rightLabel}
-                descriptionTextStyle={[styles.popoverMenuText, styles.textStrong]}
-            />
-        </OfflineWithFeedback>
+    const renderItem = useCallback(
+        ({item}: ListRenderItemInfo<ReportFieldForList>) => (
+            <OfflineWithFeedback pendingAction={item.pendingAction}>
+                <MenuItem
+                    style={shouldUseNarrowLayout ? styles.ph5 : styles.ph8}
+                    onPress={() => navigateToReportFieldsSettings(item)}
+                    description={item.text}
+                    disabled={item.isDisabled}
+                    shouldShowRightIcon={!item.isDisabled}
+                    interactive={!item.isDisabled}
+                    rightLabel={item.rightLabel}
+                    descriptionTextStyle={[styles.popoverMenuText, styles.textStrong]}
+                />
+            </OfflineWithFeedback>
+        ),
+
+        [shouldUseNarrowLayout, styles.ph5, styles.ph8, styles.popoverMenuText, styles.textStrong, navigateToReportFieldsSettings],
     );
 
     const titleFieldError = policy?.errorFields?.fieldList?.[CONST.POLICY.FIELDS.FIELD_LIST_TITLE];
@@ -146,29 +166,28 @@ function WorkspaceReportFieldsPage({
         clearPolicyTitleFieldError(policyID);
     };
 
-    const toggleTitleStyle = [styles.pv2, styles.pr3];
+    const toggleTitleStyle = useMemo(() => [styles.pv2, styles.pr3], [styles.pv2, styles.pr3]);
 
-    const renderReportTitle = () => (
-        <OfflineWithFeedback pendingAction={policy?.pendingAction}>
-            <Text style={[styles.textHeadline, styles.cardSectionTitle, styles.accountSettingsSectionTitle, styles.mb1]}>{translate('workspace.common.reportTitle')}</Text>
-        </OfflineWithFeedback>
+    const renderReportTitle = useCallback(
+        () => (
+            <OfflineWithFeedback pendingAction={policy?.pendingAction}>
+                <Text style={[styles.textHeadline, styles.cardSectionTitle, styles.accountSettingsSectionTitle, styles.mb1]}>{translate('workspace.common.reportTitle')}</Text>
+            </OfflineWithFeedback>
+        ),
+        [policy?.pendingAction, styles.textHeadline, styles.cardSectionTitle, styles.accountSettingsSectionTitle, styles.mb1, translate],
     );
 
-    const renderReportSubtitle = () => (
-        <OfflineWithFeedback pendingAction={policy?.pendingAction}>
-            <View style={[[styles.renderHTML, styles.mt1]]}>
-                <RenderHTML html={translate('workspace.reports.customReportNamesSubtitle')} />
-            </View>
-        </OfflineWithFeedback>
+    const renderReportSubtitle = useCallback(
+        () => (
+            <OfflineWithFeedback pendingAction={policy?.pendingAction}>
+                <View style={[[styles.renderHTML, styles.mt1]]}>
+                    <RenderHTML html={translate('workspace.reports.customReportNamesSubtitle')} />
+                </View>
+            </OfflineWithFeedback>
+        ),
+        [policy?.pendingAction, styles.renderHTML, styles.mt1, translate],
     );
 
-    const reportFieldsAccessibilityLabel = useMemo(() => {
-        if (!hasSyncError && isConnectionVerified && currentConnectionName) {
-            return `${translate('workspace.common.reportFields')}, ${translate('workspace.reportFields.importedFromAccountingSoftware')} ${currentConnectionName} ${translate('workspace.accounting.settings')}`;
-        }
-        return `${translate('workspace.common.reportFields')}, ${translate('workspace.reportFields.subtitle')}`;
-    }, [hasSyncError, isConnectionVerified, currentConnectionName, translate]);
-
     return (
         <AccessOrNotFoundWrapper
             policyID={policyID}
@@ -212,7 +231,7 @@ function WorkspaceReportFieldsPage({
                             >
                                 <MenuItemWithTopDescription
                                     description={translate('workspace.reports.customNameTitle')}
-                                    title={Str.htmlDecode(policy?.fieldList?.[CONST.POLICY.FIELDS.FIELD_LIST_TITLE]?.defaultValue ?? '')}
+                                    title={Str.htmlDecode(policy?.fieldList?.[CONST.POLICY.FIELDS.FIELD_LIST_TITLE].defaultValue ?? '')}
                                     shouldShowRightIcon
                                     style={[styles.sectionMenuItemTopDescription, styles.mt6]}
                                     onPress={() => Navigation.navigate(ROUTES.REPORTS_DEFAULT_TITLE.getRoute(policyID))}
@@ -224,7 +243,7 @@ function WorkspaceReportFieldsPage({
                                 switchAccessibilityLabel={translate('workspace.reports.preventMembersFromChangingCustomNamesTitle')}
                                 wrapperStyle={[styles.sectionMenuItemTopDescription, styles.mt3]}
                                 titleStyle={toggleTitleStyle}
-                                isActive={policy?.fieldList?.[CONST.POLICY.FIELDS.FIELD_LIST_TITLE]?.deletable === false}
+                                isActive={!policy?.fieldList?.[CONST.POLICY.FIELDS.FIELD_LIST_TITLE].deletable}
                                 onToggle={(isEnabled) => {
                                     if (isEnabled && !isControlPolicy(policy)) {
                                         Navigation.navigate(
@@ -248,7 +267,7 @@ function WorkspaceReportFieldsPage({
                             <ToggleSettingOptionRow
                                 pendingAction={policy?.pendingFields?.areReportFieldsEnabled}
                                 title={translate('workspace.common.reportFields')}
-                                switchAccessibilityLabel={reportFieldsAccessibilityLabel}
+                                switchAccessibilityLabel={translate('workspace.common.reportFields')}
                                 subtitle={getHeaderText()}
                                 titleStyle={[styles.textHeadline, styles.cardSectionTitle, styles.accountSettingsSectionTitle, styles.mb1]}
                                 isActive={!!policy?.areReportFieldsEnabled}
diff --git a/src/pages/workspace/rules/IndividualExpenseRulesSection.tsx b/src/pages/workspace/rules/IndividualExpenseRulesSection.tsx
index 92dfa627fba8..c79e070306e2 100644
--- a/src/pages/workspace/rules/IndividualExpenseRulesSection.tsx
+++ b/src/pages/workspace/rules/IndividualExpenseRulesSection.tsx
@@ -1,4 +1,4 @@
-import React, {useCallback, useMemo} from 'react';
+import React, {useMemo} from 'react';
 import {View} from 'react-native';
 import type {LocaleContextProps} from '@components/LocaleContextProvider';
 import MenuItemWithTopDescription from '@components/MenuItemWithTopDescription';
@@ -8,10 +8,8 @@ import Section from '@components/Section';
 import useCardFeeds from '@hooks/useCardFeeds';
 import useEnvironment from '@hooks/useEnvironment';
 import useLocalize from '@hooks/useLocalize';
-import useOnyx from '@hooks/useOnyx';
 import usePolicy from '@hooks/usePolicy';
 import useThemeStyles from '@hooks/useThemeStyles';
-import {setPolicyCategoryAttendeesRequired} from '@libs/actions/Policy/Category';
 import {getCashExpenseReimbursableMode, setPolicyAttendeeTrackingEnabled, setPolicyRequireCompanyCardsEnabled, setWorkspaceEReceiptsEnabled} from '@libs/actions/Policy/Policy';
 import {convertToDisplayString} from '@libs/CurrencyUtils';
 import Navigation from '@libs/Navigation/Navigation';
@@ -19,7 +17,6 @@ import ToggleSettingOptionRow from '@pages/workspace/workflows/ToggleSettingsOpt
 import type {ThemeStyles} from '@styles/index';
 import CONST from '@src/CONST';
 import type {TranslationPaths} from '@src/languages/types';
-import ONYXKEYS from '@src/ONYXKEYS';
 import ROUTES from '@src/ROUTES';
 import type {Policy} from '@src/types/onyx';
 import type {PendingAction} from '@src/types/onyx/OnyxCommon';
@@ -64,7 +61,7 @@ function IndividualExpenseRulesSectionSubtitle({policy, translate, styles, envir
 
     return (
         <View style={[styles.flexRow, styles.renderHTML, styles.w100, styles.mt2]}>
-            <RenderHTML html={translate('workspace.rules.individualExpenseRules.subtitle', categoriesPageLink, tagsPageLink)} />
+            <RenderHTML html={translate('workspace.rules.individualExpenseRules.subtitle', {categoriesPageLink, tagsPageLink})} />
         </View>
     );
 }
@@ -75,27 +72,9 @@ function IndividualExpenseRulesSection({policyID}: IndividualExpenseRulesSection
     const policy = usePolicy(policyID);
     const [cardFeeds] = useCardFeeds(policyID);
     const {environmentURL} = useEnvironment();
-    const [policyCategories] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY_CATEGORIES}${policyID}`, {canBeMissing: true});
 
     const policyCurrency = policy?.outputCurrency ?? CONST.CURRENCY.USD;
 
-    const handleAttendeeTrackingToggle = useCallback(
-        (newValue: boolean) => {
-            // When disabling attendee tracking, disable areAttendeesRequired on all categories
-            // that have it enabled in order to avoid BE validation errors
-            if (!newValue && policyCategories) {
-                for (const [categoryName, category] of Object.entries(policyCategories)) {
-                    if (!category?.areAttendeesRequired) {
-                        continue;
-                    }
-                    setPolicyCategoryAttendeesRequired(policyID, categoryName, false, policyCategories);
-                }
-            }
-            setPolicyAttendeeTrackingEnabled(policyID, newValue);
-        },
-        [policyID, policyCategories],
-    );
-
     const maxExpenseAmountNoReceiptText = useMemo(() => {
         if (policy?.maxExpenseAmountNoReceipt === CONST.DISABLED_MAX_EXPENSE_VALUE) {
             return '';
@@ -201,7 +180,7 @@ function IndividualExpenseRulesSection({policyID}: IndividualExpenseRulesSection
 
     // For backwards compatibility with Expensify Classic, we assume that Attendee Tracking is enabled by default on
     // Control policies if the policy does not contain the attribute
-    const isAttendeeTrackingEnabled = policy?.isAttendeeTrackingEnabled ?? false;
+    const isAttendeeTrackingEnabled = policy?.isAttendeeTrackingEnabled ?? true;
 
     return (
         <Section
@@ -270,7 +249,7 @@ function IndividualExpenseRulesSection({policyID}: IndividualExpenseRulesSection
                     titleStyle={styles.pv2}
                     subtitleStyle={styles.pt1}
                     isActive={isAttendeeTrackingEnabled}
-                    onToggle={() => handleAttendeeTrackingToggle(!isAttendeeTrackingEnabled)}
+                    onToggle={() => setPolicyAttendeeTrackingEnabled(policyID, !isAttendeeTrackingEnabled)}
                     pendingAction={policy?.pendingFields?.isAttendeeTrackingEnabled}
                 />
             </View>
diff --git a/src/pages/workspace/rules/RulesAutoPayReportsUnderPage.tsx b/src/pages/workspace/rules/RulesAutoPayReportsUnderPage.tsx
index 081773ea54be..1d2e68cee57e 100644
--- a/src/pages/workspace/rules/RulesAutoPayReportsUnderPage.tsx
+++ b/src/pages/workspace/rules/RulesAutoPayReportsUnderPage.tsx
@@ -8,11 +8,10 @@ import HeaderWithBackButton from '@components/HeaderWithBackButton';
 import ScreenWrapper from '@components/ScreenWrapper';
 import Text from '@components/Text';
 import useAutoFocusInput from '@hooks/useAutoFocusInput';
-import useCurrencyList from '@hooks/useCurrencyList';
 import useLocalize from '@hooks/useLocalize';
 import usePolicy from '@hooks/usePolicy';
 import useThemeStyles from '@hooks/useThemeStyles';
-import {convertToBackendAmount, convertToFrontendAmountAsString} from '@libs/CurrencyUtils';
+import {convertToBackendAmount, convertToFrontendAmountAsString, getCurrencySymbol} from '@libs/CurrencyUtils';
 import Navigation from '@libs/Navigation/Navigation';
 import type {PlatformStackScreenProps} from '@libs/Navigation/PlatformStackNavigation/types';
 import type {SettingsNavigatorParamList} from '@libs/Navigation/types';
@@ -31,7 +30,6 @@ function RulesAutoPayReportsUnderPage({route}: RulesAutoPayReportsUnderPageProps
 
     const {inputCallbackRef} = useAutoFocusInput();
     const {translate} = useLocalize();
-    const {getCurrencySymbol} = useCurrencyList();
     const styles = useThemeStyles();
 
     const currency = policy?.outputCurrency ?? CONST.CURRENCY.USD;
diff --git a/src/pages/workspace/rules/RulesCustomPage.tsx b/src/pages/workspace/rules/RulesCustomPage.tsx
index 4b6e27a7511d..bff5aa28d37a 100644
--- a/src/pages/workspace/rules/RulesCustomPage.tsx
+++ b/src/pages/workspace/rules/RulesCustomPage.tsx
@@ -43,7 +43,6 @@ function RulesCustomPage({
         <AccessOrNotFoundWrapper
             policyID={policyID}
             accessVariants={[CONST.POLICY.ACCESS_VARIANTS.ADMIN, CONST.POLICY.ACCESS_VARIANTS.PAID]}
-            featureName={CONST.POLICY.MORE_FEATURES.ARE_RULES_ENABLED}
         >
             <ScreenWrapper
                 enableEdgeToEdgeBottomSafeAreaPadding
diff --git a/src/pages/workspace/tags/ImportMultiLevelTagsSettingsPage.tsx b/src/pages/workspace/tags/ImportMultiLevelTagsSettingsPage.tsx
index 1b659aca2f42..6a33860cb440 100644
--- a/src/pages/workspace/tags/ImportMultiLevelTagsSettingsPage.tsx
+++ b/src/pages/workspace/tags/ImportMultiLevelTagsSettingsPage.tsx
@@ -78,7 +78,6 @@ function ImportMultiLevelTagsSettingsPage({route}: ImportMultiLevelTagsSettingsP
         <AccessOrNotFoundWrapper
             policyID={policyID}
             accessVariants={[CONST.POLICY.ACCESS_VARIANTS.ADMIN]}
-            featureName={CONST.POLICY.MORE_FEATURES.ARE_TAGS_ENABLED}
             fullPageNotFoundViewProps={{subtitleKey: isEmptyObject(policy) ? undefined : 'workspace.common.notAuthorized', onLinkPress: goBackFromInvalidPolicy}}
         >
             <ScreenWrapper
diff --git a/src/pages/workspace/tags/ImportTagsOptionsPage.tsx b/src/pages/workspace/tags/ImportTagsOptionsPage.tsx
index 5b5c80f75472..2d7604ee40dd 100644
--- a/src/pages/workspace/tags/ImportTagsOptionsPage.tsx
+++ b/src/pages/workspace/tags/ImportTagsOptionsPage.tsx
@@ -180,7 +180,6 @@ function ImportTagsOptionsPage({route}: ImportTagsOptionsPageProps) {
         <AccessOrNotFoundWrapper
             policyID={policyID}
             accessVariants={[CONST.POLICY.ACCESS_VARIANTS.ADMIN]}
-            featureName={CONST.POLICY.MORE_FEATURES.ARE_TAGS_ENABLED}
             fullPageNotFoundViewProps={{subtitleKey: isEmptyObject(policy) ? undefined : 'workspace.common.notAuthorized', onLinkPress: goBackFromInvalidPolicy}}
         >
             <ScreenWrapper
diff --git a/src/pages/workspace/tags/ImportTagsPage.tsx b/src/pages/workspace/tags/ImportTagsPage.tsx
index a062100fa591..5695f22c6fe2 100644
--- a/src/pages/workspace/tags/ImportTagsPage.tsx
+++ b/src/pages/workspace/tags/ImportTagsPage.tsx
@@ -37,7 +37,6 @@ function ImportTagsPage({route}: ImportTagsPageProps) {
         <AccessOrNotFoundWrapper
             policyID={policyID}
             accessVariants={[CONST.POLICY.ACCESS_VARIANTS.ADMIN]}
-            featureName={CONST.POLICY.MORE_FEATURES.ARE_TAGS_ENABLED}
             fullPageNotFoundViewProps={{subtitleKey: isEmptyObject(policy) ? undefined : 'workspace.common.notAuthorized', onLinkPress: goBackFromInvalidPolicy}}
         >
             <ImportSpreadsheet
diff --git a/src/pages/workspace/tags/ImportedTagsPage.tsx b/src/pages/workspace/tags/ImportedTagsPage.tsx
index 18f6689cc257..ddcf50a7454c 100644
--- a/src/pages/workspace/tags/ImportedTagsPage.tsx
+++ b/src/pages/workspace/tags/ImportedTagsPage.tsx
@@ -67,7 +67,7 @@ function ImportedTagsPage({route}: ImportedTagsPageProps) {
 
         const missingRequiredColumns = requiredColumns.find((requiredColumn) => !columns.includes(requiredColumn.value));
         if (missingRequiredColumns) {
-            errors.required = translate('spreadsheet.fieldNotMapped', missingRequiredColumns.text);
+            errors.required = translate('spreadsheet.fieldNotMapped', {fieldName: missingRequiredColumns.text});
         } else {
             const duplicate = findDuplicate(columns);
             const tagsNamesColumn = columns.findIndex((column) => column === CONST.CSV_IMPORT_COLUMNS.NAME);
@@ -75,9 +75,9 @@ function ImportedTagsPage({route}: ImportedTagsPageProps) {
             const containsEmptyName = tagsNames?.some((name, index) => (!containsHeader || index > 0) && !name?.toString().trim());
 
             if (duplicate) {
-                errors.duplicates = translate('spreadsheet.singleFieldMultipleColumns', duplicate);
+                errors.duplicates = translate('spreadsheet.singleFieldMultipleColumns', {fieldName: duplicate});
             } else if (containsEmptyName) {
-                errors.emptyNames = translate('spreadsheet.emptyMappedField', translate('common.name'));
+                errors.emptyNames = translate('spreadsheet.emptyMappedField', {fieldName: translate('common.name')});
             } else {
                 errors = {};
             }
diff --git a/src/pages/workspace/tags/TagGLCodePage.tsx b/src/pages/workspace/tags/TagGLCodePage.tsx
index 8e7b5783ac29..ac965461558e 100644
--- a/src/pages/workspace/tags/TagGLCodePage.tsx
+++ b/src/pages/workspace/tags/TagGLCodePage.tsx
@@ -76,7 +76,7 @@ function TagGLCodePage({route}: EditTagGLCodePageProps) {
         <AccessOrNotFoundWrapper
             accessVariants={[CONST.POLICY.ACCESS_VARIANTS.ADMIN, CONST.POLICY.ACCESS_VARIANTS.CONTROL]}
             policyID={policyID}
-            featureName={CONST.POLICY.MORE_FEATURES.ARE_TAGS_ENABLED}
+            featureName={CONST.POLICY.MORE_FEATURES.ARE_CATEGORIES_ENABLED}
             shouldBeBlocked={hasAccountingConnections(policy)}
         >
             <ScreenWrapper
diff --git a/src/pages/workspace/tags/TagSettingsPage.tsx b/src/pages/workspace/tags/TagSettingsPage.tsx
index 693bea4618df..dda57b6a0253 100644
--- a/src/pages/workspace/tags/TagSettingsPage.tsx
+++ b/src/pages/workspace/tags/TagSettingsPage.tsx
@@ -1,4 +1,4 @@
-import React, {useEffect, useState} from 'react';
+import React, {useEffect, useMemo, useState} from 'react';
 import {View} from 'react-native';
 import ConfirmModal from '@components/ConfirmModal';
 import HeaderWithBackButton from '@components/HeaderWithBackButton';
@@ -48,19 +48,24 @@ function TagSettingsPage({route, navigation}: TagSettingsPageProps) {
     const {translate} = useLocalize();
     const policyData = usePolicyData(policyID);
     const {policy, tags: policyTags} = policyData;
-    const policyTag = getTagListByOrderWeight(policyTags, orderWeight);
+    const policyTag = useMemo(() => getTagListByOrderWeight(policyTags, orderWeight), [policyTags, orderWeight]);
     const {environmentURL} = useEnvironment();
     const hasAccountingConnections = hasAccountingConnectionsPolicyUtils(policy);
     const [isDeleteTagModalOpen, setIsDeleteTagModalOpen] = React.useState(false);
     const [isCannotDeleteOrDisableLastTagModalVisible, setIsCannotDeleteOrDisableLastTagModalVisible] = useState(false);
     const isQuickSettingsFlow = route.name === SCREENS.SETTINGS_TAGS.SETTINGS_TAG_SETTINGS;
-    const tagApprover = getTagApproverRule(policy, route.params?.tagName)?.approver ?? '';
-    const approver = getPersonalDetailByEmail(tagApprover);
-    const approverText = approver?.displayName ?? tagApprover;
-    const hasDependentTags = hasDependentTagsPolicyUtils(policy, policyTags);
-    const currentPolicyTag = hasDependentTags
-        ? Object.values(policyTag.tags ?? {}).find((tag) => tag?.name === tagName && tag.rules?.parentTagsFilter === parentTagsFilter)
-        : (policyTag.tags[tagName] ?? Object.values(policyTag.tags ?? {}).find((tag) => tag.previousTagName === tagName));
+    const approverText = useMemo(() => {
+        const tagApprover = getTagApproverRule(policy, route.params?.tagName)?.approver ?? '';
+        const approver = getPersonalDetailByEmail(tagApprover);
+        return approver?.displayName ?? tagApprover;
+    }, [route.params?.tagName, policy]);
+    const hasDependentTags = useMemo(() => hasDependentTagsPolicyUtils(policy, policyTags), [policy, policyTags]);
+    const currentPolicyTag = useMemo(() => {
+        if (hasDependentTags) {
+            return Object.values(policyTag.tags ?? {}).find((tag) => tag?.name === tagName && tag.rules?.parentTagsFilter === parentTagsFilter);
+        }
+        return policyTag.tags[tagName] ?? Object.values(policyTag.tags ?? {}).find((tag) => tag.previousTagName === tagName);
+    }, [policyTag, tagName, parentTagsFilter, hasDependentTags]);
 
     const shouldPreventDisableOrDelete = isDisablingOrDeletingLastEnabledTag(policyTag, [currentPolicyTag]);
 
diff --git a/src/pages/workspace/tags/WorkspaceCreateTagPage.tsx b/src/pages/workspace/tags/WorkspaceCreateTagPage.tsx
index ec0b14d9a995..57757b028822 100644
--- a/src/pages/workspace/tags/WorkspaceCreateTagPage.tsx
+++ b/src/pages/workspace/tags/WorkspaceCreateTagPage.tsx
@@ -8,13 +8,12 @@ import ScreenWrapper from '@components/ScreenWrapper';
 import TextInput from '@components/TextInput';
 import useAutoFocusInput from '@hooks/useAutoFocusInput';
 import useLocalize from '@hooks/useLocalize';
-import useOnboardingTaskInformation from '@hooks/useOnboardingTaskInformation';
 import useOnyx from '@hooks/useOnyx';
 import useThemeStyles from '@hooks/useThemeStyles';
 import {addErrorMessage} from '@libs/ErrorUtils';
 import Navigation from '@libs/Navigation/Navigation';
 import type {PlatformStackScreenProps} from '@libs/Navigation/PlatformStackNavigation/types';
-import {escapeTagName, getTagList, hasCustomCategories} from '@libs/PolicyUtils';
+import {escapeTagName, getTagList} from '@libs/PolicyUtils';
 import {isRequiredFulfilled} from '@libs/ValidationUtils';
 import type {SettingsNavigatorParamList} from '@navigation/types';
 import AccessOrNotFoundWrapper from '@pages/workspace/AccessOrNotFoundWrapper';
@@ -32,19 +31,12 @@ type WorkspaceCreateTagPageProps =
 function WorkspaceCreateTagPage({route}: WorkspaceCreateTagPageProps) {
     const policyID = route.params.policyID;
     const [policyTags] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY_TAGS}${policyID}`, {canBeMissing: true});
-    const [policyCategories] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY_CATEGORIES}${policyID}`, {canBeMissing: true});
-    const [introSelected] = useOnyx(ONYXKEYS.NVP_INTRO_SELECTED, {canBeMissing: true});
-    const setupTagsTaskReportID = introSelected?.setupTags;
-    const [setupTagsTaskReport] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${setupTagsTaskReportID}`, {canBeMissing: true});
-    const {taskReport: setupCategoriesAndTagsTaskReport} = useOnboardingTaskInformation(CONST.ONBOARDING_TASK_TYPE.SETUP_CATEGORIES_AND_TAGS);
     const styles = useThemeStyles();
     const {translate} = useLocalize();
     const {inputCallbackRef} = useAutoFocusInput();
     const backTo = route.params.backTo;
     const isQuickSettingsFlow = route.name === SCREENS.SETTINGS_TAGS.SETTINGS_TAG_CREATE;
 
-    const policyHasCustomCategories = hasCustomCategories(policyCategories);
-
     const validate = useCallback(
         (values: FormOnyxValues<typeof ONYXKEYS.FORMS.WORKSPACE_TAG_FORM>) => {
             const errors: FormInputErrors<typeof ONYXKEYS.FORMS.WORKSPACE_TAG_FORM> = {};
@@ -69,11 +61,11 @@ function WorkspaceCreateTagPage({route}: WorkspaceCreateTagPageProps) {
 
     const createTag = useCallback(
         (values: FormOnyxValues<typeof ONYXKEYS.FORMS.WORKSPACE_TAG_FORM>) => {
-            createPolicyTag(policyID, values.tagName.trim(), policyTags, setupTagsTaskReport, setupCategoriesAndTagsTaskReport, policyHasCustomCategories);
+            createPolicyTag(policyID, values.tagName.trim(), policyTags);
             Keyboard.dismiss();
             Navigation.goBack(isQuickSettingsFlow ? ROUTES.SETTINGS_TAGS_ROOT.getRoute(policyID, backTo) : undefined);
         },
-        [policyID, policyTags, isQuickSettingsFlow, backTo, setupTagsTaskReport, setupCategoriesAndTagsTaskReport, policyHasCustomCategories],
+        [policyID, policyTags, isQuickSettingsFlow, backTo],
     );
 
     return (
diff --git a/src/pages/workspace/tags/WorkspaceEditTagsPage.tsx b/src/pages/workspace/tags/WorkspaceEditTagsPage.tsx
index 9f4af297447f..395650c81651 100644
--- a/src/pages/workspace/tags/WorkspaceEditTagsPage.tsx
+++ b/src/pages/workspace/tags/WorkspaceEditTagsPage.tsx
@@ -1,4 +1,4 @@
-import React from 'react';
+import React, {useCallback, useMemo} from 'react';
 import {View} from 'react-native';
 import FormProvider from '@components/Form/FormProvider';
 import InputWrapper from '@components/Form/InputWrapper';
@@ -30,27 +30,30 @@ function WorkspaceEditTagsPage({route}: WorkspaceEditTagsPageProps) {
     const [policyTags] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY_TAGS}${route?.params?.policyID}`, {canBeMissing: true});
     const styles = useThemeStyles();
     const {translate} = useLocalize();
-    const tagListName = getTagListName(policyTags, route.params.orderWeight);
+    const tagListName = useMemo(() => getTagListName(policyTags, route.params.orderWeight), [policyTags, route.params.orderWeight]);
     const {inputCallbackRef} = useAutoFocusInput();
     const backTo = route.params.backTo;
     const isQuickSettingsFlow = route.name === SCREENS.SETTINGS_TAGS.SETTINGS_TAGS_EDIT;
     const isMultiLevelTagsEnabled = isMultiLevelTags(policyTags);
 
-    const validateTagName = (values: FormOnyxValues<typeof ONYXKEYS.FORMS.POLICY_TAG_NAME_FORM>) => {
-        const errors: FormInputErrors<typeof ONYXKEYS.FORMS.POLICY_TAG_NAME_FORM> = {};
-        if (!values[INPUT_IDS.POLICY_TAGS_NAME] && values[INPUT_IDS.POLICY_TAGS_NAME].trim() === '') {
-            errors[INPUT_IDS.POLICY_TAGS_NAME] = translate('common.error.fieldRequired');
-        }
-        if (values[INPUT_IDS.POLICY_TAGS_NAME]?.trim() === '0') {
-            errors[INPUT_IDS.POLICY_TAGS_NAME] = translate('workspace.tags.invalidTagNameError');
-        }
-        if (policyTags && Object.values(policyTags).find((tag) => tag.orderWeight !== route.params.orderWeight && tag.name === values[INPUT_IDS.POLICY_TAGS_NAME])) {
-            errors[INPUT_IDS.POLICY_TAGS_NAME] = translate('workspace.tags.existingTagError');
-        }
-        return errors;
-    };
+    const validateTagName = useCallback(
+        (values: FormOnyxValues<typeof ONYXKEYS.FORMS.POLICY_TAG_NAME_FORM>) => {
+            const errors: FormInputErrors<typeof ONYXKEYS.FORMS.POLICY_TAG_NAME_FORM> = {};
+            if (!values[INPUT_IDS.POLICY_TAGS_NAME] && values[INPUT_IDS.POLICY_TAGS_NAME].trim() === '') {
+                errors[INPUT_IDS.POLICY_TAGS_NAME] = translate('common.error.fieldRequired');
+            }
+            if (values[INPUT_IDS.POLICY_TAGS_NAME]?.trim() === '0') {
+                errors[INPUT_IDS.POLICY_TAGS_NAME] = translate('workspace.tags.invalidTagNameError');
+            }
+            if (policyTags && Object.values(policyTags).find((tag) => tag.orderWeight !== route.params.orderWeight && tag.name === values[INPUT_IDS.POLICY_TAGS_NAME])) {
+                errors[INPUT_IDS.POLICY_TAGS_NAME] = translate('workspace.tags.existingTagError');
+            }
+            return errors;
+        },
+        [translate, policyTags, route.params.orderWeight],
+    );
 
-    const goBackToTagsSettings = () => {
+    const goBackToTagsSettings = useCallback(() => {
         if (isQuickSettingsFlow) {
             Navigation.goBack(backTo);
             return;
@@ -60,14 +63,17 @@ function WorkspaceEditTagsPage({route}: WorkspaceEditTagsPageProps) {
                 ? ROUTES.WORKSPACE_TAG_LIST_VIEW.getRoute(route?.params?.policyID, route.params.orderWeight)
                 : ROUTES.WORKSPACE_TAGS_SETTINGS.getRoute(route?.params?.policyID),
         );
-    };
+    }, [isQuickSettingsFlow, isMultiLevelTagsEnabled, route.params?.policyID, route.params.orderWeight, backTo]);
 
-    const updateTagListName = (values: FormOnyxValues<typeof ONYXKEYS.FORMS.POLICY_TAG_NAME_FORM>) => {
-        if (values[INPUT_IDS.POLICY_TAGS_NAME] !== tagListName) {
-            renamePolicyTagList(route.params.policyID, {oldName: tagListName, newName: values[INPUT_IDS.POLICY_TAGS_NAME]}, policyTags, route.params.orderWeight);
-        }
-        goBackToTagsSettings();
-    };
+    const updateTagListName = useCallback(
+        (values: FormOnyxValues<typeof ONYXKEYS.FORMS.POLICY_TAG_NAME_FORM>) => {
+            if (values[INPUT_IDS.POLICY_TAGS_NAME] !== tagListName) {
+                renamePolicyTagList(route.params.policyID, {oldName: tagListName, newName: values[INPUT_IDS.POLICY_TAGS_NAME]}, policyTags, route.params.orderWeight);
+            }
+            goBackToTagsSettings();
+        },
+        [tagListName, goBackToTagsSettings, route.params.policyID, route.params.orderWeight, policyTags],
+    );
 
     return (
         <AccessOrNotFoundWrapper
diff --git a/src/pages/workspace/taxes/NamePage.tsx b/src/pages/workspace/taxes/NamePage.tsx
index bd3083705b6f..41f222163a33 100644
--- a/src/pages/workspace/taxes/NamePage.tsx
+++ b/src/pages/workspace/taxes/NamePage.tsx
@@ -58,9 +58,9 @@ function NamePage({
             if (values[INPUT_IDS.NAME] === currentTaxRate?.name) {
                 return {};
             }
-            return validateTaxName(policy, values, translate);
+            return validateTaxName(policy, values);
         },
-        [currentTaxRate?.name, policy, translate],
+        [currentTaxRate?.name, policy],
     );
 
     if (!currentTaxRate) {
diff --git a/src/pages/workspace/taxes/WorkspaceCreateTaxPage.tsx b/src/pages/workspace/taxes/WorkspaceCreateTaxPage.tsx
index e45e3edd2b60..6f062c217f1c 100644
--- a/src/pages/workspace/taxes/WorkspaceCreateTaxPage.tsx
+++ b/src/pages/workspace/taxes/WorkspaceCreateTaxPage.tsx
@@ -1,4 +1,4 @@
-import React from 'react';
+import React, {useCallback, useMemo} from 'react';
 import {View} from 'react-native';
 import AmountPicker from '@components/AmountPicker';
 import FullPageNotFoundView from '@components/BlockingViews/FullPageNotFoundView';
@@ -37,40 +37,51 @@ function WorkspaceCreateTaxPage({
     const styles = useThemeStyles();
     const {translate} = useLocalize();
 
-    const validateTaxNameCustom = (inputID: string) => {
-        return (values: Record<string, string>) => {
-            const errors: Record<string, string> = {};
-            const name = values[inputID];
+    const validateTaxNameCustom = useCallback(
+        (inputID: string) => {
+            return (values: Record<string, string>) => {
+                const errors: Record<string, string> = {};
+                const name = values[inputID];
 
-            if (name && policy?.taxRates?.taxes && isExistingTaxName(name, policy.taxRates.taxes)) {
-                errors[inputID] = translate('workspace.taxes.error.taxRateAlreadyExists');
-            }
+                if (name && policy?.taxRates?.taxes && isExistingTaxName(name, policy.taxRates.taxes)) {
+                    errors[inputID] = translate('workspace.taxes.error.taxRateAlreadyExists');
+                }
 
-            return errors;
-        };
-    };
+                return errors;
+            };
+        },
+        // Note: We need the entire taxes object as isExistingTaxName requires it to check for duplicates
+        // This callback will recreate when taxes change, which is necessary for accurate validation
+        [policy?.taxRates?.taxes, translate],
+    );
 
-    const customValidateForName = validateTaxNameCustom(INPUT_IDS.NAME);
+    const customValidateForName = useMemo(() => validateTaxNameCustom(INPUT_IDS.NAME), [validateTaxNameCustom]);
 
-    const submitForm = ({value, ...values}: FormOnyxValues<typeof ONYXKEYS.FORMS.WORKSPACE_NEW_TAX_FORM>) => {
-        const taxRate = {
-            ...values,
-            value: getTaxValueWithPercentage(value),
-            code: getNextTaxCode(values[INPUT_IDS.NAME], policy?.taxRates?.taxes),
-        } satisfies TaxRate;
-        createPolicyTax(policyID, taxRate);
-        Navigation.goBack();
-    };
+    const submitForm = useCallback(
+        ({value, ...values}: FormOnyxValues<typeof ONYXKEYS.FORMS.WORKSPACE_NEW_TAX_FORM>) => {
+            const taxRate = {
+                ...values,
+                value: getTaxValueWithPercentage(value),
+                code: getNextTaxCode(values[INPUT_IDS.NAME], policy?.taxRates?.taxes),
+            } satisfies TaxRate;
+            createPolicyTax(policyID, taxRate);
+            Navigation.goBack();
+        },
+        [policy?.taxRates?.taxes, policyID],
+    );
 
-    const validateForm = (values: FormOnyxValues<typeof ONYXKEYS.FORMS.WORKSPACE_NEW_TAX_FORM>): FormInputErrors<typeof ONYXKEYS.FORMS.WORKSPACE_NEW_TAX_FORM> => {
-        if (!policy) {
-            return {};
-        }
-        return {
-            ...validateTaxName(policy, values, translate),
-            ...validateTaxValue(values, translate),
-        };
-    };
+    const validateForm = useCallback(
+        (values: FormOnyxValues<typeof ONYXKEYS.FORMS.WORKSPACE_NEW_TAX_FORM>): FormInputErrors<typeof ONYXKEYS.FORMS.WORKSPACE_NEW_TAX_FORM> => {
+            if (!policy) {
+                return {};
+            }
+            return {
+                ...validateTaxName(policy, values),
+                ...validateTaxValue(values),
+            };
+        },
+        [policy],
+    );
 
     return (
         <AccessOrNotFoundWrapper
diff --git a/src/pages/workspace/taxes/WorkspaceTaxCodePage.tsx b/src/pages/workspace/taxes/WorkspaceTaxCodePage.tsx
index ffe1b6c43eb1..9836a73d6347 100644
--- a/src/pages/workspace/taxes/WorkspaceTaxCodePage.tsx
+++ b/src/pages/workspace/taxes/WorkspaceTaxCodePage.tsx
@@ -70,9 +70,9 @@ function WorkspaceTaxCodePage({route}: WorkspaceTaxCodePageProps) {
                 return {};
             }
 
-            return validateTaxCode(policy, values, translate);
+            return validateTaxCode(policy, values);
         },
-        [currentTaxCode, policy, translate],
+        [currentTaxCode, policy],
     );
 
     return (
diff --git a/src/pages/workspace/travel/CentralInvoicingLearnHow.tsx b/src/pages/workspace/travel/CentralInvoicingLearnHow.tsx
deleted file mode 100644
index aa34324bea15..000000000000
--- a/src/pages/workspace/travel/CentralInvoicingLearnHow.tsx
+++ /dev/null
@@ -1,12 +0,0 @@
-import React from 'react';
-import TextLink from '@components/TextLink';
-import useLocalize from '@hooks/useLocalize';
-import CONST from '@src/CONST';
-
-function CentralInvoicingLearnHow() {
-    const {translate} = useLocalize();
-
-    return <TextLink href={CONST.FOOTER.TRAVEL_URL}>{translate('workspace.moreFeatures.travel.travelInvoicing.centralInvoicingSection.learnHow')}</TextLink>;
-}
-
-export default CentralInvoicingLearnHow;
diff --git a/src/pages/workspace/travel/CentralInvoicingSubtitleWrapper.tsx b/src/pages/workspace/travel/CentralInvoicingSubtitleWrapper.tsx
deleted file mode 100644
index 8bd9a911c04f..000000000000
--- a/src/pages/workspace/travel/CentralInvoicingSubtitleWrapper.tsx
+++ /dev/null
@@ -1,24 +0,0 @@
-import React from 'react';
-import {View} from 'react-native';
-import Text from '@components/Text';
-import useLocalize from '@hooks/useLocalize';
-import useThemeStyles from '@hooks/useThemeStyles';
-
-type CentralInvoicingSubtitleWrapperProps = {
-    htmlComponent?: React.ReactNode;
-};
-
-function CentralInvoicingSubtitleWrapper({htmlComponent}: CentralInvoicingSubtitleWrapperProps) {
-    const styles = useThemeStyles();
-    const {translate} = useLocalize();
-
-    return (
-        <View style={[styles.mt2, styles.mr5]}>
-            <Text style={[styles.mutedNormalTextLabel, styles.textLabelSupportingEmptyValue, styles.lh20]}>
-                {translate('workspace.moreFeatures.travel.travelInvoicing.centralInvoicingSection.subtitle')} {htmlComponent}
-            </Text>
-        </View>
-    );
-}
-
-export default CentralInvoicingSubtitleWrapper;
diff --git a/src/pages/workspace/travel/PolicyTravelPage.tsx b/src/pages/workspace/travel/PolicyTravelPage.tsx
index 42221a4b2d1e..f41e65f4648a 100644
--- a/src/pages/workspace/travel/PolicyTravelPage.tsx
+++ b/src/pages/workspace/travel/PolicyTravelPage.tsx
@@ -1,5 +1,4 @@
-import {useFocusEffect, useIsFocused} from '@react-navigation/native';
-import React, {useCallback} from 'react';
+import React from 'react';
 import {View} from 'react-native';
 import HeaderWithBackButton from '@components/HeaderWithBackButton';
 import ScreenWrapper from '@components/ScreenWrapper';
@@ -7,14 +6,11 @@ import ScrollViewWithContext from '@components/ScrollViewWithContext';
 import useCurrentUserPersonalDetails from '@hooks/useCurrentUserPersonalDetails';
 import {useMemoizedLazyIllustrations} from '@hooks/useLazyAsset';
 import useLocalize from '@hooks/useLocalize';
-import useNetwork from '@hooks/useNetwork';
 import useOnyx from '@hooks/useOnyx';
 import usePermissions from '@hooks/usePermissions';
 import usePolicy from '@hooks/usePolicy';
 import useResponsiveLayout from '@hooks/useResponsiveLayout';
 import useThemeStyles from '@hooks/useThemeStyles';
-import useWorkspaceAccountID from '@hooks/useWorkspaceAccountID';
-import {openPolicyTravelPage} from '@libs/actions/TravelInvoicing';
 import Navigation from '@libs/Navigation/Navigation';
 import type {PlatformStackScreenProps} from '@libs/Navigation/PlatformStackNavigation/types';
 import type {WorkspaceSplitNavigatorParamList} from '@libs/Navigation/types';
@@ -26,7 +22,6 @@ import type SCREENS from '@src/SCREENS';
 import BookOrManageYourTrip from './BookOrManageYourTrip';
 import GetStartedTravel from './GetStartedTravel';
 import ReviewingRequest from './ReviewingRequest';
-import WorkspaceTravelInvoicingSection from './WorkspaceTravelInvoicingSection';
 
 type WorkspaceTravelPageProps = PlatformStackScreenProps<WorkspaceSplitNavigatorParamList, typeof SCREENS.WORKSPACE.TRAVEL>;
 
@@ -42,41 +37,15 @@ function WorkspaceTravelPage({
     const {translate} = useLocalize();
     const policy = usePolicy(policyID);
     const illustrations = useMemoizedLazyIllustrations(['Luggage'] as const);
-    const isTravelInvoicingEnabled = isBetaEnabled(CONST.BETAS.TRAVEL_INVOICING);
-    const workspaceAccountID = useWorkspaceAccountID(policyID);
 
     const {login: currentUserLogin} = useCurrentUserPersonalDetails();
     const [policies] = useOnyx(ONYXKEYS.COLLECTION.POLICY, {canBeMissing: false});
 
-    const fetchTravelData = useCallback(() => {
-        openPolicyTravelPage(policyID, workspaceAccountID);
-    }, [policyID, workspaceAccountID]);
-
-    const isFocused = useIsFocused();
-
-    useNetwork({
-        onReconnect: () => {
-            if (!isFocused) {
-                return;
-            }
-            fetchTravelData();
-        },
-    });
-
-    useFocusEffect(
-        useCallback(() => {
-            fetchTravelData();
-        }, [fetchTravelData]),
-    );
-
     const step = getTravelStep(policy, travelSettings, isBetaEnabled(CONST.BETAS.IS_TRAVEL_VERIFIED), policies, currentUserLogin);
 
     const mainContent = (() => {
         switch (step) {
             case CONST.TRAVEL.STEPS.BOOK_OR_MANAGE_YOUR_TRIP:
-                if (isTravelInvoicingEnabled) {
-                    return <WorkspaceTravelInvoicingSection policyID={policyID} />;
-                }
                 return <BookOrManageYourTrip policyID={policyID} />;
             case CONST.TRAVEL.STEPS.REVIEWING_REQUEST:
                 return <ReviewingRequest />;
@@ -89,7 +58,6 @@ function WorkspaceTravelPage({
         <AccessOrNotFoundWrapper
             policyID={policyID}
             accessVariants={[CONST.POLICY.ACCESS_VARIANTS.ADMIN, CONST.POLICY.ACCESS_VARIANTS.PAID]}
-            featureName={CONST.POLICY.MORE_FEATURES.IS_TRAVEL_ENABLED}
         >
             <ScreenWrapper
                 enableEdgeToEdgeBottomSafeAreaPadding
diff --git a/src/pages/workspace/travel/WorkspaceTravelInvoicingSection.tsx b/src/pages/workspace/travel/WorkspaceTravelInvoicingSection.tsx
deleted file mode 100644
index 22409861b96c..000000000000
--- a/src/pages/workspace/travel/WorkspaceTravelInvoicingSection.tsx
+++ /dev/null
@@ -1,200 +0,0 @@
-import React, {useState} from 'react';
-import {View} from 'react-native';
-import AnimatedSubmitButton from '@components/AnimatedSubmitButton';
-import MenuItem from '@components/MenuItem';
-import MenuItemWithTopDescription from '@components/MenuItemWithTopDescription';
-import Section from '@components/Section';
-import {useMemoizedLazyExpensifyIcons} from '@hooks/useLazyAsset';
-import useLocalize from '@hooks/useLocalize';
-import useOnyx from '@hooks/useOnyx';
-import useSingleExecution from '@hooks/useSingleExecution';
-import useThemeStyles from '@hooks/useThemeStyles';
-import useWorkspaceAccountID from '@hooks/useWorkspaceAccountID';
-import {openExternalLink} from '@libs/actions/Link';
-import {getLastFourDigits} from '@libs/BankAccountUtils';
-import {convertToDisplayString} from '@libs/CurrencyUtils';
-import {
-    getIsTravelInvoicingEnabled,
-    getTravelLimit,
-    getTravelSettlementAccount,
-    getTravelSettlementFrequency,
-    getTravelSpend,
-    hasTravelInvoicingSettlementAccount,
-} from '@libs/TravelInvoicingUtils';
-import ToggleSettingOptionRow from '@pages/workspace/workflows/ToggleSettingsOptionRow';
-import type {ToggleSettingOptionRowProps} from '@pages/workspace/workflows/ToggleSettingsOptionRow';
-import CONST from '@src/CONST';
-import ONYXKEYS from '@src/ONYXKEYS';
-import BookOrManageYourTrip from './BookOrManageYourTrip';
-import CentralInvoicingLearnHow from './CentralInvoicingLearnHow';
-import CentralInvoicingSubtitleWrapper from './CentralInvoicingSubtitleWrapper';
-
-type WorkspaceTravelInvoicingSectionProps = {
-    /** The ID of the policy */
-    policyID: string;
-};
-
-/**
- * Displays the Travel Invoicing section within the Workspace Travel page.
- * Shows a setup CTA if Travel Invoicing is not configured, otherwise shows the settings.
- */
-function WorkspaceTravelInvoicingSection({policyID}: WorkspaceTravelInvoicingSectionProps) {
-    const styles = useThemeStyles();
-    const {translate} = useLocalize();
-    const workspaceAccountID = useWorkspaceAccountID(policyID);
-    const {isExecuting, singleExecution} = useSingleExecution();
-    const icons = useMemoizedLazyExpensifyIcons(['LuggageWithLines', 'NewWindow']);
-
-    const [isCentralInvoicingEnabled, setIsCentralInvoicingEnabled] = useState(true);
-
-    // For Travel Invoicing, we use a travel-specific card settings key
-    // The format is: private_expensifyCardSettings_{workspaceAccountID}_{feedType}
-    // where feedType is PROGRAM_TRAVEL_US for Travel Invoicing
-    const [cardSettings] = useOnyx(`${ONYXKEYS.COLLECTION.PRIVATE_EXPENSIFY_CARD_SETTINGS}${workspaceAccountID}_${CONST.TRAVEL.PROGRAM_TRAVEL_US}`, {canBeMissing: true});
-    const [bankAccountList] = useOnyx(ONYXKEYS.BANK_ACCOUNT_LIST, {canBeMissing: true});
-
-    // Use pure selectors to derive state
-    const isTravelInvoicingEnabled = getIsTravelInvoicingEnabled(cardSettings);
-    const hasSettlementAccount = hasTravelInvoicingSettlementAccount(cardSettings);
-    const travelSpend = getTravelSpend(cardSettings);
-    const travelLimit = getTravelLimit(cardSettings);
-    const settlementAccount = getTravelSettlementAccount(cardSettings, bankAccountList);
-    const settlementFrequency = getTravelSettlementFrequency(cardSettings);
-    const localizedFrequency =
-        settlementFrequency === CONST.EXPENSIFY_CARD.FREQUENCY_SETTING.MONTHLY
-            ? translate('workspace.expensifyCard.frequency.monthly')
-            : translate('workspace.expensifyCard.frequency.daily');
-
-    // Format currency values (assuming USD for Travel Invoicing based on PROGRAM_TRAVEL_US)
-    const formattedSpend = convertToDisplayString(travelSpend, CONST.CURRENCY.USD);
-    const formattedLimit = convertToDisplayString(travelLimit, CONST.CURRENCY.USD);
-    const settlementAccountNumber = `${CONST.MASKED_PAN_PREFIX}${getLastFourDigits(settlementAccount?.last4 ?? '')}`;
-
-    const getCentralInvoicingSubtitle = () => {
-        if (!isCentralInvoicingEnabled) {
-            return <CentralInvoicingSubtitleWrapper htmlComponent={<CentralInvoicingLearnHow />} />;
-        }
-        return <CentralInvoicingSubtitleWrapper />;
-    };
-
-    const optionItems: ToggleSettingOptionRowProps[] = [
-        {
-            title: translate('workspace.moreFeatures.travel.travelInvoicing.centralInvoicingSection.title'),
-            subtitle: getCentralInvoicingSubtitle(),
-            switchAccessibilityLabel: translate('workspace.moreFeatures.travel.travelInvoicing.centralInvoicingSection.subtitle'),
-            isActive: isCentralInvoicingEnabled,
-            onToggle: (isEnabled: boolean) => setIsCentralInvoicingEnabled(isEnabled),
-            // pendingAction: policy?.pendingFields?.autoReporting ?? policy?.pendingFields?.autoReportingFrequency,
-            // errors: getLatestErrorField(policy ?? {}, CONST.POLICY.COLLECTION_KEYS.AUTOREPORTING),
-            // onCloseError: () => clearPolicyErrorField(route.params.policyID, CONST.POLICY.COLLECTION_KEYS.AUTOREPORTING),
-            subMenuItems: (
-                <>
-                    <View style={[styles.dFlex, styles.flexRow, styles.mt6, styles.gap4, styles.alignItemsCenter]}>
-                        <MenuItemWithTopDescription
-                            description={translate('workspace.moreFeatures.travel.travelInvoicing.centralInvoicingSection.subsections.currentTravelSpendLabel')}
-                            title={formattedSpend}
-                            rootWrapperStyle={styles.flex1}
-                            wrapperStyle={[styles.sectionMenuItemTopDescription]}
-                            titleStyle={[styles.textNormalThemeText, styles.headerAnonymousFooter]}
-                            descriptionTextStyle={styles.textLabelSupportingNormal}
-                            interactive={false}
-                            // brickRoadIndicator={hasDelayedSubmissionError ? CONST.BRICK_ROAD_INDICATOR_STATUS.ERROR : undefined}
-                        />
-                        <View style={[styles.wFitContent]}>
-                            <AnimatedSubmitButton
-                                text={translate('workspace.moreFeatures.travel.travelInvoicing.centralInvoicingSection.subsections.currentTravelSpendCta')}
-                                success={false}
-                                onPress={() => {}}
-                                isSubmittingAnimationRunning={false}
-                                onAnimationFinish={() => {}}
-                                // isSubmittingAnimationRunning={isSubmittingAnimationRunning}
-                                // onAnimationFinish={stopAnimation}
-                                // isDisabled={shouldBlockSubmit}
-                            />
-                        </View>
-                    </View>
-                    <MenuItemWithTopDescription
-                        description={translate('workspace.moreFeatures.travel.travelInvoicing.centralInvoicingSection.subsections.currentTravelLimitLabel')}
-                        title={formattedLimit}
-                        wrapperStyle={[styles.sectionMenuItemTopDescription]}
-                        titleStyle={styles.textNormalThemeText}
-                        descriptionTextStyle={styles.textLabelSupportingNormal}
-                        interactive={false}
-                        // brickRoadIndicator={hasDelayedSubmissionError ? CONST.BRICK_ROAD_INDICATOR_STATUS.ERROR : undefined}
-                    />
-                    <MenuItemWithTopDescription
-                        description={translate('workspace.moreFeatures.travel.travelInvoicing.centralInvoicingSection.subsections.settlementAccountLabel')}
-                        title={settlementAccountNumber}
-                        onPress={() => {}}
-                        wrapperStyle={[styles.sectionMenuItemTopDescription]}
-                        titleStyle={styles.textNormalThemeText}
-                        descriptionTextStyle={styles.textLabelSupportingNormal}
-                        shouldShowRightIcon
-                        // brickRoadIndicator={hasDelayedSubmissionError ? CONST.BRICK_ROAD_INDICATOR_STATUS.ERROR : undefined}
-                    />
-                    <MenuItemWithTopDescription
-                        description={translate('workspace.moreFeatures.travel.travelInvoicing.centralInvoicingSection.subsections.settlementFrequencyLabel')}
-                        title={localizedFrequency}
-                        onPress={() => {}}
-                        wrapperStyle={[styles.sectionMenuItemTopDescription]}
-                        titleStyle={styles.textNormalThemeText}
-                        descriptionTextStyle={styles.textLabelSupportingNormal}
-                        shouldShowRightIcon
-                        // brickRoadIndicator={hasDelayedSubmissionError ? CONST.BRICK_ROAD_INDICATOR_STATUS.ERROR : undefined}
-                    />
-                </>
-            ),
-        },
-    ];
-
-    const renderOptionItem = (item: ToggleSettingOptionRowProps, index: number) => (
-        <Section
-            key={`toggleSettingOptionItem-${index}`}
-            isCentralPane
-        >
-            <ToggleSettingOptionRow
-                title={item.title}
-                titleStyle={[styles.textHeadline, styles.cardSectionTitle, styles.accountSettingsSectionTitle]}
-                subtitle={item.subtitle}
-                switchAccessibilityLabel={item.switchAccessibilityLabel}
-                onToggle={item.onToggle}
-                disabled={item.disabled}
-                isActive={item.isActive}
-                pendingAction={item.pendingAction}
-                errors={item.errors}
-                onCloseError={item.onCloseError}
-                subMenuItems={item.subMenuItems}
-            />
-        </Section>
-    );
-
-    // If Travel Invoicing is not enabled or no settlement account is configured
-    // show the BookOrManageYourTrip component as fallback
-    if (!isTravelInvoicingEnabled || !hasSettlementAccount) {
-        return <BookOrManageYourTrip policyID={policyID} />;
-    }
-
-    return (
-        <>
-            <Section
-                title={translate('workspace.moreFeatures.travel.travelInvoicing.travelBookingSection.title')}
-                subtitle={translate('workspace.moreFeatures.travel.travelInvoicing.travelBookingSection.subtitle')}
-                isCentralPane
-                subtitleMuted
-            >
-                <MenuItem
-                    title={translate('workspace.moreFeatures.travel.travelInvoicing.travelBookingSection.manageTravelLabel')}
-                    onPress={singleExecution(() => openExternalLink(CONST.FOOTER.TRAVEL_URL))}
-                    disabled={isExecuting}
-                    wrapperStyle={styles.sectionMenuItemTopDescription}
-                    iconRight={icons.NewWindow}
-                    icon={icons.LuggageWithLines}
-                    shouldShowRightIcon
-                />
-            </Section>
-            {optionItems.map(renderOptionItem)}
-        </>
-    );
-}
-
-export default WorkspaceTravelInvoicingSection;
diff --git a/src/pages/workspace/workflows/ToggleSettingsOptionRow.tsx b/src/pages/workspace/workflows/ToggleSettingsOptionRow.tsx
index 5eb1303e0366..70d9a48332a8 100644
--- a/src/pages/workspace/workflows/ToggleSettingsOptionRow.tsx
+++ b/src/pages/workspace/workflows/ToggleSettingsOptionRow.tsx
@@ -1,7 +1,7 @@
 import type {ReactNode} from 'react';
 import React, {useEffect, useMemo} from 'react';
-import type {StyleProp, TextStyle, ViewStyle} from 'react-native';
 import {View} from 'react-native';
+import type {StyleProp, TextStyle, ViewStyle} from 'react-native';
 import Accordion from '@components/Accordion';
 import Icon from '@components/Icon';
 import OfflineWithFeedback from '@components/OfflineWithFeedback';
@@ -201,7 +201,7 @@ function ToggleSettingOptionRow({
                     </PressableWithoutFeedback>
                     <Switch
                         disabledAction={disabledAction}
-                        accessibilityLabel={typeof subtitle === 'string' && subtitle ? `${switchAccessibilityLabel}, ${subtitle}` : switchAccessibilityLabel}
+                        accessibilityLabel={switchAccessibilityLabel}
                         onToggle={(isOn) => {
                             shouldAnimateAccordionSection.set(true);
                             onToggle(isOn);
diff --git a/src/pages/workspace/workflows/WorkspaceWorkflowsPage.tsx b/src/pages/workspace/workflows/WorkspaceWorkflowsPage.tsx
index a4bbb19b2c35..889e83f6c569 100644
--- a/src/pages/workspace/workflows/WorkspaceWorkflowsPage.tsx
+++ b/src/pages/workspace/workflows/WorkspaceWorkflowsPage.tsx
@@ -38,7 +38,7 @@ import {getLatestErrorField} from '@libs/ErrorUtils';
 import Navigation from '@libs/Navigation/Navigation';
 import type {PlatformStackScreenProps} from '@libs/Navigation/PlatformStackNavigation/types';
 import {getPaymentMethodDescription} from '@libs/PaymentUtils';
-import {getDisplayNameOrDefault, getPersonalDetailByEmail} from '@libs/PersonalDetailsUtils';
+import {getPersonalDetailByEmail} from '@libs/PersonalDetailsUtils';
 import {
     getCorrectedAutoReportingFrequency,
     hasDynamicExternalWorkflow,
@@ -103,7 +103,7 @@ function WorkspaceWorkflowsPage({policy, route}: WorkspaceWorkflowsPageProps) {
     const isAdvanceApproval = (approvalWorkflows.length > 1 || (approvalWorkflows?.at(0)?.approvers ?? []).length > 1) && isControlPolicy(policy);
     const updateApprovalMode = isAdvanceApproval ? CONST.POLICY.APPROVAL_MODE.ADVANCED : CONST.POLICY.APPROVAL_MODE.BASIC;
     const displayNameForAuthorizedPayer = useMemo(
-        () => getDisplayNameOrDefault(getPersonalDetailByEmail(policy?.achAccount?.reimburser ?? ''), policy?.achAccount?.reimburser),
+        () => getPersonalDetailByEmail(policy?.achAccount?.reimburser ?? '')?.displayName ?? policy?.achAccount?.reimburser,
         [policy?.achAccount?.reimburser],
     );
 
diff --git a/src/pages/workspace/workflows/WorkspaceWorkflowsPayerPage.tsx b/src/pages/workspace/workflows/WorkspaceWorkflowsPayerPage.tsx
index 650aab459e48..ee8f1d57ec0e 100644
--- a/src/pages/workspace/workflows/WorkspaceWorkflowsPayerPage.tsx
+++ b/src/pages/workspace/workflows/WorkspaceWorkflowsPayerPage.tsx
@@ -189,7 +189,6 @@ function WorkspaceWorkflowsPayerPage({route, policy, personalDetails, isLoadingR
         <AccessOrNotFoundWrapper
             accessVariants={[CONST.POLICY.ACCESS_VARIANTS.ADMIN, CONST.POLICY.ACCESS_VARIANTS.PAID]}
             policyID={route.params.policyID}
-            featureName={CONST.POLICY.MORE_FEATURES.ARE_WORKFLOWS_ENABLED}
         >
             <FullPageNotFoundView
                 shouldShow={shouldShowNotFoundPage}
@@ -214,7 +213,6 @@ function WorkspaceWorkflowsPayerPage({route, policy, personalDetails, isLoadingR
                         headerMessage={headerMessage}
                         ListItem={UserListItem}
                         onSelectRow={setPolicyAuthorizedPayer}
-                        initiallyFocusedOptionKey={formattedAuthorizedPayer.at(0)?.keyForList}
                         shouldSingleExecuteRowSelect
                         showScrollIndicator
                         addBottomSafeAreaPadding
diff --git a/src/pages/workspace/workflows/approvals/WorkspaceWorkflowsApprovalsApprovalLimitPage.tsx b/src/pages/workspace/workflows/approvals/WorkspaceWorkflowsApprovalsApprovalLimitPage.tsx
index f1893477d77e..ca9955874272 100644
--- a/src/pages/workspace/workflows/approvals/WorkspaceWorkflowsApprovalsApprovalLimitPage.tsx
+++ b/src/pages/workspace/workflows/approvals/WorkspaceWorkflowsApprovalsApprovalLimitPage.tsx
@@ -1,7 +1,9 @@
+import {useIsFocused} from '@react-navigation/native';
 import {Str} from 'expensify-common';
-import React, {useState} from 'react';
+import React, {useEffect, useRef, useState} from 'react';
 import {View} from 'react-native';
 import AmountForm from '@components/AmountForm';
+import type {NumberWithSymbolFormRef} from '@components/AmountForm';
 import FullPageNotFoundView from '@components/BlockingViews/FullPageNotFoundView';
 import Button from '@components/Button';
 import HeaderWithBackButton from '@components/HeaderWithBackButton';
@@ -56,11 +58,20 @@ function WorkspaceWorkflowsApprovalsApprovalLimitPage({policy, isLoadingReportDa
 
     const defaultApprovalLimit = currentApprover?.approvalLimit ? convertToFrontendAmountAsString(currentApprover.approvalLimit, currency) : '';
 
-    const [editedApprovalLimit, setEditedApprovalLimit] = useState<{approverEmail: string; value: string} | null>(null);
+    const [editedApprovalLimit, setEditedApprovalLimit] = useState<string | null>(null);
     const [hasSubmitted, setHasSubmitted] = useState(false);
+    const amountFormRef = useRef<NumberWithSymbolFormRef>(null);
+    const isFocused = useIsFocused();
 
-    const approverEmail = currentApprover?.email ?? '';
-    const approvalLimit = editedApprovalLimit?.approverEmail === approverEmail ? editedApprovalLimit.value : defaultApprovalLimit;
+    const approvalLimit = editedApprovalLimit ?? defaultApprovalLimit;
+
+    // Clear the amount input when the screen is focused and the over-limit approver was unselected
+    useEffect(() => {
+        if (!isFocused || currentApprover?.approvalLimit != null || editedApprovalLimit !== null) {
+            return;
+        }
+        amountFormRef.current?.updateNumber('');
+    }, [isFocused, currentApprover?.approvalLimit, editedApprovalLimit]);
 
     const selectedApproverPersonalDetails = selectedApproverEmail ? personalDetailsByEmail?.[selectedApproverEmail] : undefined;
     const selectedApproverDisplayName = selectedApproverEmail ? Str.removeSMSDomain(selectedApproverPersonalDetails?.displayName ?? selectedApproverEmail) : '';
@@ -101,7 +112,6 @@ function WorkspaceWorkflowsApprovalsApprovalLimitPage({policy, isLoadingReportDa
         if (!approvalWorkflow || !currentApprover) {
             return;
         }
-
         setApprovalWorkflowApprover({
             approver: {
                 ...currentApprover,
@@ -157,15 +167,27 @@ function WorkspaceWorkflowsApprovalsApprovalLimitPage({policy, isLoadingReportDa
     };
 
     const handleAmountChange = (value: string) => {
-        setEditedApprovalLimit({approverEmail, value});
+        setEditedApprovalLimit(value);
+        setHasSubmitted(false);
+    };
+
+    const saveCurrentStateToOnyx = () => {
+        const limitInCents = approvalLimit ? convertToBackendAmount(Number.parseFloat(approvalLimit)) : null;
+        updateCurrentApprover({
+            approvalLimit: limitInCents,
+            overLimitForwardsTo: selectedApproverEmail,
+        });
+        setEditedApprovalLimit(null);
         setHasSubmitted(false);
     };
 
     const navigateToApproverSelector = () => {
+        saveCurrentStateToOnyx();
         Navigation.navigate(ROUTES.WORKSPACE_WORKFLOWS_APPROVALS_OVER_LIMIT_APPROVER.getRoute(policyID, approverIndex));
     };
 
     const navigateToApproverChange = () => {
+        saveCurrentStateToOnyx();
         Navigation.navigate(ROUTES.WORKSPACE_WORKFLOWS_APPROVALS_APPROVER_CHANGE.getRoute(policyID, approverIndex));
     };
 
@@ -224,7 +246,6 @@ function WorkspaceWorkflowsApprovalsApprovalLimitPage({policy, isLoadingReportDa
 
                             <View style={styles.mb4}>
                                 <AmountForm
-                                    key={approverEmail}
                                     label={translate('workflowsApprovalLimitPage.reportAmountLabel')}
                                     currency={currency}
                                     value={approvalLimit}
@@ -234,6 +255,7 @@ function WorkspaceWorkflowsApprovalsApprovalLimitPage({policy, isLoadingReportDa
                                     disabled={areLimitFieldsDisabled}
                                     errorText={amountError}
                                     onSubmitEditing={handleSubmit}
+                                    numberFormRef={amountFormRef}
                                 />
                             </View>
 
diff --git a/src/pages/workspace/workflows/approvals/WorkspaceWorkflowsApprovalsExpensesFromPage.tsx b/src/pages/workspace/workflows/approvals/WorkspaceWorkflowsApprovalsExpensesFromPage.tsx
index f198292521ab..7c2542ab0809 100644
--- a/src/pages/workspace/workflows/approvals/WorkspaceWorkflowsApprovalsExpensesFromPage.tsx
+++ b/src/pages/workspace/workflows/approvals/WorkspaceWorkflowsApprovalsExpensesFromPage.tsx
@@ -1,5 +1,5 @@
 import {Str} from 'expensify-common';
-import React, {useEffect, useState} from 'react';
+import React, {useCallback, useEffect, useMemo, useState} from 'react';
 import type {SelectionListApprover} from '@components/ApproverSelectionList';
 import ApproverSelectionList from '@components/ApproverSelectionList';
 import FormAlertWithSubmitButton from '@components/FormAlertWithSubmitButton';
@@ -77,10 +77,13 @@ function WorkspaceWorkflowsApprovalsExpensesFromPage({policy, isLoadingReportDat
         );
     }, [approvalWorkflow?.members, policy?.employeeList, policy?.owner, personalDetailLogins, translate, icons.FallbackAvatar]);
 
-    const approversEmail = approvalWorkflow?.approvers.map((member) => member?.email);
-    const allApprovers: SelectionListApprover[] = [...selectedMembers];
+    const approversEmail = useMemo(() => approvalWorkflow?.approvers.map((member) => member?.email), [approvalWorkflow?.approvers]);
+    const allApprovers = useMemo(() => {
+        const members: SelectionListApprover[] = [...selectedMembers];
 
-    if (approvalWorkflow?.availableMembers) {
+        if (!approvalWorkflow?.availableMembers) {
+            return members;
+        }
         const availableMembers = approvalWorkflow.availableMembers
             .map((member) => {
                 const policyMemberEmailsToAccountIDs = getMemberAccountIDsForWorkspace(policy?.employeeList);
@@ -107,10 +110,12 @@ function WorkspaceWorkflowsApprovalsExpensesFromPage({policy, isLoadingReportDat
                 (member) => (!policy?.preventSelfApproval || !approversEmail?.includes(member.login)) && !selectedMembers.some((selectedOption) => selectedOption.login === member.login),
             );
 
-        allApprovers.push(...availableMembers);
-    }
+        members.push(...availableMembers);
+
+        return members;
+    }, [selectedMembers, approvalWorkflow?.availableMembers, policy?.employeeList, policy?.owner, policy?.preventSelfApproval, personalDetailLogins, icons.FallbackAvatar, approversEmail]);
 
-    const goBack = () => {
+    const goBack = useCallback(() => {
         let backTo;
         if (approvalWorkflow?.action === CONST.APPROVAL_WORKFLOW.ACTION.EDIT) {
             backTo = ROUTES.WORKSPACE_WORKFLOWS_APPROVALS_EDIT.getRoute(route.params.policyID, firstApprover);
@@ -118,9 +123,9 @@ function WorkspaceWorkflowsApprovalsExpensesFromPage({policy, isLoadingReportDat
             backTo = ROUTES.WORKSPACE_WORKFLOWS_APPROVALS_NEW.getRoute(route.params.policyID);
         }
         Navigation.goBack(backTo);
-    };
+    }, [isInitialCreationFlow, route.params.policyID, firstApprover, approvalWorkflow?.action]);
 
-    const nextStep = () => {
+    const nextStep = useCallback(() => {
         const members: Member[] = selectedMembers.map((member) => ({displayName: member.text ?? '', avatar: member.icons?.at(0)?.source, email: member.login ?? ''}));
         setApprovalWorkflowMembers(members);
 
@@ -129,22 +134,25 @@ function WorkspaceWorkflowsApprovalsExpensesFromPage({policy, isLoadingReportDat
         } else {
             goBack();
         }
-    };
-
-    let buttonText = isInitialCreationFlow ? translate('common.next') : translate('common.save');
-    if (shouldShowListEmptyContent) {
-        buttonText = translate('common.buttonConfirm');
-    }
-
-    const button = (
-        <FormAlertWithSubmitButton
-            isDisabled={!shouldShowListEmptyContent && !selectedMembers.length}
-            buttonText={buttonText}
-            onSubmit={shouldShowListEmptyContent ? () => Navigation.goBack() : nextStep}
-            containerStyles={[styles.flexReset, styles.flexGrow0, styles.flexShrink0, styles.flexBasisAuto]}
-            enabledWhenOffline
-        />
-    );
+    }, [route.params.policyID, selectedMembers, isInitialCreationFlow, goBack]);
+
+    const button = useMemo(() => {
+        let buttonText = isInitialCreationFlow ? translate('common.next') : translate('common.save');
+
+        if (shouldShowListEmptyContent) {
+            buttonText = translate('common.buttonConfirm');
+        }
+
+        return (
+            <FormAlertWithSubmitButton
+                isDisabled={!shouldShowListEmptyContent && !selectedMembers.length}
+                buttonText={buttonText}
+                onSubmit={shouldShowListEmptyContent ? () => Navigation.goBack() : nextStep}
+                containerStyles={[styles.flexReset, styles.flexGrow0, styles.flexShrink0, styles.flexBasisAuto]}
+                enabledWhenOffline
+            />
+        );
+    }, [isInitialCreationFlow, nextStep, selectedMembers.length, shouldShowListEmptyContent, styles.flexBasisAuto, styles.flexGrow0, styles.flexReset, styles.flexShrink0, translate]);
 
     const toggleMember = (members: SelectionListApprover[]) => setSelectedMembers(members);
 
diff --git a/src/pages/workspace/workflows/approvals/WorkspaceWorkflowsApprovalsOverLimitApproverPage.tsx b/src/pages/workspace/workflows/approvals/WorkspaceWorkflowsApprovalsOverLimitApproverPage.tsx
index 9cd1c62454b6..64ba0ae3d19a 100644
--- a/src/pages/workspace/workflows/approvals/WorkspaceWorkflowsApprovalsOverLimitApproverPage.tsx
+++ b/src/pages/workspace/workflows/approvals/WorkspaceWorkflowsApprovalsOverLimitApproverPage.tsx
@@ -110,6 +110,7 @@ function WorkspaceWorkflowsApprovalsOverLimitApproverPage({policy, personalDetai
                 approver: {
                     ...currentApprover,
                     overLimitForwardsTo: '',
+                    approvalLimit: null,
                 },
                 approverIndex,
                 currentApprovalWorkflow: approvalWorkflow,
diff --git a/src/selectors/ReportNameValuePairs.ts b/src/selectors/ReportNameValuePairs.ts
index a33ccc389313..774309ae8cf4 100644
--- a/src/selectors/ReportNameValuePairs.ts
+++ b/src/selectors/ReportNameValuePairs.ts
@@ -26,22 +26,4 @@ const archivedReportsIdSetSelector = (all: OnyxCollection<ReportNameValuePairs>)
     return ids;
 };
 
-type PrivateIsArchivedMap = Record<string, string | undefined>;
-
-/**
- * Selector that creates a map of report IDs to their private_isArchived values
- */
-const privateIsArchivedMapSelector = (all: OnyxCollection<ReportNameValuePairs>): PrivateIsArchivedMap => {
-    const map: PrivateIsArchivedMap = {};
-    if (!all) {
-        return map;
-    }
-
-    for (const [key, value] of Object.entries(all)) {
-        map[key] = value?.private_isArchived;
-    }
-    return map;
-};
-
-export {createReportNameValuePairsSelector, archivedReportsIdSetSelector, privateIsArchivedMapSelector};
-export type {PrivateIsArchivedMap};
+export {createReportNameValuePairsSelector, archivedReportsIdSetSelector};
diff --git a/src/setup/backgroundLocationTrackingTask/index.native.ts b/src/setup/backgroundLocationTrackingTask/index.native.ts
deleted file mode 100644
index f80f1380981f..000000000000
--- a/src/setup/backgroundLocationTrackingTask/index.native.ts
+++ /dev/null
@@ -1,39 +0,0 @@
-import type {LocationObject} from 'expo-location';
-import {defineTask} from 'expo-task-manager';
-import OnyxUtils from 'react-native-onyx/dist/OnyxUtils';
-import {addGpsPoints, setStartAddress} from '@libs/actions/GPSDraftDetails';
-import {BACKGROUND_LOCATION_TRACKING_TASK_NAME} from '@pages/iou/request/step/IOURequestStepDistanceGPS/const';
-import addressFromGpsPoint from '@pages/iou/request/step/IOURequestStepDistanceGPS/utils/addressFromGpsPoint';
-import coordinatesToString from '@pages/iou/request/step/IOURequestStepDistanceGPS/utils/coordinatesToString';
-import ONYXKEYS from '@src/ONYXKEYS';
-
-type BackgroundLocationTrackingTaskData = {locations: LocationObject[]};
-
-defineTask<BackgroundLocationTrackingTaskData>(BACKGROUND_LOCATION_TRACKING_TASK_NAME, async ({data, error}) => {
-    if (error) {
-        console.error('[GPS distance request] Long-running task error: ', {error, data});
-        return;
-    }
-
-    const gpsDraftDetails = await OnyxUtils.get(ONYXKEYS.GPS_DRAFT_DETAILS);
-
-    const currentPoints = gpsDraftDetails?.gpsPoints ?? [];
-
-    if (currentPoints.length === 0) {
-        const startPoint = data.locations.at(0);
-
-        if (startPoint) {
-            const address = await addressFromGpsPoint({lat: startPoint.coords.latitude, long: startPoint.coords.longitude});
-
-            if (address !== null) {
-                setStartAddress({value: address, type: 'address'});
-            } else {
-                setStartAddress({value: coordinatesToString({lat: startPoint.coords.latitude, long: startPoint.coords.longitude}), type: 'coordinates'});
-            }
-        }
-    }
-
-    const newGpsPoints = data.locations.map((location) => ({lat: location.coords.latitude, long: location.coords.longitude}));
-
-    addGpsPoints(gpsDraftDetails, newGpsPoints);
-});
diff --git a/src/setup/backgroundLocationTrackingTask/index.ts b/src/setup/backgroundLocationTrackingTask/index.ts
deleted file mode 100644
index 6ec552fde091..000000000000
--- a/src/setup/backgroundLocationTrackingTask/index.ts
+++ /dev/null
@@ -1,4 +0,0 @@
-/**
- * This file is intentionally empty as GPS feature is only supported on mobile devices.
- * See `index.native.ts` for the native implementation.
- */
diff --git a/src/setup/telemetry/index.ts b/src/setup/telemetry/index.ts
index e82f96906992..ee2f3f07e3e1 100644
--- a/src/setup/telemetry/index.ts
+++ b/src/setup/telemetry/index.ts
@@ -2,7 +2,7 @@ import * as Sentry from '@sentry/react-native';
 import {Platform} from 'react-native';
 import {isDevelopment} from '@libs/Environment/Environment';
 import {startSpan} from '@libs/telemetry/activeSpans';
-import {browserProfilingIntegration, navigationIntegration, tracingIntegration} from '@libs/telemetry/integrations';
+import {browserProfilingIntegration, browserTracingIntegration, navigationIntegration, tracingIntegration} from '@libs/telemetry/integrations';
 import processBeforeSendTransactions from '@libs/telemetry/middlewares';
 import CONFIG from '@src/CONFIG';
 import CONST from '@src/CONST';
@@ -10,15 +10,13 @@ import pkg from '../../../package.json';
 import makeDebugTransport from './debugTransport';
 
 export default function (): void {
-    const integrations = [navigationIntegration, tracingIntegration, browserProfilingIntegration].filter((integration) => !!integration);
+    const integrations = [navigationIntegration, tracingIntegration, browserProfilingIntegration, browserTracingIntegration].filter((integration) => !!integration);
 
     Sentry.init({
         dsn: CONFIG.SENTRY_DSN,
         transport: isDevelopment() ? makeDebugTransport : undefined,
         tracesSampleRate: 1.0,
-        // 1. Profiling for Android is currently disabled because it causes crashes sometimes.
-        // 2. When updating the profile sample rate, make sure it will not blow up our current limit in Sentry.
-        profilesSampleRate: Platform.OS === 'android' ? 0 : 0.3,
+        profilesSampleRate: Platform.OS === 'android' ? 0 : 1.0,
         enableAutoPerformanceTracing: true,
         enableUserInteractionTracing: true,
         integrations,
diff --git a/src/stories/objects/Transaction.ts b/src/stories/objects/Transaction.ts
index 4da6bea09404..c8f08b5d3e7f 100644
--- a/src/stories/objects/Transaction.ts
+++ b/src/stories/objects/Transaction.ts
@@ -20,7 +20,7 @@ const transaction: Transaction & {mcc: string; modifiedMCC: string} = {
     managedCard: false,
     mcc: '',
     merchant: "Mario's",
-    modifiedAmount: '',
+    modifiedAmount: 0,
     modifiedCreated: '',
     modifiedCurrency: '',
     modifiedMCC: '',
diff --git a/src/styles/index.ts b/src/styles/index.ts
index e94d9a270788..1f56011feb3c 100644
--- a/src/styles/index.ts
+++ b/src/styles/index.ts
@@ -7,8 +7,8 @@ import type {LineLayer} from 'react-map-gl';
 import type {Animated, ImageStyle, TextStyle, ViewStyle} from 'react-native';
 import {Platform, StyleSheet} from 'react-native';
 import type {PickerStyle} from 'react-native-picker-select';
-import type {SharedValue} from 'react-native-reanimated';
 import {interpolate} from 'react-native-reanimated';
+import type {SharedValue} from 'react-native-reanimated';
 import type {MixedStyleDeclaration, MixedStyleRecord} from 'react-native-render-html';
 import type {ValueOf} from 'type-fest';
 import type DotLottieAnimation from '@components/LottieAnimations/types';
@@ -1638,15 +1638,6 @@ const staticStyles = (theme: ThemeColors) =>
             justifyContent: 'center',
         },
 
-        floatingSecondaryActionButton: {
-            backgroundColor: theme.buttonDefaultBG,
-            height: variables.componentSizeLarge,
-            width: variables.componentSizeLarge,
-            borderRadius: 999,
-            alignItems: 'center',
-            justifyContent: 'center',
-        },
-
         floatingActionButtonSmall: {
             width: variables.componentSizeNormal,
             height: variables.componentSizeNormal,
@@ -1659,15 +1650,6 @@ const staticStyles = (theme: ThemeColors) =>
             zIndex: 10,
         },
 
-        floatingGpsButton: {
-            position: 'absolute',
-            // floatingCameraButton top property value (componentSizeLarge + 16) +
-            // + floatingGpsButton height (componentSizeLarge) + gap (12) = 2 * componentSizeLarge + 28
-            top: 2 * -variables.componentSizeLarge - 28,
-            right: 16,
-            zIndex: 10,
-        },
-
         topBarLabel: {
             color: theme.text,
             fontSize: variables.fontSizeXLarge,
@@ -3310,11 +3292,6 @@ const staticStyles = (theme: ThemeColors) =>
             height: 180,
         },
 
-        mfaBlockingViewAnimation: {
-            width: 180,
-            height: 180,
-        },
-
         locationErrorLinkText: {
             textAlignVertical: 'center',
             fontSize: variables.fontSizeLabel,
@@ -5067,10 +5044,6 @@ const staticStyles = (theme: ThemeColors) =>
             width: variables.updateTextViewContainerWidth,
         },
 
-        twoFARequiredOverlay: {
-            zIndex: 20, // must be greater than floatingCameraButton.zIndex
-        },
-
         twoFARequiredContainer: {
             maxWidth: 520,
             margin: 'auto',
@@ -5656,9 +5629,6 @@ const staticStyles = (theme: ThemeColors) =>
             width: 179,
             height: 180,
         },
-        paymentMethodErrorRow: {
-            paddingHorizontal: variables.iconSizeMenuItem + variables.iconSizeNormal / 2,
-        },
     }) satisfies StaticStyles;
 
 const dynamicStyles = (theme: ThemeColors) =>
diff --git a/src/styles/utils/spacing.ts b/src/styles/utils/spacing.ts
index ad53231c0b12..152b4de5ab5e 100644
--- a/src/styles/utils/spacing.ts
+++ b/src/styles/utils/spacing.ts
@@ -31,14 +31,6 @@ export default {
         margin: 20,
     },
 
-    mn5: {
-        margin: -20,
-    },
-
-    mn6: {
-        margin: -24,
-    },
-
     mhAuto: {
         marginHorizontal: 'auto',
     },
@@ -175,18 +167,10 @@ export default {
         marginRight: 40,
     },
 
-    mrn1: {
-        marginRight: -4,
-    },
-
     mrn2: {
         marginRight: -8,
     },
 
-    mrn3: {
-        marginRight: -12,
-    },
-
     mrn5: {
         marginRight: -20,
     },
@@ -535,10 +519,6 @@ export default {
         paddingVertical: 24,
     },
 
-    pv8: {
-        paddingVertical: 32,
-    },
-
     pv10: {
         paddingVertical: 40,
     },
diff --git a/src/styles/variables.ts b/src/styles/variables.ts
index 4c509891322d..9362e696b116 100644
--- a/src/styles/variables.ts
+++ b/src/styles/variables.ts
@@ -110,7 +110,6 @@ export default {
     chooseFilesViewMargin: 8,
     sideBarWithLHBWidth: 320,
     navigationTabBarSize: 72,
-    popoverMargin: 18,
     pdfPageMaxWidth: 992,
     tooltipZIndex: 10050,
     gutterWidth: 12,
@@ -397,12 +396,4 @@ export default {
     splitExpenseAmountMobileWidth: 82,
     splitExpensePercentageWidth: 42,
     splitExpensePercentageMobileWidth: 62,
-
-    // Multifactor Authentication illustrations size
-    openPadlockWidth: 140,
-    openPadlockHeight: 140,
-    runOutOfTimeWidth: 218,
-    runOutOfTimeHeight: 200,
-    humptyDumptyWidth: 245,
-    humptyDumptyHeight: 165,
 } as const;
diff --git a/src/types/form/ExpenseRuleForm.ts b/src/types/form/ExpenseRuleForm.ts
deleted file mode 100644
index 597d6d832dbf..000000000000
--- a/src/types/form/ExpenseRuleForm.ts
+++ /dev/null
@@ -1,26 +0,0 @@
-import type {ValueOf} from 'type-fest';
-import CONST from '@src/CONST';
-import type Form from './Form';
-
-const INPUT_IDS = CONST.EXPENSE_RULES.FIELDS;
-
-type InputID = ValueOf<typeof INPUT_IDS>;
-
-type ExpenseRuleForm = Form<
-    InputID,
-    {
-        [INPUT_IDS.BILLABLE]: 'true' | 'false';
-        [INPUT_IDS.CATEGORY]: string;
-        [INPUT_IDS.DESCRIPTION]: string;
-        [INPUT_IDS.CREATE_REPORT]: boolean;
-        [INPUT_IDS.RENAME_MERCHANT]: string;
-        [INPUT_IDS.MERCHANT]: string;
-        [INPUT_IDS.REIMBURSABLE]: 'true' | 'false';
-        [INPUT_IDS.REPORT]: string;
-        [INPUT_IDS.TAG]: string;
-        [INPUT_IDS.TAX]: string;
-    }
->;
-
-export type {ExpenseRuleForm, InputID};
-export default INPUT_IDS;
diff --git a/src/types/form/ResetDomainForm.ts b/src/types/form/ResetDomainForm.ts
deleted file mode 100644
index faac22b333f2..000000000000
--- a/src/types/form/ResetDomainForm.ts
+++ /dev/null
@@ -1,18 +0,0 @@
-import type {ValueOf} from 'type-fest';
-import type Form from './Form';
-
-const INPUT_IDS = {
-    DOMAIN_NAME: 'domainName',
-} as const;
-
-type InputID = ValueOf<typeof INPUT_IDS>;
-
-type ResetDomainForm = Form<
-    InputID,
-    {
-        [INPUT_IDS.DOMAIN_NAME]: string;
-    }
->;
-
-export type {ResetDomainForm};
-export default INPUT_IDS;
diff --git a/src/types/form/index.ts b/src/types/form/index.ts
index ac687cf145dd..41ab635811d3 100644
--- a/src/types/form/index.ts
+++ b/src/types/form/index.ts
@@ -101,5 +101,3 @@ export type {EnableGlobalReimbursementsForm} from './EnableGlobalReimbursementsF
 export type {EnterSignerInfoForm} from './EnterSignerInfoForm';
 export type {CreateDomainForm} from './CreateDomainForm';
 export type {SplitExpenseEditDateForm} from './SplitExpenseEditDateForm';
-export type {ResetDomainForm} from './ResetDomainForm';
-export type {ExpenseRuleForm} from './ExpenseRuleForm';
diff --git a/src/types/onyx/Account.ts b/src/types/onyx/Account.ts
index a13c84d9a6c8..ec1dea9ef676 100644
--- a/src/types/onyx/Account.ts
+++ b/src/types/onyx/Account.ts
@@ -231,9 +231,6 @@ type Account = {
         /** API errors when locking an account */
         errors: OnyxCommon.Errors;
     };
-
-    /** Epoch timestamp (in milliseconds) until which extended access is valid without requiring validateCode */
-    validateCodeExtendedAccessExpires?: number;
 };
 
 export default Account;
diff --git a/src/types/onyx/AssignCard.ts b/src/types/onyx/AssignCard.ts
index 0145c8325986..ad3d0fd3636c 100644
--- a/src/types/onyx/AssignCard.ts
+++ b/src/types/onyx/AssignCard.ts
@@ -8,15 +8,7 @@ import type PersonalDetails from './PersonalDetails';
 /** Assign card flow steps */
 type AssignCardStep = ValueOf<typeof CONST.COMPANY_CARD.STEP>;
 
-/**
- * Data required to assign a company card.
- *
- * Note on card identifiers:
- * - `cardName`: The masked card number displayed to users (e.g., "XXXX1234" or "VISA - 1234")
- * - `encryptedCardNumber`: The identifier sent to backend
- *   - For direct feeds (Plaid/OAuth): equals cardName
- *   - For commercial feeds (Visa/Mastercard/Amex): encrypted value from cardList
- */
+/** Data required to be sent to issue a new card */
 type AssignCardData = {
     /** The cardholder personal details */
     cardholder?: PersonalDetails;
@@ -24,36 +16,28 @@ type AssignCardData = {
     /** The email address of the assignee */
     email: string;
 
-    /**
-     * The identifier sent to backend for card assignment.
-     * For direct feeds: equals cardName
-     * For commercial feeds: encrypted value from cardList
-     */
+    /** Encrypted number of the selected card */
     encryptedCardNumber: string;
 
+    /** Number of the selected card */
+    cardNumber: string;
+
     /** The name of the feed */
     bankName: CompanyCardFeed;
 
-    /** The masked card number displayed to users (e.g., "XXXX1234" or "VISA - 1234"). This is the original card identifier and should not be edited. */
+    /** The name of the card */
     cardName: string;
 
-    /**
-     * The custom card name that can be edited by the user.
-     * Initially set to cardName, but can be changed in CardNameStep.
-     * This value is sent to the backend as the card name when assigning.
-     */
-    customCardName: string;
-
     /** The transaction start date of the card */
     startDate: string;
 
     /** An option based on which the transaction start date is chosen */
     dateOption: string;
 
-    /** Bank ID for Plaid */
+    /** bank id for Plaid */
     institutionId?: string;
 
-    /** Access token for Plaid bank */
+    /** access token for Plaid bank */
     plaidAccessToken?: string;
 
     /** Plaid feed name */
diff --git a/src/types/onyx/Card.ts b/src/types/onyx/Card.ts
index a6f9880ea507..05e10fe6518f 100644
--- a/src/types/onyx/Card.ts
+++ b/src/types/onyx/Card.ts
@@ -54,9 +54,6 @@ type Card = OnyxCommon.OnyxValueWithOfflineFeedback<{
     /** Card number */
     cardNumber?: string;
 
-    /** Encrypted card number */
-    encryptedCardNumber?: string;
-
     /** Current fraud state of the card */
     fraud: ValueOf<typeof CONST.EXPENSIFY_CARD.FRAUD_TYPES>;
 
@@ -224,21 +221,6 @@ type ExpensifyCardDetails = {
     cvv: string;
 };
 
-/**
- * Unified type for unassigned cards that normalizes the difference between
- * direct feeds (Plaid/OAuth) and commercial/custom feeds (Visa/Mastercard/Amex).
- *
- * For direct feeds: cardName === cardID (both are the card name string)
- * For commercial feeds: cardName is the masked card number, cardID is the encrypted value
- */
-type UnassignedCard = {
-    /** The masked card number displayed to users (e.g., "XXXX1234" or "VISA - 1234") */
-    cardName: string;
-
-    /** The identifier sent to backend - equals cardName for direct feeds, encrypted value for commercial feeds */
-    cardID: string;
-};
-
 /** List of assignable cards */
 type AssignableCardsList = Record<string, string>;
 
@@ -324,14 +306,8 @@ type FailedCompanyCardAssignment = {
     /** The name of the card */
     cardName: string;
 
-    /** Custom card name */
-    customCardName?: string;
-
-    /** Failed company card assignment */
-    hasFailedCardAssignment: boolean;
-
-    /** Encrypted card number */
-    encryptedCardNumber: string;
+    /** The card number */
+    cardNumber: string;
 
     /** Card related error messages */
     errors?: OnyxCommon.Errors;
@@ -339,15 +315,6 @@ type FailedCompanyCardAssignment = {
     /** Collection of form field errors  */
     errorFields?: OnyxCommon.ErrorFields;
 
-    /** Whether the card is deleted */
-    isCardDeleted: boolean;
-
-    /** Whether the card is assigned */
-    isAssigned: boolean;
-
-    /** Assigned card */
-    assignedCard: Card | undefined;
-
     /**
      * The type of action that's pending
      */
@@ -357,6 +324,9 @@ type FailedCompanyCardAssignment = {
 /** Pending action for a company card assignment */
 type FailedCompanyCardAssignments = Record<string, FailedCompanyCardAssignment>;
 
+/** Card list with only available card */
+type FilteredCardList = Record<string, string>;
+
 export default Card;
 export type {
     ExpensifyCardDetails,
@@ -365,10 +335,10 @@ export type {
     IssueNewCardStep,
     IssueNewCardData,
     WorkspaceCardsList,
-    FailedCompanyCardAssignment,
-    FailedCompanyCardAssignments,
     CardLimitType,
+    FilteredCardList,
     ProvisioningCardData,
     AssignableCardsList,
-    UnassignedCard,
+    FailedCompanyCardAssignment,
+    FailedCompanyCardAssignments,
 };
diff --git a/src/types/onyx/DerivedValues.ts b/src/types/onyx/DerivedValues.ts
index 0aae8484cd97..d39cc88e76e2 100644
--- a/src/types/onyx/DerivedValues.ts
+++ b/src/types/onyx/DerivedValues.ts
@@ -70,17 +70,5 @@ type ReportTransactionsAndViolationsDerivedValue = Record<string, ReportTransact
  */
 type OutstandingReportsByPolicyIDDerivedValue = Record<string, OnyxCollection<Report>>;
 
-/**
- * The derived value for visible report actions.
- */
-type VisibleReportActionsDerivedValue = Record<string, Record<string, boolean>>;
-
 export default ReportAttributesDerivedValue;
-export type {
-    ReportAttributes,
-    ReportAttributesDerivedValue,
-    ReportTransactionsAndViolationsDerivedValue,
-    ReportTransactionsAndViolations,
-    OutstandingReportsByPolicyIDDerivedValue,
-    VisibleReportActionsDerivedValue,
-};
+export type {ReportAttributes, ReportAttributesDerivedValue, ReportTransactionsAndViolationsDerivedValue, ReportTransactionsAndViolations, OutstandingReportsByPolicyIDDerivedValue};
diff --git a/src/types/onyx/DomainErrors.ts b/src/types/onyx/DomainErrors.ts
index 26645c35ad8e..8d60af4ab8b3 100644
--- a/src/types/onyx/DomainErrors.ts
+++ b/src/types/onyx/DomainErrors.ts
@@ -28,6 +28,6 @@ type DomainErrors = {
      * Errors related to the "use technical contact billing card" setting
      */
     useTechnicalContactBillingCardErrors?: OnyxCommon.Errors;
-} & GeneralDomainAdminErrors;
+};
 
 export default DomainErrors;
diff --git a/src/types/onyx/DomainPendingActions.ts b/src/types/onyx/DomainPendingActions.ts
index b59ff7e638f4..fda27e5a1cf4 100644
--- a/src/types/onyx/DomainPendingActions.ts
+++ b/src/types/onyx/DomainPendingActions.ts
@@ -29,11 +29,6 @@ type DomainPendingAction = {
      * Pending action for the "use technical contact billing card" setting
      */
     useTechnicalContactBillingCard?: OnyxCommon.PendingAction;
-
-    /**
-     * Pending action for the domain itself
-     */
-    pendingAction?: OnyxCommon.PendingAction;
 };
 
 export default DomainPendingAction;
diff --git a/src/types/onyx/ExpenseRule.ts b/src/types/onyx/ExpenseRule.ts
index 7880a17e988e..f6743645ff20 100644
--- a/src/types/onyx/ExpenseRule.ts
+++ b/src/types/onyx/ExpenseRule.ts
@@ -18,9 +18,6 @@ type ExpenseRule = {
     /** The description set by the rule */
     comment?: string;
 
-    /** Whether to create report if necessary */
-    createReport?: boolean;
-
     /** The merchant set by the rule */
     merchant?: string;
 
@@ -40,5 +37,4 @@ type ExpenseRule = {
     tax?: Record<string, TaxRate>;
 };
 
-export type {TaxRate};
 export default ExpenseRule;
diff --git a/src/types/onyx/GpsDraftDetails.ts b/src/types/onyx/GpsDraftDetails.ts
index a2a99c3d8eb1..58becee852af 100644
--- a/src/types/onyx/GpsDraftDetails.ts
+++ b/src/types/onyx/GpsDraftDetails.ts
@@ -31,9 +31,6 @@ type GpsDraftDetails = {
 
     /** Is GPS trip in progress */
     isTracking: boolean;
-
-    /** reportID of the ongoing GPS trip */
-    reportID: string;
 };
 
 export default GpsDraftDetails;
diff --git a/src/types/onyx/IntroSelected.ts b/src/types/onyx/IntroSelected.ts
index 0ff0b7bdcd40..6c0c63aa98ed 100644
--- a/src/types/onyx/IntroSelected.ts
+++ b/src/types/onyx/IntroSelected.ts
@@ -2,7 +2,7 @@ import type {OnboardingInvite} from '@src/CONST';
 import type {OnboardingPurpose} from './index';
 
 /** The tasks of IntroSelected model */
-type IntroSelectedTask = 'viewTour' | 'createWorkspace' | 'setupCategories' | 'setupCategoriesAndTags';
+type IntroSelectedTask = 'viewTour' | 'createWorkspace' | 'setupCategories';
 
 /** Model of onboarding */
 type IntroSelected = {
@@ -30,12 +30,6 @@ type IntroSelected = {
     /** Task reportID for 'addExpenseApprovals' type */
     addExpenseApprovals?: string;
 
-    /** Task reportID for 'setupTags' type */
-    setupTags?: string;
-
-    /** Task reportID for 'setupCategoriesAndTags' type */
-    setupCategoriesAndTags?: string;
-
     /** The previous onboarding choices of the user */
     previousChoices?: OnboardingPurpose[];
 };
diff --git a/src/types/onyx/OriginalMessage.ts b/src/types/onyx/OriginalMessage.ts
index b677fc135661..661fde10f1cc 100644
--- a/src/types/onyx/OriginalMessage.ts
+++ b/src/types/onyx/OriginalMessage.ts
@@ -455,12 +455,6 @@ type OriginalMessagePolicyChangeLog = {
     /** New value for max expense amount for violations */
     newMaxExpenseAmount?: number;
 
-    /** Old value for max expense age (days) */
-    oldMaxExpenseAge?: number;
-
-    /** New value for max expense age (days) */
-    newMaxExpenseAge?: number;
-
     /** Old default billable value */
     oldDefaultBillable?: string;
 
@@ -605,26 +599,6 @@ type OriginalMessagePolicyChangeLog = {
 
     /** The name of the enabled/disabled feature */
     featureName?: string;
-
-    /** The new reimburser details */
-    reimburser?: {
-        /** The email of the new reimburser */
-        email: string;
-        /** The name of the new reimburser */
-        name: string;
-        /** The accountID of the new reimburser */
-        accountID: number;
-    };
-
-    /** The previous reimburser details */
-    previousReimburser?: {
-        /** The email of the previous reimburser */
-        email: string;
-        /** The name of the previous reimburser */
-        name: string;
-        /** The accountID of the previous reimburser */
-        accountID: number;
-    };
 };
 
 /** Model of `join policy` report action */
diff --git a/src/types/onyx/PolicyCategory.ts b/src/types/onyx/PolicyCategory.ts
index 4f0848dde72f..90aa92ca9367 100644
--- a/src/types/onyx/PolicyCategory.ts
+++ b/src/types/onyx/PolicyCategory.ts
@@ -48,9 +48,6 @@ type PolicyCategory = OnyxCommon.OnyxValueWithOfflineFeedback<{
 
     /** Max expense amount with no receipt violation */
     maxAmountNoReceipt?: number | null;
-
-    /** If true, not providing attendees for a transaction with this category will trigger a violation */
-    areAttendeesRequired?: boolean;
 }>;
 
 /** Record of policy categories, indexed by their name */
diff --git a/src/types/onyx/Report.ts b/src/types/onyx/Report.ts
index 125d52452cc5..e24850da1638 100644
--- a/src/types/onyx/Report.ts
+++ b/src/types/onyx/Report.ts
@@ -252,7 +252,7 @@ type Report = OnyxCommon.OnyxValueWithOfflineFeedback<
         privateNotes?: Record<number, Note>;
 
         /** Collection of policy report fields, indexed by their fieldID */
-        fieldList?: Record<string, OnyxCommon.OnyxValueWithOfflineFeedback<PolicyReportField, 'defaultValue' | 'deletable'>>;
+        fieldList?: Record<string, PolicyReportField>;
 
         /** Collection of report permissions granted to the current user */
         permissions?: Array<ValueOf<typeof CONST.REPORT.PERMISSIONS>>;
diff --git a/src/types/onyx/Request.ts b/src/types/onyx/Request.ts
index ea361d97cfd4..c5bdc70c462f 100644
--- a/src/types/onyx/Request.ts
+++ b/src/types/onyx/Request.ts
@@ -1,29 +1,29 @@
-import type {OnyxKey, OnyxUpdate} from 'react-native-onyx';
+import type {OnyxUpdate} from 'react-native-onyx';
 import type Response from './Response';
 
 /** Model of onyx requests sent to the API */
-type OnyxData<TKey extends OnyxKey> = {
+type OnyxData = {
     /** Onyx instructions that are executed after getting response from server with jsonCode === 200 */
-    successData?: Array<OnyxUpdate<TKey>>;
+    successData?: OnyxUpdate[];
 
     /** Onyx instructions that are executed after getting response from server with jsonCode !== 200 */
-    failureData?: Array<OnyxUpdate<TKey>>;
+    failureData?: OnyxUpdate[];
 
     /** Onyx instructions that are executed after getting any response from server */
-    finallyData?: Array<OnyxUpdate<TKey>>;
+    finallyData?: OnyxUpdate[];
 
     /** Onyx instructions that are executed before request is made to the server */
-    optimisticData?: Array<OnyxUpdate<TKey>>;
+    optimisticData?: OnyxUpdate[];
 
     /** Onyx instructions that are executed when Onyx queue is flushed */
-    queueFlushedData?: Array<OnyxUpdate<TKey>>;
+    queueFlushedData?: OnyxUpdate[];
 };
 
 /** HTTP request method names */
 type RequestType = 'get' | 'post';
 
 /** Model of overall requests sent to the API */
-type RequestData<TKey extends OnyxKey = OnyxKey> = {
+type RequestData = {
     /** Name of the API command */
     command: string;
 
@@ -40,13 +40,13 @@ type RequestData<TKey extends OnyxKey = OnyxKey> = {
     shouldUseSecure?: boolean;
 
     /** Onyx instructions that are executed after getting response from server with jsonCode === 200 */
-    successData?: Array<OnyxUpdate<TKey>>;
+    successData?: OnyxUpdate[];
 
     /** Onyx instructions that are executed after getting response from server with jsonCode !== 200 */
-    failureData?: Array<OnyxUpdate<TKey>>;
+    failureData?: OnyxUpdate[];
 
     /** Onyx instructions that are executed after getting any response from server */
-    finallyData?: Array<OnyxUpdate<TKey>>;
+    finallyData?: OnyxUpdate[];
 
     /** Promise resolve handler */
     resolve?: (value: Response) => void;
@@ -93,7 +93,7 @@ type ConflictRequestReplace = {
     /**
      * The new request to replace the existing request in the queue.
      */
-    request?: Request<OnyxKey>;
+    request?: Request;
 };
 
 /**
@@ -159,7 +159,7 @@ type RequestConflictResolver = {
     /**
      * A function that checks if a new request conflicts with any existing requests in the queue.
      */
-    checkAndFixConflictingRequest?: (persistedRequest: Array<Request<OnyxKey>>) => ConflictActionData;
+    checkAndFixConflictingRequest?: (persistedRequest: Request[]) => ConflictActionData;
 
     /**
      * A boolean flag to mark a request as persisting into Onyx, if set to true it means when Onyx loads
@@ -174,7 +174,7 @@ type RequestConflictResolver = {
 };
 
 /** Model of requests sent to the API */
-type Request<TKey extends OnyxKey = OnyxKey> = RequestData<TKey> & OnyxData<TKey> & RequestConflictResolver;
+type Request = RequestData & OnyxData & RequestConflictResolver;
 
 /**
  * An object used to describe how a request can be paginated.
@@ -194,7 +194,7 @@ type PaginationConfig = {
 /**
  * A paginated request object.
  */
-type PaginatedRequest = Request<OnyxKey> &
+type PaginatedRequest = Request &
     PaginationConfig & {
         /**
          * A boolean flag to mark a request as Paginated.
diff --git a/src/types/onyx/Response.ts b/src/types/onyx/Response.ts
index ab93314762b2..037bc1648f14 100644
--- a/src/types/onyx/Response.ts
+++ b/src/types/onyx/Response.ts
@@ -1,4 +1,4 @@
-import type {OnyxKey, OnyxUpdate} from 'react-native-onyx';
+import type {OnyxUpdate} from 'react-native-onyx';
 
 /** Model of commands data */
 type Data = {
@@ -21,7 +21,7 @@ type Response = {
     jsonCode?: number | string;
 
     /** Collection of onyx updates (SET/MERGE/...) */
-    onyxData?: Array<OnyxUpdate<OnyxKey>>;
+    onyxData?: OnyxUpdate[];
 
     /** ID of the request that triggered this response */
     requestID?: string;
diff --git a/src/types/onyx/Transaction.ts b/src/types/onyx/Transaction.ts
index 4e342f66a3b8..aa97dbbde5fe 100644
--- a/src/types/onyx/Transaction.ts
+++ b/src/types/onyx/Transaction.ts
@@ -482,7 +482,7 @@ type Transaction = OnyxCommon.OnyxValueWithOfflineFeedback<
         merchant: string;
 
         /** The edited transaction amount */
-        modifiedAmount?: number | string;
+        modifiedAmount?: number;
 
         /** The edited attendees list */
         modifiedAttendees?: Attendee[];
@@ -631,12 +631,6 @@ type AdditionalTransactionChanges = {
 
     /** Previous distance before changes */
     distance?: number;
-
-    /** Odometer start reading for distance expenses */
-    odometerStart?: number;
-
-    /** Odometer end reading for distance expenses */
-    odometerEnd?: number;
 };
 
 /** Model of transaction changes  */
diff --git a/src/types/onyx/index.ts b/src/types/onyx/index.ts
index 4f44aa59e03d..81e89f0df9e3 100644
--- a/src/types/onyx/index.ts
+++ b/src/types/onyx/index.ts
@@ -28,7 +28,7 @@ import type Credentials from './Credentials';
 import type Currency from './Currency';
 import type {CurrencyList} from './Currency';
 import type CustomStatusDraft from './CustomStatusDraft';
-import type {OutstandingReportsByPolicyIDDerivedValue, ReportAttributesDerivedValue, ReportTransactionsAndViolationsDerivedValue, VisibleReportActionsDerivedValue} from './DerivedValues';
+import type {OutstandingReportsByPolicyIDDerivedValue, ReportAttributesDerivedValue, ReportTransactionsAndViolationsDerivedValue} from './DerivedValues';
 import type DismissedProductTraining from './DismissedProductTraining';
 import type DismissedReferralBanners from './DismissedReferralBanners';
 import type Domain from './Domain';
@@ -307,7 +307,6 @@ export type {
     LastSearchParams,
     ReportTransactionsAndViolationsDerivedValue,
     OutstandingReportsByPolicyIDDerivedValue,
-    VisibleReportActionsDerivedValue,
     ScheduleCallDraft,
     ValidateUserAndGetAccessiblePolicies,
     VacationDelegate,
diff --git a/src/utils/Base64URL.ts b/src/utils/Base64URL.ts
deleted file mode 100644
index 4c203de45976..000000000000
--- a/src/utils/Base64URL.ts
+++ /dev/null
@@ -1,44 +0,0 @@
-import type {WithImplicitCoercion} from 'buffer';
-
-/**
- * Base64URL-encoded representation of a value used in WebAuthn-like flows.
- */
-type Base64URLString = string;
-
-/**
- * Base64URL is not currently supported as an encoding in React Native hence the RegExp is needed.
- */
-const Base64URL = {
-    /**
-     * Converts a string into a URL-safe base64 representation.
-     */
-    encode: (value: WithImplicitCoercion<string | ArrayLike<number>>): Base64URLString => {
-        return Buffer.from(value).toString('base64').replaceAll('+', '-').replaceAll('/', '_').replace(/=+$/, '');
-    },
-    /**
-     * Decodes a URL-safe Base64 (Base64URL) string back to its original byte representation.
-     */
-    decode: (value: Base64URLString) => {
-        // Replace URL-safe characters back to Base64 standard characters
-        let base64 = value.replaceAll('-', '+').replaceAll('_', '/');
-
-        // Add padding characters '=' based on length modulo 4
-        switch (base64.length % 4) {
-            case 2:
-                base64 += '==';
-                break;
-            case 3:
-                base64 += '=';
-                break;
-            // No padding needed, for length modulo 4 being 0 or 1 (1 is technically not possible for valid base64)
-            default:
-                break;
-        }
-
-        // Convert the base64 string back to bytes
-        return Buffer.from(base64, 'base64');
-    },
-};
-
-export default Base64URL;
-export type {Base64URLString};
diff --git a/src/utils/geodesicDistance.ts b/src/utils/geodesicDistance.ts
deleted file mode 100644
index f01f720bca3e..000000000000
--- a/src/utils/geodesicDistance.ts
+++ /dev/null
@@ -1,32 +0,0 @@
-type GPSPoint = {lat: number; long: number};
-
-function degreesToRadians(degrees: number): number {
-    return (degrees * Math.PI) / 180;
-}
-
-/**
- * The Earth radius in meters. The {@link https://en.wikipedia.org/wiki/Earth_radius#Arithmetic_mean_radius mean radius}
- * was selected because it is {@link https://rosettacode.org/wiki/Haversine_formula#:~:text=This%20value%20is%20recommended recommended }
- * by the Haversine formula to reduce error.
- */
-const EARTH_RADIUS = 6371008.8;
-
-/**
- * Calculates the distance between two GPS coordinates using
- * {@link https://en.wikipedia.org/wiki/Haversine_formula Haversine formula}
- * @returns distance in meters
- */
-function geodesicDistance({lat: lat1, long: long1}: GPSPoint, {lat: lat2, long: long2}: GPSPoint) {
-    const dLat = degreesToRadians(lat1 - lat2);
-    const dLong = degreesToRadians(long1 - long2);
-    const lat1Radians = degreesToRadians(lat1);
-    const lat2Radians = degreesToRadians(lat2);
-
-    const a = Math.sin(dLat / 2) ** 2 + Math.cos(lat1Radians) * Math.cos(lat2Radians) * Math.sin(dLong / 2) ** 2;
-    const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
-    const distance = EARTH_RADIUS * c;
-
-    return distance;
-}
-
-export default geodesicDistance;
diff --git a/tests/actions/DomainTest.ts b/tests/actions/DomainTest.ts
index 4e2e544aceb4..f984caf83a36 100644
--- a/tests/actions/DomainTest.ts
+++ b/tests/actions/DomainTest.ts
@@ -1,11 +1,10 @@
 import Onyx from 'react-native-onyx';
-import {clearDomainErrors, createDomain, resetCreateDomainForm, resetDomain} from '@libs/actions/Domain';
+import {createDomain, resetCreateDomainForm} from '@libs/actions/Domain';
 import {WRITE_COMMANDS} from '@libs/API/types';
 import CONST from '@src/CONST';
 import IntlStore from '@src/languages/IntlStore';
 import OnyxUpdateManager from '@src/libs/actions/OnyxUpdateManager';
 import ONYXKEYS from '@src/ONYXKEYS';
-import type {Domain} from '@src/types/onyx';
 import * as TestHelper from '../utils/TestHelper';
 import waitForBatchedUpdates from '../utils/waitForBatchedUpdates';
 
@@ -22,7 +21,7 @@ describe('actions/Domain', () => {
         return Onyx.clear().then(waitForBatchedUpdates);
     });
 
-    it('createDomain', () => {
+    describe('createDomain', () => {
         const apiWriteSpy = jest.spyOn(require('@libs/API'), 'write').mockImplementation(() => Promise.resolve());
         createDomain('test.com');
 
@@ -39,82 +38,25 @@ describe('actions/Domain', () => {
         apiWriteSpy.mockRestore();
     });
 
-    it('resetCreateDomainForm - clears form onyx data', async () => {
-        const timestamp = 123;
-
-        await Onyx.set(ONYXKEYS.FORMS.CREATE_DOMAIN_FORM, {
-            hasCreationSucceeded: true,
-            errors: {[timestamp]: 'error'},
-        });
-
-        resetCreateDomainForm();
-
-        await TestHelper.getOnyxData({
-            key: ONYXKEYS.FORMS.CREATE_DOMAIN_FORM,
-            waitForCollectionCallback: false,
-            callback: (form) => {
-                expect(form?.hasCreationSucceeded).toBeFalsy();
-                expect(form?.errors).toBeFalsy();
-            },
-        });
-    });
-
-    it('resetDomain', () => {
-        const apiWriteSpy = jest.spyOn(require('@libs/API'), 'write').mockImplementation(() => Promise.resolve());
-        const domainAccountID = 123;
-        const domainName = 'test.com';
-        const domain = {
-            accountID: domainAccountID,
-        } as Domain;
-
-        resetDomain(domainAccountID, domainName, domain);
-
-        expect(apiWriteSpy).toHaveBeenCalledWith(
-            WRITE_COMMANDS.DELETE_DOMAIN,
-            {domainAccountID, domainName},
-            {
-                optimisticData: [expect.objectContaining({value: {pendingAction: CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE}}), expect.objectContaining({value: null})],
-                successData: [expect.objectContaining({value: {pendingAction: null}}), expect.objectContaining({value: {errors: null}})],
-                failureData: [
-                    expect.objectContaining({value: domain}),
-                    expect.objectContaining({value: {pendingAction: null}}),
-                    // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
-                    expect.objectContaining({value: {errors: expect.any(Object)}}),
-                ],
-            },
-        );
-
-        apiWriteSpy.mockRestore();
-    });
-
-    it('clearDomainErrors- clears domain errors and pending actions', async () => {
-        const domainAccountID = 123;
-        const timestamp = 456;
-
-        await Onyx.set(`${ONYXKEYS.COLLECTION.DOMAIN_ERRORS}${domainAccountID}` as const, {
-            errors: {[timestamp]: 'error'},
-        });
-
-        await Onyx.set(`${ONYXKEYS.COLLECTION.DOMAIN_PENDING_ACTIONS}${domainAccountID}` as const, {
-            pendingAction: CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE,
-        });
-
-        clearDomainErrors(domainAccountID);
-
-        await TestHelper.getOnyxData({
-            key: `${ONYXKEYS.COLLECTION.DOMAIN_ERRORS}${domainAccountID}`,
-            waitForCollectionCallback: false,
-            callback: (errors) => {
-                expect(errors?.errors).toBeFalsy();
-            },
-        });
-
-        await TestHelper.getOnyxData({
-            key: `${ONYXKEYS.COLLECTION.DOMAIN_PENDING_ACTIONS}${domainAccountID}`,
-            waitForCollectionCallback: false,
-            callback: (pendingActions) => {
-                expect(pendingActions?.pendingAction).toBeFalsy();
-            },
+    describe('resetCreateDomainForm', () => {
+        it('clears form onyx data', async () => {
+            const timestamp = 123;
+
+            await Onyx.set(ONYXKEYS.FORMS.CREATE_DOMAIN_FORM, {
+                hasCreationSucceeded: true,
+                errors: {[timestamp]: 'error'},
+            });
+
+            resetCreateDomainForm();
+
+            await TestHelper.getOnyxData({
+                key: ONYXKEYS.FORMS.CREATE_DOMAIN_FORM,
+                waitForCollectionCallback: false,
+                callback: (form) => {
+                    expect(form?.hasCreationSucceeded).toBeFalsy();
+                    expect(form?.errors).toBeFalsy();
+                },
+            });
         });
     });
 });
diff --git a/tests/actions/IOU/MoneyRequestTest.ts b/tests/actions/IOU/MoneyRequestTest.ts
deleted file mode 100644
index 315263c1ae2b..000000000000
--- a/tests/actions/IOU/MoneyRequestTest.ts
+++ /dev/null
@@ -1,1051 +0,0 @@
-import type {OnyxEntry} from 'react-native-onyx';
-import Onyx from 'react-native-onyx';
-import type {MoneyRequestStepScanParticipantsFlowParams} from '@libs/actions/IOU/MoneyRequest';
-import {createTransaction, handleMoneyRequestStepDistanceNavigation, handleMoneyRequestStepScanParticipants} from '@libs/actions/IOU/MoneyRequest';
-import {startSplitBill} from '@libs/actions/IOU/Split';
-import getCurrentPosition from '@libs/getCurrentPosition';
-import {GeolocationErrorCode} from '@libs/getCurrentPosition/getCurrentPosition.types';
-import Navigation from '@libs/Navigation/Navigation';
-import type {ReceiptFile} from '@pages/iou/request/step/IOURequestStepScan/types';
-import CONST from '@src/CONST';
-import ONYXKEYS from '@src/ONYXKEYS';
-import ROUTES from '@src/ROUTES';
-import type {QuickAction} from '@src/types/onyx';
-import type {SplitShares} from '@src/types/onyx/Transaction';
-import * as IOU from '../../../src/libs/actions/IOU';
-import * as ReportUtils from '../../../src/libs/ReportUtils';
-import createRandomPolicy from '../../utils/collections/policies';
-import {createRandomReport} from '../../utils/collections/reports';
-import createRandomTransaction from '../../utils/collections/transaction';
-import getOnyxValue from '../../utils/getOnyxValue';
-import waitForBatchedUpdates from '../../utils/waitForBatchedUpdates';
-
-jest.mock('@libs/actions/IOU', () => {
-    const actualNav = jest.requireActual<typeof IOU>('@libs/actions/IOU');
-    return {
-        ...actualNav,
-        requestMoney: jest.fn(),
-        trackExpense: jest.fn(),
-        startSplitBill: jest.fn(),
-        createDistanceRequest: jest.fn(),
-        resetSplitShares: jest.fn(),
-    };
-});
-
-jest.mock('@libs/actions/IOU/Split', () => {
-    return {
-        startSplitBill: jest.fn(),
-    };
-});
-
-jest.mock('@src/libs/Navigation/Navigation', () => ({
-    navigate: jest.fn(),
-    goBack: jest.fn(),
-}));
-
-jest.mock('@libs/getCurrentPosition');
-
-describe('MoneyRequest', () => {
-    const currentUserAccountID = 111;
-    const currentUserLogin = 'test@example.com';
-    const TEST_USER_ACCOUNT_ID = 123;
-    const TEST_USER_EMAIL = 'test@test.com';
-    const SELF_DM_REPORT_ID = '2';
-    const TEST_LATITUDE = 37.7749;
-    const TEST_LONGITUDE = -122.4194;
-
-    beforeAll(() => {
-        Onyx.init({
-            keys: ONYXKEYS,
-            initialKeyStates: {
-                [ONYXKEYS.COLLECTION.SHARED_NVP_PRIVATE_USER_BILLING_GRACE_PERIOD_END]: null,
-            },
-        });
-        return waitForBatchedUpdates();
-    });
-
-    describe('createTransaction', () => {
-        const fakeTransaction = createRandomTransaction(1);
-        const fakeReport = createRandomReport(1, CONST.REPORT.CHAT_TYPE.POLICY_EXPENSE_CHAT);
-
-        const fileObj = new File([new Blob(['test'])], 'test.jpg', {type: 'image/jpeg'});
-        const fakeReceiptFile: ReceiptFile = {transactionID: fakeTransaction.transactionID, file: fileObj, source: 12345};
-        const fakeQuickAction: OnyxEntry<QuickAction> = {
-            action: CONST.QUICK_ACTIONS.ASSIGN_TASK,
-            chatReportID: 'quick_action_chat_123',
-            targetAccountID: 789,
-        };
-
-        const baseParams = {
-            transactions: [fakeTransaction],
-            iouType: CONST.IOU.TYPE.REQUEST,
-            report: fakeReport,
-            currentUserAccountID: 111,
-            currentUserEmail: 'test@example.com',
-            shouldGenerateTransactionThreadReport: false,
-            isASAPSubmitBetaEnabled: false,
-            transactionViolations: {},
-            files: [fakeReceiptFile],
-            participant: {accountID: 222, login: 'test@test.com'},
-            quickAction: fakeQuickAction,
-        };
-
-        afterEach(() => {
-            jest.clearAllMocks();
-        });
-
-        it('should call trackExpense for TRACK iouType', () => {
-            createTransaction({
-                ...baseParams,
-                iouType: CONST.IOU.TYPE.TRACK,
-            });
-
-            expect(IOU.trackExpense).toHaveBeenCalledTimes(1);
-            expect(IOU.requestMoney).toHaveBeenCalledTimes(0);
-
-            expect(IOU.trackExpense).toHaveBeenCalledWith(
-                expect.objectContaining({
-                    report: fakeReport,
-                    isDraftPolicy: false,
-                    participantParams: expect.objectContaining({
-                        payeeEmail: 'test@example.com',
-                        payeeAccountID: 111,
-                        participant: expect.objectContaining({accountID: 222, login: 'test@test.com'}),
-                    }),
-                    transactionParams: expect.objectContaining({
-                        amount: 0,
-                        currency: fakeTransaction.currency,
-                        created: fakeTransaction.created,
-                        receipt: expect.objectContaining({
-                            source: fakeReceiptFile.source,
-                            state: CONST.IOU.RECEIPT_STATE.SCAN_READY,
-                        }),
-                        billable: undefined,
-                        reimbursable: true,
-                        gpsPoint: undefined,
-                    }),
-                    shouldHandleNavigation: true,
-                    isASAPSubmitBetaEnabled: false,
-                }),
-            );
-
-            expect(IOU.trackExpense).toHaveBeenLastCalledWith(expect.objectContaining({shouldHandleNavigation: true}));
-        });
-
-        it('should call requestMoney for non-TRACK (SEND) iouType', () => {
-            createTransaction({
-                ...baseParams,
-                iouType: CONST.IOU.TYPE.SEND,
-            });
-
-            expect(IOU.requestMoney).toHaveBeenCalledTimes(1);
-            expect(IOU.trackExpense).toHaveBeenCalledTimes(0);
-
-            expect(IOU.requestMoney).toHaveBeenCalledWith(
-                expect.objectContaining({
-                    report: fakeReport,
-                    participantParams: expect.objectContaining({
-                        payeeEmail: 'test@example.com',
-                        payeeAccountID: 111,
-                        participant: expect.objectContaining({accountID: 222, login: 'test@test.com'}),
-                    }),
-                    gpsPoint: undefined,
-                    transactionParams: expect.objectContaining({
-                        amount: 0,
-                        created: fakeTransaction.created,
-                        currency: fakeTransaction.currency,
-                        attendees: fakeTransaction.comment?.attendees,
-                        merchant: '',
-                        receipt: expect.objectContaining({
-                            source: fakeReceiptFile.source,
-                            state: CONST.IOU.RECEIPT_STATE.SCAN_READY,
-                        }),
-                        billable: undefined,
-                        reimbursable: true,
-                    }),
-                    shouldHandleNavigation: true,
-                    backToReport: undefined,
-                    shouldGenerateTransactionThreadReport: false,
-                    isASAPSubmitBetaEnabled: false,
-                    currentUserAccountIDParam: 111,
-                    currentUserEmailParam: 'test@example.com',
-                    transactionViolations: {},
-                }),
-            );
-        });
-
-        it('should pass shouldHandleNavigation as true for last file only', () => {
-            const files = [
-                {...fakeReceiptFile, transactionID: '111'},
-                {...fakeReceiptFile, transactionID: '222'},
-                {...fakeReceiptFile, transactionID: '333'},
-            ];
-
-            createTransaction({
-                ...baseParams,
-                iouType: CONST.IOU.TYPE.TRACK,
-                files,
-            });
-
-            expect(IOU.trackExpense).toHaveBeenCalledTimes(files.length);
-
-            expect(IOU.trackExpense).toHaveBeenNthCalledWith(
-                1,
-                expect.objectContaining({
-                    shouldHandleNavigation: false,
-                }),
-            );
-            expect(IOU.trackExpense).toHaveBeenNthCalledWith(
-                2,
-                expect.objectContaining({
-                    shouldHandleNavigation: false,
-                }),
-            );
-            expect(IOU.trackExpense).toHaveBeenNthCalledWith(
-                3,
-                expect.objectContaining({
-                    shouldHandleNavigation: true,
-                }),
-            );
-        });
-
-        it('should default receipt source and state correctly when file is missing', () => {
-            const files = [{...fakeReceiptFile, file: undefined}];
-
-            createTransaction({
-                ...baseParams,
-                files,
-            });
-
-            expect(IOU.requestMoney).toHaveBeenCalledWith(
-                expect.objectContaining({
-                    transactionParams: expect.objectContaining({
-                        receipt: expect.objectContaining({
-                            source: 12345,
-                            state: CONST.IOU.RECEIPT_STATE.SCAN_READY,
-                        }),
-                    }),
-                }),
-            );
-        });
-
-        it('should default currentUserEmail to empty for requestMoney when not provided', () => {
-            createTransaction({
-                ...baseParams,
-                currentUserEmail: undefined,
-            });
-
-            expect(IOU.requestMoney).toHaveBeenCalledWith(
-                expect.objectContaining({
-                    currentUserEmailParam: '',
-                }),
-            );
-        });
-    });
-
-    describe('handleMoneyRequestStepScanParticipants', () => {
-        const fakeReport = {
-            ...createRandomReport(1, CONST.REPORT.CHAT_TYPE.POLICY_EXPENSE_CHAT),
-            ownerAccountID: currentUserAccountID,
-            policyID: '1',
-        };
-
-        const fakeTransaction = createRandomTransaction(1);
-        const fakePolicy = createRandomPolicy(1, CONST.POLICY.TYPE.TEAM);
-        const fakeQuickAction: OnyxEntry<QuickAction> = {
-            action: CONST.QUICK_ACTIONS.ASSIGN_TASK,
-            chatReportID: '555',
-        };
-        const fileObj = new File([new Blob(['test'])], 'test.jpg', {type: 'image/jpeg'});
-        const fakeReceiptFile: ReceiptFile = {transactionID: fakeTransaction.transactionID, file: fileObj, source: 12345};
-        const backTo = ROUTES.REPORT_WITH_ID.getRoute('123');
-        const managerMcTestAccountID = 444;
-
-        const baseParams: MoneyRequestStepScanParticipantsFlowParams = {
-            iouType: CONST.IOU.TYPE.CREATE,
-            policy: fakePolicy,
-            report: fakeReport,
-            reportID: '1',
-            reportAttributesDerived: {},
-            transactions: [fakeTransaction],
-            initialTransaction: {
-                transactionID: '1',
-                reportID: '1',
-                taxCode: '',
-                taxAmount: 0,
-                currency: CONST.CURRENCY.USD,
-            },
-            currentUserAccountID,
-            currentUserLogin,
-            personalDetails: {
-                [TEST_USER_ACCOUNT_ID]: {
-                    accountID: TEST_USER_ACCOUNT_ID,
-                    displayName: 'Test Participant',
-                    login: TEST_USER_EMAIL,
-                },
-            },
-            shouldSkipConfirmation: false,
-            isArchivedExpenseReport: false,
-            isAutoReporting: false,
-            isASAPSubmitBetaEnabled: false,
-            quickAction: fakeQuickAction,
-            files: [fakeReceiptFile],
-            shouldGenerateTransactionThreadReport: false,
-        };
-
-        beforeEach(async () => {
-            await Onyx.set(`${ONYXKEYS.COLLECTION.REPORT}${fakeReport.reportID}`, {
-                ...fakeReport,
-                participants: {
-                    [TEST_USER_ACCOUNT_ID]: {
-                        notificationPreference: CONST.REPORT.NOTIFICATION_PREFERENCE.ALWAYS,
-                        role: CONST.REPORT.ROLE.MEMBER,
-                    },
-                },
-            });
-        });
-
-        afterEach(async () => {
-            await Onyx.clear();
-            jest.clearAllMocks();
-        });
-
-        it(`should go back when backTo is provided`, () => {
-            handleMoneyRequestStepScanParticipants({
-                ...baseParams,
-                backTo,
-            });
-
-            expect(Navigation.goBack).toHaveBeenCalledWith(backTo);
-        });
-
-        it('should set manager mc test participant for the test transaction and navigate to confirmation page', async () => {
-            jest.spyOn(ReportUtils, 'generateReportID').mockReturnValue('123');
-
-            await Onyx.set(`${ONYXKEYS.PERSONAL_DETAILS_LIST}`, {
-                [managerMcTestAccountID]: {
-                    accountID: managerMcTestAccountID,
-                    login: CONST.EMAIL.MANAGER_MCTEST,
-                    displayName: 'Manager MC Test',
-                },
-            });
-
-            handleMoneyRequestStepScanParticipants({
-                ...baseParams,
-                isTestTransaction: true,
-            });
-
-            await waitForBatchedUpdates();
-
-            const updatedTransaction = await getOnyxValue(`${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${baseParams.initialTransaction.transactionID}`);
-            expect(updatedTransaction).toMatchObject({
-                participants: [
-                    expect.objectContaining({
-                        accountID: managerMcTestAccountID,
-                        login: CONST.EMAIL.MANAGER_MCTEST,
-                        selected: true,
-                    }),
-                ],
-                isFromGlobalCreate: true,
-            });
-
-            expect(Navigation.navigate).toHaveBeenCalledWith(
-                ROUTES.MONEY_REQUEST_STEP_CONFIRMATION.getRoute(CONST.IOU.ACTION.CREATE, CONST.IOU.ACTION.SUBMIT, baseParams.initialTransaction.transactionID, '123'),
-            );
-        });
-
-        it('should startSplitBill for SPLIT iouType when not from global create menu and skipping confirmation', async () => {
-            handleMoneyRequestStepScanParticipants({
-                ...baseParams,
-                iouType: CONST.IOU.TYPE.SPLIT,
-                shouldSkipConfirmation: true,
-                initialTransaction: {
-                    ...baseParams.initialTransaction,
-                    isFromGlobalCreate: false,
-                },
-            });
-
-            await waitForBatchedUpdates();
-
-            expect(startSplitBill).toHaveBeenCalledWith({
-                participants: [
-                    expect.objectContaining({
-                        accountID: 0,
-                        selected: true,
-                        isSelected: true,
-                    }),
-                ],
-                currentUserLogin: baseParams.currentUserLogin,
-                currentUserAccountID: baseParams.currentUserAccountID,
-                comment: '',
-                receipt: fakeReceiptFile.file,
-                existingSplitChatReportID: baseParams.reportID,
-                billable: false,
-                category: '',
-                tag: '',
-                currency: baseParams.initialTransaction.currency,
-                taxCode: baseParams.initialTransaction.taxCode,
-                taxAmount: baseParams.initialTransaction.taxAmount,
-                quickAction: baseParams.quickAction,
-                policyRecentlyUsedCurrencies: [],
-            });
-        });
-
-        it('should return if no participants found for non-SPLIT iouType when not from global create menu and skipping confirmation', async () => {
-            handleMoneyRequestStepScanParticipants({
-                ...baseParams,
-                iouType: CONST.IOU.TYPE.TRACK,
-                report: {
-                    ...fakeReport,
-                    chatType: CONST.REPORT.CHAT_TYPE.POLICY_ROOM,
-                },
-                shouldSkipConfirmation: true,
-                initialTransaction: {
-                    ...baseParams.initialTransaction,
-                    isFromGlobalCreate: false,
-                },
-            });
-
-            await waitForBatchedUpdates();
-            expect(IOU.trackExpense).not.toHaveBeenCalled();
-        });
-
-        it('should trackExpense with GPS coordinates when location permission is granted', async () => {
-            const mockGetCurrentPosition = getCurrentPosition as jest.MockedFunction<typeof getCurrentPosition>;
-            mockGetCurrentPosition.mockImplementation((successCallback) => {
-                successCallback({
-                    coords: {
-                        latitude: TEST_LATITUDE,
-                        longitude: TEST_LONGITUDE,
-                        altitude: null,
-                        accuracy: null,
-                        altitudeAccuracy: null,
-                        heading: null,
-                        speed: null,
-                    },
-                    timestamp: 1000,
-                });
-                return Promise.resolve();
-            });
-
-            handleMoneyRequestStepScanParticipants({
-                ...baseParams,
-                iouType: CONST.IOU.TYPE.TRACK,
-                shouldSkipConfirmation: true,
-                initialTransaction: {
-                    ...baseParams.initialTransaction,
-                    isFromGlobalCreate: false,
-                },
-                locationPermissionGranted: true,
-            });
-
-            expect(IOU.trackExpense).toHaveBeenCalledWith(
-                expect.objectContaining({
-                    transactionParams: expect.objectContaining({
-                        gpsPoint: {
-                            lat: TEST_LATITUDE,
-                            long: TEST_LONGITUDE,
-                        },
-                    }),
-                }),
-            );
-        });
-
-        it('should track expense without GPS coordinates when location permission is denied', async () => {
-            const mockGetCurrentPosition = getCurrentPosition as jest.MockedFunction<typeof getCurrentPosition>;
-            mockGetCurrentPosition.mockImplementation((successCallback, errorCallback) => {
-                errorCallback({
-                    code: GeolocationErrorCode.PERMISSION_DENIED,
-                    message: 'Permission Denied',
-                });
-                return Promise.resolve();
-            });
-
-            handleMoneyRequestStepScanParticipants({
-                ...baseParams,
-                iouType: CONST.IOU.TYPE.TRACK,
-                shouldSkipConfirmation: true,
-                initialTransaction: {
-                    ...baseParams.initialTransaction,
-                    isFromGlobalCreate: false,
-                },
-                locationPermissionGranted: true,
-            });
-
-            expect(IOU.trackExpense).toHaveBeenCalledWith(
-                expect.objectContaining({
-                    transactionParams: expect.objectContaining({
-                        gpsPoint: undefined,
-                    }),
-                }),
-            );
-        });
-
-        it('should trackExpense for TRACK iouType when not from global create menu and skipping confirmation', async () => {
-            handleMoneyRequestStepScanParticipants({
-                ...baseParams,
-                iouType: CONST.IOU.TYPE.TRACK,
-                shouldSkipConfirmation: true,
-                initialTransaction: {
-                    ...baseParams.initialTransaction,
-                    isFromGlobalCreate: false,
-                },
-            });
-
-            await waitForBatchedUpdates();
-
-            expect(IOU.trackExpense).toHaveBeenCalledWith({
-                report: baseParams.report,
-                isDraftPolicy: false,
-                participantParams: {
-                    payeeEmail: baseParams.currentUserLogin,
-                    payeeAccountID: baseParams.currentUserAccountID,
-                    participant: expect.objectContaining({
-                        accountID: 0,
-                        selected: true,
-                        isSelected: true,
-                        ownerAccountID: fakeReport.ownerAccountID,
-                    }),
-                },
-                transactionParams: {
-                    amount: 0,
-                    currency: fakeTransaction?.currency ?? 'USD',
-                    created: fakeTransaction?.created,
-                    receipt: fakeReceiptFile.file,
-                    billable: undefined,
-                    reimbursable: true,
-                    gpsPoint: undefined,
-                },
-                isASAPSubmitBetaEnabled: baseParams.isASAPSubmitBetaEnabled,
-                currentUserAccountIDParam: baseParams.currentUserAccountID,
-                currentUserEmailParam: baseParams.currentUserLogin,
-                quickAction: baseParams.quickAction,
-                shouldHandleNavigation: true,
-            });
-            // Should not call request money inside createTransaction function
-            expect(IOU.requestMoney).not.toHaveBeenCalled();
-        });
-
-        it(`should assign participants from report and navigate to confirmation page when not from global create menu`, async () => {
-            handleMoneyRequestStepScanParticipants({
-                ...baseParams,
-                iouType: CONST.IOU.TYPE.TRACK,
-                initialTransaction: {
-                    ...baseParams.initialTransaction,
-                    isFromGlobalCreate: false,
-                },
-            });
-
-            await waitForBatchedUpdates();
-
-            const updatedTransaction = await getOnyxValue(`${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${fakeReceiptFile.transactionID}`);
-            expect(updatedTransaction).toMatchObject({
-                participants: [
-                    {
-                        accountID: 0,
-                        isPolicyExpenseChat: true,
-                        reportID: fakeReport.reportID,
-                        selected: true,
-                    },
-                ],
-                participantsAutoAssigned: true,
-            });
-
-            expect(Navigation.navigate).toHaveBeenCalledWith(
-                ROUTES.MONEY_REQUEST_STEP_CONFIRMATION.getRoute(CONST.IOU.ACTION.CREATE, CONST.IOU.TYPE.TRACK, baseParams.initialTransaction.transactionID, baseParams.reportID),
-            );
-        });
-
-        it("should set initial transaction's participants if it is different from policyExpenseChat participants", async () => {
-            const defaultExpensePolicy = {
-                ...fakePolicy,
-                autoReporting: false,
-                type: CONST.POLICY.TYPE.TEAM,
-                isPolicyExpenseChatEnabled: true,
-            };
-
-            handleMoneyRequestStepScanParticipants({
-                ...baseParams,
-                initialTransaction: {
-                    ...baseParams.initialTransaction,
-                    participants: [
-                        {
-                            accountID: TEST_USER_ACCOUNT_ID,
-                            reportID: '123',
-                        },
-                    ],
-                },
-                defaultExpensePolicy,
-            });
-
-            await waitForBatchedUpdates();
-
-            const updatedTransaction = await getOnyxValue(`${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${fakeReceiptFile.transactionID}`);
-            expect(updatedTransaction).toMatchObject({
-                participants: [
-                    expect.objectContaining({
-                        accountID: TEST_USER_ACCOUNT_ID,
-                        reportID: '123',
-                    }),
-                ],
-            });
-            expect(Navigation.navigate).toHaveBeenCalledWith(
-                ROUTES.MONEY_REQUEST_STEP_CONFIRMATION.getRoute(
-                    CONST.IOU.ACTION.CREATE,
-                    CONST.IOU.TYPE.SUBMIT,
-                    baseParams.initialTransaction.transactionID,
-                    baseParams.reportID,
-                    baseParams.backToReport,
-                ),
-            );
-        });
-
-        it('should navigate to confirmation page of track expense for self DM', async () => {
-            await Onyx.set(`${ONYXKEYS.COLLECTION.REPORT}${SELF_DM_REPORT_ID}`, {
-                ...fakeReport,
-                reportID: SELF_DM_REPORT_ID,
-                chatType: CONST.REPORT.CHAT_TYPE.SELF_DM,
-            });
-
-            const defaultExpensePolicy = {
-                ...fakePolicy,
-                autoReporting: false,
-                type: CONST.POLICY.TYPE.TEAM,
-                isPolicyExpenseChatEnabled: true,
-            };
-
-            handleMoneyRequestStepScanParticipants({
-                ...baseParams,
-                initialTransaction: {
-                    ...baseParams.initialTransaction,
-                    participants: [
-                        {
-                            accountID: TEST_USER_ACCOUNT_ID,
-                            reportID: SELF_DM_REPORT_ID,
-                        },
-                    ],
-                },
-                defaultExpensePolicy,
-            });
-
-            await waitForBatchedUpdates();
-
-            expect(Navigation.navigate).toHaveBeenCalledWith(
-                ROUTES.MONEY_REQUEST_STEP_CONFIRMATION.getRoute(CONST.IOU.ACTION.CREATE, CONST.IOU.TYPE.TRACK, baseParams.initialTransaction.transactionID, SELF_DM_REPORT_ID),
-            );
-        });
-
-        it('should set participants and navigate to confirmation page when from global create menu', async () => {
-            const defaultExpensePolicy = {
-                ...fakePolicy,
-                autoReporting: false,
-                type: CONST.POLICY.TYPE.TEAM,
-                isPolicyExpenseChatEnabled: true,
-            };
-
-            handleMoneyRequestStepScanParticipants({
-                ...baseParams,
-                defaultExpensePolicy,
-            });
-
-            await waitForBatchedUpdates();
-
-            const draftTransaction = await getOnyxValue(`${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${fakeTransaction.transactionID}`);
-            expect(draftTransaction).toMatchObject({
-                reportID: CONST.REPORT.UNREPORTED_REPORT_ID,
-                participants: [
-                    {
-                        accountID: 0,
-                        isPolicyExpenseChat: true,
-                        reportID: fakeReport.reportID,
-                        selected: true,
-                    },
-                ],
-            });
-
-            expect(Navigation.navigate).toHaveBeenCalledWith(
-                ROUTES.MONEY_REQUEST_STEP_CONFIRMATION.getRoute(CONST.IOU.ACTION.CREATE, CONST.IOU.TYPE.SUBMIT, baseParams.initialTransaction.transactionID, '1'),
-            );
-        });
-
-        it('should navigate to participants page when the user click create expense option (combined submit/track flow)', () => {
-            handleMoneyRequestStepScanParticipants(baseParams);
-
-            expect(Navigation.navigate).toHaveBeenCalledWith(
-                ROUTES.MONEY_REQUEST_STEP_PARTICIPANTS.getRoute(baseParams.iouType, baseParams.initialTransaction.transactionID, baseParams.reportID),
-            );
-        });
-    });
-
-    describe('handleMoneyRequestStepDistanceNavigation', () => {
-        const fakeReport = createRandomReport(1, CONST.REPORT.CHAT_TYPE.POLICY_EXPENSE_CHAT);
-        const fakeTransaction = createRandomTransaction(1);
-        const fakePolicy = createRandomPolicy(1, CONST.POLICY.TYPE.TEAM);
-        const fakeQuickAction: OnyxEntry<QuickAction> = {
-            action: CONST.QUICK_ACTIONS.ASSIGN_TASK,
-            chatReportID: '555',
-            targetAccountID: 789,
-        };
-        const backTo = ROUTES.REPORT_WITH_ID.getRoute('123');
-        const firstSplitParticipantID = '100';
-        const secondSplitParticipantID = '101';
-
-        const baseParams = {
-            iouType: CONST.IOU.TYPE.CREATE,
-            report: fakeReport,
-            policy: fakePolicy,
-            transaction: fakeTransaction,
-            reportID: '1',
-            transactionID: '121',
-            reportAttributesDerived: {},
-            personalDetails: {},
-            waypoints: {},
-            customUnitRateID: 'rate1',
-            currentUserLogin: 'test@test.com',
-            currentUserAccountID: 1,
-            backToReport: undefined,
-            shouldSkipConfirmation: false,
-            defaultExpensePolicy: undefined,
-            isArchivedExpenseReport: false,
-            isAutoReporting: false,
-            isASAPSubmitBetaEnabled: false,
-            transactionViolations: {},
-            lastSelectedDistanceRates: {},
-            setDistanceRequestData: jest.fn(),
-            translate: jest.fn().mockReturnValue('Pending...'),
-            quickAction: fakeQuickAction,
-        };
-        const splitShares: SplitShares = {
-            [firstSplitParticipantID]: {
-                amount: 10,
-            },
-            [secondSplitParticipantID]: {
-                amount: 10,
-            },
-        };
-
-        beforeEach(async () => {
-            await Onyx.set(`${ONYXKEYS.COLLECTION.REPORT}${fakeReport.reportID}`, {
-                ...fakeReport,
-                participants: {
-                    [TEST_USER_ACCOUNT_ID]: {
-                        notificationPreference: CONST.REPORT.NOTIFICATION_PREFERENCE.ALWAYS,
-                        role: CONST.REPORT.ROLE.MEMBER,
-                    },
-                },
-            });
-        });
-
-        afterEach(async () => {
-            await Onyx.clear();
-            jest.clearAllMocks();
-        });
-
-        it('should go back when backTo is provided', () => {
-            handleMoneyRequestStepDistanceNavigation({
-                ...baseParams,
-                backTo,
-            });
-
-            expect(Navigation.goBack).toHaveBeenCalledWith(backTo);
-        });
-
-        it('should call resetSplitShares when splitShares exists for transaction and not from manual distance step', () => {
-            const splitTransaction = {
-                ...fakeTransaction,
-                splitShares,
-            };
-
-            handleMoneyRequestStepDistanceNavigation({
-                ...baseParams,
-                transaction: splitTransaction,
-                manualDistance: undefined,
-                shouldSkipConfirmation: true,
-                iouType: CONST.IOU.TYPE.TRACK,
-            });
-
-            expect(IOU.resetSplitShares).toHaveBeenCalledWith(splitTransaction);
-        });
-
-        it('call trackExpense for TRACK iouType when from manual distance step and skipping confirmation', async () => {
-            handleMoneyRequestStepDistanceNavigation({
-                ...baseParams,
-                manualDistance: 20,
-                shouldSkipConfirmation: true,
-                iouType: CONST.IOU.TYPE.TRACK,
-            });
-
-            expect(IOU.resetSplitShares).not.toHaveBeenCalled();
-
-            expect(IOU.trackExpense).toHaveBeenCalledWith({
-                report: baseParams.report,
-                isDraftPolicy: false,
-                participantParams: {
-                    payeeEmail: baseParams.currentUserLogin,
-                    payeeAccountID: baseParams.currentUserAccountID,
-                    participant: expect.objectContaining({
-                        accountID: 0,
-                        selected: true,
-                        isSelected: true,
-                        allReportErrors: {},
-                        brickRoadIndicator: null,
-                        isPolicyExpenseChat: true,
-                    }),
-                },
-                policyParams: {
-                    policy: baseParams.policy,
-                },
-                transactionParams: {
-                    amount: 0,
-                    distance: 20,
-                    currency: fakeTransaction?.currency ?? 'USD',
-                    created: fakeTransaction?.created ?? '',
-                    merchant: 'Pending...',
-                    receipt: {},
-                    billable: false,
-                    reimbursable: undefined,
-                    validWaypoints: undefined,
-                    customUnitRateID: baseParams.customUnitRateID,
-                    attendees: fakeTransaction?.comment?.attendees,
-                },
-                isASAPSubmitBetaEnabled: baseParams.isASAPSubmitBetaEnabled,
-                currentUserAccountIDParam: baseParams.currentUserAccountID,
-                currentUserEmailParam: baseParams.currentUserLogin,
-                quickAction: baseParams.quickAction,
-            });
-
-            // The function must return after trackExpense and not call createDistanceRequest
-            expect(IOU.createDistanceRequest).not.toHaveBeenCalled();
-        });
-
-        it('should call trackExpense for TRACK iouType with valid waypoints when not from manual distance step and skipping confirmation', async () => {
-            handleMoneyRequestStepDistanceNavigation({
-                ...baseParams,
-                manualDistance: undefined,
-                shouldSkipConfirmation: true,
-                iouType: CONST.IOU.TYPE.TRACK,
-            });
-
-            await waitForBatchedUpdates();
-
-            expect(IOU.resetSplitShares).not.toHaveBeenCalled();
-
-            const updatedTransaction = await getOnyxValue(`${ONYXKEYS.COLLECTION.TRANSACTION}${baseParams.transactionID}`);
-            const updatedDraftTransaction = await getOnyxValue(`${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${baseParams.transactionID}`);
-
-            expect(updatedTransaction?.merchant).toBe('Pending...');
-            expect(updatedDraftTransaction?.pendingFields).toMatchObject({
-                waypoints: CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD,
-            });
-
-            expect(IOU.trackExpense).toHaveBeenCalledWith({
-                report: baseParams.report,
-                isDraftPolicy: false,
-                participantParams: {
-                    payeeEmail: baseParams.currentUserLogin,
-                    payeeAccountID: baseParams.currentUserAccountID,
-                    participant: expect.objectContaining({
-                        accountID: 0,
-                        selected: true,
-                        isSelected: true,
-                        allReportErrors: {},
-                        brickRoadIndicator: null,
-                        isPolicyExpenseChat: true,
-                    }),
-                },
-                policyParams: {
-                    policy: baseParams.policy,
-                },
-                transactionParams: {
-                    amount: 0,
-                    distance: undefined,
-                    currency: fakeTransaction?.currency ?? 'USD',
-                    created: fakeTransaction?.created ?? '',
-                    merchant: 'Pending...',
-                    receipt: {},
-                    billable: false,
-                    reimbursable: true,
-                    validWaypoints: {},
-                    customUnitRateID: baseParams.customUnitRateID,
-                    attendees: fakeTransaction?.comment?.attendees,
-                },
-                isASAPSubmitBetaEnabled: baseParams.isASAPSubmitBetaEnabled,
-                currentUserAccountIDParam: baseParams.currentUserAccountID,
-                currentUserEmailParam: baseParams.currentUserLogin,
-                quickAction: baseParams.quickAction,
-            });
-        });
-
-        it('should call createDistanceRequest for non-TRACK iouType when from manual distance step and skipping confirmation', async () => {
-            handleMoneyRequestStepDistanceNavigation({
-                ...baseParams,
-                shouldSkipConfirmation: true,
-                manualDistance: 20,
-                iouType: CONST.IOU.TYPE.SUBMIT,
-            });
-
-            expect(IOU.createDistanceRequest).toHaveBeenCalledWith(
-                expect.objectContaining({
-                    report: baseParams.report,
-                    // participants: getParticipantsForTest(),
-                    currentUserLogin: baseParams.currentUserLogin,
-                    currentUserAccountID: baseParams.currentUserAccountID,
-                    iouType: CONST.IOU.TYPE.SUBMIT,
-                    transactionParams: expect.objectContaining({
-                        amount: 0,
-                        distance: 20,
-                        comment: '',
-                        created: fakeTransaction?.created ?? '',
-                        currency: fakeTransaction?.currency ?? 'USD',
-                        merchant: 'Pending...',
-                        billable: !!fakePolicy.defaultBillable,
-                        reimbursable: undefined,
-                        validWaypoints: undefined,
-                        customUnitRateID: CONST.CUSTOM_UNITS.FAKE_P2P_ID,
-                        splitShares: fakeTransaction?.splitShares,
-                        attendees: fakeTransaction?.comment?.attendees,
-                    }),
-                    backToReport: baseParams.backToReport,
-                    isASAPSubmitBetaEnabled: baseParams.isASAPSubmitBetaEnabled,
-                    transactionViolations: baseParams.transactionViolations,
-                    quickAction: baseParams.quickAction,
-                    policyRecentlyUsedCurrencies: [],
-                }),
-            );
-        });
-
-        it('should call createDistanceRequest for non-TRACK iouType when not from manual distance step and skipping confirmation', () => {
-            handleMoneyRequestStepDistanceNavigation({
-                ...baseParams,
-                shouldSkipConfirmation: true,
-                manualDistance: undefined,
-                iouType: CONST.IOU.TYPE.SUBMIT,
-            });
-
-            expect(IOU.createDistanceRequest).toHaveBeenCalledWith(
-                expect.objectContaining({
-                    report: baseParams.report,
-                    // participants: getParticipantsForTest(),
-                    currentUserLogin: baseParams.currentUserLogin,
-                    currentUserAccountID: baseParams.currentUserAccountID,
-                    iouType: CONST.IOU.TYPE.SUBMIT,
-                    transactionParams: expect.objectContaining({
-                        amount: 0,
-                        distance: undefined,
-                        comment: '',
-                        created: fakeTransaction?.created ?? '',
-                        currency: fakeTransaction?.currency ?? 'USD',
-                        merchant: 'Pending...',
-                        billable: !!fakePolicy.defaultBillable,
-                        reimbursable: !!fakePolicy?.defaultReimbursable,
-                        validWaypoints: {},
-                        customUnitRateID: CONST.CUSTOM_UNITS.FAKE_P2P_ID,
-                        splitShares: fakeTransaction?.splitShares,
-                        attendees: fakeTransaction?.comment?.attendees,
-                    }),
-                    backToReport: baseParams.backToReport,
-                    isASAPSubmitBetaEnabled: baseParams.isASAPSubmitBetaEnabled,
-                    transactionViolations: baseParams.transactionViolations,
-                    quickAction: baseParams.quickAction,
-                    policyRecentlyUsedCurrencies: [],
-                }),
-            );
-        });
-
-        it('should navigate to confirmation page when not skipping confirmation', async () => {
-            handleMoneyRequestStepDistanceNavigation({
-                ...baseParams,
-                shouldSkipConfirmation: false,
-                iouType: CONST.IOU.TYPE.SUBMIT,
-            });
-
-            await waitForBatchedUpdates();
-
-            const updatedTransaction = await getOnyxValue(`${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${baseParams.transactionID}`);
-            expect(updatedTransaction).toMatchObject({
-                participants: [
-                    {
-                        accountID: 0,
-                        isPolicyExpenseChat: true,
-                        reportID: fakeReport.reportID,
-                        selected: true,
-                    },
-                ],
-            });
-
-            expect(Navigation.navigate).toHaveBeenCalledWith(
-                ROUTES.MONEY_REQUEST_STEP_CONFIRMATION.getRoute(CONST.IOU.ACTION.CREATE, CONST.IOU.TYPE.SUBMIT, baseParams.transactionID, baseParams.reportID, baseParams.backToReport),
-            );
-        });
-
-        it('should navigate to confirmation page for CREATE flow from global menu', async () => {
-            await Onyx.set(`${ONYXKEYS.COLLECTION.POLICY}${fakePolicy.id}`, fakePolicy);
-
-            const defaultExpensePolicy = {
-                ...fakePolicy,
-                isPolicyExpenseChatEnabled: true,
-            };
-
-            handleMoneyRequestStepDistanceNavigation({
-                ...baseParams,
-                report: undefined,
-                defaultExpensePolicy,
-                isAutoReporting: true,
-                iouType: CONST.IOU.TYPE.CREATE,
-            });
-            await waitForBatchedUpdates();
-
-            const updatedTransaction = await getOnyxValue(`${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${baseParams.transactionID}`);
-            expect(updatedTransaction).toMatchObject({
-                reportID: fakeReport.reportID,
-                participants: [
-                    {
-                        accountID: 0,
-                        isPolicyExpenseChat: true,
-                        reportID: fakeReport.reportID,
-                        selected: true,
-                    },
-                ],
-                comment: {
-                    customUnit: {
-                        customUnitRateID: CONST.CUSTOM_UNITS.FAKE_P2P_ID,
-                    },
-                },
-            });
-
-            expect(Navigation.navigate).toHaveBeenCalledWith(
-                ROUTES.MONEY_REQUEST_STEP_CONFIRMATION.getRoute(CONST.IOU.ACTION.CREATE, CONST.IOU.TYPE.SUBMIT, baseParams.transactionID, fakeReport?.reportID),
-            );
-        });
-
-        it('should use UNREPORTED_REPORT_ID for transaction when autoReporting is disabled', async () => {
-            await Onyx.set(`${ONYXKEYS.COLLECTION.POLICY}${fakePolicy.id}`, fakePolicy);
-
-            const defaultExpensePolicy = {
-                ...fakePolicy,
-                autoReporting: false,
-                isPolicyExpenseChatEnabled: true,
-            };
-
-            handleMoneyRequestStepDistanceNavigation({
-                ...baseParams,
-                report: undefined,
-                defaultExpensePolicy,
-                iouType: CONST.IOU.TYPE.CREATE,
-            });
-            await waitForBatchedUpdates();
-
-            const updatedTransaction = await getOnyxValue(`${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${baseParams.transactionID}`);
-            expect(updatedTransaction?.reportID).toBe(CONST.REPORT.UNREPORTED_REPORT_ID);
-        });
-
-        it('should navigate to participants page when the user click create expense option (combined submit/track flow)', () => {
-            handleMoneyRequestStepDistanceNavigation({
-                ...baseParams,
-                iouType: CONST.IOU.TYPE.CREATE,
-            });
-
-            expect(Navigation.navigate).toHaveBeenCalledWith(ROUTES.MONEY_REQUEST_STEP_PARTICIPANTS.getRoute(CONST.IOU.TYPE.CREATE, baseParams.transactionID, baseParams.reportID));
-        });
-    });
-});
diff --git a/tests/actions/IOUTest.ts b/tests/actions/IOUTest.ts
index 406b16a052a3..fa9cfcf39136 100644
--- a/tests/actions/IOUTest.ts
+++ b/tests/actions/IOUTest.ts
@@ -2,6 +2,7 @@
 /* eslint-disable @typescript-eslint/no-unsafe-assignment */
 import {renderHook, waitFor} from '@testing-library/react-native';
 import {format} from 'date-fns';
+import {deepEqual} from 'fast-equals';
 import Onyx from 'react-native-onyx';
 import type {OnyxCollection, OnyxEntry, OnyxInputValue, OnyxMultiSetInput} from 'react-native-onyx';
 import OnyxListItemProvider from '@components/OnyxListItemProvider';
@@ -18,6 +19,7 @@ import {
     cancelPayment,
     canIOUBePaid,
     canUnapproveIOU,
+    completeSplitBill,
     createDistanceRequest,
     deleteMoneyRequest,
     evenlyDistributeSplitExpenseAmounts,
@@ -36,6 +38,8 @@ import {
     setDraftSplitTransaction,
     setMoneyRequestCategory,
     shouldOptimisticallyUpdateSearch,
+    splitBill,
+    startSplitBill,
     submitPerDiemExpense,
     submitReport,
     trackExpense,
@@ -44,6 +48,7 @@ import {
     updateMoneyRequestCategory,
     updateMoneyRequestTag,
     updateSplitExpenseAmountField,
+    updateSplitTransactionsFromSplitExpensesFlow,
 } from '@libs/actions/IOU';
 import {putOnHold} from '@libs/actions/IOU/Hold';
 import {getSendInvoiceInformation} from '@libs/actions/IOU/SendInvoice';
@@ -79,6 +84,7 @@ import type ReportAction from '@src/types/onyx/ReportAction';
 import type {ReportActions, ReportActionsCollectionDataSet} from '@src/types/onyx/ReportAction';
 import type Transaction from '@src/types/onyx/Transaction';
 import type {TransactionCollectionDataSet} from '@src/types/onyx/Transaction';
+import {toCollectionDataSet} from '@src/types/utils/CollectionDataSet';
 import {isEmptyObject} from '@src/types/utils/EmptyObject';
 import SafeString from '@src/utils/SafeString';
 import {changeTransactionsReport} from '../../src/libs/actions/Transaction';
@@ -104,8 +110,6 @@ const topMostReportID = '23423423';
 jest.mock('@src/libs/Navigation/Navigation', () => ({
     navigate: jest.fn(),
     dismissModal: jest.fn(),
-    dismissToPreviousRHP: jest.fn(),
-    dismissToSuperWideRHP: jest.fn(),
     dismissModalWithReport: jest.fn(),
     goBack: jest.fn(),
     getTopmostReportId: jest.fn(() => topMostReportID),
@@ -167,11 +171,15 @@ jest.mock('@libs/PolicyUtils', () => ({
 const CARLOS_EMAIL = 'cmartins@expensifail.com';
 const CARLOS_ACCOUNT_ID = 1;
 const CARLOS_PARTICIPANT: Participant = {notificationPreference: CONST.REPORT.NOTIFICATION_PREFERENCE.ALWAYS, role: 'member'};
+const JULES_EMAIL = 'jules@expensifail.com';
+const JULES_ACCOUNT_ID = 2;
+const JULES_PARTICIPANT: Participant = {notificationPreference: CONST.REPORT.NOTIFICATION_PREFERENCE.ALWAYS, role: 'member'};
 const RORY_EMAIL = 'rory@expensifail.com';
 const RORY_ACCOUNT_ID = 3;
 const RORY_PARTICIPANT: Participant = {notificationPreference: CONST.REPORT.NOTIFICATION_PREFERENCE.ALWAYS, role: 'admin'};
 const VIT_EMAIL = 'vit@expensifail.com';
 const VIT_ACCOUNT_ID = 4;
+const VIT_PARTICIPANT: Participant = {notificationPreference: CONST.REPORT.NOTIFICATION_PREFERENCE.ALWAYS, role: 'member'};
 
 OnyxUpdateManager();
 describe('actions/IOU', () => {
@@ -559,7 +567,6 @@ describe('actions/IOU', () => {
                 CONST.IOU.ACTION.CATEGORIZE,
                 reportActionableTrackExpense?.reportActionID,
                 {choice: CONST.ONBOARDING_CHOICES.MANAGE_TEAM},
-                {},
                 undefined,
             );
             await waitForBatchedUpdates();
@@ -908,186 +915,6 @@ describe('actions/IOU', () => {
         });
     });
 
-    describe('createDraftTransactionAndNavigateToParticipantSelector', () => {
-        it('should clear existing draft transactions when allTransactionDrafts is provided', async () => {
-            // Given existing draft transactions
-            const existingDraftTransaction1: Transaction = {...createRandomTransaction(1), transactionID: 'existing-draft-1'};
-            const existingDraftTransaction2: Transaction = {...createRandomTransaction(2), transactionID: 'existing-draft-2'};
-
-            await Onyx.set(`${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${existingDraftTransaction1.transactionID}`, existingDraftTransaction1);
-            await Onyx.set(`${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${existingDraftTransaction2.transactionID}`, existingDraftTransaction2);
-
-            // Given a selfDM report and a transaction to categorize
-            const selfDMReport = createRandomReport(1, CONST.REPORT.CHAT_TYPE.SELF_DM);
-            const transactionToCategorize: Transaction = {...createRandomTransaction(3), transactionID: 'transaction-to-categorize'};
-
-            // Given a report action ID for the track expense
-            const reportActionID = '1';
-
-            await Onyx.set(`${ONYXKEYS.COLLECTION.TRANSACTION}${transactionToCategorize.transactionID}`, transactionToCategorize);
-            await Onyx.set(`${ONYXKEYS.COLLECTION.REPORT}${selfDMReport.reportID}`, selfDMReport);
-
-            // Get the existing drafts to pass to the function
-            const allTransactionDrafts = await new Promise<OnyxCollection<Transaction>>((resolve) => {
-                const connection = Onyx.connect({
-                    key: ONYXKEYS.COLLECTION.TRANSACTION_DRAFT,
-                    waitForCollectionCallback: true,
-                    callback: (transactionDrafts) => {
-                        Onyx.disconnect(connection);
-                        resolve(transactionDrafts);
-                    },
-                });
-            });
-
-            // Verify existing drafts exist before calling the function
-            expect(allTransactionDrafts?.[`${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${existingDraftTransaction1.transactionID}`]).toBeTruthy();
-            expect(allTransactionDrafts?.[`${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${existingDraftTransaction2.transactionID}`]).toBeTruthy();
-
-            // When createDraftTransactionAndNavigateToParticipantSelector is called with allTransactionDrafts
-            createDraftTransactionAndNavigateToParticipantSelector(
-                transactionToCategorize.transactionID,
-                selfDMReport.reportID,
-                CONST.IOU.ACTION.CATEGORIZE,
-                reportActionID,
-                {choice: CONST.ONBOARDING_CHOICES.MANAGE_TEAM},
-                allTransactionDrafts,
-                undefined,
-            );
-            await waitForBatchedUpdates();
-
-            // Then the existing draft transactions should be cleared
-            const updatedTransactionDrafts = await new Promise<OnyxCollection<Transaction>>((resolve) => {
-                const connection = Onyx.connect({
-                    key: ONYXKEYS.COLLECTION.TRANSACTION_DRAFT,
-                    waitForCollectionCallback: true,
-                    callback: (transactionDrafts) => {
-                        Onyx.disconnect(connection);
-                        resolve(transactionDrafts);
-                    },
-                });
-            });
-
-            // Old drafts should be cleared
-            expect(updatedTransactionDrafts?.[`${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${existingDraftTransaction1.transactionID}`]).toBeFalsy();
-            expect(updatedTransactionDrafts?.[`${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${existingDraftTransaction2.transactionID}`]).toBeFalsy();
-
-            // New draft should be created for the transaction being categorized
-            expect(updatedTransactionDrafts?.[`${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${transactionToCategorize.transactionID}`]).toBeTruthy();
-        });
-
-        it('should create a draft transaction with correct data when categorizing', async () => {
-            // Given a selfDM report and a transaction with specific data
-            const selfDMReport = createRandomReport(1, CONST.REPORT.CHAT_TYPE.SELF_DM);
-            const originalTransaction: Transaction = {
-                ...createRandomTransaction(1),
-                transactionID: 'original-transaction',
-                amount: 5000,
-                currency: 'USD',
-            };
-
-            // Given a report action ID for the track expense
-            const reportActionID = '1';
-
-            await Onyx.set(`${ONYXKEYS.COLLECTION.TRANSACTION}${originalTransaction.transactionID}`, originalTransaction);
-            await Onyx.set(`${ONYXKEYS.COLLECTION.REPORT}${selfDMReport.reportID}`, selfDMReport);
-
-            // When createDraftTransactionAndNavigateToParticipantSelector is called with empty allTransactionDrafts
-            createDraftTransactionAndNavigateToParticipantSelector(
-                originalTransaction.transactionID,
-                selfDMReport.reportID,
-                CONST.IOU.ACTION.CATEGORIZE,
-                reportActionID,
-                {choice: CONST.ONBOARDING_CHOICES.MANAGE_TEAM},
-                {},
-                undefined,
-            );
-            await waitForBatchedUpdates();
-
-            // Then a draft transaction should be created with the correct data
-            const transactionDrafts = await new Promise<OnyxCollection<Transaction>>((resolve) => {
-                const connection = Onyx.connect({
-                    key: ONYXKEYS.COLLECTION.TRANSACTION_DRAFT,
-                    waitForCollectionCallback: true,
-                    callback: (drafts) => {
-                        Onyx.disconnect(connection);
-                        resolve(drafts);
-                    },
-                });
-            });
-
-            const draftTransaction = transactionDrafts?.[`${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${originalTransaction.transactionID}`];
-            expect(draftTransaction).toBeTruthy();
-            expect(draftTransaction?.amount).toBe(originalTransaction.amount);
-            expect(draftTransaction?.currency).toBe(originalTransaction.currency);
-            expect(draftTransaction?.actionableWhisperReportActionID).toBe(reportActionID);
-            expect(draftTransaction?.linkedTrackedExpenseReportID).toBe(selfDMReport.reportID);
-        });
-
-        it('should not create draft transaction when transactionID is undefined', async () => {
-            // Given a selfDM report
-            const selfDMReport = createRandomReport(1, CONST.REPORT.CHAT_TYPE.SELF_DM);
-            await Onyx.set(`${ONYXKEYS.COLLECTION.REPORT}${selfDMReport.reportID}`, selfDMReport);
-
-            // When createDraftTransactionAndNavigateToParticipantSelector is called with undefined transactionID
-            createDraftTransactionAndNavigateToParticipantSelector(
-                undefined,
-                selfDMReport.reportID,
-                CONST.IOU.ACTION.CATEGORIZE,
-                'some-report-action-id',
-                {choice: CONST.ONBOARDING_CHOICES.MANAGE_TEAM},
-                {},
-                undefined,
-            );
-            await waitForBatchedUpdates();
-
-            // Then no draft transaction should be created
-            const transactionDrafts = await new Promise<OnyxCollection<Transaction>>((resolve) => {
-                const connection = Onyx.connect({
-                    key: ONYXKEYS.COLLECTION.TRANSACTION_DRAFT,
-                    waitForCollectionCallback: true,
-                    callback: (drafts) => {
-                        Onyx.disconnect(connection);
-                        resolve(drafts);
-                    },
-                });
-            });
-
-            expect(Object.keys(transactionDrafts ?? {}).length).toBe(0);
-        });
-
-        it('should not create draft transaction when reportID is undefined', async () => {
-            // Given a transaction
-            const transaction: Transaction = {...createRandomTransaction(1), transactionID: 'test-transaction'};
-            await Onyx.set(`${ONYXKEYS.COLLECTION.TRANSACTION}${transaction.transactionID}`, transaction);
-
-            // When createDraftTransactionAndNavigateToParticipantSelector is called with undefined reportID
-            createDraftTransactionAndNavigateToParticipantSelector(
-                transaction.transactionID,
-                undefined,
-                CONST.IOU.ACTION.CATEGORIZE,
-                'some-report-action-id',
-                {choice: CONST.ONBOARDING_CHOICES.MANAGE_TEAM},
-                {},
-                undefined,
-            );
-            await waitForBatchedUpdates();
-
-            // Then no draft transaction should be created
-            const transactionDrafts = await new Promise<OnyxCollection<Transaction>>((resolve) => {
-                const connection = Onyx.connect({
-                    key: ONYXKEYS.COLLECTION.TRANSACTION_DRAFT,
-                    waitForCollectionCallback: true,
-                    callback: (drafts) => {
-                        Onyx.disconnect(connection);
-                        resolve(drafts);
-                    },
-                });
-            });
-
-            expect(Object.keys(transactionDrafts ?? {}).length).toBe(0);
-        });
-    });
-
     describe('requestMoney', () => {
         it('creates new chat if needed', () => {
             const amount = 10000;
@@ -1367,7 +1194,7 @@ describe('actions/IOU', () => {
                             attendees: [],
                             currency: CONST.CURRENCY.USD,
                             created: '',
-                            merchant: '(none)',
+                            merchant: '',
                             comment,
                         },
                         shouldGenerateTransactionThreadReport: true,
@@ -1688,7 +1515,7 @@ describe('actions/IOU', () => {
                                     expect(newTransaction?.reportID).toBe(iouReportID);
                                     expect(newTransaction?.amount).toBe(amount);
                                     expect(newTransaction?.comment?.comment).toBe(comment);
-                                    expect(newTransaction?.merchant).toBe(CONST.TRANSACTION.DEFAULT_MERCHANT);
+                                    expect(newTransaction?.merchant).toBe(CONST.TRANSACTION.PARTIAL_TRANSACTION_MERCHANT);
                                     expect(newTransaction?.pendingAction).toBe(CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD);
 
                                     // The transactionID on the iou action should match the one from the transactions collection
@@ -1868,7 +1695,7 @@ describe('actions/IOU', () => {
                                         expect(transaction?.reportID).toBe(iouReportID);
                                         expect(transaction?.amount).toBe(amount);
                                         expect(transaction?.comment?.comment).toBe(comment);
-                                        expect(transaction?.merchant).toBe(CONST.TRANSACTION.DEFAULT_MERCHANT);
+                                        expect(transaction?.merchant).toBe(CONST.TRANSACTION.PARTIAL_TRANSACTION_MERCHANT);
                                         expect(transaction?.pendingAction).toBe(CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD);
 
                                         // The transactionID on the iou action should match the one from the transactions collection
@@ -2711,39 +2538,182 @@ describe('actions/IOU', () => {
         });
     });
 
-    describe('payMoneyRequestElsewhere', () => {
-        it('clears outstanding IOUReport', () => {
-            const amount = 10000;
-            const comment = 'Giv money plz';
-            let chatReport: OnyxEntry<Report>;
-            let iouReport: OnyxEntry<Report>;
-            let createIOUAction: OnyxEntry<ReportAction<typeof CONST.REPORT.ACTIONS.TYPE.IOU>>;
-            let payIOUAction: OnyxEntry<ReportAction>;
-            let transaction: OnyxEntry<Transaction>;
-            requestMoney({
-                report: {reportID: ''},
-                participantParams: {
-                    payeeEmail: RORY_EMAIL,
-                    payeeAccountID: RORY_ACCOUNT_ID,
-                    participant: {login: CARLOS_EMAIL, accountID: CARLOS_ACCOUNT_ID},
+    describe('split expense', () => {
+        it('creates and updates new chats and IOUs as needed', () => {
+            jest.setTimeout(10 * 1000);
+            /*
+             * Given that:
+             *   - Rory and Carlos have chatted before
+             *   - Rory and Jules have chatted before and have an active IOU report
+             *   - Rory and Vit have never chatted together before
+             *   - There is no existing group chat with the four of them
+             */
+            const amount = 400;
+            const comment = 'Yes, I am splitting a bill for $4 USD';
+            const merchant = 'Yema Kitchen';
+            let carlosChatReport: OnyxEntry<Report> = {
+                reportID: rand64(),
+                type: CONST.REPORT.TYPE.CHAT,
+                participants: {[RORY_ACCOUNT_ID]: RORY_PARTICIPANT, [CARLOS_ACCOUNT_ID]: CARLOS_PARTICIPANT},
+            };
+            const carlosCreatedAction: OnyxEntry<ReportAction> = {
+                reportActionID: rand64(),
+                actionName: CONST.REPORT.ACTIONS.TYPE.CREATED,
+                created: DateUtils.getDBTime(),
+                reportID: carlosChatReport.reportID,
+            };
+            const julesIOUReportID = rand64();
+            let julesChatReport: OnyxEntry<Report> = {
+                reportID: rand64(),
+                type: CONST.REPORT.TYPE.CHAT,
+                iouReportID: julesIOUReportID,
+                participants: {[RORY_ACCOUNT_ID]: RORY_PARTICIPANT, [JULES_ACCOUNT_ID]: JULES_PARTICIPANT},
+            };
+            const julesChatCreatedAction: OnyxEntry<ReportAction> = {
+                reportActionID: rand64(),
+                actionName: CONST.REPORT.ACTIONS.TYPE.CREATED,
+                created: DateUtils.getDBTime(),
+                reportID: julesChatReport.reportID,
+            };
+            const julesCreatedAction: OnyxEntry<ReportAction> = {
+                reportActionID: rand64(),
+                actionName: CONST.REPORT.ACTIONS.TYPE.CREATED,
+                created: DateUtils.getDBTime(),
+                reportID: julesIOUReportID,
+            };
+            jest.advanceTimersByTime(200);
+            const julesExistingTransaction: OnyxEntry<Transaction> = {
+                transactionID: rand64(),
+                amount: 1000,
+                comment: {
+                    comment: 'This is an existing transaction',
+                    attendees: [{email: 'text@expensify.com', displayName: 'Test User', avatarUrl: ''}],
                 },
-                transactionParams: {
-                    amount,
-                    attendees: [],
+                created: DateUtils.getDBTime(),
+                currency: '',
+                merchant: '',
+                reportID: '',
+            };
+            let julesIOUReport: OnyxEntry<Report> = {
+                reportID: julesIOUReportID,
+                chatReportID: julesChatReport.reportID,
+                type: CONST.REPORT.TYPE.IOU,
+                ownerAccountID: RORY_ACCOUNT_ID,
+                managerID: JULES_ACCOUNT_ID,
+                currency: CONST.CURRENCY.USD,
+                total: julesExistingTransaction?.amount,
+            };
+            const julesExistingIOUAction: OnyxEntry<ReportAction> = {
+                reportActionID: rand64(),
+                actionName: CONST.REPORT.ACTIONS.TYPE.IOU,
+                actorAccountID: RORY_ACCOUNT_ID,
+                created: DateUtils.getDBTime(),
+                originalMessage: {
+                    IOUReportID: julesIOUReportID,
+                    IOUTransactionID: julesExistingTransaction?.transactionID,
+                    amount: julesExistingTransaction?.amount ?? 0,
                     currency: CONST.CURRENCY.USD,
-                    created: '',
-                    merchant: '',
-                    comment,
+                    type: CONST.IOU.REPORT_ACTION_TYPE.CREATE,
+                    participantAccountIDs: [RORY_ACCOUNT_ID, JULES_ACCOUNT_ID],
                 },
-                shouldGenerateTransactionThreadReport: true,
-                isASAPSubmitBetaEnabled: false,
-                currentUserAccountIDParam: 123,
-                currentUserEmailParam: 'existing@example.com',
-                transactionViolations: {},
-                policyRecentlyUsedCurrencies: [],
-                quickAction: undefined,
-            });
-            return waitForBatchedUpdates()
+                reportID: julesIOUReportID,
+            };
+
+            let carlosIOUReport: OnyxEntry<Report>;
+            let carlosIOUAction: OnyxEntry<ReportAction<typeof CONST.REPORT.ACTIONS.TYPE.IOU>>;
+            let carlosIOUCreatedAction: OnyxEntry<ReportAction>;
+            let carlosTransaction: OnyxEntry<Transaction>;
+
+            let julesIOUAction: OnyxEntry<ReportAction<typeof CONST.REPORT.ACTIONS.TYPE.IOU>>;
+            let julesIOUCreatedAction: OnyxEntry<ReportAction>;
+            let julesTransaction: OnyxEntry<Transaction>;
+
+            let vitChatReport: OnyxEntry<Report>;
+            let vitIOUReport: OnyxEntry<Report>;
+            let vitCreatedAction: OnyxEntry<ReportAction>;
+            let vitIOUAction: OnyxEntry<ReportAction<typeof CONST.REPORT.ACTIONS.TYPE.IOU>>;
+            let vitTransaction: OnyxEntry<Transaction>;
+
+            let groupChat: OnyxEntry<Report>;
+            let groupCreatedAction: OnyxEntry<ReportAction>;
+            let groupIOUAction: OnyxEntry<ReportAction<typeof CONST.REPORT.ACTIONS.TYPE.IOU>>;
+            let groupTransaction: OnyxEntry<Transaction>;
+
+            const reportCollectionDataSet = toCollectionDataSet(ONYXKEYS.COLLECTION.REPORT, [carlosChatReport, julesChatReport, julesIOUReport], (item) => item.reportID);
+
+            const carlosActionsCollectionDataSet = toCollectionDataSet(
+                `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}`,
+                [
+                    {
+                        [carlosCreatedAction.reportActionID]: carlosCreatedAction,
+                    },
+                ],
+                (item) => item[carlosCreatedAction.reportActionID].reportID,
+            );
+
+            const julesActionsCollectionDataSet = toCollectionDataSet(
+                `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}`,
+                [
+                    {
+                        [julesCreatedAction.reportActionID]: julesCreatedAction,
+                        [julesExistingIOUAction.reportActionID]: julesExistingIOUAction,
+                    },
+                ],
+                (item) => item[julesCreatedAction.reportActionID].reportID,
+            );
+
+            const julesCreatedActionsCollectionDataSet = toCollectionDataSet(
+                `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}`,
+                [
+                    {
+                        [julesChatCreatedAction.reportActionID]: julesChatCreatedAction,
+                    },
+                ],
+                (item) => item[julesChatCreatedAction.reportActionID].reportID,
+            );
+
+            // @ts-expect-error - will be solved in https://github.com/Expensify/App/issues/73830
+            return Onyx.mergeCollection(ONYXKEYS.COLLECTION.REPORT, {
+                ...reportCollectionDataSet,
+            })
+                .then(() =>
+                    // @ts-expect-error - will be solved in https://github.com/Expensify/App/issues/73830
+                    Onyx.mergeCollection(ONYXKEYS.COLLECTION.REPORT_ACTIONS, {
+                        ...carlosActionsCollectionDataSet,
+                        ...julesCreatedActionsCollectionDataSet,
+                        ...julesActionsCollectionDataSet,
+                    }),
+                )
+                .then(() => Onyx.set(`${ONYXKEYS.COLLECTION.TRANSACTION}${julesExistingTransaction?.transactionID}`, julesExistingTransaction))
+                .then(() => {
+                    // When we split a bill offline
+                    mockFetch?.pause?.();
+                    splitBill(
+                        // TODO: Migrate after the backend accepts accountIDs
+                        {
+                            participants: [
+                                [CARLOS_EMAIL, String(CARLOS_ACCOUNT_ID)],
+                                [JULES_EMAIL, String(JULES_ACCOUNT_ID)],
+                                [VIT_EMAIL, String(VIT_ACCOUNT_ID)],
+                            ].map(([email, accountID]) => ({login: email, accountID: Number(accountID)})),
+                            currentUserLogin: RORY_EMAIL,
+                            currentUserAccountID: RORY_ACCOUNT_ID,
+                            amount,
+                            comment,
+                            currency: CONST.CURRENCY.USD,
+                            merchant,
+                            created: '',
+                            tag: '',
+                            existingSplitChatReportID: '',
+                            isASAPSubmitBetaEnabled: false,
+                            transactionViolations: {},
+                            quickAction: undefined,
+                            policyRecentlyUsedCurrencies: [],
+                            policyRecentlyUsedTags: undefined,
+                        },
+                    );
+                    return waitForBatchedUpdates();
+                })
                 .then(
                     () =>
                         new Promise<void>((resolve) => {
@@ -2753,24 +2723,70 @@ describe('actions/IOU', () => {
                                 callback: (allReports) => {
                                     Onyx.disconnect(connection);
 
-                                    expect(Object.values(allReports ?? {}).length).toBe(3);
-
-                                    const chatReports = Object.values(allReports ?? {}).filter((report) => report?.type === CONST.REPORT.TYPE.CHAT);
-                                    chatReport = chatReports.at(0);
-                                    expect(chatReport).toBeTruthy();
-                                    expect(chatReport).toHaveProperty('reportID');
-                                    expect(chatReport).toHaveProperty('iouReportID');
-
-                                    iouReport = Object.values(allReports ?? {}).find((report) => report?.type === CONST.REPORT.TYPE.IOU);
-                                    expect(iouReport).toBeTruthy();
-                                    expect(iouReport).toHaveProperty('reportID');
-                                    expect(iouReport).toHaveProperty('chatReportID');
+                                    // There should now be 10 reports
+                                    expect(Object.values(allReports ?? {}).length).toBe(10);
+
+                                    // 1. The chat report with Rory + Carlos
+                                    carlosChatReport = Object.values(allReports ?? {}).find((report) => report?.reportID === carlosChatReport?.reportID);
+                                    expect(isEmptyObject(carlosChatReport)).toBe(false);
+                                    expect(carlosChatReport?.pendingFields).toBeFalsy();
+
+                                    // 2. The IOU report with Rory + Carlos (new)
+                                    carlosIOUReport = Object.values(allReports ?? {}).find((report) => report?.type === CONST.REPORT.TYPE.IOU && report.managerID === CARLOS_ACCOUNT_ID);
+                                    expect(isEmptyObject(carlosIOUReport)).toBe(false);
+                                    expect(carlosIOUReport?.total).toBe(amount / 4);
+
+                                    // 3. The chat report with Rory + Jules
+                                    julesChatReport = Object.values(allReports ?? {}).find((report) => report?.reportID === julesChatReport?.reportID);
+                                    expect(isEmptyObject(julesChatReport)).toBe(false);
+                                    expect(julesChatReport?.pendingFields).toBeFalsy();
+
+                                    // 4. The IOU report with Rory + Jules
+                                    julesIOUReport = Object.values(allReports ?? {}).find((report) => report?.reportID === julesIOUReport?.reportID);
+                                    expect(isEmptyObject(julesIOUReport)).toBe(false);
+                                    expect(julesChatReport?.pendingFields).toBeFalsy();
+                                    expect(julesIOUReport?.total).toBe((julesExistingTransaction?.amount ?? 0) + amount / 4);
+
+                                    // 5. The chat report with Rory + Vit (new)
+                                    vitChatReport = Object.values(allReports ?? {}).find(
+                                        (report) =>
+                                            report?.type === CONST.REPORT.TYPE.CHAT &&
+                                            deepEqual(report.participants, {[RORY_ACCOUNT_ID]: RORY_PARTICIPANT, [VIT_ACCOUNT_ID]: VIT_PARTICIPANT}),
+                                    );
+                                    expect(isEmptyObject(vitChatReport)).toBe(false);
+                                    expect(vitChatReport?.pendingFields).toStrictEqual({createChat: CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD});
+
+                                    // 6. The IOU report with Rory + Vit (new)
+                                    vitIOUReport = Object.values(allReports ?? {}).find((report) => report?.type === CONST.REPORT.TYPE.IOU && report.managerID === VIT_ACCOUNT_ID);
+                                    expect(isEmptyObject(vitIOUReport)).toBe(false);
+                                    expect(vitIOUReport?.total).toBe(amount / 4);
+
+                                    // 7. The group chat with everyone
+                                    groupChat = Object.values(allReports ?? {}).find(
+                                        (report) =>
+                                            report?.type === CONST.REPORT.TYPE.CHAT &&
+                                            deepEqual(report.participants, {
+                                                [CARLOS_ACCOUNT_ID]: CARLOS_PARTICIPANT,
+                                                [JULES_ACCOUNT_ID]: JULES_PARTICIPANT,
+                                                [VIT_ACCOUNT_ID]: VIT_PARTICIPANT,
+                                                [RORY_ACCOUNT_ID]: RORY_PARTICIPANT,
+                                            }),
+                                    );
+                                    expect(isEmptyObject(groupChat)).toBe(false);
+                                    expect(groupChat?.pendingFields).toStrictEqual({createChat: CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD});
+
+                                    // The 1:1 chat reports and the IOU reports should be linked together
+                                    expect(carlosChatReport?.iouReportID).toBe(carlosIOUReport?.reportID);
+                                    expect(carlosIOUReport?.chatReportID).toBe(carlosChatReport?.reportID);
+                                    for (const participant of Object.values(carlosIOUReport?.participants ?? {})) {
+                                        expect(participant.notificationPreference).toBe(CONST.REPORT.NOTIFICATION_PREFERENCE.HIDDEN);
+                                    }
 
-                                    expect(chatReport?.iouReportID).toBe(iouReport?.reportID);
-                                    expect(iouReport?.chatReportID).toBe(chatReport?.reportID);
+                                    expect(julesChatReport?.iouReportID).toBe(julesIOUReport?.reportID);
+                                    expect(julesIOUReport?.chatReportID).toBe(julesChatReport?.reportID);
 
-                                    expect(chatReport?.pendingFields).toBeFalsy();
-                                    expect(iouReport?.pendingFields).toBeFalsy();
+                                    expect(vitChatReport?.iouReportID).toBe(vitIOUReport?.reportID);
+                                    expect(vitIOUReport?.chatReportID).toBe(vitChatReport?.reportID);
 
                                     resolve();
                                 },
@@ -2786,13 +2802,81 @@ describe('actions/IOU', () => {
                                 callback: (allReportActions) => {
                                     Onyx.disconnect(connection);
 
-                                    const reportActionsForIOUReport = allReportActions?.[`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${chatReport?.iouReportID}`];
+                                    // There should be reportActions on all 7 chat reports + 3 IOU reports in each 1:1 chat
+                                    expect(Object.values(allReportActions ?? {}).length).toBe(10);
 
-                                    createIOUAction = Object.values(reportActionsForIOUReport ?? {}).find(
-                                        (reportAction): reportAction is ReportAction<typeof CONST.REPORT.ACTIONS.TYPE.IOU> => isMoneyRequestAction(reportAction),
+                                    const carlosReportActions = allReportActions?.[`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${carlosChatReport?.iouReportID}`];
+                                    const julesReportActions = allReportActions?.[`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${julesChatReport?.iouReportID}`];
+                                    const vitReportActions = allReportActions?.[`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${vitChatReport?.iouReportID}`];
+                                    const groupReportActions = allReportActions?.[`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${groupChat?.reportID}`];
+
+                                    // Carlos DM should have two reportActions – the existing CREATED action and a pending IOU action
+                                    expect(Object.values(carlosReportActions ?? {}).length).toBe(2);
+                                    carlosIOUCreatedAction = Object.values(carlosReportActions ?? {}).find(
+                                        (reportAction): reportAction is ReportAction<typeof CONST.REPORT.ACTIONS.TYPE.IOU> => reportAction.actionName === CONST.REPORT.ACTIONS.TYPE.CREATED,
                                     );
-                                    expect(createIOUAction).toBeTruthy();
-                                    expect(createIOUAction && getOriginalMessage(createIOUAction)?.IOUReportID).toBe(iouReport?.reportID);
+                                    carlosIOUAction = Object.values(carlosReportActions ?? {}).find((reportAction): reportAction is ReportAction<typeof CONST.REPORT.ACTIONS.TYPE.IOU> =>
+                                        isMoneyRequestAction(reportAction),
+                                    );
+                                    const carlosOriginalMessage = carlosIOUAction ? getOriginalMessage(carlosIOUAction) : undefined;
+
+                                    expect(carlosIOUAction?.pendingAction).toBe(CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD);
+                                    expect(carlosOriginalMessage?.IOUReportID).toBe(carlosIOUReport?.reportID);
+                                    expect(carlosOriginalMessage?.amount).toBe(amount / 4);
+                                    expect(carlosOriginalMessage?.comment).toBe(comment);
+                                    expect(carlosOriginalMessage?.type).toBe(CONST.IOU.REPORT_ACTION_TYPE.CREATE);
+                                    expect(Date.parse(carlosIOUCreatedAction?.created ?? '')).toBeLessThan(Date.parse(carlosIOUAction?.created ?? ''));
+
+                                    // Jules DM should have three reportActions, the existing CREATED action, the existing IOU action, and a new pending IOU action
+                                    expect(Object.values(julesReportActions ?? {}).length).toBe(3);
+                                    expect(julesReportActions?.[julesCreatedAction.reportActionID]).toStrictEqual(julesCreatedAction);
+                                    julesIOUCreatedAction = Object.values(julesReportActions ?? {}).find(
+                                        (reportAction): reportAction is ReportAction<typeof CONST.REPORT.ACTIONS.TYPE.IOU> => reportAction.actionName === CONST.REPORT.ACTIONS.TYPE.CREATED,
+                                    );
+                                    julesIOUAction = Object.values(julesReportActions ?? {}).find(
+                                        (reportAction): reportAction is ReportAction<typeof CONST.REPORT.ACTIONS.TYPE.IOU> =>
+                                            reportAction.reportActionID !== julesCreatedAction.reportActionID && reportAction.reportActionID !== julesExistingIOUAction.reportActionID,
+                                    );
+                                    const julesOriginalMessage = julesIOUAction ? getOriginalMessage(julesIOUAction) : undefined;
+
+                                    expect(julesIOUAction?.pendingAction).toBe(CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD);
+                                    expect(julesOriginalMessage?.IOUReportID).toBe(julesIOUReport?.reportID);
+                                    expect(julesOriginalMessage?.amount).toBe(amount / 4);
+                                    expect(julesOriginalMessage?.comment).toBe(comment);
+                                    expect(julesOriginalMessage?.type).toBe(CONST.IOU.REPORT_ACTION_TYPE.CREATE);
+                                    expect(Date.parse(julesIOUCreatedAction?.created ?? '')).toBeLessThan(Date.parse(julesIOUAction?.created ?? ''));
+
+                                    // Vit DM should have two reportActions – a pending CREATED action and a pending IOU action
+                                    expect(Object.values(vitReportActions ?? {}).length).toBe(2);
+                                    vitCreatedAction = Object.values(vitReportActions ?? {}).find(
+                                        (reportAction): reportAction is ReportAction<typeof CONST.REPORT.ACTIONS.TYPE.IOU> => reportAction.actionName === CONST.REPORT.ACTIONS.TYPE.CREATED,
+                                    );
+                                    vitIOUAction = Object.values(vitReportActions ?? {}).find((reportAction): reportAction is ReportAction<typeof CONST.REPORT.ACTIONS.TYPE.IOU> =>
+                                        isMoneyRequestAction(reportAction),
+                                    );
+                                    const vitOriginalMessage = vitIOUAction ? getOriginalMessage(vitIOUAction) : undefined;
+
+                                    expect(vitCreatedAction?.pendingAction).toBe(CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD);
+                                    expect(vitIOUAction?.pendingAction).toBe(CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD);
+                                    expect(vitOriginalMessage?.IOUReportID).toBe(vitIOUReport?.reportID);
+                                    expect(vitOriginalMessage?.amount).toBe(amount / 4);
+                                    expect(vitOriginalMessage?.comment).toBe(comment);
+                                    expect(vitOriginalMessage?.type).toBe(CONST.IOU.REPORT_ACTION_TYPE.CREATE);
+                                    expect(Date.parse(vitCreatedAction?.created ?? '')).toBeLessThan(Date.parse(vitIOUAction?.created ?? ''));
+
+                                    // Group chat should have two reportActions – a pending CREATED action and a pending IOU action w/ type SPLIT
+                                    expect(Object.values(groupReportActions ?? {}).length).toBe(2);
+                                    groupCreatedAction = Object.values(groupReportActions ?? {}).find((reportAction) => reportAction.actionName === CONST.REPORT.ACTIONS.TYPE.CREATED);
+                                    groupIOUAction = Object.values(groupReportActions ?? {}).find((reportAction): reportAction is ReportAction<typeof CONST.REPORT.ACTIONS.TYPE.IOU> =>
+                                        isMoneyRequestAction(reportAction),
+                                    );
+                                    const groupOriginalMessage = groupIOUAction ? getOriginalMessage(groupIOUAction) : undefined;
+
+                                    expect(groupCreatedAction?.pendingAction).toBe(CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD);
+                                    expect(groupIOUAction?.pendingAction).toBe(CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD);
+                                    expect(groupOriginalMessage).not.toHaveProperty('IOUReportID');
+                                    expect(groupOriginalMessage?.type).toBe(CONST.IOU.REPORT_ACTION_TYPE.SPLIT);
+                                    expect(Date.parse(groupCreatedAction?.created ?? '')).toBeLessThanOrEqual(Date.parse(groupIOUAction?.created ?? ''));
 
                                     resolve();
                                 },
@@ -2807,192 +2891,86 @@ describe('actions/IOU', () => {
                                 waitForCollectionCallback: true,
                                 callback: (allTransactions) => {
                                     Onyx.disconnect(connection);
-                                    expect(Object.values(allTransactions ?? {}).length).toBe(1);
-                                    transaction = Object.values(allTransactions ?? {}).find((t) => t);
-                                    expect(transaction).toBeTruthy();
-                                    expect(transaction?.amount).toBe(amount);
-                                    expect(transaction?.reportID).toBe(iouReport?.reportID);
-                                    expect(createIOUAction && getOriginalMessage(createIOUAction)?.IOUTransactionID).toBe(transaction?.transactionID);
-                                    resolve();
-                                },
-                            });
-                        }),
-                )
-                .then(() => {
-                    mockFetch?.pause?.();
-                    if (chatReport && iouReport) {
-                        payMoneyRequest(CONST.IOU.PAYMENT_TYPE.ELSEWHERE, chatReport, iouReport, undefined, undefined);
-                    }
-                    return waitForBatchedUpdates();
-                })
-                .then(
-                    () =>
-                        new Promise<void>((resolve) => {
-                            const connection = Onyx.connect({
-                                key: ONYXKEYS.COLLECTION.REPORT,
-                                waitForCollectionCallback: true,
-                                callback: (allReports) => {
-                                    Onyx.disconnect(connection);
-
-                                    expect(Object.values(allReports ?? {}).length).toBe(3);
-
-                                    chatReport = Object.values(allReports ?? {}).find((r) => r?.type === CONST.REPORT.TYPE.CHAT);
-                                    iouReport = Object.values(allReports ?? {}).find((r) => r?.type === CONST.REPORT.TYPE.IOU);
-
-                                    expect(chatReport?.iouReportID).toBeFalsy();
-
-                                    // expect(iouReport.status).toBe(CONST.REPORT.STATUS_NUM.REIMBURSED);
-                                    // expect(iouReport.stateNum).toBe(CONST.REPORT.STATE_NUM.APPROVED);
-
-                                    resolve();
-                                },
-                            });
-                        }),
-                )
-                .then(
-                    () =>
-                        new Promise<void>((resolve) => {
-                            const connection = Onyx.connect({
-                                key: ONYXKEYS.COLLECTION.REPORT_ACTIONS,
-                                waitForCollectionCallback: true,
-                                callback: (allReportActions) => {
-                                    Onyx.disconnect(connection);
 
-                                    const reportActionsForIOUReport = allReportActions?.[`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${iouReport?.reportID}`];
-                                    expect(Object.values(reportActionsForIOUReport ?? {}).length).toBe(3);
+                                    /* There should be 5 transactions
+                                     *   – one existing one with Jules
+                                     *   - one for each of the three IOU reports
+                                     *   - one on the group chat w/ deleted report
+                                     */
+                                    expect(Object.values(allTransactions ?? {}).length).toBe(5);
+                                    expect(allTransactions?.[`${ONYXKEYS.COLLECTION.TRANSACTION}${julesExistingTransaction?.transactionID}`]).toBeTruthy();
 
-                                    payIOUAction = Object.values(reportActionsForIOUReport ?? {}).find(
-                                        (reportAction) => isMoneyRequestAction(reportAction) && getOriginalMessage(reportAction)?.type === CONST.IOU.REPORT_ACTION_TYPE.PAY,
+                                    carlosTransaction = Object.values(allTransactions ?? {}).find(
+                                        (transaction) => carlosIOUAction && transaction?.transactionID === getOriginalMessage(carlosIOUAction)?.IOUTransactionID,
                                     );
-                                    expect(payIOUAction).toBeTruthy();
-                                    expect(payIOUAction?.pendingAction).toBe(CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD);
+                                    julesTransaction = Object.values(allTransactions ?? {}).find(
+                                        (transaction) => julesIOUAction && transaction?.transactionID === getOriginalMessage(julesIOUAction)?.IOUTransactionID,
+                                    );
+                                    vitTransaction = Object.values(allTransactions ?? {}).find(
+                                        (transaction) => vitIOUAction && transaction?.transactionID === getOriginalMessage(vitIOUAction)?.IOUTransactionID,
+                                    );
+                                    groupTransaction = Object.values(allTransactions ?? {}).find((transaction) => transaction?.reportID === CONST.REPORT.SPLIT_REPORT_ID);
 
-                                    resolve();
-                                },
-                            });
-                        }),
-                )
-                .then(mockFetch?.resume)
-                .then(
-                    () =>
-                        new Promise<void>((resolve) => {
-                            const connection = Onyx.connect({
-                                key: ONYXKEYS.COLLECTION.REPORT,
-                                waitForCollectionCallback: true,
-                                callback: (allReports) => {
-                                    Onyx.disconnect(connection);
+                                    expect(carlosTransaction?.reportID).toBe(carlosIOUReport?.reportID);
+                                    expect(julesTransaction?.reportID).toBe(julesIOUReport?.reportID);
+                                    expect(vitTransaction?.reportID).toBe(vitIOUReport?.reportID);
+                                    expect(groupTransaction).toBeTruthy();
 
-                                    expect(Object.values(allReports ?? {}).length).toBe(3);
+                                    expect(carlosTransaction?.amount).toBe(amount / 4);
+                                    expect(julesTransaction?.amount).toBe(amount / 4);
+                                    expect(vitTransaction?.amount).toBe(amount / 4);
+                                    expect(groupTransaction?.amount).toBe(amount);
 
-                                    chatReport = Object.values(allReports ?? {}).find((r) => r?.type === CONST.REPORT.TYPE.CHAT);
-                                    iouReport = Object.values(allReports ?? {}).find((r) => r?.type === CONST.REPORT.TYPE.IOU);
+                                    expect(carlosTransaction?.comment?.comment).toBe(comment);
+                                    expect(julesTransaction?.comment?.comment).toBe(comment);
+                                    expect(vitTransaction?.comment?.comment).toBe(comment);
+                                    expect(groupTransaction?.comment?.comment).toBe(comment);
 
-                                    expect(chatReport?.iouReportID).toBeFalsy();
+                                    expect(carlosTransaction?.merchant).toBe(merchant);
+                                    expect(julesTransaction?.merchant).toBe(merchant);
+                                    expect(vitTransaction?.merchant).toBe(merchant);
+                                    expect(groupTransaction?.merchant).toBe(merchant);
 
-                                    // expect(iouReport.status).toBe(CONST.REPORT.STATUS_NUM.REIMBURSED);
-                                    // expect(iouReport.stateNum).toBe(CONST.REPORT.STATE_NUM.APPROVED);
+                                    expect(carlosTransaction?.comment?.source).toBe(CONST.IOU.TYPE.SPLIT);
+                                    expect(julesTransaction?.comment?.source).toBe(CONST.IOU.TYPE.SPLIT);
+                                    expect(vitTransaction?.comment?.source).toBe(CONST.IOU.TYPE.SPLIT);
 
-                                    resolve();
-                                },
-                            });
-                        }),
-                )
-                .then(
-                    () =>
-                        new Promise<void>((resolve) => {
-                            const connection = Onyx.connect({
-                                key: ONYXKEYS.COLLECTION.REPORT_ACTIONS,
-                                waitForCollectionCallback: true,
-                                callback: (allReportActions) => {
-                                    Onyx.disconnect(connection);
+                                    expect(carlosTransaction?.comment?.originalTransactionID).toBe(groupTransaction?.transactionID);
+                                    expect(julesTransaction?.comment?.originalTransactionID).toBe(groupTransaction?.transactionID);
+                                    expect(vitTransaction?.comment?.originalTransactionID).toBe(groupTransaction?.transactionID);
 
-                                    const reportActionsForIOUReport = allReportActions?.[`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${iouReport?.reportID}`];
-                                    expect(Object.values(reportActionsForIOUReport ?? {}).length).toBe(3);
+                                    expect(carlosTransaction?.pendingAction).toBe(CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD);
+                                    expect(julesTransaction?.pendingAction).toBe(CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD);
+                                    expect(vitTransaction?.pendingAction).toBe(CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD);
+                                    expect(groupTransaction?.pendingAction).toBe(CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD);
 
-                                    payIOUAction = Object.values(reportActionsForIOUReport ?? {}).find(
-                                        (reportAction) => isMoneyRequestAction(reportAction) && getOriginalMessage(reportAction)?.type === CONST.IOU.REPORT_ACTION_TYPE.PAY,
-                                    );
                                     resolve();
-
-                                    expect(payIOUAction).toBeTruthy();
-                                    expect(payIOUAction?.pendingAction).toBeFalsy();
                                 },
                             });
                         }),
-                );
-        });
-    });
-
-    describe('pay expense report via ACH', () => {
-        const amount = 10000;
-        const comment = '💸💸💸💸';
-        const merchant = 'NASDAQ';
-
-        afterEach(() => {
-            mockFetch?.resume?.();
-        });
-
-        it('updates the expense request and expense report when paid while offline', () => {
-            let expenseReport: OnyxEntry<Report>;
-            let chatReport: OnyxEntry<Report>;
-
-            mockFetch?.pause?.();
-            Onyx.set(ONYXKEYS.SESSION, {email: CARLOS_EMAIL, accountID: CARLOS_ACCOUNT_ID});
-            return waitForBatchedUpdates()
-                .then(() => {
-                    createWorkspace({
-                        policyOwnerEmail: CARLOS_EMAIL,
-                        makeMeAdmin: true,
-                        policyName: "Carlos's Workspace",
-                        introSelected: {choice: CONST.ONBOARDING_CHOICES.MANAGE_TEAM},
-                        currentUserAccountIDParam: CARLOS_ACCOUNT_ID,
-                        currentUserEmailParam: CARLOS_EMAIL,
-                    });
-                    return waitForBatchedUpdates();
-                })
+                )
                 .then(
                     () =>
                         new Promise<void>((resolve) => {
                             const connection = Onyx.connect({
-                                key: ONYXKEYS.COLLECTION.REPORT,
-                                waitForCollectionCallback: true,
-                                callback: (allReports) => {
+                                key: ONYXKEYS.PERSONAL_DETAILS_LIST,
+                                waitForCollectionCallback: false,
+                                callback: (allPersonalDetails) => {
                                     Onyx.disconnect(connection);
-                                    chatReport = Object.values(allReports ?? {}).find((report) => report?.chatType === CONST.REPORT.CHAT_TYPE.POLICY_EXPENSE_CHAT);
-
+                                    expect(allPersonalDetails).toMatchObject({
+                                        [VIT_ACCOUNT_ID]: {
+                                            accountID: VIT_ACCOUNT_ID,
+                                            displayName: VIT_EMAIL,
+                                            login: VIT_EMAIL,
+                                        },
+                                    });
                                     resolve();
                                 },
                             });
                         }),
                 )
-                .then(() => {
-                    if (chatReport) {
-                        requestMoney({
-                            report: chatReport,
-                            participantParams: {
-                                payeeEmail: RORY_EMAIL,
-                                payeeAccountID: RORY_ACCOUNT_ID,
-                                participant: {login: CARLOS_EMAIL, accountID: CARLOS_ACCOUNT_ID},
-                            },
-                            transactionParams: {
-                                amount,
-                                attendees: [],
-                                currency: CONST.CURRENCY.USD,
-                                created: '',
-                                merchant,
-                                comment,
-                            },
-                            shouldGenerateTransactionThreadReport: true,
-                            isASAPSubmitBetaEnabled: false,
-                            currentUserAccountIDParam: 123,
-                            currentUserEmailParam: 'existing@example.com',
-                            transactionViolations: {},
-                            policyRecentlyUsedCurrencies: [],
-                            quickAction: undefined,
-                        });
-                    }
-                    return waitForBatchedUpdates();
-                })
+                .then(mockFetch?.resume)
+                .then(waitForNetworkPromises)
                 .then(
                     () =>
                         new Promise<void>((resolve) => {
@@ -3001,44 +2979,30 @@ describe('actions/IOU', () => {
                                 waitForCollectionCallback: true,
                                 callback: (allReports) => {
                                     Onyx.disconnect(connection);
-                                    expenseReport = Object.values(allReports ?? {}).find((report) => report?.type === CONST.REPORT.TYPE.IOU);
-
+                                    for (const report of Object.values(allReports ?? {})) {
+                                        if (!report?.pendingFields) {
+                                            continue;
+                                        }
+                                        for (const pendingField of Object.values(report?.pendingFields)) {
+                                            expect(pendingField).toBeFalsy();
+                                        }
+                                    }
                                     resolve();
                                 },
                             });
                         }),
                 )
-                .then(() => {
-                    if (chatReport && expenseReport) {
-                        payMoneyRequest(CONST.IOU.PAYMENT_TYPE.VBBA, chatReport, expenseReport, undefined, undefined);
-                    }
-                    return waitForBatchedUpdates();
-                })
                 .then(
                     () =>
                         new Promise<void>((resolve) => {
                             const connection = Onyx.connect({
-                                key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${expenseReport?.reportID}`,
-                                waitForCollectionCallback: false,
-                                callback: (allActions) => {
+                                key: ONYXKEYS.COLLECTION.REPORT_ACTIONS,
+                                waitForCollectionCallback: true,
+                                callback: (allReportActions) => {
                                     Onyx.disconnect(connection);
-                                    expect(Object.values(allActions ?? {})).toEqual(
-                                        expect.arrayContaining([
-                                            expect.objectContaining({
-                                                message: expect.arrayContaining([
-                                                    expect.objectContaining({
-                                                        html: `paid $${amount / 100}.00 with Expensify`,
-                                                        text: `paid $${amount / 100}.00 with Expensify`,
-                                                    }),
-                                                ]),
-                                                originalMessage: expect.objectContaining({
-                                                    amount,
-                                                    paymentType: CONST.IOU.PAYMENT_TYPE.VBBA,
-                                                    type: 'pay',
-                                                }),
-                                            }),
-                                        ]),
-                                    );
+                                    for (const reportAction of Object.values(allReportActions ?? {})) {
+                                        expect(reportAction?.pendingAction).toBeFalsy();
+                                    }
                                     resolve();
                                 },
                             });
@@ -3048,26 +3012,13 @@ describe('actions/IOU', () => {
                     () =>
                         new Promise<void>((resolve) => {
                             const connection = Onyx.connect({
-                                key: ONYXKEYS.COLLECTION.REPORT,
+                                key: ONYXKEYS.COLLECTION.TRANSACTION,
                                 waitForCollectionCallback: true,
-                                callback: (allReports) => {
+                                callback: (allTransactions) => {
                                     Onyx.disconnect(connection);
-                                    const updatedIOUReport = Object.values(allReports ?? {}).find((report) => report?.type === CONST.REPORT.TYPE.IOU);
-                                    const updatedChatReport = Object.values(allReports ?? {}).find((report) => report?.reportID === expenseReport?.chatReportID);
-                                    expect(updatedIOUReport).toEqual(
-                                        expect.objectContaining({
-                                            lastMessageHtml: `paid $${amount / 100}.00 with Expensify`,
-                                            lastMessageText: `paid $${amount / 100}.00 with Expensify`,
-                                            statusNum: CONST.REPORT.STATUS_NUM.REIMBURSED,
-                                            stateNum: CONST.REPORT.STATE_NUM.APPROVED,
-                                        }),
-                                    );
-                                    expect(updatedChatReport).toEqual(
-                                        expect.objectContaining({
-                                            lastMessageHtml: `paid $${amount / 100}.00 with Expensify`,
-                                            lastMessageText: `paid $${amount / 100}.00 with Expensify`,
-                                        }),
-                                    );
+                                    for (const transaction of Object.values(allTransactions ?? {})) {
+                                        expect(transaction?.pendingAction).toBeFalsy();
+                                    }
                                     resolve();
                                 },
                             });
@@ -3075,716 +3026,821 @@ describe('actions/IOU', () => {
                 );
         });
 
-        it('shows an error when paying results in an error', () => {
-            let expenseReport: OnyxEntry<Report>;
-            let chatReport: OnyxEntry<Report>;
-
-            Onyx.set(ONYXKEYS.SESSION, {email: CARLOS_EMAIL, accountID: CARLOS_ACCOUNT_ID});
-            return waitForBatchedUpdates()
-                .then(() => {
-                    createWorkspace({
-                        policyOwnerEmail: CARLOS_EMAIL,
-                        makeMeAdmin: true,
-                        policyName: "Carlos's Workspace",
-                        introSelected: {choice: CONST.ONBOARDING_CHOICES.MANAGE_TEAM},
-                        currentUserAccountIDParam: CARLOS_ACCOUNT_ID,
-                        currentUserEmailParam: CARLOS_EMAIL,
-                    });
-                    return waitForBatchedUpdates();
-                })
-                .then(
-                    () =>
-                        new Promise<void>((resolve) => {
-                            const connection = Onyx.connect({
-                                key: ONYXKEYS.COLLECTION.REPORT,
-                                waitForCollectionCallback: true,
-                                callback: (allReports) => {
-                                    Onyx.disconnect(connection);
-                                    chatReport = Object.values(allReports ?? {}).find((report) => report?.chatType === CONST.REPORT.CHAT_TYPE.POLICY_EXPENSE_CHAT);
+        it('should update split chat report lastVisibleActionCreated to the report preview action', async () => {
+            // Given a expense chat with no expenses
+            const workspaceReportID = '1';
+            await Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT}${workspaceReportID}`, {reportID: workspaceReportID, isOwnPolicyExpenseChat: true});
 
-                                    resolve();
-                                },
-                            });
-                        }),
-                )
-                .then(() => {
-                    if (chatReport) {
-                        requestMoney({
-                            report: chatReport,
-                            participantParams: {
-                                payeeEmail: RORY_EMAIL,
-                                payeeAccountID: RORY_ACCOUNT_ID,
-                                participant: {login: CARLOS_EMAIL, accountID: CARLOS_ACCOUNT_ID},
-                            },
-                            transactionParams: {
-                                amount,
-                                attendees: [],
-                                currency: CONST.CURRENCY.USD,
-                                created: '',
-                                merchant,
-                                comment,
-                            },
-                            shouldGenerateTransactionThreadReport: true,
-                            isASAPSubmitBetaEnabled: false,
-                            currentUserAccountIDParam: 123,
-                            currentUserEmailParam: 'existing@example.com',
-                            transactionViolations: {},
-                            policyRecentlyUsedCurrencies: [],
-                            quickAction: undefined,
-                        });
-                    }
-                    return waitForBatchedUpdates();
-                })
-                .then(
-                    () =>
-                        new Promise<void>((resolve) => {
-                            const connection = Onyx.connect({
-                                key: ONYXKEYS.COLLECTION.REPORT,
-                                waitForCollectionCallback: true,
-                                callback: (allReports) => {
-                                    Onyx.disconnect(connection);
-                                    expenseReport = Object.values(allReports ?? {}).find((report) => report?.type === CONST.REPORT.TYPE.IOU);
+            // When the user split bill on the workspace
+            splitBill({
+                participants: [{reportID: workspaceReportID}],
+                currentUserLogin: RORY_EMAIL,
+                currentUserAccountID: RORY_ACCOUNT_ID,
+                comment: '',
+                amount: 100,
+                currency: CONST.CURRENCY.USD,
+                merchant: 'test',
+                created: '',
+                existingSplitChatReportID: workspaceReportID,
+                isASAPSubmitBetaEnabled: false,
+                transactionViolations: {},
+                quickAction: undefined,
+                policyRecentlyUsedCurrencies: [],
+                policyRecentlyUsedTags: undefined,
+            });
 
-                                    resolve();
-                                },
-                            });
-                        }),
-                )
-                .then(() => {
-                    mockFetch?.fail?.();
-                    if (chatReport && expenseReport) {
-                        payMoneyRequest('ACH', chatReport, expenseReport, undefined, undefined);
-                    }
-                    return waitForBatchedUpdates();
-                })
-                .then(
-                    () =>
-                        new Promise<void>((resolve) => {
-                            const connection = Onyx.connect({
-                                key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${expenseReport?.reportID}`,
-                                waitForCollectionCallback: false,
-                                callback: (allActions) => {
-                                    Onyx.disconnect(connection);
-                                    const erroredAction = Object.values(allActions ?? {}).find((action) => !isEmptyObject(action?.errors));
-                                    expect(Object.values(erroredAction?.errors ?? {}).at(0)).toEqual(translateLocal('iou.error.other'));
-                                    resolve();
-                                },
-                            });
-                        }),
-                );
+            await waitForBatchedUpdates();
+
+            // Then the expense chat lastVisibleActionCreated should be updated to the report preview action created
+            const reportPreviewAction = await new Promise<OnyxEntry<ReportAction>>((resolve) => {
+                const connection = Onyx.connect({
+                    key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${workspaceReportID}`,
+                    callback: (reportActions) => {
+                        Onyx.disconnect(connection);
+                        resolve(Object.values(reportActions ?? {}).find((action) => action.actionName === CONST.REPORT.ACTIONS.TYPE.REPORT_PREVIEW));
+                    },
+                });
+            });
+
+            await new Promise<OnyxEntry<Report>>((resolve) => {
+                const connection = Onyx.connect({
+                    key: `${ONYXKEYS.COLLECTION.REPORT}${workspaceReportID}`,
+                    callback: (report) => {
+                        Onyx.disconnect(connection);
+                        expect(report?.lastVisibleActionCreated).toBe(reportPreviewAction?.created);
+                        resolve(report);
+                    },
+                });
+            });
         });
-    });
 
-    describe('payMoneyRequest', () => {
-        it('should apply optimistic data correctly', async () => {
-            // Given an outstanding IOU report
-            const chatReport = {
-                ...createRandomReport(0, undefined),
-                lastReadTime: DateUtils.getDBTime(),
-                lastVisibleActionCreated: DateUtils.getDBTime(),
-            };
-            const iouReport = {
-                ...createRandomReport(1, undefined),
-                chatType: undefined,
-                type: CONST.REPORT.TYPE.IOU,
-                total: 10,
-            };
-            mockFetch?.pause?.();
+        it('correctly sets quickAction', async () => {
+            // Given a expense chat with no expenses
+            const workspaceReportID = '1';
+            await Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT}${workspaceReportID}`, {reportID: workspaceReportID, isOwnPolicyExpenseChat: true});
 
-            jest.advanceTimersByTime(10);
+            splitBill({
+                participants: [{reportID: workspaceReportID}],
+                currentUserLogin: RORY_EMAIL,
+                currentUserAccountID: RORY_ACCOUNT_ID,
+                comment: '',
+                amount: 100,
+                currency: CONST.CURRENCY.USD,
+                merchant: 'test',
+                created: '',
+                existingSplitChatReportID: workspaceReportID,
+                isASAPSubmitBetaEnabled: false,
+                transactionViolations: {},
+                quickAction: undefined,
+                policyRecentlyUsedCurrencies: [],
+                policyRecentlyUsedTags: undefined,
+            });
 
-            // When paying the IOU report
-            payMoneyRequest(CONST.IOU.PAYMENT_TYPE.ELSEWHERE, chatReport, iouReport, undefined, undefined);
+            await waitForBatchedUpdates();
+
+            expect(await getOnyxValue(ONYXKEYS.NVP_QUICK_ACTION_GLOBAL_CREATE)).toHaveProperty('isFirstQuickAction', true);
+
+            splitBill({
+                participants: [{reportID: workspaceReportID}],
+                currentUserLogin: RORY_EMAIL,
+                currentUserAccountID: RORY_ACCOUNT_ID,
+                comment: '',
+                amount: 100,
+                currency: CONST.CURRENCY.USD,
+                merchant: 'test',
+                created: '',
+                existingSplitChatReportID: workspaceReportID,
+                isASAPSubmitBetaEnabled: false,
+                transactionViolations: {},
+                quickAction: {action: CONST.QUICK_ACTIONS.SEND_MONEY, chatReportID: '456'},
+                policyRecentlyUsedCurrencies: [],
+                policyRecentlyUsedTags: undefined,
+            });
+            await waitForBatchedUpdates();
+
+            expect(await getOnyxValue(ONYXKEYS.NVP_QUICK_ACTION_GLOBAL_CREATE)).toMatchObject({
+                action: CONST.QUICK_ACTIONS.SPLIT_MANUAL,
+                isFirstQuickAction: false,
+            });
+        });
+
+        it('merges policyRecentlyUsedCurrencies when splitting a bill', async () => {
+            const initialCurrencies = [CONST.CURRENCY.USD];
+            await Onyx.set(ONYXKEYS.RECENTLY_USED_CURRENCIES, initialCurrencies);
+
+            splitBill({
+                participants: [{accountID: CARLOS_ACCOUNT_ID, login: CARLOS_EMAIL}],
+                currentUserLogin: RORY_EMAIL,
+                currentUserAccountID: RORY_ACCOUNT_ID,
+                comment: '',
+                amount: 100,
+                currency: CONST.CURRENCY.EUR,
+                merchant: 'test',
+                created: '',
+                existingSplitChatReportID: '',
+                isASAPSubmitBetaEnabled: false,
+                transactionViolations: {},
+                quickAction: undefined,
+                policyRecentlyUsedCurrencies: initialCurrencies,
+                policyRecentlyUsedTags: undefined,
+            });
 
             await waitForBatchedUpdates();
 
-            // Then the optimistic data should be applied correctly
-            const payReportAction = await new Promise<ReportAction | undefined>((resolve) => {
+            const recentlyUsedCurrencies = await getOnyxValue(ONYXKEYS.RECENTLY_USED_CURRENCIES);
+            expect(recentlyUsedCurrencies).toEqual([CONST.CURRENCY.EUR, ...initialCurrencies]);
+        });
+
+        it('should update split chat report lastVisibleActionCreated to the latest IOU action when split bill in a DM', async () => {
+            // Given a DM chat with no expenses
+            const reportID = '1';
+            await Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT}${reportID}`, {
+                reportID,
+                type: CONST.REPORT.TYPE.CHAT,
+                participants: {[RORY_ACCOUNT_ID]: RORY_PARTICIPANT, [CARLOS_ACCOUNT_ID]: CARLOS_PARTICIPANT},
+            });
+
+            // When the user split bill twice on the DM
+            splitBill({
+                participants: [{accountID: CARLOS_ACCOUNT_ID, login: CARLOS_EMAIL}],
+                currentUserLogin: RORY_EMAIL,
+                currentUserAccountID: RORY_ACCOUNT_ID,
+                comment: '',
+                amount: 100,
+                currency: CONST.CURRENCY.USD,
+                merchant: 'test',
+                created: '',
+                existingSplitChatReportID: reportID,
+                isASAPSubmitBetaEnabled: false,
+                transactionViolations: {},
+                quickAction: undefined,
+                policyRecentlyUsedCurrencies: [],
+                policyRecentlyUsedTags: undefined,
+            });
+
+            await waitForBatchedUpdates();
+
+            splitBill({
+                participants: [{accountID: CARLOS_ACCOUNT_ID, login: CARLOS_EMAIL}],
+                currentUserLogin: RORY_EMAIL,
+                currentUserAccountID: RORY_ACCOUNT_ID,
+                comment: '',
+                amount: 200,
+                currency: CONST.CURRENCY.USD,
+                merchant: 'test',
+                created: '',
+                existingSplitChatReportID: reportID,
+                isASAPSubmitBetaEnabled: false,
+                transactionViolations: {},
+                quickAction: undefined,
+                policyRecentlyUsedCurrencies: [],
+                policyRecentlyUsedTags: undefined,
+            });
+
+            await waitForBatchedUpdates();
+
+            // Then the DM lastVisibleActionCreated should be updated to the second IOU action created
+            const iouAction = await new Promise<OnyxEntry<ReportAction>>((resolve) => {
                 const connection = Onyx.connect({
-                    key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${iouReport.reportID}`,
+                    key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${reportID}`,
                     callback: (reportActions) => {
                         Onyx.disconnect(connection);
-                        resolve(Object.values(reportActions ?? {}).pop());
+                        resolve(Object.values(reportActions ?? {}).find((action) => isActionOfType(action, CONST.REPORT.ACTIONS.TYPE.IOU) && getOriginalMessage(action)?.amount === 200));
                     },
                 });
             });
 
-            await new Promise<void>((resolve) => {
+            const report = await new Promise<OnyxEntry<Report>>((resolve) => {
                 const connection = Onyx.connect({
-                    key: `${ONYXKEYS.COLLECTION.REPORT}${chatReport.reportID}`,
-                    callback: (report) => {
+                    key: `${ONYXKEYS.COLLECTION.REPORT}${reportID}`,
+                    callback: (reportVal) => {
                         Onyx.disconnect(connection);
-                        expect(report?.lastVisibleActionCreated).toBe(chatReport.lastVisibleActionCreated);
-                        expect(report?.hasOutstandingChildRequest).toBe(false);
-                        expect(report?.iouReportID).toBeUndefined();
-                        expect(new Date(report?.lastReadTime ?? '').getTime()).toBeGreaterThan(new Date(chatReport?.lastReadTime ?? '').getTime());
-                        expect(report?.lastMessageText).toBe(getReportActionText(payReportAction));
-                        expect(report?.lastMessageHtml).toBe(getReportActionHtml(payReportAction));
-                        resolve();
+                        resolve(reportVal);
                     },
                 });
             });
+            expect(report?.lastVisibleActionCreated).toBe(iouAction?.created);
+        });
 
-            await new Promise<void>((resolve) => {
+        it('optimistic transaction should be merged with the draft transaction if it is a distance request', async () => {
+            // Given a workspace expense chat and a draft split transaction
+            const workspaceReportID = '1';
+            const transactionAmount = 100;
+            const draftTransaction = {
+                amount: transactionAmount,
+                currency: CONST.CURRENCY.USD,
+                merchant: 'test',
+                created: '',
+                iouRequestType: CONST.IOU.REQUEST_TYPE.DISTANCE,
+                splitShares: {
+                    [workspaceReportID]: {amount: 100},
+                },
+            };
+
+            await Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT}${workspaceReportID}`, {reportID: workspaceReportID, isOwnPolicyExpenseChat: true});
+            await Onyx.merge(`${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${CONST.IOU.OPTIMISTIC_TRANSACTION_ID}`, draftTransaction);
+
+            // When doing a distance split expense
+            splitBill({
+                participants: [{reportID: workspaceReportID}],
+                currentUserLogin: RORY_EMAIL,
+                currentUserAccountID: RORY_ACCOUNT_ID,
+                existingSplitChatReportID: workspaceReportID,
+                ...draftTransaction,
+                comment: '',
+                isASAPSubmitBetaEnabled: false,
+                transactionViolations: {},
+                quickAction: undefined,
+                policyRecentlyUsedCurrencies: [],
+                policyRecentlyUsedTags: undefined,
+            });
+
+            await waitForBatchedUpdates();
+
+            const optimisticTransaction = await new Promise<OnyxEntry<Transaction>>((resolve) => {
                 const connection = Onyx.connect({
-                    key: `${ONYXKEYS.COLLECTION.REPORT}${iouReport.reportID}`,
-                    callback: (report) => {
+                    key: ONYXKEYS.COLLECTION.TRANSACTION,
+                    waitForCollectionCallback: true,
+                    callback: (transactions) => {
                         Onyx.disconnect(connection);
-                        expect(report?.hasOutstandingChildRequest).toBe(false);
-                        expect(report?.statusNum).toBe(CONST.REPORT.STATUS_NUM.REIMBURSED);
-                        expect(report?.lastVisibleActionCreated).toBe(payReportAction?.created);
-                        expect(report?.lastMessageText).toBe(getReportActionText(payReportAction));
-                        expect(report?.lastMessageHtml).toBe(getReportActionHtml(payReportAction));
-                        expect(report?.pendingFields).toEqual({
-                            preview: CONST.RED_BRICK_ROAD_PENDING_ACTION.UPDATE,
-                            reimbursed: CONST.RED_BRICK_ROAD_PENDING_ACTION.UPDATE,
-                            nextStep: CONST.RED_BRICK_ROAD_PENDING_ACTION.UPDATE,
-                        });
-                        resolve();
+                        resolve(Object.values(transactions ?? {}).find((transaction) => transaction?.amount === -(transactionAmount / 2)));
                     },
                 });
             });
 
-            mockFetch?.resume?.();
+            // Then the data from the transaction draft should be merged into the optimistic transaction
+            expect(optimisticTransaction?.iouRequestType).toBe(CONST.IOU.REQUEST_TYPE.DISTANCE);
         });
 
-        it('calls notifyNewAction for the top most report', () => {
-            // Given two expenses in an iou report where one of them held
-            const iouReport = buildOptimisticIOUReport(1, 2, 100, '1', 'USD');
-            const transaction1 = buildOptimisticTransaction({
-                transactionParams: {
-                    amount: 100,
-                    currency: 'USD',
-                    reportID: iouReport.reportID,
+        it("should update the notification preference of the report to ALWAYS if it's previously hidden", async () => {
+            // Given a group chat with hidden notification preference
+            const reportID = '1';
+            await Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT}${reportID}`, {
+                reportID,
+                type: CONST.REPORT.TYPE.CHAT,
+                chatType: CONST.REPORT.CHAT_TYPE.GROUP,
+                participants: {
+                    [RORY_ACCOUNT_ID]: {notificationPreference: CONST.REPORT.NOTIFICATION_PREFERENCE.HIDDEN},
+                    [CARLOS_ACCOUNT_ID]: {notificationPreference: CONST.REPORT.NOTIFICATION_PREFERENCE.HIDDEN},
                 },
             });
-            const transaction2 = buildOptimisticTransaction({
-                transactionParams: {
-                    amount: 100,
-                    currency: 'USD',
-                    reportID: iouReport.reportID,
-                },
+
+            // When the user split bill on the group chat
+            splitBill({
+                participants: [{accountID: CARLOS_ACCOUNT_ID, login: CARLOS_EMAIL}],
+                currentUserLogin: RORY_EMAIL,
+                currentUserAccountID: RORY_ACCOUNT_ID,
+                comment: '',
+                amount: 100,
+                currency: CONST.CURRENCY.USD,
+                merchant: 'test',
+                created: '',
+                existingSplitChatReportID: reportID,
+                isASAPSubmitBetaEnabled: false,
+                transactionViolations: {},
+                quickAction: undefined,
+                policyRecentlyUsedCurrencies: [],
+                policyRecentlyUsedTags: undefined,
             });
-            const transactionCollectionDataSet: TransactionCollectionDataSet = {
-                [`${ONYXKEYS.COLLECTION.TRANSACTION}${transaction1.transactionID}`]: transaction1,
-                [`${ONYXKEYS.COLLECTION.TRANSACTION}${transaction2.transactionID}`]: transaction2,
-            };
-            const iouActions: ReportAction[] = [];
-            for (const transaction of [transaction1, transaction2]) {
-                iouActions.push(
-                    buildOptimisticIOUReportAction({
-                        type: CONST.IOU.REPORT_ACTION_TYPE.CREATE,
-                        amount: transaction.amount,
-                        currency: transaction.currency,
-                        comment: '',
-                        participants: [],
-                        transactionID: transaction.transactionID,
-                    }),
-                );
-            }
-            const actions: OnyxInputValue<ReportActions> = {};
-            for (const iouAction of iouActions) {
-                actions[`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${iouAction.reportActionID}`] = iouAction;
-            }
-            const actionCollectionDataSet: ReportActionsCollectionDataSet = {[`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${iouReport.reportID}`]: actions};
 
-            return waitForBatchedUpdates()
-                .then(() => Onyx.multiSet({...transactionCollectionDataSet, ...actionCollectionDataSet}))
-                .then(() => {
-                    putOnHold(transaction1.transactionID, 'comment', iouReport.reportID);
-                    return waitForBatchedUpdates();
-                })
-                .then(() => {
-                    // When partially paying  an iou report from the chat report via the report preview
-                    payMoneyRequest(CONST.IOU.PAYMENT_TYPE.ELSEWHERE, {reportID: topMostReportID}, iouReport, undefined, undefined, undefined, false);
-                    return waitForBatchedUpdates();
-                })
-                .then(() => {
-                    // Then notifyNewAction should be called on the top most report.
-                    expect(notifyNewAction).toHaveBeenCalledWith(topMostReportID, expect.anything());
+            await waitForBatchedUpdates();
+
+            // Then the DM notification preference should be updated to ALWAYS
+            const report = await new Promise<OnyxEntry<Report>>((resolve) => {
+                const connection = Onyx.connect({
+                    key: `${ONYXKEYS.COLLECTION.REPORT}${reportID}`,
+                    callback: (reportVal) => {
+                        Onyx.disconnect(connection);
+                        resolve(reportVal);
+                    },
                 });
+            });
+            expect(report?.participants?.[RORY_ACCOUNT_ID].notificationPreference).toBe(CONST.REPORT.NOTIFICATION_PREFERENCE.ALWAYS);
         });
 
-        it('new expense report should be a draft report when paying partially and the approval is disabled', async () => {
-            const adminAccountID = 1;
-            const employeeAccountID = 3;
-            const adminEmail = 'admin@test.com';
-            const employeeEmail = 'employee@test.com';
+        it('should update the policyRecentlyUsedTags when tag is provided', async () => {
+            // Given a policy recently used tags
+            const policyID = 'A';
+            const transactionTag = 'new tag';
+            const tagName = 'Tag';
+            const policyRecentlyUsedTags: OnyxEntry<RecentlyUsedTags> = {
+                [tagName]: ['old tag'],
+            };
 
-            await Onyx.set(ONYXKEYS.PERSONAL_DETAILS_LIST, {
-                [adminAccountID]: {
-                    accountID: adminAccountID,
-                    login: adminEmail,
-                    displayName: 'Admin User',
-                },
-                [employeeAccountID]: {
-                    accountID: employeeAccountID,
-                    login: employeeEmail,
-                    displayName: 'Employee User',
-                },
+            const policyExpenseChat = {
+                reportID: '2',
+                policyID,
+                isPolicyExpenseChat: true,
+                isOwnPolicyExpenseChat: true,
+            };
+
+            await Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT}${policyExpenseChat.reportID}`, policyExpenseChat);
+            await Onyx.merge(`${ONYXKEYS.COLLECTION.POLICY_TAGS}${policyID}`, {
+                [tagName]: {name: tagName},
             });
+            await Onyx.merge(`${ONYXKEYS.COLLECTION.POLICY_RECENTLY_USED_TAGS}${policyID}`, policyRecentlyUsedTags);
 
-            // Create policy with no approval required
-            const policy = {
-                id: '1',
-                name: 'Test Policy',
-                role: CONST.POLICY.ROLE.ADMIN,
-                owner: adminEmail,
-                outputCurrency: CONST.CURRENCY.USD,
-                isPolicyExpenseChatEnabled: true,
-                type: CONST.POLICY.TYPE.CORPORATE,
-                approvalMode: CONST.POLICY.APPROVAL_MODE.OPTIONAL,
-                employeeList: {
-                    [employeeEmail]: {
-                        email: employeeEmail,
-                        role: CONST.POLICY.ROLE.USER,
-                        submitsTo: adminEmail,
-                    },
-                    [adminEmail]: {
-                        email: adminEmail,
-                        role: CONST.POLICY.ROLE.ADMIN,
-                        submitsTo: '',
-                        forwardsTo: '',
+            // When doing a split bill
+            splitBill({
+                participants: [{isPolicyExpenseChat: true, policyID}],
+                existingSplitChatReportID: policyExpenseChat.reportID,
+                currentUserLogin: currentUserPersonalDetails.login ?? '',
+                currentUserAccountID: currentUserPersonalDetails.accountID,
+                amount: 1,
+                created: '',
+                comment: '',
+                merchant: '',
+                transactionViolations: undefined,
+                category: undefined,
+                tag: transactionTag,
+                currency: CONST.CURRENCY.USD,
+                taxCode: '',
+                taxAmount: 0,
+                isASAPSubmitBetaEnabled: false,
+                policyRecentlyUsedTags,
+                quickAction: {},
+                policyRecentlyUsedCurrencies: [],
+            });
+
+            waitForBatchedUpdates();
+
+            // Then the transaction tag should be added to the recently used tags collection
+            const newPolicyRecentlyUsedTags: RecentlyUsedTags = await new Promise((resolve) => {
+                const connection = Onyx.connectWithoutView({
+                    key: `${ONYXKEYS.COLLECTION.POLICY_RECENTLY_USED_TAGS}${policyID}`,
+                    callback: (recentlyUsedTags) => {
+                        resolve(recentlyUsedTags ?? {});
+                        Onyx.disconnect(connection);
                     },
+                });
+            });
+            expect(newPolicyRecentlyUsedTags[tagName].length).toBe(2);
+            expect(newPolicyRecentlyUsedTags[tagName].at(0)).toBe(transactionTag);
+        });
+
+        it('the description should not be parsed again after completing the scan split bill without changing the description', async () => {
+            const reportID = '1';
+            await Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT}${reportID}`, {
+                reportID,
+                type: CONST.REPORT.TYPE.CHAT,
+                chatType: CONST.REPORT.CHAT_TYPE.GROUP,
+                participants: {
+                    [RORY_ACCOUNT_ID]: {notificationPreference: CONST.REPORT.NOTIFICATION_PREFERENCE.ALWAYS},
+                    [CARLOS_ACCOUNT_ID]: {notificationPreference: CONST.REPORT.NOTIFICATION_PREFERENCE.ALWAYS},
                 },
-            };
+            });
 
-            // Create expense report
-            const expenseReport = {
-                reportID: '123',
-                type: CONST.REPORT.TYPE.EXPENSE,
-                ownerAccountID: employeeAccountID,
-                managerID: adminAccountID,
-                policyID: policy.id,
-                stateNum: CONST.REPORT.STATE_NUM.APPROVED,
-                statusNum: CONST.REPORT.STATUS_NUM.CLOSED,
-                total: 1000,
-                currency: 'USD',
-                parentReportID: '456',
-                chatReportID: '456',
-            };
+            // Start a scan split bill
+            const {splitTransactionID} = startSplitBill({
+                participants: [{accountID: CARLOS_ACCOUNT_ID, login: CARLOS_EMAIL}],
+                currentUserLogin: RORY_EMAIL,
+                currentUserAccountID: RORY_ACCOUNT_ID,
+                comment: '# test',
+                currency: CONST.CURRENCY.USD,
+                existingSplitChatReportID: reportID,
+                receipt: {},
+                category: undefined,
+                tag: undefined,
+                taxCode: '',
+                taxAmount: 0,
+                quickAction: undefined,
+                policyRecentlyUsedCurrencies: [],
+                policyRecentlyUsedTags: undefined,
+            });
 
-            const chatReport = {
-                reportID: '456',
-                isOwnPolicyExpenseChat: true,
-                ownerAccountID: employeeAccountID,
-                iouReportID: expenseReport.reportID,
-                policyID: policy.id,
-                type: CONST.REPORT.TYPE.CHAT,
-                chatType: CONST.REPORT.CHAT_TYPE.POLICY_EXPENSE_CHAT,
-            };
+            await waitForBatchedUpdates();
 
-            await Onyx.set(`${ONYXKEYS.COLLECTION.POLICY}${policy.id}`, policy);
-            await Onyx.set(`${ONYXKEYS.COLLECTION.REPORT}${expenseReport.reportID}`, expenseReport);
-            await Onyx.set(`${ONYXKEYS.COLLECTION.REPORT}${chatReport.reportID}`, chatReport);
+            let splitTransaction = await getOnyxValue(`${ONYXKEYS.COLLECTION.TRANSACTION}${splitTransactionID}`);
+
+            // Then the description should be parsed correctly
+            expect(splitTransaction?.comment?.comment).toBe('<h1>test</h1>');
+
+            const updatedSplitTransaction = splitTransaction
+                ? {
+                      ...splitTransaction,
+                      amount: 100,
+                  }
+                : undefined;
+
+            const reportActions = await getOnyxValue(`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${reportID}`);
+            const iouAction = Object.values(reportActions ?? {}).find((action) => isActionOfType(action, CONST.REPORT.ACTIONS.TYPE.IOU));
+
+            expect(iouAction).toBeTruthy();
+
+            // Complete this split bill without changing the description
+            completeSplitBill(reportID, iouAction, updatedSplitTransaction, RORY_ACCOUNT_ID, false, undefined, {}, RORY_EMAIL);
 
-            const newExpenseReportID = payMoneyRequest(CONST.IOU.PAYMENT_TYPE.ELSEWHERE, chatReport, expenseReport, undefined, undefined, undefined, false, undefined, policy);
             await waitForBatchedUpdates();
-            const newExpenseReport = await getOnyxValue(`${ONYXKEYS.COLLECTION.REPORT}${newExpenseReportID}`);
-            expect(newExpenseReport?.stateNum).toBe(CONST.REPORT.STATE_NUM.OPEN);
-            expect(newExpenseReport?.statusNum).toBe(CONST.REPORT.STATUS_NUM.OPEN);
+
+            splitTransaction = await getOnyxValue(`${ONYXKEYS.COLLECTION.TRANSACTION}${splitTransactionID}`);
+
+            // Then the description should be the same since it was not changed
+            expect(splitTransaction?.comment?.comment).toBe('<h1>test</h1>');
         });
     });
 
-    describe('a expense chat with a cancelled payment', () => {
-        const amount = 10000;
-        const comment = '💸💸💸💸';
-        const merchant = 'NASDAQ';
+    describe('startSplitBill', () => {
+        it('should update the policyRecentlyUsedTags when tag is provided', async () => {
+            // Given a policy recently used tags
+            const policyID = 'A';
+            const transactionTag = 'new tag';
+            const tagName = 'Tag';
+            const policyRecentlyUsedTags: OnyxEntry<RecentlyUsedTags> = {
+                [tagName]: ['old tag'],
+            };
 
-        afterEach(() => {
-            mockFetch?.resume?.();
-        });
+            await Onyx.merge(`${ONYXKEYS.COLLECTION.POLICY_TAGS}${policyID}`, {
+                [tagName]: {name: tagName},
+            });
+            await Onyx.merge(`${ONYXKEYS.COLLECTION.POLICY_RECENTLY_USED_TAGS}${policyID}`, policyRecentlyUsedTags);
 
-        it("has an iouReportID of the cancelled payment's expense report", () => {
-            let expenseReport: OnyxEntry<Report>;
-            let chatReport: OnyxEntry<Report>;
+            // When doing a split bill with a receipt
+            startSplitBill({
+                participants: [{isPolicyExpenseChat: true, policyID}],
+                currentUserLogin: currentUserPersonalDetails.login ?? '',
+                currentUserAccountID: currentUserPersonalDetails.accountID,
+                comment: '',
+                receipt: {},
+                category: undefined,
+                tag: transactionTag,
+                currency: CONST.CURRENCY.USD,
+                taxCode: '',
+                taxAmount: 0,
+                policyRecentlyUsedTags,
+                quickAction: {},
+                policyRecentlyUsedCurrencies: [],
+            });
 
-            // Given a signed in account, which owns a workspace, and has a policy expense chat
-            Onyx.set(ONYXKEYS.SESSION, {email: CARLOS_EMAIL, accountID: CARLOS_ACCOUNT_ID});
-            return waitForBatchedUpdates()
-                .then(() => {
-                    // Which owns a workspace
-                    createWorkspace({
-                        policyOwnerEmail: CARLOS_EMAIL,
-                        makeMeAdmin: true,
-                        policyName: "Carlos's Workspace",
-                        introSelected: {choice: CONST.ONBOARDING_CHOICES.MANAGE_TEAM},
-                        currentUserAccountIDParam: CARLOS_ACCOUNT_ID,
-                        currentUserEmailParam: CARLOS_EMAIL,
-                    });
-                    return waitForBatchedUpdates();
-                })
-                .then(() =>
-                    getOnyxData({
-                        key: ONYXKEYS.COLLECTION.REPORT,
-                        waitForCollectionCallback: true,
-                        callback: (allReports) => {
-                            chatReport = Object.values(allReports ?? {}).find((report) => report?.chatType === CONST.REPORT.CHAT_TYPE.POLICY_EXPENSE_CHAT);
-                        },
-                    }),
-                )
-                .then(() => {
-                    if (chatReport) {
-                        // When an IOU expense is submitted to that policy expense chat
-                        requestMoney({
-                            report: chatReport,
-                            participantParams: {
-                                payeeEmail: RORY_EMAIL,
-                                payeeAccountID: RORY_ACCOUNT_ID,
-                                participant: {login: CARLOS_EMAIL, accountID: CARLOS_ACCOUNT_ID},
-                            },
-                            transactionParams: {
-                                amount,
-                                attendees: [],
-                                currency: CONST.CURRENCY.USD,
-                                created: '',
-                                merchant,
-                                comment,
-                            },
-                            shouldGenerateTransactionThreadReport: true,
-                            isASAPSubmitBetaEnabled: false,
-                            currentUserAccountIDParam: 123,
-                            currentUserEmailParam: 'existing@example.com',
-                            transactionViolations: {},
-                            policyRecentlyUsedCurrencies: [],
-                            quickAction: undefined,
-                        });
-                    }
-                    return waitForBatchedUpdates();
-                })
-                .then(() =>
-                    // And given an expense report has now been created which holds the IOU
-                    getOnyxData({
-                        key: ONYXKEYS.COLLECTION.REPORT,
-                        waitForCollectionCallback: true,
-                        callback: (allReports) => {
-                            expenseReport = Object.values(allReports ?? {}).find((report) => report?.type === CONST.REPORT.TYPE.IOU);
-                        },
-                    }),
-                )
-                .then(() => {
-                    // When the expense report is paid elsewhere (but really, any payment option would work)
-                    if (chatReport && expenseReport) {
-                        payMoneyRequest(CONST.IOU.PAYMENT_TYPE.ELSEWHERE, chatReport, expenseReport, undefined, undefined);
-                    }
-                    return waitForBatchedUpdates();
-                })
-                .then(() => {
-                    if (chatReport && expenseReport) {
-                        // And when the payment is cancelled
-                        cancelPayment(expenseReport, chatReport, {} as Policy, true, CARLOS_ACCOUNT_ID, CARLOS_EMAIL, true);
-                    }
-                    return waitForBatchedUpdates();
-                })
-                .then(() =>
-                    getOnyxData({
-                        key: ONYXKEYS.COLLECTION.REPORT,
-                        waitForCollectionCallback: true,
-                        callback: (allReports) => {
-                            const chatReportData = allReports?.[`${ONYXKEYS.COLLECTION.REPORT}${chatReport?.reportID}`];
-                            // Then the policy expense chat report has the iouReportID of the IOU expense report
-                            expect(chatReportData?.iouReportID).toBe(expenseReport?.reportID);
-                        },
-                    }),
-                );
+            waitForBatchedUpdates();
+
+            // Then the transaction tag should be added to the recently used tags collection
+            const newPolicyRecentlyUsedTags: RecentlyUsedTags = await new Promise((resolve) => {
+                const connection = Onyx.connectWithoutView({
+                    key: `${ONYXKEYS.COLLECTION.POLICY_RECENTLY_USED_TAGS}${policyID}`,
+                    callback: (recentlyUsedTags) => {
+                        resolve(recentlyUsedTags ?? {});
+                        Onyx.disconnect(connection);
+                    },
+                });
+            });
+            expect(newPolicyRecentlyUsedTags[tagName].length).toBe(2);
+            expect(newPolicyRecentlyUsedTags[tagName].at(0)).toBe(transactionTag);
         });
     });
 
-    describe('deleteMoneyRequest', () => {
-        const amount = 10000;
-        const comment = 'Send me money please';
-        let chatReport: OnyxEntry<Report>;
-        let iouReport: OnyxEntry<Report>;
-        let createIOUAction: OnyxEntry<ReportAction<typeof CONST.REPORT.ACTIONS.TYPE.IOU>>;
-        let transaction: OnyxEntry<Transaction>;
-        let thread: OptimisticChatReport;
-        const TEST_USER_ACCOUNT_ID = 1;
-        const TEST_USER_LOGIN = 'test@test.com';
-        let IOU_REPORT_ID: string | undefined;
-        let IOU_REPORT: OnyxEntry<Report>;
-        let reportActionID;
-        const REPORT_ACTION: OnyxEntry<ReportAction> = {
-            actionName: CONST.REPORT.ACTIONS.TYPE.ADD_COMMENT,
-            actorAccountID: TEST_USER_ACCOUNT_ID,
-            automatic: false,
-            avatar: 'https://d2k5nsl2zxldvw.cloudfront.net/images/avatars/avatar_3.png',
-            message: [{type: 'COMMENT', html: 'Testing a comment', text: 'Testing a comment', translationKey: ''}],
-            person: [{type: 'TEXT', style: 'strong', text: 'Test User'}],
-            shouldShow: true,
-            created: DateUtils.getDBTime(),
-            reportActionID: '1',
-            originalMessage: {
-                html: '',
-                whisperedTo: [],
-            },
-        };
-
-        let reportActions: OnyxCollection<ReportAction>;
-
-        beforeEach(async () => {
-            // Given mocks are cleared and helpers are set up
-            jest.clearAllMocks();
-            PusherHelper.setup();
+    describe('updateSplitTransactionsFromSplitExpensesFlow', () => {
+        it('should delete the original transaction thread report', async () => {
+            const expenseReport: Report = {
+                ...createRandomReport(1, undefined),
+                type: CONST.REPORT.TYPE.EXPENSE,
+            };
+            const transaction: Transaction = {
+                amount: 100,
+                currency: 'USD',
+                transactionID: '1',
+                reportID: expenseReport.reportID,
+                created: DateUtils.getDBTime(),
+                merchant: 'test',
+            };
+            const transactionThread: Report = {
+                ...createRandomReport(2, undefined),
+            };
+            const iouAction: ReportAction = {
+                ...buildOptimisticIOUReportAction({
+                    type: CONST.IOU.REPORT_ACTION_TYPE.CREATE,
+                    amount: transaction.amount,
+                    currency: transaction.currency,
+                    comment: '',
+                    participants: [],
+                    transactionID: transaction.transactionID,
+                    iouReportID: expenseReport.reportID,
+                }),
+                childReportID: transactionThread.reportID,
+            };
+            await Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT}${expenseReport.reportID}`, expenseReport);
+            await Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT}${transactionThread.reportID}`, transactionThread);
+            await Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${expenseReport.reportID}`, {
+                [iouAction.reportActionID]: iouAction,
+            });
+            await Onyx.merge(`${ONYXKEYS.COLLECTION.TRANSACTION}${transaction.transactionID}`, transaction);
+            const draftTransaction: OnyxEntry<Transaction> = {
+                ...transaction,
+                comment: {
+                    originalTransactionID: transaction.transactionID,
+                },
+            };
 
-            // Given a test user is signed in with Onyx setup and some initial data
-            await signInWithTestUser(TEST_USER_ACCOUNT_ID, TEST_USER_LOGIN);
-            subscribeToUserEvents();
-            await waitForBatchedUpdates();
-            await setPersonalDetails(TEST_USER_LOGIN, TEST_USER_ACCOUNT_ID);
+            let allTransactions: OnyxCollection<Transaction>;
+            let allReports: OnyxCollection<Report>;
+            let allReportNameValuePairs: OnyxCollection<ReportNameValuePairs>;
+            await getOnyxData({
+                key: ONYXKEYS.COLLECTION.TRANSACTION,
+                waitForCollectionCallback: true,
+                callback: (value) => {
+                    allTransactions = value;
+                },
+            });
+            await getOnyxData({
+                key: ONYXKEYS.COLLECTION.REPORT,
+                waitForCollectionCallback: true,
+                callback: (value) => {
+                    allReports = value;
+                },
+            });
+            await getOnyxData({
+                key: ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS,
+                waitForCollectionCallback: true,
+                callback: (value) => {
+                    allReportNameValuePairs = value;
+                },
+            });
 
-            // When a submit IOU expense is made
-            requestMoney({
-                report: chatReport,
-                participantParams: {
-                    payeeEmail: TEST_USER_LOGIN,
-                    payeeAccountID: TEST_USER_ACCOUNT_ID,
-                    participant: {login: RORY_EMAIL, accountID: RORY_ACCOUNT_ID},
+            updateSplitTransactionsFromSplitExpensesFlow({
+                allTransactionsList: allTransactions,
+                allReportsList: allReports,
+                allReportNameValuePairsList: allReportNameValuePairs,
+                transactionData: {
+                    reportID: draftTransaction?.reportID ?? String(CONST.DEFAULT_NUMBER_ID),
+                    originalTransactionID: draftTransaction?.comment?.originalTransactionID ?? String(CONST.DEFAULT_NUMBER_ID),
+                    splitExpenses: draftTransaction?.comment?.splitExpenses ?? [],
+                    splitExpensesTotal: draftTransaction?.comment?.splitExpensesTotal,
                 },
-                transactionParams: {
-                    amount,
-                    attendees: [],
-                    currency: CONST.CURRENCY.USD,
-                    created: '',
-                    merchant: '',
-                    comment,
+                searchContext: {
+                    currentSearchHash: -2,
                 },
-                shouldGenerateTransactionThreadReport: true,
+                policyCategories: undefined,
+                policy: undefined,
+                policyRecentlyUsedCategories: [],
+                iouReport: expenseReport,
+                firstIOU: iouAction,
                 isASAPSubmitBetaEnabled: false,
-                currentUserAccountIDParam: 123,
-                currentUserEmailParam: 'existing@example.com',
+                currentUserPersonalDetails,
                 transactionViolations: {},
                 policyRecentlyUsedCurrencies: [],
                 quickAction: undefined,
             });
+
             await waitForBatchedUpdates();
 
-            // When fetching all reports from Onyx
-            const allReports = await new Promise<OnyxCollection<Report>>((resolve) => {
+            const originalTransactionThread = await new Promise<OnyxEntry<Report>>((resolve) => {
                 const connection = Onyx.connect({
-                    key: ONYXKEYS.COLLECTION.REPORT,
-                    waitForCollectionCallback: true,
-                    callback: (reports) => {
+                    key: `${ONYXKEYS.COLLECTION.REPORT}${iouAction.childReportID}`,
+                    callback: (val) => {
                         Onyx.disconnect(connection);
-                        resolve(reports);
+                        resolve(val);
                     },
                 });
             });
+            expect(originalTransactionThread).toBe(undefined);
+        });
 
-            // Then we should have exactly 3 reports
-            expect(Object.values(allReports ?? {}).length).toBe(3);
-
-            // Then one of them should be a chat report with relevant properties
-            chatReport = Object.values(allReports ?? {}).find((report) => report?.type === CONST.REPORT.TYPE.CHAT);
-            expect(chatReport).toBeTruthy();
-            expect(chatReport).toHaveProperty('reportID');
-            expect(chatReport).toHaveProperty('iouReportID');
-
-            // Then one of them should be an IOU report with relevant properties
-            iouReport = Object.values(allReports ?? {}).find((report) => report?.type === CONST.REPORT.TYPE.IOU);
-            expect(iouReport).toBeTruthy();
-            expect(iouReport).toHaveProperty('reportID');
-            expect(iouReport).toHaveProperty('chatReportID');
-
-            // Then their IDs should reference each other
-            expect(chatReport?.iouReportID).toBe(iouReport?.reportID);
-            expect(iouReport?.chatReportID).toBe(chatReport?.reportID);
-
-            // Storing IOU Report ID for further reference
-            IOU_REPORT_ID = chatReport?.iouReportID;
-            IOU_REPORT = iouReport;
-
-            await waitForBatchedUpdates();
-
-            // When fetching all report actions from Onyx
-            const allReportActions = await new Promise<OnyxCollection<ReportActions>>((resolve) => {
-                const connection = Onyx.connect({
-                    key: ONYXKEYS.COLLECTION.REPORT_ACTIONS,
-                    waitForCollectionCallback: true,
-                    callback: (actions) => {
-                        Onyx.disconnect(connection);
-                        resolve(actions);
-                    },
-                });
+        it('should remove the original transaction from the search snapshot data', async () => {
+            // Given a single expense
+            const expenseReport: Report = {
+                ...createRandomReport(1, undefined),
+                type: CONST.REPORT.TYPE.EXPENSE,
+            };
+            const transaction: Transaction = {
+                amount: 100,
+                currency: 'USD',
+                transactionID: '1',
+                reportID: expenseReport.reportID,
+                created: DateUtils.getDBTime(),
+                merchant: 'test',
+            };
+            const transactionThread: Report = {
+                ...createRandomReport(2, undefined),
+            };
+            const iouAction: ReportAction = {
+                ...buildOptimisticIOUReportAction({
+                    type: CONST.IOU.REPORT_ACTION_TYPE.CREATE,
+                    amount: transaction.amount,
+                    currency: transaction.currency,
+                    comment: '',
+                    participants: [],
+                    transactionID: transaction.transactionID,
+                    iouReportID: expenseReport.reportID,
+                }),
+                childReportID: transactionThread.reportID,
+            };
+            await Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT}${expenseReport.reportID}`, expenseReport);
+            await Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT}${transactionThread.reportID}`, transactionThread);
+            await Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${expenseReport.reportID}`, {
+                [iouAction.reportActionID]: iouAction,
             });
+            await Onyx.merge(`${ONYXKEYS.COLLECTION.TRANSACTION}${transaction.transactionID}`, transaction);
+            const draftTransaction: OnyxEntry<Transaction> = {
+                ...transaction,
+                comment: {
+                    originalTransactionID: transaction.transactionID,
+                },
+            };
 
-            // Then we should find an IOU action with specific properties
-            const reportActionsForIOUReport = allReportActions?.[`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${chatReport?.iouReportID}`];
-            createIOUAction = Object.values(reportActionsForIOUReport ?? {}).find((reportAction): reportAction is ReportAction<typeof CONST.REPORT.ACTIONS.TYPE.IOU> =>
-                isMoneyRequestAction(reportAction),
-            );
-            expect(createIOUAction).toBeTruthy();
-            expect(createIOUAction && getOriginalMessage(createIOUAction)?.IOUReportID).toBe(iouReport?.reportID);
+            // When splitting the expense
+            const hash = 1;
 
-            // When fetching all transactions from Onyx
-            const allTransactions = await new Promise<OnyxCollection<Transaction>>((resolve) => {
-                const connection = Onyx.connect({
-                    key: ONYXKEYS.COLLECTION.TRANSACTION,
-                    waitForCollectionCallback: true,
-                    callback: (transactions) => {
-                        Onyx.disconnect(connection);
-                        resolve(transactions);
-                    },
-                });
+            let allTransactions: OnyxCollection<Transaction>;
+            let allReports: OnyxCollection<Report>;
+            let allReportNameValuePairs: OnyxCollection<ReportNameValuePairs>;
+            await getOnyxData({
+                key: ONYXKEYS.COLLECTION.TRANSACTION,
+                waitForCollectionCallback: true,
+                callback: (value) => {
+                    allTransactions = value;
+                },
             });
-
-            // Then we should find a specific transaction with relevant properties
-            transaction = Object.values(allTransactions ?? {}).find((t) => t);
-            expect(transaction).toBeTruthy();
-            expect(transaction?.amount).toBe(amount);
-            expect(transaction?.reportID).toBe(iouReport?.reportID);
-            expect(createIOUAction && getOriginalMessage(createIOUAction)?.IOUTransactionID).toBe(transaction?.transactionID);
-        });
-
-        afterEach(PusherHelper.teardown);
-
-        it('delete an expense (IOU Action and transaction) successfully', async () => {
-            // Given the fetch operations are paused and an expense is initiated
-            mockFetch?.pause?.();
-
-            if (transaction && createIOUAction) {
-                // When the expense is deleted
-                deleteMoneyRequest({
-                    transactionID: transaction?.transactionID,
-                    reportAction: createIOUAction,
-                    transactions: {},
-                    violations: {},
-                    iouReport,
-                    chatReport,
-                    isChatIOUReportArchived: true,
-                    allTransactionViolationsParam: {},
-                });
-            }
-            await waitForBatchedUpdates();
-
-            // Then we check if the IOU report action is removed from the report actions collection
-            let reportActionsForReport = await new Promise<OnyxCollection<ReportAction>>((resolve) => {
-                const connection = Onyx.connect({
-                    key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${iouReport?.reportID}`,
-                    waitForCollectionCallback: false,
-                    callback: (actionsForReport) => {
-                        Onyx.disconnect(connection);
-                        resolve(actionsForReport);
-                    },
-                });
+            await getOnyxData({
+                key: ONYXKEYS.COLLECTION.REPORT,
+                waitForCollectionCallback: true,
+                callback: (value) => {
+                    allReports = value;
+                },
             });
-
-            createIOUAction = Object.values(reportActionsForReport ?? {}).find((reportAction): reportAction is ReportAction<typeof CONST.REPORT.ACTIONS.TYPE.IOU> =>
-                isMoneyRequestAction(reportAction),
-            );
-            // Then the IOU Action should be truthy for offline support.
-            expect(createIOUAction).toBeTruthy();
-
-            // Then we check if the transaction is removed from the transactions collection
-            const t = await new Promise<OnyxEntry<Transaction>>((resolve) => {
-                const connection = Onyx.connect({
-                    key: `${ONYXKEYS.COLLECTION.TRANSACTION}${transaction?.transactionID}`,
-                    waitForCollectionCallback: false,
-                    callback: (transactionResult) => {
-                        Onyx.disconnect(connection);
-                        resolve(transactionResult);
-                    },
-                });
+            await getOnyxData({
+                key: ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS,
+                waitForCollectionCallback: true,
+                callback: (value) => {
+                    allReportNameValuePairs = value;
+                },
             });
-
-            expect(t).toBeTruthy();
-            expect(t?.pendingAction).toBe(CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE);
-
-            // Given fetch operations are resumed
-            mockFetch?.resume?.();
-            await waitForBatchedUpdates();
-
-            // Then we recheck the IOU report action from the report actions collection
-            reportActionsForReport = await new Promise<OnyxCollection<ReportAction>>((resolve) => {
-                const connection = Onyx.connect({
-                    key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${iouReport?.reportID}`,
-                    waitForCollectionCallback: false,
-                    callback: (actionsForReport) => {
-                        Onyx.disconnect(connection);
-                        resolve(actionsForReport);
-                    },
-                });
+            updateSplitTransactionsFromSplitExpensesFlow({
+                allTransactionsList: allTransactions,
+                allReportsList: allReports,
+                allReportNameValuePairsList: allReportNameValuePairs,
+                transactionData: {
+                    reportID: draftTransaction?.reportID ?? String(CONST.DEFAULT_NUMBER_ID),
+                    originalTransactionID: draftTransaction?.comment?.originalTransactionID ?? String(CONST.DEFAULT_NUMBER_ID),
+                    splitExpenses: draftTransaction?.comment?.splitExpenses ?? [],
+                    splitExpensesTotal: draftTransaction?.comment?.splitExpensesTotal,
+                },
+                searchContext: {
+                    currentSearchHash: hash,
+                },
+                policyCategories: undefined,
+                policy: undefined,
+                policyRecentlyUsedCategories: [],
+                iouReport: expenseReport,
+                firstIOU: undefined,
+                isASAPSubmitBetaEnabled: false,
+                currentUserPersonalDetails,
+                transactionViolations: {},
+                policyRecentlyUsedCurrencies: [],
+                quickAction: undefined,
             });
 
-            createIOUAction = Object.values(reportActionsForReport ?? {}).find((reportAction): reportAction is ReportAction<typeof CONST.REPORT.ACTIONS.TYPE.IOU> =>
-                isMoneyRequestAction(reportAction),
-            );
-            expect(createIOUAction).toBeFalsy();
+            await waitForBatchedUpdates();
 
-            // Then we recheck the transaction from the transactions collection
-            const tr = await new Promise<OnyxEntry<Transaction>>((resolve) => {
+            // Then the original expense/transaction should be removed from the search snapshot data
+            const searchSnapshot = await new Promise<OnyxEntry<SearchResults>>((resolve) => {
                 const connection = Onyx.connect({
-                    key: `${ONYXKEYS.COLLECTION.TRANSACTION}${transaction?.transactionID}`,
-                    waitForCollectionCallback: false,
-                    callback: (transactionResult) => {
+                    key: `${ONYXKEYS.COLLECTION.SNAPSHOT}${hash}`,
+                    callback: (val) => {
                         Onyx.disconnect(connection);
-                        resolve(transactionResult);
+                        resolve(val);
                     },
                 });
             });
-
-            expect(tr).toBeFalsy();
+            expect(searchSnapshot?.data[`${ONYXKEYS.COLLECTION.TRANSACTION}${transaction.transactionID}`]).toBe(undefined);
         });
 
-        it('delete the IOU report when there are no expenses left in the IOU report', async () => {
-            // Given an IOU report and a paused fetch state
-            mockFetch?.pause?.();
+        it('should add split transactions optimistically on search snapshot when current search filter is on unapprovedCash', async () => {
+            const chatReport: Report = createRandomReport(7, CONST.REPORT.CHAT_TYPE.POLICY_EXPENSE_CHAT);
+            // Given a single expense
+            const expenseReport: Report = {
+                ...createRandomReport(1, undefined),
+                type: CONST.REPORT.TYPE.EXPENSE,
+                chatReportID: chatReport.reportID,
+                stateNum: CONST.REPORT.STATE_NUM.SUBMITTED,
+                statusNum: CONST.REPORT.STATUS_NUM.SUBMITTED,
+            };
+            const transaction: Transaction = {
+                amount: 100,
+                currency: 'USD',
+                transactionID: '1',
+                reportID: expenseReport.reportID,
+                created: DateUtils.getDBTime(),
+                merchant: 'test',
+            };
+            const transactionThread: Report = {
+                ...createRandomReport(2, undefined),
+            };
+            const iouAction: ReportAction = {
+                ...buildOptimisticIOUReportAction({
+                    type: CONST.IOU.REPORT_ACTION_TYPE.CREATE,
+                    amount: transaction.amount,
+                    currency: transaction.currency,
+                    comment: '',
+                    participants: [],
+                    transactionID: transaction.transactionID,
+                    iouReportID: expenseReport.reportID,
+                }),
+                childReportID: transactionThread.reportID,
+            };
+            await Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT}${chatReport.reportID}`, chatReport);
+            await Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT}${expenseReport.reportID}`, expenseReport);
+            await Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT}${transactionThread.reportID}`, transactionThread);
+            await Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${expenseReport.reportID}`, {
+                [iouAction.reportActionID]: iouAction,
+            });
+            await Onyx.merge(`${ONYXKEYS.COLLECTION.TRANSACTION}${transaction.transactionID}`, transaction);
+            const splitTransactionID1 = '34';
+            const splitTransactionID2 = '35';
+            const draftTransaction: OnyxEntry<Transaction> = {
+                ...transaction,
+                comment: {
+                    originalTransactionID: transaction.transactionID,
+                    splitExpenses: [
+                        {amount: transaction.amount / 2, transactionID: splitTransactionID1, created: ''},
+                        {amount: transaction.amount / 2, transactionID: splitTransactionID2, created: ''},
+                    ],
+                },
+            };
 
-            if (transaction && createIOUAction) {
-                // When the IOU expense is deleted
-                deleteMoneyRequest({
-                    transactionID: transaction?.transactionID,
-                    reportAction: createIOUAction,
-                    transactions: {},
-                    violations: {},
-                    iouReport,
-                    chatReport,
-                    isChatIOUReportArchived: true,
-                    allTransactionViolationsParam: {},
-                });
-            }
-            await waitForBatchedUpdates();
+            // When splitting the expense
+            const hash = 1;
 
-            let report = await new Promise<OnyxEntry<Report>>((resolve) => {
-                const connection = Onyx.connect({
-                    key: `${ONYXKEYS.COLLECTION.REPORT}${iouReport?.reportID}`,
-                    waitForCollectionCallback: false,
-                    callback: (res) => {
-                        Onyx.disconnect(connection);
-                        resolve(res);
-                    },
-                });
+            let allTransactions: OnyxCollection<Transaction>;
+            let allReports: OnyxCollection<Report>;
+            let allReportNameValuePairs: OnyxCollection<ReportNameValuePairs>;
+            await getOnyxData({
+                key: ONYXKEYS.COLLECTION.TRANSACTION,
+                waitForCollectionCallback: true,
+                callback: (value) => {
+                    allTransactions = value;
+                },
+            });
+            await getOnyxData({
+                key: ONYXKEYS.COLLECTION.REPORT,
+                waitForCollectionCallback: true,
+                callback: (value) => {
+                    allReports = value;
+                },
+            });
+            await getOnyxData({
+                key: ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS,
+                waitForCollectionCallback: true,
+                callback: (value) => {
+                    allReportNameValuePairs = value;
+                },
             });
 
-            // Then the report should be truthy for offline support
-            expect(report).toBeTruthy();
+            updateSplitTransactionsFromSplitExpensesFlow({
+                allTransactionsList: allTransactions,
+                allReportsList: allReports,
+                allReportNameValuePairsList: allReportNameValuePairs,
+                transactionData: {
+                    reportID: draftTransaction?.reportID ?? String(CONST.DEFAULT_NUMBER_ID),
+                    originalTransactionID: draftTransaction?.comment?.originalTransactionID ?? String(CONST.DEFAULT_NUMBER_ID),
+                    splitExpenses: draftTransaction?.comment?.splitExpenses ?? [],
+                    splitExpensesTotal: draftTransaction?.comment?.splitExpensesTotal,
+                },
+                searchContext: {
+                    currentSearchHash: hash,
+                },
+                policyCategories: undefined,
+                policy: undefined,
+                policyRecentlyUsedCategories: [],
+                iouReport: expenseReport,
+                firstIOU: undefined,
+                isASAPSubmitBetaEnabled: false,
+                currentUserPersonalDetails,
+                transactionViolations: {},
+                policyRecentlyUsedCurrencies: [],
+                quickAction: undefined,
+            });
 
-            // Given the resumed fetch state
-            mockFetch?.resume?.();
             await waitForBatchedUpdates();
 
-            report = await new Promise<OnyxEntry<Report>>((resolve) => {
+            // Then the split expenses/transactions should be added on the search snapshot data
+            const searchSnapshot = await new Promise<OnyxEntry<SearchResults>>((resolve) => {
                 const connection = Onyx.connect({
-                    key: `${ONYXKEYS.COLLECTION.REPORT}${iouReport?.reportID}`,
-                    waitForCollectionCallback: false,
-                    callback: (res) => {
+                    key: `${ONYXKEYS.COLLECTION.SNAPSHOT}${unapprovedCashHash}`,
+                    callback: (val) => {
                         Onyx.disconnect(connection);
-                        resolve(res);
+                        resolve(val);
                     },
                 });
             });
-
-            // Then the report should be falsy so that there is no trace of the expense.
-            expect(report).toBeFalsy();
+            expect(searchSnapshot?.data?.[`${ONYXKEYS.COLLECTION.TRANSACTION}${splitTransactionID1}`]).toBeDefined();
+            expect(searchSnapshot?.data?.[`${ONYXKEYS.COLLECTION.TRANSACTION}${splitTransactionID2}`]).toBeDefined();
         });
+    });
 
-        it('does not delete the IOU report when there are expenses left in the IOU report', async () => {
-            // Given multiple expenses on an IOU report
+    describe('payMoneyRequestElsewhere', () => {
+        it('clears outstanding IOUReport', () => {
+            const amount = 10000;
+            const comment = 'Giv money plz';
+            let chatReport: OnyxEntry<Report>;
+            let iouReport: OnyxEntry<Report>;
+            let createIOUAction: OnyxEntry<ReportAction<typeof CONST.REPORT.ACTIONS.TYPE.IOU>>;
+            let payIOUAction: OnyxEntry<ReportAction>;
+            let transaction: OnyxEntry<Transaction>;
             requestMoney({
-                report: chatReport,
+                report: {reportID: ''},
                 participantParams: {
-                    payeeEmail: TEST_USER_LOGIN,
-                    payeeAccountID: TEST_USER_ACCOUNT_ID,
-                    participant: {login: RORY_EMAIL, accountID: RORY_ACCOUNT_ID},
+                    payeeEmail: RORY_EMAIL,
+                    payeeAccountID: RORY_ACCOUNT_ID,
+                    participant: {login: CARLOS_EMAIL, accountID: CARLOS_ACCOUNT_ID},
                 },
                 transactionParams: {
                     amount,
@@ -3802,158 +3858,1213 @@ describe('actions/IOU', () => {
                 policyRecentlyUsedCurrencies: [],
                 quickAction: undefined,
             });
+            return waitForBatchedUpdates()
+                .then(
+                    () =>
+                        new Promise<void>((resolve) => {
+                            const connection = Onyx.connect({
+                                key: ONYXKEYS.COLLECTION.REPORT,
+                                waitForCollectionCallback: true,
+                                callback: (allReports) => {
+                                    Onyx.disconnect(connection);
 
-            await waitForBatchedUpdates();
+                                    expect(Object.values(allReports ?? {}).length).toBe(3);
 
-            // When we attempt to delete an expense from the IOU report
-            mockFetch?.pause?.();
-            if (transaction && createIOUAction) {
-                deleteMoneyRequest({
-                    transactionID: transaction?.transactionID,
-                    reportAction: createIOUAction,
-                    transactions: {},
-                    violations: {},
-                    iouReport,
-                    chatReport,
-                    allTransactionViolationsParam: {},
-                });
-            }
-            await waitForBatchedUpdates();
+                                    const chatReports = Object.values(allReports ?? {}).filter((report) => report?.type === CONST.REPORT.TYPE.CHAT);
+                                    chatReport = chatReports.at(0);
+                                    expect(chatReport).toBeTruthy();
+                                    expect(chatReport).toHaveProperty('reportID');
+                                    expect(chatReport).toHaveProperty('iouReportID');
 
-            // Then expect that the IOU report still exists
-            let allReports = await new Promise<OnyxCollection<Report>>((resolve) => {
-                const connection = Onyx.connect({
-                    key: ONYXKEYS.COLLECTION.REPORT,
-                    waitForCollectionCallback: true,
-                    callback: (reports) => {
-                        Onyx.disconnect(connection);
-                        resolve(reports);
-                    },
-                });
-            });
+                                    iouReport = Object.values(allReports ?? {}).find((report) => report?.type === CONST.REPORT.TYPE.IOU);
+                                    expect(iouReport).toBeTruthy();
+                                    expect(iouReport).toHaveProperty('reportID');
+                                    expect(iouReport).toHaveProperty('chatReportID');
 
-            await waitForBatchedUpdates();
+                                    expect(chatReport?.iouReportID).toBe(iouReport?.reportID);
+                                    expect(iouReport?.chatReportID).toBe(chatReport?.reportID);
 
-            iouReport = Object.values(allReports ?? {}).find((report) => isIOUReport(report));
-            expect(iouReport).toBeTruthy();
-            expect(iouReport).toHaveProperty('reportID');
-            expect(iouReport).toHaveProperty('chatReportID');
+                                    expect(chatReport?.pendingFields).toBeFalsy();
+                                    expect(iouReport?.pendingFields).toBeFalsy();
 
-            // Given the resumed fetch state
-            await mockFetch?.resume?.();
+                                    resolve();
+                                },
+                            });
+                        }),
+                )
+                .then(
+                    () =>
+                        new Promise<void>((resolve) => {
+                            const connection = Onyx.connect({
+                                key: ONYXKEYS.COLLECTION.REPORT_ACTIONS,
+                                waitForCollectionCallback: true,
+                                callback: (allReportActions) => {
+                                    Onyx.disconnect(connection);
 
-            allReports = await new Promise<OnyxCollection<Report>>((resolve) => {
-                const connection = Onyx.connect({
-                    key: ONYXKEYS.COLLECTION.REPORT,
-                    waitForCollectionCallback: true,
-                    callback: (reports) => {
-                        Onyx.disconnect(connection);
-                        resolve(reports);
-                    },
-                });
-            });
-            // Then expect that the IOU report still exists
-            iouReport = Object.values(allReports ?? {}).find((report) => isIOUReport(report));
-            expect(iouReport).toBeTruthy();
-            expect(iouReport).toHaveProperty('reportID');
-            expect(iouReport).toHaveProperty('chatReportID');
-        });
+                                    const reportActionsForIOUReport = allReportActions?.[`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${chatReport?.iouReportID}`];
 
-        it('delete the transaction thread if there are no visible comments in the thread', async () => {
-            // Given all promises are resolved
-            await waitForBatchedUpdates();
-            jest.advanceTimersByTime(10);
+                                    createIOUAction = Object.values(reportActionsForIOUReport ?? {}).find(
+                                        (reportAction): reportAction is ReportAction<typeof CONST.REPORT.ACTIONS.TYPE.IOU> => isMoneyRequestAction(reportAction),
+                                    );
+                                    expect(createIOUAction).toBeTruthy();
+                                    expect(createIOUAction && getOriginalMessage(createIOUAction)?.IOUReportID).toBe(iouReport?.reportID);
 
-            // Given a transaction thread
-            thread = buildTransactionThread(createIOUAction, iouReport);
+                                    resolve();
+                                },
+                            });
+                        }),
+                )
+                .then(
+                    () =>
+                        new Promise<void>((resolve) => {
+                            const connection = Onyx.connect({
+                                key: ONYXKEYS.COLLECTION.TRANSACTION,
+                                waitForCollectionCallback: true,
+                                callback: (allTransactions) => {
+                                    Onyx.disconnect(connection);
+                                    expect(Object.values(allTransactions ?? {}).length).toBe(1);
+                                    transaction = Object.values(allTransactions ?? {}).find((t) => t);
+                                    expect(transaction).toBeTruthy();
+                                    expect(transaction?.amount).toBe(amount);
+                                    expect(transaction?.reportID).toBe(iouReport?.reportID);
+                                    expect(createIOUAction && getOriginalMessage(createIOUAction)?.IOUTransactionID).toBe(transaction?.transactionID);
+                                    resolve();
+                                },
+                            });
+                        }),
+                )
+                .then(() => {
+                    mockFetch?.pause?.();
+                    if (chatReport && iouReport) {
+                        payMoneyRequest(CONST.IOU.PAYMENT_TYPE.ELSEWHERE, chatReport, iouReport, undefined, undefined);
+                    }
+                    return waitForBatchedUpdates();
+                })
+                .then(
+                    () =>
+                        new Promise<void>((resolve) => {
+                            const connection = Onyx.connect({
+                                key: ONYXKEYS.COLLECTION.REPORT,
+                                waitForCollectionCallback: true,
+                                callback: (allReports) => {
+                                    Onyx.disconnect(connection);
 
-            expect(thread.participants).toStrictEqual({[CARLOS_ACCOUNT_ID]: {notificationPreference: CONST.REPORT.NOTIFICATION_PREFERENCE.HIDDEN, role: CONST.REPORT.ROLE.ADMIN}});
+                                    expect(Object.values(allReports ?? {}).length).toBe(3);
 
-            Onyx.connect({
-                key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${thread.reportID}`,
-                callback: (val) => (reportActions = val),
-            });
+                                    chatReport = Object.values(allReports ?? {}).find((r) => r?.type === CONST.REPORT.TYPE.CHAT);
+                                    iouReport = Object.values(allReports ?? {}).find((r) => r?.type === CONST.REPORT.TYPE.IOU);
 
-            await waitForBatchedUpdates();
+                                    expect(chatReport?.iouReportID).toBeFalsy();
 
-            jest.advanceTimersByTime(10);
+                                    // expect(iouReport.status).toBe(CONST.REPORT.STATUS_NUM.REIMBURSED);
+                                    // expect(iouReport.stateNum).toBe(CONST.REPORT.STATE_NUM.APPROVED);
 
-            // Given User logins from the participant accounts
-            const participantAccountIDs = Object.keys(thread.participants ?? {}).map(Number);
-            const userLogins = getLoginsByAccountIDs(participantAccountIDs);
+                                    resolve();
+                                },
+                            });
+                        }),
+                )
+                .then(
+                    () =>
+                        new Promise<void>((resolve) => {
+                            const connection = Onyx.connect({
+                                key: ONYXKEYS.COLLECTION.REPORT_ACTIONS,
+                                waitForCollectionCallback: true,
+                                callback: (allReportActions) => {
+                                    Onyx.disconnect(connection);
 
-            // When Opening a thread report with the given details
-            openReport(thread.reportID, '', userLogins, thread, createIOUAction?.reportActionID);
-            await waitForBatchedUpdates();
+                                    const reportActionsForIOUReport = allReportActions?.[`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${iouReport?.reportID}`];
+                                    expect(Object.values(reportActionsForIOUReport ?? {}).length).toBe(3);
 
-            // Then The iou action has the transaction report id as a child report ID
-            const allReportActions = await new Promise<OnyxCollection<ReportActions>>((resolve) => {
-                const connection = Onyx.connect({
-                    key: ONYXKEYS.COLLECTION.REPORT_ACTIONS,
-                    waitForCollectionCallback: true,
-                    callback: (actions) => {
-                        Onyx.disconnect(connection);
-                        resolve(actions);
-                    },
-                });
-            });
-            const reportActionsForIOUReport = allReportActions?.[`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${chatReport?.iouReportID}`];
-            createIOUAction = Object.values(reportActionsForIOUReport ?? {}).find((reportAction): reportAction is ReportAction<typeof CONST.REPORT.ACTIONS.TYPE.IOU> =>
-                isMoneyRequestAction(reportAction),
-            );
-            expect(createIOUAction?.childReportID).toBe(thread.reportID);
+                                    payIOUAction = Object.values(reportActionsForIOUReport ?? {}).find(
+                                        (reportAction) => isMoneyRequestAction(reportAction) && getOriginalMessage(reportAction)?.type === CONST.IOU.REPORT_ACTION_TYPE.PAY,
+                                    );
+                                    expect(payIOUAction).toBeTruthy();
+                                    expect(payIOUAction?.pendingAction).toBe(CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD);
 
-            await waitForBatchedUpdates();
+                                    resolve();
+                                },
+                            });
+                        }),
+                )
+                .then(mockFetch?.resume)
+                .then(
+                    () =>
+                        new Promise<void>((resolve) => {
+                            const connection = Onyx.connect({
+                                key: ONYXKEYS.COLLECTION.REPORT,
+                                waitForCollectionCallback: true,
+                                callback: (allReports) => {
+                                    Onyx.disconnect(connection);
 
-            // Given Fetch is paused and timers have advanced
-            mockFetch?.pause?.();
-            jest.advanceTimersByTime(10);
+                                    expect(Object.values(allReports ?? {}).length).toBe(3);
 
-            if (transaction && createIOUAction) {
-                // When Deleting an expense
-                deleteMoneyRequest({
-                    transactionID: transaction?.transactionID,
-                    reportAction: createIOUAction,
-                    transactions: {},
-                    violations: {},
-                    iouReport,
-                    chatReport,
-                    allTransactionViolationsParam: {},
-                });
-            }
-            await waitForBatchedUpdates();
+                                    chatReport = Object.values(allReports ?? {}).find((r) => r?.type === CONST.REPORT.TYPE.CHAT);
+                                    iouReport = Object.values(allReports ?? {}).find((r) => r?.type === CONST.REPORT.TYPE.IOU);
 
-            // Then The report for the given thread ID does not exist
-            let report = await new Promise<OnyxEntry<Report>>((resolve) => {
-                const connection = Onyx.connect({
-                    key: `${ONYXKEYS.COLLECTION.REPORT}${thread.reportID}`,
-                    waitForCollectionCallback: false,
-                    callback: (reportData) => {
-                        Onyx.disconnect(connection);
-                        resolve(reportData);
-                    },
-                });
-            });
+                                    expect(chatReport?.iouReportID).toBeFalsy();
 
-            expect(report?.reportID).toBeFalsy();
-            mockFetch?.resume?.();
+                                    // expect(iouReport.status).toBe(CONST.REPORT.STATUS_NUM.REIMBURSED);
+                                    // expect(iouReport.stateNum).toBe(CONST.REPORT.STATE_NUM.APPROVED);
 
-            // Then After resuming fetch, the report for the given thread ID still does not exist
-            report = await new Promise<OnyxEntry<Report>>((resolve) => {
-                const connection = Onyx.connect({
-                    key: `${ONYXKEYS.COLLECTION.REPORT}${thread.reportID}`,
-                    waitForCollectionCallback: false,
-                    callback: (reportData) => {
-                        Onyx.disconnect(connection);
-                        resolve(reportData);
-                    },
-                });
-            });
+                                    resolve();
+                                },
+                            });
+                        }),
+                )
+                .then(
+                    () =>
+                        new Promise<void>((resolve) => {
+                            const connection = Onyx.connect({
+                                key: ONYXKEYS.COLLECTION.REPORT_ACTIONS,
+                                waitForCollectionCallback: true,
+                                callback: (allReportActions) => {
+                                    Onyx.disconnect(connection);
 
-            expect(report?.reportID).toBeFalsy();
-        });
+                                    const reportActionsForIOUReport = allReportActions?.[`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${iouReport?.reportID}`];
+                                    expect(Object.values(reportActionsForIOUReport ?? {}).length).toBe(3);
 
-        it('delete the transaction thread if there are only changelogs (i.e. MODIFIED_EXPENSE actions) in the thread', async () => {
+                                    payIOUAction = Object.values(reportActionsForIOUReport ?? {}).find(
+                                        (reportAction) => isMoneyRequestAction(reportAction) && getOriginalMessage(reportAction)?.type === CONST.IOU.REPORT_ACTION_TYPE.PAY,
+                                    );
+                                    resolve();
+
+                                    expect(payIOUAction).toBeTruthy();
+                                    expect(payIOUAction?.pendingAction).toBeFalsy();
+                                },
+                            });
+                        }),
+                );
+        });
+    });
+
+    describe('pay expense report via ACH', () => {
+        const amount = 10000;
+        const comment = '💸💸💸💸';
+        const merchant = 'NASDAQ';
+
+        afterEach(() => {
+            mockFetch?.resume?.();
+        });
+
+        it('updates the expense request and expense report when paid while offline', () => {
+            let expenseReport: OnyxEntry<Report>;
+            let chatReport: OnyxEntry<Report>;
+
+            mockFetch?.pause?.();
+            Onyx.set(ONYXKEYS.SESSION, {email: CARLOS_EMAIL, accountID: CARLOS_ACCOUNT_ID});
+            return waitForBatchedUpdates()
+                .then(() => {
+                    createWorkspace({
+                        policyOwnerEmail: CARLOS_EMAIL,
+                        makeMeAdmin: true,
+                        policyName: "Carlos's Workspace",
+                        introSelected: {choice: CONST.ONBOARDING_CHOICES.MANAGE_TEAM},
+                        currentUserAccountIDParam: CARLOS_ACCOUNT_ID,
+                        currentUserEmailParam: CARLOS_EMAIL,
+                    });
+                    return waitForBatchedUpdates();
+                })
+                .then(
+                    () =>
+                        new Promise<void>((resolve) => {
+                            const connection = Onyx.connect({
+                                key: ONYXKEYS.COLLECTION.REPORT,
+                                waitForCollectionCallback: true,
+                                callback: (allReports) => {
+                                    Onyx.disconnect(connection);
+                                    chatReport = Object.values(allReports ?? {}).find((report) => report?.chatType === CONST.REPORT.CHAT_TYPE.POLICY_EXPENSE_CHAT);
+
+                                    resolve();
+                                },
+                            });
+                        }),
+                )
+                .then(() => {
+                    if (chatReport) {
+                        requestMoney({
+                            report: chatReport,
+                            participantParams: {
+                                payeeEmail: RORY_EMAIL,
+                                payeeAccountID: RORY_ACCOUNT_ID,
+                                participant: {login: CARLOS_EMAIL, accountID: CARLOS_ACCOUNT_ID},
+                            },
+                            transactionParams: {
+                                amount,
+                                attendees: [],
+                                currency: CONST.CURRENCY.USD,
+                                created: '',
+                                merchant,
+                                comment,
+                            },
+                            shouldGenerateTransactionThreadReport: true,
+                            isASAPSubmitBetaEnabled: false,
+                            currentUserAccountIDParam: 123,
+                            currentUserEmailParam: 'existing@example.com',
+                            transactionViolations: {},
+                            policyRecentlyUsedCurrencies: [],
+                            quickAction: undefined,
+                        });
+                    }
+                    return waitForBatchedUpdates();
+                })
+                .then(
+                    () =>
+                        new Promise<void>((resolve) => {
+                            const connection = Onyx.connect({
+                                key: ONYXKEYS.COLLECTION.REPORT,
+                                waitForCollectionCallback: true,
+                                callback: (allReports) => {
+                                    Onyx.disconnect(connection);
+                                    expenseReport = Object.values(allReports ?? {}).find((report) => report?.type === CONST.REPORT.TYPE.IOU);
+
+                                    resolve();
+                                },
+                            });
+                        }),
+                )
+                .then(() => {
+                    if (chatReport && expenseReport) {
+                        payMoneyRequest(CONST.IOU.PAYMENT_TYPE.VBBA, chatReport, expenseReport, undefined, undefined);
+                    }
+                    return waitForBatchedUpdates();
+                })
+                .then(
+                    () =>
+                        new Promise<void>((resolve) => {
+                            const connection = Onyx.connect({
+                                key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${expenseReport?.reportID}`,
+                                waitForCollectionCallback: false,
+                                callback: (allActions) => {
+                                    Onyx.disconnect(connection);
+                                    expect(Object.values(allActions ?? {})).toEqual(
+                                        expect.arrayContaining([
+                                            expect.objectContaining({
+                                                message: expect.arrayContaining([
+                                                    expect.objectContaining({
+                                                        html: `paid $${amount / 100}.00 with Expensify`,
+                                                        text: `paid $${amount / 100}.00 with Expensify`,
+                                                    }),
+                                                ]),
+                                                originalMessage: expect.objectContaining({
+                                                    amount,
+                                                    paymentType: CONST.IOU.PAYMENT_TYPE.VBBA,
+                                                    type: 'pay',
+                                                }),
+                                            }),
+                                        ]),
+                                    );
+                                    resolve();
+                                },
+                            });
+                        }),
+                )
+                .then(
+                    () =>
+                        new Promise<void>((resolve) => {
+                            const connection = Onyx.connect({
+                                key: ONYXKEYS.COLLECTION.REPORT,
+                                waitForCollectionCallback: true,
+                                callback: (allReports) => {
+                                    Onyx.disconnect(connection);
+                                    const updatedIOUReport = Object.values(allReports ?? {}).find((report) => report?.type === CONST.REPORT.TYPE.IOU);
+                                    const updatedChatReport = Object.values(allReports ?? {}).find((report) => report?.reportID === expenseReport?.chatReportID);
+                                    expect(updatedIOUReport).toEqual(
+                                        expect.objectContaining({
+                                            lastMessageHtml: `paid $${amount / 100}.00 with Expensify`,
+                                            lastMessageText: `paid $${amount / 100}.00 with Expensify`,
+                                            statusNum: CONST.REPORT.STATUS_NUM.REIMBURSED,
+                                            stateNum: CONST.REPORT.STATE_NUM.APPROVED,
+                                        }),
+                                    );
+                                    expect(updatedChatReport).toEqual(
+                                        expect.objectContaining({
+                                            lastMessageHtml: `paid $${amount / 100}.00 with Expensify`,
+                                            lastMessageText: `paid $${amount / 100}.00 with Expensify`,
+                                        }),
+                                    );
+                                    resolve();
+                                },
+                            });
+                        }),
+                );
+        });
+
+        it('shows an error when paying results in an error', () => {
+            let expenseReport: OnyxEntry<Report>;
+            let chatReport: OnyxEntry<Report>;
+
+            Onyx.set(ONYXKEYS.SESSION, {email: CARLOS_EMAIL, accountID: CARLOS_ACCOUNT_ID});
+            return waitForBatchedUpdates()
+                .then(() => {
+                    createWorkspace({
+                        policyOwnerEmail: CARLOS_EMAIL,
+                        makeMeAdmin: true,
+                        policyName: "Carlos's Workspace",
+                        introSelected: {choice: CONST.ONBOARDING_CHOICES.MANAGE_TEAM},
+                        currentUserAccountIDParam: CARLOS_ACCOUNT_ID,
+                        currentUserEmailParam: CARLOS_EMAIL,
+                    });
+                    return waitForBatchedUpdates();
+                })
+                .then(
+                    () =>
+                        new Promise<void>((resolve) => {
+                            const connection = Onyx.connect({
+                                key: ONYXKEYS.COLLECTION.REPORT,
+                                waitForCollectionCallback: true,
+                                callback: (allReports) => {
+                                    Onyx.disconnect(connection);
+                                    chatReport = Object.values(allReports ?? {}).find((report) => report?.chatType === CONST.REPORT.CHAT_TYPE.POLICY_EXPENSE_CHAT);
+
+                                    resolve();
+                                },
+                            });
+                        }),
+                )
+                .then(() => {
+                    if (chatReport) {
+                        requestMoney({
+                            report: chatReport,
+                            participantParams: {
+                                payeeEmail: RORY_EMAIL,
+                                payeeAccountID: RORY_ACCOUNT_ID,
+                                participant: {login: CARLOS_EMAIL, accountID: CARLOS_ACCOUNT_ID},
+                            },
+                            transactionParams: {
+                                amount,
+                                attendees: [],
+                                currency: CONST.CURRENCY.USD,
+                                created: '',
+                                merchant,
+                                comment,
+                            },
+                            shouldGenerateTransactionThreadReport: true,
+                            isASAPSubmitBetaEnabled: false,
+                            currentUserAccountIDParam: 123,
+                            currentUserEmailParam: 'existing@example.com',
+                            transactionViolations: {},
+                            policyRecentlyUsedCurrencies: [],
+                            quickAction: undefined,
+                        });
+                    }
+                    return waitForBatchedUpdates();
+                })
+                .then(
+                    () =>
+                        new Promise<void>((resolve) => {
+                            const connection = Onyx.connect({
+                                key: ONYXKEYS.COLLECTION.REPORT,
+                                waitForCollectionCallback: true,
+                                callback: (allReports) => {
+                                    Onyx.disconnect(connection);
+                                    expenseReport = Object.values(allReports ?? {}).find((report) => report?.type === CONST.REPORT.TYPE.IOU);
+
+                                    resolve();
+                                },
+                            });
+                        }),
+                )
+                .then(() => {
+                    mockFetch?.fail?.();
+                    if (chatReport && expenseReport) {
+                        payMoneyRequest('ACH', chatReport, expenseReport, undefined, undefined);
+                    }
+                    return waitForBatchedUpdates();
+                })
+                .then(
+                    () =>
+                        new Promise<void>((resolve) => {
+                            const connection = Onyx.connect({
+                                key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${expenseReport?.reportID}`,
+                                waitForCollectionCallback: false,
+                                callback: (allActions) => {
+                                    Onyx.disconnect(connection);
+                                    const erroredAction = Object.values(allActions ?? {}).find((action) => !isEmptyObject(action?.errors));
+                                    expect(Object.values(erroredAction?.errors ?? {}).at(0)).toEqual(translateLocal('iou.error.other'));
+                                    resolve();
+                                },
+                            });
+                        }),
+                );
+        });
+    });
+
+    describe('payMoneyRequest', () => {
+        it('should apply optimistic data correctly', async () => {
+            // Given an outstanding IOU report
+            const chatReport = {
+                ...createRandomReport(0, undefined),
+                lastReadTime: DateUtils.getDBTime(),
+                lastVisibleActionCreated: DateUtils.getDBTime(),
+            };
+            const iouReport = {
+                ...createRandomReport(1, undefined),
+                chatType: undefined,
+                type: CONST.REPORT.TYPE.IOU,
+                total: 10,
+            };
+            mockFetch?.pause?.();
+
+            jest.advanceTimersByTime(10);
+
+            // When paying the IOU report
+            payMoneyRequest(CONST.IOU.PAYMENT_TYPE.ELSEWHERE, chatReport, iouReport, undefined, undefined);
+
+            await waitForBatchedUpdates();
+
+            // Then the optimistic data should be applied correctly
+            const payReportAction = await new Promise<ReportAction | undefined>((resolve) => {
+                const connection = Onyx.connect({
+                    key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${iouReport.reportID}`,
+                    callback: (reportActions) => {
+                        Onyx.disconnect(connection);
+                        resolve(Object.values(reportActions ?? {}).pop());
+                    },
+                });
+            });
+
+            await new Promise<void>((resolve) => {
+                const connection = Onyx.connect({
+                    key: `${ONYXKEYS.COLLECTION.REPORT}${chatReport.reportID}`,
+                    callback: (report) => {
+                        Onyx.disconnect(connection);
+                        expect(report?.lastVisibleActionCreated).toBe(chatReport.lastVisibleActionCreated);
+                        expect(report?.hasOutstandingChildRequest).toBe(false);
+                        expect(report?.iouReportID).toBeUndefined();
+                        expect(new Date(report?.lastReadTime ?? '').getTime()).toBeGreaterThan(new Date(chatReport?.lastReadTime ?? '').getTime());
+                        expect(report?.lastMessageText).toBe(getReportActionText(payReportAction));
+                        expect(report?.lastMessageHtml).toBe(getReportActionHtml(payReportAction));
+                        resolve();
+                    },
+                });
+            });
+
+            await new Promise<void>((resolve) => {
+                const connection = Onyx.connect({
+                    key: `${ONYXKEYS.COLLECTION.REPORT}${iouReport.reportID}`,
+                    callback: (report) => {
+                        Onyx.disconnect(connection);
+                        expect(report?.hasOutstandingChildRequest).toBe(false);
+                        expect(report?.statusNum).toBe(CONST.REPORT.STATUS_NUM.REIMBURSED);
+                        expect(report?.lastVisibleActionCreated).toBe(payReportAction?.created);
+                        expect(report?.lastMessageText).toBe(getReportActionText(payReportAction));
+                        expect(report?.lastMessageHtml).toBe(getReportActionHtml(payReportAction));
+                        expect(report?.pendingFields).toEqual({
+                            preview: CONST.RED_BRICK_ROAD_PENDING_ACTION.UPDATE,
+                            reimbursed: CONST.RED_BRICK_ROAD_PENDING_ACTION.UPDATE,
+                            nextStep: CONST.RED_BRICK_ROAD_PENDING_ACTION.UPDATE,
+                        });
+                        resolve();
+                    },
+                });
+            });
+
+            mockFetch?.resume?.();
+        });
+
+        it('calls notifyNewAction for the top most report', () => {
+            // Given two expenses in an iou report where one of them held
+            const iouReport = buildOptimisticIOUReport(1, 2, 100, '1', 'USD');
+            const transaction1 = buildOptimisticTransaction({
+                transactionParams: {
+                    amount: 100,
+                    currency: 'USD',
+                    reportID: iouReport.reportID,
+                },
+            });
+            const transaction2 = buildOptimisticTransaction({
+                transactionParams: {
+                    amount: 100,
+                    currency: 'USD',
+                    reportID: iouReport.reportID,
+                },
+            });
+            const transactionCollectionDataSet: TransactionCollectionDataSet = {
+                [`${ONYXKEYS.COLLECTION.TRANSACTION}${transaction1.transactionID}`]: transaction1,
+                [`${ONYXKEYS.COLLECTION.TRANSACTION}${transaction2.transactionID}`]: transaction2,
+            };
+            const iouActions: ReportAction[] = [];
+            for (const transaction of [transaction1, transaction2]) {
+                iouActions.push(
+                    buildOptimisticIOUReportAction({
+                        type: CONST.IOU.REPORT_ACTION_TYPE.CREATE,
+                        amount: transaction.amount,
+                        currency: transaction.currency,
+                        comment: '',
+                        participants: [],
+                        transactionID: transaction.transactionID,
+                    }),
+                );
+            }
+            const actions: OnyxInputValue<ReportActions> = {};
+            for (const iouAction of iouActions) {
+                actions[`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${iouAction.reportActionID}`] = iouAction;
+            }
+            const actionCollectionDataSet: ReportActionsCollectionDataSet = {[`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${iouReport.reportID}`]: actions};
+
+            return waitForBatchedUpdates()
+                .then(() => Onyx.multiSet({...transactionCollectionDataSet, ...actionCollectionDataSet}))
+                .then(() => {
+                    putOnHold(transaction1.transactionID, 'comment', iouReport.reportID);
+                    return waitForBatchedUpdates();
+                })
+                .then(() => {
+                    // When partially paying  an iou report from the chat report via the report preview
+                    payMoneyRequest(CONST.IOU.PAYMENT_TYPE.ELSEWHERE, {reportID: topMostReportID}, iouReport, undefined, undefined, undefined, false);
+                    return waitForBatchedUpdates();
+                })
+                .then(() => {
+                    // Then notifyNewAction should be called on the top most report.
+                    expect(notifyNewAction).toHaveBeenCalledWith(topMostReportID, expect.anything());
+                });
+        });
+
+        it('new expense report should be a draft report when paying partially and the approval is disabled', async () => {
+            const adminAccountID = 1;
+            const employeeAccountID = 3;
+            const adminEmail = 'admin@test.com';
+            const employeeEmail = 'employee@test.com';
+
+            await Onyx.set(ONYXKEYS.PERSONAL_DETAILS_LIST, {
+                [adminAccountID]: {
+                    accountID: adminAccountID,
+                    login: adminEmail,
+                    displayName: 'Admin User',
+                },
+                [employeeAccountID]: {
+                    accountID: employeeAccountID,
+                    login: employeeEmail,
+                    displayName: 'Employee User',
+                },
+            });
+
+            // Create policy with no approval required
+            const policy = {
+                id: '1',
+                name: 'Test Policy',
+                role: CONST.POLICY.ROLE.ADMIN,
+                owner: adminEmail,
+                outputCurrency: CONST.CURRENCY.USD,
+                isPolicyExpenseChatEnabled: true,
+                type: CONST.POLICY.TYPE.CORPORATE,
+                approvalMode: CONST.POLICY.APPROVAL_MODE.OPTIONAL,
+                employeeList: {
+                    [employeeEmail]: {
+                        email: employeeEmail,
+                        role: CONST.POLICY.ROLE.USER,
+                        submitsTo: adminEmail,
+                    },
+                    [adminEmail]: {
+                        email: adminEmail,
+                        role: CONST.POLICY.ROLE.ADMIN,
+                        submitsTo: '',
+                        forwardsTo: '',
+                    },
+                },
+            };
+
+            // Create expense report
+            const expenseReport = {
+                reportID: '123',
+                type: CONST.REPORT.TYPE.EXPENSE,
+                ownerAccountID: employeeAccountID,
+                managerID: adminAccountID,
+                policyID: policy.id,
+                stateNum: CONST.REPORT.STATE_NUM.APPROVED,
+                statusNum: CONST.REPORT.STATUS_NUM.CLOSED,
+                total: 1000,
+                currency: 'USD',
+                parentReportID: '456',
+                chatReportID: '456',
+            };
+
+            const chatReport = {
+                reportID: '456',
+                isOwnPolicyExpenseChat: true,
+                ownerAccountID: employeeAccountID,
+                iouReportID: expenseReport.reportID,
+                policyID: policy.id,
+                type: CONST.REPORT.TYPE.CHAT,
+                chatType: CONST.REPORT.CHAT_TYPE.POLICY_EXPENSE_CHAT,
+            };
+
+            await Onyx.set(`${ONYXKEYS.COLLECTION.POLICY}${policy.id}`, policy);
+            await Onyx.set(`${ONYXKEYS.COLLECTION.REPORT}${expenseReport.reportID}`, expenseReport);
+            await Onyx.set(`${ONYXKEYS.COLLECTION.REPORT}${chatReport.reportID}`, chatReport);
+
+            const newExpenseReportID = payMoneyRequest(CONST.IOU.PAYMENT_TYPE.ELSEWHERE, chatReport, expenseReport, undefined, undefined, undefined, false, undefined, policy);
+            await waitForBatchedUpdates();
+            const newExpenseReport = await getOnyxValue(`${ONYXKEYS.COLLECTION.REPORT}${newExpenseReportID}`);
+            expect(newExpenseReport?.stateNum).toBe(CONST.REPORT.STATE_NUM.OPEN);
+            expect(newExpenseReport?.statusNum).toBe(CONST.REPORT.STATUS_NUM.OPEN);
+        });
+    });
+
+    describe('a expense chat with a cancelled payment', () => {
+        const amount = 10000;
+        const comment = '💸💸💸💸';
+        const merchant = 'NASDAQ';
+
+        afterEach(() => {
+            mockFetch?.resume?.();
+        });
+
+        it("has an iouReportID of the cancelled payment's expense report", () => {
+            let expenseReport: OnyxEntry<Report>;
+            let chatReport: OnyxEntry<Report>;
+
+            // Given a signed in account, which owns a workspace, and has a policy expense chat
+            Onyx.set(ONYXKEYS.SESSION, {email: CARLOS_EMAIL, accountID: CARLOS_ACCOUNT_ID});
+            return waitForBatchedUpdates()
+                .then(() => {
+                    // Which owns a workspace
+                    createWorkspace({
+                        policyOwnerEmail: CARLOS_EMAIL,
+                        makeMeAdmin: true,
+                        policyName: "Carlos's Workspace",
+                        introSelected: {choice: CONST.ONBOARDING_CHOICES.MANAGE_TEAM},
+                        currentUserAccountIDParam: CARLOS_ACCOUNT_ID,
+                        currentUserEmailParam: CARLOS_EMAIL,
+                    });
+                    return waitForBatchedUpdates();
+                })
+                .then(() =>
+                    getOnyxData({
+                        key: ONYXKEYS.COLLECTION.REPORT,
+                        waitForCollectionCallback: true,
+                        callback: (allReports) => {
+                            chatReport = Object.values(allReports ?? {}).find((report) => report?.chatType === CONST.REPORT.CHAT_TYPE.POLICY_EXPENSE_CHAT);
+                        },
+                    }),
+                )
+                .then(() => {
+                    if (chatReport) {
+                        // When an IOU expense is submitted to that policy expense chat
+                        requestMoney({
+                            report: chatReport,
+                            participantParams: {
+                                payeeEmail: RORY_EMAIL,
+                                payeeAccountID: RORY_ACCOUNT_ID,
+                                participant: {login: CARLOS_EMAIL, accountID: CARLOS_ACCOUNT_ID},
+                            },
+                            transactionParams: {
+                                amount,
+                                attendees: [],
+                                currency: CONST.CURRENCY.USD,
+                                created: '',
+                                merchant,
+                                comment,
+                            },
+                            shouldGenerateTransactionThreadReport: true,
+                            isASAPSubmitBetaEnabled: false,
+                            currentUserAccountIDParam: 123,
+                            currentUserEmailParam: 'existing@example.com',
+                            transactionViolations: {},
+                            policyRecentlyUsedCurrencies: [],
+                            quickAction: undefined,
+                        });
+                    }
+                    return waitForBatchedUpdates();
+                })
+                .then(() =>
+                    // And given an expense report has now been created which holds the IOU
+                    getOnyxData({
+                        key: ONYXKEYS.COLLECTION.REPORT,
+                        waitForCollectionCallback: true,
+                        callback: (allReports) => {
+                            expenseReport = Object.values(allReports ?? {}).find((report) => report?.type === CONST.REPORT.TYPE.IOU);
+                        },
+                    }),
+                )
+                .then(() => {
+                    // When the expense report is paid elsewhere (but really, any payment option would work)
+                    if (chatReport && expenseReport) {
+                        payMoneyRequest(CONST.IOU.PAYMENT_TYPE.ELSEWHERE, chatReport, expenseReport, undefined, undefined);
+                    }
+                    return waitForBatchedUpdates();
+                })
+                .then(() => {
+                    if (chatReport && expenseReport) {
+                        // And when the payment is cancelled
+                        cancelPayment(expenseReport, chatReport, {} as Policy, true, CARLOS_ACCOUNT_ID, CARLOS_EMAIL, true);
+                    }
+                    return waitForBatchedUpdates();
+                })
+                .then(() =>
+                    getOnyxData({
+                        key: ONYXKEYS.COLLECTION.REPORT,
+                        waitForCollectionCallback: true,
+                        callback: (allReports) => {
+                            const chatReportData = allReports?.[`${ONYXKEYS.COLLECTION.REPORT}${chatReport?.reportID}`];
+                            // Then the policy expense chat report has the iouReportID of the IOU expense report
+                            expect(chatReportData?.iouReportID).toBe(expenseReport?.reportID);
+                        },
+                    }),
+                );
+        });
+    });
+
+    describe('deleteMoneyRequest', () => {
+        const amount = 10000;
+        const comment = 'Send me money please';
+        let chatReport: OnyxEntry<Report>;
+        let iouReport: OnyxEntry<Report>;
+        let createIOUAction: OnyxEntry<ReportAction<typeof CONST.REPORT.ACTIONS.TYPE.IOU>>;
+        let transaction: OnyxEntry<Transaction>;
+        let thread: OptimisticChatReport;
+        const TEST_USER_ACCOUNT_ID = 1;
+        const TEST_USER_LOGIN = 'test@test.com';
+        let IOU_REPORT_ID: string | undefined;
+        let IOU_REPORT: OnyxEntry<Report>;
+        let reportActionID;
+        const REPORT_ACTION: OnyxEntry<ReportAction> = {
+            actionName: CONST.REPORT.ACTIONS.TYPE.ADD_COMMENT,
+            actorAccountID: TEST_USER_ACCOUNT_ID,
+            automatic: false,
+            avatar: 'https://d2k5nsl2zxldvw.cloudfront.net/images/avatars/avatar_3.png',
+            message: [{type: 'COMMENT', html: 'Testing a comment', text: 'Testing a comment', translationKey: ''}],
+            person: [{type: 'TEXT', style: 'strong', text: 'Test User'}],
+            shouldShow: true,
+            created: DateUtils.getDBTime(),
+            reportActionID: '1',
+            originalMessage: {
+                html: '',
+                whisperedTo: [],
+            },
+        };
+
+        let reportActions: OnyxCollection<ReportAction>;
+
+        beforeEach(async () => {
+            // Given mocks are cleared and helpers are set up
+            jest.clearAllMocks();
+            PusherHelper.setup();
+
+            // Given a test user is signed in with Onyx setup and some initial data
+            await signInWithTestUser(TEST_USER_ACCOUNT_ID, TEST_USER_LOGIN);
+            subscribeToUserEvents();
+            await waitForBatchedUpdates();
+            await setPersonalDetails(TEST_USER_LOGIN, TEST_USER_ACCOUNT_ID);
+
+            // When a submit IOU expense is made
+            requestMoney({
+                report: chatReport,
+                participantParams: {
+                    payeeEmail: TEST_USER_LOGIN,
+                    payeeAccountID: TEST_USER_ACCOUNT_ID,
+                    participant: {login: RORY_EMAIL, accountID: RORY_ACCOUNT_ID},
+                },
+                transactionParams: {
+                    amount,
+                    attendees: [],
+                    currency: CONST.CURRENCY.USD,
+                    created: '',
+                    merchant: '',
+                    comment,
+                },
+                shouldGenerateTransactionThreadReport: true,
+                isASAPSubmitBetaEnabled: false,
+                currentUserAccountIDParam: 123,
+                currentUserEmailParam: 'existing@example.com',
+                transactionViolations: {},
+                policyRecentlyUsedCurrencies: [],
+                quickAction: undefined,
+            });
+            await waitForBatchedUpdates();
+
+            // When fetching all reports from Onyx
+            const allReports = await new Promise<OnyxCollection<Report>>((resolve) => {
+                const connection = Onyx.connect({
+                    key: ONYXKEYS.COLLECTION.REPORT,
+                    waitForCollectionCallback: true,
+                    callback: (reports) => {
+                        Onyx.disconnect(connection);
+                        resolve(reports);
+                    },
+                });
+            });
+
+            // Then we should have exactly 3 reports
+            expect(Object.values(allReports ?? {}).length).toBe(3);
+
+            // Then one of them should be a chat report with relevant properties
+            chatReport = Object.values(allReports ?? {}).find((report) => report?.type === CONST.REPORT.TYPE.CHAT);
+            expect(chatReport).toBeTruthy();
+            expect(chatReport).toHaveProperty('reportID');
+            expect(chatReport).toHaveProperty('iouReportID');
+
+            // Then one of them should be an IOU report with relevant properties
+            iouReport = Object.values(allReports ?? {}).find((report) => report?.type === CONST.REPORT.TYPE.IOU);
+            expect(iouReport).toBeTruthy();
+            expect(iouReport).toHaveProperty('reportID');
+            expect(iouReport).toHaveProperty('chatReportID');
+
+            // Then their IDs should reference each other
+            expect(chatReport?.iouReportID).toBe(iouReport?.reportID);
+            expect(iouReport?.chatReportID).toBe(chatReport?.reportID);
+
+            // Storing IOU Report ID for further reference
+            IOU_REPORT_ID = chatReport?.iouReportID;
+            IOU_REPORT = iouReport;
+
+            await waitForBatchedUpdates();
+
+            // When fetching all report actions from Onyx
+            const allReportActions = await new Promise<OnyxCollection<ReportActions>>((resolve) => {
+                const connection = Onyx.connect({
+                    key: ONYXKEYS.COLLECTION.REPORT_ACTIONS,
+                    waitForCollectionCallback: true,
+                    callback: (actions) => {
+                        Onyx.disconnect(connection);
+                        resolve(actions);
+                    },
+                });
+            });
+
+            // Then we should find an IOU action with specific properties
+            const reportActionsForIOUReport = allReportActions?.[`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${chatReport?.iouReportID}`];
+            createIOUAction = Object.values(reportActionsForIOUReport ?? {}).find((reportAction): reportAction is ReportAction<typeof CONST.REPORT.ACTIONS.TYPE.IOU> =>
+                isMoneyRequestAction(reportAction),
+            );
+            expect(createIOUAction).toBeTruthy();
+            expect(createIOUAction && getOriginalMessage(createIOUAction)?.IOUReportID).toBe(iouReport?.reportID);
+
+            // When fetching all transactions from Onyx
+            const allTransactions = await new Promise<OnyxCollection<Transaction>>((resolve) => {
+                const connection = Onyx.connect({
+                    key: ONYXKEYS.COLLECTION.TRANSACTION,
+                    waitForCollectionCallback: true,
+                    callback: (transactions) => {
+                        Onyx.disconnect(connection);
+                        resolve(transactions);
+                    },
+                });
+            });
+
+            // Then we should find a specific transaction with relevant properties
+            transaction = Object.values(allTransactions ?? {}).find((t) => t);
+            expect(transaction).toBeTruthy();
+            expect(transaction?.amount).toBe(amount);
+            expect(transaction?.reportID).toBe(iouReport?.reportID);
+            expect(createIOUAction && getOriginalMessage(createIOUAction)?.IOUTransactionID).toBe(transaction?.transactionID);
+        });
+
+        afterEach(PusherHelper.teardown);
+
+        it('delete an expense (IOU Action and transaction) successfully', async () => {
+            // Given the fetch operations are paused and an expense is initiated
+            mockFetch?.pause?.();
+
+            if (transaction && createIOUAction) {
+                // When the expense is deleted
+                deleteMoneyRequest({
+                    transactionID: transaction?.transactionID,
+                    reportAction: createIOUAction,
+                    transactions: {},
+                    violations: {},
+                    iouReport,
+                    chatReport,
+                    isChatIOUReportArchived: true,
+                });
+            }
+            await waitForBatchedUpdates();
+
+            // Then we check if the IOU report action is removed from the report actions collection
+            let reportActionsForReport = await new Promise<OnyxCollection<ReportAction>>((resolve) => {
+                const connection = Onyx.connect({
+                    key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${iouReport?.reportID}`,
+                    waitForCollectionCallback: false,
+                    callback: (actionsForReport) => {
+                        Onyx.disconnect(connection);
+                        resolve(actionsForReport);
+                    },
+                });
+            });
+
+            createIOUAction = Object.values(reportActionsForReport ?? {}).find((reportAction): reportAction is ReportAction<typeof CONST.REPORT.ACTIONS.TYPE.IOU> =>
+                isMoneyRequestAction(reportAction),
+            );
+            // Then the IOU Action should be truthy for offline support.
+            expect(createIOUAction).toBeTruthy();
+
+            // Then we check if the transaction is removed from the transactions collection
+            const t = await new Promise<OnyxEntry<Transaction>>((resolve) => {
+                const connection = Onyx.connect({
+                    key: `${ONYXKEYS.COLLECTION.TRANSACTION}${transaction?.transactionID}`,
+                    waitForCollectionCallback: false,
+                    callback: (transactionResult) => {
+                        Onyx.disconnect(connection);
+                        resolve(transactionResult);
+                    },
+                });
+            });
+
+            expect(t).toBeTruthy();
+            expect(t?.pendingAction).toBe(CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE);
+
+            // Given fetch operations are resumed
+            mockFetch?.resume?.();
+            await waitForBatchedUpdates();
+
+            // Then we recheck the IOU report action from the report actions collection
+            reportActionsForReport = await new Promise<OnyxCollection<ReportAction>>((resolve) => {
+                const connection = Onyx.connect({
+                    key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${iouReport?.reportID}`,
+                    waitForCollectionCallback: false,
+                    callback: (actionsForReport) => {
+                        Onyx.disconnect(connection);
+                        resolve(actionsForReport);
+                    },
+                });
+            });
+
+            createIOUAction = Object.values(reportActionsForReport ?? {}).find((reportAction): reportAction is ReportAction<typeof CONST.REPORT.ACTIONS.TYPE.IOU> =>
+                isMoneyRequestAction(reportAction),
+            );
+            expect(createIOUAction).toBeFalsy();
+
+            // Then we recheck the transaction from the transactions collection
+            const tr = await new Promise<OnyxEntry<Transaction>>((resolve) => {
+                const connection = Onyx.connect({
+                    key: `${ONYXKEYS.COLLECTION.TRANSACTION}${transaction?.transactionID}`,
+                    waitForCollectionCallback: false,
+                    callback: (transactionResult) => {
+                        Onyx.disconnect(connection);
+                        resolve(transactionResult);
+                    },
+                });
+            });
+
+            expect(tr).toBeFalsy();
+        });
+
+        it('delete the IOU report when there are no expenses left in the IOU report', async () => {
+            // Given an IOU report and a paused fetch state
+            mockFetch?.pause?.();
+
+            if (transaction && createIOUAction) {
+                // When the IOU expense is deleted
+                deleteMoneyRequest({
+                    transactionID: transaction?.transactionID,
+                    reportAction: createIOUAction,
+                    transactions: {},
+                    violations: {},
+                    iouReport,
+                    chatReport,
+                    isChatIOUReportArchived: true,
+                });
+            }
+            await waitForBatchedUpdates();
+
+            let report = await new Promise<OnyxEntry<Report>>((resolve) => {
+                const connection = Onyx.connect({
+                    key: `${ONYXKEYS.COLLECTION.REPORT}${iouReport?.reportID}`,
+                    waitForCollectionCallback: false,
+                    callback: (res) => {
+                        Onyx.disconnect(connection);
+                        resolve(res);
+                    },
+                });
+            });
+
+            // Then the report should be truthy for offline support
+            expect(report).toBeTruthy();
+
+            // Given the resumed fetch state
+            mockFetch?.resume?.();
+            await waitForBatchedUpdates();
+
+            report = await new Promise<OnyxEntry<Report>>((resolve) => {
+                const connection = Onyx.connect({
+                    key: `${ONYXKEYS.COLLECTION.REPORT}${iouReport?.reportID}`,
+                    waitForCollectionCallback: false,
+                    callback: (res) => {
+                        Onyx.disconnect(connection);
+                        resolve(res);
+                    },
+                });
+            });
+
+            // Then the report should be falsy so that there is no trace of the expense.
+            expect(report).toBeFalsy();
+        });
+
+        it('does not delete the IOU report when there are expenses left in the IOU report', async () => {
+            // Given multiple expenses on an IOU report
+            requestMoney({
+                report: chatReport,
+                participantParams: {
+                    payeeEmail: TEST_USER_LOGIN,
+                    payeeAccountID: TEST_USER_ACCOUNT_ID,
+                    participant: {login: RORY_EMAIL, accountID: RORY_ACCOUNT_ID},
+                },
+                transactionParams: {
+                    amount,
+                    attendees: [],
+                    currency: CONST.CURRENCY.USD,
+                    created: '',
+                    merchant: '',
+                    comment,
+                },
+                shouldGenerateTransactionThreadReport: true,
+                isASAPSubmitBetaEnabled: false,
+                currentUserAccountIDParam: 123,
+                currentUserEmailParam: 'existing@example.com',
+                transactionViolations: {},
+                policyRecentlyUsedCurrencies: [],
+                quickAction: undefined,
+            });
+
+            await waitForBatchedUpdates();
+
+            // When we attempt to delete an expense from the IOU report
+            mockFetch?.pause?.();
+            if (transaction && createIOUAction) {
+                deleteMoneyRequest({
+                    transactionID: transaction?.transactionID,
+                    reportAction: createIOUAction,
+                    transactions: {},
+                    violations: {},
+                    iouReport,
+                    chatReport,
+                });
+            }
+            await waitForBatchedUpdates();
+
+            // Then expect that the IOU report still exists
+            let allReports = await new Promise<OnyxCollection<Report>>((resolve) => {
+                const connection = Onyx.connect({
+                    key: ONYXKEYS.COLLECTION.REPORT,
+                    waitForCollectionCallback: true,
+                    callback: (reports) => {
+                        Onyx.disconnect(connection);
+                        resolve(reports);
+                    },
+                });
+            });
+
+            await waitForBatchedUpdates();
+
+            iouReport = Object.values(allReports ?? {}).find((report) => isIOUReport(report));
+            expect(iouReport).toBeTruthy();
+            expect(iouReport).toHaveProperty('reportID');
+            expect(iouReport).toHaveProperty('chatReportID');
+
+            // Given the resumed fetch state
+            await mockFetch?.resume?.();
+
+            allReports = await new Promise<OnyxCollection<Report>>((resolve) => {
+                const connection = Onyx.connect({
+                    key: ONYXKEYS.COLLECTION.REPORT,
+                    waitForCollectionCallback: true,
+                    callback: (reports) => {
+                        Onyx.disconnect(connection);
+                        resolve(reports);
+                    },
+                });
+            });
+            // Then expect that the IOU report still exists
+            iouReport = Object.values(allReports ?? {}).find((report) => isIOUReport(report));
+            expect(iouReport).toBeTruthy();
+            expect(iouReport).toHaveProperty('reportID');
+            expect(iouReport).toHaveProperty('chatReportID');
+        });
+
+        it('delete the transaction thread if there are no visible comments in the thread', async () => {
+            // Given all promises are resolved
+            await waitForBatchedUpdates();
+            jest.advanceTimersByTime(10);
+
+            // Given a transaction thread
+            thread = buildTransactionThread(createIOUAction, iouReport);
+
+            expect(thread.participants).toStrictEqual({[CARLOS_ACCOUNT_ID]: {notificationPreference: CONST.REPORT.NOTIFICATION_PREFERENCE.HIDDEN, role: CONST.REPORT.ROLE.ADMIN}});
+
+            Onyx.connect({
+                key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${thread.reportID}`,
+                callback: (val) => (reportActions = val),
+            });
+
+            await waitForBatchedUpdates();
+
+            jest.advanceTimersByTime(10);
+
+            // Given User logins from the participant accounts
+            const participantAccountIDs = Object.keys(thread.participants ?? {}).map(Number);
+            const userLogins = getLoginsByAccountIDs(participantAccountIDs);
+
+            // When Opening a thread report with the given details
+            openReport(thread.reportID, '', userLogins, thread, createIOUAction?.reportActionID);
+            await waitForBatchedUpdates();
+
+            // Then The iou action has the transaction report id as a child report ID
+            const allReportActions = await new Promise<OnyxCollection<ReportActions>>((resolve) => {
+                const connection = Onyx.connect({
+                    key: ONYXKEYS.COLLECTION.REPORT_ACTIONS,
+                    waitForCollectionCallback: true,
+                    callback: (actions) => {
+                        Onyx.disconnect(connection);
+                        resolve(actions);
+                    },
+                });
+            });
+            const reportActionsForIOUReport = allReportActions?.[`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${chatReport?.iouReportID}`];
+            createIOUAction = Object.values(reportActionsForIOUReport ?? {}).find((reportAction): reportAction is ReportAction<typeof CONST.REPORT.ACTIONS.TYPE.IOU> =>
+                isMoneyRequestAction(reportAction),
+            );
+            expect(createIOUAction?.childReportID).toBe(thread.reportID);
+
+            await waitForBatchedUpdates();
+
+            // Given Fetch is paused and timers have advanced
+            mockFetch?.pause?.();
+            jest.advanceTimersByTime(10);
+
+            if (transaction && createIOUAction) {
+                // When Deleting an expense
+                deleteMoneyRequest({
+                    transactionID: transaction?.transactionID,
+                    reportAction: createIOUAction,
+                    transactions: {},
+                    violations: {},
+                    iouReport,
+                    chatReport,
+                });
+            }
+            await waitForBatchedUpdates();
+
+            // Then The report for the given thread ID does not exist
+            let report = await new Promise<OnyxEntry<Report>>((resolve) => {
+                const connection = Onyx.connect({
+                    key: `${ONYXKEYS.COLLECTION.REPORT}${thread.reportID}`,
+                    waitForCollectionCallback: false,
+                    callback: (reportData) => {
+                        Onyx.disconnect(connection);
+                        resolve(reportData);
+                    },
+                });
+            });
+
+            expect(report?.reportID).toBeFalsy();
+            mockFetch?.resume?.();
+
+            // Then After resuming fetch, the report for the given thread ID still does not exist
+            report = await new Promise<OnyxEntry<Report>>((resolve) => {
+                const connection = Onyx.connect({
+                    key: `${ONYXKEYS.COLLECTION.REPORT}${thread.reportID}`,
+                    waitForCollectionCallback: false,
+                    callback: (reportData) => {
+                        Onyx.disconnect(connection);
+                        resolve(reportData);
+                    },
+                });
+            });
+
+            expect(report?.reportID).toBeFalsy();
+        });
+
+        it('delete the transaction thread if there are only changelogs (i.e. MODIFIED_EXPENSE actions) in the thread', async () => {
             // Given all promises are resolved
             await waitForBatchedUpdates();
             jest.advanceTimersByTime(10);
@@ -4010,7 +5121,6 @@ describe('actions/IOU', () => {
                     currency: CONST.CURRENCY.USD,
                     taxAmount: 0,
                     taxCode: '',
-                    taxValue: '',
                     policy: {
                         id: '123',
                         role: CONST.POLICY.ROLE.USER,
@@ -4026,7 +5136,6 @@ describe('actions/IOU', () => {
                     currentUserEmailParam: 'existing@example.com',
                     isASAPSubmitBetaEnabled: false,
                     policyRecentlyUsedCurrencies: [],
-                    parentReportNextStep: undefined,
                 });
             }
             await waitForBatchedUpdates();
@@ -4058,7 +5167,6 @@ describe('actions/IOU', () => {
                     violations: {},
                     iouReport,
                     chatReport,
-                    allTransactionViolationsParam: {},
                 });
             }
             await waitForBatchedUpdates();
@@ -4140,7 +5248,6 @@ describe('actions/IOU', () => {
                     violations: {},
                     iouReport,
                     chatReport,
-                    allTransactionViolationsParam: {},
                 });
             }
             await waitForBatchedUpdates();
@@ -4300,7 +5407,6 @@ describe('actions/IOU', () => {
                     iouReport,
                     chatReport,
                     isChatIOUReportArchived: undefined,
-                    allTransactionViolationsParam: {},
                 });
             }
             await waitForBatchedUpdates();
@@ -4407,7 +5513,6 @@ describe('actions/IOU', () => {
                     iouReport,
                     chatReport,
                     isChatIOUReportArchived: undefined,
-                    allTransactionViolationsParam: {},
                 });
             }
             await waitForBatchedUpdates();
@@ -4498,7 +5603,6 @@ describe('actions/IOU', () => {
                     iouReport,
                     chatReport,
                     isSingleTransactionView: true,
-                    allTransactionViolationsParam: {},
                 });
             }
 
@@ -4554,7 +5658,6 @@ describe('actions/IOU', () => {
                     violations: {},
                     iouReport,
                     chatReport,
-                    allTransactionViolationsParam: {},
                 });
             }
             // Then we expect to navigate to the chat report
@@ -4628,7 +5731,6 @@ describe('actions/IOU', () => {
                 chatReport: expenseReport,
                 transactionIDsPendingDeletion: [],
                 selectedTransactionIDs,
-                allTransactionViolationsParam: {},
             });
             deleteMoneyRequest({
                 transactionID: transaction2.transactionID,
@@ -4639,7 +5741,6 @@ describe('actions/IOU', () => {
                 chatReport: expenseReport,
                 transactionIDsPendingDeletion: [transaction1.transactionID],
                 selectedTransactionIDs,
-                allTransactionViolationsParam: {},
             });
 
             await waitForBatchedUpdates();
@@ -4660,141 +5761,6 @@ describe('actions/IOU', () => {
         });
     });
 
-    describe('deleteMoneyRequest with allTransactionViolationsParam', () => {
-        it('should pass transaction violations to hasOutstandingChildRequest correctly', async () => {
-            // Given an expense report with a transaction
-            const expenseReport: Report = {
-                ...createRandomReport(20, undefined),
-                type: CONST.REPORT.TYPE.EXPENSE,
-                total: 100,
-                currency: CONST.CURRENCY.USD,
-            };
-
-            const transaction1: Transaction = {
-                ...createRandomTransaction(20),
-                amount: 100,
-                currency: CONST.CURRENCY.USD,
-                reportID: expenseReport.reportID,
-                reimbursable: true,
-            };
-
-            const moneyRequestAction1: ReportAction<typeof CONST.REPORT.ACTIONS.TYPE.IOU> = {
-                ...createRandomReportAction(20),
-                actionName: CONST.REPORT.ACTIONS.TYPE.IOU,
-                childReportID: '20',
-                originalMessage: {
-                    IOUReportID: expenseReport.reportID,
-                    amount: transaction1.amount,
-                    currency: transaction1.currency,
-                    type: CONST.IOU.REPORT_ACTION_TYPE.CREATE,
-                },
-                message: undefined,
-                previousMessage: undefined,
-            };
-
-            // When we set up the transaction and report in Onyx
-            await Onyx.merge(`${ONYXKEYS.COLLECTION.TRANSACTION}${transaction1.transactionID}`, transaction1);
-            await Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT}${expenseReport.reportID}`, expenseReport);
-
-            // And we call deleteMoneyRequest with transaction violations
-            const transactionViolations = {
-                [`${ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS}${transaction1.transactionID}`]: [
-                    {
-                        name: CONST.VIOLATIONS.AUTO_REPORTED_REJECTED_EXPENSE,
-                        type: CONST.VIOLATION_TYPES.VIOLATION,
-                    },
-                ],
-            };
-
-            deleteMoneyRequest({
-                transactionID: transaction1.transactionID,
-                reportAction: moneyRequestAction1,
-                transactions: {},
-                violations: {},
-                iouReport: expenseReport,
-                chatReport: expenseReport,
-                allTransactionViolationsParam: transactionViolations,
-            });
-
-            await waitForBatchedUpdates();
-
-            // Then the transaction should be deleted
-            const deletedTransaction = await new Promise<OnyxEntry<Transaction>>((resolve) => {
-                const connection = Onyx.connect({
-                    key: `${ONYXKEYS.COLLECTION.TRANSACTION}${transaction1.transactionID}`,
-                    callback: (val) => {
-                        Onyx.disconnect(connection);
-                        resolve(val);
-                    },
-                });
-            });
-
-            expect(deletedTransaction).toBeUndefined();
-        });
-
-        it('should handle empty transaction violations correctly', async () => {
-            // Given an expense report with a transaction
-            const expenseReport: Report = {
-                ...createRandomReport(21, undefined),
-                type: CONST.REPORT.TYPE.EXPENSE,
-                total: 50,
-                currency: CONST.CURRENCY.USD,
-            };
-
-            const transaction1: Transaction = {
-                ...createRandomTransaction(21),
-                amount: 50,
-                currency: CONST.CURRENCY.USD,
-                reportID: expenseReport.reportID,
-                reimbursable: true,
-            };
-
-            const moneyRequestAction1: ReportAction<typeof CONST.REPORT.ACTIONS.TYPE.IOU> = {
-                ...createRandomReportAction(21),
-                actionName: CONST.REPORT.ACTIONS.TYPE.IOU,
-                childReportID: '21',
-                originalMessage: {
-                    IOUReportID: expenseReport.reportID,
-                    amount: transaction1.amount,
-                    currency: transaction1.currency,
-                    type: CONST.IOU.REPORT_ACTION_TYPE.CREATE,
-                },
-                message: undefined,
-                previousMessage: undefined,
-            };
-
-            // When we set up the transaction and report in Onyx
-            await Onyx.merge(`${ONYXKEYS.COLLECTION.TRANSACTION}${transaction1.transactionID}`, transaction1);
-            await Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT}${expenseReport.reportID}`, expenseReport);
-
-            // And we call deleteMoneyRequest with empty transaction violations
-            deleteMoneyRequest({
-                transactionID: transaction1.transactionID,
-                reportAction: moneyRequestAction1,
-                transactions: {},
-                violations: {},
-                iouReport: expenseReport,
-                chatReport: expenseReport,
-                allTransactionViolationsParam: {},
-            });
-
-            await waitForBatchedUpdates();
-
-            // Then the transaction should be deleted
-            const deletedTransaction = await new Promise<OnyxEntry<Transaction>>((resolve) => {
-                const connection = Onyx.connect({
-                    key: `${ONYXKEYS.COLLECTION.TRANSACTION}${transaction1.transactionID}`,
-                    callback: (val) => {
-                        Onyx.disconnect(connection);
-                        resolve(val);
-                    },
-                });
-            });
-
-            expect(deletedTransaction).toBeUndefined();
-        });
-    });
-
     describe('submitReport', () => {
         it('correctly submits a report', () => {
             const amount = 10000;
@@ -5695,7 +6661,6 @@ describe('actions/IOU', () => {
                 currentUserAccountIDParam: 123,
                 currentUserEmailParam: 'existing@example.com',
                 isASAPSubmitBetaEnabled: false,
-                parentReportNextStep: undefined,
             });
 
             await waitForBatchedUpdates();
@@ -5773,7 +6738,6 @@ describe('actions/IOU', () => {
                     currentUserAccountIDParam: 123,
                     currentUserEmailParam: 'existing@example.com',
                     isASAPSubmitBetaEnabled: false,
-                    parentReportNextStep: undefined,
                 });
 
                 await waitForBatchedUpdates();
@@ -5818,7 +6782,6 @@ describe('actions/IOU', () => {
                     currentUserAccountIDParam: 123,
                     currentUserEmailParam: 'existing@example.com',
                     isASAPSubmitBetaEnabled: false,
-                    parentReportNextStep: undefined,
                 });
 
                 await waitForBatchedUpdates();
@@ -5876,7 +6839,6 @@ describe('actions/IOU', () => {
                 currentUserAccountIDParam: 123,
                 currentUserEmailParam: 'existing@example.com',
                 isASAPSubmitBetaEnabled: false,
-                parentReportNextStep: undefined,
             });
 
             await waitForBatchedUpdates();
@@ -6197,7 +7159,7 @@ describe('actions/IOU', () => {
                 ...createRandomTransaction(0),
                 reportID,
                 amount: 0,
-                modifiedAmount: '',
+                modifiedAmount: 0,
                 receipt: {
                     source: 'test',
                     state: CONST.IOU.RECEIPT_STATE.SCANNING,
@@ -6209,7 +7171,7 @@ describe('actions/IOU', () => {
                 ...createRandomTransaction(1),
                 reportID,
                 amount: 0,
-                modifiedAmount: '',
+                modifiedAmount: 0,
                 receipt: {
                     source: 'test',
                     state: CONST.IOU.RECEIPT_STATE.SCANNING,
@@ -6259,7 +7221,7 @@ describe('actions/IOU', () => {
                 ...createRandomTransaction(1),
                 reportID,
                 amount: 0,
-                modifiedAmount: '',
+                modifiedAmount: 0,
                 receipt: {
                     source: 'test',
                     state: CONST.IOU.RECEIPT_STATE.SCANNING,
@@ -6554,7 +7516,7 @@ describe('actions/IOU', () => {
             reportID: fakeReport.reportID,
             transactionID: CONST.IOU.OPTIMISTIC_TRANSACTION_ID,
             isFromGlobalCreate: true,
-            merchant: 'Expense',
+            merchant: '(none)',
         };
 
         const currentDate = '2025-04-01';
@@ -6607,7 +7569,6 @@ describe('actions/IOU', () => {
                 .then(async () => {
                     expect(await getOnyxValue(`${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${CONST.IOU.OPTIMISTIC_TRANSACTION_ID}`)).toStrictEqual({
                         ...transactionResult,
-                        merchant: CONST.TRANSACTION.PARTIAL_TRANSACTION_MERCHANT,
                         iouRequestType: CONST.IOU.REQUEST_TYPE.SCAN,
                     });
                 });
@@ -6667,7 +7628,6 @@ describe('actions/IOU', () => {
                 currency: CONST.CURRENCY.USD,
                 taxAmount: 0,
                 taxCode: '',
-                taxValue: '',
                 policy: {
                     id: '123',
                     role: CONST.POLICY.ROLE.USER,
@@ -6685,7 +7645,6 @@ describe('actions/IOU', () => {
                 currentUserEmailParam: 'existing@example.com',
                 isASAPSubmitBetaEnabled: false,
                 policyRecentlyUsedCurrencies: initialCurrencies,
-                parentReportNextStep: undefined,
             });
 
             await waitForBatchedUpdates();
@@ -6737,7 +7696,6 @@ describe('actions/IOU', () => {
                 currency: CONST.CURRENCY.USD,
                 taxAmount: 0,
                 taxCode: '',
-                taxValue: '',
                 policy: {
                     id: '123',
                     role: CONST.POLICY.ROLE.USER,
@@ -6755,7 +7713,6 @@ describe('actions/IOU', () => {
                 currentUserEmailParam: 'existing@example.com',
                 isASAPSubmitBetaEnabled: false,
                 policyRecentlyUsedCurrencies: [],
-                parentReportNextStep: undefined,
             });
 
             await waitForBatchedUpdates();
@@ -6773,7 +7730,7 @@ describe('actions/IOU', () => {
                     },
                 });
             });
-            expect(updatedTransaction?.modifiedAmount).toBe('');
+            expect(updatedTransaction?.modifiedAmount).toBe(0);
         });
     });
 
@@ -6836,7 +7793,6 @@ describe('actions/IOU', () => {
                 currency: CONST.CURRENCY.USD,
                 taxAmount: 0,
                 taxCode: '',
-                taxValue: '',
                 policy,
                 policyTagList: {},
                 policyCategories: {},
@@ -6846,7 +7802,6 @@ describe('actions/IOU', () => {
                 currentUserEmailParam: 'existing@example.com',
                 isASAPSubmitBetaEnabled: false,
                 policyRecentlyUsedCurrencies: [],
-                parentReportNextStep: undefined,
             });
 
             await waitForBatchedUpdates();
@@ -7309,59 +8264,178 @@ describe('actions/IOU', () => {
             expect(splitExpenses?.[1].category).toBe('Food');
             expect(splitExpenses?.[1].tags).toEqual(['lunch']);
 
-            // Verify: The existing split should still have reimbursable: false
-            expect(splitExpenses?.[0].reimbursable).toBe(false);
+            // Verify: The existing split should still have reimbursable: false
+            expect(splitExpenses?.[0].reimbursable).toBe(false);
+        });
+    });
+
+    describe('evenlyDistributeSplitExpenseAmounts', () => {
+        it('distributes evenly across 3 splits with remainder on last split', async () => {
+            const originalTransactionID = 'orig-last';
+            const draftTransaction: Transaction = {
+                transactionID: 'draft-2',
+                amount: 100, // in cents = $1.00
+                currency: 'USD',
+                merchant: 'Test Merchant',
+                comment: {
+                    comment: 'Test comment',
+                    originalTransactionID,
+                    splitExpenses: [
+                        {transactionID: 'x', amount: 0, description: 'X', created: DateUtils.getDBTime()},
+                        {transactionID: 'y', amount: 0, description: 'Y', created: DateUtils.getDBTime()},
+                        {transactionID: 'z', amount: 0, description: 'Z', created: DateUtils.getDBTime()},
+                    ],
+                    attendees: [],
+                    type: CONST.TRANSACTION.TYPE.CUSTOM_UNIT,
+                },
+                created: DateUtils.getDBTime(),
+                reportID: 'rep-2',
+            };
+
+            evenlyDistributeSplitExpenseAmounts(draftTransaction);
+            await waitForBatchedUpdates();
+
+            const updatedDraft = await getOnyxValue(`${ONYXKEYS.COLLECTION.SPLIT_TRANSACTION_DRAFT}${originalTransactionID}`);
+            expect(updatedDraft).toBeTruthy();
+            const amounts = (updatedDraft?.comment?.splitExpenses ?? []).map((x) => x.amount);
+            expect(amounts).toEqual([33, 33, 34]);
+        });
+
+        it('assigns full amount when there is only one split', async () => {
+            const originalTransactionID = 'orig-single';
+            const draftTransaction: Transaction = {
+                transactionID: 'draft-3',
+                amount: 1000, // in cents = $10.00
+                currency: 'USD',
+                merchant: 'Test Merchant',
+                comment: {
+                    comment: 'Test comment',
+                    originalTransactionID,
+                    splitExpenses: [{transactionID: 'only', amount: 0, description: 'Only', created: DateUtils.getDBTime()}],
+                    attendees: [],
+                    type: CONST.TRANSACTION.TYPE.CUSTOM_UNIT,
+                },
+                created: DateUtils.getDBTime(),
+                reportID: 'rep-3',
+            };
+
+            evenlyDistributeSplitExpenseAmounts(draftTransaction);
+            await waitForBatchedUpdates();
+
+            const updatedDraft = await getOnyxValue(`${ONYXKEYS.COLLECTION.SPLIT_TRANSACTION_DRAFT}${originalTransactionID}`);
+            const amounts = (updatedDraft?.comment?.splitExpenses ?? []).map((x) => x.amount);
+            expect(amounts).toEqual([1000]);
+        });
+
+        it('evenly distributes equal split with no remainder (4-way $1.00 -> 25¢ each)', async () => {
+            const originalTransactionID = 'orig-equal-4';
+            const draftTransaction: Transaction = {
+                transactionID: 'draft-4',
+                amount: 100, // in cents = $1.00
+                currency: 'USD',
+                merchant: 'Test Merchant',
+                comment: {
+                    comment: 'Test comment',
+                    originalTransactionID,
+                    splitExpenses: [
+                        {transactionID: '1', amount: 0, description: '1', created: DateUtils.getDBTime()},
+                        {transactionID: '2', amount: 0, description: '2', created: DateUtils.getDBTime()},
+                        {transactionID: '3', amount: 0, description: '3', created: DateUtils.getDBTime()},
+                        {transactionID: '4', amount: 0, description: '4', created: DateUtils.getDBTime()},
+                    ],
+                    attendees: [],
+                    type: CONST.TRANSACTION.TYPE.CUSTOM_UNIT,
+                },
+                created: DateUtils.getDBTime(),
+                reportID: 'rep-4',
+            };
+
+            evenlyDistributeSplitExpenseAmounts(draftTransaction);
+            await waitForBatchedUpdates();
+
+            const updatedDraft = await getOnyxValue(`${ONYXKEYS.COLLECTION.SPLIT_TRANSACTION_DRAFT}${originalTransactionID}`);
+            const amounts = (updatedDraft?.comment?.splitExpenses ?? []).map((x) => x.amount);
+            expect(amounts).toEqual([25, 25, 25, 25]);
+        });
+
+        it('2-way split equal (even cents) -> 50¢ / 50¢', async () => {
+            const originalTransactionID = 'orig-2-equal';
+            const draftTransaction: Transaction = {
+                transactionID: 'draft-5',
+                amount: 100, // in cents = $1.00
+                currency: 'USD',
+                merchant: 'Test Merchant',
+                comment: {
+                    comment: 'Test comment',
+                    originalTransactionID,
+                    splitExpenses: [
+                        {transactionID: 'a', amount: 0, description: 'A', created: DateUtils.getDBTime()},
+                        {transactionID: 'b', amount: 0, description: 'B', created: DateUtils.getDBTime()},
+                    ],
+                    attendees: [],
+                    type: CONST.TRANSACTION.TYPE.CUSTOM_UNIT,
+                },
+                created: DateUtils.getDBTime(),
+                reportID: 'rep-5',
+            };
+
+            evenlyDistributeSplitExpenseAmounts(draftTransaction);
+            await waitForBatchedUpdates();
+
+            const updatedDraft = await getOnyxValue(`${ONYXKEYS.COLLECTION.SPLIT_TRANSACTION_DRAFT}${originalTransactionID}`);
+            const amounts = (updatedDraft?.comment?.splitExpenses ?? []).map((x) => x.amount);
+            expect(amounts).toEqual([50, 50]);
         });
-    });
 
-    describe('evenlyDistributeSplitExpenseAmounts', () => {
-        it('distributes evenly across 3 splits with remainder on last split', async () => {
-            const originalTransactionID = 'orig-last';
+        it('2-way split with remainder (odd cents) -> 50¢ / 51¢', async () => {
+            const originalTransactionID = 'orig-2-rem';
             const draftTransaction: Transaction = {
-                transactionID: 'draft-2',
-                amount: 100, // in cents = $1.00
+                transactionID: 'draft-6',
+                amount: 101, // in cents = $1.01
                 currency: 'USD',
                 merchant: 'Test Merchant',
                 comment: {
                     comment: 'Test comment',
                     originalTransactionID,
                     splitExpenses: [
-                        {transactionID: 'x', amount: 0, description: 'X', created: DateUtils.getDBTime()},
-                        {transactionID: 'y', amount: 0, description: 'Y', created: DateUtils.getDBTime()},
-                        {transactionID: 'z', amount: 0, description: 'Z', created: DateUtils.getDBTime()},
+                        {transactionID: 'a', amount: 0, description: 'A', created: DateUtils.getDBTime()},
+                        {transactionID: 'b', amount: 0, description: 'B', created: DateUtils.getDBTime()},
                     ],
                     attendees: [],
                     type: CONST.TRANSACTION.TYPE.CUSTOM_UNIT,
                 },
                 created: DateUtils.getDBTime(),
-                reportID: 'rep-2',
+                reportID: 'rep-6',
             };
 
             evenlyDistributeSplitExpenseAmounts(draftTransaction);
             await waitForBatchedUpdates();
 
             const updatedDraft = await getOnyxValue(`${ONYXKEYS.COLLECTION.SPLIT_TRANSACTION_DRAFT}${originalTransactionID}`);
-            expect(updatedDraft).toBeTruthy();
             const amounts = (updatedDraft?.comment?.splitExpenses ?? []).map((x) => x.amount);
-            expect(amounts).toEqual([33, 33, 34]);
+            expect(amounts).toEqual([50, 51]);
         });
 
-        it('assigns full amount when there is only one split', async () => {
-            const originalTransactionID = 'orig-single';
+        it('3-way split of $1001 with remainder -> [$333.66, $333.66, $333.68]', async () => {
+            const originalTransactionID = 'orig-1001-3-last';
             const draftTransaction: Transaction = {
-                transactionID: 'draft-3',
-                amount: 1000, // in cents = $10.00
+                transactionID: 'draft-7',
+                amount: 100100, // in cents = $1001.00
                 currency: 'USD',
                 merchant: 'Test Merchant',
                 comment: {
                     comment: 'Test comment',
                     originalTransactionID,
-                    splitExpenses: [{transactionID: 'only', amount: 0, description: 'Only', created: DateUtils.getDBTime()}],
+                    splitExpenses: [
+                        {transactionID: 'p', amount: 0, description: 'P', created: DateUtils.getDBTime()},
+                        {transactionID: 'q', amount: 0, description: 'Q', created: DateUtils.getDBTime()},
+                        {transactionID: 'r', amount: 0, description: 'R', created: DateUtils.getDBTime()},
+                    ],
                     attendees: [],
                     type: CONST.TRANSACTION.TYPE.CUSTOM_UNIT,
                 },
                 created: DateUtils.getDBTime(),
-                reportID: 'rep-3',
+                reportID: 'rep-7',
             };
 
             evenlyDistributeSplitExpenseAmounts(draftTransaction);
@@ -7369,30 +8443,30 @@ describe('actions/IOU', () => {
 
             const updatedDraft = await getOnyxValue(`${ONYXKEYS.COLLECTION.SPLIT_TRANSACTION_DRAFT}${originalTransactionID}`);
             const amounts = (updatedDraft?.comment?.splitExpenses ?? []).map((x) => x.amount);
-            expect(amounts).toEqual([1000]);
+            expect(amounts).toEqual([33366, 33366, 33368]);
+            expect(amounts.reduce((a, b) => a + b, 0)).toBe(100100);
         });
 
-        it('evenly distributes equal split with no remainder (4-way $1.00 -> 25¢ each)', async () => {
-            const originalTransactionID = 'orig-equal-4';
+        it('preserves negative sign and evenly distributes with remainder on last for 3-way split', async () => {
+            const originalTransactionID = 'orig-neg-3';
             const draftTransaction: Transaction = {
-                transactionID: 'draft-4',
-                amount: 100, // in cents = $1.00
+                transactionID: 'draft-neg-3',
+                amount: -100, // in cents = -$1.00
                 currency: 'USD',
                 merchant: 'Test Merchant',
                 comment: {
-                    comment: 'Test comment',
+                    comment: 'Negative amount test',
                     originalTransactionID,
                     splitExpenses: [
-                        {transactionID: '1', amount: 0, description: '1', created: DateUtils.getDBTime()},
-                        {transactionID: '2', amount: 0, description: '2', created: DateUtils.getDBTime()},
-                        {transactionID: '3', amount: 0, description: '3', created: DateUtils.getDBTime()},
-                        {transactionID: '4', amount: 0, description: '4', created: DateUtils.getDBTime()},
+                        {transactionID: 'n1', amount: 0, description: 'N1', created: DateUtils.getDBTime()},
+                        {transactionID: 'n2', amount: 0, description: 'N2', created: DateUtils.getDBTime()},
+                        {transactionID: 'n3', amount: 0, description: 'N3', created: DateUtils.getDBTime()},
                     ],
                     attendees: [],
                     type: CONST.TRANSACTION.TYPE.CUSTOM_UNIT,
                 },
                 created: DateUtils.getDBTime(),
-                reportID: 'rep-4',
+                reportID: 'rep-neg-3',
             };
 
             evenlyDistributeSplitExpenseAmounts(draftTransaction);
@@ -7400,28 +8474,29 @@ describe('actions/IOU', () => {
 
             const updatedDraft = await getOnyxValue(`${ONYXKEYS.COLLECTION.SPLIT_TRANSACTION_DRAFT}${originalTransactionID}`);
             const amounts = (updatedDraft?.comment?.splitExpenses ?? []).map((x) => x.amount);
-            expect(amounts).toEqual([25, 25, 25, 25]);
+            expect(amounts).toEqual([-33, -33, -34]);
+            expect(amounts.reduce((a, b) => a + b, 0)).toBe(-100);
         });
 
-        it('2-way split equal (even cents) -> 50¢ / 50¢', async () => {
-            const originalTransactionID = 'orig-2-equal';
+        it('preserves negative sign for 2-way odd-cent split -> [-$0.51, -$0.50]', async () => {
+            const originalTransactionID = 'orig-neg-2';
             const draftTransaction: Transaction = {
-                transactionID: 'draft-5',
-                amount: 100, // in cents = $1.00
+                transactionID: 'draft-neg-2',
+                amount: -101, // in cents = -$1.01
                 currency: 'USD',
                 merchant: 'Test Merchant',
                 comment: {
-                    comment: 'Test comment',
+                    comment: 'Negative amount test 2-way',
                     originalTransactionID,
                     splitExpenses: [
-                        {transactionID: 'a', amount: 0, description: 'A', created: DateUtils.getDBTime()},
-                        {transactionID: 'b', amount: 0, description: 'B', created: DateUtils.getDBTime()},
+                        {transactionID: 'nA', amount: 0, description: 'NA', created: DateUtils.getDBTime()},
+                        {transactionID: 'nB', amount: 0, description: 'NB', created: DateUtils.getDBTime()},
                     ],
                     attendees: [],
                     type: CONST.TRANSACTION.TYPE.CUSTOM_UNIT,
                 },
                 created: DateUtils.getDBTime(),
-                reportID: 'rep-5',
+                reportID: 'rep-neg-2',
             };
 
             evenlyDistributeSplitExpenseAmounts(draftTransaction);
@@ -7429,446 +8504,1060 @@ describe('actions/IOU', () => {
 
             const updatedDraft = await getOnyxValue(`${ONYXKEYS.COLLECTION.SPLIT_TRANSACTION_DRAFT}${originalTransactionID}`);
             const amounts = (updatedDraft?.comment?.splitExpenses ?? []).map((x) => x.amount);
-            expect(amounts).toEqual([50, 50]);
+            expect(amounts).toEqual([-50, -51]);
+            expect(amounts.reduce((a, b) => a + b, 0)).toBe(-101);
         });
+    });
 
-        it('2-way split with remainder (odd cents) -> 50¢ / 51¢', async () => {
-            const originalTransactionID = 'orig-2-rem';
+    describe('updateSplitExpenseAmountField', () => {
+        it('should update amount expense field to draft transaction', async () => {
+            const originalTransactionID = '123';
+            const currentTransactionID = '789';
             const draftTransaction: Transaction = {
-                transactionID: 'draft-6',
-                amount: 101, // in cents = $1.01
+                transactionID: '234',
+                amount: 100,
                 currency: 'USD',
                 merchant: 'Test Merchant',
                 comment: {
                     comment: 'Test comment',
                     originalTransactionID,
                     splitExpenses: [
-                        {transactionID: 'a', amount: 0, description: 'A', created: DateUtils.getDBTime()},
-                        {transactionID: 'b', amount: 0, description: 'B', created: DateUtils.getDBTime()},
+                        {
+                            transactionID: currentTransactionID,
+                            amount: 50,
+                            description: 'Test comment',
+                            category: 'Food',
+                            tags: ['lunch'],
+                            created: DateUtils.getDBTime(),
+                        },
                     ],
                     attendees: [],
                     type: CONST.TRANSACTION.TYPE.CUSTOM_UNIT,
                 },
+                category: 'Food',
+                tag: 'lunch',
                 created: DateUtils.getDBTime(),
-                reportID: 'rep-6',
+                reportID: '456',
+            };
+
+            updateSplitExpenseAmountField(draftTransaction, currentTransactionID, 20);
+            await waitForBatchedUpdates();
+
+            const updatedDraftTransaction = await getOnyxValue(`${ONYXKEYS.COLLECTION.SPLIT_TRANSACTION_DRAFT}${originalTransactionID}`);
+            expect(updatedDraftTransaction).toBeTruthy();
+
+            const splitExpenses = updatedDraftTransaction?.comment?.splitExpenses;
+            expect(splitExpenses?.[0].amount).toBe(20);
+        });
+    });
+
+    describe('replaceReceipt', () => {
+        it('should replace the receipt of the transaction', async () => {
+            const transactionID = '123';
+            const file = new File([new Blob(['test'])], 'test.jpg', {type: 'image/jpeg'});
+            file.source = 'test';
+            const source = 'test';
+
+            const transaction = {
+                transactionID,
+                receipt: {
+                    source: 'test1',
+                },
+            };
+
+            // Given a transaction with a receipt
+            await Onyx.set(`${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`, transaction);
+            await waitForBatchedUpdates();
+
+            // Given a snapshot of the transaction
+            await Onyx.set(`${ONYXKEYS.COLLECTION.SNAPSHOT}${unapprovedCashHash}`, {
+                // @ts-expect-error: Allow partial record in snapshot update
+                data: {
+                    [`${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`]: transaction,
+                },
+            });
+            await waitForBatchedUpdates();
+
+            // When the receipt is replaced
+            replaceReceipt({transactionID, file, source, transactionPolicy: undefined});
+            await waitForBatchedUpdates();
+
+            // Then the transaction should have the new receipt source
+            const updatedTransaction = await new Promise<OnyxEntry<Transaction>>((resolve) => {
+                const connection = Onyx.connect({
+                    key: ONYXKEYS.COLLECTION.TRANSACTION,
+                    waitForCollectionCallback: true,
+                    callback: (transactions) => {
+                        Onyx.disconnect(connection);
+                        const newTransaction = transactions[`${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`];
+                        resolve(newTransaction);
+                    },
+                });
+            });
+            expect(updatedTransaction?.receipt?.source).toBe(source);
+
+            // Then the snapshot should have the new receipt source
+            const updatedSnapshot = await new Promise<OnyxEntry<SearchResults>>((resolve) => {
+                const connection = Onyx.connect({
+                    key: ONYXKEYS.COLLECTION.SNAPSHOT,
+                    waitForCollectionCallback: true,
+                    callback: (snapshots) => {
+                        Onyx.disconnect(connection);
+                        const newSnapshot = snapshots[`${ONYXKEYS.COLLECTION.SNAPSHOT}${unapprovedCashHash}`];
+                        resolve(newSnapshot);
+                    },
+                });
+            });
+
+            expect(updatedSnapshot?.data?.[`${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`]?.receipt?.source).toBe(source);
+        });
+
+        it('should add receipt if it does not exist', async () => {
+            const transactionID = '123';
+            const file = new File([new Blob(['test'])], 'test.jpg', {type: 'image/jpeg'});
+            file.source = 'test';
+            const source = 'test';
+
+            const transaction = {
+                transactionID,
+            };
+
+            // Given a transaction without a receipt
+            await Onyx.set(`${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`, transaction);
+            await waitForBatchedUpdates();
+
+            // Given a snapshot of the transaction
+            await Onyx.set(`${ONYXKEYS.COLLECTION.SNAPSHOT}${unapprovedCashHash}`, {
+                // @ts-expect-error: Allow partial record in snapshot update
+                data: {
+                    [`${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`]: transaction,
+                },
+            });
+            await waitForBatchedUpdates();
+
+            // When the receipt is replaced
+            replaceReceipt({transactionID, file, source, transactionPolicy: undefined});
+            await waitForBatchedUpdates();
+
+            // Then the transaction should have the new receipt source
+            const updatedTransaction = await new Promise<OnyxEntry<Transaction>>((resolve) => {
+                const connection = Onyx.connect({
+                    key: ONYXKEYS.COLLECTION.TRANSACTION,
+                    waitForCollectionCallback: true,
+                    callback: (transactions) => {
+                        Onyx.disconnect(connection);
+                        const newTransaction = transactions[`${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`];
+                        resolve(newTransaction);
+                    },
+                });
+            });
+            expect(updatedTransaction?.receipt?.source).toBe(source);
+
+            // Then the snapshot should have the new receipt source
+            const updatedSnapshot = await new Promise<OnyxEntry<SearchResults>>((resolve) => {
+                const connection = Onyx.connect({
+                    key: ONYXKEYS.COLLECTION.SNAPSHOT,
+                    waitForCollectionCallback: true,
+                    callback: (snapshots) => {
+                        Onyx.disconnect(connection);
+                        const newSnapshot = snapshots[`${ONYXKEYS.COLLECTION.SNAPSHOT}${unapprovedCashHash}`];
+                        resolve(newSnapshot);
+                    },
+                });
+            });
+
+            expect(updatedSnapshot?.data?.[`${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`]?.receipt?.source).toBe(source);
+        });
+    });
+
+    describe('changeTransactionsReport', () => {
+        it('should set the correct optimistic onyx data for reporting a tracked expense', async () => {
+            let personalDetailsList: OnyxEntry<PersonalDetailsList>;
+            let expenseReport: OnyxEntry<Report>;
+            let transaction: OnyxEntry<Transaction>;
+            let allTransactions: OnyxCollection<Transaction> = {};
+
+            // Given a signed in account, which owns a workspace, and has a policy expense chat
+            Onyx.set(ONYXKEYS.SESSION, {email: CARLOS_EMAIL, accountID: CARLOS_ACCOUNT_ID});
+            const creatorPersonalDetails = personalDetailsList?.[CARLOS_ACCOUNT_ID] ?? {accountID: CARLOS_ACCOUNT_ID};
+
+            const policyID = generatePolicyID();
+            const mockPolicy: Policy = {
+                ...createRandomPolicy(1, CONST.POLICY.TYPE.TEAM, "Carlos's Workspace"),
+                id: policyID,
+                outputCurrency: CONST.CURRENCY.USD,
+                owner: CARLOS_EMAIL,
+                ownerAccountID: CARLOS_ACCOUNT_ID,
+                pendingAction: undefined,
             };
 
-            evenlyDistributeSplitExpenseAmounts(draftTransaction);
             await waitForBatchedUpdates();
 
-            const updatedDraft = await getOnyxValue(`${ONYXKEYS.COLLECTION.SPLIT_TRANSACTION_DRAFT}${originalTransactionID}`);
-            const amounts = (updatedDraft?.comment?.splitExpenses ?? []).map((x) => x.amount);
-            expect(amounts).toEqual([50, 51]);
-        });
+            createNewReport(creatorPersonalDetails, true, false, mockPolicy);
+            // Create a tracked expense
+            const selfDMReport: Report = {
+                ...createRandomReport(1, CONST.REPORT.CHAT_TYPE.SELF_DM),
+                reportID: '10',
+            };
 
-        it('3-way split of $1001 with remainder -> [$333.66, $333.66, $333.68]', async () => {
-            const originalTransactionID = 'orig-1001-3-last';
-            const draftTransaction: Transaction = {
-                transactionID: 'draft-7',
-                amount: 100100, // in cents = $1001.00
-                currency: 'USD',
-                merchant: 'Test Merchant',
-                comment: {
-                    comment: 'Test comment',
-                    originalTransactionID,
-                    splitExpenses: [
-                        {transactionID: 'p', amount: 0, description: 'P', created: DateUtils.getDBTime()},
-                        {transactionID: 'q', amount: 0, description: 'Q', created: DateUtils.getDBTime()},
-                        {transactionID: 'r', amount: 0, description: 'R', created: DateUtils.getDBTime()},
-                    ],
-                    attendees: [],
-                    type: CONST.TRANSACTION.TYPE.CUSTOM_UNIT,
+            const amount = 100;
+
+            trackExpense({
+                report: selfDMReport,
+                isDraftPolicy: true,
+                action: CONST.IOU.ACTION.CREATE,
+                participantParams: {
+                    payeeEmail: RORY_EMAIL,
+                    payeeAccountID: RORY_ACCOUNT_ID,
+                    participant: {accountID: RORY_ACCOUNT_ID},
                 },
-                created: DateUtils.getDBTime(),
-                reportID: 'rep-7',
-            };
+                transactionParams: {
+                    amount,
+                    currency: CONST.CURRENCY.USD,
+                    created: format(new Date(), CONST.DATE.FNS_FORMAT_STRING),
+                    merchant: 'merchant',
+                    billable: false,
+                    reimbursable: false,
+                },
+                isASAPSubmitBetaEnabled: false,
+                currentUserAccountIDParam: RORY_ACCOUNT_ID,
+                currentUserEmailParam: RORY_EMAIL,
+                introSelected: undefined,
+                activePolicyID: undefined,
+                quickAction: undefined,
+            });
+            await getOnyxData({
+                key: ONYXKEYS.COLLECTION.TRANSACTION,
+                waitForCollectionCallback: true,
+                callback: (transactions) => {
+                    transaction = Object.values(transactions ?? {}).find((t) => !!t);
+                    allTransactions = transactions;
+                },
+            });
 
-            evenlyDistributeSplitExpenseAmounts(draftTransaction);
-            await waitForBatchedUpdates();
+            await getOnyxData({
+                key: ONYXKEYS.COLLECTION.REPORT,
+                waitForCollectionCallback: true,
+                callback: (allReports) => {
+                    expenseReport = Object.values(allReports ?? {}).find((r) => r?.type === CONST.REPORT.TYPE.EXPENSE);
+                },
+            });
 
-            const updatedDraft = await getOnyxValue(`${ONYXKEYS.COLLECTION.SPLIT_TRANSACTION_DRAFT}${originalTransactionID}`);
-            const amounts = (updatedDraft?.comment?.splitExpenses ?? []).map((x) => x.amount);
-            expect(amounts).toEqual([33366, 33366, 33368]);
-            expect(amounts.reduce((a, b) => a + b, 0)).toBe(100100);
-        });
+            let iouReportActionOnSelfDMReport: OnyxEntry<ReportAction>;
+            let trackExpenseActionableWhisper: OnyxEntry<ReportAction>;
 
-        it('preserves negative sign and evenly distributes with remainder on last for 3-way split', async () => {
-            const originalTransactionID = 'orig-neg-3';
-            const draftTransaction: Transaction = {
-                transactionID: 'draft-neg-3',
-                amount: -100, // in cents = -$1.00
-                currency: 'USD',
-                merchant: 'Test Merchant',
-                comment: {
-                    comment: 'Negative amount test',
-                    originalTransactionID,
-                    splitExpenses: [
-                        {transactionID: 'n1', amount: 0, description: 'N1', created: DateUtils.getDBTime()},
-                        {transactionID: 'n2', amount: 0, description: 'N2', created: DateUtils.getDBTime()},
-                        {transactionID: 'n3', amount: 0, description: 'N3', created: DateUtils.getDBTime()},
-                    ],
-                    attendees: [],
-                    type: CONST.TRANSACTION.TYPE.CUSTOM_UNIT,
+            await getOnyxData({
+                key: ONYXKEYS.COLLECTION.REPORT_ACTIONS,
+                waitForCollectionCallback: true,
+                callback: (allReportActions) => {
+                    iouReportActionOnSelfDMReport = Object.values(allReportActions?.[`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${selfDMReport.reportID}`] ?? {}).find(
+                        (r) => r?.actionName === CONST.REPORT.ACTIONS.TYPE.IOU,
+                    );
+                    trackExpenseActionableWhisper = Object.values(allReportActions?.[`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${selfDMReport?.reportID}`] ?? {}).find(
+                        (r) => r?.actionName === CONST.REPORT.ACTIONS.TYPE.ACTIONABLE_TRACK_EXPENSE_WHISPER,
+                    );
                 },
-                created: DateUtils.getDBTime(),
-                reportID: 'rep-neg-3',
-            };
+            });
 
-            evenlyDistributeSplitExpenseAmounts(draftTransaction);
-            await waitForBatchedUpdates();
+            expect(isMoneyRequestAction(iouReportActionOnSelfDMReport) ? getOriginalMessage(iouReportActionOnSelfDMReport)?.IOUTransactionID : undefined).toBe(transaction?.transactionID);
+            expect(trackExpenseActionableWhisper).toBeDefined();
 
-            const updatedDraft = await getOnyxValue(`${ONYXKEYS.COLLECTION.SPLIT_TRANSACTION_DRAFT}${originalTransactionID}`);
-            const amounts = (updatedDraft?.comment?.splitExpenses ?? []).map((x) => x.amount);
-            expect(amounts).toEqual([-33, -33, -34]);
-            expect(amounts.reduce((a, b) => a + b, 0)).toBe(-100);
-        });
+            if (!transaction || !expenseReport) {
+                return;
+            }
 
-        it('preserves negative sign for 2-way odd-cent split -> [-$0.51, -$0.50]', async () => {
-            const originalTransactionID = 'orig-neg-2';
-            const draftTransaction: Transaction = {
-                transactionID: 'draft-neg-2',
-                amount: -101, // in cents = -$1.01
-                currency: 'USD',
-                merchant: 'Test Merchant',
-                comment: {
-                    comment: 'Negative amount test 2-way',
-                    originalTransactionID,
-                    splitExpenses: [
-                        {transactionID: 'nA', amount: 0, description: 'NA', created: DateUtils.getDBTime()},
-                        {transactionID: 'nB', amount: 0, description: 'NB', created: DateUtils.getDBTime()},
-                    ],
-                    attendees: [],
-                    type: CONST.TRANSACTION.TYPE.CUSTOM_UNIT,
-                },
-                created: DateUtils.getDBTime(),
-                reportID: 'rep-neg-2',
-            };
+            const {result} = renderHook(() => {
+                const [report] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${expenseReport?.reportID}`, {canBeMissing: true});
+                return {report};
+            });
 
-            evenlyDistributeSplitExpenseAmounts(draftTransaction);
-            await waitForBatchedUpdates();
+            await waitFor(() => {
+                expect(result.current.report).toBeDefined();
+            });
 
-            const updatedDraft = await getOnyxValue(`${ONYXKEYS.COLLECTION.SPLIT_TRANSACTION_DRAFT}${originalTransactionID}`);
-            const amounts = (updatedDraft?.comment?.splitExpenses ?? []).map((x) => x.amount);
-            expect(amounts).toEqual([-50, -51]);
-            expect(amounts.reduce((a, b) => a + b, 0)).toBe(-101);
-        });
-    });
+            changeTransactionsReport({
+                transactionIDs: [transaction?.transactionID],
+                isASAPSubmitBetaEnabled: false,
+                accountID: CARLOS_ACCOUNT_ID,
+                email: CARLOS_EMAIL,
+                newReport: result.current.report,
+                allTransactionsCollection: allTransactions,
+            });
 
-    describe('updateSplitExpenseAmountField', () => {
-        it('should update amount expense field to draft transaction', async () => {
-            const originalTransactionID = '123';
-            const currentTransactionID = '789';
-            const draftTransaction: Transaction = {
-                transactionID: '234',
-                amount: 100,
-                currency: 'USD',
-                merchant: 'Test Merchant',
-                comment: {
-                    comment: 'Test comment',
-                    originalTransactionID,
-                    splitExpenses: [
-                        {
-                            transactionID: currentTransactionID,
-                            amount: 50,
-                            description: 'Test comment',
-                            category: 'Food',
-                            tags: ['lunch'],
-                            created: DateUtils.getDBTime(),
-                        },
-                    ],
-                    attendees: [],
-                    type: CONST.TRANSACTION.TYPE.CUSTOM_UNIT,
+            let updatedTransaction: OnyxEntry<Transaction>;
+            let updatedIOUReportActionOnSelfDMReport: OnyxEntry<ReportAction>;
+            let updatedTrackExpenseActionableWhisper: OnyxEntry<ReportAction>;
+            let updatedExpenseReport: OnyxEntry<Report>;
+
+            await getOnyxData({
+                key: ONYXKEYS.COLLECTION.TRANSACTION,
+                waitForCollectionCallback: true,
+                callback: (transactions) => {
+                    updatedTransaction = Object.values(transactions ?? {}).find((t) => t?.transactionID === transaction?.transactionID);
                 },
-                category: 'Food',
-                tag: 'lunch',
-                created: DateUtils.getDBTime(),
-                reportID: '456',
-            };
+            });
 
-            updateSplitExpenseAmountField(draftTransaction, currentTransactionID, 20);
-            await waitForBatchedUpdates();
+            await getOnyxData({
+                key: ONYXKEYS.COLLECTION.REPORT_ACTIONS,
+                waitForCollectionCallback: true,
+                callback: (allReportActions) => {
+                    updatedIOUReportActionOnSelfDMReport = Object.values(allReportActions?.[`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${selfDMReport.reportID}`] ?? {}).find(
+                        (r) => r?.actionName === CONST.REPORT.ACTIONS.TYPE.IOU,
+                    );
+                    updatedTrackExpenseActionableWhisper = Object.values(allReportActions?.[`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${selfDMReport?.reportID}`] ?? {}).find(
+                        (r) => r?.actionName === CONST.REPORT.ACTIONS.TYPE.ACTIONABLE_TRACK_EXPENSE_WHISPER,
+                    );
+                },
+            });
 
-            const updatedDraftTransaction = await getOnyxValue(`${ONYXKEYS.COLLECTION.SPLIT_TRANSACTION_DRAFT}${originalTransactionID}`);
-            expect(updatedDraftTransaction).toBeTruthy();
+            await getOnyxData({
+                key: ONYXKEYS.COLLECTION.REPORT,
+                waitForCollectionCallback: true,
+                callback: (allReports) => {
+                    updatedExpenseReport = Object.values(allReports ?? {}).find((r) => r?.reportID === expenseReport?.reportID);
+                },
+            });
+
+            expect(updatedTransaction?.reportID).toBe(expenseReport?.reportID);
+            expect(isMoneyRequestAction(updatedIOUReportActionOnSelfDMReport) ? getOriginalMessage(updatedIOUReportActionOnSelfDMReport)?.IOUTransactionID : undefined).toBe(undefined);
+            expect(updatedTrackExpenseActionableWhisper).toBe(undefined);
+            expect(updatedExpenseReport?.nonReimbursableTotal).toBe(-amount);
+            expect(updatedExpenseReport?.total).toBe(-amount);
+            expect(updatedExpenseReport?.unheldNonReimbursableTotal).toBe(-amount);
+        });
+
+        describe('updateSplitTransactionsFromSplitExpensesFlow', () => {
+            it("should update split transaction's description correctly ", async () => {
+                const amount = 10000;
+                let expenseReport: OnyxEntry<Report>;
+                let chatReport: OnyxEntry<Report>;
+                let originalTransactionID;
+
+                const policyID = generatePolicyID();
+                createWorkspace({
+                    policyOwnerEmail: CARLOS_EMAIL,
+                    makeMeAdmin: true,
+                    policyName: "Carlos's Workspace",
+                    policyID,
+                    introSelected: {choice: CONST.ONBOARDING_CHOICES.MANAGE_TEAM},
+                    currentUserAccountIDParam: CARLOS_ACCOUNT_ID,
+                    currentUserEmailParam: CARLOS_EMAIL,
+                });
+
+                // Change the approval mode for the policy since default is Submit and Close
+                setWorkspaceApprovalMode(policyID, CARLOS_EMAIL, CONST.POLICY.APPROVAL_MODE.BASIC);
+                await waitForBatchedUpdates();
+                await getOnyxData({
+                    key: ONYXKEYS.COLLECTION.REPORT,
+                    waitForCollectionCallback: true,
+                    callback: (allReports) => {
+                        chatReport = Object.values(allReports ?? {}).find((report) => report?.chatType === CONST.REPORT.CHAT_TYPE.POLICY_EXPENSE_CHAT);
+                    },
+                });
+                requestMoney({
+                    report: chatReport,
+                    participantParams: {
+                        payeeEmail: RORY_EMAIL,
+                        payeeAccountID: RORY_ACCOUNT_ID,
+                        participant: {login: CARLOS_EMAIL, accountID: CARLOS_ACCOUNT_ID, isPolicyExpenseChat: true, reportID: chatReport?.reportID},
+                    },
+                    transactionParams: {
+                        amount,
+                        attendees: [],
+                        currency: CONST.CURRENCY.USD,
+                        created: '',
+                        merchant: 'NASDAQ',
+                        comment: '*hey* `hey`',
+                    },
+                    shouldGenerateTransactionThreadReport: true,
+                    isASAPSubmitBetaEnabled: false,
+                    currentUserAccountIDParam: 123,
+                    currentUserEmailParam: 'existing@example.com',
+                    transactionViolations: {},
+                    policyRecentlyUsedCurrencies: [],
+                    quickAction: undefined,
+                });
+                await waitForBatchedUpdates();
+                await getOnyxData({
+                    key: ONYXKEYS.COLLECTION.REPORT,
+                    waitForCollectionCallback: true,
+                    callback: (allReports) => {
+                        expenseReport = Object.values(allReports ?? {}).find((report) => report?.type === CONST.REPORT.TYPE.EXPENSE);
+                    },
+                });
+                await getOnyxData({
+                    key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${expenseReport?.reportID}`,
+                    waitForCollectionCallback: false,
+                    callback: (allReportsAction) => {
+                        const iouActions = Object.values(allReportsAction ?? {}).filter((reportAction): reportAction is ReportAction<typeof CONST.REPORT.ACTIONS.TYPE.IOU> =>
+                            isMoneyRequestAction(reportAction),
+                        );
+                        const originalMessage = isMoneyRequestAction(iouActions?.at(0)) ? getOriginalMessage(iouActions?.at(0)) : undefined;
+                        originalTransactionID = originalMessage?.IOUTransactionID;
+                    },
+                });
 
-            const splitExpenses = updatedDraftTransaction?.comment?.splitExpenses;
-            expect(splitExpenses?.[0].amount).toBe(20);
-        });
-    });
+                const originalTransaction = await getOnyxValue(`${ONYXKEYS.COLLECTION.TRANSACTION}${originalTransactionID}`);
+                const draftTransaction: Transaction = {
+                    reportID: originalTransaction?.reportID ?? '456',
+                    transactionID: originalTransaction?.transactionID ?? '234',
+                    amount,
+                    created: originalTransaction?.created ?? DateUtils.getDBTime(),
+                    currency: CONST.CURRENCY.USD,
+                    merchant: originalTransaction?.merchant ?? '',
+                    comment: {
+                        originalTransactionID,
+                        comment: originalTransaction?.comment?.comment ?? '',
+                        splitExpenses: [
+                            {
+                                transactionID: '235',
+                                amount: amount / 2,
+                                description: '<strong>hey</strong><br /><code>hey</code>',
+                                created: DateUtils.getDBTime(),
+                            },
+                            {
+                                transactionID: '234',
+                                amount: amount / 2,
+                                description: '*hey1* `hey`',
+                                created: DateUtils.getDBTime(),
+                            },
+                        ],
+                        attendees: [],
+                        type: CONST.TRANSACTION.TYPE.CUSTOM_UNIT,
+                    },
+                };
 
-    describe('replaceReceipt', () => {
-        it('should replace the receipt of the transaction', async () => {
-            const transactionID = '123';
-            const file = new File([new Blob(['test'])], 'test.jpg', {type: 'image/jpeg'});
-            file.source = 'test';
-            const source = 'test';
+                let allTransactions: OnyxCollection<Transaction>;
+                let allReports: OnyxCollection<Report>;
+                let allReportNameValuePairs: OnyxCollection<ReportNameValuePairs>;
+                await getOnyxData({
+                    key: ONYXKEYS.COLLECTION.TRANSACTION,
+                    waitForCollectionCallback: true,
+                    callback: (value) => {
+                        allTransactions = value;
+                    },
+                });
+                await getOnyxData({
+                    key: ONYXKEYS.COLLECTION.REPORT,
+                    waitForCollectionCallback: true,
+                    callback: (value) => {
+                        allReports = value;
+                    },
+                });
+                await getOnyxData({
+                    key: ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS,
+                    waitForCollectionCallback: true,
+                    callback: (value) => {
+                        allReportNameValuePairs = value;
+                    },
+                });
 
-            const transaction = {
-                transactionID,
-                receipt: {
-                    source: 'test1',
-                },
-            };
+                updateSplitTransactionsFromSplitExpensesFlow({
+                    allTransactionsList: allTransactions,
+                    allReportsList: allReports,
+                    allReportNameValuePairsList: allReportNameValuePairs,
+                    transactionData: {
+                        reportID: draftTransaction?.reportID ?? String(CONST.DEFAULT_NUMBER_ID),
+                        originalTransactionID: draftTransaction?.comment?.originalTransactionID ?? String(CONST.DEFAULT_NUMBER_ID),
+                        splitExpenses: draftTransaction?.comment?.splitExpenses ?? [],
+                        splitExpensesTotal: draftTransaction?.comment?.splitExpensesTotal,
+                    },
+                    searchContext: {
+                        currentSearchHash: -2,
+                    },
+                    policyCategories: undefined,
+                    policy: undefined,
+                    policyRecentlyUsedCategories: [],
+                    iouReport: expenseReport,
+                    firstIOU: undefined,
+                    isASAPSubmitBetaEnabled: false,
+                    currentUserPersonalDetails,
+                    transactionViolations: {},
+                    policyRecentlyUsedCurrencies: [],
+                    quickAction: undefined,
+                });
+                await waitForBatchedUpdates();
 
-            // Given a transaction with a receipt
-            await Onyx.set(`${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`, transaction);
-            await waitForBatchedUpdates();
+                const split1 = await getOnyxValue(`${ONYXKEYS.COLLECTION.TRANSACTION}235`);
+                expect(split1?.comment?.comment).toBe('<strong>hey</strong><br /><code>hey</code>');
+                const split2 = await getOnyxValue(`${ONYXKEYS.COLLECTION.TRANSACTION}234`);
+                expect(split2?.comment?.comment).toBe('<strong>hey1</strong> <code>hey</code>');
+            });
+
+            it("should not create new expense report if the admin split the employee's expense", async () => {
+                const amount = 10000;
+                let expenseReport: OnyxEntry<Report>;
+                let chatReport: OnyxEntry<Report>;
+                let originalTransactionID;
+
+                const policyID = generatePolicyID();
+                createWorkspace({
+                    policyOwnerEmail: RORY_EMAIL,
+                    makeMeAdmin: true,
+                    policyName: "Rory's Workspace",
+                    policyID,
+                    introSelected: {choice: CONST.ONBOARDING_CHOICES.MANAGE_TEAM},
+                    currentUserAccountIDParam: RORY_ACCOUNT_ID,
+                    currentUserEmailParam: RORY_EMAIL,
+                });
 
-            // Given a snapshot of the transaction
-            await Onyx.set(`${ONYXKEYS.COLLECTION.SNAPSHOT}${unapprovedCashHash}`, {
-                // @ts-expect-error: Allow partial record in snapshot update
-                data: {
-                    [`${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`]: transaction,
-                },
-            });
-            await waitForBatchedUpdates();
+                // Change the approval mode for the policy since default is Submit and Close
+                setWorkspaceApprovalMode(policyID, RORY_EMAIL, CONST.POLICY.APPROVAL_MODE.BASIC);
+                await waitForBatchedUpdates();
+                await getOnyxData({
+                    key: ONYXKEYS.COLLECTION.REPORT,
+                    waitForCollectionCallback: true,
+                    callback: (allReports) => {
+                        chatReport = Object.values(allReports ?? {}).find((report) => report?.chatType === CONST.REPORT.CHAT_TYPE.POLICY_EXPENSE_CHAT);
+                    },
+                });
+                requestMoney({
+                    report: chatReport,
+                    participantParams: {
+                        payeeEmail: CARLOS_EMAIL,
+                        payeeAccountID: CARLOS_ACCOUNT_ID,
+                        participant: {login: RORY_EMAIL, accountID: RORY_ACCOUNT_ID, isPolicyExpenseChat: true, reportID: chatReport?.reportID},
+                    },
+                    transactionParams: {
+                        amount,
+                        attendees: [],
+                        currency: CONST.CURRENCY.USD,
+                        created: '',
+                        merchant: 'NASDAQ',
+                        comment: '*hey* `hey`',
+                    },
+                    shouldGenerateTransactionThreadReport: true,
+                    isASAPSubmitBetaEnabled: false,
+                    currentUserAccountIDParam: 123,
+                    currentUserEmailParam: 'existing@example.com',
+                    transactionViolations: {},
+                    policyRecentlyUsedCurrencies: [],
+                    quickAction: undefined,
+                });
+                await waitForBatchedUpdates();
+                await getOnyxData({
+                    key: ONYXKEYS.COLLECTION.REPORT,
+                    waitForCollectionCallback: true,
+                    callback: (allReports) => {
+                        expenseReport = Object.values(allReports ?? {}).find((report) => report?.type === CONST.REPORT.TYPE.EXPENSE);
+                    },
+                });
+                await getOnyxData({
+                    key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${expenseReport?.reportID}`,
+                    waitForCollectionCallback: false,
+                    callback: (allReportsAction) => {
+                        const iouActions = Object.values(allReportsAction ?? {}).filter((reportAction): reportAction is ReportAction<typeof CONST.REPORT.ACTIONS.TYPE.IOU> =>
+                            isMoneyRequestAction(reportAction),
+                        );
+                        const originalMessage = isMoneyRequestAction(iouActions?.at(0)) ? getOriginalMessage(iouActions?.at(0)) : undefined;
+                        originalTransactionID = originalMessage?.IOUTransactionID;
+                    },
+                });
 
-            // When the receipt is replaced
-            replaceReceipt({transactionID, file, source, transactionPolicy: undefined});
-            await waitForBatchedUpdates();
+                const originalTransaction = await getOnyxValue(`${ONYXKEYS.COLLECTION.TRANSACTION}${originalTransactionID}`);
+                const draftTransaction: Transaction = {
+                    reportID: originalTransaction?.reportID ?? '456',
+                    transactionID: originalTransaction?.transactionID ?? '234',
+                    amount,
+                    created: originalTransaction?.created ?? DateUtils.getDBTime(),
+                    currency: CONST.CURRENCY.USD,
+                    merchant: originalTransaction?.merchant ?? '',
+                    comment: {
+                        originalTransactionID,
+                        comment: originalTransaction?.comment?.comment ?? '',
+                        splitExpenses: [
+                            {
+                                transactionID: '235',
+                                amount: amount / 2,
+                                description: '<strong>hey</strong><br /><code>hey</code>',
+                                created: DateUtils.getDBTime(),
+                            },
+                            {
+                                transactionID: '234',
+                                amount: amount / 2,
+                                description: '*hey1* `hey`',
+                                created: DateUtils.getDBTime(),
+                            },
+                        ],
+                        attendees: [],
+                        type: CONST.TRANSACTION.TYPE.CUSTOM_UNIT,
+                    },
+                };
 
-            // Then the transaction should have the new receipt source
-            const updatedTransaction = await new Promise<OnyxEntry<Transaction>>((resolve) => {
-                const connection = Onyx.connect({
+                let allTransactions: OnyxCollection<Transaction>;
+                let allReports: OnyxCollection<Report>;
+                let allReportNameValuePairs: OnyxCollection<ReportNameValuePairs>;
+                await getOnyxData({
                     key: ONYXKEYS.COLLECTION.TRANSACTION,
                     waitForCollectionCallback: true,
-                    callback: (transactions) => {
-                        Onyx.disconnect(connection);
-                        const newTransaction = transactions[`${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`];
-                        resolve(newTransaction);
+                    callback: (value) => {
+                        allTransactions = value;
+                    },
+                });
+                await getOnyxData({
+                    key: ONYXKEYS.COLLECTION.REPORT,
+                    waitForCollectionCallback: true,
+                    callback: (value) => {
+                        allReports = value;
+                    },
+                });
+                await getOnyxData({
+                    key: ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS,
+                    waitForCollectionCallback: true,
+                    callback: (value) => {
+                        allReportNameValuePairs = value;
                     },
                 });
-            });
-            expect(updatedTransaction?.receipt?.source).toBe(source);
 
-            // Then the snapshot should have the new receipt source
-            const updatedSnapshot = await new Promise<OnyxEntry<SearchResults>>((resolve) => {
-                const connection = Onyx.connect({
-                    key: ONYXKEYS.COLLECTION.SNAPSHOT,
+                updateSplitTransactionsFromSplitExpensesFlow({
+                    allTransactionsList: allTransactions,
+                    allReportsList: allReports,
+                    allReportNameValuePairsList: allReportNameValuePairs,
+                    transactionData: {
+                        reportID: draftTransaction?.reportID ?? String(CONST.DEFAULT_NUMBER_ID),
+                        originalTransactionID: draftTransaction?.comment?.originalTransactionID ?? String(CONST.DEFAULT_NUMBER_ID),
+                        splitExpenses: draftTransaction?.comment?.splitExpenses ?? [],
+                        splitExpensesTotal: draftTransaction?.comment?.splitExpensesTotal,
+                    },
+                    searchContext: {
+                        currentSearchHash: -2,
+                    },
+                    policyCategories: undefined,
+                    policy: undefined,
+                    policyRecentlyUsedCategories: [],
+                    iouReport: expenseReport,
+                    firstIOU: undefined,
+                    isASAPSubmitBetaEnabled: false,
+                    currentUserPersonalDetails,
+                    transactionViolations: {},
+                    policyRecentlyUsedCurrencies: [],
+                    quickAction: undefined,
+                });
+                await waitForBatchedUpdates();
+
+                const split1 = await getOnyxValue(`${ONYXKEYS.COLLECTION.TRANSACTION}235`);
+                expect(split1?.reportID).toBe(expenseReport?.reportID);
+                const split2 = await getOnyxValue(`${ONYXKEYS.COLLECTION.TRANSACTION}234`);
+                expect(split2?.reportID).toBe(expenseReport?.reportID);
+            });
+
+            it('should use splitExpensesTotal in calculation when editing splits', async () => {
+                // The fix ensures we rely on splitExpensesTotal rather than potentially incorrect backend reportTotal
+                // This prevents scenarios where backend sends wrong total (e.g., -$2 instead of -$10)
+                // from causing incorrect report totals (e.g., $24 instead of correct -$10)
+
+                const amount = -10000;
+                let expenseReport: OnyxEntry<Report>;
+                let chatReport: OnyxEntry<Report>;
+                let originalTransactionID;
+
+                const policyID = generatePolicyID();
+                createWorkspace({
+                    policyOwnerEmail: CARLOS_EMAIL,
+                    makeMeAdmin: true,
+                    policyName: "Carlos's Workspace",
+                    policyID,
+                    introSelected: {choice: CONST.ONBOARDING_CHOICES.MANAGE_TEAM},
+                    currentUserAccountIDParam: CARLOS_ACCOUNT_ID,
+                    currentUserEmailParam: CARLOS_EMAIL,
+                });
+
+                setWorkspaceApprovalMode(policyID, CARLOS_EMAIL, CONST.POLICY.APPROVAL_MODE.BASIC);
+                await waitForBatchedUpdates();
+
+                await getOnyxData({
+                    key: ONYXKEYS.COLLECTION.REPORT,
                     waitForCollectionCallback: true,
-                    callback: (snapshots) => {
-                        Onyx.disconnect(connection);
-                        const newSnapshot = snapshots[`${ONYXKEYS.COLLECTION.SNAPSHOT}${unapprovedCashHash}`];
-                        resolve(newSnapshot);
+                    callback: (allReports) => {
+                        chatReport = Object.values(allReports ?? {}).find((report) => report?.chatType === CONST.REPORT.CHAT_TYPE.POLICY_EXPENSE_CHAT);
                     },
                 });
-            });
 
-            expect(updatedSnapshot?.data?.[`${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`]?.receipt?.source).toBe(source);
-        });
+                requestMoney({
+                    report: chatReport,
+                    participantParams: {
+                        payeeEmail: RORY_EMAIL,
+                        payeeAccountID: RORY_ACCOUNT_ID,
+                        participant: {login: CARLOS_EMAIL, accountID: CARLOS_ACCOUNT_ID, isPolicyExpenseChat: true, reportID: chatReport?.reportID},
+                    },
+                    transactionParams: {
+                        amount,
+                        attendees: [],
+                        currency: CONST.CURRENCY.USD,
+                        created: '',
+                        merchant: 'Test Merchant',
+                        comment: 'Test expense',
+                    },
+                    shouldGenerateTransactionThreadReport: true,
+                    isASAPSubmitBetaEnabled: false,
+                    currentUserAccountIDParam: 123,
+                    currentUserEmailParam: 'existing@example.com',
+                    transactionViolations: {},
+                    policyRecentlyUsedCurrencies: [],
+                    quickAction: undefined,
+                });
+                await waitForBatchedUpdates();
 
-        it('should add receipt if it does not exist', async () => {
-            const transactionID = '123';
-            const file = new File([new Blob(['test'])], 'test.jpg', {type: 'image/jpeg'});
-            file.source = 'test';
-            const source = 'test';
+                await getOnyxData({
+                    key: ONYXKEYS.COLLECTION.REPORT,
+                    waitForCollectionCallback: true,
+                    callback: (allReports) => {
+                        expenseReport = Object.values(allReports ?? {}).find((report) => report?.type === CONST.REPORT.TYPE.EXPENSE);
+                    },
+                });
 
-            const transaction = {
-                transactionID,
-            };
+                await getOnyxData({
+                    key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${expenseReport?.reportID}`,
+                    waitForCollectionCallback: false,
+                    callback: (allReportsAction) => {
+                        const iouActions = Object.values(allReportsAction ?? {}).filter((reportAction): reportAction is ReportAction<typeof CONST.REPORT.ACTIONS.TYPE.IOU> =>
+                            isMoneyRequestAction(reportAction),
+                        );
+                        const originalMessage = isMoneyRequestAction(iouActions?.at(0)) ? getOriginalMessage(iouActions?.at(0)) : undefined;
+                        originalTransactionID = originalMessage?.IOUTransactionID;
+                    },
+                });
 
-            // Given a transaction without a receipt
-            await Onyx.set(`${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`, transaction);
-            await waitForBatchedUpdates();
+                const originalTransaction = await getOnyxValue(`${ONYXKEYS.COLLECTION.TRANSACTION}${originalTransactionID}`);
 
-            // Given a snapshot of the transaction
-            await Onyx.set(`${ONYXKEYS.COLLECTION.SNAPSHOT}${unapprovedCashHash}`, {
-                // @ts-expect-error: Allow partial record in snapshot update
-                data: {
-                    [`${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`]: transaction,
-                },
-            });
-            await waitForBatchedUpdates();
+                // Set up split expenses with explicit splitExpensesTotal
+                // Using negative amounts to get positive transaction amounts (expense reports store as negative)
+                const splitExpensesTotal = -8000; // -$80 total for splits
+                const draftTransaction: Transaction = {
+                    reportID: originalTransaction?.reportID ?? '456',
+                    transactionID: originalTransaction?.transactionID ?? '234',
+                    amount,
+                    created: originalTransaction?.created ?? DateUtils.getDBTime(),
+                    currency: CONST.CURRENCY.USD,
+                    merchant: originalTransaction?.merchant ?? '',
+                    comment: {
+                        originalTransactionID,
+                        comment: originalTransaction?.comment?.comment ?? '',
+                        splitExpenses: [
+                            {
+                                transactionID: '235',
+                                amount: -5000,
+                                description: 'Split 1',
+                                created: DateUtils.getDBTime(),
+                            },
+                            {
+                                transactionID: '236',
+                                amount: -3000,
+                                description: 'Split 2',
+                                created: DateUtils.getDBTime(),
+                            },
+                        ],
+                        splitExpensesTotal,
+                        attendees: [],
+                        type: CONST.TRANSACTION.TYPE.CUSTOM_UNIT,
+                    },
+                };
 
-            // When the receipt is replaced
-            replaceReceipt({transactionID, file, source, transactionPolicy: undefined});
-            await waitForBatchedUpdates();
+                let allTransactions: OnyxCollection<Transaction>;
+                let allReports: OnyxCollection<Report>;
+                let allReportNameValuePairs: OnyxCollection<ReportNameValuePairs>;
 
-            // Then the transaction should have the new receipt source
-            const updatedTransaction = await new Promise<OnyxEntry<Transaction>>((resolve) => {
-                const connection = Onyx.connect({
+                await getOnyxData({
                     key: ONYXKEYS.COLLECTION.TRANSACTION,
                     waitForCollectionCallback: true,
-                    callback: (transactions) => {
-                        Onyx.disconnect(connection);
-                        const newTransaction = transactions[`${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`];
-                        resolve(newTransaction);
+                    callback: (value) => {
+                        allTransactions = value;
                     },
                 });
-            });
-            expect(updatedTransaction?.receipt?.source).toBe(source);
-
-            // Then the snapshot should have the new receipt source
-            const updatedSnapshot = await new Promise<OnyxEntry<SearchResults>>((resolve) => {
-                const connection = Onyx.connect({
-                    key: ONYXKEYS.COLLECTION.SNAPSHOT,
+                await getOnyxData({
+                    key: ONYXKEYS.COLLECTION.REPORT,
                     waitForCollectionCallback: true,
-                    callback: (snapshots) => {
-                        Onyx.disconnect(connection);
-                        const newSnapshot = snapshots[`${ONYXKEYS.COLLECTION.SNAPSHOT}${unapprovedCashHash}`];
-                        resolve(newSnapshot);
+                    callback: (value) => {
+                        allReports = value;
+                    },
+                });
+                await getOnyxData({
+                    key: ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS,
+                    waitForCollectionCallback: true,
+                    callback: (value) => {
+                        allReportNameValuePairs = value;
                     },
                 });
-            });
 
-            expect(updatedSnapshot?.data?.[`${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`]?.receipt?.source).toBe(source);
-        });
-    });
+                // it should use splitExpensesTotal in its calculation
+                updateSplitTransactionsFromSplitExpensesFlow({
+                    allTransactionsList: allTransactions,
+                    allReportsList: allReports,
+                    allReportNameValuePairsList: allReportNameValuePairs,
+                    transactionData: {
+                        reportID: draftTransaction?.reportID ?? String(CONST.DEFAULT_NUMBER_ID),
+                        originalTransactionID: draftTransaction?.comment?.originalTransactionID ?? String(CONST.DEFAULT_NUMBER_ID),
+                        splitExpenses: draftTransaction?.comment?.splitExpenses ?? [],
+                        splitExpensesTotal: draftTransaction?.comment?.splitExpensesTotal,
+                    },
+                    searchContext: {
+                        currentSearchHash: -2,
+                    },
+                    policyCategories: undefined,
+                    policy: undefined,
+                    policyRecentlyUsedCategories: [],
+                    iouReport: expenseReport,
+                    firstIOU: undefined,
+                    isASAPSubmitBetaEnabled: false,
+                    currentUserPersonalDetails,
+                    transactionViolations: {},
+                    policyRecentlyUsedCurrencies: [],
+                    quickAction: undefined,
+                });
+                await waitForBatchedUpdates();
 
-    describe('changeTransactionsReport', () => {
-        it('should set the correct optimistic onyx data for reporting a tracked expense', async () => {
-            let personalDetailsList: OnyxEntry<PersonalDetailsList>;
-            let expenseReport: OnyxEntry<Report>;
-            let transaction: OnyxEntry<Transaction>;
-            let allTransactions: OnyxCollection<Transaction> = {};
+                const split1 = await getOnyxValue(`${ONYXKEYS.COLLECTION.TRANSACTION}235`);
+                const split2 = await getOnyxValue(`${ONYXKEYS.COLLECTION.TRANSACTION}236`);
+
+                expect(split1).toBeDefined();
+                expect(split2).toBeDefined();
+            });
+
+            it('should create hold report actions for split transactions when original transaction is on hold', async () => {
+                // Given an expense that is on hold
+                const amount = 10000;
+                let expenseReport: OnyxEntry<Report>;
+                let chatReport: OnyxEntry<Report>;
+                let originalTransactionID: string | undefined;
+                let transactionThreadReportID: string | undefined;
+
+                const policyID = generatePolicyID();
+                createWorkspace({
+                    policyOwnerEmail: CARLOS_EMAIL,
+                    makeMeAdmin: true,
+                    policyName: "Carlos's Workspace for Hold Test",
+                    policyID,
+                    introSelected: {choice: CONST.ONBOARDING_CHOICES.MANAGE_TEAM},
+                    currentUserAccountIDParam: CARLOS_ACCOUNT_ID,
+                    currentUserEmailParam: CARLOS_EMAIL,
+                });
 
-            // Given a signed in account, which owns a workspace, and has a policy expense chat
-            Onyx.set(ONYXKEYS.SESSION, {email: CARLOS_EMAIL, accountID: CARLOS_ACCOUNT_ID});
-            const creatorPersonalDetails = personalDetailsList?.[CARLOS_ACCOUNT_ID] ?? {accountID: CARLOS_ACCOUNT_ID};
+                // Change the approval mode for the policy since default is Submit and Close
+                setWorkspaceApprovalMode(policyID, CARLOS_EMAIL, CONST.POLICY.APPROVAL_MODE.BASIC);
+                await waitForBatchedUpdates();
 
-            const policyID = generatePolicyID();
-            const mockPolicy: Policy = {
-                ...createRandomPolicy(1, CONST.POLICY.TYPE.TEAM, "Carlos's Workspace"),
-                id: policyID,
-                outputCurrency: CONST.CURRENCY.USD,
-                owner: CARLOS_EMAIL,
-                ownerAccountID: CARLOS_ACCOUNT_ID,
-                pendingAction: undefined,
-            };
+                await getOnyxData({
+                    key: ONYXKEYS.COLLECTION.REPORT,
+                    waitForCollectionCallback: true,
+                    callback: (allReports) => {
+                        chatReport = Object.values(allReports ?? {}).find((report) => report?.chatType === CONST.REPORT.CHAT_TYPE.POLICY_EXPENSE_CHAT);
+                    },
+                });
 
-            await waitForBatchedUpdates();
+                // Create the initial expense
+                requestMoney({
+                    report: chatReport,
+                    participantParams: {
+                        payeeEmail: RORY_EMAIL,
+                        payeeAccountID: RORY_ACCOUNT_ID,
+                        participant: {login: CARLOS_EMAIL, accountID: CARLOS_ACCOUNT_ID, isPolicyExpenseChat: true, reportID: chatReport?.reportID},
+                    },
+                    transactionParams: {
+                        amount,
+                        attendees: [],
+                        currency: CONST.CURRENCY.USD,
+                        created: '',
+                        merchant: 'Test Merchant',
+                        comment: 'Original expense',
+                    },
+                    shouldGenerateTransactionThreadReport: true,
+                    isASAPSubmitBetaEnabled: false,
+                    currentUserAccountIDParam: RORY_ACCOUNT_ID,
+                    currentUserEmailParam: RORY_EMAIL,
+                    transactionViolations: {},
+                    policyRecentlyUsedCurrencies: [],
+                    quickAction: undefined,
+                });
+                await waitForBatchedUpdates();
 
-            createNewReport(creatorPersonalDetails, true, false, mockPolicy);
-            // Create a tracked expense
-            const selfDMReport: Report = {
-                ...createRandomReport(1, CONST.REPORT.CHAT_TYPE.SELF_DM),
-                reportID: '10',
-            };
+                await getOnyxData({
+                    key: ONYXKEYS.COLLECTION.REPORT,
+                    waitForCollectionCallback: true,
+                    callback: (allReports) => {
+                        expenseReport = Object.values(allReports ?? {}).find((report) => report?.type === CONST.REPORT.TYPE.EXPENSE);
+                    },
+                });
 
-            const amount = 100;
+                // Get the original transaction ID and transaction thread report ID
+                await getOnyxData({
+                    key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${expenseReport?.reportID}`,
+                    waitForCollectionCallback: false,
+                    callback: (allReportsAction) => {
+                        const iouActions = Object.values(allReportsAction ?? {}).filter((reportAction): reportAction is ReportAction<typeof CONST.REPORT.ACTIONS.TYPE.IOU> =>
+                            isMoneyRequestAction(reportAction),
+                        );
+                        const iouAction = iouActions?.at(0);
+                        const originalMessage = isMoneyRequestAction(iouAction) ? getOriginalMessage(iouAction) : undefined;
+                        originalTransactionID = originalMessage?.IOUTransactionID;
+                        transactionThreadReportID = iouAction?.childReportID;
+                    },
+                });
 
-            trackExpense({
-                report: selfDMReport,
-                isDraftPolicy: true,
-                action: CONST.IOU.ACTION.CREATE,
-                participantParams: {
-                    payeeEmail: RORY_EMAIL,
-                    payeeAccountID: RORY_ACCOUNT_ID,
-                    participant: {accountID: RORY_ACCOUNT_ID},
-                },
-                transactionParams: {
+                // Put the expense on hold
+                if (originalTransactionID && transactionThreadReportID) {
+                    putOnHold(originalTransactionID, 'Test hold reason', transactionThreadReportID);
+                }
+                await waitForBatchedUpdates();
+
+                // Verify the transaction is on hold
+                const originalTransaction = await getOnyxValue(`${ONYXKEYS.COLLECTION.TRANSACTION}${originalTransactionID}`);
+                expect(originalTransaction?.comment?.hold).toBeDefined();
+
+                // Get the first IOU action for the split flow
+                let firstIOU: ReportAction | undefined;
+                await getOnyxData({
+                    key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${expenseReport?.reportID}`,
+                    waitForCollectionCallback: false,
+                    callback: (allReportsAction) => {
+                        const iouActions = Object.values(allReportsAction ?? {}).filter((reportAction): reportAction is ReportAction<typeof CONST.REPORT.ACTIONS.TYPE.IOU> =>
+                            isMoneyRequestAction(reportAction),
+                        );
+                        firstIOU = iouActions?.at(0);
+                    },
+                });
+
+                // Create the draft transaction with split expenses
+                const draftTransaction: Transaction = {
+                    reportID: originalTransaction?.reportID ?? '456',
+                    transactionID: originalTransaction?.transactionID ?? '234',
                     amount,
+                    created: originalTransaction?.created ?? DateUtils.getDBTime(),
                     currency: CONST.CURRENCY.USD,
-                    created: format(new Date(), CONST.DATE.FNS_FORMAT_STRING),
-                    merchant: 'merchant',
-                    billable: false,
-                    reimbursable: false,
-                },
-                isASAPSubmitBetaEnabled: false,
-                currentUserAccountIDParam: RORY_ACCOUNT_ID,
-                currentUserEmailParam: RORY_EMAIL,
-                introSelected: undefined,
-                activePolicyID: undefined,
-                quickAction: undefined,
-            });
-            await getOnyxData({
-                key: ONYXKEYS.COLLECTION.TRANSACTION,
-                waitForCollectionCallback: true,
-                callback: (transactions) => {
-                    transaction = Object.values(transactions ?? {}).find((t) => !!t);
-                    allTransactions = transactions;
-                },
-            });
-
-            await getOnyxData({
-                key: ONYXKEYS.COLLECTION.REPORT,
-                waitForCollectionCallback: true,
-                callback: (allReports) => {
-                    expenseReport = Object.values(allReports ?? {}).find((r) => r?.type === CONST.REPORT.TYPE.EXPENSE);
-                },
-            });
+                    merchant: originalTransaction?.merchant ?? '',
+                    comment: {
+                        originalTransactionID,
+                        comment: originalTransaction?.comment?.comment ?? '',
+                        hold: originalTransaction?.comment?.hold,
+                        splitExpenses: [
+                            {
+                                transactionID: 'split-held-tx-1',
+                                amount: amount / 2,
+                                description: 'Split 1',
+                                created: DateUtils.getDBTime(),
+                            },
+                            {
+                                transactionID: 'split-held-tx-2',
+                                amount: amount / 2,
+                                description: 'Split 2',
+                                created: DateUtils.getDBTime(),
+                            },
+                        ],
+                        attendees: [],
+                        type: CONST.TRANSACTION.TYPE.CUSTOM_UNIT,
+                    },
+                };
 
-            let iouReportActionOnSelfDMReport: OnyxEntry<ReportAction>;
-            let trackExpenseActionableWhisper: OnyxEntry<ReportAction>;
+                let allTransactions: OnyxCollection<Transaction>;
+                let allReports: OnyxCollection<Report>;
+                let allReportNameValuePairs: OnyxCollection<ReportNameValuePairs>;
 
-            await getOnyxData({
-                key: ONYXKEYS.COLLECTION.REPORT_ACTIONS,
-                waitForCollectionCallback: true,
-                callback: (allReportActions) => {
-                    iouReportActionOnSelfDMReport = Object.values(allReportActions?.[`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${selfDMReport.reportID}`] ?? {}).find(
-                        (r) => r?.actionName === CONST.REPORT.ACTIONS.TYPE.IOU,
-                    );
-                    trackExpenseActionableWhisper = Object.values(allReportActions?.[`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${selfDMReport?.reportID}`] ?? {}).find(
-                        (r) => r?.actionName === CONST.REPORT.ACTIONS.TYPE.ACTIONABLE_TRACK_EXPENSE_WHISPER,
-                    );
-                },
-            });
+                await getOnyxData({
+                    key: ONYXKEYS.COLLECTION.TRANSACTION,
+                    waitForCollectionCallback: true,
+                    callback: (value) => {
+                        allTransactions = value;
+                    },
+                });
+                await getOnyxData({
+                    key: ONYXKEYS.COLLECTION.REPORT,
+                    waitForCollectionCallback: true,
+                    callback: (value) => {
+                        allReports = value;
+                    },
+                });
+                await getOnyxData({
+                    key: ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS,
+                    waitForCollectionCallback: true,
+                    callback: (value) => {
+                        allReportNameValuePairs = value;
+                    },
+                });
 
-            expect(isMoneyRequestAction(iouReportActionOnSelfDMReport) ? getOriginalMessage(iouReportActionOnSelfDMReport)?.IOUTransactionID : undefined).toBe(transaction?.transactionID);
-            expect(trackExpenseActionableWhisper).toBeDefined();
+                // When splitting the held expense
+                updateSplitTransactionsFromSplitExpensesFlow({
+                    allTransactionsList: allTransactions,
+                    allReportsList: allReports,
+                    allReportNameValuePairsList: allReportNameValuePairs,
+                    transactionData: {
+                        reportID: draftTransaction?.reportID ?? String(CONST.DEFAULT_NUMBER_ID),
+                        originalTransactionID: draftTransaction?.comment?.originalTransactionID ?? String(CONST.DEFAULT_NUMBER_ID),
+                        splitExpenses: draftTransaction?.comment?.splitExpenses ?? [],
+                        splitExpensesTotal: draftTransaction?.comment?.splitExpensesTotal,
+                    },
+                    searchContext: {
+                        currentSearchHash: -2,
+                    },
+                    policyCategories: undefined,
+                    policy: undefined,
+                    policyRecentlyUsedCategories: [],
+                    iouReport: expenseReport,
+                    firstIOU,
+                    isASAPSubmitBetaEnabled: false,
+                    currentUserPersonalDetails,
+                    transactionViolations: {},
+                    policyRecentlyUsedCurrencies: [],
+                    quickAction: undefined,
+                });
 
-            if (!transaction || !expenseReport) {
-                return;
-            }
+                await waitForBatchedUpdates();
 
-            const {result} = renderHook(() => {
-                const [report] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${expenseReport?.reportID}`, {canBeMissing: true});
-                return {report};
-            });
+                // Then verify the split transactions were created
+                const split1 = await getOnyxValue(`${ONYXKEYS.COLLECTION.TRANSACTION}split-held-tx-1`);
+                const split2 = await getOnyxValue(`${ONYXKEYS.COLLECTION.TRANSACTION}split-held-tx-2`);
 
-            await waitFor(() => {
-                expect(result.current.report).toBeDefined();
-            });
+                expect(split1).toBeDefined();
+                expect(split2).toBeDefined();
 
-            changeTransactionsReport({
-                transactionIDs: [transaction?.transactionID],
-                isASAPSubmitBetaEnabled: false,
-                accountID: CARLOS_ACCOUNT_ID,
-                email: CARLOS_EMAIL,
-                newReport: result.current.report,
-                allTransactions,
-            });
+                // Find the transaction thread reports for each split by looking at the IOU actions
+                let split1ThreadReportID: string | undefined;
+                let split2ThreadReportID: string | undefined;
 
-            let updatedTransaction: OnyxEntry<Transaction>;
-            let updatedIOUReportActionOnSelfDMReport: OnyxEntry<ReportAction>;
-            let updatedTrackExpenseActionableWhisper: OnyxEntry<ReportAction>;
-            let updatedExpenseReport: OnyxEntry<Report>;
+                await getOnyxData({
+                    key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${expenseReport?.reportID}`,
+                    waitForCollectionCallback: false,
+                    callback: (allReportsAction) => {
+                        const iouActions = Object.values(allReportsAction ?? {}).filter((reportAction): reportAction is ReportAction<typeof CONST.REPORT.ACTIONS.TYPE.IOU> =>
+                            isMoneyRequestAction(reportAction),
+                        );
+                        for (const action of iouActions) {
+                            const message = isMoneyRequestAction(action) ? getOriginalMessage(action) : undefined;
+                            if (message?.IOUTransactionID === 'split-held-tx-1') {
+                                split1ThreadReportID = action.childReportID;
+                            } else if (message?.IOUTransactionID === 'split-held-tx-2') {
+                                split2ThreadReportID = action.childReportID;
+                            }
+                        }
+                    },
+                });
 
-            await getOnyxData({
-                key: ONYXKEYS.COLLECTION.TRANSACTION,
-                waitForCollectionCallback: true,
-                callback: (transactions) => {
-                    updatedTransaction = Object.values(transactions ?? {}).find((t) => t?.transactionID === transaction?.transactionID);
-                },
-            });
+                // Verify that split transaction thread IDs exist
+                expect(split1ThreadReportID).toBeDefined();
+                expect(split2ThreadReportID).toBeDefined();
+
+                // Verify each split transaction thread has hold report actions
+                // When splitting a held expense, new hold report actions should be created for each split
+                if (split1ThreadReportID) {
+                    const split1ReportActions = await getOnyxValue(`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${split1ThreadReportID}`);
+                    const split1HoldActions = Object.values(split1ReportActions ?? {}).filter((action) => action?.actionName === CONST.REPORT.ACTIONS.TYPE.HOLD);
+                    const split1CommentActions = Object.values(split1ReportActions ?? {}).filter((action) => action?.actionName === CONST.REPORT.ACTIONS.TYPE.ADD_COMMENT);
+
+                    // Should have at least one HOLD action and one ADD_COMMENT action (the hold comment)
+                    // The hold actions are created optimistically with pendingAction: ADD, but this
+                    // may be cleared to null after the API call succeeds
+                    expect(split1HoldActions.length).toBeGreaterThanOrEqual(1);
+                    expect(split1CommentActions.length).toBeGreaterThanOrEqual(1);
+                }
 
-            await getOnyxData({
-                key: ONYXKEYS.COLLECTION.REPORT_ACTIONS,
-                waitForCollectionCallback: true,
-                callback: (allReportActions) => {
-                    updatedIOUReportActionOnSelfDMReport = Object.values(allReportActions?.[`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${selfDMReport.reportID}`] ?? {}).find(
-                        (r) => r?.actionName === CONST.REPORT.ACTIONS.TYPE.IOU,
-                    );
-                    updatedTrackExpenseActionableWhisper = Object.values(allReportActions?.[`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${selfDMReport?.reportID}`] ?? {}).find(
-                        (r) => r?.actionName === CONST.REPORT.ACTIONS.TYPE.ACTIONABLE_TRACK_EXPENSE_WHISPER,
-                    );
-                },
-            });
+                if (split2ThreadReportID) {
+                    const split2ReportActions = await getOnyxValue(`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${split2ThreadReportID}`);
+                    const split2HoldActions = Object.values(split2ReportActions ?? {}).filter((action) => action?.actionName === CONST.REPORT.ACTIONS.TYPE.HOLD);
+                    const split2CommentActions = Object.values(split2ReportActions ?? {}).filter((action) => action?.actionName === CONST.REPORT.ACTIONS.TYPE.ADD_COMMENT);
 
-            await getOnyxData({
-                key: ONYXKEYS.COLLECTION.REPORT,
-                waitForCollectionCallback: true,
-                callback: (allReports) => {
-                    updatedExpenseReport = Object.values(allReports ?? {}).find((r) => r?.reportID === expenseReport?.reportID);
-                },
+                    // Should have at least one HOLD action and one ADD_COMMENT action (the hold comment)
+                    expect(split2HoldActions.length).toBeGreaterThanOrEqual(1);
+                    expect(split2CommentActions.length).toBeGreaterThanOrEqual(1);
+                }
             });
-
-            expect(updatedTransaction?.reportID).toBe(expenseReport?.reportID);
-            expect(isMoneyRequestAction(updatedIOUReportActionOnSelfDMReport) ? getOriginalMessage(updatedIOUReportActionOnSelfDMReport)?.IOUTransactionID : undefined).toBe(undefined);
-            expect(updatedTrackExpenseActionableWhisper).toBe(undefined);
-            expect(updatedExpenseReport?.nonReimbursableTotal).toBe(-amount);
-            expect(updatedExpenseReport?.total).toBe(-amount);
-            expect(updatedExpenseReport?.unheldNonReimbursableTotal).toBe(-amount);
         });
     });
 
@@ -8416,7 +10105,6 @@ describe('actions/IOU', () => {
                 currentUserAccountIDParam: 123,
                 currentUserEmailParam: '',
                 isASAPSubmitBetaEnabled: false,
-                parentReportNextStep: undefined,
             });
             await waitForBatchedUpdates();
 
@@ -8468,7 +10156,6 @@ describe('actions/IOU', () => {
                 currentUserAccountIDParam: currentUserPersonalDetails.accountID,
                 currentUserEmailParam: currentUserPersonalDetails.email ?? '',
                 isASAPSubmitBetaEnabled: false,
-                parentReportNextStep: undefined,
             });
 
             waitForBatchedUpdates();
diff --git a/tests/actions/IOUTest/DuplicateTest.ts b/tests/actions/IOUTest/DuplicateTest.ts
index 5f60632f0d6a..8aafaeb5c1e0 100644
--- a/tests/actions/IOUTest/DuplicateTest.ts
+++ b/tests/actions/IOUTest/DuplicateTest.ts
@@ -7,7 +7,7 @@ import initOnyxDerivedValues from '@libs/actions/OnyxDerived';
 import {WRITE_COMMANDS} from '@libs/API/types';
 import {getOriginalMessage} from '@libs/ReportActionsUtils';
 import {buildOptimisticIOUReport, buildOptimisticIOUReportAction} from '@libs/ReportUtils';
-import {buildOptimisticTransaction, isTimeRequest} from '@libs/TransactionUtils';
+import {buildOptimisticTransaction} from '@libs/TransactionUtils';
 import CONST from '@src/CONST';
 import IntlStore from '@src/languages/IntlStore';
 import OnyxUpdateManager from '@src/libs/actions/OnyxUpdateManager';
@@ -690,8 +690,6 @@ describe('actions/Duplicate', () => {
                 },
             };
 
-            await Onyx.clear();
-
             duplicateExpenseTransaction({
                 transaction: mockCashExpenseTransaction,
                 optimisticChatReportID: mockOptimisticChatReportID,
@@ -724,64 +722,6 @@ describe('actions/Duplicate', () => {
             // The duplicated transaction should have a different transactionID than the original
             expect(duplicatedTransaction?.transactionID).not.toBe(mockCashExpenseTransaction.transactionID);
         });
-
-        it('should create a duplicate time expense successfully', async () => {
-            const transactionID = 'time-1';
-            const HOURLY_RATE = 9.99;
-            const HOURS_WORKED = 15;
-            const AMOUNT_CENTS = Math.round(HOURS_WORKED * HOURLY_RATE * 100);
-
-            const mockTimeExpenseTransaction = {
-                ...mockTransaction,
-                transactionID,
-                amount: AMOUNT_CENTS,
-                comment: {
-                    type: 'time' as const,
-                    units: {
-                        unit: 'h' as const,
-                        count: HOURS_WORKED,
-                        rate: HOURLY_RATE,
-                    },
-                },
-            };
-
-            await Onyx.clear();
-
-            duplicateExpenseTransaction({
-                transaction: mockTimeExpenseTransaction,
-                optimisticChatReportID: mockOptimisticChatReportID,
-                optimisticIOUReportID: mockOptimisticIOUReportID,
-                isASAPSubmitBetaEnabled: mockIsASAPSubmitBetaEnabled,
-                introSelected: undefined,
-                activePolicyID: undefined,
-                quickAction: undefined,
-                policyRecentlyUsedCurrencies: [],
-                targetPolicy: mockPolicy,
-                targetPolicyCategories: fakePolicyCategories,
-                targetReport: policyExpenseChat,
-            });
-
-            await waitForBatchedUpdates();
-
-            let duplicatedTransaction: OnyxEntry<Transaction>;
-
-            await getOnyxData({
-                key: ONYXKEYS.COLLECTION.TRANSACTION,
-                waitForCollectionCallback: true,
-                callback: (allTransactions) => {
-                    const transactions = Object.values(allTransactions ?? {}).filter((t) => !!t);
-                    expect(transactions).toHaveLength(1);
-                    duplicatedTransaction = transactions.at(0);
-                },
-            });
-
-            expect(duplicatedTransaction?.transactionID).not.toBe(transactionID);
-            expect(duplicatedTransaction?.comment?.units?.count).toEqual(HOURS_WORKED);
-            expect(duplicatedTransaction?.comment?.units?.rate).toEqual(HOURLY_RATE);
-            expect(duplicatedTransaction?.comment?.units?.unit).toBe('h');
-            expect(duplicatedTransaction?.comment?.type).toBe('time');
-            expect(isTimeRequest(duplicatedTransaction)).toBeTruthy();
-        });
     });
 
     describe('resolveDuplicate', () => {
diff --git a/tests/actions/IOUTest/SplitTest.ts b/tests/actions/IOUTest/SplitTest.ts
deleted file mode 100644
index 951804863c4f..000000000000
--- a/tests/actions/IOUTest/SplitTest.ts
+++ /dev/null
@@ -1,2315 +0,0 @@
-/* eslint-disable @typescript-eslint/no-unsafe-member-access */
-/* eslint-disable @typescript-eslint/no-unsafe-assignment */
-import {deepEqual} from 'fast-equals';
-import Onyx from 'react-native-onyx';
-import type {OnyxCollection, OnyxEntry} from 'react-native-onyx';
-import {requestMoney} from '@libs/actions/IOU';
-import {putOnHold} from '@libs/actions/IOU/Hold';
-import initOnyxDerivedValues from '@libs/actions/OnyxDerived';
-import {createWorkspace, generatePolicyID, setWorkspaceApprovalMode} from '@libs/actions/Policy/Policy';
-import {rand64} from '@libs/NumberUtils';
-import {getOriginalMessage, isActionOfType, isMoneyRequestAction} from '@libs/ReportActionsUtils';
-import {buildOptimisticIOUReportAction} from '@libs/ReportUtils';
-import {completeSplitBill, splitBill, startSplitBill, updateSplitTransactionsFromSplitExpensesFlow} from '@userActions/IOU/Split';
-import CONST from '@src/CONST';
-import IntlStore from '@src/languages/IntlStore';
-import DateUtils from '@src/libs/DateUtils';
-import ONYXKEYS from '@src/ONYXKEYS';
-import type {RecentlyUsedTags, Report, ReportNameValuePairs, SearchResults} from '@src/types/onyx';
-import type {SplitExpense} from '@src/types/onyx/IOU';
-import type {CurrentUserPersonalDetails} from '@src/types/onyx/PersonalDetails';
-import type {Participant} from '@src/types/onyx/Report';
-import type ReportAction from '@src/types/onyx/ReportAction';
-import type Transaction from '@src/types/onyx/Transaction';
-import {toCollectionDataSet} from '@src/types/utils/CollectionDataSet';
-import {isEmptyObject} from '@src/types/utils/EmptyObject';
-import currencyList from '../../unit/currencyList.json';
-import createPersonalDetails from '../../utils/collections/personalDetails';
-import {createRandomReport} from '../../utils/collections/reports';
-import getOnyxValue from '../../utils/getOnyxValue';
-import type {MockFetch} from '../../utils/TestHelper';
-import {getGlobalFetchMock, getOnyxData} from '../../utils/TestHelper';
-import waitForBatchedUpdates from '../../utils/waitForBatchedUpdates';
-import waitForNetworkPromises from '../../utils/waitForNetworkPromises';
-
-jest.mock('@src/libs/Navigation/Navigation', () => ({
-    navigate: jest.fn(),
-    dismissModal: jest.fn(),
-    dismissModalWithReport: jest.fn(),
-    dismissToSuperWideRHP: jest.fn(),
-    goBack: jest.fn(),
-    getTopmostReportId: jest.fn(() => '23423423'),
-    setNavigationActionToMicrotaskQueue: jest.fn(),
-    removeScreenByKey: jest.fn(),
-    isNavigationReady: jest.fn(() => Promise.resolve()),
-    getReportRouteByID: jest.fn(),
-    getActiveRouteWithoutParams: jest.fn(),
-    getActiveRoute: jest.fn(),
-    navigationRef: {
-        getRootState: jest.fn(),
-    },
-}));
-
-jest.mock('@react-navigation/native');
-
-jest.mock('@src/libs/actions/Report', () => {
-    // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
-    const originalModule = jest.requireActual('@src/libs/actions/Report');
-    // eslint-disable-next-line @typescript-eslint/no-unsafe-return
-    return {
-        ...originalModule,
-        notifyNewAction: jest.fn(),
-    };
-});
-
-jest.mock('@libs/Navigation/helpers/isSearchTopmostFullScreenRoute', () => jest.fn());
-
-const unapprovedCashHash = 71801560;
-jest.mock('@src/libs/SearchQueryUtils', () => {
-    // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
-    const actual = jest.requireActual('@src/libs/SearchQueryUtils');
-    // eslint-disable-next-line @typescript-eslint/no-unsafe-return
-    return {
-        ...actual,
-        getCurrentSearchQueryJSON: jest.fn().mockImplementation(() => ({
-            hash: unapprovedCashHash,
-            query: 'test',
-            type: 'expense',
-            status: ['drafts', 'outstanding'],
-            filters: {operator: 'eq', left: 'reimbursable', right: 'yes'},
-            flatFilters: [{key: 'reimbursable', filters: [{operator: 'eq', value: 'yes'}]}],
-            inputQuery: '',
-            recentSearchHash: 89,
-            similarSearchHash: 1832274510,
-            sortBy: 'tag',
-            sortOrder: 'asc',
-        })),
-        buildCannedSearchQuery: jest.fn(),
-    };
-});
-
-// Test user constants
-const CARLOS_EMAIL = 'cmartins@expensifail.com';
-const CARLOS_ACCOUNT_ID = 1;
-const CARLOS_PARTICIPANT: Participant = {notificationPreference: CONST.REPORT.NOTIFICATION_PREFERENCE.ALWAYS, role: 'member'};
-const JULES_EMAIL = 'jules@expensifail.com';
-const JULES_ACCOUNT_ID = 2;
-const JULES_PARTICIPANT: Participant = {notificationPreference: CONST.REPORT.NOTIFICATION_PREFERENCE.ALWAYS, role: 'member'};
-const RORY_EMAIL = 'rory@expensifail.com';
-const RORY_ACCOUNT_ID = 3;
-const RORY_PARTICIPANT: Participant = {notificationPreference: CONST.REPORT.NOTIFICATION_PREFERENCE.ALWAYS, role: 'admin'};
-const VIT_EMAIL = 'vit@expensifail.com';
-const VIT_ACCOUNT_ID = 4;
-const VIT_PARTICIPANT: Participant = {notificationPreference: CONST.REPORT.NOTIFICATION_PREFERENCE.ALWAYS, role: 'member'};
-
-const currentUserPersonalDetails: CurrentUserPersonalDetails = {
-    ...createPersonalDetails(RORY_ACCOUNT_ID),
-    login: RORY_EMAIL,
-    email: RORY_EMAIL,
-    displayName: RORY_EMAIL,
-    avatar: 'https://example.com/avatar.jpg',
-};
-
-let mockFetch: MockFetch;
-
-beforeAll(() => {
-    Onyx.init({
-        keys: ONYXKEYS,
-        initialKeyStates: {
-            [ONYXKEYS.SESSION]: {accountID: RORY_ACCOUNT_ID, email: RORY_EMAIL},
-            [ONYXKEYS.PERSONAL_DETAILS_LIST]: {[RORY_ACCOUNT_ID]: {accountID: RORY_ACCOUNT_ID, login: RORY_EMAIL}},
-            [ONYXKEYS.CURRENCY_LIST]: currencyList,
-        },
-    });
-    initOnyxDerivedValues();
-    IntlStore.load(CONST.LOCALES.EN);
-    return waitForBatchedUpdates();
-});
-
-beforeEach(() => {
-    jest.clearAllTimers();
-    global.fetch = getGlobalFetchMock();
-    mockFetch = fetch as MockFetch;
-    return Onyx.clear().then(waitForBatchedUpdates);
-});
-
-afterEach(() => {
-    jest.clearAllMocks();
-});
-
-describe('split expense', () => {
-    it('creates and updates new chats and IOUs as needed', () => {
-        jest.setTimeout(10 * 1000);
-        /*
-         * Given that:
-         *   - Rory and Carlos have chatted before
-         *   - Rory and Jules have chatted before and have an active IOU report
-         *   - Rory and Vit have never chatted together before
-         *   - There is no existing group chat with the four of them
-         */
-        const amount = 400;
-        const comment = 'Yes, I am splitting a bill for $4 USD';
-        const merchant = 'Yema Kitchen';
-        let carlosChatReport: OnyxEntry<Report> = {
-            reportID: rand64(),
-            type: CONST.REPORT.TYPE.CHAT,
-            participants: {[RORY_ACCOUNT_ID]: RORY_PARTICIPANT, [CARLOS_ACCOUNT_ID]: CARLOS_PARTICIPANT},
-        };
-        const carlosCreatedAction: OnyxEntry<ReportAction> = {
-            reportActionID: rand64(),
-            actionName: CONST.REPORT.ACTIONS.TYPE.CREATED,
-            created: DateUtils.getDBTime(),
-            reportID: carlosChatReport.reportID,
-        };
-        const julesIOUReportID = rand64();
-        let julesChatReport: OnyxEntry<Report> = {
-            reportID: rand64(),
-            type: CONST.REPORT.TYPE.CHAT,
-            iouReportID: julesIOUReportID,
-            participants: {[RORY_ACCOUNT_ID]: RORY_PARTICIPANT, [JULES_ACCOUNT_ID]: JULES_PARTICIPANT},
-        };
-        const julesChatCreatedAction: OnyxEntry<ReportAction> = {
-            reportActionID: rand64(),
-            actionName: CONST.REPORT.ACTIONS.TYPE.CREATED,
-            created: DateUtils.getDBTime(),
-            reportID: julesChatReport.reportID,
-        };
-        const julesCreatedAction: OnyxEntry<ReportAction> = {
-            reportActionID: rand64(),
-            actionName: CONST.REPORT.ACTIONS.TYPE.CREATED,
-            created: DateUtils.getDBTime(),
-            reportID: julesIOUReportID,
-        };
-        jest.advanceTimersByTime(200);
-        const julesExistingTransaction: OnyxEntry<Transaction> = {
-            transactionID: rand64(),
-            amount: 1000,
-            comment: {
-                comment: 'This is an existing transaction',
-                attendees: [{email: 'text@expensify.com', displayName: 'Test User', avatarUrl: ''}],
-            },
-            created: DateUtils.getDBTime(),
-            currency: '',
-            merchant: '',
-            reportID: '',
-        };
-        let julesIOUReport: OnyxEntry<Report> = {
-            reportID: julesIOUReportID,
-            chatReportID: julesChatReport.reportID,
-            type: CONST.REPORT.TYPE.IOU,
-            ownerAccountID: RORY_ACCOUNT_ID,
-            managerID: JULES_ACCOUNT_ID,
-            currency: CONST.CURRENCY.USD,
-            total: julesExistingTransaction?.amount,
-        };
-        const julesExistingIOUAction: OnyxEntry<ReportAction> = {
-            reportActionID: rand64(),
-            actionName: CONST.REPORT.ACTIONS.TYPE.IOU,
-            actorAccountID: RORY_ACCOUNT_ID,
-            created: DateUtils.getDBTime(),
-            originalMessage: {
-                IOUReportID: julesIOUReportID,
-                IOUTransactionID: julesExistingTransaction?.transactionID,
-                amount: julesExistingTransaction?.amount ?? 0,
-                currency: CONST.CURRENCY.USD,
-                type: CONST.IOU.REPORT_ACTION_TYPE.CREATE,
-                participantAccountIDs: [RORY_ACCOUNT_ID, JULES_ACCOUNT_ID],
-            },
-            reportID: julesIOUReportID,
-        };
-
-        let carlosIOUReport: OnyxEntry<Report>;
-        let carlosIOUAction: OnyxEntry<ReportAction<typeof CONST.REPORT.ACTIONS.TYPE.IOU>>;
-        let carlosIOUCreatedAction: OnyxEntry<ReportAction>;
-        let carlosTransaction: OnyxEntry<Transaction>;
-
-        let julesIOUAction: OnyxEntry<ReportAction<typeof CONST.REPORT.ACTIONS.TYPE.IOU>>;
-        let julesIOUCreatedAction: OnyxEntry<ReportAction>;
-        let julesTransaction: OnyxEntry<Transaction>;
-
-        let vitChatReport: OnyxEntry<Report>;
-        let vitIOUReport: OnyxEntry<Report>;
-        let vitCreatedAction: OnyxEntry<ReportAction>;
-        let vitIOUAction: OnyxEntry<ReportAction<typeof CONST.REPORT.ACTIONS.TYPE.IOU>>;
-        let vitTransaction: OnyxEntry<Transaction>;
-
-        let groupChat: OnyxEntry<Report>;
-        let groupCreatedAction: OnyxEntry<ReportAction>;
-        let groupIOUAction: OnyxEntry<ReportAction<typeof CONST.REPORT.ACTIONS.TYPE.IOU>>;
-        let groupTransaction: OnyxEntry<Transaction>;
-
-        const reportCollectionDataSet = toCollectionDataSet(ONYXKEYS.COLLECTION.REPORT, [carlosChatReport, julesChatReport, julesIOUReport], (item) => item.reportID);
-
-        const carlosActionsCollectionDataSet = toCollectionDataSet(
-            `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}`,
-            [
-                {
-                    [carlosCreatedAction.reportActionID]: carlosCreatedAction,
-                },
-            ],
-            (item) => item[carlosCreatedAction.reportActionID].reportID,
-        );
-
-        const julesActionsCollectionDataSet = toCollectionDataSet(
-            `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}`,
-            [
-                {
-                    [julesCreatedAction.reportActionID]: julesCreatedAction,
-                    [julesExistingIOUAction.reportActionID]: julesExistingIOUAction,
-                },
-            ],
-            (item) => item[julesCreatedAction.reportActionID].reportID,
-        );
-
-        const julesCreatedActionsCollectionDataSet = toCollectionDataSet(
-            `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}`,
-            [
-                {
-                    [julesChatCreatedAction.reportActionID]: julesChatCreatedAction,
-                },
-            ],
-            (item) => item[julesChatCreatedAction.reportActionID].reportID,
-        );
-
-        // @ts-expect-error - will be solved in https://github.com/Expensify/App/issues/73830
-        return Onyx.mergeCollection(ONYXKEYS.COLLECTION.REPORT, {
-            ...reportCollectionDataSet,
-        })
-            .then(() =>
-                // @ts-expect-error - will be solved in https://github.com/Expensify/App/issues/73830
-                Onyx.mergeCollection(ONYXKEYS.COLLECTION.REPORT_ACTIONS, {
-                    ...carlosActionsCollectionDataSet,
-                    ...julesCreatedActionsCollectionDataSet,
-                    ...julesActionsCollectionDataSet,
-                }),
-            )
-            .then(() => Onyx.set(`${ONYXKEYS.COLLECTION.TRANSACTION}${julesExistingTransaction?.transactionID}`, julesExistingTransaction))
-            .then(() => {
-                // When we split a bill offline
-                mockFetch?.pause?.();
-                splitBill(
-                    // TODO: Migrate after the backend accepts accountIDs
-                    {
-                        participants: [
-                            [CARLOS_EMAIL, String(CARLOS_ACCOUNT_ID)],
-                            [JULES_EMAIL, String(JULES_ACCOUNT_ID)],
-                            [VIT_EMAIL, String(VIT_ACCOUNT_ID)],
-                        ].map(([email, accountID]) => ({login: email, accountID: Number(accountID)})),
-                        currentUserLogin: RORY_EMAIL,
-                        currentUserAccountID: RORY_ACCOUNT_ID,
-                        amount,
-                        comment,
-                        currency: CONST.CURRENCY.USD,
-                        merchant,
-                        created: '',
-                        tag: '',
-                        existingSplitChatReportID: '',
-                        isASAPSubmitBetaEnabled: false,
-                        transactionViolations: {},
-                        quickAction: undefined,
-                        policyRecentlyUsedCurrencies: [],
-                        policyRecentlyUsedTags: undefined,
-                    },
-                );
-                return waitForBatchedUpdates();
-            })
-            .then(
-                () =>
-                    new Promise<void>((resolve) => {
-                        const connection = Onyx.connect({
-                            key: ONYXKEYS.COLLECTION.REPORT,
-                            waitForCollectionCallback: true,
-                            callback: (allReports) => {
-                                Onyx.disconnect(connection);
-
-                                // There should now be 10 reports
-                                expect(Object.values(allReports ?? {}).length).toBe(10);
-
-                                // 1. The chat report with Rory + Carlos
-                                carlosChatReport = Object.values(allReports ?? {}).find((report) => report?.reportID === carlosChatReport?.reportID);
-                                expect(isEmptyObject(carlosChatReport)).toBe(false);
-                                expect(carlosChatReport?.pendingFields).toBeFalsy();
-
-                                // 2. The IOU report with Rory + Carlos (new)
-                                carlosIOUReport = Object.values(allReports ?? {}).find((report) => report?.type === CONST.REPORT.TYPE.IOU && report.managerID === CARLOS_ACCOUNT_ID);
-                                expect(isEmptyObject(carlosIOUReport)).toBe(false);
-                                expect(carlosIOUReport?.total).toBe(amount / 4);
-
-                                // 3. The chat report with Rory + Jules
-                                julesChatReport = Object.values(allReports ?? {}).find((report) => report?.reportID === julesChatReport?.reportID);
-                                expect(isEmptyObject(julesChatReport)).toBe(false);
-                                expect(julesChatReport?.pendingFields).toBeFalsy();
-
-                                // 4. The IOU report with Rory + Jules
-                                julesIOUReport = Object.values(allReports ?? {}).find((report) => report?.reportID === julesIOUReport?.reportID);
-                                expect(isEmptyObject(julesIOUReport)).toBe(false);
-                                expect(julesChatReport?.pendingFields).toBeFalsy();
-                                expect(julesIOUReport?.total).toBe((julesExistingTransaction?.amount ?? 0) + amount / 4);
-
-                                // 5. The chat report with Rory + Vit (new)
-                                vitChatReport = Object.values(allReports ?? {}).find(
-                                    (report) =>
-                                        report?.type === CONST.REPORT.TYPE.CHAT && deepEqual(report.participants, {[RORY_ACCOUNT_ID]: RORY_PARTICIPANT, [VIT_ACCOUNT_ID]: VIT_PARTICIPANT}),
-                                );
-                                expect(isEmptyObject(vitChatReport)).toBe(false);
-                                expect(vitChatReport?.pendingFields).toStrictEqual({createChat: CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD});
-
-                                // 6. The IOU report with Rory + Vit (new)
-                                vitIOUReport = Object.values(allReports ?? {}).find((report) => report?.type === CONST.REPORT.TYPE.IOU && report.managerID === VIT_ACCOUNT_ID);
-                                expect(isEmptyObject(vitIOUReport)).toBe(false);
-                                expect(vitIOUReport?.total).toBe(amount / 4);
-
-                                // 7. The group chat with everyone
-                                groupChat = Object.values(allReports ?? {}).find(
-                                    (report) =>
-                                        report?.type === CONST.REPORT.TYPE.CHAT &&
-                                        deepEqual(report.participants, {
-                                            [CARLOS_ACCOUNT_ID]: CARLOS_PARTICIPANT,
-                                            [JULES_ACCOUNT_ID]: JULES_PARTICIPANT,
-                                            [VIT_ACCOUNT_ID]: VIT_PARTICIPANT,
-                                            [RORY_ACCOUNT_ID]: RORY_PARTICIPANT,
-                                        }),
-                                );
-                                expect(isEmptyObject(groupChat)).toBe(false);
-                                expect(groupChat?.pendingFields).toStrictEqual({createChat: CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD});
-
-                                // The 1:1 chat reports and the IOU reports should be linked together
-                                expect(carlosChatReport?.iouReportID).toBe(carlosIOUReport?.reportID);
-                                expect(carlosIOUReport?.chatReportID).toBe(carlosChatReport?.reportID);
-                                for (const participant of Object.values(carlosIOUReport?.participants ?? {})) {
-                                    expect(participant.notificationPreference).toBe(CONST.REPORT.NOTIFICATION_PREFERENCE.HIDDEN);
-                                }
-
-                                expect(julesChatReport?.iouReportID).toBe(julesIOUReport?.reportID);
-                                expect(julesIOUReport?.chatReportID).toBe(julesChatReport?.reportID);
-
-                                expect(vitChatReport?.iouReportID).toBe(vitIOUReport?.reportID);
-                                expect(vitIOUReport?.chatReportID).toBe(vitChatReport?.reportID);
-
-                                resolve();
-                            },
-                        });
-                    }),
-            )
-            .then(
-                () =>
-                    new Promise<void>((resolve) => {
-                        const connection = Onyx.connect({
-                            key: ONYXKEYS.COLLECTION.REPORT_ACTIONS,
-                            waitForCollectionCallback: true,
-                            callback: (allReportActions) => {
-                                Onyx.disconnect(connection);
-
-                                // There should be reportActions on all 7 chat reports + 3 IOU reports in each 1:1 chat
-                                expect(Object.values(allReportActions ?? {}).length).toBe(10);
-
-                                const carlosReportActions = allReportActions?.[`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${carlosChatReport?.iouReportID}`];
-                                const julesReportActions = allReportActions?.[`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${julesChatReport?.iouReportID}`];
-                                const vitReportActions = allReportActions?.[`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${vitChatReport?.iouReportID}`];
-                                const groupReportActions = allReportActions?.[`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${groupChat?.reportID}`];
-
-                                // Carlos DM should have two reportActions – the existing CREATED action and a pending IOU action
-                                expect(Object.values(carlosReportActions ?? {}).length).toBe(2);
-                                carlosIOUCreatedAction = Object.values(carlosReportActions ?? {}).find(
-                                    (reportAction): reportAction is ReportAction<typeof CONST.REPORT.ACTIONS.TYPE.IOU> => reportAction.actionName === CONST.REPORT.ACTIONS.TYPE.CREATED,
-                                );
-                                carlosIOUAction = Object.values(carlosReportActions ?? {}).find((reportAction): reportAction is ReportAction<typeof CONST.REPORT.ACTIONS.TYPE.IOU> =>
-                                    isMoneyRequestAction(reportAction),
-                                );
-                                const carlosOriginalMessage = carlosIOUAction ? getOriginalMessage(carlosIOUAction) : undefined;
-
-                                expect(carlosIOUAction?.pendingAction).toBe(CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD);
-                                expect(carlosOriginalMessage?.IOUReportID).toBe(carlosIOUReport?.reportID);
-                                expect(carlosOriginalMessage?.amount).toBe(amount / 4);
-                                expect(carlosOriginalMessage?.comment).toBe(comment);
-                                expect(carlosOriginalMessage?.type).toBe(CONST.IOU.REPORT_ACTION_TYPE.CREATE);
-                                expect(Date.parse(carlosIOUCreatedAction?.created ?? '')).toBeLessThan(Date.parse(carlosIOUAction?.created ?? ''));
-
-                                // Jules DM should have three reportActions, the existing CREATED action, the existing IOU action, and a new pending IOU action
-                                expect(Object.values(julesReportActions ?? {}).length).toBe(3);
-                                expect(julesReportActions?.[julesCreatedAction.reportActionID]).toStrictEqual(julesCreatedAction);
-                                julesIOUCreatedAction = Object.values(julesReportActions ?? {}).find(
-                                    (reportAction): reportAction is ReportAction<typeof CONST.REPORT.ACTIONS.TYPE.IOU> => reportAction.actionName === CONST.REPORT.ACTIONS.TYPE.CREATED,
-                                );
-                                julesIOUAction = Object.values(julesReportActions ?? {}).find(
-                                    (reportAction): reportAction is ReportAction<typeof CONST.REPORT.ACTIONS.TYPE.IOU> =>
-                                        reportAction.reportActionID !== julesCreatedAction.reportActionID && reportAction.reportActionID !== julesExistingIOUAction.reportActionID,
-                                );
-                                const julesOriginalMessage = julesIOUAction ? getOriginalMessage(julesIOUAction) : undefined;
-
-                                expect(julesIOUAction?.pendingAction).toBe(CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD);
-                                expect(julesOriginalMessage?.IOUReportID).toBe(julesIOUReport?.reportID);
-                                expect(julesOriginalMessage?.amount).toBe(amount / 4);
-                                expect(julesOriginalMessage?.comment).toBe(comment);
-                                expect(julesOriginalMessage?.type).toBe(CONST.IOU.REPORT_ACTION_TYPE.CREATE);
-                                expect(Date.parse(julesIOUCreatedAction?.created ?? '')).toBeLessThan(Date.parse(julesIOUAction?.created ?? ''));
-
-                                // Vit DM should have two reportActions – a pending CREATED action and a pending IOU action
-                                expect(Object.values(vitReportActions ?? {}).length).toBe(2);
-                                vitCreatedAction = Object.values(vitReportActions ?? {}).find(
-                                    (reportAction): reportAction is ReportAction<typeof CONST.REPORT.ACTIONS.TYPE.IOU> => reportAction.actionName === CONST.REPORT.ACTIONS.TYPE.CREATED,
-                                );
-                                vitIOUAction = Object.values(vitReportActions ?? {}).find((reportAction): reportAction is ReportAction<typeof CONST.REPORT.ACTIONS.TYPE.IOU> =>
-                                    isMoneyRequestAction(reportAction),
-                                );
-                                const vitOriginalMessage = vitIOUAction ? getOriginalMessage(vitIOUAction) : undefined;
-
-                                expect(vitCreatedAction?.pendingAction).toBe(CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD);
-                                expect(vitIOUAction?.pendingAction).toBe(CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD);
-                                expect(vitOriginalMessage?.IOUReportID).toBe(vitIOUReport?.reportID);
-                                expect(vitOriginalMessage?.amount).toBe(amount / 4);
-                                expect(vitOriginalMessage?.comment).toBe(comment);
-                                expect(vitOriginalMessage?.type).toBe(CONST.IOU.REPORT_ACTION_TYPE.CREATE);
-                                expect(Date.parse(vitCreatedAction?.created ?? '')).toBeLessThan(Date.parse(vitIOUAction?.created ?? ''));
-
-                                // Group chat should have two reportActions – a pending CREATED action and a pending IOU action w/ type SPLIT
-                                expect(Object.values(groupReportActions ?? {}).length).toBe(2);
-                                groupCreatedAction = Object.values(groupReportActions ?? {}).find((reportAction) => reportAction.actionName === CONST.REPORT.ACTIONS.TYPE.CREATED);
-                                groupIOUAction = Object.values(groupReportActions ?? {}).find((reportAction): reportAction is ReportAction<typeof CONST.REPORT.ACTIONS.TYPE.IOU> =>
-                                    isMoneyRequestAction(reportAction),
-                                );
-                                const groupOriginalMessage = groupIOUAction ? getOriginalMessage(groupIOUAction) : undefined;
-
-                                expect(groupCreatedAction?.pendingAction).toBe(CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD);
-                                expect(groupIOUAction?.pendingAction).toBe(CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD);
-                                expect(groupOriginalMessage).not.toHaveProperty('IOUReportID');
-                                expect(groupOriginalMessage?.type).toBe(CONST.IOU.REPORT_ACTION_TYPE.SPLIT);
-                                expect(Date.parse(groupCreatedAction?.created ?? '')).toBeLessThanOrEqual(Date.parse(groupIOUAction?.created ?? ''));
-
-                                resolve();
-                            },
-                        });
-                    }),
-            )
-            .then(
-                () =>
-                    new Promise<void>((resolve) => {
-                        const connection = Onyx.connect({
-                            key: ONYXKEYS.COLLECTION.TRANSACTION,
-                            waitForCollectionCallback: true,
-                            callback: (allTransactions) => {
-                                Onyx.disconnect(connection);
-
-                                /* There should be 5 transactions
-                                 *   – one existing one with Jules
-                                 *   - one for each of the three IOU reports
-                                 *   - one on the group chat w/ deleted report
-                                 */
-                                expect(Object.values(allTransactions ?? {}).length).toBe(5);
-                                expect(allTransactions?.[`${ONYXKEYS.COLLECTION.TRANSACTION}${julesExistingTransaction?.transactionID}`]).toBeTruthy();
-
-                                carlosTransaction = Object.values(allTransactions ?? {}).find(
-                                    (transaction) => carlosIOUAction && transaction?.transactionID === getOriginalMessage(carlosIOUAction)?.IOUTransactionID,
-                                );
-                                julesTransaction = Object.values(allTransactions ?? {}).find(
-                                    (transaction) => julesIOUAction && transaction?.transactionID === getOriginalMessage(julesIOUAction)?.IOUTransactionID,
-                                );
-                                vitTransaction = Object.values(allTransactions ?? {}).find(
-                                    (transaction) => vitIOUAction && transaction?.transactionID === getOriginalMessage(vitIOUAction)?.IOUTransactionID,
-                                );
-                                groupTransaction = Object.values(allTransactions ?? {}).find((transaction) => transaction?.reportID === CONST.REPORT.SPLIT_REPORT_ID);
-
-                                expect(carlosTransaction?.reportID).toBe(carlosIOUReport?.reportID);
-                                expect(julesTransaction?.reportID).toBe(julesIOUReport?.reportID);
-                                expect(vitTransaction?.reportID).toBe(vitIOUReport?.reportID);
-                                expect(groupTransaction).toBeTruthy();
-
-                                expect(carlosTransaction?.amount).toBe(amount / 4);
-                                expect(julesTransaction?.amount).toBe(amount / 4);
-                                expect(vitTransaction?.amount).toBe(amount / 4);
-                                expect(groupTransaction?.amount).toBe(amount);
-
-                                expect(carlosTransaction?.comment?.comment).toBe(comment);
-                                expect(julesTransaction?.comment?.comment).toBe(comment);
-                                expect(vitTransaction?.comment?.comment).toBe(comment);
-                                expect(groupTransaction?.comment?.comment).toBe(comment);
-
-                                expect(carlosTransaction?.merchant).toBe(merchant);
-                                expect(julesTransaction?.merchant).toBe(merchant);
-                                expect(vitTransaction?.merchant).toBe(merchant);
-                                expect(groupTransaction?.merchant).toBe(merchant);
-
-                                expect(carlosTransaction?.comment?.source).toBe(CONST.IOU.TYPE.SPLIT);
-                                expect(julesTransaction?.comment?.source).toBe(CONST.IOU.TYPE.SPLIT);
-                                expect(vitTransaction?.comment?.source).toBe(CONST.IOU.TYPE.SPLIT);
-
-                                expect(carlosTransaction?.comment?.originalTransactionID).toBe(groupTransaction?.transactionID);
-                                expect(julesTransaction?.comment?.originalTransactionID).toBe(groupTransaction?.transactionID);
-                                expect(vitTransaction?.comment?.originalTransactionID).toBe(groupTransaction?.transactionID);
-
-                                expect(carlosTransaction?.pendingAction).toBe(CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD);
-                                expect(julesTransaction?.pendingAction).toBe(CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD);
-                                expect(vitTransaction?.pendingAction).toBe(CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD);
-                                expect(groupTransaction?.pendingAction).toBe(CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD);
-
-                                resolve();
-                            },
-                        });
-                    }),
-            )
-            .then(
-                () =>
-                    new Promise<void>((resolve) => {
-                        const connection = Onyx.connect({
-                            key: ONYXKEYS.PERSONAL_DETAILS_LIST,
-                            waitForCollectionCallback: false,
-                            callback: (allPersonalDetails) => {
-                                Onyx.disconnect(connection);
-                                expect(allPersonalDetails).toMatchObject({
-                                    [VIT_ACCOUNT_ID]: {
-                                        accountID: VIT_ACCOUNT_ID,
-                                        displayName: VIT_EMAIL,
-                                        login: VIT_EMAIL,
-                                    },
-                                });
-                                resolve();
-                            },
-                        });
-                    }),
-            )
-            .then(mockFetch?.resume)
-            .then(waitForNetworkPromises)
-            .then(
-                () =>
-                    new Promise<void>((resolve) => {
-                        const connection = Onyx.connect({
-                            key: ONYXKEYS.COLLECTION.REPORT,
-                            waitForCollectionCallback: true,
-                            callback: (allReports) => {
-                                Onyx.disconnect(connection);
-                                for (const report of Object.values(allReports ?? {})) {
-                                    if (!report?.pendingFields) {
-                                        continue;
-                                    }
-                                    for (const pendingField of Object.values(report?.pendingFields)) {
-                                        expect(pendingField).toBeFalsy();
-                                    }
-                                }
-                                resolve();
-                            },
-                        });
-                    }),
-            )
-            .then(
-                () =>
-                    new Promise<void>((resolve) => {
-                        const connection = Onyx.connect({
-                            key: ONYXKEYS.COLLECTION.REPORT_ACTIONS,
-                            waitForCollectionCallback: true,
-                            callback: (allReportActions) => {
-                                Onyx.disconnect(connection);
-                                for (const reportAction of Object.values(allReportActions ?? {})) {
-                                    expect(reportAction?.pendingAction).toBeFalsy();
-                                }
-                                resolve();
-                            },
-                        });
-                    }),
-            )
-            .then(
-                () =>
-                    new Promise<void>((resolve) => {
-                        const connection = Onyx.connect({
-                            key: ONYXKEYS.COLLECTION.TRANSACTION,
-                            waitForCollectionCallback: true,
-                            callback: (allTransactions) => {
-                                Onyx.disconnect(connection);
-                                for (const transaction of Object.values(allTransactions ?? {})) {
-                                    expect(transaction?.pendingAction).toBeFalsy();
-                                }
-                                resolve();
-                            },
-                        });
-                    }),
-            );
-    });
-
-    it('should update split chat report lastVisibleActionCreated to the report preview action', async () => {
-        // Given a expense chat with no expenses
-        const workspaceReportID = '1';
-        await Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT}${workspaceReportID}`, {reportID: workspaceReportID, isOwnPolicyExpenseChat: true});
-
-        // When the user split bill on the workspace
-        splitBill({
-            participants: [{reportID: workspaceReportID}],
-            currentUserLogin: RORY_EMAIL,
-            currentUserAccountID: RORY_ACCOUNT_ID,
-            comment: '',
-            amount: 100,
-            currency: CONST.CURRENCY.USD,
-            merchant: 'test',
-            created: '',
-            existingSplitChatReportID: workspaceReportID,
-            isASAPSubmitBetaEnabled: false,
-            transactionViolations: {},
-            quickAction: undefined,
-            policyRecentlyUsedCurrencies: [],
-            policyRecentlyUsedTags: undefined,
-        });
-
-        await waitForBatchedUpdates();
-
-        // Then the expense chat lastVisibleActionCreated should be updated to the report preview action created
-        const reportPreviewAction = await new Promise<OnyxEntry<ReportAction>>((resolve) => {
-            const connection = Onyx.connect({
-                key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${workspaceReportID}`,
-                callback: (reportActions) => {
-                    Onyx.disconnect(connection);
-                    resolve(Object.values(reportActions ?? {}).find((action) => action.actionName === CONST.REPORT.ACTIONS.TYPE.REPORT_PREVIEW));
-                },
-            });
-        });
-
-        await new Promise<OnyxEntry<Report>>((resolve) => {
-            const connection = Onyx.connect({
-                key: `${ONYXKEYS.COLLECTION.REPORT}${workspaceReportID}`,
-                callback: (report) => {
-                    Onyx.disconnect(connection);
-                    expect(report?.lastVisibleActionCreated).toBe(reportPreviewAction?.created);
-                    resolve(report);
-                },
-            });
-        });
-    });
-
-    it('correctly sets quickAction', async () => {
-        // Given a expense chat with no expenses
-        const workspaceReportID = '1';
-        await Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT}${workspaceReportID}`, {reportID: workspaceReportID, isOwnPolicyExpenseChat: true});
-
-        splitBill({
-            participants: [{reportID: workspaceReportID}],
-            currentUserLogin: RORY_EMAIL,
-            currentUserAccountID: RORY_ACCOUNT_ID,
-            comment: '',
-            amount: 100,
-            currency: CONST.CURRENCY.USD,
-            merchant: 'test',
-            created: '',
-            existingSplitChatReportID: workspaceReportID,
-            isASAPSubmitBetaEnabled: false,
-            transactionViolations: {},
-            quickAction: undefined,
-            policyRecentlyUsedCurrencies: [],
-            policyRecentlyUsedTags: undefined,
-        });
-
-        await waitForBatchedUpdates();
-
-        expect(await getOnyxValue(ONYXKEYS.NVP_QUICK_ACTION_GLOBAL_CREATE)).toHaveProperty('isFirstQuickAction', true);
-
-        splitBill({
-            participants: [{reportID: workspaceReportID}],
-            currentUserLogin: RORY_EMAIL,
-            currentUserAccountID: RORY_ACCOUNT_ID,
-            comment: '',
-            amount: 100,
-            currency: CONST.CURRENCY.USD,
-            merchant: 'test',
-            created: '',
-            existingSplitChatReportID: workspaceReportID,
-            isASAPSubmitBetaEnabled: false,
-            transactionViolations: {},
-            quickAction: {action: CONST.QUICK_ACTIONS.SEND_MONEY, chatReportID: '456'},
-            policyRecentlyUsedCurrencies: [],
-            policyRecentlyUsedTags: undefined,
-        });
-        await waitForBatchedUpdates();
-
-        expect(await getOnyxValue(ONYXKEYS.NVP_QUICK_ACTION_GLOBAL_CREATE)).toMatchObject({
-            action: CONST.QUICK_ACTIONS.SPLIT_MANUAL,
-            isFirstQuickAction: false,
-        });
-    });
-
-    it('merges policyRecentlyUsedCurrencies when splitting a bill', async () => {
-        const initialCurrencies = [CONST.CURRENCY.USD];
-        await Onyx.set(ONYXKEYS.RECENTLY_USED_CURRENCIES, initialCurrencies);
-
-        splitBill({
-            participants: [{accountID: CARLOS_ACCOUNT_ID, login: CARLOS_EMAIL}],
-            currentUserLogin: RORY_EMAIL,
-            currentUserAccountID: RORY_ACCOUNT_ID,
-            comment: '',
-            amount: 100,
-            currency: CONST.CURRENCY.EUR,
-            merchant: 'test',
-            created: '',
-            existingSplitChatReportID: '',
-            isASAPSubmitBetaEnabled: false,
-            transactionViolations: {},
-            quickAction: undefined,
-            policyRecentlyUsedCurrencies: initialCurrencies,
-            policyRecentlyUsedTags: undefined,
-        });
-
-        await waitForBatchedUpdates();
-
-        const recentlyUsedCurrencies = await getOnyxValue(ONYXKEYS.RECENTLY_USED_CURRENCIES);
-        expect(recentlyUsedCurrencies).toEqual([CONST.CURRENCY.EUR, ...initialCurrencies]);
-    });
-
-    it('should update split chat report lastVisibleActionCreated to the latest IOU action when split bill in a DM', async () => {
-        // Given a DM chat with no expenses
-        const reportID = '1';
-        await Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT}${reportID}`, {
-            reportID,
-            type: CONST.REPORT.TYPE.CHAT,
-            participants: {[RORY_ACCOUNT_ID]: RORY_PARTICIPANT, [CARLOS_ACCOUNT_ID]: CARLOS_PARTICIPANT},
-        });
-
-        // When the user split bill twice on the DM
-        splitBill({
-            participants: [{accountID: CARLOS_ACCOUNT_ID, login: CARLOS_EMAIL}],
-            currentUserLogin: RORY_EMAIL,
-            currentUserAccountID: RORY_ACCOUNT_ID,
-            comment: '',
-            amount: 100,
-            currency: CONST.CURRENCY.USD,
-            merchant: 'test',
-            created: '',
-            existingSplitChatReportID: reportID,
-            isASAPSubmitBetaEnabled: false,
-            transactionViolations: {},
-            quickAction: undefined,
-            policyRecentlyUsedCurrencies: [],
-            policyRecentlyUsedTags: undefined,
-        });
-
-        await waitForBatchedUpdates();
-
-        splitBill({
-            participants: [{accountID: CARLOS_ACCOUNT_ID, login: CARLOS_EMAIL}],
-            currentUserLogin: RORY_EMAIL,
-            currentUserAccountID: RORY_ACCOUNT_ID,
-            comment: '',
-            amount: 200,
-            currency: CONST.CURRENCY.USD,
-            merchant: 'test',
-            created: '',
-            existingSplitChatReportID: reportID,
-            isASAPSubmitBetaEnabled: false,
-            transactionViolations: {},
-            quickAction: undefined,
-            policyRecentlyUsedCurrencies: [],
-            policyRecentlyUsedTags: undefined,
-        });
-
-        await waitForBatchedUpdates();
-
-        // Then the DM lastVisibleActionCreated should be updated to the second IOU action created
-        const iouAction = await new Promise<OnyxEntry<ReportAction>>((resolve) => {
-            const connection = Onyx.connect({
-                key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${reportID}`,
-                callback: (reportActions) => {
-                    Onyx.disconnect(connection);
-                    resolve(Object.values(reportActions ?? {}).find((action) => isActionOfType(action, CONST.REPORT.ACTIONS.TYPE.IOU) && getOriginalMessage(action)?.amount === 200));
-                },
-            });
-        });
-
-        const report = await new Promise<OnyxEntry<Report>>((resolve) => {
-            const connection = Onyx.connect({
-                key: `${ONYXKEYS.COLLECTION.REPORT}${reportID}`,
-                callback: (reportVal) => {
-                    Onyx.disconnect(connection);
-                    resolve(reportVal);
-                },
-            });
-        });
-        expect(report?.lastVisibleActionCreated).toBe(iouAction?.created);
-    });
-
-    it('optimistic transaction should be merged with the draft transaction if it is a distance request', async () => {
-        // Given a workspace expense chat and a draft split transaction
-        const workspaceReportID = '1';
-        const transactionAmount = 100;
-        const draftTransaction = {
-            amount: transactionAmount,
-            currency: CONST.CURRENCY.USD,
-            merchant: 'test',
-            created: '',
-            iouRequestType: CONST.IOU.REQUEST_TYPE.DISTANCE,
-            splitShares: {
-                [workspaceReportID]: {amount: 100},
-            },
-        };
-
-        await Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT}${workspaceReportID}`, {reportID: workspaceReportID, isOwnPolicyExpenseChat: true});
-        await Onyx.merge(`${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${CONST.IOU.OPTIMISTIC_TRANSACTION_ID}`, draftTransaction);
-
-        // When doing a distance split expense
-        splitBill({
-            participants: [{reportID: workspaceReportID}],
-            currentUserLogin: RORY_EMAIL,
-            currentUserAccountID: RORY_ACCOUNT_ID,
-            existingSplitChatReportID: workspaceReportID,
-            ...draftTransaction,
-            comment: '',
-            isASAPSubmitBetaEnabled: false,
-            transactionViolations: {},
-            quickAction: undefined,
-            policyRecentlyUsedCurrencies: [],
-            policyRecentlyUsedTags: undefined,
-        });
-
-        await waitForBatchedUpdates();
-
-        const optimisticTransaction = await new Promise<OnyxEntry<Transaction>>((resolve) => {
-            const connection = Onyx.connect({
-                key: ONYXKEYS.COLLECTION.TRANSACTION,
-                waitForCollectionCallback: true,
-                callback: (transactions) => {
-                    Onyx.disconnect(connection);
-                    resolve(Object.values(transactions ?? {}).find((transaction) => transaction?.amount === -(transactionAmount / 2)));
-                },
-            });
-        });
-
-        // Then the data from the transaction draft should be merged into the optimistic transaction
-        expect(optimisticTransaction?.iouRequestType).toBe(CONST.IOU.REQUEST_TYPE.DISTANCE);
-    });
-
-    it("should update the notification preference of the report to ALWAYS if it's previously hidden", async () => {
-        // Given a group chat with hidden notification preference
-        const reportID = '1';
-        await Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT}${reportID}`, {
-            reportID,
-            type: CONST.REPORT.TYPE.CHAT,
-            chatType: CONST.REPORT.CHAT_TYPE.GROUP,
-            participants: {
-                [RORY_ACCOUNT_ID]: {notificationPreference: CONST.REPORT.NOTIFICATION_PREFERENCE.HIDDEN},
-                [CARLOS_ACCOUNT_ID]: {notificationPreference: CONST.REPORT.NOTIFICATION_PREFERENCE.HIDDEN},
-            },
-        });
-
-        // When the user split bill on the group chat
-        splitBill({
-            participants: [{accountID: CARLOS_ACCOUNT_ID, login: CARLOS_EMAIL}],
-            currentUserLogin: RORY_EMAIL,
-            currentUserAccountID: RORY_ACCOUNT_ID,
-            comment: '',
-            amount: 100,
-            currency: CONST.CURRENCY.USD,
-            merchant: 'test',
-            created: '',
-            existingSplitChatReportID: reportID,
-            isASAPSubmitBetaEnabled: false,
-            transactionViolations: {},
-            quickAction: undefined,
-            policyRecentlyUsedCurrencies: [],
-            policyRecentlyUsedTags: undefined,
-        });
-
-        await waitForBatchedUpdates();
-
-        // Then the DM notification preference should be updated to ALWAYS
-        const report = await new Promise<OnyxEntry<Report>>((resolve) => {
-            const connection = Onyx.connect({
-                key: `${ONYXKEYS.COLLECTION.REPORT}${reportID}`,
-                callback: (reportVal) => {
-                    Onyx.disconnect(connection);
-                    resolve(reportVal);
-                },
-            });
-        });
-        expect(report?.participants?.[RORY_ACCOUNT_ID].notificationPreference).toBe(CONST.REPORT.NOTIFICATION_PREFERENCE.ALWAYS);
-    });
-
-    it('should update the policyRecentlyUsedTags when tag is provided', async () => {
-        // Given a policy recently used tags
-        const policyID = 'A';
-        const transactionTag = 'new tag';
-        const tagName = 'Tag';
-        const policyRecentlyUsedTags: OnyxEntry<RecentlyUsedTags> = {
-            [tagName]: ['old tag'],
-        };
-
-        const policyExpenseChat = {
-            reportID: '2',
-            policyID,
-            isPolicyExpenseChat: true,
-            isOwnPolicyExpenseChat: true,
-        };
-
-        await Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT}${policyExpenseChat.reportID}`, policyExpenseChat);
-        await Onyx.merge(`${ONYXKEYS.COLLECTION.POLICY_TAGS}${policyID}`, {
-            [tagName]: {name: tagName},
-        });
-        await Onyx.merge(`${ONYXKEYS.COLLECTION.POLICY_RECENTLY_USED_TAGS}${policyID}`, policyRecentlyUsedTags);
-
-        // When doing a split bill
-        splitBill({
-            participants: [{isPolicyExpenseChat: true, policyID}],
-            existingSplitChatReportID: policyExpenseChat.reportID,
-            currentUserLogin: currentUserPersonalDetails.login ?? '',
-            currentUserAccountID: currentUserPersonalDetails.accountID,
-            amount: 1,
-            created: '',
-            comment: '',
-            merchant: '',
-            transactionViolations: undefined,
-            category: undefined,
-            tag: transactionTag,
-            currency: CONST.CURRENCY.USD,
-            taxCode: '',
-            taxAmount: 0,
-            isASAPSubmitBetaEnabled: false,
-            policyRecentlyUsedTags,
-            quickAction: {},
-            policyRecentlyUsedCurrencies: [],
-        });
-
-        waitForBatchedUpdates();
-
-        // Then the transaction tag should be added to the recently used tags collection
-        const newPolicyRecentlyUsedTags: RecentlyUsedTags = await new Promise((resolve) => {
-            const connection = Onyx.connectWithoutView({
-                key: `${ONYXKEYS.COLLECTION.POLICY_RECENTLY_USED_TAGS}${policyID}`,
-                callback: (recentlyUsedTags) => {
-                    resolve(recentlyUsedTags ?? {});
-                    Onyx.disconnect(connection);
-                },
-            });
-        });
-        expect(newPolicyRecentlyUsedTags[tagName].length).toBe(2);
-        expect(newPolicyRecentlyUsedTags[tagName].at(0)).toBe(transactionTag);
-    });
-
-    it('the description should not be parsed again after completing the scan split bill without changing the description', async () => {
-        const reportID = '1';
-        await Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT}${reportID}`, {
-            reportID,
-            type: CONST.REPORT.TYPE.CHAT,
-            chatType: CONST.REPORT.CHAT_TYPE.GROUP,
-            participants: {
-                [RORY_ACCOUNT_ID]: {notificationPreference: CONST.REPORT.NOTIFICATION_PREFERENCE.ALWAYS},
-                [CARLOS_ACCOUNT_ID]: {notificationPreference: CONST.REPORT.NOTIFICATION_PREFERENCE.ALWAYS},
-            },
-        });
-
-        // Start a scan split bill
-        const {splitTransactionID} = startSplitBill({
-            participants: [{accountID: CARLOS_ACCOUNT_ID, login: CARLOS_EMAIL}],
-            currentUserLogin: RORY_EMAIL,
-            currentUserAccountID: RORY_ACCOUNT_ID,
-            comment: '# test',
-            currency: CONST.CURRENCY.USD,
-            existingSplitChatReportID: reportID,
-            receipt: {},
-            category: undefined,
-            tag: undefined,
-            taxCode: '',
-            taxAmount: 0,
-            quickAction: undefined,
-            policyRecentlyUsedCurrencies: [],
-            policyRecentlyUsedTags: undefined,
-        });
-
-        await waitForBatchedUpdates();
-
-        let splitTransaction = await getOnyxValue(`${ONYXKEYS.COLLECTION.TRANSACTION}${splitTransactionID}`);
-
-        // Then the description should be parsed correctly
-        expect(splitTransaction?.comment?.comment).toBe('<h1>test</h1>');
-
-        const updatedSplitTransaction = splitTransaction
-            ? {
-                  ...splitTransaction,
-                  amount: 100,
-              }
-            : undefined;
-
-        const reportActions = await getOnyxValue(`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${reportID}`);
-        const iouAction = Object.values(reportActions ?? {}).find((action) => isActionOfType(action, CONST.REPORT.ACTIONS.TYPE.IOU));
-
-        expect(iouAction).toBeTruthy();
-
-        // Complete this split bill without changing the description
-        completeSplitBill(reportID, iouAction, updatedSplitTransaction, RORY_ACCOUNT_ID, false, undefined, {}, RORY_EMAIL);
-
-        await waitForBatchedUpdates();
-
-        splitTransaction = await getOnyxValue(`${ONYXKEYS.COLLECTION.TRANSACTION}${splitTransactionID}`);
-
-        // Then the description should be the same since it was not changed
-        expect(splitTransaction?.comment?.comment).toBe('<h1>test</h1>');
-    });
-
-    it('should calculate proportional convertedAmount for split transactions with foreign currency', async () => {
-        jest.setTimeout(10 * 1000);
-
-        // Given: An expense report with AED currency and a USD transaction with convertedAmount
-        const originalAmount = -1000;
-        const originalConvertedAmount = -3673;
-        const reportID = rand64();
-        const originalTransactionID = rand64();
-
-        const expenseReport: Report = {
-            reportID,
-            type: CONST.REPORT.TYPE.EXPENSE,
-            currency: 'AED',
-            ownerAccountID: RORY_ACCOUNT_ID,
-            total: originalAmount,
-        };
-
-        const originalTransaction = {
-            transactionID: originalTransactionID,
-            amount: originalAmount,
-            modifiedAmount: '', // Empty string - the edge case that was causing the bug
-            currency: 'USD',
-            modifiedCurrency: '',
-            convertedAmount: originalConvertedAmount,
-            created: DateUtils.getDBTime(),
-            merchant: 'Test Merchant',
-            reportID,
-            comment: {},
-        } as unknown as Transaction;
-
-        const transactionThread: Report = {
-            reportID: rand64(),
-            type: CONST.REPORT.TYPE.CHAT,
-            parentReportID: reportID,
-            parentReportActionID: rand64(),
-        };
-
-        const iouAction: ReportAction = {
-            ...buildOptimisticIOUReportAction({
-                type: CONST.IOU.REPORT_ACTION_TYPE.CREATE,
-                amount: Math.abs(originalAmount),
-                currency: 'USD',
-                comment: '',
-                participants: [],
-                transactionID: originalTransactionID,
-                iouReportID: reportID,
-            }),
-            childReportID: transactionThread.reportID,
-        };
-
-        await Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT}${expenseReport.reportID}`, expenseReport);
-        await Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT}${transactionThread.reportID}`, transactionThread);
-        await Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${expenseReport.reportID}`, {
-            [iouAction.reportActionID]: iouAction,
-        });
-        await Onyx.merge(`${ONYXKEYS.COLLECTION.TRANSACTION}${originalTransactionID}`, originalTransaction);
-
-        const splitExpenses: SplitExpense[] = [
-            {
-                transactionID: rand64(),
-                amount: -500,
-                created: DateUtils.getDBTime(),
-                merchant: 'Test Merchant',
-            },
-            {
-                transactionID: rand64(),
-                amount: -500,
-                created: DateUtils.getDBTime(),
-                merchant: 'Test Merchant',
-            },
-        ];
-
-        let allTransactions: OnyxCollection<Transaction>;
-        let allReports: OnyxCollection<Report>;
-        let allReportNameValuePairs: OnyxCollection<ReportNameValuePairs>;
-        await getOnyxData({
-            key: ONYXKEYS.COLLECTION.TRANSACTION,
-            waitForCollectionCallback: true,
-            callback: (value) => {
-                allTransactions = value;
-            },
-        });
-        await getOnyxData({
-            key: ONYXKEYS.COLLECTION.REPORT,
-            waitForCollectionCallback: true,
-            callback: (value) => {
-                allReports = value;
-            },
-        });
-        await getOnyxData({
-            key: ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS,
-            waitForCollectionCallback: true,
-            callback: (value) => {
-                allReportNameValuePairs = value;
-            },
-        });
-
-        // When splitting the expense
-        updateSplitTransactionsFromSplitExpensesFlow({
-            allTransactionsList: allTransactions,
-            allReportsList: allReports,
-            allReportNameValuePairsList: allReportNameValuePairs,
-            transactionData: {
-                reportID,
-                originalTransactionID,
-                splitExpenses,
-                splitExpensesTotal: -1000,
-            },
-            searchContext: {
-                currentSearchHash: -1,
-            },
-            policyCategories: undefined,
-            policy: undefined,
-            policyRecentlyUsedCategories: [],
-            iouReport: expenseReport,
-            firstIOU: iouAction,
-            isASAPSubmitBetaEnabled: false,
-            currentUserPersonalDetails,
-            transactionViolations: {},
-            policyRecentlyUsedCurrencies: [],
-            quickAction: undefined,
-            iouReportNextStep: undefined,
-        });
-
-        await waitForBatchedUpdates();
-
-        // Then each split transaction should have proportional convertedAmount
-        // Formula: Math.round((originalConvertedAmount * splitAmount) / originalAmount)
-        const expectedProportionalConvertedAmount = -1836;
-
-        const splitTransactions = await new Promise<Transaction[]>((resolve) => {
-            const connection = Onyx.connect({
-                key: ONYXKEYS.COLLECTION.TRANSACTION,
-                waitForCollectionCallback: true,
-                callback: (transactions) => {
-                    Onyx.disconnect(connection);
-                    const splits = Object.values(transactions ?? {}).filter((t) => t?.transactionID !== originalTransactionID && t?.comment?.originalTransactionID === originalTransactionID);
-                    resolve(splits as Transaction[]);
-                },
-            });
-        });
-
-        expect(splitTransactions.length).toBe(2);
-
-        for (const splitTransaction of splitTransactions) {
-            expect(splitTransaction.convertedAmount).toBe(expectedProportionalConvertedAmount);
-        }
-    });
-});
-
-describe('startSplitBill', () => {
-    it('should update the policyRecentlyUsedTags when tag is provided', async () => {
-        // Given a policy recently used tags
-        const policyID = 'A';
-        const transactionTag = 'new tag';
-        const tagName = 'Tag';
-        const policyRecentlyUsedTags: OnyxEntry<RecentlyUsedTags> = {
-            [tagName]: ['old tag'],
-        };
-
-        await Onyx.merge(`${ONYXKEYS.COLLECTION.POLICY_TAGS}${policyID}`, {
-            [tagName]: {name: tagName},
-        });
-        await Onyx.merge(`${ONYXKEYS.COLLECTION.POLICY_RECENTLY_USED_TAGS}${policyID}`, policyRecentlyUsedTags);
-
-        // When doing a split bill with a receipt
-        startSplitBill({
-            participants: [{isPolicyExpenseChat: true, policyID}],
-            currentUserLogin: currentUserPersonalDetails.login ?? '',
-            currentUserAccountID: currentUserPersonalDetails.accountID,
-            comment: '',
-            receipt: {},
-            category: undefined,
-            tag: transactionTag,
-            currency: CONST.CURRENCY.USD,
-            taxCode: '',
-            taxAmount: 0,
-            policyRecentlyUsedTags,
-            quickAction: {},
-            policyRecentlyUsedCurrencies: [],
-        });
-
-        waitForBatchedUpdates();
-
-        // Then the transaction tag should be added to the recently used tags collection
-        const newPolicyRecentlyUsedTags: RecentlyUsedTags = await new Promise((resolve) => {
-            const connection = Onyx.connectWithoutView({
-                key: `${ONYXKEYS.COLLECTION.POLICY_RECENTLY_USED_TAGS}${policyID}`,
-                callback: (recentlyUsedTags) => {
-                    resolve(recentlyUsedTags ?? {});
-                    Onyx.disconnect(connection);
-                },
-            });
-        });
-        expect(newPolicyRecentlyUsedTags[tagName].length).toBe(2);
-        expect(newPolicyRecentlyUsedTags[tagName].at(0)).toBe(transactionTag);
-    });
-});
-
-describe('updateSplitTransactionsFromSplitExpensesFlow', () => {
-    it('should delete the original transaction thread report', async () => {
-        const expenseReport: Report = {
-            ...createRandomReport(1, undefined),
-            type: CONST.REPORT.TYPE.EXPENSE,
-        };
-        const transaction: Transaction = {
-            amount: 100,
-            currency: 'USD',
-            transactionID: '1',
-            reportID: expenseReport.reportID,
-            created: DateUtils.getDBTime(),
-            merchant: 'test',
-        };
-        const transactionThread: Report = {
-            ...createRandomReport(2, undefined),
-        };
-        const iouAction: ReportAction = {
-            ...buildOptimisticIOUReportAction({
-                type: CONST.IOU.REPORT_ACTION_TYPE.CREATE,
-                amount: transaction.amount,
-                currency: transaction.currency,
-                comment: '',
-                participants: [],
-                transactionID: transaction.transactionID,
-                iouReportID: expenseReport.reportID,
-            }),
-            childReportID: transactionThread.reportID,
-        };
-        await Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT}${expenseReport.reportID}`, expenseReport);
-        await Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT}${transactionThread.reportID}`, transactionThread);
-        await Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${expenseReport.reportID}`, {
-            [iouAction.reportActionID]: iouAction,
-        });
-        await Onyx.merge(`${ONYXKEYS.COLLECTION.TRANSACTION}${transaction.transactionID}`, transaction);
-        const draftTransaction: OnyxEntry<Transaction> = {
-            ...transaction,
-            comment: {
-                originalTransactionID: transaction.transactionID,
-            },
-        };
-
-        let allTransactions: OnyxCollection<Transaction>;
-        let allReports: OnyxCollection<Report>;
-        let allReportNameValuePairs: OnyxCollection<ReportNameValuePairs>;
-        await getOnyxData({
-            key: ONYXKEYS.COLLECTION.TRANSACTION,
-            waitForCollectionCallback: true,
-            callback: (value) => {
-                allTransactions = value;
-            },
-        });
-        await getOnyxData({
-            key: ONYXKEYS.COLLECTION.REPORT,
-            waitForCollectionCallback: true,
-            callback: (value) => {
-                allReports = value;
-            },
-        });
-        await getOnyxData({
-            key: ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS,
-            waitForCollectionCallback: true,
-            callback: (value) => {
-                allReportNameValuePairs = value;
-            },
-        });
-
-        updateSplitTransactionsFromSplitExpensesFlow({
-            allTransactionsList: allTransactions,
-            allReportsList: allReports,
-            allReportNameValuePairsList: allReportNameValuePairs,
-            transactionData: {
-                reportID: draftTransaction?.reportID ?? String(CONST.DEFAULT_NUMBER_ID),
-                originalTransactionID: draftTransaction?.comment?.originalTransactionID ?? String(CONST.DEFAULT_NUMBER_ID),
-                splitExpenses: draftTransaction?.comment?.splitExpenses ?? [],
-                splitExpensesTotal: draftTransaction?.comment?.splitExpensesTotal,
-            },
-            searchContext: {
-                currentSearchHash: -2,
-            },
-            policyCategories: undefined,
-            policy: undefined,
-            policyRecentlyUsedCategories: [],
-            iouReport: expenseReport,
-            firstIOU: iouAction,
-            isASAPSubmitBetaEnabled: false,
-            currentUserPersonalDetails,
-            transactionViolations: {},
-            policyRecentlyUsedCurrencies: [],
-            quickAction: undefined,
-            iouReportNextStep: undefined,
-        });
-
-        await waitForBatchedUpdates();
-
-        const originalTransactionThread = await new Promise<OnyxEntry<Report>>((resolve) => {
-            const connection = Onyx.connect({
-                key: `${ONYXKEYS.COLLECTION.REPORT}${iouAction.childReportID}`,
-                callback: (val) => {
-                    Onyx.disconnect(connection);
-                    resolve(val);
-                },
-            });
-        });
-        expect(originalTransactionThread).toBe(undefined);
-    });
-
-    it('should remove the original transaction from the search snapshot data', async () => {
-        // Given a single expense
-        const expenseReport: Report = {
-            ...createRandomReport(1, undefined),
-            type: CONST.REPORT.TYPE.EXPENSE,
-        };
-        const transaction: Transaction = {
-            amount: 100,
-            currency: 'USD',
-            transactionID: '1',
-            reportID: expenseReport.reportID,
-            created: DateUtils.getDBTime(),
-            merchant: 'test',
-        };
-        const transactionThread: Report = {
-            ...createRandomReport(2, undefined),
-        };
-        const iouAction: ReportAction = {
-            ...buildOptimisticIOUReportAction({
-                type: CONST.IOU.REPORT_ACTION_TYPE.CREATE,
-                amount: transaction.amount,
-                currency: transaction.currency,
-                comment: '',
-                participants: [],
-                transactionID: transaction.transactionID,
-                iouReportID: expenseReport.reportID,
-            }),
-            childReportID: transactionThread.reportID,
-        };
-        await Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT}${expenseReport.reportID}`, expenseReport);
-        await Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT}${transactionThread.reportID}`, transactionThread);
-        await Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${expenseReport.reportID}`, {
-            [iouAction.reportActionID]: iouAction,
-        });
-        await Onyx.merge(`${ONYXKEYS.COLLECTION.TRANSACTION}${transaction.transactionID}`, transaction);
-        const draftTransaction: OnyxEntry<Transaction> = {
-            ...transaction,
-            comment: {
-                originalTransactionID: transaction.transactionID,
-            },
-        };
-
-        // When splitting the expense
-        const hash = 1;
-
-        let allTransactions: OnyxCollection<Transaction>;
-        let allReports: OnyxCollection<Report>;
-        let allReportNameValuePairs: OnyxCollection<ReportNameValuePairs>;
-        await getOnyxData({
-            key: ONYXKEYS.COLLECTION.TRANSACTION,
-            waitForCollectionCallback: true,
-            callback: (value) => {
-                allTransactions = value;
-            },
-        });
-        await getOnyxData({
-            key: ONYXKEYS.COLLECTION.REPORT,
-            waitForCollectionCallback: true,
-            callback: (value) => {
-                allReports = value;
-            },
-        });
-        await getOnyxData({
-            key: ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS,
-            waitForCollectionCallback: true,
-            callback: (value) => {
-                allReportNameValuePairs = value;
-            },
-        });
-        updateSplitTransactionsFromSplitExpensesFlow({
-            allTransactionsList: allTransactions,
-            allReportsList: allReports,
-            allReportNameValuePairsList: allReportNameValuePairs,
-            transactionData: {
-                reportID: draftTransaction?.reportID ?? String(CONST.DEFAULT_NUMBER_ID),
-                originalTransactionID: draftTransaction?.comment?.originalTransactionID ?? String(CONST.DEFAULT_NUMBER_ID),
-                splitExpenses: draftTransaction?.comment?.splitExpenses ?? [],
-                splitExpensesTotal: draftTransaction?.comment?.splitExpensesTotal,
-            },
-            searchContext: {
-                currentSearchHash: hash,
-            },
-            policyCategories: undefined,
-            policy: undefined,
-            policyRecentlyUsedCategories: [],
-            iouReport: expenseReport,
-            firstIOU: undefined,
-            isASAPSubmitBetaEnabled: false,
-            currentUserPersonalDetails,
-            transactionViolations: {},
-            policyRecentlyUsedCurrencies: [],
-            quickAction: undefined,
-            iouReportNextStep: undefined,
-        });
-
-        await waitForBatchedUpdates();
-
-        // Then the original expense/transaction should be removed from the search snapshot data
-        const searchSnapshot = await new Promise<OnyxEntry<SearchResults>>((resolve) => {
-            const connection = Onyx.connect({
-                key: `${ONYXKEYS.COLLECTION.SNAPSHOT}${hash}`,
-                callback: (val) => {
-                    Onyx.disconnect(connection);
-                    resolve(val);
-                },
-            });
-        });
-        expect(searchSnapshot?.data[`${ONYXKEYS.COLLECTION.TRANSACTION}${transaction.transactionID}`]).toBe(undefined);
-    });
-
-    it('should add split transactions optimistically on search snapshot when current search filter is on unapprovedCash', async () => {
-        const chatReport: Report = createRandomReport(7, CONST.REPORT.CHAT_TYPE.POLICY_EXPENSE_CHAT);
-        // Given a single expense
-        const expenseReport: Report = {
-            ...createRandomReport(1, undefined),
-            type: CONST.REPORT.TYPE.EXPENSE,
-            chatReportID: chatReport.reportID,
-            stateNum: CONST.REPORT.STATE_NUM.SUBMITTED,
-            statusNum: CONST.REPORT.STATUS_NUM.SUBMITTED,
-        };
-        const transaction: Transaction = {
-            amount: 100,
-            currency: 'USD',
-            transactionID: '1',
-            reportID: expenseReport.reportID,
-            created: DateUtils.getDBTime(),
-            merchant: 'test',
-        };
-        const transactionThread: Report = {
-            ...createRandomReport(2, undefined),
-        };
-        const iouAction: ReportAction = {
-            ...buildOptimisticIOUReportAction({
-                type: CONST.IOU.REPORT_ACTION_TYPE.CREATE,
-                amount: transaction.amount,
-                currency: transaction.currency,
-                comment: '',
-                participants: [],
-                transactionID: transaction.transactionID,
-                iouReportID: expenseReport.reportID,
-            }),
-            childReportID: transactionThread.reportID,
-        };
-        await Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT}${chatReport.reportID}`, chatReport);
-        await Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT}${expenseReport.reportID}`, expenseReport);
-        await Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT}${transactionThread.reportID}`, transactionThread);
-        await Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${expenseReport.reportID}`, {
-            [iouAction.reportActionID]: iouAction,
-        });
-        await Onyx.merge(`${ONYXKEYS.COLLECTION.TRANSACTION}${transaction.transactionID}`, transaction);
-        const splitTransactionID1 = '34';
-        const splitTransactionID2 = '35';
-        const draftTransaction: OnyxEntry<Transaction> = {
-            ...transaction,
-            comment: {
-                originalTransactionID: transaction.transactionID,
-                splitExpenses: [
-                    {amount: transaction.amount / 2, transactionID: splitTransactionID1, created: ''},
-                    {amount: transaction.amount / 2, transactionID: splitTransactionID2, created: ''},
-                ],
-            },
-        };
-
-        // When splitting the expense
-        const hash = 1;
-
-        let allTransactions: OnyxCollection<Transaction>;
-        let allReports: OnyxCollection<Report>;
-        let allReportNameValuePairs: OnyxCollection<ReportNameValuePairs>;
-        await getOnyxData({
-            key: ONYXKEYS.COLLECTION.TRANSACTION,
-            waitForCollectionCallback: true,
-            callback: (value) => {
-                allTransactions = value;
-            },
-        });
-        await getOnyxData({
-            key: ONYXKEYS.COLLECTION.REPORT,
-            waitForCollectionCallback: true,
-            callback: (value) => {
-                allReports = value;
-            },
-        });
-        await getOnyxData({
-            key: ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS,
-            waitForCollectionCallback: true,
-            callback: (value) => {
-                allReportNameValuePairs = value;
-            },
-        });
-
-        updateSplitTransactionsFromSplitExpensesFlow({
-            allTransactionsList: allTransactions,
-            allReportsList: allReports,
-            allReportNameValuePairsList: allReportNameValuePairs,
-            transactionData: {
-                reportID: draftTransaction?.reportID ?? String(CONST.DEFAULT_NUMBER_ID),
-                originalTransactionID: draftTransaction?.comment?.originalTransactionID ?? String(CONST.DEFAULT_NUMBER_ID),
-                splitExpenses: draftTransaction?.comment?.splitExpenses ?? [],
-                splitExpensesTotal: draftTransaction?.comment?.splitExpensesTotal,
-            },
-            searchContext: {
-                currentSearchHash: hash,
-            },
-            policyCategories: undefined,
-            policy: undefined,
-            policyRecentlyUsedCategories: [],
-            iouReport: expenseReport,
-            firstIOU: undefined,
-            isASAPSubmitBetaEnabled: false,
-            currentUserPersonalDetails,
-            transactionViolations: {},
-            policyRecentlyUsedCurrencies: [],
-            quickAction: undefined,
-            iouReportNextStep: undefined,
-        });
-
-        await waitForBatchedUpdates();
-
-        // Then the split expenses/transactions should be added on the search snapshot data
-        const searchSnapshot = await new Promise<OnyxEntry<SearchResults>>((resolve) => {
-            const connection = Onyx.connect({
-                key: `${ONYXKEYS.COLLECTION.SNAPSHOT}${unapprovedCashHash}`,
-                callback: (val) => {
-                    Onyx.disconnect(connection);
-                    resolve(val);
-                },
-            });
-        });
-        expect(searchSnapshot?.data?.[`${ONYXKEYS.COLLECTION.TRANSACTION}${splitTransactionID1}`]).toBeDefined();
-        expect(searchSnapshot?.data?.[`${ONYXKEYS.COLLECTION.TRANSACTION}${splitTransactionID2}`]).toBeDefined();
-    });
-});
-
-describe('updateSplitTransactionsFromSplitExpensesFlow', () => {
-    it("should update split transaction's description correctly ", async () => {
-        const amount = 10000;
-        let expenseReport: OnyxEntry<Report>;
-        let chatReport: OnyxEntry<Report>;
-        let originalTransactionID;
-
-        const policyID = generatePolicyID();
-        createWorkspace({
-            policyOwnerEmail: CARLOS_EMAIL,
-            makeMeAdmin: true,
-            policyName: "Carlos's Workspace",
-            policyID,
-            introSelected: {choice: CONST.ONBOARDING_CHOICES.MANAGE_TEAM},
-            currentUserAccountIDParam: CARLOS_ACCOUNT_ID,
-            currentUserEmailParam: CARLOS_EMAIL,
-        });
-
-        // Change the approval mode for the policy since default is Submit and Close
-        setWorkspaceApprovalMode(policyID, CARLOS_EMAIL, CONST.POLICY.APPROVAL_MODE.BASIC);
-        await waitForBatchedUpdates();
-        await getOnyxData({
-            key: ONYXKEYS.COLLECTION.REPORT,
-            waitForCollectionCallback: true,
-            callback: (allReports) => {
-                chatReport = Object.values(allReports ?? {}).find((report) => report?.chatType === CONST.REPORT.CHAT_TYPE.POLICY_EXPENSE_CHAT);
-            },
-        });
-        requestMoney({
-            report: chatReport,
-            participantParams: {
-                payeeEmail: RORY_EMAIL,
-                payeeAccountID: RORY_ACCOUNT_ID,
-                participant: {login: CARLOS_EMAIL, accountID: CARLOS_ACCOUNT_ID, isPolicyExpenseChat: true, reportID: chatReport?.reportID},
-            },
-            transactionParams: {
-                amount,
-                attendees: [],
-                currency: CONST.CURRENCY.USD,
-                created: '',
-                merchant: 'NASDAQ',
-                comment: '*hey* `hey`',
-            },
-            shouldGenerateTransactionThreadReport: true,
-            isASAPSubmitBetaEnabled: false,
-            currentUserAccountIDParam: 123,
-            currentUserEmailParam: 'existing@example.com',
-            transactionViolations: {},
-            policyRecentlyUsedCurrencies: [],
-            quickAction: undefined,
-        });
-        await waitForBatchedUpdates();
-        await getOnyxData({
-            key: ONYXKEYS.COLLECTION.REPORT,
-            waitForCollectionCallback: true,
-            callback: (allReports) => {
-                expenseReport = Object.values(allReports ?? {}).find((report) => report?.type === CONST.REPORT.TYPE.EXPENSE);
-            },
-        });
-        await getOnyxData({
-            key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${expenseReport?.reportID}`,
-            waitForCollectionCallback: false,
-            callback: (allReportsAction) => {
-                const iouActions = Object.values(allReportsAction ?? {}).filter((reportAction): reportAction is ReportAction<typeof CONST.REPORT.ACTIONS.TYPE.IOU> =>
-                    isMoneyRequestAction(reportAction),
-                );
-                const originalMessage = isMoneyRequestAction(iouActions?.at(0)) ? getOriginalMessage(iouActions?.at(0)) : undefined;
-                originalTransactionID = originalMessage?.IOUTransactionID;
-            },
-        });
-
-        const originalTransaction = await getOnyxValue(`${ONYXKEYS.COLLECTION.TRANSACTION}${originalTransactionID}`);
-        const draftTransaction: Transaction = {
-            reportID: originalTransaction?.reportID ?? '456',
-            transactionID: originalTransaction?.transactionID ?? '234',
-            amount,
-            created: originalTransaction?.created ?? DateUtils.getDBTime(),
-            currency: CONST.CURRENCY.USD,
-            merchant: originalTransaction?.merchant ?? '',
-            comment: {
-                originalTransactionID,
-                comment: originalTransaction?.comment?.comment ?? '',
-                splitExpenses: [
-                    {
-                        transactionID: '235',
-                        amount: amount / 2,
-                        description: '<strong>hey</strong><br /><code>hey</code>',
-                        created: DateUtils.getDBTime(),
-                    },
-                    {
-                        transactionID: '234',
-                        amount: amount / 2,
-                        description: '*hey1* `hey`',
-                        created: DateUtils.getDBTime(),
-                    },
-                ],
-                attendees: [],
-                type: CONST.TRANSACTION.TYPE.CUSTOM_UNIT,
-            },
-        };
-
-        let allTransactions: OnyxCollection<Transaction>;
-        let allReports: OnyxCollection<Report>;
-        let allReportNameValuePairs: OnyxCollection<ReportNameValuePairs>;
-        await getOnyxData({
-            key: ONYXKEYS.COLLECTION.TRANSACTION,
-            waitForCollectionCallback: true,
-            callback: (value) => {
-                allTransactions = value;
-            },
-        });
-        await getOnyxData({
-            key: ONYXKEYS.COLLECTION.REPORT,
-            waitForCollectionCallback: true,
-            callback: (value) => {
-                allReports = value;
-            },
-        });
-        await getOnyxData({
-            key: ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS,
-            waitForCollectionCallback: true,
-            callback: (value) => {
-                allReportNameValuePairs = value;
-            },
-        });
-
-        updateSplitTransactionsFromSplitExpensesFlow({
-            allTransactionsList: allTransactions,
-            allReportsList: allReports,
-            allReportNameValuePairsList: allReportNameValuePairs,
-            transactionData: {
-                reportID: draftTransaction?.reportID ?? String(CONST.DEFAULT_NUMBER_ID),
-                originalTransactionID: draftTransaction?.comment?.originalTransactionID ?? String(CONST.DEFAULT_NUMBER_ID),
-                splitExpenses: draftTransaction?.comment?.splitExpenses ?? [],
-                splitExpensesTotal: draftTransaction?.comment?.splitExpensesTotal,
-            },
-            searchContext: {
-                currentSearchHash: -2,
-            },
-            policyCategories: undefined,
-            policy: undefined,
-            policyRecentlyUsedCategories: [],
-            iouReport: expenseReport,
-            firstIOU: undefined,
-            isASAPSubmitBetaEnabled: false,
-            currentUserPersonalDetails,
-            transactionViolations: {},
-            policyRecentlyUsedCurrencies: [],
-            quickAction: undefined,
-            iouReportNextStep: undefined,
-        });
-        await waitForBatchedUpdates();
-
-        const split1 = await getOnyxValue(`${ONYXKEYS.COLLECTION.TRANSACTION}235`);
-        expect(split1?.comment?.comment).toBe('<strong>hey</strong><br /><code>hey</code>');
-        const split2 = await getOnyxValue(`${ONYXKEYS.COLLECTION.TRANSACTION}234`);
-        expect(split2?.comment?.comment).toBe('<strong>hey1</strong> <code>hey</code>');
-    });
-
-    it("should not create new expense report if the admin split the employee's expense", async () => {
-        const amount = 10000;
-        let expenseReport: OnyxEntry<Report>;
-        let chatReport: OnyxEntry<Report>;
-        let originalTransactionID;
-
-        const policyID = generatePolicyID();
-        createWorkspace({
-            policyOwnerEmail: RORY_EMAIL,
-            makeMeAdmin: true,
-            policyName: "Rory's Workspace",
-            policyID,
-            introSelected: {choice: CONST.ONBOARDING_CHOICES.MANAGE_TEAM},
-            currentUserAccountIDParam: RORY_ACCOUNT_ID,
-            currentUserEmailParam: RORY_EMAIL,
-        });
-
-        // Change the approval mode for the policy since default is Submit and Close
-        setWorkspaceApprovalMode(policyID, RORY_EMAIL, CONST.POLICY.APPROVAL_MODE.BASIC);
-        await waitForBatchedUpdates();
-        await getOnyxData({
-            key: ONYXKEYS.COLLECTION.REPORT,
-            waitForCollectionCallback: true,
-            callback: (allReports) => {
-                chatReport = Object.values(allReports ?? {}).find((report) => report?.chatType === CONST.REPORT.CHAT_TYPE.POLICY_EXPENSE_CHAT);
-            },
-        });
-        requestMoney({
-            report: chatReport,
-            participantParams: {
-                payeeEmail: CARLOS_EMAIL,
-                payeeAccountID: CARLOS_ACCOUNT_ID,
-                participant: {login: RORY_EMAIL, accountID: RORY_ACCOUNT_ID, isPolicyExpenseChat: true, reportID: chatReport?.reportID},
-            },
-            transactionParams: {
-                amount,
-                attendees: [],
-                currency: CONST.CURRENCY.USD,
-                created: '',
-                merchant: 'NASDAQ',
-                comment: '*hey* `hey`',
-            },
-            shouldGenerateTransactionThreadReport: true,
-            isASAPSubmitBetaEnabled: false,
-            currentUserAccountIDParam: 123,
-            currentUserEmailParam: 'existing@example.com',
-            transactionViolations: {},
-            policyRecentlyUsedCurrencies: [],
-            quickAction: undefined,
-        });
-        await waitForBatchedUpdates();
-        await getOnyxData({
-            key: ONYXKEYS.COLLECTION.REPORT,
-            waitForCollectionCallback: true,
-            callback: (allReports) => {
-                expenseReport = Object.values(allReports ?? {}).find((report) => report?.type === CONST.REPORT.TYPE.EXPENSE);
-            },
-        });
-        await getOnyxData({
-            key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${expenseReport?.reportID}`,
-            waitForCollectionCallback: false,
-            callback: (allReportsAction) => {
-                const iouActions = Object.values(allReportsAction ?? {}).filter((reportAction): reportAction is ReportAction<typeof CONST.REPORT.ACTIONS.TYPE.IOU> =>
-                    isMoneyRequestAction(reportAction),
-                );
-                const originalMessage = isMoneyRequestAction(iouActions?.at(0)) ? getOriginalMessage(iouActions?.at(0)) : undefined;
-                originalTransactionID = originalMessage?.IOUTransactionID;
-            },
-        });
-
-        const originalTransaction = await getOnyxValue(`${ONYXKEYS.COLLECTION.TRANSACTION}${originalTransactionID}`);
-        const draftTransaction: Transaction = {
-            reportID: originalTransaction?.reportID ?? '456',
-            transactionID: originalTransaction?.transactionID ?? '234',
-            amount,
-            created: originalTransaction?.created ?? DateUtils.getDBTime(),
-            currency: CONST.CURRENCY.USD,
-            merchant: originalTransaction?.merchant ?? '',
-            comment: {
-                originalTransactionID,
-                comment: originalTransaction?.comment?.comment ?? '',
-                splitExpenses: [
-                    {
-                        transactionID: '235',
-                        amount: amount / 2,
-                        description: '<strong>hey</strong><br /><code>hey</code>',
-                        created: DateUtils.getDBTime(),
-                    },
-                    {
-                        transactionID: '234',
-                        amount: amount / 2,
-                        description: '*hey1* `hey`',
-                        created: DateUtils.getDBTime(),
-                    },
-                ],
-                attendees: [],
-                type: CONST.TRANSACTION.TYPE.CUSTOM_UNIT,
-            },
-        };
-
-        let allTransactions: OnyxCollection<Transaction>;
-        let allReports: OnyxCollection<Report>;
-        let allReportNameValuePairs: OnyxCollection<ReportNameValuePairs>;
-        await getOnyxData({
-            key: ONYXKEYS.COLLECTION.TRANSACTION,
-            waitForCollectionCallback: true,
-            callback: (value) => {
-                allTransactions = value;
-            },
-        });
-        await getOnyxData({
-            key: ONYXKEYS.COLLECTION.REPORT,
-            waitForCollectionCallback: true,
-            callback: (value) => {
-                allReports = value;
-            },
-        });
-        await getOnyxData({
-            key: ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS,
-            waitForCollectionCallback: true,
-            callback: (value) => {
-                allReportNameValuePairs = value;
-            },
-        });
-
-        updateSplitTransactionsFromSplitExpensesFlow({
-            allTransactionsList: allTransactions,
-            allReportsList: allReports,
-            allReportNameValuePairsList: allReportNameValuePairs,
-            transactionData: {
-                reportID: draftTransaction?.reportID ?? String(CONST.DEFAULT_NUMBER_ID),
-                originalTransactionID: draftTransaction?.comment?.originalTransactionID ?? String(CONST.DEFAULT_NUMBER_ID),
-                splitExpenses: draftTransaction?.comment?.splitExpenses ?? [],
-                splitExpensesTotal: draftTransaction?.comment?.splitExpensesTotal,
-            },
-            searchContext: {
-                currentSearchHash: -2,
-            },
-            policyCategories: undefined,
-            policy: undefined,
-            policyRecentlyUsedCategories: [],
-            iouReport: expenseReport,
-            firstIOU: undefined,
-            isASAPSubmitBetaEnabled: false,
-            currentUserPersonalDetails,
-            transactionViolations: {},
-            policyRecentlyUsedCurrencies: [],
-            quickAction: undefined,
-            iouReportNextStep: undefined,
-        });
-        await waitForBatchedUpdates();
-
-        const split1 = await getOnyxValue(`${ONYXKEYS.COLLECTION.TRANSACTION}235`);
-        expect(split1?.reportID).toBe(expenseReport?.reportID);
-        const split2 = await getOnyxValue(`${ONYXKEYS.COLLECTION.TRANSACTION}234`);
-        expect(split2?.reportID).toBe(expenseReport?.reportID);
-    });
-
-    it('should use splitExpensesTotal in calculation when editing splits', async () => {
-        // The fix ensures we rely on splitExpensesTotal rather than potentially incorrect backend reportTotal
-        // This prevents scenarios where backend sends wrong total (e.g., -$2 instead of -$10)
-        // from causing incorrect report totals (e.g., $24 instead of correct -$10)
-
-        const amount = -10000;
-        let expenseReport: OnyxEntry<Report>;
-        let chatReport: OnyxEntry<Report>;
-        let originalTransactionID;
-
-        const policyID = generatePolicyID();
-        createWorkspace({
-            policyOwnerEmail: CARLOS_EMAIL,
-            makeMeAdmin: true,
-            policyName: "Carlos's Workspace",
-            policyID,
-            introSelected: {choice: CONST.ONBOARDING_CHOICES.MANAGE_TEAM},
-            currentUserAccountIDParam: CARLOS_ACCOUNT_ID,
-            currentUserEmailParam: CARLOS_EMAIL,
-        });
-
-        setWorkspaceApprovalMode(policyID, CARLOS_EMAIL, CONST.POLICY.APPROVAL_MODE.BASIC);
-        await waitForBatchedUpdates();
-
-        await getOnyxData({
-            key: ONYXKEYS.COLLECTION.REPORT,
-            waitForCollectionCallback: true,
-            callback: (allReports) => {
-                chatReport = Object.values(allReports ?? {}).find((report) => report?.chatType === CONST.REPORT.CHAT_TYPE.POLICY_EXPENSE_CHAT);
-            },
-        });
-
-        requestMoney({
-            report: chatReport,
-            participantParams: {
-                payeeEmail: RORY_EMAIL,
-                payeeAccountID: RORY_ACCOUNT_ID,
-                participant: {login: CARLOS_EMAIL, accountID: CARLOS_ACCOUNT_ID, isPolicyExpenseChat: true, reportID: chatReport?.reportID},
-            },
-            transactionParams: {
-                amount,
-                attendees: [],
-                currency: CONST.CURRENCY.USD,
-                created: '',
-                merchant: 'Test Merchant',
-                comment: 'Test expense',
-            },
-            shouldGenerateTransactionThreadReport: true,
-            isASAPSubmitBetaEnabled: false,
-            currentUserAccountIDParam: 123,
-            currentUserEmailParam: 'existing@example.com',
-            transactionViolations: {},
-            policyRecentlyUsedCurrencies: [],
-            quickAction: undefined,
-        });
-        await waitForBatchedUpdates();
-
-        await getOnyxData({
-            key: ONYXKEYS.COLLECTION.REPORT,
-            waitForCollectionCallback: true,
-            callback: (allReports) => {
-                expenseReport = Object.values(allReports ?? {}).find((report) => report?.type === CONST.REPORT.TYPE.EXPENSE);
-            },
-        });
-
-        await getOnyxData({
-            key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${expenseReport?.reportID}`,
-            waitForCollectionCallback: false,
-            callback: (allReportsAction) => {
-                const iouActions = Object.values(allReportsAction ?? {}).filter((reportAction): reportAction is ReportAction<typeof CONST.REPORT.ACTIONS.TYPE.IOU> =>
-                    isMoneyRequestAction(reportAction),
-                );
-                const originalMessage = isMoneyRequestAction(iouActions?.at(0)) ? getOriginalMessage(iouActions?.at(0)) : undefined;
-                originalTransactionID = originalMessage?.IOUTransactionID;
-            },
-        });
-
-        const originalTransaction = await getOnyxValue(`${ONYXKEYS.COLLECTION.TRANSACTION}${originalTransactionID}`);
-
-        // Set up split expenses with explicit splitExpensesTotal
-        // Using negative amounts to get positive transaction amounts (expense reports store as negative)
-        const splitExpensesTotal = -8000; // -$80 total for splits
-        const draftTransaction: Transaction = {
-            reportID: originalTransaction?.reportID ?? '456',
-            transactionID: originalTransaction?.transactionID ?? '234',
-            amount,
-            created: originalTransaction?.created ?? DateUtils.getDBTime(),
-            currency: CONST.CURRENCY.USD,
-            merchant: originalTransaction?.merchant ?? '',
-            comment: {
-                originalTransactionID,
-                comment: originalTransaction?.comment?.comment ?? '',
-                splitExpenses: [
-                    {
-                        transactionID: '235',
-                        amount: -5000,
-                        description: 'Split 1',
-                        created: DateUtils.getDBTime(),
-                    },
-                    {
-                        transactionID: '236',
-                        amount: -3000,
-                        description: 'Split 2',
-                        created: DateUtils.getDBTime(),
-                    },
-                ],
-                splitExpensesTotal,
-                attendees: [],
-                type: CONST.TRANSACTION.TYPE.CUSTOM_UNIT,
-            },
-        };
-
-        let allTransactions: OnyxCollection<Transaction>;
-        let allReports: OnyxCollection<Report>;
-        let allReportNameValuePairs: OnyxCollection<ReportNameValuePairs>;
-
-        await getOnyxData({
-            key: ONYXKEYS.COLLECTION.TRANSACTION,
-            waitForCollectionCallback: true,
-            callback: (value) => {
-                allTransactions = value;
-            },
-        });
-        await getOnyxData({
-            key: ONYXKEYS.COLLECTION.REPORT,
-            waitForCollectionCallback: true,
-            callback: (value) => {
-                allReports = value;
-            },
-        });
-        await getOnyxData({
-            key: ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS,
-            waitForCollectionCallback: true,
-            callback: (value) => {
-                allReportNameValuePairs = value;
-            },
-        });
-
-        // it should use splitExpensesTotal in its calculation
-        updateSplitTransactionsFromSplitExpensesFlow({
-            allTransactionsList: allTransactions,
-            allReportsList: allReports,
-            allReportNameValuePairsList: allReportNameValuePairs,
-            transactionData: {
-                reportID: draftTransaction?.reportID ?? String(CONST.DEFAULT_NUMBER_ID),
-                originalTransactionID: draftTransaction?.comment?.originalTransactionID ?? String(CONST.DEFAULT_NUMBER_ID),
-                splitExpenses: draftTransaction?.comment?.splitExpenses ?? [],
-                splitExpensesTotal: draftTransaction?.comment?.splitExpensesTotal,
-            },
-            searchContext: {
-                currentSearchHash: -2,
-            },
-            policyCategories: undefined,
-            policy: undefined,
-            policyRecentlyUsedCategories: [],
-            iouReport: expenseReport,
-            firstIOU: undefined,
-            isASAPSubmitBetaEnabled: false,
-            currentUserPersonalDetails,
-            transactionViolations: {},
-            policyRecentlyUsedCurrencies: [],
-            quickAction: undefined,
-            iouReportNextStep: undefined,
-        });
-        await waitForBatchedUpdates();
-
-        const split1 = await getOnyxValue(`${ONYXKEYS.COLLECTION.TRANSACTION}235`);
-        const split2 = await getOnyxValue(`${ONYXKEYS.COLLECTION.TRANSACTION}236`);
-
-        expect(split1).toBeDefined();
-        expect(split2).toBeDefined();
-    });
-
-    it('should create hold report actions for split transactions when original transaction is on hold', async () => {
-        // Given an expense that is on hold
-        const amount = 10000;
-        let expenseReport: OnyxEntry<Report>;
-        let chatReport: OnyxEntry<Report>;
-        let originalTransactionID: string | undefined;
-        let transactionThreadReportID: string | undefined;
-
-        const policyID = generatePolicyID();
-        createWorkspace({
-            policyOwnerEmail: CARLOS_EMAIL,
-            makeMeAdmin: true,
-            policyName: "Carlos's Workspace for Hold Test",
-            policyID,
-            introSelected: {choice: CONST.ONBOARDING_CHOICES.MANAGE_TEAM},
-            currentUserAccountIDParam: CARLOS_ACCOUNT_ID,
-            currentUserEmailParam: CARLOS_EMAIL,
-        });
-
-        // Change the approval mode for the policy since default is Submit and Close
-        setWorkspaceApprovalMode(policyID, CARLOS_EMAIL, CONST.POLICY.APPROVAL_MODE.BASIC);
-        await waitForBatchedUpdates();
-
-        await getOnyxData({
-            key: ONYXKEYS.COLLECTION.REPORT,
-            waitForCollectionCallback: true,
-            callback: (allReports) => {
-                chatReport = Object.values(allReports ?? {}).find((report) => report?.chatType === CONST.REPORT.CHAT_TYPE.POLICY_EXPENSE_CHAT);
-            },
-        });
-
-        // Create the initial expense
-        requestMoney({
-            report: chatReport,
-            participantParams: {
-                payeeEmail: RORY_EMAIL,
-                payeeAccountID: RORY_ACCOUNT_ID,
-                participant: {login: CARLOS_EMAIL, accountID: CARLOS_ACCOUNT_ID, isPolicyExpenseChat: true, reportID: chatReport?.reportID},
-            },
-            transactionParams: {
-                amount,
-                attendees: [],
-                currency: CONST.CURRENCY.USD,
-                created: '',
-                merchant: 'Test Merchant',
-                comment: 'Original expense',
-            },
-            shouldGenerateTransactionThreadReport: true,
-            isASAPSubmitBetaEnabled: false,
-            currentUserAccountIDParam: RORY_ACCOUNT_ID,
-            currentUserEmailParam: RORY_EMAIL,
-            transactionViolations: {},
-            policyRecentlyUsedCurrencies: [],
-            quickAction: undefined,
-        });
-        await waitForBatchedUpdates();
-
-        await getOnyxData({
-            key: ONYXKEYS.COLLECTION.REPORT,
-            waitForCollectionCallback: true,
-            callback: (allReports) => {
-                expenseReport = Object.values(allReports ?? {}).find((report) => report?.type === CONST.REPORT.TYPE.EXPENSE);
-            },
-        });
-
-        // Get the original transaction ID and transaction thread report ID
-        await getOnyxData({
-            key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${expenseReport?.reportID}`,
-            waitForCollectionCallback: false,
-            callback: (allReportsAction) => {
-                const iouActions = Object.values(allReportsAction ?? {}).filter((reportAction): reportAction is ReportAction<typeof CONST.REPORT.ACTIONS.TYPE.IOU> =>
-                    isMoneyRequestAction(reportAction),
-                );
-                const iouAction = iouActions?.at(0);
-                const originalMessage = isMoneyRequestAction(iouAction) ? getOriginalMessage(iouAction) : undefined;
-                originalTransactionID = originalMessage?.IOUTransactionID;
-                transactionThreadReportID = iouAction?.childReportID;
-            },
-        });
-
-        // Put the expense on hold
-        if (originalTransactionID && transactionThreadReportID) {
-            putOnHold(originalTransactionID, 'Test hold reason', transactionThreadReportID);
-        }
-        await waitForBatchedUpdates();
-
-        // Verify the transaction is on hold
-        const originalTransaction = await getOnyxValue(`${ONYXKEYS.COLLECTION.TRANSACTION}${originalTransactionID}`);
-        expect(originalTransaction?.comment?.hold).toBeDefined();
-
-        // Get the first IOU action for the split flow
-        let firstIOU: ReportAction | undefined;
-        await getOnyxData({
-            key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${expenseReport?.reportID}`,
-            waitForCollectionCallback: false,
-            callback: (allReportsAction) => {
-                const iouActions = Object.values(allReportsAction ?? {}).filter((reportAction): reportAction is ReportAction<typeof CONST.REPORT.ACTIONS.TYPE.IOU> =>
-                    isMoneyRequestAction(reportAction),
-                );
-                firstIOU = iouActions?.at(0);
-            },
-        });
-
-        // Create the draft transaction with split expenses
-        const draftTransaction: Transaction = {
-            reportID: originalTransaction?.reportID ?? '456',
-            transactionID: originalTransaction?.transactionID ?? '234',
-            amount,
-            created: originalTransaction?.created ?? DateUtils.getDBTime(),
-            currency: CONST.CURRENCY.USD,
-            merchant: originalTransaction?.merchant ?? '',
-            comment: {
-                originalTransactionID,
-                comment: originalTransaction?.comment?.comment ?? '',
-                hold: originalTransaction?.comment?.hold,
-                splitExpenses: [
-                    {
-                        transactionID: 'split-held-tx-1',
-                        amount: amount / 2,
-                        description: 'Split 1',
-                        created: DateUtils.getDBTime(),
-                    },
-                    {
-                        transactionID: 'split-held-tx-2',
-                        amount: amount / 2,
-                        description: 'Split 2',
-                        created: DateUtils.getDBTime(),
-                    },
-                ],
-                attendees: [],
-                type: CONST.TRANSACTION.TYPE.CUSTOM_UNIT,
-            },
-        };
-
-        let allTransactions: OnyxCollection<Transaction>;
-        let allReports: OnyxCollection<Report>;
-        let allReportNameValuePairs: OnyxCollection<ReportNameValuePairs>;
-
-        await getOnyxData({
-            key: ONYXKEYS.COLLECTION.TRANSACTION,
-            waitForCollectionCallback: true,
-            callback: (value) => {
-                allTransactions = value;
-            },
-        });
-        await getOnyxData({
-            key: ONYXKEYS.COLLECTION.REPORT,
-            waitForCollectionCallback: true,
-            callback: (value) => {
-                allReports = value;
-            },
-        });
-        await getOnyxData({
-            key: ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS,
-            waitForCollectionCallback: true,
-            callback: (value) => {
-                allReportNameValuePairs = value;
-            },
-        });
-
-        // When splitting the held expense
-        updateSplitTransactionsFromSplitExpensesFlow({
-            allTransactionsList: allTransactions,
-            allReportsList: allReports,
-            allReportNameValuePairsList: allReportNameValuePairs,
-            transactionData: {
-                reportID: draftTransaction?.reportID ?? String(CONST.DEFAULT_NUMBER_ID),
-                originalTransactionID: draftTransaction?.comment?.originalTransactionID ?? String(CONST.DEFAULT_NUMBER_ID),
-                splitExpenses: draftTransaction?.comment?.splitExpenses ?? [],
-                splitExpensesTotal: draftTransaction?.comment?.splitExpensesTotal,
-            },
-            searchContext: {
-                currentSearchHash: -2,
-            },
-            policyCategories: undefined,
-            policy: undefined,
-            policyRecentlyUsedCategories: [],
-            iouReport: expenseReport,
-            firstIOU,
-            isASAPSubmitBetaEnabled: false,
-            currentUserPersonalDetails,
-            transactionViolations: {},
-            policyRecentlyUsedCurrencies: [],
-            quickAction: undefined,
-            iouReportNextStep: undefined,
-        });
-
-        await waitForBatchedUpdates();
-
-        // Then verify the split transactions were created
-        const split1 = await getOnyxValue(`${ONYXKEYS.COLLECTION.TRANSACTION}split-held-tx-1`);
-        const split2 = await getOnyxValue(`${ONYXKEYS.COLLECTION.TRANSACTION}split-held-tx-2`);
-
-        expect(split1).toBeDefined();
-        expect(split2).toBeDefined();
-
-        // Find the transaction thread reports for each split by looking at the IOU actions
-        let split1ThreadReportID: string | undefined;
-        let split2ThreadReportID: string | undefined;
-
-        await getOnyxData({
-            key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${expenseReport?.reportID}`,
-            waitForCollectionCallback: false,
-            callback: (allReportsAction) => {
-                const iouActions = Object.values(allReportsAction ?? {}).filter((reportAction): reportAction is ReportAction<typeof CONST.REPORT.ACTIONS.TYPE.IOU> =>
-                    isMoneyRequestAction(reportAction),
-                );
-                for (const action of iouActions) {
-                    const message = isMoneyRequestAction(action) ? getOriginalMessage(action) : undefined;
-                    if (message?.IOUTransactionID === 'split-held-tx-1') {
-                        split1ThreadReportID = action.childReportID;
-                    } else if (message?.IOUTransactionID === 'split-held-tx-2') {
-                        split2ThreadReportID = action.childReportID;
-                    }
-                }
-            },
-        });
-
-        // Verify that split transaction thread IDs exist
-        expect(split1ThreadReportID).toBeDefined();
-        expect(split2ThreadReportID).toBeDefined();
-
-        // Verify each split transaction thread has hold report actions
-        // When splitting a held expense, new hold report actions should be created for each split
-        if (split1ThreadReportID) {
-            const split1ReportActions = await getOnyxValue(`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${split1ThreadReportID}`);
-            const split1HoldActions = Object.values(split1ReportActions ?? {}).filter((action) => action?.actionName === CONST.REPORT.ACTIONS.TYPE.HOLD);
-            const split1CommentActions = Object.values(split1ReportActions ?? {}).filter((action) => action?.actionName === CONST.REPORT.ACTIONS.TYPE.ADD_COMMENT);
-
-            // Should have at least one HOLD action and one ADD_COMMENT action (the hold comment)
-            // The hold actions are created optimistically with pendingAction: ADD, but this
-            // may be cleared to null after the API call succeeds
-            expect(split1HoldActions.length).toBeGreaterThanOrEqual(1);
-            expect(split1CommentActions.length).toBeGreaterThanOrEqual(1);
-        }
-
-        if (split2ThreadReportID) {
-            const split2ReportActions = await getOnyxValue(`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${split2ThreadReportID}`);
-            const split2HoldActions = Object.values(split2ReportActions ?? {}).filter((action) => action?.actionName === CONST.REPORT.ACTIONS.TYPE.HOLD);
-            const split2CommentActions = Object.values(split2ReportActions ?? {}).filter((action) => action?.actionName === CONST.REPORT.ACTIONS.TYPE.ADD_COMMENT);
-
-            // Should have at least one HOLD action and one ADD_COMMENT action (the hold comment)
-            expect(split2HoldActions.length).toBeGreaterThanOrEqual(1);
-            expect(split2CommentActions.length).toBeGreaterThanOrEqual(1);
-        }
-    });
-});
diff --git a/tests/actions/MergeTransactionTest.ts b/tests/actions/MergeTransactionTest.ts
index 2bc006870968..a6d6ddf1b6ac 100644
--- a/tests/actions/MergeTransactionTest.ts
+++ b/tests/actions/MergeTransactionTest.ts
@@ -137,7 +137,6 @@ describe('mergeTransactionRequest', () => {
             sourceTransaction,
             targetTransactionThreadReport: {reportID: 'target-report-456'},
             targetTransactionThreadParentReport: undefined,
-            targetTransactionThreadParentReportNextStep: undefined,
             allTransactionViolations: createAllTransactionViolations(targetTransaction.transactionID, sourceTransaction.transactionID, targetViolations, sourceViolations),
             policy: undefined,
             policyTags: undefined,
@@ -263,7 +262,6 @@ describe('mergeTransactionRequest', () => {
             sourceTransaction,
             targetTransactionThreadReport: {reportID: 'target-report-456'},
             targetTransactionThreadParentReport: undefined,
-            targetTransactionThreadParentReportNextStep: undefined,
             allTransactionViolations: createAllTransactionViolations(targetTransaction.transactionID, sourceTransaction.transactionID, mockViolations, mockViolations),
             policy: undefined,
             policyTags: undefined,
@@ -364,7 +362,6 @@ describe('mergeTransactionRequest', () => {
             sourceTransaction,
             targetTransactionThreadReport: {reportID: 'target123'},
             targetTransactionThreadParentReport: undefined,
-            targetTransactionThreadParentReportNextStep: undefined,
             allTransactionViolations: createAllTransactionViolations(targetTransaction.transactionID, sourceTransaction.transactionID, mockViolations, mockViolations),
             policy: undefined,
             policyTags: undefined,
@@ -473,7 +470,6 @@ describe('mergeTransactionRequest', () => {
                 sourceTransaction,
                 targetTransactionThreadReport: {reportID: 'target-report-456'},
                 targetTransactionThreadParentReport: undefined,
-                targetTransactionThreadParentReportNextStep: undefined,
                 allTransactionViolations: createAllTransactionViolations(targetTransaction.transactionID, sourceTransaction.transactionID, targetViolations, sourceViolations),
                 policy: undefined,
                 policyTags: undefined,
diff --git a/tests/actions/PolicyCategoryTest.ts b/tests/actions/PolicyCategoryTest.ts
index dd9af3f64757..3ad2c66a99e4 100644
--- a/tests/actions/PolicyCategoryTest.ts
+++ b/tests/actions/PolicyCategoryTest.ts
@@ -87,16 +87,7 @@ describe('actions/PolicyCategory', () => {
             mockFetch?.pause?.();
             Onyx.set(`${ONYXKEYS.COLLECTION.POLICY}${fakePolicy.id}`, fakePolicy);
             Onyx.set(`${ONYXKEYS.COLLECTION.POLICY_CATEGORIES}${fakePolicy.id}`, fakeCategories);
-            createPolicyCategory({
-                policyID: fakePolicy.id,
-                categoryName: newCategoryName,
-                isSetupCategoriesTaskParentReportArchived: false,
-                setupCategoryTaskReport: undefined,
-                setupCategoryTaskParentReport: undefined,
-                currentUserAccountID: CONST.DEFAULT_NUMBER_ID,
-                hasOutstandingChildTask: false,
-                parentReportAction: undefined,
-            });
+            createPolicyCategory(fakePolicy.id, newCategoryName, false, undefined, undefined, CONST.DEFAULT_NUMBER_ID, false, undefined);
             await waitForBatchedUpdates();
             await new Promise<void>((resolve) => {
                 const connection = Onyx.connect({
@@ -198,16 +189,7 @@ describe('actions/PolicyCategory', () => {
             Onyx.set(`${ONYXKEYS.COLLECTION.POLICY_CATEGORIES}${fakePolicy.id}`, fakeCategories);
 
             const {result: policyData} = renderHook(() => usePolicyData(fakePolicy.id), {wrapper: OnyxListItemProvider});
-            setWorkspaceCategoryEnabled({
-                policyData: policyData.current,
-                categoriesToUpdate,
-                isSetupCategoriesTaskParentReportArchived: false,
-                setupCategoryTaskReport: undefined,
-                setupCategoryTaskParentReport: undefined,
-                currentUserAccountID: CONST.DEFAULT_NUMBER_ID,
-                hasOutstandingChildTask: false,
-                parentReportAction: undefined,
-            });
+            setWorkspaceCategoryEnabled(policyData.current, categoriesToUpdate, false, undefined, undefined, CONST.DEFAULT_NUMBER_ID, false, undefined);
             await waitForBatchedUpdates();
             await new Promise<void>((resolve) => {
                 const connection = Onyx.connect({
@@ -515,102 +497,4 @@ describe('actions/PolicyCategory', () => {
             await waitForBatchedUpdates();
         });
     });
-
-    describe('createPolicyCategory with onboarding task completion', () => {
-        it('should complete SETUP_CATEGORIES_AND_TAGS task when creating category and tags already exist', async () => {
-            const fakePolicy = createRandomPolicy(0);
-            const fakeCategories = createRandomPolicyCategories(3);
-            const fakeTags = createRandomPolicyTags('TestTagList', 2);
-            const newCategoryName = 'New category';
-
-            // Create a fake task report for SETUP_CATEGORIES_AND_TAGS
-            const fakeTaskReportID = '123456';
-            const fakeTaskReport = {
-                reportID: fakeTaskReportID,
-                type: CONST.REPORT.TYPE.TASK,
-                stateNum: CONST.REPORT.STATE_NUM.OPEN,
-                statusNum: CONST.REPORT.STATUS_NUM.OPEN,
-            };
-
-            mockFetch?.pause?.();
-            await Onyx.set(`${ONYXKEYS.COLLECTION.POLICY}${fakePolicy.id}`, fakePolicy);
-            await Onyx.set(`${ONYXKEYS.COLLECTION.POLICY_CATEGORIES}${fakePolicy.id}`, fakeCategories);
-            await Onyx.set(`${ONYXKEYS.COLLECTION.POLICY_TAGS}${fakePolicy.id}`, fakeTags);
-            await Onyx.set(`${ONYXKEYS.COLLECTION.REPORT}${fakeTaskReportID}`, fakeTaskReport);
-
-            createPolicyCategory({
-                policyID: fakePolicy.id,
-                categoryName: newCategoryName,
-                isSetupCategoriesTaskParentReportArchived: false,
-                setupCategoryTaskReport: undefined,
-                setupCategoryTaskParentReport: undefined,
-                currentUserAccountID: CONST.DEFAULT_NUMBER_ID,
-                hasOutstandingChildTask: false,
-                parentReportAction: undefined,
-                setupCategoriesAndTagsTaskReport: fakeTaskReport,
-                setupCategoriesAndTagsTaskParentReport: undefined,
-                isSetupCategoriesAndTagsTaskParentReportArchived: false,
-                setupCategoriesAndTagsHasOutstandingChildTask: false,
-                setupCategoriesAndTagsParentReportAction: undefined,
-                policyHasTags: true,
-            });
-
-            await waitForBatchedUpdates();
-
-            // Verify the category was created
-            const policyCategories = await OnyxUtils.get(`${ONYXKEYS.COLLECTION.POLICY_CATEGORIES}${fakePolicy.id}`);
-            const newCategory = policyCategories?.[newCategoryName];
-            expect(newCategory?.name).toBe(newCategoryName);
-
-            await mockFetch?.resume?.();
-            await waitForBatchedUpdates();
-        });
-
-        it('should NOT complete SETUP_CATEGORIES_AND_TAGS task when creating category but no tags exist', async () => {
-            const fakePolicy = createRandomPolicy(0);
-            const fakeCategories = createRandomPolicyCategories(3);
-            const newCategoryName = 'New category without tags';
-
-            // Create a fake task report for SETUP_CATEGORIES_AND_TAGS
-            const fakeTaskReportID = '789012';
-            const fakeTaskReport = {
-                reportID: fakeTaskReportID,
-                type: CONST.REPORT.TYPE.TASK,
-                stateNum: CONST.REPORT.STATE_NUM.OPEN,
-                statusNum: CONST.REPORT.STATUS_NUM.OPEN,
-            };
-
-            mockFetch?.pause?.();
-            await Onyx.set(`${ONYXKEYS.COLLECTION.POLICY}${fakePolicy.id}`, fakePolicy);
-            await Onyx.set(`${ONYXKEYS.COLLECTION.POLICY_CATEGORIES}${fakePolicy.id}`, fakeCategories);
-            await Onyx.set(`${ONYXKEYS.COLLECTION.REPORT}${fakeTaskReportID}`, fakeTaskReport);
-
-            createPolicyCategory({
-                policyID: fakePolicy.id,
-                categoryName: newCategoryName,
-                isSetupCategoriesTaskParentReportArchived: false,
-                setupCategoryTaskReport: undefined,
-                setupCategoryTaskParentReport: undefined,
-                currentUserAccountID: CONST.DEFAULT_NUMBER_ID,
-                hasOutstandingChildTask: false,
-                parentReportAction: undefined,
-                setupCategoriesAndTagsTaskReport: fakeTaskReport,
-                setupCategoriesAndTagsTaskParentReport: undefined,
-                isSetupCategoriesAndTagsTaskParentReportArchived: false,
-                setupCategoriesAndTagsHasOutstandingChildTask: false,
-                setupCategoriesAndTagsParentReportAction: undefined,
-                policyHasTags: false,
-            });
-
-            await waitForBatchedUpdates();
-
-            // Verify the category was created
-            const policyCategories = await OnyxUtils.get(`${ONYXKEYS.COLLECTION.POLICY_CATEGORIES}${fakePolicy.id}`);
-            const newCategory = policyCategories?.[newCategoryName];
-            expect(newCategory?.name).toBe(newCategoryName);
-
-            await mockFetch?.resume?.();
-            await waitForBatchedUpdates();
-        });
-    });
 });
diff --git a/tests/actions/PolicyMemberTest.ts b/tests/actions/PolicyMemberTest.ts
index 84c604965cfc..c09f3f3809c7 100644
--- a/tests/actions/PolicyMemberTest.ts
+++ b/tests/actions/PolicyMemberTest.ts
@@ -332,19 +332,15 @@ describe('actions/PolicyMember', () => {
                     [ownerAccountID]: {notificationPreference: 'always'},
                 },
             });
-            await Onyx.set(ONYXKEYS.PERSONAL_DETAILS_LIST, {
-                [auditorAccountID]: {login: auditorEmail},
-            });
 
             // When adding a new admin, auditor, and user members
-            mockFetch?.pause?.();
             Member.addMembersToWorkspace({[adminEmail]: adminAccountID}, 'Welcome', policyID, [], CONST.POLICY.ROLE.ADMIN, TestHelper.formatPhoneNumber);
             Member.addMembersToWorkspace({[auditorEmail]: auditorAccountID}, 'Welcome', policyID, [], CONST.POLICY.ROLE.AUDITOR, TestHelper.formatPhoneNumber);
             Member.addMembersToWorkspace({[userEmail]: userAccountID}, 'Welcome', policyID, [], CONST.POLICY.ROLE.USER, TestHelper.formatPhoneNumber);
 
             await waitForBatchedUpdates();
 
-            // Then only the admin and auditor should be added to the #admins room optimistically
+            // Then only the admin and auditor should be added to the #admins room
             const adminRoom = await new Promise<OnyxEntry<Report>>((resolve) => {
                 const connection = Onyx.connect({
                     key: `${ONYXKEYS.COLLECTION.REPORT}${adminRoomID}`,
@@ -357,20 +353,6 @@ describe('actions/PolicyMember', () => {
             expect(adminRoom?.participants?.[adminAccountID]).toBeTruthy();
             expect(adminRoom?.participants?.[auditorAccountID]).toBeTruthy();
             expect(adminRoom?.participants?.[userAccountID]).toBeUndefined();
-
-            // and removed if the account is optimistic
-            await mockFetch?.resume?.();
-            const adminRoomSuccess = await new Promise<OnyxEntry<Report>>((resolve) => {
-                const connection = Onyx.connect({
-                    key: `${ONYXKEYS.COLLECTION.REPORT}${adminRoomID}`,
-                    callback: (report) => {
-                        Onyx.disconnect(connection);
-                        resolve(report);
-                    },
-                });
-            });
-            expect(adminRoomSuccess?.participants?.[adminAccountID]).toBeUndefined();
-            expect(adminRoomSuccess?.participants?.[auditorAccountID]).toBeTruthy();
         });
 
         it('should unarchive existing workspace expense chat and expense report when adding back a member', async () => {
diff --git a/tests/actions/PolicyTagTest.ts b/tests/actions/PolicyTagTest.ts
index f8ab2b3f5350..73f4574cb5d7 100644
--- a/tests/actions/PolicyTagTest.ts
+++ b/tests/actions/PolicyTagTest.ts
@@ -2222,105 +2222,4 @@ describe('actions/Policy', () => {
             }
         });
     });
-
-    describe('createPolicyTag with onboarding task completion', () => {
-        it('should create a new tag and complete SETUP_TAGS task', async () => {
-            const fakePolicy = createRandomPolicy(0);
-            const fakeTags = createRandomPolicyTags('TestTagList', 2);
-            const newTagName = 'New tag';
-
-            // Create a fake task report for SETUP_TAGS
-            const fakeTaskReportID = '123456';
-            const fakeTaskReport = {
-                reportID: fakeTaskReportID,
-                type: CONST.REPORT.TYPE.TASK,
-                stateNum: CONST.REPORT.STATE_NUM.OPEN,
-                statusNum: CONST.REPORT.STATUS_NUM.OPEN,
-            };
-
-            mockFetch?.pause?.();
-            await Onyx.set(`${ONYXKEYS.COLLECTION.POLICY}${fakePolicy.id}`, fakePolicy);
-            await Onyx.set(`${ONYXKEYS.COLLECTION.POLICY_TAGS}${fakePolicy.id}`, fakeTags);
-            await Onyx.set(`${ONYXKEYS.COLLECTION.REPORT}${fakeTaskReportID}`, fakeTaskReport);
-
-            createPolicyTag(fakePolicy.id, newTagName, fakeTags, fakeTaskReport, undefined, false);
-
-            await waitForBatchedUpdates();
-
-            // Verify the tag was created
-            const policyTags = await OnyxUtils.get(`${ONYXKEYS.COLLECTION.POLICY_TAGS}${fakePolicy.id}`);
-            const tagList = Object.values(policyTags ?? {}).at(0);
-            const newTag = tagList?.tags?.[newTagName];
-            expect(newTag?.name).toBe(newTagName);
-
-            await mockFetch?.resume?.();
-            await waitForBatchedUpdates();
-        });
-
-        it('should complete SETUP_CATEGORIES_AND_TAGS task when creating tag and categories already exist', async () => {
-            const fakePolicy = createRandomPolicy(0);
-            const fakeTags = createRandomPolicyTags('TestTagList', 2);
-            const newTagName = 'New tag with categories';
-
-            // Create a fake task report for SETUP_CATEGORIES_AND_TAGS
-            const fakeTaskReportID = '789012';
-            const fakeTaskReport = {
-                reportID: fakeTaskReportID,
-                type: CONST.REPORT.TYPE.TASK,
-                stateNum: CONST.REPORT.STATE_NUM.OPEN,
-                statusNum: CONST.REPORT.STATUS_NUM.OPEN,
-            };
-
-            mockFetch?.pause?.();
-            await Onyx.set(`${ONYXKEYS.COLLECTION.POLICY}${fakePolicy.id}`, fakePolicy);
-            await Onyx.set(`${ONYXKEYS.COLLECTION.POLICY_TAGS}${fakePolicy.id}`, fakeTags);
-            await Onyx.set(`${ONYXKEYS.COLLECTION.REPORT}${fakeTaskReportID}`, fakeTaskReport);
-
-            createPolicyTag(fakePolicy.id, newTagName, fakeTags, undefined, fakeTaskReport, true);
-
-            await waitForBatchedUpdates();
-
-            // Verify the tag was created
-            const policyTags = await OnyxUtils.get(`${ONYXKEYS.COLLECTION.POLICY_TAGS}${fakePolicy.id}`);
-            const tagList = Object.values(policyTags ?? {}).at(0);
-            const newTag = tagList?.tags?.[newTagName];
-            expect(newTag?.name).toBe(newTagName);
-
-            await mockFetch?.resume?.();
-            await waitForBatchedUpdates();
-        });
-
-        it('should NOT complete SETUP_CATEGORIES_AND_TAGS task when creating tag but no custom categories exist', async () => {
-            const fakePolicy = createRandomPolicy(0);
-            const fakeTags = createRandomPolicyTags('TestTagList', 2);
-            const newTagName = 'New tag without categories';
-
-            // Create a fake task report for SETUP_CATEGORIES_AND_TAGS
-            const fakeTaskReportID = '345678';
-            const fakeTaskReport = {
-                reportID: fakeTaskReportID,
-                type: CONST.REPORT.TYPE.TASK,
-                stateNum: CONST.REPORT.STATE_NUM.OPEN,
-                statusNum: CONST.REPORT.STATUS_NUM.OPEN,
-            };
-
-            mockFetch?.pause?.();
-            await Onyx.set(`${ONYXKEYS.COLLECTION.POLICY}${fakePolicy.id}`, fakePolicy);
-            await Onyx.set(`${ONYXKEYS.COLLECTION.POLICY_TAGS}${fakePolicy.id}`, fakeTags);
-            await Onyx.set(`${ONYXKEYS.COLLECTION.REPORT}${fakeTaskReportID}`, fakeTaskReport);
-
-            createPolicyTag(fakePolicy.id, newTagName, fakeTags, undefined, fakeTaskReport, false);
-
-            await waitForBatchedUpdates();
-
-            // Verify the tag was created
-            const policyTags = await OnyxUtils.get(`${ONYXKEYS.COLLECTION.POLICY_TAGS}${fakePolicy.id}`);
-            const tagList = Object.values(policyTags ?? {}).at(0);
-            const newTag = tagList?.tags?.[newTagName];
-            expect(newTag?.name).toBe(newTagName);
-
-            await mockFetch?.resume?.();
-            await waitForBatchedUpdates();
-        });
-    });
 });
diff --git a/tests/actions/ReportPreviewActionUtilsTest.ts b/tests/actions/ReportPreviewActionUtilsTest.ts
index d8567e12702c..67692adf734d 100644
--- a/tests/actions/ReportPreviewActionUtilsTest.ts
+++ b/tests/actions/ReportPreviewActionUtilsTest.ts
@@ -104,9 +104,6 @@ describe('getReportPreviewAction', () => {
         await Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT}${REPORT_ID}`, report);
         const transaction = {
             reportID: `${REPORT_ID}`,
-            amount: 100,
-            merchant: 'Test Merchant',
-            created: '2025-01-01',
         } as unknown as Transaction;
 
         // Simulate how components use a hook to pass the isReportArchived parameter
@@ -150,9 +147,6 @@ describe('getReportPreviewAction', () => {
 
         const transaction = {
             reportID: `${REPORT_ID}`,
-            amount: 100,
-            merchant: 'Test Merchant',
-            created: '2025-01-01',
         } as unknown as Transaction;
 
         // Simulate how components use a hook to pass the isReportArchived parameter
@@ -292,9 +286,6 @@ describe('getReportPreviewAction', () => {
             await Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT}${REPORT_ID}`, report);
             const transaction = {
                 reportID: `${REPORT_ID}`,
-                amount: 100,
-                merchant: 'Test Merchant',
-                created: '2025-01-01',
             } as unknown as Transaction;
 
             const {result: isReportArchived} = renderHook(() => useReportIsArchived(report?.parentReportID));
@@ -410,9 +401,6 @@ describe('getReportPreviewAction', () => {
         await Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT}${REPORT_ID}`, report);
         const transaction = {
             reportID: `${REPORT_ID}`,
-            amount: 100,
-            merchant: 'Test Merchant',
-            created: '2025-01-01',
         } as unknown as Transaction;
 
         const {result: isReportArchived} = renderHook(() => useReportIsArchived(report?.parentReportID));
diff --git a/tests/actions/ReportTest.ts b/tests/actions/ReportTest.ts
index b1cc8c93b63c..740e124c3713 100644
--- a/tests/actions/ReportTest.ts
+++ b/tests/actions/ReportTest.ts
@@ -449,7 +449,6 @@ describe('actions/Report', () => {
                     person: [{type: 'TEXT', style: 'strong', text: 'Test User'}],
                     shouldShow: true,
                     created: DateUtils.getDBTime(Date.now() - 3),
-                    reportID: REPORT_ID,
                 };
 
                 const optimisticReportActions: OnyxUpdate<typeof ONYXKEYS.COLLECTION.REPORT_ACTIONS> = {
@@ -902,6 +901,79 @@ describe('actions/Report', () => {
         TestHelper.expectAPICommandToHaveBeenCalled(WRITE_COMMANDS.OPEN_REPORT, 1);
     });
 
+    it('openReport legacy preview fallback stores action under correct Onyx key and preserves existing actions', async () => {
+        global.fetch = TestHelper.getGlobalFetchMock();
+
+        const TEST_USER_ACCOUNT_ID = 1;
+        const TEST_USER_LOGIN = 'test@user.com';
+        const SELF_DM_ID = '555';
+        const CHILD_REPORT_ID = '9999';
+        const TXN_ID = 'txn_123';
+
+        // Sign in and set personal details
+        await TestHelper.signInWithTestUser(TEST_USER_ACCOUNT_ID, TEST_USER_LOGIN);
+        await TestHelper.setPersonalDetails(TEST_USER_LOGIN, TEST_USER_ACCOUNT_ID);
+
+        // Seed a self-DM report
+        await Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT}${SELF_DM_ID}`, {
+            reportID: SELF_DM_ID,
+            chatType: CONST.REPORT.CHAT_TYPE.SELF_DM,
+        } as OnyxTypes.Report);
+
+        // Seed an existing action in self DM to ensure MERGE does not overwrite
+        await Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${SELF_DM_ID}`, {
+            123: {
+                actionName: CONST.REPORT.ACTIONS.TYPE.ADD_COMMENT,
+                message: [{type: 'COMMENT', html: 'Existing', text: 'Existing'}],
+                reportActionID: '123',
+                created: DateUtils.getDBTime(),
+            },
+        } as unknown as OnyxTypes.ReportActions);
+
+        // Seed a legacy transaction (no parentReportActionID)
+        await Onyx.merge(`${ONYXKEYS.COLLECTION.TRANSACTION}${TXN_ID}`, {
+            transactionID: TXN_ID,
+            amount: -101,
+            currency: CONST.CURRENCY.USD,
+            comment: {comment: 'Legacy expense'},
+        } as unknown as OnyxTypes.Transaction);
+
+        // Get the transaction object from Onyx
+        const transaction = await getOnyxValue(`${ONYXKEYS.COLLECTION.TRANSACTION}${TXN_ID}` as const);
+        expect(transaction).toBeTruthy();
+
+        // Call openReport with transaction object to trigger the legacy preview flow
+        Report.openReport(CHILD_REPORT_ID, undefined, [], undefined, undefined, false, [], undefined, false, transaction ?? undefined, undefined, SELF_DM_ID);
+        await waitForBatchedUpdates();
+
+        // Validate the correct Onyx key received the new action and existing one is preserved
+        const selfDMActions = (await getOnyxValue(`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${SELF_DM_ID}` as const)) as OnyxTypes.ReportActions | undefined;
+        expect(selfDMActions).toBeTruthy();
+        // Existing action still present
+        expect(selfDMActions?.['123']).toBeTruthy();
+
+        // Derive the created parentReportActionID from the self DM actions by finding the one that links to the child report
+        const entries = Object.entries(selfDMActions ?? {}) as Array<[string, OnyxTypes.ReportAction]>;
+        const createdEntry = entries.find((tuple): tuple is [string, OnyxTypes.ReportAction] => tuple?.[1]?.childReportID === CHILD_REPORT_ID);
+        expect(createdEntry).toBeDefined();
+        // Type guard for TS; the expect above will fail the test if undefined
+        if (!createdEntry) {
+            return;
+        }
+        const [parentReportActionID, createdAction] = createdEntry;
+        expect(createdAction.childReportID).toBe(CHILD_REPORT_ID);
+
+        // Ensure we did not create a stray concatenated key like reportActions_<selfDMReportID><generatedActionID>
+        const wrongKeyValue = await getOnyxValue(`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${SELF_DM_ID}${parentReportActionID}` as const);
+        expect(wrongKeyValue).toBeUndefined();
+
+        // The API call should include moneyRequestPreviewReportActionID matching the created action
+        TestHelper.expectAPICommandToHaveBeenCalledWith(WRITE_COMMANDS.OPEN_REPORT, 0, {
+            reportID: CHILD_REPORT_ID,
+            moneyRequestPreviewReportActionID: parentReportActionID,
+        });
+    });
+
     it('should replace duplicate OpenReport commands with the same reportID', async () => {
         global.fetch = TestHelper.getGlobalFetchMock();
 
diff --git a/tests/actions/TaskTest.ts b/tests/actions/TaskTest.ts
index 333a34327b88..2a3a27c05e82 100644
--- a/tests/actions/TaskTest.ts
+++ b/tests/actions/TaskTest.ts
@@ -764,7 +764,7 @@ describe('actions/Task', () => {
             // Verify optimisticData contains childStateNum and childStatusNum updates
             // eslint-disable-next-line rulesdir/no-multiple-api-calls
             const calls = (API.write as jest.Mock).mock.calls;
-            const [, , onyxData] = calls.at(0) as [unknown, unknown, OnyxData<typeof ONYXKEYS.COLLECTION.REPORT_ACTIONS>];
+            const [, , onyxData] = calls.at(0) as [unknown, unknown, OnyxData];
             const optimisticData = onyxData.optimisticData ?? [];
 
             // Find the optimistic update for parent report action
@@ -826,7 +826,7 @@ describe('actions/Task', () => {
             // Verify optimisticData does NOT contain parent report action updates
             // eslint-disable-next-line rulesdir/no-multiple-api-calls
             const calls = (API.write as jest.Mock).mock.calls;
-            const [, , onyxData] = calls.at(0) as [unknown, unknown, OnyxData<typeof ONYXKEYS.COLLECTION.REPORT_ACTIONS>];
+            const [, , onyxData] = calls.at(0) as [unknown, unknown, OnyxData];
             const optimisticData = onyxData.optimisticData ?? [];
 
             // Should not have any parent report action updates
diff --git a/tests/actions/connections/QuickbooksOnline.ts b/tests/actions/connections/QuickbooksOnline.ts
index c4bda725bbfb..a85ae15e864d 100644
--- a/tests/actions/connections/QuickbooksOnline.ts
+++ b/tests/actions/connections/QuickbooksOnline.ts
@@ -1,4 +1,4 @@
-import type {OnyxKey, OnyxUpdate} from 'react-native-onyx';
+import type {OnyxUpdate} from 'react-native-onyx';
 import Onyx from 'react-native-onyx';
 // eslint-disable-next-line no-restricted-syntax -- this is required to allow mocking
 import * as API from '@libs/API';
@@ -41,7 +41,7 @@ function getRequiredQuickBooksConfig(update?: OnyxUpdate): QBOConnectionConfig {
     return config;
 }
 
-function getFirstWriteCall(): {command: WriteCommand; onyxData?: OnyxData<OnyxKey>} {
+function getFirstWriteCall(): {command: WriteCommand; onyxData?: OnyxData} {
     const call = writeSpy.mock.calls.at(0);
     if (!call) {
         throw new Error('API.write was not called');
diff --git a/tests/perf-test/OptionsListUtils.perf-test.ts b/tests/perf-test/OptionsListUtils.perf-test.ts
index e6867e5337a5..8b23f320a2aa 100644
--- a/tests/perf-test/OptionsListUtils.perf-test.ts
+++ b/tests/perf-test/OptionsListUtils.perf-test.ts
@@ -6,7 +6,7 @@ import {createOptionList, filterAndOrderOptions, getMemberInviteOptions, getSear
 import type {OptionData} from '@libs/ReportUtils';
 import CONST from '@src/CONST';
 import ONYXKEYS from '@src/ONYXKEYS';
-import type {PersonalDetails, Policy} from '@src/types/onyx';
+import type {PersonalDetails} from '@src/types/onyx';
 import type Report from '@src/types/onyx/Report';
 import {formatSectionsFromSearchTerm} from '../../src/libs/OptionsListUtils';
 import createCollection from '../utils/collections/createCollection';
@@ -67,19 +67,6 @@ const mockedPersonalDetailsMap = getMockedPersonalDetails(PERSONAL_DETAILS_LIST_
 
 const mockedBetas = Object.values(CONST.BETAS);
 
-const allPolicies = {
-    [`${ONYXKEYS.COLLECTION.POLICY}policy1`]: {
-        id: 'policy1',
-        name: 'Test Policy',
-        role: 'admin',
-        type: CONST.POLICY.TYPE.TEAM,
-        owner: 'test@expensify.com',
-        outputCurrency: 'USD',
-        isPolicyExpenseChatEnabled: false,
-        approvalMode: CONST.POLICY.APPROVAL_MODE.OPTIONAL,
-    } as Policy,
-};
-
 jest.mock('@react-navigation/native', () => {
     const actualNav = jest.requireActual<typeof NativeNavigation>('@react-navigation/native');
     return {
@@ -131,28 +118,14 @@ describe('OptionsListUtils', () => {
     /* Testing getFilteredOptions */
     test('[OptionsListUtils] getFilteredOptions with search value', async () => {
         await waitForBatchedUpdates();
-        const formattedOptions = getValidOptions(
-            {reports: options.reports, personalDetails: options.personalDetails},
-            allPolicies,
-            {},
-            nvpDismissedProductTraining,
-            loginList,
-            ValidOptionsConfig,
-        );
+        const formattedOptions = getValidOptions({reports: options.reports, personalDetails: options.personalDetails}, {}, nvpDismissedProductTraining, loginList, ValidOptionsConfig);
         await measureFunction(() => {
             filterAndOrderOptions(formattedOptions, SEARCH_VALUE, COUNTRY_CODE, loginList);
         });
     });
     test('[OptionsListUtils] getFilteredOptions with empty search value', async () => {
         await waitForBatchedUpdates();
-        const formattedOptions = getValidOptions(
-            {reports: options.reports, personalDetails: options.personalDetails},
-            allPolicies,
-            {},
-            nvpDismissedProductTraining,
-            loginList,
-            ValidOptionsConfig,
-        );
+        const formattedOptions = getValidOptions({reports: options.reports, personalDetails: options.personalDetails}, {}, nvpDismissedProductTraining, loginList, ValidOptionsConfig);
         await measureFunction(() => {
             filterAndOrderOptions(formattedOptions, '', COUNTRY_CODE, loginList);
         });
@@ -162,7 +135,7 @@ describe('OptionsListUtils', () => {
     test('[OptionsListUtils] getShareDestinationOptions', async () => {
         await waitForBatchedUpdates();
         await measureFunction(() =>
-            getValidOptions({reports: options.reports, personalDetails: options.personalDetails}, allPolicies, {}, nvpDismissedProductTraining, loginList, {
+            getValidOptions({reports: options.reports, personalDetails: options.personalDetails}, {}, nvpDismissedProductTraining, loginList, {
                 betas: mockedBetas,
                 includeMultipleParticipantReports: true,
                 showChatPreviewLine: true,
diff --git a/tests/perf-test/ReportActionCompose.perf-test.tsx b/tests/perf-test/ReportActionCompose.perf-test.tsx
index 4496f145ef57..92c7b77456e8 100644
--- a/tests/perf-test/ReportActionCompose.perf-test.tsx
+++ b/tests/perf-test/ReportActionCompose.perf-test.tsx
@@ -48,7 +48,6 @@ jest.mock('@react-navigation/native', () => {
         useIsFocused: () => true,
         useNavigationState: () => {},
         useFocusEffect: jest.fn(),
-        useRoute: () => jest.fn(),
     };
 });
 
diff --git a/tests/perf-test/ReportUtils.perf-test.ts b/tests/perf-test/ReportUtils.perf-test.ts
index 932993811fcb..574d1867adec 100644
--- a/tests/perf-test/ReportUtils.perf-test.ts
+++ b/tests/perf-test/ReportUtils.perf-test.ts
@@ -268,7 +268,7 @@ describe('ReportUtils', () => {
             requiresTag: true,
         };
 
-        const onyxData: OnyxData<typeof ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS> = {
+        const onyxData: OnyxData = {
             optimisticData: [],
             failureData: [],
             successData: [],
diff --git a/tests/perf-test/SidebarUtils.perf-test.ts b/tests/perf-test/SidebarUtils.perf-test.ts
index ab45ab1c4642..9c1db3ad522c 100644
--- a/tests/perf-test/SidebarUtils.perf-test.ts
+++ b/tests/perf-test/SidebarUtils.perf-test.ts
@@ -90,7 +90,6 @@ describe('SidebarUtils', () => {
                 localeCompare,
                 lastActionReport: undefined,
                 isReportArchived: undefined,
-                currentUserAccountID: 1,
             }),
         );
     });
diff --git a/tests/ui/AssignCardFeed.tsx b/tests/ui/AssignCardFeed.tsx
index a9a3bcf22bdc..ce92dd4ca914 100644
--- a/tests/ui/AssignCardFeed.tsx
+++ b/tests/ui/AssignCardFeed.tsx
@@ -9,31 +9,21 @@ import OnyxListItemProvider from '@components/OnyxListItemProvider';
 import {CurrentReportIDContextProvider} from '@hooks/useCurrentReportID';
 import * as useResponsiveLayoutModule from '@hooks/useResponsiveLayout';
 import type ResponsiveLayoutResult from '@hooks/useResponsiveLayout/types';
-import * as useSearchSelectorModule from '@hooks/useSearchSelector';
 import Navigation from '@libs/Navigation/Navigation';
 import createPlatformStackNavigator from '@libs/Navigation/PlatformStackNavigation/createPlatformStackNavigator';
-import {getEmptyOptions} from '@libs/OptionsListUtils';
 import type {SettingsNavigatorParamList} from '@navigation/types';
-import AssigneeStep from '@pages/workspace/companyCards/assignCard/AssigneeStep';
-import ConfirmationStep from '@pages/workspace/companyCards/assignCard/ConfirmationStep';
-import {setAssignCardStepAndData} from '@userActions/CompanyCards';
+import AssignCardFeedAssigneePage from '@pages/workspace/companyCards/assignCard/AssigneeStep';
 import CONST from '@src/CONST';
 import ONYXKEYS from '@src/ONYXKEYS';
 import ROUTES from '@src/ROUTES';
 import SCREENS from '@src/SCREENS';
-import type {CompanyCardFeed, CompanyCardFeedWithDomainID} from '@src/types/onyx/CardFeeds';
+import type {CompanyCardFeedWithDomainID} from '@src/types/onyx/CardFeeds';
 import * as LHNTestUtils from '../utils/LHNTestUtils';
 import * as TestHelper from '../utils/TestHelper';
 import waitForBatchedUpdatesWithAct from '../utils/waitForBatchedUpdatesWithAct';
 
-const WORKSPACE_ACCOUNT_ID = 5678;
-
-// Commercial feed (VCF) - has encrypted card numbers
-const COMMERCIAL_FEED = `${CONST.COMPANY_CARD.FEED_BANK_NAME.VISA}#${WORKSPACE_ACCOUNT_ID}` as CompanyCardFeedWithDomainID;
-
-// Direct feed (Plaid) - card name equals card ID
-const DIRECT_FEED = `plaid.ins_123#${WORKSPACE_ACCOUNT_ID}` as CompanyCardFeedWithDomainID;
-
+const FEED_DOMAIN_ID = 1234;
+const FEED = `${CONST.COMPANY_CARD.FEED_BANK_NAME.AMEX}.${FEED_DOMAIN_ID}` as CompanyCardFeedWithDomainID;
 const CARD_ID = '1234';
 
 // Set up a global fetch mock for API requests in tests.
@@ -79,50 +69,25 @@ jest.mock('react-native-plaid-link-sdk', () => ({
     usePlaidEmitter: jest.fn(),
 }));
 
-jest.mock('@libs/Navigation/Navigation', () => ({
-    navigate: jest.fn(),
-    goBack: jest.fn(),
-    setNavigationActionToMicrotaskQueue: jest.fn((callback: () => void) => callback?.()),
-    dismissModal: jest.fn(),
-    getTopmostReportId: jest.fn(),
-}));
-
-jest.mock('@userActions/CompanyCards', () => ({
-    setAssignCardStepAndData: jest.fn(),
-}));
+jest.mock('@components/FormAlertWrapper', () => 'FormAlertWrapper');
+jest.mock('@components/FormAlertWithSubmitButton', () => 'FormAlertWithSubmitButton');
 
 // Create a stack navigator for the settings pages.
 const Stack = createPlatformStackNavigator<SettingsNavigatorParamList>();
 
-// Renders the AssigneeStep inside a navigation container with necessary providers.
-const renderAssigneeStep = (initialParams: SettingsNavigatorParamList[typeof SCREENS.WORKSPACE.COMPANY_CARDS_ASSIGN_CARD_ASSIGNEE]) => {
+// Renders the AssignCardFeedPage inside a navigation container with necessary providers.
+const renderPage = (
+    initialRouteName: typeof SCREENS.WORKSPACE.COMPANY_CARDS_ASSIGN_CARD_ASSIGNEE,
+    initialParams: SettingsNavigatorParamList[typeof SCREENS.WORKSPACE.COMPANY_CARDS_ASSIGN_CARD_ASSIGNEE],
+) => {
     return render(
         <ComposeProviders components={[OnyxListItemProvider, LocaleContextProvider, CurrentReportIDContextProvider]}>
             <PortalProvider>
                 <NavigationContainer>
-                    <Stack.Navigator initialRouteName={SCREENS.WORKSPACE.COMPANY_CARDS_ASSIGN_CARD_ASSIGNEE}>
+                    <Stack.Navigator initialRouteName={initialRouteName}>
                         <Stack.Screen
                             name={SCREENS.WORKSPACE.COMPANY_CARDS_ASSIGN_CARD_ASSIGNEE}
-                            component={AssigneeStep}
-                            initialParams={initialParams}
-                        />
-                    </Stack.Navigator>
-                </NavigationContainer>
-            </PortalProvider>
-        </ComposeProviders>,
-    );
-};
-
-// Renders the ConfirmationStep inside a navigation container with necessary providers.
-const renderConfirmationStep = (initialParams: SettingsNavigatorParamList[typeof SCREENS.WORKSPACE.COMPANY_CARDS_ASSIGN_CARD_CONFIRMATION]) => {
-    return render(
-        <ComposeProviders components={[OnyxListItemProvider, LocaleContextProvider, CurrentReportIDContextProvider]}>
-            <PortalProvider>
-                <NavigationContainer>
-                    <Stack.Navigator initialRouteName={SCREENS.WORKSPACE.COMPANY_CARDS_ASSIGN_CARD_CONFIRMATION}>
-                        <Stack.Screen
-                            name={SCREENS.WORKSPACE.COMPANY_CARDS_ASSIGN_CARD_CONFIRMATION}
-                            component={ConfirmationStep}
+                            component={AssignCardFeedAssigneePage}
                             initialParams={initialParams}
                         />
                     </Stack.Navigator>
@@ -132,44 +97,6 @@ const renderConfirmationStep = (initialParams: SettingsNavigatorParamList[typeof
     );
 };
 
-/**
- * Creates mock assign card data for testing.
- *
- * Note on card identifiers:
- * - cardName: The masked card number displayed to users (e.g., "XXXX1234" or "VISA - 1234"). This is immutable.
- * - customCardName: The user-friendly editable card name (e.g., "John's card"). This is what users can edit.
- *   - Initially set to "[User's name]'s card" format in AssigneeStep
- *   - Falls back to cardName if not set (e.g., in CardSelectionStep)
- * - encryptedCardNumber: The identifier sent to backend
- *   - For direct feeds (Plaid/OAuth): equals cardName
- *   - For commercial feeds (Visa/Mastercard/Amex): encrypted value from cardList
- */
-const createMockAssignCardData = (options: {feedType: 'commercial' | 'direct'; email?: string; cardName?: string; customCardName?: string}) => {
-    const {feedType, email = 'testaccount+1@gmail.com', cardName = 'VISA - 1234'} = options;
-    // customCardName defaults to user-friendly format "Test's card" if not provided
-    const customCardName = options.customCardName ?? "Test's card";
-
-    // For commercial feeds, encryptedCardNumber is different from the display card name
-    // For direct feeds, encryptedCardNumber equals the card name
-    // cspell:disable-next-line
-    const encryptedCardNumber = feedType === 'commercial' ? 'v12:74E3CA3C4C0FA02FDCF754FDSFDSF' : 'Plaid Checking 0000';
-    const bankName: CompanyCardFeed = feedType === 'commercial' ? CONST.COMPANY_CARD.FEED_BANK_NAME.VISA : ('plaid.ins_123' as CompanyCardFeed);
-
-    return {
-        cardToAssign: {
-            bankName,
-            email,
-            cardName,
-            customCardName,
-            encryptedCardNumber,
-            dateOption: CONST.COMPANY_CARD.TRANSACTION_START_DATE_OPTIONS.FROM_BEGINNING,
-            startDate: '2024-12-27',
-        },
-        currentStep: CONST.COMPANY_CARD.STEP.CONFIRMATION,
-        isEditing: false,
-    };
-};
-
 describe('AssignCardFeed', () => {
     beforeAll(() => {
         // Initialize Onyx with required keys before running any test.
@@ -194,919 +121,150 @@ describe('AssignCardFeed', () => {
         jest.clearAllMocks();
     });
 
-    describe('AssigneeStep', () => {
-        it('should render the cardholder selection header', async () => {
-            await TestHelper.signInWithTestUser();
-
-            // Mock useSearchSelector to return empty options
-            jest.spyOn(useSearchSelectorModule, 'default').mockReturnValue({
-                searchTerm: '',
-                debouncedSearchTerm: '',
-                setSearchTerm: jest.fn(),
-                searchOptions: getEmptyOptions(),
-                availableOptions: getEmptyOptions(),
-                selectedOptions: [],
-                selectedOptionsForDisplay: [],
-                setSelectedOptions: jest.fn(),
-                toggleSelection: jest.fn(),
-                areOptionsInitialized: true,
-                onListEndReached: jest.fn(),
-            });
-
-            const policy = {
-                ...LHNTestUtils.getFakePolicy(),
-                role: CONST.POLICY.ROLE.ADMIN,
-                employeeList: {
-                    // eslint-disable-next-line @typescript-eslint/naming-convention
-                    'testaccount+1@gmail.com': {email: 'testaccount+1@gmail.com'},
-                    // eslint-disable-next-line @typescript-eslint/naming-convention
-                    'testaccount+2@gmail.com': {email: 'testaccount+2@gmail.com'},
-                },
-            };
-
-            await act(async () => {
-                await Onyx.merge(`${ONYXKEYS.COLLECTION.POLICY}${policy.id}`, policy);
-                await Onyx.merge(ONYXKEYS.NETWORK, {isOffline: false});
-                await Onyx.merge(ONYXKEYS.ASSIGN_CARD, {
-                    currentStep: CONST.COMPANY_CARD.STEP.ASSIGNEE,
-                    isEditing: false,
-                });
-            });
-
-            const {unmount} = renderAssigneeStep({
-                policyID: policy.id,
-                feed: COMMERCIAL_FEED,
-                cardID: CARD_ID,
-            });
-
-            await waitForBatchedUpdatesWithAct();
-
-            // Verify that the assignee step renders with the cardholder selection prompt
-            await waitFor(() => {
-                expect(screen.getByText('Choose the cardholder')).toBeOnTheScreen();
-            });
-
-            unmount();
-            await waitForBatchedUpdatesWithAct();
-        });
-
-        it('should render the header title for card assignment', async () => {
-            await TestHelper.signInWithTestUser();
-
-            // Mock useSearchSelector
-            jest.spyOn(useSearchSelectorModule, 'default').mockReturnValue({
-                searchTerm: '',
-                debouncedSearchTerm: '',
-                setSearchTerm: jest.fn(),
-                searchOptions: getEmptyOptions(),
-                availableOptions: getEmptyOptions(),
-                selectedOptions: [],
-                selectedOptionsForDisplay: [],
-                setSelectedOptions: jest.fn(),
-                toggleSelection: jest.fn(),
-                areOptionsInitialized: true,
-                onListEndReached: jest.fn(),
-            });
-
-            const policy = {
-                ...LHNTestUtils.getFakePolicy(),
-                role: CONST.POLICY.ROLE.ADMIN,
-                employeeList: {
-                    // eslint-disable-next-line @typescript-eslint/naming-convention
-                    'testaccount+1@gmail.com': {email: 'testaccount+1@gmail.com'},
-                },
-            };
-
-            await act(async () => {
-                await Onyx.merge(`${ONYXKEYS.COLLECTION.POLICY}${policy.id}`, policy);
-                await Onyx.merge(ONYXKEYS.NETWORK, {isOffline: false});
-                await Onyx.merge(ONYXKEYS.ASSIGN_CARD, {
-                    currentStep: CONST.COMPANY_CARD.STEP.ASSIGNEE,
-                    isEditing: false,
-                });
-            });
-
-            const {unmount} = renderAssigneeStep({
-                policyID: policy.id,
-                feed: COMMERCIAL_FEED,
-                cardID: CARD_ID,
-            });
-
-            await waitForBatchedUpdatesWithAct();
-
-            // Verify that the header shows "Assign card"
-            await waitFor(() => {
-                expect(screen.getByText('Assign card')).toBeOnTheScreen();
-            });
-
-            unmount();
-            await waitForBatchedUpdatesWithAct();
-        });
-
-        it('should render with previously selected assignee email in editing mode', async () => {
-            await TestHelper.signInWithTestUser();
-
-            // Mock useSearchSelector
-            jest.spyOn(useSearchSelectorModule, 'default').mockReturnValue({
-                searchTerm: '',
-                debouncedSearchTerm: '',
-                setSearchTerm: jest.fn(),
-                searchOptions: getEmptyOptions(),
-                availableOptions: getEmptyOptions(),
-                selectedOptions: [],
-                selectedOptionsForDisplay: [],
-                setSelectedOptions: jest.fn(),
-                toggleSelection: jest.fn(),
-                areOptionsInitialized: true,
-                onListEndReached: jest.fn(),
-            });
-
-            const policy = {
-                ...LHNTestUtils.getFakePolicy(),
-                role: CONST.POLICY.ROLE.ADMIN,
-                employeeList: {
-                    // eslint-disable-next-line @typescript-eslint/naming-convention
-                    'testaccount+1@gmail.com': {email: 'testaccount+1@gmail.com'},
-                    // eslint-disable-next-line @typescript-eslint/naming-convention
-                    'testaccount+2@gmail.com': {email: 'testaccount+2@gmail.com'},
+    // TODO: Fix this test in a separate PR next week
+    it.skip('should navigate to the member details page as the assignee email has not changed', async () => {
+        // Sign in as a test user before running the test.
+        await TestHelper.signInWithTestUser();
+        const goBack = jest.spyOn(Navigation, 'goBack');
+        const policy = {
+            ...LHNTestUtils.getFakePolicy(),
+            role: CONST.POLICY.ROLE.ADMIN,
+            areTagsEnabled: true,
+            requiresTag: true,
+        };
+
+        // Add mock policy and mock the assign card details
+        await act(async () => {
+            await Onyx.merge(`${ONYXKEYS.COLLECTION.POLICY}${policy.id}`, policy);
+            await Onyx.merge(ONYXKEYS.NETWORK, {isOffline: false});
+            await Onyx.merge(ONYXKEYS.ASSIGN_CARD, {
+                cardToAssign: {
+                    bankName: 'vcf',
+                    email: 'testaccount+1@gmail.com',
+                    cardName: "Test 1's card",
+                    cardNumber: '490901XXXXXX1234',
+                    // cspell:disable-next-line
+                    encryptedCardNumber: 'v12:74E3CA3C4C0FA02FDCF754FDSFDSF',
+                    dateOption: 'fromBeginning',
+                    startDate: '2024-12-27',
                 },
-            };
-
-            await act(async () => {
-                await Onyx.merge(`${ONYXKEYS.COLLECTION.POLICY}${policy.id}`, policy);
-                await Onyx.merge(ONYXKEYS.NETWORK, {isOffline: false});
-                await Onyx.merge(ONYXKEYS.ASSIGN_CARD, {
-                    cardToAssign: {
-                        email: 'testaccount+1@gmail.com',
-                    },
-                    currentStep: CONST.COMPANY_CARD.STEP.ASSIGNEE,
-                    isEditing: true,
-                });
-            });
-
-            const {unmount} = renderAssigneeStep({
-                policyID: policy.id,
-                feed: COMMERCIAL_FEED,
-                cardID: CARD_ID,
-            });
-
-            await waitForBatchedUpdatesWithAct();
-
-            // Verify the component renders in editing mode
-            await waitFor(() => {
-                expect(screen.getByText('Choose the cardholder')).toBeOnTheScreen();
-            });
-
-            unmount();
-            await waitForBatchedUpdatesWithAct();
-        });
-    });
-
-    describe('ConfirmationStep - Commercial feed card assignment', () => {
-        it('should render assign card button for commercial feed', async () => {
-            await TestHelper.signInWithTestUser();
-            const policy = {
-                ...LHNTestUtils.getFakePolicy(),
-                role: CONST.POLICY.ROLE.ADMIN,
-                workspaceAccountID: WORKSPACE_ACCOUNT_ID,
-            };
-
-            // Set up commercial feed card assignment data
-            // For commercial feeds: cardName (display) !== encryptedCardNumber (backend identifier)
-            await act(async () => {
-                await Onyx.merge(`${ONYXKEYS.COLLECTION.POLICY}${policy.id}`, policy);
-                await Onyx.merge(ONYXKEYS.NETWORK, {isOffline: false});
-                await Onyx.merge(ONYXKEYS.ASSIGN_CARD, createMockAssignCardData({feedType: 'commercial'}));
-            });
-
-            const {unmount} = renderConfirmationStep({
-                policyID: policy.id,
-                feed: COMMERCIAL_FEED,
-                cardID: CARD_ID,
-            });
-
-            await waitForBatchedUpdatesWithAct();
-
-            // Verify the confirmation step displays the assign card button
-            await waitFor(() => {
-                expect(screen.getByTestId(CONST.ASSIGN_CARD_BUTTON_TEST_ID)).toBeOnTheScreen();
+                currentStep: 'Confirmation',
+                isEditing: false,
             });
-
-            unmount();
-            await waitForBatchedUpdatesWithAct();
         });
 
-        it('should display the card name in confirmation step', async () => {
-            await TestHelper.signInWithTestUser();
-            const policy = {
-                ...LHNTestUtils.getFakePolicy(),
-                role: CONST.POLICY.ROLE.ADMIN,
-                workspaceAccountID: WORKSPACE_ACCOUNT_ID,
-            };
-
-            const cardName = "John's Business Card";
-
-            await act(async () => {
-                await Onyx.merge(`${ONYXKEYS.COLLECTION.POLICY}${policy.id}`, policy);
-                await Onyx.merge(ONYXKEYS.NETWORK, {isOffline: false});
-                await Onyx.merge(ONYXKEYS.ASSIGN_CARD, createMockAssignCardData({feedType: 'commercial', cardName}));
-            });
-
-            const {unmount} = renderConfirmationStep({
-                policyID: policy.id,
-                feed: COMMERCIAL_FEED,
-                cardID: CARD_ID,
-            });
-
-            await waitForBatchedUpdatesWithAct();
-
-            // Verify the card name is displayed (may appear multiple times in the UI)
-            await waitFor(() => {
-                const elements = screen.getAllByText(cardName);
-                expect(elements.length).toBeGreaterThan(0);
-                expect(elements.at(0)).toBeOnTheScreen();
-            });
-
-            unmount();
-            await waitForBatchedUpdatesWithAct();
+        // Render the page with the specified policyID and backTo param
+        const {unmount} = renderPage(SCREENS.WORKSPACE.COMPANY_CARDS_ASSIGN_CARD_ASSIGNEE, {
+            policyID: policy.id,
+            feed: FEED,
+            cardID: CARD_ID,
+            backTo: ROUTES.WORKSPACE_MEMBER_DETAILS.getRoute(policy?.id, 1234),
         });
-    });
 
-    describe('ConfirmationStep - Direct feed card assignment', () => {
-        it('should render assign card button for direct feed', async () => {
-            await TestHelper.signInWithTestUser();
-            const policy = {
-                ...LHNTestUtils.getFakePolicy(),
-                role: CONST.POLICY.ROLE.ADMIN,
-                workspaceAccountID: WORKSPACE_ACCOUNT_ID,
-            };
-
-            // Set up direct feed card assignment data
-            // For direct feeds: cardName === encryptedCardNumber
-            await act(async () => {
-                await Onyx.merge(`${ONYXKEYS.COLLECTION.POLICY}${policy.id}`, policy);
-                await Onyx.merge(ONYXKEYS.NETWORK, {isOffline: false});
-                await Onyx.merge(ONYXKEYS.ASSIGN_CARD, createMockAssignCardData({feedType: 'direct'}));
-            });
+        await waitForBatchedUpdatesWithAct();
 
-            const {unmount} = renderConfirmationStep({
-                policyID: policy.id,
-                feed: DIRECT_FEED,
-                cardID: CARD_ID,
-            });
-
-            await waitForBatchedUpdatesWithAct();
-
-            await waitFor(() => {
-                expect(screen.getByTestId(CONST.ASSIGN_CARD_BUTTON_TEST_ID)).toBeOnTheScreen();
-            });
-
-            unmount();
-            await waitForBatchedUpdatesWithAct();
+        // Verify that Assign card button is visible on the screen
+        await waitFor(() => {
+            expect(screen.getByTestId('assignCardButtonTestID')).toBeOnTheScreen();
         });
 
-        it('should display the card name for direct feed in confirmation step', async () => {
-            await TestHelper.signInWithTestUser();
-            const policy = {
-                ...LHNTestUtils.getFakePolicy(),
-                role: CONST.POLICY.ROLE.ADMIN,
-                workspaceAccountID: WORKSPACE_ACCOUNT_ID,
-            };
-
-            const cardName = "Jane's Plaid Card";
-
-            await act(async () => {
-                await Onyx.merge(`${ONYXKEYS.COLLECTION.POLICY}${policy.id}`, policy);
-                await Onyx.merge(ONYXKEYS.NETWORK, {isOffline: false});
-                await Onyx.merge(ONYXKEYS.ASSIGN_CARD, createMockAssignCardData({feedType: 'direct', cardName}));
-            });
-
-            const {unmount} = renderConfirmationStep({
-                policyID: policy.id,
-                feed: DIRECT_FEED,
-                cardID: CARD_ID,
-            });
-
-            await waitForBatchedUpdatesWithAct();
-
-            // Verify the card name is displayed (may appear multiple times in the UI)
-            await waitFor(() => {
-                const elements = screen.getAllByText(cardName);
-                expect(elements.length).toBeGreaterThan(0);
-                expect(elements.at(0)).toBeOnTheScreen();
-            });
-
-            unmount();
-            await waitForBatchedUpdatesWithAct();
+        // Click the Assign Card button
+        const assignCardButton = screen.getByTestId('assignCardButtonTestID');
+
+        // Create a mock event object that matches GestureResponderEvent.
+        const mockEvent = {
+            nativeEvent: {},
+            type: 'press',
+            target: assignCardButton,
+            currentTarget: assignCardButton,
+        };
+        fireEvent.press(assignCardButton, mockEvent);
+
+        // Verify that we navigate to the member details page as the card assignee has not changed
+        await waitFor(() => {
+            expect(goBack).toHaveBeenCalledWith(ROUTES.WORKSPACE_MEMBER_DETAILS.getRoute(policy.id, 1234));
         });
-    });
-
-    describe('ConfirmationStep - Card data structure', () => {
-        it('should correctly use encryptedCardNumber for commercial feeds (different from cardName)', async () => {
-            await TestHelper.signInWithTestUser();
-            const policy = {
-                ...LHNTestUtils.getFakePolicy(),
-                role: CONST.POLICY.ROLE.ADMIN,
-                workspaceAccountID: WORKSPACE_ACCOUNT_ID,
-            };
-
-            const mockData = createMockAssignCardData({feedType: 'commercial'});
-
-            // Verify the mock data structure is correct for commercial feeds
-            expect(mockData.cardToAssign.cardName).not.toBe(mockData.cardToAssign.encryptedCardNumber);
-            expect(mockData.cardToAssign.encryptedCardNumber).toContain('v12:');
-
-            await act(async () => {
-                await Onyx.merge(`${ONYXKEYS.COLLECTION.POLICY}${policy.id}`, policy);
-                await Onyx.merge(ONYXKEYS.NETWORK, {isOffline: false});
-                await Onyx.merge(ONYXKEYS.ASSIGN_CARD, mockData);
-            });
-
-            const {unmount} = renderConfirmationStep({
-                policyID: policy.id,
-                feed: COMMERCIAL_FEED,
-                cardID: CARD_ID,
-            });
-
-            await waitForBatchedUpdatesWithAct();
-
-            await waitFor(() => {
-                expect(screen.getByTestId(CONST.ASSIGN_CARD_BUTTON_TEST_ID)).toBeOnTheScreen();
-            });
-
-            unmount();
-            await waitForBatchedUpdatesWithAct();
-        });
-
-        it('should correctly use cardName as encryptedCardNumber for direct feeds', async () => {
-            await TestHelper.signInWithTestUser();
-            const policy = {
-                ...LHNTestUtils.getFakePolicy(),
-                role: CONST.POLICY.ROLE.ADMIN,
-                workspaceAccountID: WORKSPACE_ACCOUNT_ID,
-            };
-
-            const mockData = createMockAssignCardData({feedType: 'direct'});
 
-            // For direct feeds, the encryptedCardNumber is based on the card display name pattern
-            // (not literally equal to cardName which is the user-friendly name)
-            expect(mockData.cardToAssign.encryptedCardNumber).toBe('Plaid Checking 0000');
-
-            await act(async () => {
-                await Onyx.merge(`${ONYXKEYS.COLLECTION.POLICY}${policy.id}`, policy);
-                await Onyx.merge(ONYXKEYS.NETWORK, {isOffline: false});
-                await Onyx.merge(ONYXKEYS.ASSIGN_CARD, mockData);
-            });
-
-            const {unmount} = renderConfirmationStep({
-                policyID: policy.id,
-                feed: DIRECT_FEED,
-                cardID: CARD_ID,
-            });
-
-            await waitForBatchedUpdatesWithAct();
-
-            await waitFor(() => {
-                expect(screen.getByTestId(CONST.ASSIGN_CARD_BUTTON_TEST_ID)).toBeOnTheScreen();
-            });
-
-            unmount();
-            await waitForBatchedUpdatesWithAct();
-        });
+        // Unmount the component after assertions to clean up.
+        unmount();
+        await waitForBatchedUpdatesWithAct();
     });
 
-    describe('Navigation Flow', () => {
-        it('should navigate to card selection step when assignee is selected and no card is pre-selected', async () => {
-            await TestHelper.signInWithTestUser();
-
-            const navigateSpy = jest.spyOn(Navigation, 'navigate');
-
-            // Mock useSearchSelector
-            jest.spyOn(useSearchSelectorModule, 'default').mockReturnValue({
-                searchTerm: '',
-                debouncedSearchTerm: '',
-                setSearchTerm: jest.fn(),
-                searchOptions: getEmptyOptions(),
-                availableOptions: getEmptyOptions(),
-                selectedOptions: [],
-                selectedOptionsForDisplay: [],
-                setSelectedOptions: jest.fn(),
-                toggleSelection: jest.fn(),
-                areOptionsInitialized: true,
-                onListEndReached: jest.fn(),
-            });
-
-            const policy = {
-                ...LHNTestUtils.getFakePolicy(),
-                role: CONST.POLICY.ROLE.ADMIN,
-                employeeList: {
-                    // eslint-disable-next-line @typescript-eslint/naming-convention
-                    'testaccount+1@gmail.com': {email: 'testaccount+1@gmail.com'},
-                },
-            };
-
-            await act(async () => {
-                await Onyx.merge(`${ONYXKEYS.COLLECTION.POLICY}${policy.id}`, policy);
-                await Onyx.merge(ONYXKEYS.NETWORK, {isOffline: false});
-                await Onyx.merge(ONYXKEYS.ASSIGN_CARD, {
-                    currentStep: CONST.COMPANY_CARD.STEP.ASSIGNEE,
-                    isEditing: false,
-                });
-            });
-
-            const {unmount} = renderAssigneeStep({
-                policyID: policy.id,
-                feed: COMMERCIAL_FEED,
-                cardID: CARD_ID,
-            });
-
-            await waitForBatchedUpdatesWithAct();
-
-            // Verify navigate was called (the exact route depends on the flow)
-            // The component should be ready to navigate when an assignee is selected
-            expect(screen.getByText('Choose the cardholder')).toBeOnTheScreen();
-
-            unmount();
-            navigateSpy.mockRestore();
-            await waitForBatchedUpdatesWithAct();
-        });
-
-        it('should navigate to confirmation step when assignee is selected with pre-selected card', async () => {
-            await TestHelper.signInWithTestUser();
-
-            const navigateSpy = jest.spyOn(Navigation, 'navigate');
-
-            // Mock useSearchSelector
-            jest.spyOn(useSearchSelectorModule, 'default').mockReturnValue({
-                searchTerm: '',
-                debouncedSearchTerm: '',
-                setSearchTerm: jest.fn(),
-                searchOptions: getEmptyOptions(),
-                availableOptions: getEmptyOptions(),
-                selectedOptions: [],
-                selectedOptionsForDisplay: [],
-                setSelectedOptions: jest.fn(),
-                toggleSelection: jest.fn(),
-                areOptionsInitialized: true,
-                onListEndReached: jest.fn(),
-            });
-
-            const policy = {
-                ...LHNTestUtils.getFakePolicy(),
-                role: CONST.POLICY.ROLE.ADMIN,
-                employeeList: {
-                    // eslint-disable-next-line @typescript-eslint/naming-convention
-                    'testaccount+1@gmail.com': {email: 'testaccount+1@gmail.com'},
+    // TODO: Fix this test in a separate PR next week
+    it.skip('should navigate to the company cards page as the assignee email has changed', async () => {
+        // Sign in as a test user before running the test.
+        await TestHelper.signInWithTestUser();
+        const navigate = jest.spyOn(Navigation, 'navigate');
+        const policy = {
+            ...LHNTestUtils.getFakePolicy(),
+            role: CONST.POLICY.ROLE.ADMIN,
+            areTagsEnabled: true,
+            requiresTag: true,
+        };
+
+        // Add mock policy and mock the assign card details
+        await act(async () => {
+            await Onyx.merge(`${ONYXKEYS.COLLECTION.POLICY}${policy.id}`, policy);
+            await Onyx.merge(ONYXKEYS.NETWORK, {isOffline: false});
+            await Onyx.merge(ONYXKEYS.ASSIGN_CARD, {
+                cardToAssign: {
+                    bankName: 'vcf',
+                    email: 'testaccount+1@gmail.com',
+                    cardName: "Test 1's card",
+                    cardNumber: '490901XXXXXX1234',
+                    // cspell:disable-next-line
+                    encryptedCardNumber: 'v12:74E3CA3C4C0FA02FDCF754FDSFDSF',
+                    dateOption: 'fromBeginning',
+                    startDate: '2024-12-27',
                 },
-            };
-
-            // Pre-select a card (encryptedCardNumber is set)
-            await act(async () => {
-                await Onyx.merge(`${ONYXKEYS.COLLECTION.POLICY}${policy.id}`, policy);
-                await Onyx.merge(ONYXKEYS.NETWORK, {isOffline: false});
-                await Onyx.merge(ONYXKEYS.ASSIGN_CARD, {
-                    cardToAssign: {
-                        // cspell:disable-next-line
-                        encryptedCardNumber: 'v12:74E3CA3C4C0FA02FDCF754FDSFDSF',
-                        cardName: "Test User's card",
-                    },
-                    currentStep: CONST.COMPANY_CARD.STEP.ASSIGNEE,
-                    isEditing: false,
-                });
+                currentStep: 'Confirmation',
+                isEditing: false,
             });
-
-            const {unmount} = renderAssigneeStep({
-                policyID: policy.id,
-                feed: COMMERCIAL_FEED,
-                cardID: CARD_ID,
-            });
-
-            await waitForBatchedUpdatesWithAct();
-
-            // Verify the component renders and is ready to navigate to confirmation
-            expect(screen.getByText('Choose the cardholder')).toBeOnTheScreen();
-
-            unmount();
-            navigateSpy.mockRestore();
-            await waitForBatchedUpdatesWithAct();
         });
-
-        it('should call setAssignCardStepAndData when editing assignee in confirmation step', async () => {
-            await TestHelper.signInWithTestUser();
-
-            const policy = {
-                ...LHNTestUtils.getFakePolicy(),
-                role: CONST.POLICY.ROLE.ADMIN,
-                workspaceAccountID: WORKSPACE_ACCOUNT_ID,
-            };
-
-            await act(async () => {
-                await Onyx.merge(`${ONYXKEYS.COLLECTION.POLICY}${policy.id}`, policy);
-                await Onyx.merge(ONYXKEYS.NETWORK, {isOffline: false});
-                await Onyx.merge(ONYXKEYS.ASSIGN_CARD, createMockAssignCardData({feedType: 'commercial'}));
-            });
-
-            const {unmount} = renderConfirmationStep({
-                policyID: policy.id,
-                feed: COMMERCIAL_FEED,
-                cardID: CARD_ID,
-            });
-
-            await waitForBatchedUpdatesWithAct();
-
-            // Find and press the assignee edit button (the MenuItem with the cardholder)
-            // The confirmation step has edit buttons for assignee, date, and card name
-            await waitFor(() => {
-                expect(screen.getByTestId(CONST.ASSIGN_CARD_BUTTON_TEST_ID)).toBeOnTheScreen();
-            });
-
-            unmount();
-            await waitForBatchedUpdatesWithAct();
+        // Render the page with the specified policyID and backTo param
+        const {unmount} = renderPage(SCREENS.WORKSPACE.COMPANY_CARDS_ASSIGN_CARD_ASSIGNEE, {
+            policyID: policy.id,
+            feed: FEED,
+            cardID: CARD_ID,
+            backTo: ROUTES.WORKSPACE_MEMBER_DETAILS.getRoute(policy?.id, 1234),
         });
 
-        it('should navigate back to assignee step when back button is pressed on confirmation step', async () => {
-            await TestHelper.signInWithTestUser();
-
-            const mockedSetAssignCardStepAndData = jest.mocked(setAssignCardStepAndData);
-            const mockedGoBack = jest.mocked(Navigation.goBack);
-
-            const policy = {
-                ...LHNTestUtils.getFakePolicy(),
-                role: CONST.POLICY.ROLE.ADMIN,
-                workspaceAccountID: WORKSPACE_ACCOUNT_ID,
-            };
-
-            await act(async () => {
-                await Onyx.merge(`${ONYXKEYS.COLLECTION.POLICY}${policy.id}`, policy);
-                await Onyx.merge(ONYXKEYS.NETWORK, {isOffline: false});
-                await Onyx.merge(ONYXKEYS.ASSIGN_CARD, createMockAssignCardData({feedType: 'commercial'}));
-            });
-
-            const {unmount} = renderConfirmationStep({
-                policyID: policy.id,
-                feed: COMMERCIAL_FEED,
-                cardID: CARD_ID,
-            });
+        await waitForBatchedUpdatesWithAct();
 
-            await waitForBatchedUpdatesWithAct();
-
-            // Wait for the component to render
-            await waitFor(() => {
-                expect(screen.getByTestId(CONST.ASSIGN_CARD_BUTTON_TEST_ID)).toBeOnTheScreen();
-            });
-
-            // Find the back button by its accessibility label and press it
-            const backButton = screen.getByLabelText('Back');
-            fireEvent.press(backButton);
-
-            await waitForBatchedUpdatesWithAct();
-
-            // Verify setAssignCardStepAndData was called with isEditing: true
-            expect(mockedSetAssignCardStepAndData).toHaveBeenCalledWith({isEditing: true});
-
-            // Verify goBack was called to navigate to assignee step
-            expect(mockedGoBack).toHaveBeenCalledWith(
-                ROUTES.WORKSPACE_COMPANY_CARDS_ASSIGN_CARD_ASSIGNEE.getRoute({
-                    policyID: policy.id,
-                    feed: COMMERCIAL_FEED,
-                    cardID: CARD_ID,
-                }),
-                {compareParams: false},
-            );
-
-            unmount();
-            mockedSetAssignCardStepAndData.mockClear();
-            mockedGoBack.mockClear();
-            await waitForBatchedUpdatesWithAct();
-        });
-
-        it('should have transaction start date menu item that navigates to date step', async () => {
-            await TestHelper.signInWithTestUser();
-
-            const policy = {
-                ...LHNTestUtils.getFakePolicy(),
-                role: CONST.POLICY.ROLE.ADMIN,
-                workspaceAccountID: WORKSPACE_ACCOUNT_ID,
-            };
-
-            await act(async () => {
-                await Onyx.merge(`${ONYXKEYS.COLLECTION.POLICY}${policy.id}`, policy);
-                await Onyx.merge(ONYXKEYS.NETWORK, {isOffline: false});
-                await Onyx.merge(ONYXKEYS.ASSIGN_CARD, createMockAssignCardData({feedType: 'commercial'}));
-            });
-
-            const {unmount} = renderConfirmationStep({
-                policyID: policy.id,
-                feed: COMMERCIAL_FEED,
-                cardID: CARD_ID,
-            });
-
-            await waitForBatchedUpdatesWithAct();
-
-            // Wait for the component to render
-            await waitFor(() => {
-                expect(screen.getByTestId(CONST.ASSIGN_CARD_BUTTON_TEST_ID)).toBeOnTheScreen();
-            });
-
-            // Verify the transaction start date section exists and shows the correct route
-            // The route should be: WORKSPACE_COMPANY_CARDS_ASSIGN_CARD_TRANSACTION_START_DATE
-            const expectedRoute = ROUTES.WORKSPACE_COMPANY_CARDS_ASSIGN_CARD_TRANSACTION_START_DATE.getRoute({
-                policyID: policy.id,
-                feed: COMMERCIAL_FEED,
-                cardID: CARD_ID,
-            });
-            expect(expectedRoute).toContain('transaction-start-date');
-
-            // Verify the transaction start date menu item is rendered
-            await waitFor(() => {
-                expect(screen.getByText('Transaction start date')).toBeOnTheScreen();
-                expect(screen.getByText('From the beginning')).toBeOnTheScreen();
-            });
-
-            unmount();
-            await waitForBatchedUpdatesWithAct();
-        });
-
-        it('should have card name menu item that navigates to card name step', async () => {
-            await TestHelper.signInWithTestUser();
-
-            const policy = {
-                ...LHNTestUtils.getFakePolicy(),
-                role: CONST.POLICY.ROLE.ADMIN,
-                workspaceAccountID: WORKSPACE_ACCOUNT_ID,
-            };
-
-            const cardName = "Test User's card";
-
-            await act(async () => {
-                await Onyx.merge(`${ONYXKEYS.COLLECTION.POLICY}${policy.id}`, policy);
-                await Onyx.merge(ONYXKEYS.NETWORK, {isOffline: false});
-                await Onyx.merge(ONYXKEYS.ASSIGN_CARD, createMockAssignCardData({feedType: 'commercial', cardName}));
-            });
-
-            const {unmount} = renderConfirmationStep({
-                policyID: policy.id,
-                feed: COMMERCIAL_FEED,
-                cardID: CARD_ID,
-            });
-
-            await waitForBatchedUpdatesWithAct();
-
-            // Wait for the component to render
-            await waitFor(() => {
-                expect(screen.getByTestId(CONST.ASSIGN_CARD_BUTTON_TEST_ID)).toBeOnTheScreen();
-            });
-
-            // Verify the card name route is correctly formed
-            const expectedRoute = ROUTES.WORKSPACE_COMPANY_CARDS_ASSIGN_CARD_CARD_NAME.getRoute({
-                policyID: policy.id,
-                feed: COMMERCIAL_FEED,
-                cardID: CARD_ID,
-            });
-            expect(expectedRoute).toContain('card-name');
-
-            // Verify the card name section exists
-            await waitFor(() => {
-                expect(screen.getByText('Card name')).toBeOnTheScreen();
-            });
-
-            // Verify the card name value is displayed
-            await waitFor(() => {
-                const cardNameElements = screen.getAllByText(cardName);
-                expect(cardNameElements.length).toBeGreaterThan(0);
-            });
-
-            unmount();
-            await waitForBatchedUpdatesWithAct();
-        });
-    });
-
-    describe('Card Name and Transaction Start Date Update', () => {
-        /**
-         * Card name handling:
-         * - `cardName`: The original masked card number (e.g., "VISA - 1234"). Immutable, used for "Card" section.
-         * - `customCardName`: The user-friendly editable card name (e.g., "John's card"). Used for "Card name" section.
-         *   - Initially set to "[User's name]'s card" format in AssigneeStep
-         * - When user edits "Card name", only `customCardName` is updated, `cardName` remains unchanged.
-         * - When assigning, `customCardName` is sent to the backend as the card name.
-         */
-        it('should display customCardName in the editable Card name section', async () => {
-            await TestHelper.signInWithTestUser();
-
-            const policy = {
-                ...LHNTestUtils.getFakePolicy(),
-                role: CONST.POLICY.ROLE.ADMIN,
-                workspaceAccountID: WORKSPACE_ACCOUNT_ID,
-            };
-
-            // cardName is the original masked card number
-            const originalCardName = 'VISA - 1234';
-            // customCardName is the user-friendly name (e.g., "John's card")
-            const userFriendlyCardName = "John's card";
-
-            await act(async () => {
-                await Onyx.merge(`${ONYXKEYS.COLLECTION.POLICY}${policy.id}`, policy);
-                await Onyx.merge(ONYXKEYS.NETWORK, {isOffline: false});
-                await Onyx.merge(ONYXKEYS.ASSIGN_CARD, {
-                    cardToAssign: {
-                        bankName: CONST.COMPANY_CARD.FEED_BANK_NAME.VISA,
-                        email: 'testaccount+1@gmail.com',
-                        cardName: originalCardName,
-                        customCardName: userFriendlyCardName,
-                        // cspell:disable-next-line
-                        encryptedCardNumber: 'v12:74E3CA3C4C0FA02FDCF754FDSFDSF',
-                        dateOption: CONST.COMPANY_CARD.TRANSACTION_START_DATE_OPTIONS.FROM_BEGINNING,
-                        startDate: '2024-12-27',
-                    },
-                    currentStep: CONST.COMPANY_CARD.STEP.CONFIRMATION,
-                    isEditing: false,
-                });
-            });
-
-            const {unmount} = renderConfirmationStep({
-                policyID: policy.id,
-                feed: COMMERCIAL_FEED,
-                cardID: CARD_ID,
-            });
-
-            await waitForBatchedUpdatesWithAct();
-
-            await waitFor(() => {
-                expect(screen.getByTestId(CONST.ASSIGN_CARD_BUTTON_TEST_ID)).toBeOnTheScreen();
-            });
-
-            // Verify the customCardName (user-friendly name) is displayed in the editable "Card name" section
-            await waitFor(() => {
-                expect(screen.getByText(userFriendlyCardName)).toBeOnTheScreen();
-            });
-
-            unmount();
-            await waitForBatchedUpdatesWithAct();
-        });
-
-        it('should keep cardName and customCardName as separate fields', async () => {
-            // Verify that cardName (masked card number) and customCardName (user-friendly name) are independent
-            const mockData = createMockAssignCardData({
-                feedType: 'commercial',
-                cardName: 'VISA - 1234',
-                customCardName: "John's card",
-            });
-
-            // cardName is the masked card number, customCardName is the user-friendly name
-            expect(mockData.cardToAssign.cardName).toBe('VISA - 1234');
-            expect(mockData.cardToAssign.customCardName).toBe("John's card");
-            expect(mockData.cardToAssign.cardName).not.toBe(mockData.cardToAssign.customCardName);
-        });
-
-        it('should initialize customCardName with user-friendly format when not provided', async () => {
-            // When customCardName is not explicitly set, it defaults to user-friendly format "Test's card"
-            const mockData = createMockAssignCardData({
-                feedType: 'commercial',
-                cardName: 'VISA - 5678',
-            });
-
-            expect(mockData.cardToAssign.cardName).toBe('VISA - 5678');
-            // customCardName defaults to user-friendly format, not cardName
-            expect(mockData.cardToAssign.customCardName).toBe("Test's card");
-        });
-
-        it('should display transaction start date options correctly', async () => {
-            await TestHelper.signInWithTestUser();
-
-            const policy = {
-                ...LHNTestUtils.getFakePolicy(),
-                role: CONST.POLICY.ROLE.ADMIN,
-                workspaceAccountID: WORKSPACE_ACCOUNT_ID,
-            };
-
-            await act(async () => {
-                await Onyx.merge(`${ONYXKEYS.COLLECTION.POLICY}${policy.id}`, policy);
-                await Onyx.merge(ONYXKEYS.NETWORK, {isOffline: false});
-                await Onyx.merge(ONYXKEYS.ASSIGN_CARD, createMockAssignCardData({feedType: 'commercial'}));
-            });
-
-            const {unmount} = renderConfirmationStep({
-                policyID: policy.id,
-                feed: COMMERCIAL_FEED,
-                cardID: CARD_ID,
-            });
-
-            await waitForBatchedUpdatesWithAct();
-
-            // Verify the transaction start date section is displayed
-            await waitFor(() => {
-                expect(screen.getByText('Transaction start date')).toBeOnTheScreen();
-            });
-
-            // Verify the default option "From the beginning" is shown
-            await waitFor(() => {
-                expect(screen.getByText('From the beginning')).toBeOnTheScreen();
+        // Mock the action of changing the assignee of the card
+        await act(async () => {
+            await Onyx.merge(ONYXKEYS.ASSIGN_CARD, {
+                cardToAssign: {
+                    email: 'testaccount+2@gmail.com',
+                },
             });
-
-            unmount();
-            await waitForBatchedUpdatesWithAct();
         });
 
-        it('should display custom start date when dateOption is CUSTOM', async () => {
-            await TestHelper.signInWithTestUser();
-
-            const policy = {
-                ...LHNTestUtils.getFakePolicy(),
-                role: CONST.POLICY.ROLE.ADMIN,
-                workspaceAccountID: WORKSPACE_ACCOUNT_ID,
-            };
-
-            const customStartDate = '2024-06-15';
-            const cardName = "Test User's card";
-
-            await act(async () => {
-                await Onyx.merge(`${ONYXKEYS.COLLECTION.POLICY}${policy.id}`, policy);
-                await Onyx.merge(ONYXKEYS.NETWORK, {isOffline: false});
-                await Onyx.merge(ONYXKEYS.ASSIGN_CARD, {
-                    cardToAssign: {
-                        bankName: CONST.COMPANY_CARD.FEED_BANK_NAME.VISA,
-                        email: 'testaccount+1@gmail.com',
-                        cardName,
-                        customCardName: cardName,
-                        // cspell:disable-next-line
-                        encryptedCardNumber: 'v12:74E3CA3C4C0FA02FDCF754FDSFDSF',
-                        dateOption: CONST.COMPANY_CARD.TRANSACTION_START_DATE_OPTIONS.CUSTOM,
-                        startDate: customStartDate,
-                    },
-                    currentStep: CONST.COMPANY_CARD.STEP.CONFIRMATION,
-                    isEditing: false,
-                });
-            });
-
-            const {unmount} = renderConfirmationStep({
-                policyID: policy.id,
-                feed: COMMERCIAL_FEED,
-                cardID: CARD_ID,
-            });
-
-            await waitForBatchedUpdatesWithAct();
-
-            // Verify the custom start date is displayed instead of "From the beginning"
-            await waitFor(() => {
-                expect(screen.getByText(customStartDate)).toBeOnTheScreen();
-            });
-
-            unmount();
-            await waitForBatchedUpdatesWithAct();
+        // Verify that Assign card button is visible on the screen
+        await waitFor(() => {
+            expect(screen.getByTestId('assignCardButtonTestID')).toBeOnTheScreen();
         });
 
-        it('should preserve encryptedCardNumber and cardName when customCardName is edited', async () => {
-            // encryptedCardNumber and cardName should never change when user edits customCardName
-
-            await TestHelper.signInWithTestUser();
-
-            const policy = {
-                ...LHNTestUtils.getFakePolicy(),
-                role: CONST.POLICY.ROLE.ADMIN,
-                workspaceAccountID: WORKSPACE_ACCOUNT_ID,
-            };
-
-            // For commercial feeds: encryptedCardNumber is the backend identifier
-            // cardName is the original masked card number
-            // Both should remain unchanged when customCardName is edited
-            const mockCommercialData = createMockAssignCardData({
-                feedType: 'commercial',
-                cardName: 'VISA - 1234',
-                customCardName: "John's Business Card",
-            });
-            expect(mockCommercialData.cardToAssign.encryptedCardNumber).toContain('v12:');
-            expect(mockCommercialData.cardToAssign.cardName).toBe('VISA - 1234');
-            expect(mockCommercialData.cardToAssign.customCardName).toBe("John's Business Card");
-
-            // For direct feeds: encryptedCardNumber equals the card name (both are identifiers)
-            const mockDirectData = createMockAssignCardData({feedType: 'direct'});
-            expect(mockDirectData.cardToAssign.encryptedCardNumber).toBe('Plaid Checking 0000');
-
-            await act(async () => {
-                await Onyx.merge(`${ONYXKEYS.COLLECTION.POLICY}${policy.id}`, policy);
-                await Onyx.merge(ONYXKEYS.NETWORK, {isOffline: false});
-                await Onyx.merge(ONYXKEYS.ASSIGN_CARD, mockCommercialData);
-            });
-
-            const {unmount} = renderConfirmationStep({
-                policyID: policy.id,
-                feed: COMMERCIAL_FEED,
-                cardID: CARD_ID,
-            });
-
-            await waitForBatchedUpdatesWithAct();
+        // Click the Assign Card button
+        const assignCardButton = screen.getByTestId('assignCardButtonTestID');
 
-            await waitFor(() => {
-                expect(screen.getByTestId(CONST.ASSIGN_CARD_BUTTON_TEST_ID)).toBeOnTheScreen();
-            });
+        // Create a mock event object that matches GestureResponderEvent
+        const mockEvent = {
+            nativeEvent: {},
+            type: 'press',
+            target: assignCardButton,
+            currentTarget: assignCardButton,
+        };
+        fireEvent.press(assignCardButton, mockEvent);
 
-            // Verify the edited customCardName is displayed
-            await waitFor(() => {
-                expect(screen.getByText("John's Business Card")).toBeOnTheScreen();
-            });
+        await waitForBatchedUpdatesWithAct();
 
-            unmount();
-            await waitForBatchedUpdatesWithAct();
+        // Verify that we navigate to the company cards page as the card assignee has changed
+        await waitFor(() => {
+            expect(navigate).toHaveBeenCalledWith(ROUTES.WORKSPACE_COMPANY_CARDS.getRoute(policy.id), {forceReplace: true});
         });
+        // Unmount the component after assertions to clean up.
+        unmount();
+        await waitForBatchedUpdatesWithAct();
     });
 });
diff --git a/tests/ui/MoneyRequestReportFooter.tsx b/tests/ui/MoneyRequestReportFooter.tsx
index f98dc0f6b4f1..ffc66fb4a130 100644
--- a/tests/ui/MoneyRequestReportFooter.tsx
+++ b/tests/ui/MoneyRequestReportFooter.tsx
@@ -119,9 +119,6 @@ const renderMoneyRequestConfirmationListFooter = (transaction: Transaction) => {
         iouIsReimbursable: false,
         isReceiptEditable: false,
         isDescriptionRequired: false,
-        iouTimeCount: undefined,
-        iouTimeRate: undefined,
-        isTimeRequest: false,
     };
     return render(
         <ComposeProviders components={[OnyxListItemProvider, LocaleContextProvider]}>
diff --git a/tests/ui/PureReportActionItemTest.tsx b/tests/ui/PureReportActionItemTest.tsx
index 6174c013fe8f..782f1c451642 100644
--- a/tests/ui/PureReportActionItemTest.tsx
+++ b/tests/ui/PureReportActionItemTest.tsx
@@ -87,7 +87,6 @@ describe('PureReportActionItem', () => {
                             <PureReportActionItem
                                 allReports={undefined}
                                 policies={undefined}
-                                personalPolicyID={undefined}
                                 report={undefined}
                                 reportActions={[]}
                                 parentReportAction={undefined}
@@ -101,7 +100,6 @@ describe('PureReportActionItem', () => {
                                 linkedReport={undefined}
                                 iouReportOfLinkedReport={undefined}
                                 currentUserAccountID={ACTOR_ACCOUNT_ID}
-                                allTransactionDrafts={undefined}
                             />
                         </PortalProvider>
                     </ScreenWrapper>
@@ -265,7 +263,6 @@ describe('PureReportActionItem', () => {
                             <PortalProvider>
                                 <PureReportActionItem
                                     allReports={undefined}
-                                    personalPolicyID={undefined}
                                     policies={{testPolicy: dewPolicy as Policy}}
                                     policy={dewPolicy as Policy}
                                     report={{reportID: 'testReport', policyID: 'testPolicy'}}
@@ -282,7 +279,6 @@ describe('PureReportActionItem', () => {
                                     iouReportOfLinkedReport={undefined}
                                     reportMetadata={reportMetadata}
                                     currentUserAccountID={ACTOR_ACCOUNT_ID}
-                                    allTransactionDrafts={undefined}
                                 />
                             </PortalProvider>
                         </ScreenWrapper>
@@ -325,7 +321,6 @@ describe('PureReportActionItem', () => {
                             <PortalProvider>
                                 <PureReportActionItem
                                     allReports={undefined}
-                                    personalPolicyID={undefined}
                                     policies={{testPolicy: basicPolicy as Policy}}
                                     policy={basicPolicy as Policy}
                                     report={{reportID: 'testReport', policyID: 'testPolicy'}}
@@ -341,7 +336,6 @@ describe('PureReportActionItem', () => {
                                     linkedReport={undefined}
                                     iouReportOfLinkedReport={undefined}
                                     currentUserAccountID={ACTOR_ACCOUNT_ID}
-                                    allTransactionDrafts={undefined}
                                 />
                             </PortalProvider>
                         </ScreenWrapper>
diff --git a/tests/ui/TransactionItemRowRBRTest.tsx b/tests/ui/TransactionItemRowRBRTest.tsx
index 3b24ed1ab444..197a9cdd8f10 100644
--- a/tests/ui/TransactionItemRowRBRTest.tsx
+++ b/tests/ui/TransactionItemRowRBRTest.tsx
@@ -45,7 +45,6 @@ const renderTransactionItemRow = (transactionItem: TransactionWithOptionalSearch
             <TransactionItemRow
                 transactionItem={transactionItem}
                 violations={transactionItem.violations}
-                report={transactionItem.report}
                 // eslint-disable-next-line react/jsx-props-no-spreading
                 {...defaultProps}
             />
@@ -185,7 +184,6 @@ describe('TransactionItemRowRBR', () => {
         };
         const mockTransaction = createBaseTransaction({
             violations: mockViolations,
-            report: mockReport,
             modifiedMerchant: '',
             merchant: '',
         });
@@ -209,7 +207,6 @@ describe('TransactionItemRowRBR', () => {
             type: CONST.REPORT.TYPE.EXPENSE,
         };
         const mockTransaction = createBaseTransaction({
-            report: mockReport,
             modifiedMerchant: '',
             merchant: '',
         });
@@ -298,7 +295,6 @@ describe('TransactionItemRowRBR', () => {
         };
         const mockTransaction = createBaseTransaction({
             violations: mockViolations,
-            report: mockReport,
             modifiedMerchant: '',
             merchant: '',
         });
diff --git a/tests/ui/WalletExpensifyCardPageTest.tsx b/tests/ui/WalletExpensifyCardPageTest.tsx
index 4813ff92bff7..0d69d34b07a0 100644
--- a/tests/ui/WalletExpensifyCardPageTest.tsx
+++ b/tests/ui/WalletExpensifyCardPageTest.tsx
@@ -4,7 +4,6 @@ import {act, render, screen, waitFor} from '@testing-library/react-native';
 import React from 'react';
 import Onyx from 'react-native-onyx';
 import ComposeProviders from '@components/ComposeProviders';
-import {CurrencyListContextProvider} from '@components/CurrencyListContextProvider';
 import {LocaleContextProvider} from '@components/LocaleContextProvider';
 import OnyxListItemProvider from '@components/OnyxListItemProvider';
 import {CurrentReportIDContextProvider} from '@hooks/useCurrentReportID';
@@ -31,7 +30,7 @@ const userCardID = '1234';
 // Renders the ExpensifyCardPage inside a navigation container with necessary providers.
 const renderPage = (initialRouteName: typeof SCREENS.SETTINGS.WALLET.DOMAIN_CARD, initialParams: SettingsNavigatorParamList[typeof SCREENS.SETTINGS.WALLET.DOMAIN_CARD]) => {
     return render(
-        <ComposeProviders components={[OnyxListItemProvider, LocaleContextProvider, CurrentReportIDContextProvider, CurrencyListContextProvider]}>
+        <ComposeProviders components={[OnyxListItemProvider, LocaleContextProvider, CurrentReportIDContextProvider]}>
             <PortalProvider>
                 <NavigationContainer>
                     <Stack.Navigator initialRouteName={initialRouteName}>
diff --git a/tests/ui/WorkspaceTravelInvoicingSectionTest.tsx b/tests/ui/WorkspaceTravelInvoicingSectionTest.tsx
deleted file mode 100644
index 4f3a73fb74d4..000000000000
--- a/tests/ui/WorkspaceTravelInvoicingSectionTest.tsx
+++ /dev/null
@@ -1,278 +0,0 @@
-/* eslint-disable @typescript-eslint/naming-convention */
-import {act, render, screen} from '@testing-library/react-native';
-import React from 'react';
-import Onyx from 'react-native-onyx';
-import ComposeProviders from '@components/ComposeProviders';
-import {LocaleContextProvider} from '@components/LocaleContextProvider';
-import OnyxListItemProvider from '@components/OnyxListItemProvider';
-import WorkspaceTravelInvoicingSection from '@pages/workspace/travel/WorkspaceTravelInvoicingSection';
-import CONST from '@src/CONST';
-import ONYXKEYS from '@src/ONYXKEYS';
-import type {OnyxKey} from '@src/ONYXKEYS';
-import type {Policy} from '@src/types/onyx';
-import createRandomPolicy from '../utils/collections/policies';
-import waitForBatchedUpdatesWithAct from '../utils/waitForBatchedUpdatesWithAct';
-
-// Test constants - these values MUST match the literals used in jest.mock() below
-// because jest.mock() is hoisted before variable declarations are evaluated
-const POLICY_ID = 'testPolicy123';
-const WORKSPACE_ACCOUNT_ID = 999888;
-
-// jest.mock() factories are hoisted and run before imports/variables are defined.
-// Therefore, they cannot reference variables like POLICY_ID or WORKSPACE_ACCOUNT_ID.
-// We use literal values that match the constants above.
-
-jest.mock('@react-navigation/native', () => {
-    // eslint-disable-next-line @typescript-eslint/no-require-imports, @typescript-eslint/no-unsafe-assignment
-    const actualNav = jest.requireActual('@react-navigation/native');
-    // eslint-disable-next-line @typescript-eslint/no-unsafe-return
-    return {
-        ...actualNav,
-        useIsFocused: () => true,
-        useRoute: () => ({
-            key: 'test-route',
-            name: 'Workspace_Travel',
-            params: {policyID: 'testPolicy123'}, // Must match POLICY_ID
-        }),
-        usePreventRemove: jest.fn(),
-    };
-});
-
-jest.mock('@src/hooks/useResponsiveLayout');
-
-jest.mock('@hooks/useWorkspaceAccountID', () => ({
-    __esModule: true,
-    default: () => 999888, // Must match WORKSPACE_ACCOUNT_ID
-}));
-
-jest.mock('@hooks/useScreenWrapperTransitionStatus', () => ({
-    __esModule: true,
-    default: () => ({didScreenTransitionEnd: true}),
-}));
-
-const mockPolicy: Policy = {
-    ...createRandomPolicy(parseInt(POLICY_ID, 10) || 1),
-    type: CONST.POLICY.TYPE.CORPORATE,
-    pendingAction: null,
-    role: CONST.POLICY.ROLE.ADMIN,
-};
-
-const renderWorkspaceTravelInvoicingSection = () => {
-    return render(
-        <ComposeProviders components={[OnyxListItemProvider, LocaleContextProvider]}>
-            <WorkspaceTravelInvoicingSection policyID={POLICY_ID} />
-        </ComposeProviders>,
-    );
-};
-
-describe('WorkspaceTravelInvoicingSection', () => {
-    beforeAll(async () => {
-        Onyx.init({
-            keys: ONYXKEYS,
-        });
-    });
-
-    afterEach(async () => {
-        jest.clearAllMocks();
-        await act(async () => {
-            await Onyx.clear();
-            await waitForBatchedUpdatesWithAct();
-        });
-    });
-
-    describe('When Travel Invoicing is not configured', () => {
-        it('should show BookOrManageYourTrip when card settings are not available', async () => {
-            // Given no Travel Invoicing card settings exist
-            await act(async () => {
-                await Onyx.merge(`${ONYXKEYS.COLLECTION.POLICY}${POLICY_ID}`, mockPolicy);
-                await waitForBatchedUpdatesWithAct();
-            });
-
-            // When rendering the component
-            renderWorkspaceTravelInvoicingSection();
-
-            // Wait for component to render
-            await waitForBatchedUpdatesWithAct();
-
-            // Then the fallback component should be visible (BookOrManageYourTrip)
-            expect(screen.getByText('Book or manage your trip')).toBeTruthy();
-        });
-
-        it('should show BookOrManageYourTrip when paymentBankAccountID is not set', async () => {
-            // Given Travel Invoicing card settings exist but without paymentBankAccountID
-            const travelInvoicingKey = `${ONYXKEYS.COLLECTION.PRIVATE_EXPENSIFY_CARD_SETTINGS}${WORKSPACE_ACCOUNT_ID}_TRAVEL_US` as OnyxKey;
-
-            await act(async () => {
-                await Onyx.merge(`${ONYXKEYS.COLLECTION.POLICY}${POLICY_ID}`, mockPolicy);
-                await Onyx.merge(travelInvoicingKey, {
-                    remainingLimit: 50000,
-                    currentBalance: 10000,
-                });
-                await waitForBatchedUpdatesWithAct();
-            });
-
-            // When rendering the component
-            renderWorkspaceTravelInvoicingSection();
-
-            await waitForBatchedUpdatesWithAct();
-
-            // Then the fallback component should be visible
-            expect(screen.getByText('Book or manage your trip')).toBeTruthy();
-        });
-    });
-
-    describe('When Travel Invoicing is configured', () => {
-        const travelInvoicingKey = `${ONYXKEYS.COLLECTION.PRIVATE_EXPENSIFY_CARD_SETTINGS}${WORKSPACE_ACCOUNT_ID}_TRAVEL_US` as OnyxKey;
-        const bankAccountKey = ONYXKEYS.BANK_ACCOUNT_LIST;
-
-        it('should render the section title when card settings are properly configured', async () => {
-            // Given Travel Invoicing is properly configured
-            await act(async () => {
-                await Onyx.merge(`${ONYXKEYS.COLLECTION.POLICY}${POLICY_ID}`, mockPolicy);
-                await Onyx.merge(travelInvoicingKey, {
-                    paymentBankAccountID: 12345,
-                    remainingLimit: 50000,
-                    currentBalance: 10000,
-                });
-                await Onyx.merge(bankAccountKey, {
-                    12345: {
-                        accountData: {
-                            addressName: 'Test Company',
-                            accountNumber: '****1234',
-                            bankAccountID: 12345,
-                        },
-                    },
-                });
-                await waitForBatchedUpdatesWithAct();
-            });
-
-            // When rendering the component
-            renderWorkspaceTravelInvoicingSection();
-
-            await waitForBatchedUpdatesWithAct();
-
-            // Then the section title should be visible
-            expect(screen.getByText('Travel booking')).toBeTruthy();
-        });
-
-        it('should display current travel spend label when configured', async () => {
-            // Given Travel Invoicing is configured with current balance
-            await act(async () => {
-                await Onyx.merge(`${ONYXKEYS.COLLECTION.POLICY}${POLICY_ID}`, mockPolicy);
-                await Onyx.merge(travelInvoicingKey, {
-                    paymentBankAccountID: 12345,
-                    remainingLimit: 50000,
-                    currentBalance: 25000,
-                });
-                await Onyx.merge(bankAccountKey, {
-                    12345: {
-                        accountData: {
-                            addressName: 'Test Company',
-                            accountNumber: '****1234',
-                            bankAccountID: 12345,
-                        },
-                    },
-                });
-                await waitForBatchedUpdatesWithAct();
-            });
-
-            // When rendering the component
-            renderWorkspaceTravelInvoicingSection();
-
-            await waitForBatchedUpdatesWithAct();
-
-            // Then the current travel spend label should be visible
-            expect(screen.getByText('Current travel spend')).toBeTruthy();
-        });
-
-        it('should display current travel limit label when configured', async () => {
-            // Given Travel Invoicing is configured with remaining limit
-            await act(async () => {
-                await Onyx.merge(`${ONYXKEYS.COLLECTION.POLICY}${POLICY_ID}`, mockPolicy);
-                await Onyx.merge(travelInvoicingKey, {
-                    paymentBankAccountID: 12345,
-                    remainingLimit: 100000,
-                    currentBalance: 25000,
-                });
-                await Onyx.merge(bankAccountKey, {
-                    12345: {
-                        accountData: {
-                            addressName: 'Test Company',
-                            accountNumber: '****1234',
-                            bankAccountID: 12345,
-                        },
-                    },
-                });
-                await waitForBatchedUpdatesWithAct();
-            });
-
-            // When rendering the component
-            renderWorkspaceTravelInvoicingSection();
-
-            await waitForBatchedUpdatesWithAct();
-
-            // Then the current travel limit label should be visible
-            expect(screen.getByText('Current travel limit')).toBeTruthy();
-        });
-
-        it('should display settlement account label', async () => {
-            // Given Travel Invoicing is configured with settlement account
-            await act(async () => {
-                await Onyx.merge(`${ONYXKEYS.COLLECTION.POLICY}${POLICY_ID}`, mockPolicy);
-                await Onyx.merge(travelInvoicingKey, {
-                    paymentBankAccountID: 12345,
-                    remainingLimit: 50000,
-                    currentBalance: 10000,
-                });
-                await Onyx.merge(bankAccountKey, {
-                    12345: {
-                        accountData: {
-                            addressName: 'Test Company',
-                            accountNumber: '****1234',
-                            bankAccountID: 12345,
-                        },
-                    },
-                });
-                await waitForBatchedUpdatesWithAct();
-            });
-
-            // When rendering the component
-            renderWorkspaceTravelInvoicingSection();
-
-            await waitForBatchedUpdatesWithAct();
-
-            // Then the settlement account label should be visible
-            expect(screen.getByText('Settlement account')).toBeTruthy();
-        });
-
-        it('should display settlement frequency label', async () => {
-            // Given Travel Invoicing is configured
-            await act(async () => {
-                await Onyx.merge(`${ONYXKEYS.COLLECTION.POLICY}${POLICY_ID}`, mockPolicy);
-                await Onyx.merge(travelInvoicingKey, {
-                    paymentBankAccountID: 12345,
-                    remainingLimit: 50000,
-                    currentBalance: 10000,
-                });
-                await Onyx.merge(bankAccountKey, {
-                    12345: {
-                        accountData: {
-                            addressName: 'Test Company',
-                            accountNumber: '****1234',
-                            bankAccountID: 12345,
-                        },
-                    },
-                });
-                await waitForBatchedUpdatesWithAct();
-            });
-
-            // When rendering the component
-            renderWorkspaceTravelInvoicingSection();
-
-            await waitForBatchedUpdatesWithAct();
-
-            // Then the settlement frequency label should be visible
-            expect(screen.getByText('Settlement frequency')).toBeTruthy();
-        });
-    });
-});
diff --git a/tests/ui/components/IOURequestStepConfirmationPageTest.tsx b/tests/ui/components/IOURequestStepConfirmationPageTest.tsx
index ae14327eea21..c108ccb80360 100644
--- a/tests/ui/components/IOURequestStepConfirmationPageTest.tsx
+++ b/tests/ui/components/IOURequestStepConfirmationPageTest.tsx
@@ -6,7 +6,6 @@ import {CurrentUserPersonalDetailsProvider} from '@components/CurrentUserPersona
 import HTMLEngineProvider from '@components/HTMLEngineProvider';
 import {LocaleContextProvider} from '@components/LocaleContextProvider';
 import OnyxListItemProvider from '@components/OnyxListItemProvider';
-import {startSplitBill} from '@libs/actions/IOU/Split';
 import IOURequestStepConfirmationWithWritableReportOrNotFound from '@pages/iou/request/step/IOURequestStepConfirmation';
 import CONST from '@src/CONST';
 import ONYXKEYS from '@src/ONYXKEYS';
@@ -30,12 +29,8 @@ jest.mock('@libs/actions/IOU', () => {
     return {
         ...actualNav,
         startMoneyRequest: jest.fn(),
-        requestMoney: jest.fn(() => ({iouReport: undefined})),
-    };
-});
-jest.mock('@libs/actions/IOU/Split', () => {
-    return {
         startSplitBill: jest.fn(),
+        requestMoney: jest.fn(() => ({iouReport: undefined})),
     };
 });
 jest.mock('@components/ProductTrainingContext', () => ({
@@ -62,7 +57,6 @@ jest.mock('@libs/Navigation/Navigation', () => {
     return {
         navigate: jest.fn(),
         goBack: jest.fn(),
-        dismissModalWithReport: jest.fn(),
         navigationRef: mockRef,
     };
 });
@@ -297,7 +291,7 @@ describe('IOURequestStepConfirmationPageTest', () => {
             </OnyxListItemProvider>,
         );
         fireEvent.press(await screen.findByText(translateLocal('iou.splitExpense')));
-        expect(startSplitBill).toHaveBeenCalledTimes(1);
+        expect(IOU.startSplitBill).toHaveBeenCalledTimes(1);
     });
 
     it('should create a split expense for each scanned receipt', async () => {
@@ -346,7 +340,7 @@ describe('IOURequestStepConfirmationPageTest', () => {
             </OnyxListItemProvider>,
         );
         fireEvent.press(await screen.findByText(translateLocal('iou.createExpenses', 2)));
-        expect(startSplitBill).toHaveBeenCalledTimes(2);
+        expect(IOU.startSplitBill).toHaveBeenCalledTimes(2);
     });
 
     describe('Tax Calculation Tests', () => {
diff --git a/tests/ui/components/LHNOptionsListTest.tsx b/tests/ui/components/LHNOptionsListTest.tsx
index 6642c67574bd..b1804e2a2f49 100644
--- a/tests/ui/components/LHNOptionsListTest.tsx
+++ b/tests/ui/components/LHNOptionsListTest.tsx
@@ -210,18 +210,12 @@ describe('LHNOptionsList', () => {
                 await Onyx.merge(ONYXKEYS.NETWORK, {isOffline: true});
                 await Onyx.merge(`${ONYXKEYS.COLLECTION.POLICY}${policyID}`, policy);
                 await Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT}${reportID}`, report);
-                await Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT_METADATA}${reportID}`, {
-                    pendingExpenseAction: CONST.EXPENSE_PENDING_ACTION.SUBMIT,
-                });
-
-                await Onyx.merge(ONYXKEYS.DERIVED.VISIBLE_REPORT_ACTIONS, {
-                    [reportID]: {
-                        [submittedAction.reportActionID]: true,
-                    },
-                });
                 await Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${reportID}`, {
                     [submittedAction.reportActionID]: submittedAction,
                 });
+                await Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT_METADATA}${reportID}`, {
+                    pendingExpenseAction: CONST.EXPENSE_PENDING_ACTION.SUBMIT,
+                });
             });
 
             // When the LHNOptionsList is rendered
@@ -267,18 +261,12 @@ describe('LHNOptionsList', () => {
                 await Onyx.merge(ONYXKEYS.NETWORK, {isOffline: false});
                 await Onyx.merge(`${ONYXKEYS.COLLECTION.POLICY}${policyID}`, policy);
                 await Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT}${reportID}`, report);
-                await Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT_METADATA}${reportID}`, {
-                    pendingExpenseAction: CONST.EXPENSE_PENDING_ACTION.SUBMIT,
-                });
-
-                await Onyx.merge(ONYXKEYS.DERIVED.VISIBLE_REPORT_ACTIONS, {
-                    [reportID]: {
-                        [commentAction.reportActionID]: true,
-                    },
-                });
                 await Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${reportID}`, {
                     [commentAction.reportActionID]: commentAction,
                 });
+                await Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT_METADATA}${reportID}`, {
+                    pendingExpenseAction: CONST.EXPENSE_PENDING_ACTION.SUBMIT,
+                });
             });
 
             // When the LHNOptionsList is rendered
diff --git a/tests/unit/AccountUtilsTest.ts b/tests/unit/AccountUtilsTest.ts
deleted file mode 100644
index e1494bcfbb85..000000000000
--- a/tests/unit/AccountUtilsTest.ts
+++ /dev/null
@@ -1,36 +0,0 @@
-import AccountUtils from '../../src/libs/AccountUtils';
-import type {Account} from '../../src/types/onyx';
-
-describe('AccountUtils', () => {
-    describe('hasValidateCodeExtendedAccess', () => {
-        it('should return true when timestamp is valid and not expired', () => {
-            // Create a timestamp 1 hour in the future (in microseconds)
-            const futureTimestamp = (Date.now() + 60 * 60 * 1000) * 1000;
-            const account: Account = {
-                validateCodeExtendedAccessExpires: futureTimestamp,
-            };
-
-            expect(AccountUtils.hasValidateCodeExtendedAccess(account)).toBe(true);
-        });
-
-        it('should return false when timestamp is expired', () => {
-            // Create a timestamp 1 hour in the past (in microseconds)
-            const pastTimestamp = (Date.now() - 60 * 60 * 1000) * 1000;
-            const account: Account = {
-                validateCodeExtendedAccessExpires: pastTimestamp,
-            };
-
-            expect(AccountUtils.hasValidateCodeExtendedAccess(account)).toBe(false);
-        });
-
-        it('should return false when account is undefined', () => {
-            expect(AccountUtils.hasValidateCodeExtendedAccess(undefined)).toBe(false);
-        });
-
-        it('should return false when validateCodeExtendedAccessExpires is not set', () => {
-            const account: Account = {};
-
-            expect(AccountUtils.hasValidateCodeExtendedAccess(account)).toBe(false);
-        });
-    });
-});
diff --git a/tests/unit/AddUnreportedExpenseSearchTest.ts b/tests/unit/AddUnreportedExpenseSearchTest.ts
index 5eccc644c0ef..6c7e90dce970 100644
--- a/tests/unit/AddUnreportedExpenseSearchTest.ts
+++ b/tests/unit/AddUnreportedExpenseSearchTest.ts
@@ -107,7 +107,7 @@ describe('AddUnreportedExpense Search Functionality', () => {
 
         // Add merchant to searchable fields
         const merchant = getMerchant(transaction);
-        if (merchant !== CONST.TRANSACTION.PARTIAL_TRANSACTION_MERCHANT && merchant !== CONST.TRANSACTION.DEFAULT_MERCHANT) {
+        if (merchant !== CONST.TRANSACTION.PARTIAL_TRANSACTION_MERCHANT) {
             searchableFields.push(merchant);
         }
 
diff --git a/tests/unit/Base64URL.test.ts b/tests/unit/Base64URL.test.ts
deleted file mode 100644
index 658fa9fa8c29..000000000000
--- a/tests/unit/Base64URL.test.ts
+++ /dev/null
@@ -1,155 +0,0 @@
-import Base64URL from '@src/utils/Base64URL';
-
-describe('Base64URL', () => {
-    describe('encode', () => {
-        it('should encode a simple string to Base64URL format', () => {
-            const result = Base64URL.encode('hello');
-            expect(result).toBe('aGVsbG8');
-            expect(result).not.toContain('+');
-            expect(result).not.toContain('/');
-            expect(result).not.toContain('=');
-        });
-
-        it('should replace + with - in encoded output', () => {
-            // Byte value 251 produces "+" in base64: Buffer.from([251]).toString('base64') = "+w=="
-            const result = Base64URL.encode(new Uint8Array([251]));
-            expect(result).not.toContain('+');
-            expect(result).toContain('-');
-            expect(result).toBe('-w');
-        });
-
-        it('should replace / with _ in encoded output', () => {
-            // Byte value 255 produces "/" in base64: Buffer.from([255]).toString('base64') = "/w=="
-            const result = Base64URL.encode(new Uint8Array([255]));
-            expect(result).not.toContain('/');
-            expect(result).toContain('_');
-            expect(result).toBe('_w');
-        });
-
-        it('should remove padding characters (=) from encoded output', () => {
-            // Strings that would normally have padding in base64
-            const result1 = Base64URL.encode('test');
-            const result2 = Base64URL.encode('te');
-            expect(result1).not.toContain('=');
-            expect(result2).not.toContain('=');
-        });
-
-        it('should encode empty string', () => {
-            const result = Base64URL.encode('');
-            expect(result).toBe('');
-        });
-
-        it('should encode strings with special characters', () => {
-            const testCases = [
-                {input: 'Hello World!', expected: 'SGVsbG8gV29ybGQh'},
-                {input: 'test@example.com', expected: 'dGVzdEBleGFtcGxlLmNvbQ'},
-                {input: '123', expected: 'MTIz'},
-            ];
-
-            for (const {input, expected} of testCases) {
-                const result = Base64URL.encode(input);
-                expect(result).toBe(expected);
-                expect(result).not.toContain('+');
-                expect(result).not.toContain('/');
-                expect(result).not.toContain('=');
-            }
-        });
-
-        it('should encode ArrayLike<number> input', () => {
-            const arrayLike = new Uint8Array([72, 101, 108, 108, 111]); // "Hello"
-            const result = Base64URL.encode(arrayLike);
-            expect(result).toBe('SGVsbG8');
-        });
-
-        it('should handle unicode characters', () => {
-            const result = Base64URL.encode('Hello 世界');
-            expect(result).not.toContain('+');
-            expect(result).not.toContain('/');
-            expect(result).not.toContain('=');
-        });
-    });
-
-    describe('decode', () => {
-        it('should decode a Base64URL string back to Buffer', () => {
-            const encoded = Base64URL.encode('hello');
-            const decoded = Base64URL.decode(encoded);
-            expect(decoded.toString()).toBe('hello');
-        });
-
-        it('should handle Base64URL strings with - characters', () => {
-            const encoded = 'SGVsbG8gV29ybGQh'; // "Hello World!" encoded
-            const decoded = Base64URL.decode(encoded);
-            expect(decoded.toString()).toBe('Hello World!');
-        });
-
-        it('should convert - back to + during decoding', () => {
-            const original = 'test+';
-            const encoded = Base64URL.encode(original);
-            const decoded = Base64URL.decode(encoded);
-            expect(decoded.toString()).toBe(original);
-        });
-
-        it('should convert _ back to / during decoding', () => {
-            const original = 'test/';
-            const encoded = Base64URL.encode(original);
-            const decoded = Base64URL.decode(encoded);
-            expect(decoded.toString()).toBe(original);
-        });
-
-        it('should restore padding for strings with length % 4 === 2', () => {
-            // "te" encodes to "dGU=" which becomes "dGU" in Base64URL
-            const encoded = 'dGU';
-            const decoded = Base64URL.decode(encoded);
-            expect(decoded.toString()).toBe('te');
-        });
-
-        it('should restore padding for strings with length % 4 === 3', () => {
-            // "test" encodes to "dGVzdA==" which becomes "dGVzdA" in Base64URL
-            const encoded = 'dGVzdA';
-            const decoded = Base64URL.decode(encoded);
-            expect(decoded.toString()).toBe('test');
-        });
-
-        it('should handle strings with length % 4 === 0 (no padding needed)', () => {
-            const encoded = 'SGVsbG8'; // "Hello" encoded
-            const decoded = Base64URL.decode(encoded);
-            expect(decoded.toString()).toBe('Hello');
-        });
-
-        it('should handle strings with length % 4 === 1', () => {
-            // This is technically not valid base64, but we should handle it gracefully
-            const encoded = 'SGVsbG8g'; // "Hello " encoded (with space)
-            const decoded = Base64URL.decode(encoded);
-            expect(decoded.toString()).toBe('Hello ');
-        });
-
-        it('should decode an empty string', () => {
-            const decoded = Base64URL.decode('');
-            expect(decoded.toString()).toBe('');
-        });
-
-        it('should handle round-trip encoding and decoding', () => {
-            const testCases = ['hello', 'Hello World!', 'test@example.com', '123', 'test+', 'test/', 'Hello 世界', 'a', 'ab', 'abc', 'abcd'];
-
-            for (const original of testCases) {
-                const encoded = Base64URL.encode(original);
-                const decoded = Base64URL.decode(encoded);
-                expect(decoded.toString()).toBe(original);
-            }
-        });
-
-        it('should handle binary data correctly', () => {
-            const binaryData = new Uint8Array([0, 1, 2, 255, 128, 64]);
-            const encoded = Base64URL.encode(binaryData);
-            const decoded = Base64URL.decode(encoded);
-            expect(Array.from(decoded)).toEqual(Array.from(binaryData));
-        });
-
-        it('should handle Base64URL strings that already contain padding', () => {
-            // Even if padding is present, it should still decode correctly
-            const encoded = 'dGVzdA=='; // "test" with padding
-            const decoded = Base64URL.decode(encoded);
-            expect(decoded.toString()).toBe('test');
-        });
-    });
-});
diff --git a/tests/unit/CalendarPickerTest.tsx b/tests/unit/CalendarPickerTest.tsx
index 0b8c3a80ce1a..20b84c7efa01 100644
--- a/tests/unit/CalendarPickerTest.tsx
+++ b/tests/unit/CalendarPickerTest.tsx
@@ -211,13 +211,13 @@ describe('CalendarPicker', () => {
         );
 
         //  When the day 15 is pressed
-        fireEvent.press(screen.getByLabelText('Saturday, February 15, 2003'));
+        fireEvent.press(screen.getByLabelText('15'));
 
         // Then the onSelected should not be called as the label 15 is disabled
         expect(onSelectedMock).not.toHaveBeenCalled();
 
         // When the day 16 is pressed
-        fireEvent.press(screen.getByLabelText('Sunday, February 16, 2003'));
+        fireEvent.press(screen.getByLabelText('16'));
 
         // Then the onSelected should be called as the label 16 is enabled
         expect(onSelectedMock).toHaveBeenCalledWith('2003-02-16');
@@ -238,13 +238,13 @@ describe('CalendarPicker', () => {
         );
 
         //  When the day 25 is pressed
-        fireEvent.press(screen.getByLabelText('Tuesday, February 25, 2003'));
+        fireEvent.press(screen.getByLabelText('25'));
 
         // Then the onSelected should not be called as the label 15 is disabled
         expect(onSelectedMock).not.toHaveBeenCalled();
 
         // When the day 24 is pressed
-        fireEvent.press(screen.getByLabelText('Monday, February 24, 2003'));
+        fireEvent.press(screen.getByLabelText('24'));
 
         // Then the onSelected should be called as the label 24 is enabled
         expect(onSelectedMock).toHaveBeenCalledWith('2003-02-24');
@@ -263,7 +263,7 @@ describe('CalendarPicker', () => {
         );
 
         // then the label 16 should be clickable
-        expect(screen.getByLabelText('Sunday, February 16, 2003')).toBeEnabled();
+        expect(screen.getByLabelText('16')).toBeEnabled();
     });
 
     test('should allow to press max date', () => {
@@ -279,6 +279,6 @@ describe('CalendarPicker', () => {
         );
 
         // then the label 24 should be clickable
-        expect(screen.getByLabelText('Monday, February 24, 2003')).toBeEnabled();
+        expect(screen.getByLabelText('24')).toBeEnabled();
     });
 });
diff --git a/tests/unit/CardUtilsTest.ts b/tests/unit/CardUtilsTest.ts
index e0f6f0e08372..573d3f1ac93d 100644
--- a/tests/unit/CardUtilsTest.ts
+++ b/tests/unit/CardUtilsTest.ts
@@ -32,10 +32,10 @@ import {
     getSelectedFeed,
     getYearFromExpirationDateString,
     hasIssuedExpensifyCard,
-    hasOnlyOneCardToAssign,
     isCustomFeed as isCustomFeedCardUtils,
     isExpensifyCard,
     isExpensifyCardFullySetUp,
+    isMaskedCardNumberEqual,
     lastFourNumbersFromCardName,
     maskCardNumber,
     sortCardsByCardholderName,
@@ -44,7 +44,7 @@ import {
 import type {Card, CardFeeds, CardList, CompanyCardFeed, CompanyCardFeedWithDomainID, ExpensifyCardSettings, PersonalDetailsList, Policy, WorkspaceCardsList} from '@src/types/onyx';
 import type {CompanyCardFeedWithNumber} from '@src/types/onyx/CardFeeds';
 import type IconAsset from '@src/types/utils/IconAsset';
-import {localeCompare, translateLocal} from '../utils/TestHelper';
+import {localeCompare} from '../utils/TestHelper';
 import waitForBatchedUpdates from '../utils/waitForBatchedUpdates';
 
 const shortDate = '0924';
@@ -575,26 +575,26 @@ describe('CardUtils', () => {
         });
         it('Should return custom name if exists', () => {
             const feed = CONST.COMPANY_CARD.FEED_BANK_NAME.VISA;
-            const feedName = getCustomOrFormattedFeedName(translateLocal, feed, customFeedName);
+            const feedName = getCustomOrFormattedFeedName(feed, customFeedName);
             expect(feedName).toBe(customFeedName);
         });
 
         it('Should return formatted name if there is no custom name', () => {
             const feed = CONST.COMPANY_CARD.FEED_BANK_NAME.VISA;
             const customName = undefined;
-            const feedName = getCustomOrFormattedFeedName(translateLocal, feed, customName);
+            const feedName = getCustomOrFormattedFeedName(feed, customName);
             expect(feedName).toBe('Visa cards');
         });
 
         it('Should return undefined if no feed provided', () => {
             const feed = undefined;
-            const feedName = getCustomOrFormattedFeedName(translateLocal, feed);
+            const feedName = getCustomOrFormattedFeedName(feed);
             expect(feedName).toBe(undefined);
         });
 
         it('Should return feed key name for unknown feed', () => {
             const companyCardNickname = cardFeedsCollection.FAKE_ID_7?.settings?.companyCardNicknames?.[unknownFeed];
-            const feedName = getCustomOrFormattedFeedName(translateLocal, unknownFeed, companyCardNickname);
+            const feedName = getCustomOrFormattedFeedName(unknownFeed, companyCardNickname);
             expect(feedName).toBe(unknownFeed);
         });
     });
@@ -731,31 +731,37 @@ describe('CardUtils', () => {
     });
 
     describe('getFilteredCardList', () => {
-        it('Should return filtered custom feed cards list as UnassignedCard array', () => {
+        it('Should return filtered custom feed cards list', () => {
             const cardsList = getFilteredCardList(customFeedCardsList, undefined, undefined);
-            expect(cardsList).toStrictEqual([
-                {cardName: '480801XXXXXX2111', cardID: 'ENCRYPTED_CARD_NUMBER'},
-                {cardName: '480801XXXXXX2566', cardID: 'ENCRYPTED_CARD_NUMBER'},
-            ]);
+            expect(cardsList).toStrictEqual({
+                // eslint-disable-next-line @typescript-eslint/naming-convention
+                '480801XXXXXX2111': 'ENCRYPTED_CARD_NUMBER',
+                // eslint-disable-next-line @typescript-eslint/naming-convention
+                '480801XXXXXX2566': 'ENCRYPTED_CARD_NUMBER',
+            });
         });
 
-        it('Should return filtered direct feed cards list with a single card (cardName equals cardID)', () => {
+        it('Should return filtered direct feed cards list with a single card', () => {
             const cardsList = getFilteredCardList(directFeedCardsSingleList, oAuthAccountDetails[CONST.COMPANY_CARD.FEED_BANK_NAME.CHASE].accountList, undefined);
-            expect(cardsList).toStrictEqual([{cardName: 'CREDIT CARD...6607', cardID: 'CREDIT CARD...6607'}]);
+            // eslint-disable-next-line @typescript-eslint/naming-convention
+            expect(cardsList).toStrictEqual({'CREDIT CARD...6607': 'CREDIT CARD...6607'});
         });
 
-        it('Should return filtered direct feed cards list with multiple cards (cardName equals cardID)', () => {
+        it('Should return filtered direct feed cards list with multiple cards', () => {
             const cardsList = getFilteredCardList(directFeedCardsMultipleList, oAuthAccountDetails[CONST.COMPANY_CARD.FEED_BANK_NAME.CAPITAL_ONE].accountList, undefined);
-            expect(cardsList).toStrictEqual([
-                {cardName: 'CREDIT CARD...1233', cardID: 'CREDIT CARD...1233'},
-                {cardName: 'CREDIT CARD...3333', cardID: 'CREDIT CARD...3333'},
-                {cardName: 'CREDIT CARD...7788', cardID: 'CREDIT CARD...7788'},
-            ]);
+            expect(cardsList).toStrictEqual({
+                // eslint-disable-next-line @typescript-eslint/naming-convention
+                'CREDIT CARD...1233': 'CREDIT CARD...1233',
+                // eslint-disable-next-line @typescript-eslint/naming-convention
+                'CREDIT CARD...3333': 'CREDIT CARD...3333',
+                // eslint-disable-next-line @typescript-eslint/naming-convention
+                'CREDIT CARD...7788': 'CREDIT CARD...7788',
+            });
         });
 
-        it('Should return empty array if no data was provided', () => {
+        it('Should return empty object if no data was provided', () => {
             const cardsList = getFilteredCardList(undefined, undefined, undefined);
-            expect(cardsList).toStrictEqual([]);
+            expect(cardsList).toStrictEqual({});
         });
 
         it('Should handle the case when all cards are already assigned in other workspaces', () => {
@@ -790,7 +796,7 @@ describe('CardUtils', () => {
                 },
             } as unknown as WorkspaceCardsList;
             const filteredCards = getFilteredCardList(customFeedWithAllAssignedCards, undefined, mockAllWorkspaceCards);
-            expect(filteredCards).toStrictEqual([]);
+            expect(filteredCards).toStrictEqual({});
         });
 
         it('Should filter out cards that are already assigned in another workspace (custom feed)', () => {
@@ -828,7 +834,7 @@ describe('CardUtils', () => {
             } as unknown as WorkspaceCardsList;
 
             const filteredCards = getFilteredCardList(customFeedWorkspaceCardsList, undefined, undefined);
-            expect(filteredCards).toStrictEqual([]);
+            expect(filteredCards).toStrictEqual({});
         });
 
         it('Should filter out cards that are already assigned in another workspace (direct feed)', () => {
@@ -858,26 +864,7 @@ describe('CardUtils', () => {
             } as unknown as OnyxCollection<WorkspaceCardsList>;
             const accountList = [assignedCard1, assignedCard2, unassignedCard];
             const filteredCards = getFilteredCardList(undefined, accountList, mockAllWorkspaceCards);
-            expect(filteredCards).toStrictEqual([{cardName: unassignedCard, cardID: unassignedCard}]);
-        });
-    });
-
-    describe('hasOnlyOneCardToAssign', () => {
-        it('should return true when there is exactly one unassigned card', () => {
-            const cards = [{cardName: 'VISA ****1234', cardID: 'encrypted_123'}];
-            expect(hasOnlyOneCardToAssign(cards)).toBe(true);
-        });
-
-        it('should return false when there are multiple unassigned cards', () => {
-            const cards = [
-                {cardName: 'VISA ****1234', cardID: 'encrypted_123'},
-                {cardName: 'VISA ****5678', cardID: 'encrypted_456'},
-            ];
-            expect(hasOnlyOneCardToAssign(cards)).toBe(false);
-        });
-
-        it('should return false when there are no unassigned cards', () => {
-            expect(hasOnlyOneCardToAssign([])).toBe(false);
+            expect(filteredCards).toStrictEqual({[`${unassignedCard}`]: unassignedCard});
         });
     });
 
@@ -1238,7 +1225,7 @@ describe('CardUtils', () => {
                 scrapeMinDate: '2024-10-17',
                 state: 3,
             };
-            const description = getCardDescription(card, translateLocal);
+            const description = getCardDescription(card);
             expect(description).toBe('Visa - 2554');
         });
 
@@ -1255,7 +1242,7 @@ describe('CardUtils', () => {
                 lastUpdated: '',
                 state: 2,
             };
-            const description = getCardDescription(card, translateLocal);
+            const description = getCardDescription(card);
             expect(description).toBe('Expensify Card');
         });
     });
@@ -1440,67 +1427,43 @@ describe('CardUtils', () => {
         });
     });
 
-    describe('UnassignedCard type through getFilteredCardList', () => {
-        describe('Commercial feeds (VCF, MCF, etc.) - cardID is encrypted value', () => {
-            it('should return UnassignedCard with cardID being the encrypted value from cardList', () => {
-                const workspaceCardsList = {
-                    cardList: {
-                        '490901XXXXXX1234': 'v12:74E3CA3C4C0FA02F4C754FEN4RYP3ED1',
-                        '490901XXXXXX5678': 'v12:74E3CA3C4C0FA02F4C754FEN4RYP3ED2',
-                    },
-                } as unknown as WorkspaceCardsList;
-
-                const result = getFilteredCardList(workspaceCardsList, undefined, undefined);
-                const firstCard = result.at(0);
-
-                expect(result).toHaveLength(2);
-                expect(firstCard).toEqual({
-                    cardName: '490901XXXXXX1234',
-                    cardID: 'v12:74E3CA3C4C0FA02F4C754FEN4RYP3ED1',
-                });
-                expect(firstCard?.cardName).not.toBe(firstCard?.cardID);
-            });
-
-            it('should correctly distinguish cardName from cardID for commercial feeds', () => {
-                const workspaceCardsList = {
-                    cardList: {
-                        'VISA ****1234': 'encrypted_abc123xyz',
-                    },
-                } as unknown as WorkspaceCardsList;
-
-                const result = getFilteredCardList(workspaceCardsList, undefined, undefined);
-                const firstCard = result.at(0);
+    describe('isMaskedCardNumberEqual', () => {
+        it('should return true for identical masked card numbers', () => {
+            expect(isMaskedCardNumberEqual('1234XXXX5678', '1234XXXX5678')).toBe(true);
+        });
 
-                expect(firstCard?.cardName).toBe('VISA ****1234');
-                expect(firstCard?.cardID).toBe('encrypted_abc123xyz');
-                expect(firstCard?.cardName).not.toBe(firstCard?.cardID);
-            });
+        it('should return true for card numbers with matching first and last digits', () => {
+            expect(isMaskedCardNumberEqual('1234XXXX5678', '1234XXXXXX5678')).toBe(true);
         });
 
-        describe('Direct feeds (Plaid, OAuth) - cardName equals cardID', () => {
-            it('should return UnassignedCard with cardID equal to cardName for direct feeds', () => {
-                const accountList = ['CREDIT CARD...6607', 'CREDIT CARD...1234'];
+        it('should return false for card numbers with different first digits', () => {
+            expect(isMaskedCardNumberEqual('1234XXXX5678', '5678XXXX5678')).toBe(false);
+        });
 
-                const result = getFilteredCardList(undefined, accountList, undefined);
-                const firstCard = result.at(0);
+        it('should return false for card numbers with different last digits', () => {
+            expect(isMaskedCardNumberEqual('1234XXXX5678', '1234XXXX1234')).toBe(false);
+        });
 
-                expect(result).toHaveLength(2);
-                expect(firstCard).toEqual({
-                    cardName: 'CREDIT CARD...6607',
-                    cardID: 'CREDIT CARD...6607',
-                });
-                expect(firstCard?.cardName).toBe(firstCard?.cardID);
-            });
+        it('should handle undefined card numbers', () => {
+            expect(isMaskedCardNumberEqual(undefined, '1234XXXX5678')).toBe(false);
+            expect(isMaskedCardNumberEqual('1234XXXX5678', undefined)).toBe(false);
+            expect(isMaskedCardNumberEqual(undefined, undefined)).toBe(false);
+        });
 
-            it('should return cardName equal to cardID for Plaid feeds', () => {
-                const accountList = ['Plaid Checking 0000'];
+        it('should handle custom mask character', () => {
+            expect(isMaskedCardNumberEqual('1234****5678', '1234****5678', '*')).toBe(true);
+        });
 
-                const result = getFilteredCardList(undefined, accountList, undefined);
-                const firstCard = result.at(0);
+        it('should return false when compareIfPatternDoesNotMatch is false and patterns differ', () => {
+            // '1234XXXX5678' has 4 first digits and 4 last digits
+            // '123XXXX5678' has 3 first digits and 4 last digits
+            // When compareIfPatternDoesNotMatch is false, it should return false because the patterns differ
+            expect(isMaskedCardNumberEqual('1234XXXX5678', '123XXXX5678', CONST.COMPANY_CARD.CARD_NUMBER_MASK_CHAR, false)).toBe(false);
+        });
 
-                expect(firstCard?.cardName).toBe('Plaid Checking 0000');
-                expect(firstCard?.cardID).toBe('Plaid Checking 0000');
-            });
+        it('should return true when compareIfPatternDoesNotMatch is false and patterns match', () => {
+            // Both have 4 first digits and 4 last digits, so patterns match
+            expect(isMaskedCardNumberEqual('1234XXXX5678', '1234XXXXXX5678', CONST.COMPANY_CARD.CARD_NUMBER_MASK_CHAR, false)).toBe(true);
         });
     });
 });
diff --git a/tests/unit/CategoryUtilsTest.ts b/tests/unit/CategoryUtilsTest.ts
index 9c6e032b8e8e..48dd907c877d 100644
--- a/tests/unit/CategoryUtilsTest.ts
+++ b/tests/unit/CategoryUtilsTest.ts
@@ -1,7 +1,4 @@
-import type {OnyxCollection} from 'react-native-onyx';
-import {getAvailableNonPersonalPolicyCategories, isCategoryDescriptionRequired, isCategoryMissing} from '@libs/CategoryUtils';
-import CONST from '@src/CONST';
-import ONYXKEYS from '@src/ONYXKEYS';
+import {isCategoryDescriptionRequired, isCategoryMissing} from '@libs/CategoryUtils';
 import type {PolicyCategories} from '@src/types/onyx';
 
 describe(`isMissingCategory`, () => {
@@ -105,60 +102,3 @@ describe('isCategoryDescriptionRequired', () => {
         expect(isCategoryDescriptionRequired(categoriesWithUndefinedComments, 'TestCategory', true)).toBe(false);
     });
 });
-
-describe('getAvailableNonPersonalPolicyCategories', () => {
-    it('returns empty object when input is undefined or no available categories', () => {
-        expect(getAvailableNonPersonalPolicyCategories(undefined, 'p_1')).toEqual({});
-        const onlyDeleted: OnyxCollection<PolicyCategories> = {
-            [`${ONYXKEYS.COLLECTION.POLICY_CATEGORIES}p_2`]: {
-                TestCategory: {
-                    enabled: true,
-                    name: 'TestCategory',
-                    pendingAction: CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE,
-                },
-            },
-        };
-        expect(getAvailableNonPersonalPolicyCategories(onlyDeleted, 'p_1')).toEqual({});
-    });
-
-    it('excludes personal policy and policies with only deleted categories, keeps policies with at least one non-deleted category', () => {
-        const personalPolicyID = 'personal_1';
-        const keyPersonal = `${ONYXKEYS.COLLECTION.POLICY_CATEGORIES}${personalPolicyID}`;
-        const keyOther = `${ONYXKEYS.COLLECTION.POLICY_CATEGORIES}policy_2`;
-        const keyAllDeleted = `${ONYXKEYS.COLLECTION.POLICY_CATEGORIES}policy_3`;
-
-        const policyCategories: OnyxCollection<PolicyCategories> = {
-            [keyPersonal]: {
-                cTestCategory1at1: {
-                    enabled: true,
-                    name: 'TestCategory1',
-                    pendingAction: null,
-                },
-            },
-            [keyOther]: {
-                TestCategory2: {
-                    enabled: true,
-                    name: 'TestCategory2',
-                    pendingAction: CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE,
-                },
-                TestCategory3: {
-                    enabled: true,
-                    name: 'TestCategory3',
-                    pendingAction: null,
-                },
-            },
-            [keyAllDeleted]: {
-                TestCategory4: {
-                    enabled: true,
-                    name: 'TestCategory4',
-                    pendingAction: CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE,
-                },
-            },
-        };
-
-        const result: OnyxCollection<PolicyCategories> = getAvailableNonPersonalPolicyCategories(policyCategories, personalPolicyID);
-        expect(Object.keys(result)).toEqual([keyOther]);
-        expect(result[keyOther]?.TestCategory2).toBeDefined();
-        expect(result[keyOther]?.TestCategory3).toBeDefined();
-    });
-});
diff --git a/tests/unit/CloseAccountPageTest.ts b/tests/unit/CloseAccountPageTest.ts
index 8ee549ea7dee..4f012793c82a 100644
--- a/tests/unit/CloseAccountPageTest.ts
+++ b/tests/unit/CloseAccountPageTest.ts
@@ -1,7 +1,9 @@
 import {Str} from 'expensify-common';
-import {formatE164PhoneNumber, getPhoneNumberWithoutSpecialChars, sanitizePhoneOrEmail} from '@libs/LoginUtils';
+import {formatE164PhoneNumber, getPhoneNumberWithoutSpecialChars} from '@libs/LoginUtils';
 import CONST from '@src/CONST';
 
+const sanitizePhoneOrEmail = (value: string) => value.replaceAll(/\s/g, '').toLowerCase();
+
 const validatePhoneOrEmail = (inputValue: string, storedValue: string, translate: (key: string) => string, countryCode?: number) => {
     const errors: {phoneOrEmail?: string} = {};
 
diff --git a/tests/unit/DebugUtilsTest.ts b/tests/unit/DebugUtilsTest.ts
index 9f25b14510e8..20392806620e 100644
--- a/tests/unit/DebugUtilsTest.ts
+++ b/tests/unit/DebugUtilsTest.ts
@@ -1233,9 +1233,8 @@ describe('DebugUtils', () => {
                         accountID: 12345,
                     },
                     [`${ONYXKEYS.COLLECTION.TRANSACTION}1` as const]: {
-                        amount: 100,
-                        created: '',
-                        modifiedCreated: '',
+                        amount: 0,
+                        modifiedAmount: 0,
                     },
                 });
                 const {reportAction} =
@@ -1294,9 +1293,8 @@ describe('DebugUtils', () => {
                     };
                     await Onyx.multiSet({
                         [`${ONYXKEYS.COLLECTION.TRANSACTION}1` as const]: {
-                            amount: 100,
-                            created: '',
-                            modifiedCreated: '',
+                            amount: 0,
+                            modifiedAmount: 0,
                         },
                         [`${ONYXKEYS.COLLECTION.REPORT}1` as const]: MOCK_CHAT_REPORT,
                         [`${ONYXKEYS.COLLECTION.REPORT}2` as const]: MOCK_IOU_REPORT,
@@ -1360,9 +1358,8 @@ describe('DebugUtils', () => {
                     };
                     await Onyx.multiSet({
                         [`${ONYXKEYS.COLLECTION.TRANSACTION}1` as const]: {
-                            amount: 100,
-                            created: '',
-                            modifiedCreated: '',
+                            amount: 0,
+                            modifiedAmount: 0,
                         },
                         [`${ONYXKEYS.COLLECTION.REPORT}1` as const]: MOCK_CHAT_REPORT,
                         [`${ONYXKEYS.COLLECTION.REPORT}2` as const]: MOCK_IOU_REPORT,
diff --git a/tests/unit/ExpenseRuleUtilsTest.ts b/tests/unit/ExpenseRuleUtilsTest.ts
deleted file mode 100644
index 5e3ebe94b173..000000000000
--- a/tests/unit/ExpenseRuleUtilsTest.ts
+++ /dev/null
@@ -1,206 +0,0 @@
-/* eslint-disable @typescript-eslint/naming-convention */
-import {extractRuleFromForm, formatExpenseRuleChanges, getKeyForRule} from '@libs/ExpenseRuleUtils';
-import CONST from '@src/CONST';
-import IntlStore from '@src/languages/IntlStore';
-import type {ExpenseRuleForm} from '@src/types/form';
-import type {ExpenseRule, TaxRate} from '@src/types/onyx';
-import {translateLocal} from '../utils/TestHelper';
-import waitForBatchedUpdates from '../utils/waitForBatchedUpdates';
-
-const LOCALE = CONST.LOCALES.EN;
-
-describe('formatExpenseRuleChanges', () => {
-    beforeEach(() => {
-        IntlStore.load(LOCALE);
-        return waitForBatchedUpdates();
-    });
-
-    it('formats billable, category, comment and tax entries in order', () => {
-        const rule: ExpenseRule = {
-            merchantToMatch: 'merchant1',
-            tax: {field_id_TAX: {externalID: 'TAX_123', value: '5%'}},
-            comment: 'memo',
-            billable: 'true',
-            category: 'office',
-        };
-
-        const result = formatExpenseRuleChanges(rule, translateLocal);
-        expect(result).toBe('Update expense billable, Update category to "office", Change description to "memo", Update tax rate to "5%"');
-    });
-});
-
-describe('extractRuleFromForm', () => {
-    it('maps form fields to rule and includes tax when taxRate provided', () => {
-        const form: ExpenseRuleForm = {
-            billable: 'true',
-            category: 'office',
-            comment: 'monthly',
-            createReport: false,
-            merchant: 'Amazon',
-            merchantToMatch: 'contains',
-            reimbursable: 'true',
-            report: 'monthly',
-            tag: 'supplies',
-            tax: 'TAX_123',
-        };
-
-        const taxRate: TaxRate = {name: 'Tax Rate 1', value: '7.5'};
-        const rule = extractRuleFromForm(form, taxRate);
-
-        expect(rule.billable).toBe(form.billable);
-        expect(rule.category).toBe(form.category);
-        expect(rule.comment).toBe(form.comment);
-        expect(rule.createReport).toBe(form.createReport);
-        expect(rule.merchant).toBe(form.merchant);
-        expect(rule.merchantToMatch).toBe(form.merchantToMatch);
-        expect(rule.reimbursable).toBe(form.reimbursable);
-        expect(rule.report).toBe(form.report);
-        expect(rule.tag).toBe(form.tag);
-
-        expect(rule.tax).toBeDefined();
-        expect(rule.tax?.field_id_TAX).toEqual({externalID: form.tax, value: taxRate.value});
-    });
-
-    it('does not include tax when taxRate is not provided or form.tax is falsy', () => {
-        const form: ExpenseRuleForm = {
-            billable: 'false',
-            category: 'office',
-            comment: '',
-            createReport: false,
-            merchant: 'Amazon',
-            merchantToMatch: '',
-            reimbursable: 'true',
-            report: '',
-            tag: '',
-            tax: '',
-        };
-
-        const rule = extractRuleFromForm(form);
-        expect(rule.tax).toBeUndefined();
-
-        const formTaxWithoutRate: ExpenseRuleForm = {
-            billable: 'false',
-            category: 'office',
-            comment: '',
-            createReport: false,
-            merchant: 'Amazon',
-            merchantToMatch: '',
-            reimbursable: 'true',
-            report: '',
-            tag: '',
-            tax: 'TAX_123',
-        };
-
-        const ruleTaxWithoutRate = extractRuleFromForm(formTaxWithoutRate, undefined);
-        expect(ruleTaxWithoutRate.tax).toBeUndefined();
-    });
-
-    it('should correctly map form values to ExpenseRule', () => {
-        const form = {
-            merchantToMatch: 'Test',
-            category: 'Food',
-            billable: 'true',
-            tax: 'TAX_123',
-        } as ExpenseRuleForm;
-        const taxRate: TaxRate = {name: 'Tax Rate 1', value: '7.5'};
-
-        const result = extractRuleFromForm(form, taxRate);
-        expect(result.merchantToMatch).toBe('Test');
-        expect(result.category).toBe('Food');
-        expect(result.billable).toBe('true');
-        expect(result.tax).toEqual({field_id_TAX: {externalID: 'TAX_123', value: '7.5'}});
-        expect(result.comment).toBe(undefined);
-    });
-});
-
-describe('getKeyForRule', () => {
-    it('returns same key for identical rules (order independent)', () => {
-        const ruleA: ExpenseRule = {
-            merchantToMatch: 'contains',
-            merchant: 'Amazon',
-            category: 'office',
-            tag: 'supplies',
-            comment: 'monthly office supplies',
-            reimbursable: 'true',
-            billable: 'false',
-            report: 'monthly',
-            createReport: true,
-            tax: {field_id_TAX: {externalID: 'TAX1', value: '10%'}},
-        };
-
-        const ruleB: ExpenseRule = {
-            merchant: 'Amazon',
-            merchantToMatch: 'contains',
-            category: 'office',
-            comment: 'monthly office supplies',
-            tag: 'supplies',
-            reimbursable: 'true',
-            billable: 'false',
-            report: 'monthly',
-            createReport: true,
-            tax: {field_id_TAX: {externalID: 'TAX1', value: '10%'}},
-        };
-
-        expect(getKeyForRule(ruleA)).toBe(getKeyForRule(ruleB));
-    });
-
-    it('different merchant results in different keys', () => {
-        const base: ExpenseRule = {
-            merchantToMatch: 'contains',
-            merchant: 'Amazon',
-            category: 'office',
-            tag: 'supplies',
-            comment: 'monthly office supplies',
-            reimbursable: 'true',
-            billable: 'false',
-            report: 'monthly',
-            createReport: true,
-            tax: {field_id_TAX: {externalID: 'TAX1', value: '10%'}},
-        };
-
-        const modified = {
-            ...base,
-            merchant: 'Walmart',
-        } as unknown as ExpenseRule;
-
-        expect(getKeyForRule(base)).not.toBe(getKeyForRule(modified));
-    });
-
-    it('tax.externalID affects the generated key', () => {
-        const withTaxA: ExpenseRule = {
-            merchantToMatch: 'contains',
-            merchant: 'Amazon',
-            category: 'office',
-            reimbursable: 'true',
-            tax: {field_id_TAX: {externalID: 'TAX_A', value: '10%'}},
-        };
-
-        const withTaxB: ExpenseRule = {
-            merchantToMatch: 'contains',
-            merchant: 'Amazon',
-            category: 'office',
-            reimbursable: 'true',
-            tax: {field_id_TAX: {externalID: 'TAX_B', value: '10%'}},
-        };
-
-        expect(getKeyForRule(withTaxA)).not.toBe(getKeyForRule(withTaxB));
-    });
-
-    it('ignores falsy properties: undefined vs empty string produce same key', () => {
-        const ruleUndefinedTag: ExpenseRule = {
-            merchantToMatch: 'Amazon',
-            category: 'office',
-            tag: undefined,
-            comment: 'c',
-        };
-
-        const ruleEmptyTag = {
-            merchantToMatch: 'Amazon',
-            category: 'office',
-            tag: '',
-            comment: 'c',
-        };
-
-        expect(getKeyForRule(ruleUndefinedTag)).toBe(getKeyForRule(ruleEmptyTag));
-    });
-});
diff --git a/tests/unit/FormulaTest.ts b/tests/unit/FormulaTest.ts
index 2490460b9bc8..c782fbb26397 100644
--- a/tests/unit/FormulaTest.ts
+++ b/tests/unit/FormulaTest.ts
@@ -1,13 +1,13 @@
 // eslint-disable-next-line no-restricted-syntax -- disabled because we need CurrencyUtils to mock
 import * as CurrencyUtils from '@libs/CurrencyUtils';
 import type {FormulaContext} from '@libs/Formula';
-import {compute, hasCircularReferences, parse, resolveReportFieldValue} from '@libs/Formula';
+import {compute, hasCircularReferences, parse} from '@libs/Formula';
 // eslint-disable-next-line no-restricted-syntax -- disabled because we need ReportActionsUtils to mock
 import * as ReportActionsUtils from '@libs/ReportActionsUtils';
 // eslint-disable-next-line no-restricted-syntax -- disabled because we need ReportUtils to mock
 import * as ReportUtils from '@libs/ReportUtils';
 import CONST from '@src/CONST';
-import type {PersonalDetails, Policy, PolicyReportField, Report, ReportActions, Transaction} from '@src/types/onyx';
+import type {PersonalDetails, Policy, Report, ReportActions, Transaction} from '@src/types/onyx';
 
 jest.mock('@libs/ReportActionsUtils', () => ({
     getAllReportActions: jest.fn(),
@@ -1022,7 +1022,6 @@ describe('CustomFormula', () => {
             } as Report,
             policy: {
                 name: 'Test Policy',
-                glCodes: true,
                 employeeList: {
                     // eslint-disable-next-line @typescript-eslint/naming-convention
                     'john.doe@company.com': {
@@ -1140,7 +1139,6 @@ describe('CustomFormula', () => {
                     report: {reportID: '123'} as Report,
                     policy: {
                         name: 'Test Policy',
-                        glCodes: true,
                         employeeList: {
                             // eslint-disable-next-line @typescript-eslint/naming-convention
                             'other.user@company.com': {
@@ -1154,28 +1152,6 @@ describe('CustomFormula', () => {
 
                 expect(compute('{report:submit:from:customfield1}', contextWithDifferentEmployee)).toBe('');
             });
-
-            test('customfield1/customfield2 - return empty when glCodes disabled', () => {
-                const contextWithGlCodesDisabled: FormulaContext = {
-                    report: {reportID: '123'} as Report,
-                    policy: {
-                        name: 'Test Policy',
-                        glCodes: false,
-                        employeeList: {
-                            // eslint-disable-next-line @typescript-eslint/naming-convention
-                            'john.doe@company.com': {
-                                email: 'john.doe@company.com',
-                                employeeUserID: 'EMP001',
-                                employeePayrollID: 'PAY123',
-                            },
-                        },
-                    } as unknown as Policy,
-                    submitterPersonalDetails: mockSubmitter,
-                };
-
-                expect(compute('{report:submit:from:customfield1}', contextWithGlCodesDisabled)).toBe('');
-                expect(compute('{report:submit:from:customfield2}', contextWithGlCodesDisabled)).toBe('');
-            });
         });
 
         describe('Manager information', () => {
@@ -1419,251 +1395,4 @@ describe('CustomFormula', () => {
             expect(hasCircularReferences('hi test', 'test-example', fieldList)).toBe(false);
         });
     });
-
-    describe('Field Reference Resolution', () => {
-        const mockReport = {reportID: '123'} as Report;
-        const mockPolicy = {name: 'Test Policy'} as Policy;
-
-        test('should resolve simple {field:X} reference', () => {
-            const fieldsByName = {
-                b: {
-                    fieldID: 'field_b',
-                    name: 'B',
-                    defaultValue: 'value_from_b',
-                    value: 'value_from_b',
-                } as unknown as PolicyReportField,
-            };
-            const fieldValues = {b: 'value_from_b'};
-
-            const result = compute('{field:B}', {report: mockReport, policy: mockPolicy, fieldsByName, fieldValues});
-            expect(result).toBe('value_from_b');
-        });
-
-        test('should resolve chained field references (A references B)', () => {
-            const fieldsByName = {
-                a: {
-                    fieldID: 'field_a',
-                    name: 'A',
-                    defaultValue: '{field:B}',
-                    value: 'stale_value', // This should be ignored
-                } as unknown as PolicyReportField,
-                b: {
-                    fieldID: 'field_b',
-                    name: 'B',
-                    defaultValue: 'current_value_b',
-                    value: 'current_value_b',
-                } as unknown as PolicyReportField,
-            };
-            const fieldValues = {a: 'stale_value', b: 'current_value_b'};
-
-            // When computing {field:A}, it should recursively resolve {field:B} from A's defaultValue
-            const result = compute('{field:A}', {report: mockReport, policy: mockPolicy, fieldsByName, fieldValues});
-            expect(result).toBe('current_value_b');
-        });
-
-        test('should resolve recursive field references (C -> A -> B)', () => {
-            const fieldsByName = {
-                a: {
-                    fieldID: 'field_a',
-                    name: 'A',
-                    defaultValue: '{field:B}',
-                    value: 'stale_a', // Should be ignored
-                } as unknown as PolicyReportField,
-                b: {
-                    fieldID: 'field_b',
-                    name: 'B',
-                    defaultValue: 'fresh_value_b',
-                    value: 'fresh_value_b',
-                } as unknown as PolicyReportField,
-                c: {
-                    fieldID: 'field_c',
-                    name: 'C',
-                    defaultValue: '{field:A}',
-                    value: 'stale_c', // Should be ignored
-                } as unknown as PolicyReportField,
-            };
-            const fieldValues = {a: 'stale_a', b: 'fresh_value_b', c: 'stale_c'};
-
-            // C references A, A references B - should get B's current value
-            const result = compute('{field:C}', {report: mockReport, policy: mockPolicy, fieldsByName, fieldValues});
-            expect(result).toBe('fresh_value_b');
-        });
-
-        test('should handle field reference with text prefix and suffix', () => {
-            const fieldsByName = {
-                name: {
-                    fieldID: 'field_name',
-                    name: 'Name',
-                    defaultValue: 'John',
-                    value: 'John',
-                } as unknown as PolicyReportField,
-            };
-            const fieldValues = {name: 'John'};
-
-            const result = compute('Hello {field:Name}!', {report: mockReport, policy: mockPolicy, fieldsByName, fieldValues});
-            expect(result).toBe('Hello John!');
-        });
-
-        test('should handle multiple field references in same formula', () => {
-            const fieldsByName = {
-                first: {
-                    fieldID: 'field_first',
-                    name: 'First',
-                    defaultValue: 'Hello',
-                    value: 'Hello',
-                } as unknown as PolicyReportField,
-                second: {
-                    fieldID: 'field_second',
-                    name: 'Second',
-                    defaultValue: 'World',
-                    value: 'World',
-                } as unknown as PolicyReportField,
-            };
-            const fieldValues = {first: 'Hello', second: 'World'};
-
-            const result = compute('{field:First} {field:Second}', {report: mockReport, policy: mockPolicy, fieldsByName, fieldValues});
-            expect(result).toBe('Hello World');
-        });
-
-        test('should return definition when field is not found', () => {
-            const fieldsByName = {};
-            const fieldValues = {};
-
-            const result = compute('{field:Unknown}', {report: mockReport, policy: mockPolicy, fieldsByName, fieldValues});
-            expect(result).toBe('{field:Unknown}');
-        });
-
-        test('should use field.value when defaultValue has no field references', () => {
-            const fieldsByName = {
-                simple: {
-                    fieldID: 'field_simple',
-                    name: 'Simple',
-                    defaultValue: 'default_text',
-                    value: 'current_value',
-                } as unknown as PolicyReportField,
-            };
-            const fieldValues = {simple: 'current_value'};
-
-            const result = compute('{field:Simple}', {report: mockReport, policy: mockPolicy, fieldsByName, fieldValues});
-            expect(result).toBe('current_value');
-        });
-
-        test('should be case-insensitive for field names', () => {
-            const fieldsByName = {
-                myfield: {
-                    fieldID: 'field_myfield',
-                    name: 'MyField',
-                    defaultValue: 'test_value',
-                    value: 'test_value',
-                } as unknown as PolicyReportField,
-            };
-            const fieldValues = {myfield: 'test_value'};
-
-            expect(compute('{field:MyField}', {report: mockReport, policy: mockPolicy, fieldsByName, fieldValues})).toBe('test_value');
-            expect(compute('{field:MYFIELD}', {report: mockReport, policy: mockPolicy, fieldsByName, fieldValues})).toBe('test_value');
-            expect(compute('{field:myfield}', {report: mockReport, policy: mockPolicy, fieldsByName, fieldValues})).toBe('test_value');
-        });
-    });
-
-    describe('resolveReportFieldValue', () => {
-        const mockReport = {reportID: '123'} as Report;
-        const mockPolicy = {name: 'Test Policy'} as Policy;
-
-        test('should return field.value when defaultValue has no field references', () => {
-            const field = {
-                fieldID: 'field_simple',
-                name: 'Simple',
-                defaultValue: 'default_text',
-                value: 'current_value',
-            } as unknown as PolicyReportField;
-
-            const result = resolveReportFieldValue(field, mockReport, mockPolicy, {}, {});
-            expect(result).toBe('current_value');
-        });
-
-        test('should return defaultValue when value is undefined and no field references', () => {
-            const field = {
-                fieldID: 'field_default',
-                name: 'Default',
-                defaultValue: 'fallback_value',
-                value: undefined,
-            } as unknown as PolicyReportField;
-
-            const result = resolveReportFieldValue(field, mockReport, mockPolicy, {}, {});
-            expect(result).toBe('fallback_value');
-        });
-
-        test('should resolve field references when defaultValue contains {field:X}', () => {
-            const field = {
-                fieldID: 'field_a',
-                name: 'A',
-                defaultValue: '{field:B}',
-                value: '',
-            } as unknown as PolicyReportField;
-
-            const fieldsByName = {
-                b: {
-                    fieldID: 'field_b',
-                    name: 'B',
-                    defaultValue: 'resolved_value',
-                    value: 'resolved_value',
-                } as unknown as PolicyReportField,
-            };
-            const fieldValues = {b: 'resolved_value'};
-
-            const result = resolveReportFieldValue(field, mockReport, mockPolicy, fieldValues, fieldsByName);
-            expect(result).toBe('resolved_value');
-        });
-
-        test('should return fieldValue when report is null', () => {
-            const field = {
-                fieldID: 'field_a',
-                name: 'A',
-                defaultValue: '{field:B}',
-                value: 'stale_value',
-            } as unknown as PolicyReportField;
-
-            // @ts-expect-error - Testing report null
-            const result = resolveReportFieldValue(field, null, mockPolicy, {}, {});
-            expect(result).toBe('stale_value');
-        });
-
-        test('should resolve chained field references', () => {
-            const field = {
-                fieldID: 'field_c',
-                name: 'C',
-                defaultValue: '{field:A}',
-                value: '',
-            } as unknown as PolicyReportField;
-
-            const fieldsByName = {
-                a: {
-                    fieldID: 'field_a',
-                    name: 'A',
-                    defaultValue: '{field:B}',
-                    value: '',
-                } as unknown as PolicyReportField,
-                b: {
-                    fieldID: 'field_b',
-                    name: 'B',
-                    defaultValue: 'final_value',
-                    value: 'final_value',
-                } as unknown as PolicyReportField,
-            };
-            const fieldValues = {a: '', b: 'final_value'};
-
-            const result = resolveReportFieldValue(field, mockReport, mockPolicy, fieldValues, fieldsByName);
-            expect(result).toBe('final_value');
-        });
-
-        test('should return empty string when both value and defaultValue are undefined', () => {
-            const field = {
-                fieldID: 'field_empty',
-                name: 'Empty',
-            } as unknown as PolicyReportField;
-
-            const result = resolveReportFieldValue(field, mockReport, mockPolicy, {}, {});
-            expect(result).toBe('');
-        });
-    });
 });
diff --git a/tests/unit/IOUUtilsTest.ts b/tests/unit/IOUUtilsTest.ts
index ae9dd3586967..1032d4ba8d54 100644
--- a/tests/unit/IOUUtilsTest.ts
+++ b/tests/unit/IOUUtilsTest.ts
@@ -3,7 +3,6 @@ import Onyx from 'react-native-onyx';
 import type {OnyxCollection} from 'react-native-onyx';
 import useReportIsArchived from '@hooks/useReportIsArchived';
 import DateUtils from '@libs/DateUtils';
-import Navigation from '@libs/Navigation/Navigation';
 import {canSubmitReport} from '@userActions/IOU';
 import CONST from '@src/CONST';
 import * as IOUUtils from '@src/libs/IOUUtils';
@@ -11,7 +10,6 @@ import * as ReportUtils from '@src/libs/ReportUtils';
 import * as TransactionUtils from '@src/libs/TransactionUtils';
 import {hasAnyTransactionWithoutRTERViolation} from '@src/libs/TransactionUtils';
 import ONYXKEYS from '@src/ONYXKEYS';
-import ROUTES from '@src/ROUTES';
 import type {Policy, Report, Transaction, TransactionViolations} from '@src/types/onyx';
 import type {TransactionCollectionDataSet} from '@src/types/onyx/Transaction';
 import createRandomPolicy from '../utils/collections/policies';
@@ -33,11 +31,6 @@ function initCurrencyList() {
     return waitForBatchedUpdates();
 }
 
-jest.mock('@src/libs/Navigation/Navigation', () => ({
-    navigate: jest.fn(),
-    goBack: jest.fn(),
-}));
-
 describe('IOUUtils', () => {
     describe('isIOUReportPendingCurrencyConversion', () => {
         beforeAll(() => {
@@ -635,54 +628,3 @@ describe('Check valid amount for IOU/Expense request', () => {
         expect(unreportedAmount).toBeLessThan(0);
     });
 });
-
-describe('navigateToConfirmationPage', () => {
-    const transactionID = '123';
-    const reportID = '444';
-
-    afterEach(() => {
-        jest.clearAllMocks();
-    });
-
-    it('should navigate to confirmation step with SUBMIT iouType when iouType is REQUEST', () => {
-        IOUUtils.navigateToConfirmationPage(CONST.IOU.TYPE.REQUEST, transactionID, reportID, undefined);
-
-        expect(Navigation.navigate).toHaveBeenCalledWith(ROUTES.MONEY_REQUEST_STEP_CONFIRMATION.getRoute(CONST.IOU.ACTION.CREATE, CONST.IOU.TYPE.SUBMIT, transactionID, reportID, undefined));
-    });
-
-    it('should navigate to confirmation step with SEND iouType when iouType is SEND and from ManualDistanceRequest', () => {
-        const backToReport = '111';
-        IOUUtils.navigateToConfirmationPage(CONST.IOU.TYPE.SEND, transactionID, reportID, backToReport, false, undefined, true);
-
-        expect(Navigation.navigate).toHaveBeenCalledWith(
-            ROUTES.MONEY_REQUEST_STEP_CONFIRMATION.getRoute(CONST.IOU.ACTION.CREATE, CONST.IOU.TYPE.SEND, transactionID, reportID, backToReport),
-        );
-    });
-
-    it('should navigate to confirmation step with PAY iouType when iouType is SEND and not from ManualDistanceRequest', () => {
-        IOUUtils.navigateToConfirmationPage(CONST.IOU.TYPE.SEND, transactionID, reportID, undefined, false, undefined, false);
-
-        expect(Navigation.navigate).toHaveBeenCalledWith(ROUTES.MONEY_REQUEST_STEP_CONFIRMATION.getRoute(CONST.IOU.ACTION.CREATE, CONST.IOU.TYPE.PAY, transactionID, reportID));
-    });
-
-    it('should navigate to confirmation step with reportIDParam if provided in default case', () => {
-        const reportIDParam = '555';
-        IOUUtils.navigateToConfirmationPage(CONST.IOU.TYPE.TRACK, transactionID, reportID, undefined, false, reportIDParam);
-
-        expect(Navigation.navigate).toHaveBeenCalledWith(
-            ROUTES.MONEY_REQUEST_STEP_CONFIRMATION.getRoute(CONST.IOU.ACTION.CREATE, CONST.IOU.TYPE.TRACK, transactionID, reportIDParam, undefined),
-        );
-    });
-
-    it('should navigate to confirmation step with SUBMIT iouType when shouldNavigateToSubmit = true in default case', () => {
-        IOUUtils.navigateToConfirmationPage(CONST.IOU.TYPE.CREATE, transactionID, reportID, undefined, true);
-
-        expect(Navigation.navigate).toHaveBeenCalledWith(ROUTES.MONEY_REQUEST_STEP_CONFIRMATION.getRoute(CONST.IOU.ACTION.CREATE, CONST.IOU.TYPE.SUBMIT, transactionID, reportID, undefined));
-    });
-
-    it('should navigate to confirmation step with provided iouType directly when shouldNavigateToSubmit = false in default case', () => {
-        IOUUtils.navigateToConfirmationPage(CONST.IOU.TYPE.TRACK, transactionID, reportID, undefined, false);
-
-        expect(Navigation.navigate).toHaveBeenCalledWith(ROUTES.MONEY_REQUEST_STEP_CONFIRMATION.getRoute(CONST.IOU.ACTION.CREATE, CONST.IOU.TYPE.TRACK, transactionID, reportID, undefined));
-    });
-});
diff --git a/tests/unit/LoginUtilsTest.ts b/tests/unit/LoginUtilsTest.ts
index 6fdf6bc377c7..d43f3786d86d 100644
--- a/tests/unit/LoginUtilsTest.ts
+++ b/tests/unit/LoginUtilsTest.ts
@@ -1,14 +1,5 @@
 import Onyx from 'react-native-onyx';
-import {
-    appendCountryCode,
-    getEmailDomain,
-    getPhoneLogin,
-    getPhoneNumberWithoutSpecialChars,
-    isDomainPublic,
-    isEmailPublicDomain,
-    sanitizePhoneOrEmail,
-    validateNumber,
-} from '@libs/LoginUtils';
+import {appendCountryCode, getEmailDomain, getPhoneLogin, getPhoneNumberWithoutSpecialChars, isDomainPublic, isEmailPublicDomain, validateNumber} from '@libs/LoginUtils';
 import CONST from '@src/CONST';
 import ONYXKEYS from '@src/ONYXKEYS';
 import waitForBatchedUpdates from '../utils/waitForBatchedUpdates';
@@ -163,39 +154,4 @@ describe('LoginUtils', () => {
             expect(getEmailDomain('user.name@example.com')).toBe('example.com');
         });
     });
-
-    describe('sanitizePhoneOrEmail', () => {
-        it.each([
-            ['email without spaces', 'test@example.com', 'test@example.com'],
-            ['email with spaces', 'test @example. com', 'test@example.com'],
-            ['email with multiple spaces', 'test  @  example  .  com', 'test@example.com'],
-            ['email with tabs and spaces', 'test\t@ example .com', 'test@example.com'],
-            ['email with uppercase', 'Test@Example.COM', 'test@example.com'],
-            ['email with spaces and uppercase', 'Test @Example. COM', 'test@example.com'],
-        ])('Should sanitize email - %s', (_description, input, expected) => {
-            expect(sanitizePhoneOrEmail(input)).toBe(expected);
-        });
-
-        it.each([
-            ['phone without spaces', '+12345678901', '+12345678901'],
-            ['phone with spaces', '+1 234 567 8901', '+12345678901'],
-            ['phone with multiple spaces', '+1  234  567  8901', '+12345678901'],
-            ['phone with tabs', '+1\t234\t567\t8901', '+12345678901'],
-            ['phone with mixed whitespace', '+1 234\t567  8901', '+12345678901'],
-        ])('Should sanitize phone number - %s', (_description, input, expected) => {
-            expect(sanitizePhoneOrEmail(input)).toBe(expected);
-        });
-
-        it.each([
-            ['empty string', '', ''],
-            ['string with only spaces', '   ', ''],
-            ['string with only tabs', '\t\t\t', ''],
-            ['string with mixed whitespace', ' \t \t ', ''],
-            ['email with newlines', 'test\n@example.\ncom', 'test@example.com'],
-            ['phone with newlines', '+1\n234\n567\n8901', '+12345678901'],
-            ['mixed newlines and spaces', 'test \n @example. \n com', 'test@example.com'],
-        ])('Should handle edge cases - %s', (_description, input, expected) => {
-            expect(sanitizePhoneOrEmail(input)).toBe(expected);
-        });
-    });
 });
diff --git a/tests/unit/MentionUserRendererTest.tsx b/tests/unit/MentionUserRendererTest.tsx
index e134777bbf85..f0052ecd0f36 100644
--- a/tests/unit/MentionUserRendererTest.tsx
+++ b/tests/unit/MentionUserRendererTest.tsx
@@ -8,11 +8,8 @@ import OnyxListItemProvider from '@components/OnyxListItemProvider';
 import {ShowContextMenuContext} from '@components/ShowContextMenuContext';
 import type {WithCurrentUserPersonalDetailsProps} from '@components/withCurrentUserPersonalDetails';
 import Navigation from '@libs/Navigation/Navigation';
-import CONST from '@src/CONST';
-import IntlStore from '@src/languages/IntlStore';
 import ROUTES from '@src/ROUTES';
 import type {PersonalDetails} from '@src/types/onyx';
-import {translateLocal} from '../utils/TestHelper';
 
 // Mock Navigation to avoid actual navigation calls
 jest.mock('@libs/Navigation/Navigation', () => ({
@@ -137,7 +134,6 @@ function buildTNode({accountID, data}: {accountID?: string; data?: string}): TTe
 describe('MentionUserRenderer', () => {
     beforeEach(() => {
         mockPersonalDetails = {};
-        IntlStore.load(CONST.LOCALES.DEFAULT);
         jest.clearAllMocks();
     });
 
@@ -192,13 +188,6 @@ describe('MentionUserRenderer', () => {
         expect(toJSON()).toBeNull();
     });
 
-    test('renders @Hidden when accountID not found in personal details and mention data not provided', () => {
-        mockPersonalDetails = {};
-        const tnode = buildTNode({accountID: '203'});
-        renderMention({tnode});
-        expect(screen.getByText(`@${translateLocal('common.hidden')}`)).toBeVisible();
-    });
-
     test('navigates to user profile when pressed with accountID', () => {
         mockPersonalDetails = {
             103: {login: 'john@example.com', displayName: 'John Doe'},
diff --git a/tests/unit/ModifiedExpenseMessageTest.ts b/tests/unit/ModifiedExpenseMessageTest.ts
index 2ea0f4a43620..cf4446a6d305 100644
--- a/tests/unit/ModifiedExpenseMessageTest.ts
+++ b/tests/unit/ModifiedExpenseMessageTest.ts
@@ -186,7 +186,7 @@ describe('ModifiedExpenseMessage', () => {
             });
         });
 
-        describe('when the amount is changed from zero', () => {
+        describe('when the amount is changed while the original value was partial', () => {
             const reportAction = {
                 ...createRandomReportAction(1),
                 actionName: CONST.REPORT.ACTIONS.TYPE.MODIFIED_EXPENSE,
@@ -199,7 +199,7 @@ describe('ModifiedExpenseMessage', () => {
             };
 
             it('returns the correct text message', () => {
-                const expectedResult = `changed the amount to $18.00 (previously $0.00)`;
+                const expectedResult = `set the amount to $18.00`;
 
                 const result = getForReportAction({reportAction, policyID: report.policyID});
 
diff --git a/tests/unit/MultifactorAuthentication/ED25519.test.ts b/tests/unit/MultifactorAuthentication/ED25519.test.ts
deleted file mode 100644
index 3b55d7eb2ce3..000000000000
--- a/tests/unit/MultifactorAuthentication/ED25519.test.ts
+++ /dev/null
@@ -1,77 +0,0 @@
-import {Buffer} from 'buffer';
-import {TextEncoder} from 'util';
-import {concatBytes, createAuthenticatorData, generateKeyPair, randomBytes, sha256, signToken, utf8ToBytes} from '@libs/MultifactorAuthentication/Biometrics/ED25519';
-import type {MultifactorAuthenticationChallengeObject} from '@libs/MultifactorAuthentication/Biometrics/ED25519/types';
-import VALUES from '@libs/MultifactorAuthentication/Biometrics/VALUES';
-
-global.TextEncoder = TextEncoder as typeof global.TextEncoder;
-
-describe('MultifactorAuthentication Biometrics ED25519 helpers', () => {
-    it('generates a valid hex-encoded key pair', () => {
-        const {privateKey, publicKey} = generateKeyPair();
-
-        expect(typeof privateKey).toBe('string');
-        expect(typeof publicKey).toBe('string');
-        expect(privateKey).not.toHaveLength(0);
-        expect(publicKey).not.toHaveLength(0);
-
-        expect(() => privateKey).not.toThrow();
-        expect(() => publicKey).not.toThrow();
-    });
-
-    it('creates deterministic binary data for a given rpId', () => {
-        const rpId = 'example.com';
-
-        const first = createAuthenticatorData(rpId);
-        const second = createAuthenticatorData(rpId);
-
-        expect(first).toBeInstanceOf(Uint8Array);
-        expect(second).toBeInstanceOf(Uint8Array);
-        expect(first).toHaveLength(second.length);
-        expect(first).toStrictEqual(second);
-    });
-
-    it('produces a signed challenge with expected shape', () => {
-        const {privateKey, publicKey} = generateKeyPair();
-
-        const challengeObject: MultifactorAuthenticationChallengeObject = {
-            challenge: 'test-challenge',
-            rpId: 'example.com',
-            allowCredentials: [
-                {
-                    type: 'public-key',
-                    id: publicKey,
-                },
-            ],
-            userVerification: 'required',
-            timeout: 60000,
-        };
-
-        const result = signToken(challengeObject, privateKey);
-
-        expect(result.type).toBe(VALUES.ED25519_TYPE);
-
-        // Decode base64URL-encoded rawId to verify it contains the accountID
-        const decodedRawId = Buffer.from(result.rawId.replaceAll('-', '+').replaceAll('_', '/'), 'base64').toString();
-        expect(decodedRawId).toContain(VALUES.KEY_ALIASES.PUBLIC_KEY);
-        expect(result.response.authenticatorData).toEqual(expect.any(String));
-        expect(result.response.clientDataJSON).toEqual(expect.any(String));
-        expect(result.response.signature).toEqual(expect.any(String));
-    });
-
-    it('matches sha256 over concatBytes with utf8ToBytes', () => {
-        const left = randomBytes(16);
-        const right = randomBytes(16);
-
-        const concatenated = concatBytes(left, right);
-        const message = 'test-message';
-        const messageBytes = utf8ToBytes(message);
-
-        const hashOfConcat = sha256(concatenated);
-        const hashOfConcatWithMessage = sha256(concatBytes(concatenated, messageBytes));
-
-        expect(hashOfConcat).toBeInstanceOf(Uint8Array);
-        expect(hashOfConcatWithMessage).toBeInstanceOf(Uint8Array);
-        expect(hashOfConcatWithMessage).toHaveLength(hashOfConcat.length);
-    });
-});
diff --git a/tests/unit/MultifactorAuthentication/SecureStore.test.ts b/tests/unit/MultifactorAuthentication/SecureStore.test.ts
deleted file mode 100644
index 51375133882b..000000000000
--- a/tests/unit/MultifactorAuthentication/SecureStore.test.ts
+++ /dev/null
@@ -1,21 +0,0 @@
-import {SECURE_STORE_METHODS, SECURE_STORE_VALUES} from '@libs/MultifactorAuthentication/Biometrics/SecureStore';
-
-describe('MultifactorAuthentication Biometrics SecureStore (native)', () => {
-    it('exposes stable AUTH_TYPE mapping', () => {
-        expect(SECURE_STORE_VALUES.AUTH_TYPE.UNKNOWN.NAME).toBe('Unknown');
-        expect(SECURE_STORE_VALUES.AUTH_TYPE.NONE.NAME).toBe('None');
-        expect(SECURE_STORE_VALUES.AUTH_TYPE.CREDENTIALS.NAME).toBe('Credentials');
-        expect(SECURE_STORE_VALUES.AUTH_TYPE.BIOMETRICS.NAME).toBe('Biometrics');
-        expect(SECURE_STORE_VALUES.AUTH_TYPE.FACE_ID.NAME).toBe('FaceID');
-        expect(SECURE_STORE_VALUES.AUTH_TYPE.TOUCH_ID.NAME).toBe('TouchID');
-        expect(SECURE_STORE_VALUES.AUTH_TYPE.OPTIC_ID.NAME).toBe('OpticID');
-    });
-
-    it('exposes wrapper methods as functions', () => {
-        expect(typeof SECURE_STORE_METHODS.canUseBiometricAuthentication).toBe('function');
-        expect(typeof SECURE_STORE_METHODS.canUseDeviceCredentialsAuthentication).toBe('function');
-        expect(typeof SECURE_STORE_METHODS.getItemAsync).toBe('function');
-        expect(typeof SECURE_STORE_METHODS.setItemAsync).toBe('function');
-        expect(typeof SECURE_STORE_METHODS.deleteItemAsync).toBe('function');
-    });
-});
diff --git a/tests/unit/NetworkTest.tsx b/tests/unit/NetworkTest.tsx
index d254e0bf2549..deb12fce73d9 100644
--- a/tests/unit/NetworkTest.tsx
+++ b/tests/unit/NetworkTest.tsx
@@ -1,6 +1,5 @@
 import NetInfo from '@react-native-community/netinfo';
 import type {NetInfoState} from '@react-native-community/netinfo';
-import {NavigationContainer} from '@react-navigation/native';
 import {fireEvent, render, screen, waitFor} from '@testing-library/react-native';
 import {sub as dateSubtract} from 'date-fns/sub';
 import type {Mock} from 'jest-mock';
@@ -9,7 +8,6 @@ import MockedOnyx from 'react-native-onyx';
 import TestToolMenu from '@components/TestToolMenu';
 import {confirmReadyToOpenApp, reconnectApp} from '@libs/actions/App';
 import {resetReauthentication} from '@libs/Middleware/Reauthentication';
-import navigationRef from '@libs/Navigation/navigationRef';
 import CONST from '@src/CONST';
 import * as NetworkActions from '@src/libs/actions/Network';
 import OnyxUpdateManager from '@src/libs/actions/OnyxUpdateManager';
@@ -482,16 +480,7 @@ describe('NetworkTests', () => {
         const setShouldFailAllRequestsSpy = jest.spyOn(NetworkActions, 'setShouldFailAllRequests');
 
         // Given an opened test tool menu
-        render(
-            <NavigationContainer
-                ref={navigationRef}
-                onReady={() => {
-                    // Navigation is ready, but we still need to handle the timing issue
-                }}
-            >
-                <TestToolMenu />
-            </NavigationContainer>,
-        );
+        render(<TestToolMenu />);
         expect(screen.getByAccessibilityHint('Force offline')).not.toBeDisabled();
         expect(screen.getByAccessibilityHint('Simulate failing network requests')).not.toBeDisabled();
 
diff --git a/tests/unit/OnyxDerivedTest.tsx b/tests/unit/OnyxDerivedTest.tsx
index 2ea3148a11f2..b18f1bb3d884 100644
--- a/tests/unit/OnyxDerivedTest.tsx
+++ b/tests/unit/OnyxDerivedTest.tsx
@@ -129,8 +129,8 @@ describe('OnyxDerived', () => {
             const transaction = createRandomTransaction(1);
 
             // When the report attributes are recomputed with both report and transaction updates
-            reportAttributes.compute([reports, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined], {areAllConnectionsSet: true});
-            const reportAttributesComputedValue = reportAttributes.compute([reports, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined], {
+            reportAttributes.compute([reports, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined], {areAllConnectionsSet: true});
+            const reportAttributesComputedValue = reportAttributes.compute([reports, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined], {
                 sourceValues: {
                     [ONYXKEYS.COLLECTION.REPORT]: {
                         [`${ONYXKEYS.COLLECTION.REPORT}${reportID1}`]: reports[`${ONYXKEYS.COLLECTION.REPORT}${reportID1}`],
diff --git a/tests/unit/OptionsListUtilsTest.tsx b/tests/unit/OptionsListUtilsTest.tsx
index 257ec2ca0c53..dcdd4977eee3 100644
--- a/tests/unit/OptionsListUtilsTest.tsx
+++ b/tests/unit/OptionsListUtilsTest.tsx
@@ -1,7 +1,7 @@
 /* eslint-disable @typescript-eslint/naming-convention */
 import {render, renderHook} from '@testing-library/react-native';
 import {View} from 'react-native';
-import type {OnyxCollection, OnyxEntry} from 'react-native-onyx';
+import type {OnyxCollection} from 'react-native-onyx';
 import Onyx from 'react-native-onyx';
 import ComposeProviders from '@components/ComposeProviders';
 import {LocaleContextProvider} from '@components/LocaleContextProvider';
@@ -22,12 +22,9 @@ import {
     formatMemberForList,
     getCurrentUserSearchTerms,
     getLastActorDisplayName,
-    getLastActorDisplayNameFromLastVisibleActions,
     getLastMessageTextForReport,
     getMemberInviteOptions,
     getPersonalDetailSearchTerms,
-    getReportDisplayOption,
-    getReportOption,
     getSearchOptions,
     getSearchValueForPhoneOrEmail,
     getUserToInviteOption,
@@ -56,8 +53,7 @@ import initOnyxDerivedValues from '@userActions/OnyxDerived';
 import CONST from '@src/CONST';
 import IntlStore from '@src/languages/IntlStore';
 import ONYXKEYS from '@src/ONYXKEYS';
-import type {PersonalDetails, Policy, Report, ReportAction, ReportNameValuePairs, Transaction} from '@src/types/onyx';
-import type {Participant} from '@src/types/onyx/IOU';
+import type {PersonalDetails, Policy, Report, ReportAction, Transaction} from '@src/types/onyx';
 import createRandomReportAction from '../utils/collections/reportActions';
 import {createRandomReport, createRegularChat} from '../utils/collections/reports';
 import createRandomTransaction from '../utils/collections/transaction';
@@ -112,10 +108,6 @@ describe('OptionsListUtils', () => {
         approvalMode: CONST.POLICY.APPROVAL_MODE.OPTIONAL,
     };
 
-    const allPolicies: OnyxCollection<Policy> = {
-        [`${ONYXKEYS.COLLECTION.POLICY}${policyID}`]: POLICY,
-    };
-
     const COUNTRY_CODE = 1;
 
     // Given a set of reports with both single participants and multiple participants some pinned and some not
@@ -721,7 +713,6 @@ describe('OptionsListUtils', () => {
                     reports: OPTIONS.reports,
                     personalDetails: OPTIONS.personalDetails,
                 },
-                allPolicies,
                 {},
                 nvpDismissedProductTraining,
                 loginList,
@@ -758,7 +749,6 @@ describe('OptionsListUtils', () => {
             // Given a set of personalDetails and an empty reports array
             let results: Pick<Options, 'personalDetails' | 'recentReports'> = getValidOptions(
                 {personalDetails: OPTIONS.personalDetails, reports: []},
-                allPolicies,
                 {},
                 nvpDismissedProductTraining,
                 loginList,
@@ -789,7 +779,7 @@ describe('OptionsListUtils', () => {
         it('should return empty options when no reports or personal details are provided', () => {
             // Given empty arrays of reports and personalDetails
             // When we call getValidOptions()
-            const results = getValidOptions({reports: [], personalDetails: []}, allPolicies, {}, nvpDismissedProductTraining, loginList);
+            const results = getValidOptions({reports: [], personalDetails: []}, {}, nvpDismissedProductTraining, loginList);
 
             // Then the result should be empty
             expect(results.personalDetails).toEqual([]);
@@ -803,13 +793,7 @@ describe('OptionsListUtils', () => {
         it('should include Concierge by default in results', () => {
             // Given a set of reports and personalDetails that includes Concierge
             // When we call getValidOptions()
-            const results = getValidOptions(
-                {reports: OPTIONS_WITH_CONCIERGE.reports, personalDetails: OPTIONS_WITH_CONCIERGE.personalDetails},
-                allPolicies,
-                {},
-                nvpDismissedProductTraining,
-                loginList,
-            );
+            const results = getValidOptions({reports: OPTIONS_WITH_CONCIERGE.reports, personalDetails: OPTIONS_WITH_CONCIERGE.personalDetails}, {}, nvpDismissedProductTraining, loginList);
 
             // Then the result should include all personalDetails except the currently logged in user
             expect(results.personalDetails.length).toBe(Object.values(OPTIONS_WITH_CONCIERGE.personalDetails).length - 1);
@@ -825,7 +809,6 @@ describe('OptionsListUtils', () => {
                     reports: OPTIONS_WITH_CONCIERGE.reports,
                     personalDetails: OPTIONS_WITH_CONCIERGE.personalDetails,
                 },
-                allPolicies,
                 {},
                 nvpDismissedProductTraining,
                 loginList,
@@ -843,16 +826,9 @@ describe('OptionsListUtils', () => {
         it('should exclude Chronos when excludedLogins is specified', () => {
             // Given a set of reports and personalDetails that includes Chronos and a config object that excludes Chronos
             // When we call getValidOptions()
-            const results = getValidOptions(
-                {reports: OPTIONS_WITH_CHRONOS.reports, personalDetails: OPTIONS_WITH_CHRONOS.personalDetails},
-                allPolicies,
-                {},
-                nvpDismissedProductTraining,
-                loginList,
-                {
-                    excludeLogins: {[CONST.EMAIL.CHRONOS]: true},
-                },
-            );
+            const results = getValidOptions({reports: OPTIONS_WITH_CHRONOS.reports, personalDetails: OPTIONS_WITH_CHRONOS.personalDetails}, {}, nvpDismissedProductTraining, loginList, {
+                excludeLogins: {[CONST.EMAIL.CHRONOS]: true},
+            });
 
             // Then the result should include all personalDetails except the currently logged in user and Chronos
             expect(results.personalDetails.length).toBe(Object.values(OPTIONS_WITH_CHRONOS.personalDetails).length - 2);
@@ -868,7 +844,6 @@ describe('OptionsListUtils', () => {
                     reports: OPTIONS_WITH_RECEIPTS.reports,
                     personalDetails: OPTIONS_WITH_RECEIPTS.personalDetails,
                 },
-                allPolicies,
                 {},
                 nvpDismissedProductTraining,
                 loginList,
@@ -888,7 +863,6 @@ describe('OptionsListUtils', () => {
             // When we call getValidOptions()
             const result = getValidOptions(
                 {reports: OPTIONS_WITH_MANAGER_MCTEST.reports, personalDetails: OPTIONS_WITH_MANAGER_MCTEST.personalDetails},
-                allPolicies,
                 {},
                 {
                     // @ts-expect-error Mocked for testing
@@ -915,7 +889,6 @@ describe('OptionsListUtils', () => {
             // When we call getValidOptions()
             const result = getValidOptions(
                 {reports: OPTIONS_WITH_MANAGER_MCTEST.reports, personalDetails: OPTIONS_WITH_MANAGER_MCTEST.personalDetails},
-                allPolicies,
                 {},
                 nvpDismissedProductTraining,
                 loginList,
@@ -946,7 +919,6 @@ describe('OptionsListUtils', () => {
                     // When we call getValidOptions()
                     const optionsWhenUserAlreadySubmittedExpense = getValidOptions(
                         {reports: OPTIONS_WITH_MANAGER_MCTEST.reports, personalDetails: OPTIONS_WITH_MANAGER_MCTEST.personalDetails},
-                        allPolicies,
                         {},
                         nvpDismissedProductTraining,
                         loginList,
@@ -995,7 +967,7 @@ describe('OptionsListUtils', () => {
                 notificationPreference: 'hidden',
             };
             // When we call getValidOptions with includeMultipleParticipantReports set to true
-            const results = getValidOptions({reports: [adminRoom], personalDetails: OPTIONS.personalDetails}, allPolicies, {}, nvpDismissedProductTraining, loginList, {
+            const results = getValidOptions({reports: [adminRoom], personalDetails: OPTIONS.personalDetails}, {}, nvpDismissedProductTraining, loginList, {
                 includeMultipleParticipantReports: true,
             });
             const adminRoomOption = results.recentReports.find((report) => report.reportID === '1455140530846319');
@@ -1040,7 +1012,7 @@ describe('OptionsListUtils', () => {
                 notificationPreference: 'hidden',
                 brickRoadIndicator: CONST.BRICK_ROAD_INDICATOR_STATUS.ERROR,
             };
-            const results = getValidOptions({reports: [workspaceChat], personalDetails: []}, allPolicies, {}, nvpDismissedProductTraining, loginList, {
+            const results = getValidOptions({reports: [workspaceChat], personalDetails: []}, {}, nvpDismissedProductTraining, loginList, {
                 includeMultipleParticipantReports: true,
                 showRBR: true,
             });
@@ -1083,7 +1055,7 @@ describe('OptionsListUtils', () => {
                 notificationPreference: 'hidden',
                 brickRoadIndicator: CONST.BRICK_ROAD_INDICATOR_STATUS.ERROR,
             };
-            const results = getValidOptions({reports: [workspaceChat], personalDetails: []}, allPolicies, {}, nvpDismissedProductTraining, loginList, {
+            const results = getValidOptions({reports: [workspaceChat], personalDetails: []}, {}, nvpDismissedProductTraining, loginList, {
                 includeMultipleParticipantReports: true,
                 showRBR: false,
             });
@@ -1130,7 +1102,7 @@ describe('OptionsListUtils', () => {
                 isBold: false,
             };
 
-            const results = getValidOptions({reports: [inputOption], personalDetails: []}, allPolicies, {}, nvpDismissedProductTraining, loginList, {
+            const results = getValidOptions({reports: [inputOption], personalDetails: []}, {}, nvpDismissedProductTraining, loginList, {
                 includeRecentReports: true,
                 shouldUnreadBeBold: true,
                 includeMultipleParticipantReports: true,
@@ -1145,7 +1117,7 @@ describe('OptionsListUtils', () => {
         it('should include all reports by default', () => {
             // Given a set of reports and personalDetails that includes workspace rooms
             // When we call getValidOptions()
-            const results = getValidOptions(OPTIONS_WITH_WORKSPACE_ROOM, allPolicies, {}, nvpDismissedProductTraining, loginList, {
+            const results = getValidOptions(OPTIONS_WITH_WORKSPACE_ROOM, {}, nvpDismissedProductTraining, loginList, {
                 includeRecentReports: true,
                 includeMultipleParticipantReports: true,
                 includeP2P: true,
@@ -1162,7 +1134,7 @@ describe('OptionsListUtils', () => {
         it('should exclude users with recent reports from personalDetails', () => {
             // Given a set of reports and personalDetails
             // When we call getValidOptions with no search value
-            const results = getValidOptions({reports: OPTIONS.reports, personalDetails: OPTIONS.personalDetails}, allPolicies, {}, nvpDismissedProductTraining, loginList);
+            const results = getValidOptions({reports: OPTIONS.reports, personalDetails: OPTIONS.personalDetails}, {}, nvpDismissedProductTraining, loginList);
             const reportLogins = new Set(results.recentReports.map((reportOption) => reportOption.login));
             const personalDetailsOverlapWithReports = results.personalDetails.every((personalDetailOption) => reportLogins.has(personalDetailOption.login));
 
@@ -1175,7 +1147,7 @@ describe('OptionsListUtils', () => {
         it('should exclude selected options', () => {
             // Given a set of reports and personalDetails
             // When we call getValidOptions with excludeLogins param
-            const results = getValidOptions({reports: OPTIONS.reports, personalDetails: OPTIONS.personalDetails}, allPolicies, {}, nvpDismissedProductTraining, loginList, {
+            const results = getValidOptions({reports: OPTIONS.reports, personalDetails: OPTIONS.personalDetails}, {}, nvpDismissedProductTraining, loginList, {
                 excludeLogins: {'peterparker@expensify.com': true},
             });
 
@@ -1187,13 +1159,7 @@ describe('OptionsListUtils', () => {
         it('should include Concierge in the results by default', () => {
             // Given a set of report and personalDetails that include Concierge
             // When we call getValidOptions()
-            const results = getValidOptions(
-                {reports: OPTIONS_WITH_CONCIERGE.reports, personalDetails: OPTIONS_WITH_CONCIERGE.personalDetails},
-                allPolicies,
-                {},
-                nvpDismissedProductTraining,
-                loginList,
-            );
+            const results = getValidOptions({reports: OPTIONS_WITH_CONCIERGE.reports, personalDetails: OPTIONS_WITH_CONCIERGE.personalDetails}, {}, nvpDismissedProductTraining, loginList);
 
             // Then the result should include all personalDetails except the currently logged in user
             expect(results.personalDetails.length).toBe(Object.values(OPTIONS_WITH_CONCIERGE.personalDetails).length - 1);
@@ -1209,7 +1175,6 @@ describe('OptionsListUtils', () => {
                     reports: OPTIONS_WITH_CONCIERGE.reports,
                     personalDetails: OPTIONS_WITH_CONCIERGE.personalDetails,
                 },
-                undefined,
                 {},
                 nvpDismissedProductTraining,
                 loginList,
@@ -1228,16 +1193,9 @@ describe('OptionsListUtils', () => {
         it('should exclude Chronos from the results when it is specified in excludedLogins', () => {
             // given a set of reports and personalDetails that includes Chronos
             // When we call getValidOptions() with excludeLogins param
-            const results = getValidOptions(
-                {reports: OPTIONS_WITH_CHRONOS.reports, personalDetails: OPTIONS_WITH_CHRONOS.personalDetails},
-                allPolicies,
-                {},
-                nvpDismissedProductTraining,
-                loginList,
-                {
-                    excludeLogins: {[CONST.EMAIL.CHRONOS]: true},
-                },
-            );
+            const results = getValidOptions({reports: OPTIONS_WITH_CHRONOS.reports, personalDetails: OPTIONS_WITH_CHRONOS.personalDetails}, {}, nvpDismissedProductTraining, loginList, {
+                excludeLogins: {[CONST.EMAIL.CHRONOS]: true},
+            });
 
             // Then the result should include all personalDetails except the currently logged in user and Chronos
             expect(results.personalDetails.length).toBe(Object.values(OPTIONS_WITH_CHRONOS.personalDetails).length - 2);
@@ -1254,7 +1212,6 @@ describe('OptionsListUtils', () => {
                     reports: OPTIONS_WITH_RECEIPTS.reports,
                     personalDetails: OPTIONS_WITH_RECEIPTS.personalDetails,
                 },
-                undefined,
                 {},
                 nvpDismissedProductTraining,
                 loginList,
@@ -1274,7 +1231,7 @@ describe('OptionsListUtils', () => {
             // Given a set of reports and personalDetails with multiple reports
             // When we call getValidOptions with maxRecentReportElements set to 2
             const maxRecentReports = 2;
-            const results = getValidOptions({reports: OPTIONS.reports, personalDetails: OPTIONS.personalDetails}, allPolicies, {}, nvpDismissedProductTraining, loginList, {
+            const results = getValidOptions({reports: OPTIONS.reports, personalDetails: OPTIONS.personalDetails}, {}, nvpDismissedProductTraining, loginList, {
                 maxRecentReportElements: maxRecentReports,
             });
 
@@ -1285,8 +1242,8 @@ describe('OptionsListUtils', () => {
         it('should show all reports when maxRecentReportElements is not specified', () => {
             // Given a set of reports and personalDetails
             // When we call getValidOptions without maxRecentReportElements
-            const resultsWithoutLimit = getValidOptions({reports: OPTIONS.reports, personalDetails: OPTIONS.personalDetails}, allPolicies, {}, nvpDismissedProductTraining, loginList);
-            const resultsWithLimit = getValidOptions({reports: OPTIONS.reports, personalDetails: OPTIONS.personalDetails}, allPolicies, {}, nvpDismissedProductTraining, loginList, {
+            const resultsWithoutLimit = getValidOptions({reports: OPTIONS.reports, personalDetails: OPTIONS.personalDetails}, {}, nvpDismissedProductTraining, loginList);
+            const resultsWithLimit = getValidOptions({reports: OPTIONS.reports, personalDetails: OPTIONS.personalDetails}, {}, nvpDismissedProductTraining, loginList, {
                 maxRecentReportElements: 2,
             });
 
@@ -1297,8 +1254,8 @@ describe('OptionsListUtils', () => {
         it('should not affect personalDetails count when maxRecentReportElements is specified', () => {
             // Given a set of reports and personalDetails
             // When we call getValidOptions with and without maxRecentReportElements
-            const resultsWithoutLimit = getValidOptions({reports: OPTIONS.reports, personalDetails: OPTIONS.personalDetails}, allPolicies, {}, nvpDismissedProductTraining, loginList);
-            const resultsWithLimit = getValidOptions({reports: OPTIONS.reports, personalDetails: OPTIONS.personalDetails}, allPolicies, {}, nvpDismissedProductTraining, loginList, {
+            const resultsWithoutLimit = getValidOptions({reports: OPTIONS.reports, personalDetails: OPTIONS.personalDetails}, {}, nvpDismissedProductTraining, loginList);
+            const resultsWithLimit = getValidOptions({reports: OPTIONS.reports, personalDetails: OPTIONS.personalDetails}, {}, nvpDismissedProductTraining, loginList, {
                 maxRecentReportElements: 2,
             });
 
@@ -1311,7 +1268,7 @@ describe('OptionsListUtils', () => {
             // When we call getValidOptions with both maxElements and maxRecentReportElements
             const maxRecentReports = 3;
             const maxTotalElements = 10;
-            const results = getValidOptions({reports: OPTIONS.reports, personalDetails: OPTIONS.personalDetails}, allPolicies, {}, nvpDismissedProductTraining, loginList, {
+            const results = getValidOptions({reports: OPTIONS.reports, personalDetails: OPTIONS.personalDetails}, {}, nvpDismissedProductTraining, loginList, {
                 maxElements: maxTotalElements,
                 maxRecentReportElements: maxRecentReports,
             });
@@ -1336,7 +1293,7 @@ describe('OptionsListUtils', () => {
             }, []);
 
             // When we call getValidOptions for share destination with an empty search value
-            const results = getValidOptions({reports: filteredReports, personalDetails: OPTIONS.personalDetails}, allPolicies, {}, nvpDismissedProductTraining, loginList, {
+            const results = getValidOptions({reports: filteredReports, personalDetails: OPTIONS.personalDetails}, {}, nvpDismissedProductTraining, loginList, {
                 betas: [],
                 includeMultipleParticipantReports: true,
                 showChatPreviewLine: true,
@@ -1368,7 +1325,7 @@ describe('OptionsListUtils', () => {
             }, []);
 
             // When we call getValidOptions for share destination with an empty search value
-            const results = getValidOptions({reports: filteredReportsWithWorkspaceRooms, personalDetails: OPTIONS.personalDetails}, allPolicies, {}, nvpDismissedProductTraining, loginList, {
+            const results = getValidOptions({reports: filteredReportsWithWorkspaceRooms, personalDetails: OPTIONS.personalDetails}, {}, nvpDismissedProductTraining, loginList, {
                 betas: [],
                 includeMultipleParticipantReports: true,
                 showChatPreviewLine: true,
@@ -1405,28 +1362,24 @@ describe('OptionsListUtils', () => {
     describe('getLastActorDisplayName()', () => {
         it('should return correct display name', () => {
             renderLocaleContextProvider();
-            // Given two different personal details and current user is accountID 2
-            const currentUserAccountID = 2;
-
+            // Given two different personal details
             // When we call getLastActorDisplayName
-            const result1 = getLastActorDisplayName(PERSONAL_DETAILS['2'], currentUserAccountID);
-            const result2 = getLastActorDisplayName(PERSONAL_DETAILS['3'], currentUserAccountID);
+            const result1 = getLastActorDisplayName(PERSONAL_DETAILS['2']);
+            const result2 = getLastActorDisplayName(PERSONAL_DETAILS['3']);
 
-            // We should expect "You" for current user and first name for others
+            // We should expect the display names to be the same as the personal details
             expect(result1).toBe('You');
             expect(result2).toBe('Spider-Man');
         });
     });
 
     describe('shouldShowLastActorDisplayName()', () => {
-        const currentUserAccountID = 2;
-
         it('should return false when lastReportAction is not available', () => {
             // Given a report with no lastVisibleReportAction and no lastAction provided
             const report = REPORTS['1'];
             const lastActorDetails = PERSONAL_DETAILS['3'];
 
-            const result = shouldShowLastActorDisplayName(report, lastActorDetails, undefined, currentUserAccountID);
+            const result = shouldShowLastActorDisplayName(report, lastActorDetails, undefined);
             expect(result).toBe(false);
         });
 
@@ -1435,7 +1388,7 @@ describe('OptionsListUtils', () => {
             const report = REPORTS['1'];
             const lastAction = createRandomReportAction(1);
 
-            const result = shouldShowLastActorDisplayName(report, null, lastAction, currentUserAccountID);
+            const result = shouldShowLastActorDisplayName(report, null, lastAction);
             expect(result).toBe(false);
         });
 
@@ -1446,7 +1399,7 @@ describe('OptionsListUtils', () => {
             const lastAction = createRandomReportAction(1);
 
             // When we call shouldShowLastActorDisplayName with a self DM report
-            const result = shouldShowLastActorDisplayName(report, lastActorDetails, lastAction, currentUserAccountID);
+            const result = shouldShowLastActorDisplayName(report, lastActorDetails, lastAction);
             expect(result).toBe(false);
         });
 
@@ -1459,7 +1412,7 @@ describe('OptionsListUtils', () => {
             const lastActorDetails = PERSONAL_DETAILS['3'];
             const lastAction = createRandomReportAction(1);
 
-            const result = shouldShowLastActorDisplayName(report, lastActorDetails, lastAction, currentUserAccountID);
+            const result = shouldShowLastActorDisplayName(report, lastActorDetails, lastAction);
             expect(result).toBe(false);
         });
 
@@ -1472,7 +1425,7 @@ describe('OptionsListUtils', () => {
                 actionName: CONST.REPORT.ACTIONS.TYPE.IOU,
             };
 
-            const result = shouldShowLastActorDisplayName(report, lastActorDetails, lastAction, currentUserAccountID);
+            const result = shouldShowLastActorDisplayName(report, lastActorDetails, lastAction);
             expect(result).toBe(false);
         });
 
@@ -1491,7 +1444,7 @@ describe('OptionsListUtils', () => {
                 actionName: CONST.REPORT.ACTIONS.TYPE.REPORT_PREVIEW,
             };
 
-            const result = shouldShowLastActorDisplayName(report, lastActorDetails, lastAction, currentUserAccountID);
+            const result = shouldShowLastActorDisplayName(report, lastActorDetails, lastAction);
             expect(result).toBe(false);
         });
 
@@ -1507,7 +1460,7 @@ describe('OptionsListUtils', () => {
             };
             const lastAction = createRandomReportAction(1);
 
-            const result = shouldShowLastActorDisplayName(report, lastActorDetails, lastAction, currentUserAccountID);
+            const result = shouldShowLastActorDisplayName(report, lastActorDetails, lastAction);
             expect(result).toBe(false);
         });
 
@@ -1522,7 +1475,7 @@ describe('OptionsListUtils', () => {
             };
 
             // When we call shouldShowLastActorDisplayName with all valid conditions
-            const result = shouldShowLastActorDisplayName(report, lastActorDetails, lastAction, currentUserAccountID);
+            const result = shouldShowLastActorDisplayName(report, lastActorDetails, lastAction);
             expect(result).toBe(true);
         });
 
@@ -1536,7 +1489,7 @@ describe('OptionsListUtils', () => {
                 actionName: CONST.REPORT.ACTIONS.TYPE.ADD_COMMENT,
             };
 
-            const result = shouldShowLastActorDisplayName(report, lastActorDetails, lastAction, currentUserAccountID);
+            const result = shouldShowLastActorDisplayName(report, lastActorDetails, lastAction);
             expect(result).toBe(true);
         });
 
@@ -1551,7 +1504,7 @@ describe('OptionsListUtils', () => {
             };
 
             // When we call shouldShowLastActorDisplayName with the current user as last actor
-            const result = shouldShowLastActorDisplayName(report, lastActorDetails, lastAction, currentUserAccountID);
+            const result = shouldShowLastActorDisplayName(report, lastActorDetails, lastAction);
             expect(result).toBe(true);
         });
     });
@@ -1723,7 +1676,7 @@ describe('OptionsListUtils', () => {
         it('should not return any results if the search value is on an excluded logins list', () => {
             const searchText = 'admin@expensify.com';
             // Given a set of options with excluded logins list
-            const options = getValidOptions({reports: OPTIONS.reports, personalDetails: OPTIONS.personalDetails}, allPolicies, {}, nvpDismissedProductTraining, loginList, {
+            const options = getValidOptions({reports: OPTIONS.reports, personalDetails: OPTIONS.personalDetails}, {}, nvpDismissedProductTraining, loginList, {
                 excludeLogins: CONST.EXPENSIFY_EMAILS_OBJECT,
             });
             // When we call filterAndOrderOptions with a search value and excluded logins list
@@ -1807,7 +1760,7 @@ describe('OptionsListUtils', () => {
                 return filtered;
             }, []);
             // When we call getValidOptions for share destination with the filteredReports
-            const options = getValidOptions({reports: filteredReports, personalDetails: OPTIONS.personalDetails}, allPolicies, {}, nvpDismissedProductTraining, loginList, {
+            const options = getValidOptions({reports: filteredReports, personalDetails: OPTIONS.personalDetails}, {}, nvpDismissedProductTraining, loginList, {
                 betas: [],
                 includeMultipleParticipantReports: true,
                 showChatPreviewLine: true,
@@ -1840,7 +1793,7 @@ describe('OptionsListUtils', () => {
             }, []);
 
             // When we call getValidOptions for share destination with the filteredReports
-            const options = getValidOptions({reports: filteredReportsWithWorkspaceRooms, personalDetails: OPTIONS.personalDetails}, allPolicies, {}, nvpDismissedProductTraining, loginList, {
+            const options = getValidOptions({reports: filteredReportsWithWorkspaceRooms, personalDetails: OPTIONS.personalDetails}, {}, nvpDismissedProductTraining, loginList, {
                 betas: [],
                 includeMultipleParticipantReports: true,
                 showChatPreviewLine: true,
@@ -1873,7 +1826,7 @@ describe('OptionsListUtils', () => {
             }, []);
 
             // When we call getValidOptions for share destination with the filteredReports
-            const options = getValidOptions({reports: filteredReportsWithWorkspaceRooms, personalDetails: OPTIONS.personalDetails}, allPolicies, {}, nvpDismissedProductTraining, loginList, {
+            const options = getValidOptions({reports: filteredReportsWithWorkspaceRooms, personalDetails: OPTIONS.personalDetails}, {}, nvpDismissedProductTraining, loginList, {
                 betas: [],
                 includeMultipleParticipantReports: true,
                 showChatPreviewLine: true,
@@ -1896,7 +1849,7 @@ describe('OptionsListUtils', () => {
 
         it('should show the option from personal details when searching for personal detail with no existing report', () => {
             // Given a set of options
-            const options = getValidOptions({reports: OPTIONS.reports, personalDetails: OPTIONS.personalDetails}, allPolicies, {}, nvpDismissedProductTraining, loginList);
+            const options = getValidOptions({reports: OPTIONS.reports, personalDetails: OPTIONS.personalDetails}, {}, nvpDismissedProductTraining, loginList);
             // When we call filterAndOrderOptions with a search value that matches a personal detail with no existing report
             const filteredOptions = filterAndOrderOptions(options, 'hulk', COUNTRY_CODE, loginList);
 
@@ -1910,7 +1863,7 @@ describe('OptionsListUtils', () => {
 
         it('should not return any options or user to invite if there are no search results and the string does not match a potential email or phone', () => {
             // Given a set of options
-            const options = getValidOptions({reports: OPTIONS.reports, personalDetails: OPTIONS.personalDetails}, allPolicies, {}, nvpDismissedProductTraining, loginList);
+            const options = getValidOptions({reports: OPTIONS.reports, personalDetails: OPTIONS.personalDetails}, {}, nvpDismissedProductTraining, loginList);
             // When we call filterAndOrderOptions with a search value that does not match any personal details or reports
             const filteredOptions = filterAndOrderOptions(options, 'marc@expensify', COUNTRY_CODE, loginList);
 
@@ -1923,7 +1876,7 @@ describe('OptionsListUtils', () => {
 
         it('should not return any options but should return an user to invite if no matching options exist and the search value is a potential email', () => {
             // Given a set of options
-            const options = getValidOptions({reports: OPTIONS.reports, personalDetails: OPTIONS.personalDetails}, allPolicies, {}, nvpDismissedProductTraining, loginList);
+            const options = getValidOptions({reports: OPTIONS.reports, personalDetails: OPTIONS.personalDetails}, {}, nvpDismissedProductTraining, loginList);
             // When we call filterAndOrderOptions with a search value that does not match any personal details or reports
             const filteredOptions = filterAndOrderOptions(options, 'marc@expensify.com', COUNTRY_CODE, loginList);
 
@@ -1936,7 +1889,7 @@ describe('OptionsListUtils', () => {
 
         it('should return user to invite when search term has a period with options for it that do not contain the period', () => {
             // Given a set of options
-            const options = getValidOptions({reports: OPTIONS.reports, personalDetails: OPTIONS.personalDetails}, allPolicies, {}, nvpDismissedProductTraining, loginList);
+            const options = getValidOptions({reports: OPTIONS.reports, personalDetails: OPTIONS.personalDetails}, {}, nvpDismissedProductTraining, loginList);
             // When we call filterAndOrderOptions with a search value that does not match any personal details or reports but matches user to invite
             const filteredOptions = filterAndOrderOptions(options, 'peter.parker@expensify.com', COUNTRY_CODE, loginList);
 
@@ -1948,7 +1901,7 @@ describe('OptionsListUtils', () => {
 
         it('should return user which has displayName with accent mark when search value without accent mark', () => {
             // Given a set of options
-            const options = getValidOptions({reports: OPTIONS.reports, personalDetails: OPTIONS.personalDetails}, allPolicies, {}, nvpDismissedProductTraining, loginList);
+            const options = getValidOptions({reports: OPTIONS.reports, personalDetails: OPTIONS.personalDetails}, {}, nvpDismissedProductTraining, loginList);
             // When we call filterAndOrderOptions with a search value without accent mark
             const filteredOptions = filterAndOrderOptions(options, 'Timothee', COUNTRY_CODE, loginList);
 
@@ -1958,7 +1911,7 @@ describe('OptionsListUtils', () => {
 
         it('should not return options but should return an user to invite if no matching options exist and the search value is a potential phone number', () => {
             // Given a set of options
-            const options = getValidOptions({reports: OPTIONS.reports, personalDetails: OPTIONS.personalDetails}, allPolicies, {}, nvpDismissedProductTraining, loginList);
+            const options = getValidOptions({reports: OPTIONS.reports, personalDetails: OPTIONS.personalDetails}, {}, nvpDismissedProductTraining, loginList);
             // When we call filterAndOrderOptions with a search value that does not match any personal details or reports but matches user to invite
             const filteredOptions = filterAndOrderOptions(options, '5005550006', COUNTRY_CODE, loginList);
 
@@ -1973,7 +1926,7 @@ describe('OptionsListUtils', () => {
 
         it('should not return options but should return an user to invite if no matching options exist and the search value is a potential phone number with country code added', () => {
             // Given a set of options
-            const options = getValidOptions({reports: OPTIONS.reports, personalDetails: OPTIONS.personalDetails}, allPolicies, {}, nvpDismissedProductTraining, loginList);
+            const options = getValidOptions({reports: OPTIONS.reports, personalDetails: OPTIONS.personalDetails}, {}, nvpDismissedProductTraining, loginList);
             // When we call filterAndOrderOptions with a search value that does not match any personal details or reports but matches user to invite
             const filteredOptions = filterAndOrderOptions(options, '+15005550006', COUNTRY_CODE, loginList);
 
@@ -1988,7 +1941,7 @@ describe('OptionsListUtils', () => {
 
         it('should not return options but should return an user to invite if no matching options exist and the search value is a potential phone number with special characters added', () => {
             // Given a set of options
-            const options = getValidOptions({reports: OPTIONS.reports, personalDetails: OPTIONS.personalDetails}, allPolicies, {}, nvpDismissedProductTraining, loginList);
+            const options = getValidOptions({reports: OPTIONS.reports, personalDetails: OPTIONS.personalDetails}, {}, nvpDismissedProductTraining, loginList);
             // When we call filterAndOrderOptions with a search value that does not match any personal details or reports but matches user to invite
             const filteredOptions = filterAndOrderOptions(options, '+1 (800)324-3233', COUNTRY_CODE, loginList);
 
@@ -2003,7 +1956,7 @@ describe('OptionsListUtils', () => {
 
         it('should not return any options or user to invite if contact number contains alphabet characters', () => {
             // Given a set of options
-            const options = getValidOptions({reports: OPTIONS.reports, personalDetails: OPTIONS.personalDetails}, allPolicies, {}, nvpDismissedProductTraining, loginList);
+            const options = getValidOptions({reports: OPTIONS.reports, personalDetails: OPTIONS.personalDetails}, {}, nvpDismissedProductTraining, loginList);
             // When we call filterAndOrderOptions with a search value that does not match any personal details or reports
             const filteredOptions = filterAndOrderOptions(options, '998243aaaa', COUNTRY_CODE, loginList);
 
@@ -2016,7 +1969,7 @@ describe('OptionsListUtils', () => {
 
         it('should not return any options if search value does not match any personal details', () => {
             // Given a set of options
-            const options = getValidOptions({reports: OPTIONS.reports, personalDetails: OPTIONS.personalDetails}, allPolicies, {}, nvpDismissedProductTraining, loginList);
+            const options = getValidOptions({reports: OPTIONS.reports, personalDetails: OPTIONS.personalDetails}, {}, nvpDismissedProductTraining, loginList);
             // When we call filterAndOrderOptions with a search value that does not match any personal details
             const filteredOptions = filterAndOrderOptions(options, 'magneto', COUNTRY_CODE, loginList);
 
@@ -2026,7 +1979,7 @@ describe('OptionsListUtils', () => {
 
         it('should return one recent report and no personal details if a search value provides an email', () => {
             // Given a set of options
-            const options = getValidOptions({reports: OPTIONS.reports, personalDetails: OPTIONS.personalDetails}, allPolicies, {}, nvpDismissedProductTraining, loginList);
+            const options = getValidOptions({reports: OPTIONS.reports, personalDetails: OPTIONS.personalDetails}, {}, nvpDismissedProductTraining, loginList);
             // When we call filterAndOrderOptions with a search value that matches an email
             const filteredOptions = filterAndOrderOptions(options, 'peterparker@expensify.com', COUNTRY_CODE, loginList, {sortByReportTypeInSearch: true});
 
@@ -2040,7 +1993,7 @@ describe('OptionsListUtils', () => {
 
         it('should return all matching reports and personal details', () => {
             // Given a set of options
-            const options = getValidOptions({reports: OPTIONS.reports, personalDetails: OPTIONS.personalDetails}, allPolicies, {}, nvpDismissedProductTraining, loginList);
+            const options = getValidOptions({reports: OPTIONS.reports, personalDetails: OPTIONS.personalDetails}, {}, nvpDismissedProductTraining, loginList);
             // When we call filterAndOrderOptions with a search value that matches both reports and personal details and maxRecentReportsToShow param
             const filteredOptions = filterAndOrderOptions(options, '.com', COUNTRY_CODE, loginList, {maxRecentReportsToShow: 5});
 
@@ -2494,23 +2447,6 @@ describe('OptionsListUtils', () => {
             const result = optionsOrderBy(options, comparator, 0);
             expect(result).toEqual([]);
         });
-
-        it('returns the older options up to the specified limit', () => {
-            const options: OptionData[] = [
-                {reportID: '1', lastVisibleActionCreated: '2022-01-01T10:00:00Z'} as OptionData,
-                {reportID: '2', lastVisibleActionCreated: '2022-01-01T12:00:00Z'} as OptionData,
-                {reportID: '3', lastVisibleActionCreated: '2022-01-01T09:00:00Z'} as OptionData,
-                {reportID: '4', lastVisibleActionCreated: '2022-01-01T13:00:00Z'} as OptionData,
-            ];
-            const comparator = (option: OptionData) => option.lastVisibleActionCreated ?? '';
-            // We will pass reversed === true to sort the list in ascending order
-            const result = optionsOrderBy(options, comparator, 2, undefined, true);
-            expect(result.length).toBe(2);
-            // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
-            expect(result.at(0)!.reportID).toBe('3');
-            // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
-            expect(result.at(1)!.reportID).toBe('1');
-        });
     });
 
     describe('sortAlphabetically', () => {
@@ -2681,16 +2617,17 @@ describe('OptionsListUtils', () => {
     });
 
     describe('getLastMessageTextForReport', () => {
-        describe('getReportPreviewMessage', () => {
-            it('should format report preview message correctly for non-policy expense chat with IOU action', async () => {
+        describe('REPORT_PREVIEW action', () => {
+            it('should show report preview message for non-policy expense chat', async () => {
+                const report: Report = {
+                    ...createRandomReport(0, undefined),
+                    isOwnPolicyExpenseChat: false,
+                };
                 const iouReport: Report = {
                     ...createRandomReport(1, undefined),
                     isOwnPolicyExpenseChat: false,
                     type: CONST.REPORT.TYPE.IOU,
                     isWaitingOnBankAccount: false,
-                    currency: CONST.CURRENCY.USD,
-                    total: 100,
-                    unheldTotal: 100,
                 };
                 const reportPreviewAction: ReportAction = {
                     ...createRandomReportAction(1),
@@ -2714,7 +2651,6 @@ describe('OptionsListUtils', () => {
                 };
                 const iouAction: ReportAction = {
                     ...createRandomReportAction(2),
-                    reportID: iouReport.reportID,
                     actionName: CONST.REPORT.ACTIONS.TYPE.IOU,
                     message: [{type: 'COMMENT', text: ''}],
                     originalMessage: {
@@ -2723,15 +2659,18 @@ describe('OptionsListUtils', () => {
                     },
                     shouldShow: true,
                 };
-
-                await Onyx.set(`${ONYXKEYS.COLLECTION.REPORT}${iouReport.reportID}`, iouReport);
-                await Onyx.set(`${ONYXKEYS.COLLECTION.TRANSACTION}${transaction.transactionID}`, transaction);
-                await waitForBatchedUpdates();
-
-                // Test getReportPreviewMessage directly - this is the function responsible for formatting the message
+                await Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT}${iouReport.reportID}`, iouReport);
+                await Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${report.reportID}`, {
+                    [reportPreviewAction.reportActionID]: reportPreviewAction,
+                });
+                await Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${iouReport.reportID}`, {
+                    [iouAction.reportActionID]: iouAction,
+                });
+                await Onyx.merge(`${ONYXKEYS.COLLECTION.TRANSACTION}${transaction.transactionID}`, transaction);
+                const lastMessage = getLastMessageTextForReport({report, lastActorDetails: null, isReportArchived: false});
                 const reportPreviewMessage = getReportPreviewMessage(iouReport, iouAction, true, false, null, true, reportPreviewAction);
-                const formattedMessage = formatReportLastMessageText(Parser.htmlToText(reportPreviewMessage));
-                expect(formattedMessage).toBe('$1.00 for A A A');
+                const expected = formatReportLastMessageText(Parser.htmlToText(reportPreviewMessage));
+                expect(lastMessage).toBe(expected);
             });
         });
         it('MOVED_TRANSACTION action', async () => {
@@ -2755,7 +2694,7 @@ describe('OptionsListUtils', () => {
             await Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${report.reportID}`, {
                 [movedTransactionAction.reportActionID]: movedTransactionAction,
             });
-            const lastMessage = getLastMessageTextForReport({translate: translateLocal, report, lastActorDetails: null, isReportArchived: false});
+            const lastMessage = getLastMessageTextForReport({report, lastActorDetails: null, isReportArchived: false});
             expect(lastMessage).toBe(Parser.htmlToText(getMovedTransactionMessage(movedTransactionAction)));
         });
         describe('SUBMITTED action', () => {
@@ -2773,7 +2712,7 @@ describe('OptionsListUtils', () => {
                 await Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${report.reportID}`, {
                     [submittedAction.reportActionID]: submittedAction,
                 });
-                const lastMessage = getLastMessageTextForReport({translate: translateLocal, report, lastActorDetails: null, isReportArchived: false, visibleReportActionsDataParam: {}});
+                const lastMessage = getLastMessageTextForReport({report, lastActorDetails: null, isReportArchived: false});
                 expect(lastMessage).toBe(Parser.htmlToText(translate(CONST.LOCALES.EN, 'iou.automaticallySubmitted')));
             });
         });
@@ -2792,7 +2731,7 @@ describe('OptionsListUtils', () => {
                 await Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${report.reportID}`, {
                     [approvedAction.reportActionID]: approvedAction,
                 });
-                const lastMessage = getLastMessageTextForReport({translate: translateLocal, report, lastActorDetails: null, isReportArchived: false, visibleReportActionsDataParam: {}});
+                const lastMessage = getLastMessageTextForReport({report, lastActorDetails: null, isReportArchived: false});
                 expect(lastMessage).toBe(Parser.htmlToText(translate(CONST.LOCALES.EN, 'iou.automaticallyApproved')));
             });
         });
@@ -2811,7 +2750,7 @@ describe('OptionsListUtils', () => {
                 await Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${report.reportID}`, {
                     [forwardedAction.reportActionID]: forwardedAction,
                 });
-                const lastMessage = getLastMessageTextForReport({translate: translateLocal, report, lastActorDetails: null, isReportArchived: false, visibleReportActionsDataParam: {}});
+                const lastMessage = getLastMessageTextForReport({report, lastActorDetails: null, isReportArchived: false});
                 expect(lastMessage).toBe(Parser.htmlToText(translate(CONST.LOCALES.EN, 'iou.automaticallyForwarded')));
             });
         });
@@ -2827,7 +2766,7 @@ describe('OptionsListUtils', () => {
                 await Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${report.reportID}`, {
                     [corporateForceUpgradeAction.reportActionID]: corporateForceUpgradeAction,
                 });
-                const lastMessage = getLastMessageTextForReport({translate: translateLocal, report, lastActorDetails: null, isReportArchived: false, visibleReportActionsDataParam: {}});
+                const lastMessage = getLastMessageTextForReport({report, lastActorDetails: null, isReportArchived: false});
                 expect(lastMessage).toBe(Parser.htmlToText(translate(CONST.LOCALES.EN, 'workspaceActions.forcedCorporateUpgrade')));
             });
         });
@@ -2842,7 +2781,7 @@ describe('OptionsListUtils', () => {
             await Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${report.reportID}`, {
                 [takeControlAction.reportActionID]: takeControlAction,
             });
-            const lastMessage = getLastMessageTextForReport({translate: translateLocal, report, lastActorDetails: null, isReportArchived: false});
+            const lastMessage = getLastMessageTextForReport({report, lastActorDetails: null, isReportArchived: false});
             expect(lastMessage).toBe(Parser.htmlToText(getChangedApproverActionMessage(translateLocal, takeControlAction)));
         });
         it('REROUTE action', async () => {
@@ -2856,7 +2795,7 @@ describe('OptionsListUtils', () => {
             await Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${report.reportID}`, {
                 [rerouteAction.reportActionID]: rerouteAction,
             });
-            const lastMessage = getLastMessageTextForReport({translate: translateLocal, report, lastActorDetails: null, isReportArchived: false});
+            const lastMessage = getLastMessageTextForReport({report, lastActorDetails: null, isReportArchived: false});
             expect(lastMessage).toBe(Parser.htmlToText(getChangedApproverActionMessage(translateLocal, rerouteAction)));
         });
         it('MOVED action', async () => {
@@ -2870,7 +2809,7 @@ describe('OptionsListUtils', () => {
             await Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${report.reportID}`, {
                 [movedAction.reportActionID]: movedAction,
             });
-            const lastMessage = getLastMessageTextForReport({translate: translateLocal, report, lastActorDetails: null, isReportArchived: false});
+            const lastMessage = getLastMessageTextForReport({report, lastActorDetails: null, isReportArchived: false});
             expect(lastMessage).toBe(Parser.htmlToText(getMovedActionMessage(movedAction, report)));
         });
         it('DYNAMIC_EXTERNAL_WORKFLOW_ROUTED action', async () => {
@@ -2888,7 +2827,7 @@ describe('OptionsListUtils', () => {
             });
 
             // When getting the last message text for the report
-            const lastMessage = getLastMessageTextForReport({translate: translateLocal, report, lastActorDetails: null, isReportArchived: false});
+            const lastMessage = getLastMessageTextForReport({report, lastActorDetails: null, isReportArchived: false});
 
             // Then it should return the DYNAMIC_EXTERNAL_WORKFLOW_ROUTED message
             expect(lastMessage).toBe(Parser.htmlToText(getDynamicExternalWorkflowRoutedMessage(action, translateLocal)));
@@ -2909,11 +2848,9 @@ describe('OptionsListUtils', () => {
 
             const expectedVisibleText = '';
             const result = getLastMessageTextForReport({
-                translate: translateLocal,
                 report,
                 lastActorDetails: null,
                 isReportArchived: false,
-                visibleReportActionsDataParam: {},
             });
             expect(result).toBe(expectedVisibleText);
         });
@@ -2952,15 +2889,7 @@ describe('OptionsListUtils', () => {
                 await Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${reportID}`, {
                     [submittedAction.reportActionID]: submittedAction,
                 });
-                const lastMessage = getLastMessageTextForReport({
-                    translate: translateLocal,
-                    report,
-                    lastActorDetails: null,
-                    isReportArchived: false,
-                    policy,
-                    reportMetadata,
-                    visibleReportActionsDataParam: {},
-                });
+                const lastMessage = getLastMessageTextForReport({report, lastActorDetails: null, isReportArchived: false, policy, reportMetadata});
                 expect(lastMessage).toBe(translate(CONST.LOCALES.EN, 'iou.queuedToSubmitViaDEW'));
             });
 
@@ -2986,7 +2915,7 @@ describe('OptionsListUtils', () => {
                 await Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${reportID}`, {
                     [dewSubmitFailedAction.reportActionID]: dewSubmitFailedAction,
                 });
-                const lastMessage = getLastMessageTextForReport({translate: translateLocal, report, lastActorDetails: null, isReportArchived: false, visibleReportActionsDataParam: {}});
+                const lastMessage = getLastMessageTextForReport({report, lastActorDetails: null, isReportArchived: false});
                 expect(lastMessage).toBe(customErrorMessage);
             });
 
@@ -3009,7 +2938,7 @@ describe('OptionsListUtils', () => {
                 await Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${reportID}`, {
                     [dewSubmitFailedAction.reportActionID]: dewSubmitFailedAction,
                 });
-                const lastMessage = getLastMessageTextForReport({translate: translateLocal, report, lastActorDetails: null, isReportArchived: false, visibleReportActionsDataParam: {}});
+                const lastMessage = getLastMessageTextForReport({report, lastActorDetails: null, isReportArchived: false});
                 expect(lastMessage).toBe(translate(CONST.LOCALES.EN, 'iou.error.genericCreateFailureMessage'));
             });
         });
@@ -3035,861 +2964,6 @@ describe('OptionsListUtils', () => {
         });
     });
 
-    describe('getLastActorDisplayNameFromLastVisibleActions', () => {
-        beforeEach(() => {
-            renderLocaleContextProvider();
-        });
-
-        it('should return display name from lastActorDetails when no last visible action exists', () => {
-            // Given a report with no last visible action and lastActorDetails
-            const report: Report = {
-                ...createRandomReport(0, undefined),
-                reportID: 'test-report-1',
-            };
-            const lastActorDetails: Partial<PersonalDetails> = {
-                accountID: 3,
-                displayName: 'Spider-Man',
-                login: 'peterparker@expensify.com',
-            };
-            const personalDetails: PersonalDetailsList = PERSONAL_DETAILS;
-
-            // When we call getLastActorDisplayNameFromLastVisibleActions
-            const result = getLastActorDisplayNameFromLastVisibleActions(report, lastActorDetails, 0, personalDetails);
-
-            // Then it should return the display name from lastActorDetails
-            expect(result).toBe('Spider-Man');
-        });
-
-        it('should return display name from personalDetails when last visible action exists and actor is found in personalDetails', async () => {
-            // Given a report with a last visible action
-            const reportID = 'test-report-2';
-            const actorAccountID = 3;
-            const report: Report = {
-                ...createRandomReport(0, undefined),
-                reportID,
-                lastActorAccountID: actorAccountID,
-            };
-            const lastActorDetails: Partial<PersonalDetails> = {
-                accountID: 1,
-                displayName: 'Mister Fantastic',
-            };
-            const personalDetails: PersonalDetailsList = PERSONAL_DETAILS;
-
-            const reportAction: ReportAction = {
-                ...createRandomReportAction(actorAccountID),
-                reportActionID: 'action-1',
-                actionName: CONST.REPORT.ACTIONS.TYPE.ADD_COMMENT,
-                actorAccountID,
-                created: DateUtils.getDBTime(),
-                message: [{type: 'COMMENT', text: 'Test message', html: 'Test message', isEdited: false, isDeletedParentAction: false, whisperedTo: []}],
-                shouldShow: true,
-                pendingAction: null,
-            };
-
-            // Set up the report and report action in Onyx so it gets picked up by lastVisibleReportActions
-            await Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT}${reportID}`, report);
-            await Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${reportID}`, {
-                [reportAction.reportActionID]: reportAction,
-            });
-            await waitForBatchedUpdates();
-
-            // When we call getLastActorDisplayNameFromLastVisibleActions
-            const result = getLastActorDisplayNameFromLastVisibleActions(report, lastActorDetails, 0, personalDetails);
-
-            // Then it should return the display name from personalDetails for the actor
-            expect(result).toBe('Spider-Man');
-        });
-
-        it('should return display name from reportAction.person when actor is not found in personalDetails', async () => {
-            // Given a report with a last visible action where actor is not in personalDetails
-            const reportID = 'test-report-3';
-            const actorAccountID = 999;
-            const report: Report = {
-                ...createRandomReport(0, undefined),
-                reportID,
-                lastActorAccountID: actorAccountID,
-            };
-            const lastActorDetails: Partial<PersonalDetails> = {
-                accountID: 1,
-                displayName: 'Mister Fantastic',
-            };
-            const personalDetails: PersonalDetailsList = PERSONAL_DETAILS;
-
-            const reportAction: ReportAction = {
-                ...createRandomReportAction(actorAccountID),
-                reportActionID: 'action-2',
-                actionName: CONST.REPORT.ACTIONS.TYPE.ADD_COMMENT,
-                actorAccountID,
-                created: DateUtils.getDBTime(),
-                message: [{type: 'COMMENT', text: 'Test message', html: 'Test message', isEdited: false, isDeletedParentAction: false, whisperedTo: []}],
-                shouldShow: true,
-                pendingAction: null,
-                person: [{text: 'Unknown User', type: 'TEXT'}],
-            };
-
-            // Set up the report and report action in Onyx
-            await Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT}${reportID}`, report);
-            await Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${reportID}`, {
-                [reportAction.reportActionID]: reportAction,
-            });
-            await waitForBatchedUpdates();
-
-            // When we call getLastActorDisplayNameFromLastVisibleActions
-            const result = getLastActorDisplayNameFromLastVisibleActions(report, lastActorDetails, 0, personalDetails);
-
-            // Then it should return the display name from reportAction.person
-            // Note: formatPhoneNumberPhoneUtils replaces spaces with non-breaking spaces
-            expect(result).toBe('Unknown User'.replaceAll(' ', '\u00A0'));
-        });
-
-        it('should return "You" when the last actor is the current user', async () => {
-            // Given a report with current user as the last actor
-            const reportID = 'test-report-4';
-            const currentUserAccountID = 2; // Iron Man
-            const report: Report = {
-                ...createRandomReport(0, undefined),
-                reportID,
-                lastActorAccountID: currentUserAccountID,
-            };
-            const lastActorDetails: Partial<PersonalDetails> = {
-                accountID: 1,
-                displayName: 'Mister Fantastic',
-            };
-            const personalDetails: PersonalDetailsList = PERSONAL_DETAILS;
-
-            const reportAction: ReportAction = {
-                ...createRandomReportAction(currentUserAccountID),
-                reportActionID: 'action-3',
-                actionName: CONST.REPORT.ACTIONS.TYPE.ADD_COMMENT,
-                actorAccountID: currentUserAccountID,
-                created: DateUtils.getDBTime(),
-                message: [{type: 'COMMENT', text: 'Test message', html: 'Test message', isEdited: false, isDeletedParentAction: false, whisperedTo: []}],
-                shouldShow: true,
-                pendingAction: null,
-            };
-
-            await Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT}${reportID}`, report);
-            await Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${reportID}`, {
-                [reportAction.reportActionID]: reportAction,
-            });
-            await waitForBatchedUpdates();
-
-            // When we call getLastActorDisplayNameFromLastVisibleActions
-            const result = getLastActorDisplayNameFromLastVisibleActions(report, lastActorDetails, currentUserAccountID, personalDetails);
-
-            // Then it should return "You" for the current user
-            expect(result).toBe('You');
-        });
-
-        it('should fall back to lastActorDetails when last visible action exists but actor cannot be determined', async () => {
-            // Given a report with a last visible action but no actor account ID
-            const reportID = 'test-report-5';
-            const report: Report = {
-                ...createRandomReport(0, undefined),
-                reportID,
-            };
-            const lastActorDetails: Partial<PersonalDetails> = {
-                accountID: 3,
-                displayName: 'Spider-Man',
-                firstName: 'Spider',
-            };
-            const personalDetails: PersonalDetailsList = PERSONAL_DETAILS;
-
-            const reportAction: ReportAction = {
-                ...createRandomReportAction(0),
-                reportActionID: 'action-4',
-                actionName: CONST.REPORT.ACTIONS.TYPE.ADD_COMMENT,
-                actorAccountID: undefined,
-                created: DateUtils.getDBTime(),
-                message: [{type: 'COMMENT', text: 'Test message', html: 'Test message', isEdited: false, isDeletedParentAction: false, whisperedTo: []}],
-                shouldShow: true,
-                pendingAction: null,
-                person: [], // Ensure person array is empty so it doesn't create actorDetails from person
-            };
-
-            await Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT}${reportID}`, report);
-            await Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${reportID}`, {
-                [reportAction.reportActionID]: reportAction,
-            });
-            await waitForBatchedUpdates();
-
-            // When we call getLastActorDisplayNameFromLastVisibleActions
-            const result = getLastActorDisplayNameFromLastVisibleActions(report, lastActorDetails, 0, personalDetails);
-
-            // Then it should fall back to lastActorDetails
-            // getLastActorDisplayName returns firstName if available, otherwise formatPhoneNumberPhoneUtils(getDisplayNameOrDefault(...))
-            expect(result).toBe('Spider');
-        });
-    });
-
-    describe('getReportDisplayOption', () => {
-        beforeEach(() => {
-            renderLocaleContextProvider();
-        });
-
-        it('should return option with isSelfDM alternateText when report is a self DM', () => {
-            // Given a self DM report
-            const report: Report = {
-                ...createRandomReport(0, undefined),
-                reportID: 'self-dm-1',
-                type: CONST.REPORT.TYPE.CHAT,
-                chatType: CONST.REPORT.CHAT_TYPE.SELF_DM,
-                participants: {
-                    2: {notificationPreference: CONST.REPORT.NOTIFICATION_PREFERENCE.ALWAYS},
-                },
-            };
-            const personalDetails: PersonalDetailsList = PERSONAL_DETAILS;
-
-            // When we call getReportDisplayOption
-            const result = getReportDisplayOption(report, undefined, personalDetails, undefined);
-
-            // Then it should return an option with isSelfDM and alternateText set
-            expect(result.isSelfDM).toBe(true);
-            expect(result.alternateText).toBe(translateLocal('reportActionsView.yourSpace'));
-            expect(result.isDisabled).toBe(true);
-            expect(result.isSelected).toBe(false);
-        });
-
-        it('should return option with invoice room text and alternateText when report is an invoice room', () => {
-            // Given an invoice room report
-            const report: Report = {
-                ...createRandomReport(0, undefined),
-                reportID: 'invoice-room-1',
-                type: CONST.REPORT.TYPE.CHAT,
-                chatType: CONST.REPORT.CHAT_TYPE.INVOICE,
-            };
-            const personalDetails: PersonalDetailsList = PERSONAL_DETAILS;
-
-            // When we call getReportDisplayOption
-            const result = getReportDisplayOption(report, undefined, personalDetails, undefined);
-
-            // Then it should return an option with invoice room text and alternateText
-            expect(result.isInvoiceRoom).toBe(true);
-            expect(result.alternateText).toBe(translateLocal('workspace.common.invoices'));
-            expect(result.isDisabled).toBe(true);
-        });
-
-        it('should return option with unknownUserDetails when provided', () => {
-            // Given a report with unknown user details
-            const report: Report = {
-                ...createRandomReport(0, undefined),
-                reportID: 'unknown-user-1',
-            };
-            const unknownUserDetails = {
-                accountID: 999,
-                login: 'unknown@expensify.com',
-                text: 'Unknown User',
-            };
-            const personalDetails: PersonalDetailsList = PERSONAL_DETAILS;
-
-            // When we call getReportDisplayOption
-            const result = getReportDisplayOption(report, unknownUserDetails, personalDetails, undefined);
-
-            // Then it should return an option with unknownUserDetails data
-            expect(result.text).toBe('Unknown User');
-            expect(result.alternateText).toBe('unknown@expensify.com');
-            expect(result.participantsList).toBeDefined();
-            expect(result.participantsList?.at(0)?.accountID).toBe(999);
-            expect(result.isDisabled).toBe(true);
-        });
-
-        it('should return option with workspace name when report has ownerAccountID', () => {
-            // Given a workspace report
-            const report: Report = {
-                ...createRandomReport(0, undefined),
-                reportID: 'workspace-1',
-                ownerAccountID: 1,
-                policyID,
-            };
-            const personalDetails: PersonalDetailsList = PERSONAL_DETAILS;
-
-            // When we call getReportDisplayOption
-            const result = getReportDisplayOption(report, undefined, personalDetails, undefined);
-
-            // Then it should return an option with workspace name
-            expect(result.text).toBe(POLICY.name);
-            expect(result.alternateText).toBe(translateLocal('workspace.common.workspace'));
-            expect(result.isDisabled).toBe(true);
-        });
-
-        it('should use personalDetails parameter instead of Onyx.connect data', () => {
-            // Given a report with participants
-            const report: Report = {
-                ...createRandomReport(0, undefined),
-                reportID: 'test-personal-details-1',
-                participants: {
-                    3: {notificationPreference: CONST.REPORT.NOTIFICATION_PREFERENCE.ALWAYS},
-                },
-            };
-            // Use a modified personalDetails that differs from what's in Onyx
-            const customPersonalDetails: PersonalDetailsList = {
-                ...PERSONAL_DETAILS,
-                3: {
-                    ...PERSONAL_DETAILS['3'],
-                    displayName: 'Custom Spider-Man Name',
-                },
-            };
-
-            // When we call getReportDisplayOption with custom personalDetails
-            const result = getReportDisplayOption(report, undefined, customPersonalDetails, undefined);
-
-            // Then it should use the custom personalDetails parameter
-            expect(result).toBeDefined();
-            expect(result.isDisabled).toBe(true);
-            expect(result.isSelected).toBe(false);
-        });
-
-        it('should handle empty personalDetails gracefully', () => {
-            // Given a report with empty personalDetails
-            const report: Report = {
-                ...createRandomReport(0, undefined),
-                reportID: 'test-empty-details-1',
-            };
-            const emptyPersonalDetails: PersonalDetailsList = {};
-
-            // When we call getReportDisplayOption
-            const result = getReportDisplayOption(report, undefined, emptyPersonalDetails, undefined);
-
-            // Then it should not throw and return a valid option
-            expect(result).toBeDefined();
-            expect(result.isDisabled).toBe(true);
-        });
-
-        it('should handle undefined report gracefully', () => {
-            // Given an undefined report
-            const personalDetails: PersonalDetailsList = PERSONAL_DETAILS;
-
-            // When we call getReportDisplayOption with undefined report
-            const result = getReportDisplayOption(undefined, undefined, personalDetails, undefined);
-
-            // Then it should return a valid option (createOption handles undefined)
-            expect(result).toBeDefined();
-            expect(result.isDisabled).toBe(true);
-        });
-    });
-
-    describe('getValidOptions with policies parameter', () => {
-        it('should accept policies collection as second parameter', () => {
-            const policy: Policy = {
-                id: 'test-policy',
-                name: 'Test Policy',
-                role: 'admin',
-                type: CONST.POLICY.TYPE.TEAM,
-                owner: 'owner@test.com',
-                outputCurrency: 'USD',
-                isPolicyExpenseChatEnabled: true,
-                approvalMode: CONST.POLICY.APPROVAL_MODE.OPTIONAL,
-                areCategoriesEnabled: true,
-            };
-
-            const policies = {[`${ONYXKEYS.COLLECTION.POLICY}${policy.id}`]: policy};
-
-            // Test that getValidOptions accepts policies collection as second parameter
-            const results = getValidOptions({reports: [], personalDetails: []}, policies, undefined, nvpDismissedProductTraining, loginList);
-
-            expect(results).toBeDefined();
-            expect(results.recentReports).toBeDefined();
-            expect(results.personalDetails).toBeDefined();
-        });
-
-        it('should work with undefined policies', () => {
-            const options = {reports: [], personalDetails: []};
-            const results = getValidOptions(options, undefined, undefined, nvpDismissedProductTraining, loginList);
-
-            expect(results).toBeDefined();
-            expect(results.recentReports).toBeDefined();
-            expect(results.personalDetails).toBeDefined();
-        });
-
-        it('should work with empty policies collection', () => {
-            const options = {reports: [], personalDetails: []};
-            const results = getValidOptions(options, {}, undefined, nvpDismissedProductTraining, loginList);
-
-            expect(results).toBeDefined();
-            expect(results.recentReports).toBeDefined();
-            expect(results.personalDetails).toBeDefined();
-        });
-
-        it('should pass policies to filtering logic', () => {
-            const testPolicyID = 'test-policy-123';
-            const policy: Policy = {
-                id: testPolicyID,
-                name: 'Test Workspace',
-                role: 'admin',
-                type: CONST.POLICY.TYPE.TEAM,
-                owner: 'owner@test.com',
-                outputCurrency: 'USD',
-                isPolicyExpenseChatEnabled: true,
-                approvalMode: CONST.POLICY.APPROVAL_MODE.OPTIONAL,
-                areCategoriesEnabled: true,
-            };
-
-            const policies = {[`${ONYXKEYS.COLLECTION.POLICY}${testPolicyID}`]: policy};
-
-            // Verify function works with policies parameter
-            const results = getValidOptions({reports: OPTIONS.reports, personalDetails: OPTIONS.personalDetails}, policies, undefined, nvpDismissedProductTraining, loginList, {
-                betas: [],
-                includeRecentReports: true,
-            });
-
-            expect(results.recentReports).toBeDefined();
-            expect(Array.isArray(results.recentReports)).toBe(true);
-        });
-    });
-
-    describe('getReportOption', () => {
-        beforeEach(() => Onyx.clear());
-
-        it('should return option with correct workspace name when policy is provided', async () => {
-            const reportID = '101';
-            const testPolicyID = 'policy123';
-            const policy: Policy = {
-                id: testPolicyID,
-                name: 'Test Workspace',
-                role: 'admin',
-                type: CONST.POLICY.TYPE.TEAM,
-                owner: 'owner@test.com',
-                outputCurrency: 'USD',
-                approvalMode: CONST.POLICY.APPROVAL_MODE.OPTIONAL,
-                isPolicyExpenseChatEnabled: false,
-            };
-            const report: Report = {
-                reportID,
-                reportName: 'Test Report',
-                type: CONST.REPORT.TYPE.CHAT,
-                policyID: testPolicyID,
-                chatType: CONST.REPORT.CHAT_TYPE.POLICY_EXPENSE_CHAT,
-            };
-
-            await Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT}${reportID}`, report);
-            await Onyx.merge(`${ONYXKEYS.COLLECTION.POLICY}${testPolicyID}`, policy);
-            await waitForBatchedUpdates();
-
-            const participant = {
-                reportID,
-                policyID: testPolicyID,
-                isPolicyExpenseChat: true,
-            };
-
-            const option = getReportOption(participant, undefined, policy);
-
-            expect(option.text).toBe('Test Workspace');
-            expect(option.alternateText).toBe(translateLocal('workspace.common.workspace'));
-            expect(option.isSelected).toBe(undefined);
-        });
-
-        it('should show submits to info when policy has approval workflow', async () => {
-            const reportID = '102';
-            const testPolicyID = 'policy124';
-            const ownerAccountID = 8888;
-            const approverAccountID = 9999;
-            const policy: Policy = {
-                id: testPolicyID,
-                name: 'Test Workspace with Submit',
-                role: 'user',
-                type: CONST.POLICY.TYPE.TEAM,
-                owner: 'owner@test.com',
-                outputCurrency: 'USD',
-                approvalMode: CONST.POLICY.APPROVAL_MODE.BASIC,
-                isPolicyExpenseChatEnabled: false,
-            };
-            const report: Report = {
-                reportID,
-                reportName: 'Test Report',
-                type: CONST.REPORT.TYPE.EXPENSE,
-                policyID: testPolicyID,
-                chatType: CONST.REPORT.CHAT_TYPE.POLICY_EXPENSE_CHAT,
-                ownerAccountID,
-            };
-
-            const personalDetails = {
-                [ownerAccountID]: {
-                    accountID: ownerAccountID,
-                    displayName: 'Report Owner',
-                    login: 'owner@test.com',
-                },
-                [approverAccountID]: {
-                    accountID: approverAccountID,
-                    displayName: 'John Manager',
-                    login: 'manager@test.com',
-                },
-            };
-
-            await Onyx.merge(ONYXKEYS.PERSONAL_DETAILS_LIST, personalDetails);
-            await Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT}${reportID}`, report);
-            await Onyx.merge(`${ONYXKEYS.COLLECTION.POLICY}${testPolicyID}`, policy);
-            await waitForBatchedUpdates();
-
-            const participant = {
-                reportID,
-                policyID: testPolicyID,
-                isPolicyExpenseChat: true,
-            };
-
-            const option = getReportOption(participant, undefined, policy);
-
-            expect(option.text).toBe('Test Workspace with Submit');
-            // The submitsTo logic may or may not apply depending on complex approval rules
-            // Just verify the option was created correctly
-            expect(option.alternateText).toBeDefined();
-        });
-
-        it('should mark draft reports as disabled', async () => {
-            const reportID = '103';
-            const report: Report = {
-                reportID,
-                reportName: 'Draft Report',
-                type: CONST.REPORT.TYPE.CHAT,
-            };
-
-            await Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT_DRAFT}${reportID}`, report);
-            await waitForBatchedUpdates();
-
-            const participant = {
-                reportID,
-            };
-
-            const option = getReportOption(participant, undefined, POLICY);
-
-            expect(option.isDisabled).toBe(true);
-        });
-
-        it('should handle self DM reports correctly', async () => {
-            const reportID = '104';
-            const currentUserAccountID = 1;
-            const report: Report = {
-                reportID,
-                reportName: 'My Space',
-                type: CONST.REPORT.TYPE.CHAT,
-                chatType: CONST.REPORT.CHAT_TYPE.SELF_DM,
-                participants: {
-                    [currentUserAccountID]: {notificationPreference: CONST.REPORT.NOTIFICATION_PREFERENCE.ALWAYS},
-                },
-            };
-
-            const personalDetails = {
-                [currentUserAccountID]: {
-                    accountID: currentUserAccountID,
-                    displayName: 'Current User',
-                    login: 'currentuser@test.com',
-                },
-            };
-
-            await Onyx.merge(ONYXKEYS.SESSION, {accountID: currentUserAccountID, email: 'currentuser@test.com'});
-            await Onyx.merge(ONYXKEYS.PERSONAL_DETAILS_LIST, personalDetails);
-            await Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT}${reportID}`, report);
-            await waitForBatchedUpdates();
-
-            const participant = {
-                reportID,
-                isSelfDM: true,
-            };
-
-            const option = getReportOption(participant, undefined, POLICY);
-
-            // The option.isSelfDM is set by createOption based on the report type
-            // Just verify the alternateText is correct for self DM
-            if (option.isSelfDM) {
-                expect(option.alternateText).toBe(translateLocal('reportActionsView.yourSpace'));
-            } else {
-                // If not detected as selfDM, just ensure option was created
-                expect(option).toBeDefined();
-            }
-        });
-
-        it('should handle invoice rooms correctly', async () => {
-            const reportID = '105';
-            const testPolicyID = 'policy125';
-            const report: Report = {
-                reportID,
-                reportName: 'Invoice Room',
-                type: CONST.REPORT.TYPE.INVOICE,
-                policyID: testPolicyID,
-                chatType: CONST.REPORT.CHAT_TYPE.INVOICE,
-                invoiceReceiver: {
-                    type: CONST.REPORT.INVOICE_RECEIVER_TYPE.INDIVIDUAL,
-                    accountID: 1,
-                },
-            };
-
-            await Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT}${reportID}`, report);
-            await waitForBatchedUpdates();
-
-            const participant = {
-                reportID,
-                isInvoiceRoom: true,
-            };
-
-            const option = getReportOption(participant, undefined, POLICY);
-
-            expect(option.isInvoiceRoom).toBe(true);
-            expect(option.alternateText).toBe(translateLocal('workspace.common.invoices'));
-        });
-
-        it('should return option with correct text for workspace chat', async () => {
-            const workspaceReport: Report = {
-                lastReadTime: '2021-01-14 11:25:39.302',
-                lastVisibleActionCreated: '2022-11-22 03:26:02.022',
-                isPinned: false,
-                reportID: '18',
-                participants: {
-                    2: {notificationPreference: CONST.REPORT.NOTIFICATION_PREFERENCE.ALWAYS},
-                },
-                reportName: '',
-                policyID,
-                policyName: POLICY.name,
-                chatType: CONST.REPORT.CHAT_TYPE.POLICY_EXPENSE_CHAT,
-                isOwnPolicyExpenseChat: true,
-                type: CONST.REPORT.TYPE.CHAT,
-            };
-
-            await Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT}18`, workspaceReport);
-            await waitForBatchedUpdates();
-
-            const participant: Participant = {
-                reportID: '18',
-                selected: false,
-            };
-
-            let reportNameValuePair: OnyxEntry<ReportNameValuePairs>;
-            Onyx.connect({
-                key: `${ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS}${participant.reportID}`,
-                waitForCollectionCallback: false,
-                callback: (value) => {
-                    reportNameValuePair = value;
-                },
-            });
-            await waitForBatchedUpdates();
-
-            const option = getReportOption(participant, reportNameValuePair?.private_isArchived, POLICY);
-
-            expect(option.text).toBe(POLICY.name);
-            expect(option.alternateText).toBeTruthy();
-            expect(option.alternateText === translateLocal('workspace.common.workspace') || option.alternateText?.includes('Submits to')).toBe(true);
-        });
-
-        it('should handle draft reports', async () => {
-            const draftReport: Report = {
-                lastReadTime: '2021-01-14 11:25:39.302',
-                lastVisibleActionCreated: '2022-11-22 03:26:02.022',
-                isPinned: false,
-                reportID: '19',
-                participants: {
-                    2: {notificationPreference: CONST.REPORT.NOTIFICATION_PREFERENCE.ALWAYS},
-                    3: {notificationPreference: CONST.REPORT.NOTIFICATION_PREFERENCE.ALWAYS},
-                },
-                reportName: 'Draft Report',
-                type: CONST.REPORT.TYPE.CHAT,
-                writeCapability: CONST.REPORT.WRITE_CAPABILITIES.ADMINS,
-            };
-
-            await Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT_DRAFT}19`, draftReport);
-            await waitForBatchedUpdates();
-
-            const draftReports = {
-                '19': draftReport,
-            };
-
-            const participant: Participant = {
-                reportID: '19',
-                selected: false,
-            };
-
-            let reportNameValuePair: OnyxEntry<ReportNameValuePairs>;
-            Onyx.connect({
-                key: `${ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS}${participant.reportID}`,
-                waitForCollectionCallback: false,
-                callback: (value) => {
-                    reportNameValuePair = value;
-                },
-            });
-            await waitForBatchedUpdates();
-
-            const option = getReportOption(participant, reportNameValuePair?.private_isArchived, POLICY, undefined, draftReports);
-
-            expect(option.isDisabled).toBe(true);
-        });
-    });
-
-    describe('getReportDisplayOption', () => {
-        it('should use reportNameValuePair parameter for archived reports', async () => {
-            const reportID = '23';
-            const report: Report = {
-                ...createRegularChat(Number(reportID), [2, 7]),
-                reportID,
-                lastVisibleActionCreated: '2022-11-22 03:26:02.001',
-            };
-
-            const reportNameValuePair: ReportNameValuePairs = {
-                private_isArchived: DateUtils.getDBTime(),
-            };
-
-            await Onyx.set(`${ONYXKEYS.COLLECTION.REPORT}${reportID}`, report);
-            await waitForBatchedUpdates();
-
-            const option = getReportDisplayOption(report, undefined, {}, reportNameValuePair?.private_isArchived);
-
-            expect(option).toBeDefined();
-            expect(option.reportID).toBe(reportID);
-            expect(option.private_isArchived).toBeDefined();
-            expect(option.private_isArchived).toBe(reportNameValuePair.private_isArchived);
-            expect(option.isDisabled).toBe(true);
-            expect(option.isSelected).toBe(false);
-        });
-
-        it('should use reportNameValuePair parameter for non-archived reports', async () => {
-            const reportID = '24';
-            const report: Report = {
-                ...createRegularChat(Number(reportID), [2, 7]),
-                reportID,
-                lastVisibleActionCreated: '2022-11-22 03:26:02.001',
-            };
-
-            const reportNameValuePair: ReportNameValuePairs = {};
-
-            await Onyx.set(`${ONYXKEYS.COLLECTION.REPORT}${reportID}`, report);
-            await waitForBatchedUpdates();
-
-            const option = getReportDisplayOption(report, undefined, {}, reportNameValuePair?.private_isArchived);
-
-            expect(option).toBeDefined();
-            expect(option.reportID).toBe(reportID);
-            expect(option.private_isArchived).toBeUndefined();
-            expect(option.isDisabled).toBe(true);
-            expect(option.isSelected).toBe(false);
-        });
-
-        it('should handle undefined reportNameValuePair', async () => {
-            const reportID = '25';
-            const report: Report = {
-                ...createRegularChat(Number(reportID), [2, 7]),
-                reportID,
-                lastVisibleActionCreated: '2022-11-22 03:26:02.001',
-            };
-
-            await Onyx.set(`${ONYXKEYS.COLLECTION.REPORT}${reportID}`, report);
-            await waitForBatchedUpdates();
-
-            const option = getReportDisplayOption(report, undefined, {}, undefined);
-
-            expect(option).toBeDefined();
-            expect(option.reportID).toBe(reportID);
-            expect(option.isDisabled).toBe(true);
-            expect(option.isSelected).toBe(false);
-        });
-
-        it('should use reportNameValuePair for invoice room reports', async () => {
-            const reportID = '26';
-            const report: Report = {
-                ...createRegularChat(Number(reportID), [2, 7]),
-                reportID,
-                chatType: CONST.REPORT.CHAT_TYPE.INVOICE,
-                lastVisibleActionCreated: '2022-11-22 03:26:02.001',
-            };
-
-            const reportNameValuePair: ReportNameValuePairs = {
-                private_isArchived: DateUtils.getDBTime(),
-            };
-
-            await Onyx.set(`${ONYXKEYS.COLLECTION.REPORT}${reportID}`, report);
-            await waitForBatchedUpdates();
-
-            const option = getReportDisplayOption(report, undefined, {}, reportNameValuePair?.private_isArchived);
-
-            expect(option).toBeDefined();
-            expect(option.reportID).toBe(reportID);
-            expect(option.isInvoiceRoom).toBe(true);
-            expect(option.private_isArchived).toBeDefined();
-            expect(option.private_isArchived).toBe(reportNameValuePair.private_isArchived);
-        });
-
-        it('should use reportNameValuePair for self DM reports', async () => {
-            const reportID = '27';
-            const report: Report = {
-                ...createRegularChat(Number(reportID), [2]),
-                reportID,
-                chatType: CONST.REPORT.CHAT_TYPE.SELF_DM,
-                ownerAccountID: 2,
-                lastVisibleActionCreated: '2022-11-22 03:26:02.001',
-            };
-
-            const reportNameValuePair: ReportNameValuePairs = {};
-
-            await Onyx.set(`${ONYXKEYS.COLLECTION.REPORT}${reportID}`, report);
-            await waitForBatchedUpdates();
-
-            const option = getReportDisplayOption(report, undefined, {}, reportNameValuePair?.private_isArchived);
-
-            expect(option).toBeDefined();
-            expect(option.reportID).toBe(reportID);
-            expect(option.isSelfDM).toBe(true);
-        });
-
-        it('should preserve selected state from participant', async () => {
-            const reportID = '106';
-            const report: Report = {
-                reportID,
-                reportName: 'Selected Report',
-                type: CONST.REPORT.TYPE.CHAT,
-            };
-
-            await Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT}${reportID}`, report);
-            await waitForBatchedUpdates();
-
-            const participant = {
-                reportID,
-                selected: true,
-            };
-
-            const option = getReportOption(participant, undefined, POLICY);
-
-            expect(option.isSelected).toBe(true);
-            expect(option.selected).toBe(true);
-        });
-
-        it('should handle policy parameter being null', async () => {
-            const reportID = '107';
-            const report: Report = {
-                reportID,
-                reportName: 'Test Report',
-                type: CONST.REPORT.TYPE.CHAT,
-            };
-
-            await Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT}${reportID}`, report);
-            await waitForBatchedUpdates();
-
-            const participant = {
-                reportID,
-            };
-
-            const option = getReportOption(participant, undefined, undefined);
-
-            expect(option).toBeDefined();
-            expect(option.text).toBeDefined();
-        });
-
-        it('should handle reportAttributesDerived parameter', async () => {
-            const reportID = '108';
-            const report: Report = {
-                reportID,
-                reportName: 'Test Report',
-                type: CONST.REPORT.TYPE.CHAT,
-            };
-
-            await Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT}${reportID}`, report);
-            await waitForBatchedUpdates();
-
-            const participant = {
-                reportID,
-            };
-
-            // Test that the function works with reportAttributesDerived parameter (optional)
-            const option = getReportOption(participant, undefined, POLICY);
-
-            expect(option).toBeDefined();
-        });
-    });
-
     describe('getUserToInviteOption', () => {
         it('should not return userToInvite for plain text name when shouldAcceptName is false', () => {
             const result = getUserToInviteOption({
diff --git a/tests/unit/PersistedRequests.ts b/tests/unit/PersistedRequests.ts
index a1938d592e6e..1c1b3c552c15 100644
--- a/tests/unit/PersistedRequests.ts
+++ b/tests/unit/PersistedRequests.ts
@@ -5,7 +5,7 @@ import type Request from '../../src/types/onyx/Request';
 import waitForBatchedUpdates from '../utils/waitForBatchedUpdates';
 import wrapOnyxWithWaitForBatchedUpdates from '../utils/wrapOnyxWithWaitForBatchedUpdates';
 
-const request: Request<'reportMetadata_1' | 'reportMetadata_2'> = {
+const request: Request = {
     command: 'OpenReport',
     successData: [{key: 'reportMetadata_1', onyxMethod: 'merge', value: {}}],
     failureData: [{key: 'reportMetadata_2', onyxMethod: 'merge', value: {}}],
@@ -49,7 +49,7 @@ describe('PersistedRequests', () => {
 
     it('when onyx persist the request, it should remove from the list the ongoing request', () => {
         expect(PersistedRequests.getAll().length).toBe(1);
-        const request2: Request<'reportMetadata_3' | 'reportMetadata_4'> = {
+        const request2: Request = {
             command: 'AddComment',
             successData: [{key: 'reportMetadata_3', onyxMethod: 'merge', value: {}}],
             failureData: [{key: 'reportMetadata_4', onyxMethod: 'merge', value: {}}],
@@ -64,7 +64,7 @@ describe('PersistedRequests', () => {
     });
 
     it('update the request at the given index with new data', () => {
-        const newRequest: Request<'reportMetadata_1' | 'reportMetadata_2'> = {
+        const newRequest: Request = {
             command: 'OpenReport',
             successData: [{key: 'reportMetadata_1', onyxMethod: 'set', value: {}}],
             failureData: [{key: 'reportMetadata_2', onyxMethod: 'set', value: {}}],
@@ -75,7 +75,7 @@ describe('PersistedRequests', () => {
     });
 
     it('update the ongoing request with new data', () => {
-        const newRequest: Request<'reportMetadata_1' | 'reportMetadata_2'> = {
+        const newRequest: Request = {
             command: 'OpenReport',
             successData: [{key: 'reportMetadata_1', onyxMethod: 'set', value: {}}],
             failureData: [{key: 'reportMetadata_2', onyxMethod: 'set', value: {}}],
diff --git a/tests/unit/PolicyUtilsTest.ts b/tests/unit/PolicyUtilsTest.ts
index 69111efda17b..4fabf81d7891 100644
--- a/tests/unit/PolicyUtilsTest.ts
+++ b/tests/unit/PolicyUtilsTest.ts
@@ -1,12 +1,11 @@
 /* eslint-disable @typescript-eslint/naming-convention */
 import {renderHook} from '@testing-library/react-native';
 import Onyx from 'react-native-onyx';
-import type {OnyxCollection, OnyxEntry} from 'react-native-onyx';
+import type {OnyxEntry} from 'react-native-onyx';
 import useDefaultFundID from '@hooks/useDefaultFundID';
 import DateUtils from '@libs/DateUtils';
 import {
     getActivePolicies,
-    getAllTaxRatesNamesAndValues,
     getCustomUnitsForDuplication,
     getEligibleBankAccountShareRecipients,
     getManagerAccountID,
@@ -188,17 +187,6 @@ const rules = {
             approver: 'tagapprover2@test.com',
             id: '4',
         },
-        {
-            applyWhen: [
-                {
-                    condition: 'matches',
-                    field: 'category',
-                    value: 'cat3',
-                },
-            ],
-            approver: 'categoryapprover1@test.com',
-            id: '5',
-        },
     ],
 };
 const policyTags = {
@@ -543,11 +531,9 @@ describe('PolicyUtils', () => {
                     category: '',
                     reportID: expenseReport.reportID,
                 };
-                await Onyx.multiSet({
-                    [ONYXKEYS.COLLECTION.TRANSACTION]: {
-                        [transaction1.transactionID]: transaction1,
-                        [transaction2.transactionID]: transaction2,
-                    },
+                await Onyx.set(ONYXKEYS.COLLECTION.TRANSACTION, {
+                    [transaction1.transactionID]: transaction1,
+                    [transaction2.transactionID]: transaction2,
                 });
                 expect(getSubmitToAccountID(policy, expenseReport)).toBe(categoryApprover1AccountID);
             });
@@ -574,7 +560,9 @@ describe('PolicyUtils', () => {
                     tag: '',
                 };
 
-                await Onyx.set(`${ONYXKEYS.COLLECTION.TRANSACTION}${transaction.transactionID}`, transaction);
+                await Onyx.set(ONYXKEYS.COLLECTION.TRANSACTION, {
+                    [transaction.transactionID]: transaction,
+                });
                 expect(getSubmitToAccountID(policy, expenseReport)).toBe(adminAccountID);
             });
             it('should return the category approver of the first transaction sorted by created if we have many transaction categories match with the category approver rule', async () => {
@@ -604,63 +592,12 @@ describe('PolicyUtils', () => {
                     created: DateUtils.subtractMillisecondsFromDateTime(testDate, 1),
                     reportID: expenseReport.reportID,
                 };
-                await Onyx.multiSet({
-                    [ONYXKEYS.COLLECTION.TRANSACTION]: {
-                        [transaction1.transactionID]: transaction1,
-                        [transaction2.transactionID]: transaction2,
-                    },
+                await Onyx.set(ONYXKEYS.COLLECTION.TRANSACTION, {
+                    [transaction1.transactionID]: transaction1,
+                    [transaction2.transactionID]: transaction2,
                 });
                 expect(getSubmitToAccountID(policy, expenseReport)).toBe(categoryApprover2AccountID);
             });
-            it('should return the first rule approver who is not the current submitter', async () => {
-                const policy: Policy = {
-                    ...createRandomPolicy(0),
-                    approver: 'owner@test.com',
-                    owner: 'owner@test.com',
-                    type: CONST.POLICY.TYPE.CORPORATE,
-                    employeeList,
-                    rules,
-                    approvalMode: CONST.POLICY.APPROVAL_MODE.ADVANCED,
-                };
-                const expenseReport: Report = {
-                    ...createRandomReport(0, undefined),
-                    ownerAccountID: categoryApprover1AccountID,
-                    type: CONST.REPORT.TYPE.EXPENSE,
-                };
-                const transaction1: Transaction = {
-                    ...createRandomTransaction(0),
-                    category: 'cat1',
-                    reportID: expenseReport.reportID,
-                    tag: '',
-                    created: DateUtils.subtractMillisecondsFromDateTime(testDate, 2),
-                };
-
-                const transaction2: Transaction = {
-                    ...createRandomTransaction(1),
-                    category: 'cat3',
-                    reportID: expenseReport.reportID,
-                    tag: '',
-                    created: DateUtils.subtractMillisecondsFromDateTime(testDate, 1),
-                };
-
-                const transaction3: Transaction = {
-                    ...createRandomTransaction(2),
-                    category: '',
-                    reportID: expenseReport.reportID,
-                    tag: 'tag1',
-                    created: testDate,
-                };
-
-                await Onyx.multiSet({
-                    [ONYXKEYS.COLLECTION.TRANSACTION]: {
-                        [transaction1.transactionID]: transaction1,
-                        [transaction2.transactionID]: transaction2,
-                        [transaction3.transactionID]: transaction3,
-                    },
-                });
-
-                expect(getSubmitToAccountID(policy, expenseReport)).toBe(tagApprover1AccountID);
-            });
             describe('Has no transaction match with the category approver rule', () => {
                 it('should return the first tag approver if has any transaction tag match with with the tag approver rule ', async () => {
                     const policy: Policy = {
@@ -1732,84 +1669,6 @@ describe('PolicyUtils', () => {
         });
     });
 
-    describe('getAllTaxRatesNamesAndValues', () => {
-        it('returns empty object when there are no policies or no tax rates', () => {
-            expect(getAllTaxRatesNamesAndValues(undefined)).toEqual({});
-            expect(getAllTaxRatesNamesAndValues({})).toEqual({});
-            const policiesWithoutTaxes: OnyxCollection<Policy> = {
-                policy1: {
-                    ...createRandomPolicy(1, CONST.POLICY.TYPE.TEAM),
-                    taxRates: undefined,
-                },
-            };
-            expect(getAllTaxRatesNamesAndValues(policiesWithoutTaxes)).toEqual({});
-        });
-
-        it('aggregates tax rates across policies', () => {
-            const policies: OnyxCollection<Policy> = {
-                p1: {
-                    ...createRandomPolicy(1, CONST.POLICY.TYPE.TEAM),
-                    taxRates: {
-                        taxes: {
-                            TAX_A: {name: 'A', value: '5'},
-                            TAX_B: {name: 'B', value: '10'},
-                        },
-                        name: '',
-                        defaultExternalID: '',
-                        defaultValue: '',
-                        foreignTaxDefault: '',
-                    },
-                },
-                p2: {
-                    ...createRandomPolicy(2, CONST.POLICY.TYPE.TEAM),
-                    taxRates: {
-                        taxes: {
-                            TAX_C: {name: 'C', value: '15'},
-                        },
-                        name: '',
-                        defaultExternalID: '',
-                        defaultValue: '',
-                        foreignTaxDefault: '',
-                    },
-                },
-            };
-            const result = getAllTaxRatesNamesAndValues(policies);
-            expect(Object.keys(result).sort()).toEqual(['TAX_A', 'TAX_B', 'TAX_C']);
-            expect(result.TAX_B).toEqual({name: 'B', value: '10'});
-        });
-
-        it('preserves the first occurrence when duplicate tax keys appear in multiple policies', () => {
-            const policies: OnyxCollection<Policy> = {
-                first: {
-                    ...createRandomPolicy(1, CONST.POLICY.TYPE.TEAM),
-                    taxRates: {
-                        taxes: {
-                            DUP_TAX: {name: 'First', value: '1'},
-                        },
-                        name: '',
-                        defaultExternalID: '',
-                        defaultValue: '',
-                        foreignTaxDefault: '',
-                    },
-                },
-                second: {
-                    ...createRandomPolicy(2, CONST.POLICY.TYPE.TEAM),
-                    taxRates: {
-                        taxes: {
-                            DUP_TAX: {name: 'Second', value: '2'},
-                        },
-                        name: '',
-                        defaultExternalID: '',
-                        defaultValue: '',
-                        foreignTaxDefault: '',
-                    },
-                },
-            };
-            const result = getAllTaxRatesNamesAndValues(policies);
-            expect(result.DUP_TAX).toEqual({name: 'First', value: '1'});
-        });
-    });
-
     it('should return undefined when no tag approver rule is present', () => {
         const policy: Policy = {
             ...createRandomPolicy(1, CONST.POLICY.TYPE.TEAM),
diff --git a/tests/unit/ReportActionsUtilsTest.ts b/tests/unit/ReportActionsUtilsTest.ts
index e9e3a5a07bd7..9c513195db2c 100644
--- a/tests/unit/ReportActionsUtilsTest.ts
+++ b/tests/unit/ReportActionsUtilsTest.ts
@@ -14,16 +14,10 @@ import {
     getCardIssuedMessage,
     getCompanyAddressUpdateMessage,
     getCreatedReportForUnapprovedTransactionsMessage,
-    getInvoiceCompanyNameUpdateMessage,
-    getInvoiceCompanyWebsiteUpdateMessage,
     getOneTransactionThreadReportID,
     getOriginalMessage,
-    getPolicyChangeLogMaxExpenseAgeMessage,
-    getPolicyChangeLogMaxExpenseAmountMessage,
-    getPolicyChangeLogMaxExpenseAmountNoReceiptMessage,
     getReportActionActorAccountID,
     getSendMoneyFlowAction,
-    getUpdateACHAccountMessage,
     isIOUActionMatchingTransactionList,
 } from '../../src/libs/ReportActionsUtils';
 import {buildOptimisticCreatedReportForUnapprovedAction} from '../../src/libs/ReportUtils';
@@ -577,7 +571,6 @@ describe('ReportActionsUtils', () => {
                 {
                     created: '2022-11-13 22:27:01.825',
                     reportActionID: '8401445780099176',
-                    reportID: '1',
                     actionName: CONST.REPORT.ACTIONS.TYPE.ADD_COMMENT,
                     originalMessage: {
                         html: 'Hello world',
@@ -594,7 +587,6 @@ describe('ReportActionsUtils', () => {
                 {
                     created: '2022-11-12 22:27:01.825',
                     reportActionID: '6401435781022176',
-                    reportID: '1',
                     actionName: CONST.REPORT.ACTIONS.TYPE.CREATED,
                     originalMessage: {
                         html: 'Hello world',
@@ -611,7 +603,6 @@ describe('ReportActionsUtils', () => {
                 {
                     created: '2022-11-11 22:27:01.825',
                     reportActionID: '2962390724708756',
-                    reportID: '1',
                     actionName: CONST.REPORT.ACTIONS.TYPE.IOU,
                     originalMessage: {
                         amount: 0,
@@ -629,7 +620,6 @@ describe('ReportActionsUtils', () => {
                 {
                     created: '2022-11-10 22:27:01.825',
                     reportActionID: '1609646094152486',
-                    reportID: '1',
                     actionName: CONST.REPORT.ACTIONS.TYPE.RENAMED,
                     originalMessage: {
                         html: 'Hello world',
@@ -648,7 +638,6 @@ describe('ReportActionsUtils', () => {
                 {
                     created: '2022-11-09 22:27:01.825',
                     reportActionID: '8049485084562457',
-                    reportID: '1',
                     actionName: CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_FIELD,
                     originalMessage: {},
                     message: [{html: 'updated the Approval Mode from "Submit and Approve" to "Submit and Close"', type: 'Action type', text: 'Action text'}],
@@ -656,7 +645,6 @@ describe('ReportActionsUtils', () => {
                 {
                     created: '2022-11-08 22:27:06.825',
                     reportActionID: '1661970171066216',
-                    reportID: '1',
                     actionName: CONST.REPORT.ACTIONS.TYPE.REIMBURSEMENT_QUEUED,
                     originalMessage: {
                         paymentType: 'ACH',
@@ -666,7 +654,6 @@ describe('ReportActionsUtils', () => {
                 {
                     created: '2022-11-06 22:27:08.825',
                     reportActionID: '1661970171066220',
-                    reportID: '1',
                     actionName: CONST.REPORT.ACTIONS.TYPE.TASK_EDITED,
                     originalMessage: {
                         html: 'Hello world',
@@ -688,7 +675,6 @@ describe('ReportActionsUtils', () => {
             const movedTransactionAction: ReportAction = {
                 created: '2022-11-13 22:27:01.825',
                 reportActionID: '8401445780099177',
-                reportID: '1',
                 actionName: CONST.REPORT.ACTIONS.TYPE.MOVED_TRANSACTION,
                 originalMessage: {
                     fromReportID: CONST.REPORT.UNREPORTED_REPORT_ID,
@@ -699,7 +685,6 @@ describe('ReportActionsUtils', () => {
             const addCommentAction: ReportAction = {
                 created: '2022-11-12 22:27:01.825',
                 reportActionID: '6401435781022176',
-                reportID: '1',
                 actionName: CONST.REPORT.ACTIONS.TYPE.ADD_COMMENT,
                 originalMessage: {
                     html: 'Hello world',
@@ -725,7 +710,6 @@ describe('ReportActionsUtils', () => {
                 {
                     created: '2022-11-13 22:27:01.825',
                     reportActionID: '8401445780099176',
-                    reportID: '1',
                     actionName: CONST.REPORT.ACTIONS.TYPE.ADD_COMMENT,
                     originalMessage: {
                         html: 'Hello world',
@@ -742,7 +726,6 @@ describe('ReportActionsUtils', () => {
                 {
                     created: '2022-11-12 22:27:01.825',
                     reportActionID: '6401435781022176',
-                    reportID: '1',
                     actionName: CONST.REPORT.ACTIONS.TYPE.CREATED,
                     originalMessage: {
                         html: 'Hello world',
@@ -759,7 +742,6 @@ describe('ReportActionsUtils', () => {
                 {
                     created: '2022-11-11 22:27:01.825',
                     reportActionID: '2962390724708756',
-                    reportID: '1',
                     actionName: CONST.REPORT.ACTIONS.TYPE.IOU,
                     originalMessage: {
                         amount: 0,
@@ -777,7 +759,6 @@ describe('ReportActionsUtils', () => {
                 {
                     created: '2022-11-10 22:27:01.825',
                     reportActionID: '1609646094152486',
-                    reportID: '1',
                     actionName: CONST.REPORT.ACTIONS.TYPE.RENAMED,
                     originalMessage: {
                         html: 'Hello world',
@@ -796,7 +777,6 @@ describe('ReportActionsUtils', () => {
                 {
                     created: '2022-11-09 22:27:01.825',
                     reportActionID: '1661970171066218',
-                    reportID: '1',
                     actionName: CONST.REPORT.ACTIONS.TYPE.CLOSED,
                     originalMessage: {
                         policyName: 'default', // change to const
@@ -825,7 +805,6 @@ describe('ReportActionsUtils', () => {
                 {
                     created: '2022-11-13 22:27:01.825',
                     reportActionID: '8401445780099176',
-                    reportID: '1',
                     actionName: CONST.REPORT.ACTIONS.TYPE.ADD_COMMENT,
                     originalMessage: {
                         html: 'Hello world',
@@ -842,7 +821,6 @@ describe('ReportActionsUtils', () => {
                 {
                     created: '2022-11-12 22:27:01.825',
                     reportActionID: '8401445780099175',
-                    reportID: '1',
                     actionName: CONST.REPORT.ACTIONS.TYPE.ADD_COMMENT,
                     originalMessage: {
                         html: 'Hello world',
@@ -854,7 +832,6 @@ describe('ReportActionsUtils', () => {
                 {
                     created: '2022-11-11 22:27:01.825',
                     reportActionID: '8401445780099174',
-                    reportID: '1',
                     actionName: CONST.REPORT.ACTIONS.TYPE.ADD_COMMENT,
                     originalMessage: {
                         html: 'Hello world',
@@ -877,7 +854,6 @@ describe('ReportActionsUtils', () => {
                 {
                     created: '2024-11-19 08:04:13.728',
                     reportActionID: '1607371725956675966',
-                    reportID: '1',
                     actionName: CONST.REPORT.ACTIONS.TYPE.ADD_COMMENT,
                     originalMessage: {
                         html: '<mention-user accountID="18414674"/>',
@@ -897,7 +873,6 @@ describe('ReportActionsUtils', () => {
                 {
                     created: '2024-11-19 08:00:14.352',
                     reportActionID: '4655978522337302598',
-                    reportID: '1',
                     actionName: CONST.REPORT.ACTIONS.TYPE.ADD_COMMENT,
                     originalMessage: {
                         html: '#join',
@@ -916,7 +891,6 @@ describe('ReportActionsUtils', () => {
                 {
                     created: '2022-11-09 22:27:01.825',
                     reportActionID: '8049485084562457',
-                    reportID: '1',
                     actionName: CONST.REPORT.ACTIONS.TYPE.ACTIONABLE_REPORT_MENTION_WHISPER,
                     originalMessage: {
                         lastModified: '2024-11-19 08:00:14.353',
@@ -934,7 +908,6 @@ describe('ReportActionsUtils', () => {
                 {
                     created: '2022-11-12 22:27:01.825',
                     reportActionID: '6401435781022176',
-                    reportID: '1',
                     actionName: CONST.REPORT.ACTIONS.TYPE.ACTIONABLE_MENTION_WHISPER,
                     originalMessage: {
                         inviteeAccountIDs: [18414674],
@@ -1034,7 +1007,6 @@ describe('ReportActionsUtils', () => {
                 ...LHNTestUtils.getFakeReportAction('email1@test.com', 3),
                 created: '2023-08-01 16:00:00',
                 reportActionID: 'action1',
-                reportID: '1',
                 actionName: 'ADDCOMMENT',
                 originalMessage: {
                     html: 'Hello world',
@@ -1045,7 +1017,6 @@ describe('ReportActionsUtils', () => {
                 ...LHNTestUtils.getFakeReportAction('email2@test.com', 3),
                 created: '2023-08-01 18:00:00',
                 reportActionID: 'action2',
-                reportID: '1',
                 actionName: 'ADDCOMMENT',
                 originalMessage: {
                     html: 'Hello world',
@@ -1631,7 +1602,10 @@ describe('ReportActionsUtils', () => {
         it('should return the correct message with a valid report ID and report name', () => {
             const reportID = '12345';
             const reportName = 'Test Expense Report';
-            const expectedMessage = translateLocal('reportAction.harvestCreatedExpenseReport', `${environmentURL}/${ROUTES.REPORT_WITH_ID.getRoute(reportID)}`, reportName);
+            const expectedMessage = translateLocal('reportAction.harvestCreatedExpenseReport', {
+                reportUrl: `${environmentURL}/${ROUTES.REPORT_WITH_ID.getRoute(reportID)}`,
+                reportName,
+            });
 
             const result = ReportActionsUtils.getHarvestCreatedExpenseReportMessage(reportID, reportName, translateLocal);
 
@@ -2345,144 +2319,6 @@ describe('ReportActionsUtils', () => {
         });
     });
 
-    describe('getPolicyChangeLogMaxExpenseAmountMessage', () => {
-        it('should return set message when setting from disabled to a value', () => {
-            const action = {
-                actionName: CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_MAX_EXPENSE_AMOUNT,
-                reportActionID: '1',
-                created: '',
-                originalMessage: {
-                    oldMaxExpenseAmount: CONST.POLICY.DISABLED_MAX_EXPENSE_AGE,
-                    newMaxExpenseAmount: 10000,
-                    currency: 'USD',
-                },
-            } as ReportAction;
-            const result = getPolicyChangeLogMaxExpenseAmountMessage(translateLocal, action);
-            expect(result).toBe('set max expense amount to "$100.00"');
-        });
-
-        it('should return removed message when setting to disabled', () => {
-            const action = {
-                actionName: CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_MAX_EXPENSE_AMOUNT,
-                reportActionID: '1',
-                created: '',
-                originalMessage: {
-                    oldMaxExpenseAmount: 10000,
-                    newMaxExpenseAmount: CONST.POLICY.DISABLED_MAX_EXPENSE_AGE,
-                    currency: 'USD',
-                },
-            } as ReportAction;
-            const result = getPolicyChangeLogMaxExpenseAmountMessage(translateLocal, action);
-            expect(result).toBe('removed max expense amount (previously "$100.00")');
-        });
-
-        it('should return changed message when changing from one value to another', () => {
-            const action = {
-                actionName: CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_MAX_EXPENSE_AMOUNT,
-                reportActionID: '1',
-                created: '',
-                originalMessage: {
-                    oldMaxExpenseAmount: 10000,
-                    newMaxExpenseAmount: 50000,
-                    currency: 'USD',
-                },
-            } as ReportAction;
-            const result = getPolicyChangeLogMaxExpenseAmountMessage(translateLocal, action);
-            expect(result).toBe('changed max expense amount to "$500.00" (previously "$100.00")');
-        });
-    });
-
-    describe('getPolicyChangeLogMaxExpenseAgeMessage', () => {
-        it('should return set message when setting from disabled to a value', () => {
-            const action = {
-                actionName: CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_MAX_EXPENSE_AGE,
-                reportActionID: '1',
-                created: '',
-                originalMessage: {
-                    oldMaxExpenseAge: CONST.POLICY.DISABLED_MAX_EXPENSE_AGE,
-                    newMaxExpenseAge: 30,
-                },
-            } as ReportAction;
-            const result = getPolicyChangeLogMaxExpenseAgeMessage(translateLocal, action);
-            expect(result).toBe('set max expense age to "30" days');
-        });
-
-        it('should return removed message when setting to disabled', () => {
-            const action = {
-                actionName: CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_MAX_EXPENSE_AGE,
-                reportActionID: '1',
-                created: '',
-                originalMessage: {
-                    oldMaxExpenseAge: 30,
-                    newMaxExpenseAge: CONST.POLICY.DISABLED_MAX_EXPENSE_AGE,
-                },
-            } as ReportAction;
-            const result = getPolicyChangeLogMaxExpenseAgeMessage(translateLocal, action);
-            expect(result).toBe('removed max expense age (previously "30" days)');
-        });
-
-        it('should return changed message when changing from one value to another', () => {
-            const action = {
-                actionName: CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_MAX_EXPENSE_AGE,
-                reportActionID: '1',
-                created: '',
-                originalMessage: {
-                    oldMaxExpenseAge: 30,
-                    newMaxExpenseAge: 60,
-                },
-            } as ReportAction;
-            const result = getPolicyChangeLogMaxExpenseAgeMessage(translateLocal, action);
-            expect(result).toBe('changed max expense age to "60" days (previously "30")');
-        });
-    });
-
-    describe('getPolicyChangeLogMaxExpenseAmountNoReceiptMessage', () => {
-        it('should return set message when setting from disabled to a value', () => {
-            const action = {
-                actionName: CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_MAX_EXPENSE_AMOUNT_NO_RECEIPT,
-                reportActionID: '1',
-                created: '',
-                originalMessage: {
-                    oldMaxExpenseAmountNoReceipt: CONST.POLICY.DISABLED_MAX_EXPENSE_AGE,
-                    newMaxExpenseAmountNoReceipt: 2500,
-                    currency: 'USD',
-                },
-            } as ReportAction;
-            const result = getPolicyChangeLogMaxExpenseAmountNoReceiptMessage(translateLocal, action);
-            expect(result).toBe('set receipt required amount to "$25.00"');
-        });
-
-        it('should return removed message when setting to disabled', () => {
-            const action = {
-                actionName: CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_MAX_EXPENSE_AMOUNT_NO_RECEIPT,
-                reportActionID: '1',
-                created: '',
-                originalMessage: {
-                    oldMaxExpenseAmountNoReceipt: 2500,
-                    newMaxExpenseAmountNoReceipt: CONST.POLICY.DISABLED_MAX_EXPENSE_AGE,
-                    currency: 'USD',
-                },
-            } as ReportAction;
-            const result = getPolicyChangeLogMaxExpenseAmountNoReceiptMessage(translateLocal, action);
-            expect(result).toBe('removed receipt required amount (previously "$25.00")');
-        });
-
-        it('should return changed message when changing from one value to another', () => {
-            const action = {
-                actionName: CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_MAX_EXPENSE_AMOUNT_NO_RECEIPT,
-                reportActionID: '1',
-                created: '',
-                originalMessage: {
-                    oldMaxExpenseAmountNoReceipt: 2500,
-                    newMaxExpenseAmountNoReceipt: 7500,
-                    currency: 'USD',
-                },
-            } as ReportAction;
-            const result = getPolicyChangeLogMaxExpenseAmountNoReceiptMessage(translateLocal, action);
-            expect(result).toBe('changed receipt required amount to "$75.00" (previously "$25.00")');
-        });
-    });
-
     describe('getCompanyAddressUpdateMessage', () => {
         it('should return "set" message when setting address for first time', () => {
             const action = {
@@ -2555,126 +2391,6 @@ describe('ReportActionsUtils', () => {
         });
     });
 
-    describe('getUpdateACHAccountMessage', () => {
-        it('should return "set" message when setting the default bank account for the first time', () => {
-            // Given an UPDATE_ACH_ACCOUNT action with only new bank account info
-            const action = {
-                actionName: CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_ACH_ACCOUNT,
-                reportActionID: '1',
-                created: '',
-                originalMessage: {
-                    bankAccountName: 'Business Checking',
-                    maskedBankAccountNumber: 'XXXX1234',
-                },
-            } as ReportAction;
-
-            // When getting the update message
-            const result = getUpdateACHAccountMessage(translateLocal, action);
-
-            // Then it should return the correct message
-            expect(result).toBe('set the default business bank account to "Business Checking: XXXX1234"');
-        });
-
-        it('should return "set" message without bank name when bankAccountName is empty', () => {
-            // Given an UPDATE_ACH_ACCOUNT action with only new bank account maskedBankAccountNumber
-            const action = {
-                actionName: CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_ACH_ACCOUNT,
-                reportActionID: '1',
-                created: '',
-                originalMessage: {
-                    bankAccountName: '',
-                    maskedBankAccountNumber: 'XXXX1234',
-                },
-            } as ReportAction;
-
-            // When getting the update message
-            const result = getUpdateACHAccountMessage(translateLocal, action);
-
-            // Then it should return the correct message
-            expect(result).toBe('set the default business bank account to "XXXX1234"');
-        });
-
-        it('should return "removed" message when removing the default bank account', () => {
-            // Given an UPDATE_ACH_ACCOUNT action with only old bank account info
-            const action = {
-                actionName: CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_ACH_ACCOUNT,
-                reportActionID: '1',
-                created: '',
-                originalMessage: {
-                    oldBankAccountName: 'Business Checking',
-                    oldMaskedBankAccountNumber: 'XXXX5678',
-                },
-            } as ReportAction;
-
-            // When getting the update message
-            const result = getUpdateACHAccountMessage(translateLocal, action);
-
-            // Then it should return the correct message
-            expect(result).toBe('removed the default business bank account "Business Checking: XXXX5678"');
-        });
-
-        it('should return "removed" message without bank name when oldBankAccountName is empty', () => {
-            // Given an UPDATE_ACH_ACCOUNT action with only old bank account maskedBankAccountNumber
-            const action = {
-                actionName: CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_ACH_ACCOUNT,
-                reportActionID: '1',
-                created: '',
-                originalMessage: {
-                    oldBankAccountName: '',
-                    oldMaskedBankAccountNumber: 'XXXX5678',
-                },
-            } as ReportAction;
-
-            // When getting the update message
-            const result = getUpdateACHAccountMessage(translateLocal, action);
-
-            // Then it should return the correct message
-            expect(result).toBe('removed the default business bank account "XXXX5678"');
-        });
-
-        it('should return "changed" message when changing from one bank account to another', () => {
-            // Given an UPDATE_ACH_ACCOUNT action with both new and old bank account info
-            const action = {
-                actionName: CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_ACH_ACCOUNT,
-                reportActionID: '1',
-                created: '',
-                originalMessage: {
-                    bankAccountName: 'Savings Account',
-                    maskedBankAccountNumber: 'XXXX5678',
-                    oldBankAccountName: 'Business Checking',
-                    oldMaskedBankAccountNumber: 'XXXX1234',
-                },
-            } as ReportAction;
-
-            // When getting the update message
-            const result = getUpdateACHAccountMessage(translateLocal, action);
-
-            // Then it should return the correct message
-            expect(result).toBe('changed the default business bank account to "Savings Account: XXXX5678" (previously "Business Checking: XXXX1234")');
-        });
-
-        it('should return "changed" message with partial bank names when some names are empty', () => {
-            // Given an UPDATE_ACH_ACCOUNT action where new bank has a name but old bank does not
-            const action = {
-                actionName: CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_ACH_ACCOUNT,
-                reportActionID: '1',
-                created: '',
-                originalMessage: {
-                    bankAccountName: 'Savings Account',
-                    maskedBankAccountNumber: 'XXXX5678',
-                    oldBankAccountName: '',
-                    oldMaskedBankAccountNumber: 'XXXX1234',
-                },
-            } as ReportAction;
-
-            // When getting the update message
-            const result = getUpdateACHAccountMessage(translateLocal, action);
-
-            // Then it should return the correct message
-            expect(result).toBe('changed the default business bank account to "Savings Account: XXXX5678" (previously "XXXX1234")');
-        });
-    });
-
     describe('getWorkspaceCustomUnitRateUpdatedMessage', () => {
         it('should return the correct message when a rate is enabled', () => {
             const action: ReportAction<typeof CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_CUSTOM_UNIT_RATE> = {
@@ -2968,70 +2684,4 @@ describe('ReportActionsUtils', () => {
             expect(actorAccountID).toBe(9999);
         });
     });
-
-    describe('getInvoiceCompanyNameUpdateMessage', () => {
-        it('should return the correct message when changing invoice company name with previous value', () => {
-            const action = {
-                actionName: CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_INVOICE_COMPANY_NAME,
-                reportActionID: '1',
-                created: '',
-                originalMessage: {
-                    newValue: 'New Company Name',
-                    oldValue: 'Old Company Name',
-                },
-                message: [],
-            } as ReportAction;
-
-            const result = getInvoiceCompanyNameUpdateMessage(translateLocal, action);
-            expect(result).toBe('changed the invoice company name to "New Company Name" (previously "Old Company Name")');
-        });
-
-        it('should return the correct message when setting invoice company name without previous value', () => {
-            const action = {
-                actionName: CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_INVOICE_COMPANY_NAME,
-                reportActionID: '1',
-                created: '',
-                originalMessage: {
-                    newValue: 'New Company Name',
-                },
-                message: [],
-            } as ReportAction;
-
-            const result = getInvoiceCompanyNameUpdateMessage(translateLocal, action);
-            expect(result).toBe('set the invoice company name to "New Company Name"');
-        });
-    });
-
-    describe('getInvoiceCompanyWebsiteUpdateMessage', () => {
-        it('should return the correct message when changing invoice company website with previous value', () => {
-            const action = {
-                actionName: CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_INVOICE_COMPANY_WEBSITE,
-                reportActionID: '1',
-                created: '',
-                originalMessage: {
-                    newValue: 'https://newwebsite.com',
-                    oldValue: 'https://oldwebsite.com',
-                },
-                message: [],
-            } as ReportAction;
-
-            const result = getInvoiceCompanyWebsiteUpdateMessage(translateLocal, action);
-            expect(result).toBe('changed the invoice company website to "https://newwebsite.com" (previously "https://oldwebsite.com")');
-        });
-
-        it('should return the correct message when setting invoice company website without previous value', () => {
-            const action = {
-                actionName: CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_INVOICE_COMPANY_WEBSITE,
-                reportActionID: '1',
-                created: '',
-                originalMessage: {
-                    newValue: 'https://newwebsite.com',
-                },
-                message: [],
-            } as ReportAction;
-
-            const result = getInvoiceCompanyWebsiteUpdateMessage(translateLocal, action);
-            expect(result).toBe('set the invoice company website to "https://newwebsite.com"');
-        });
-    });
 });
diff --git a/tests/unit/ReportNameUtilsTest.ts b/tests/unit/ReportNameUtilsTest.ts
index 9b45063e6345..7790b9eb8c03 100644
--- a/tests/unit/ReportNameUtilsTest.ts
+++ b/tests/unit/ReportNameUtilsTest.ts
@@ -1,9 +1,8 @@
 import Onyx from 'react-native-onyx';
-import type {OnyxCollection} from 'react-native-onyx';
 import {translate} from '@libs/Localize';
 import {
     buildReportNameFromParticipantNames,
-    computeReportName as computeReportNameOriginal,
+    computeReportName,
     getGroupChatName,
     getInvoicePayerName,
     getInvoicesChatName,
@@ -13,7 +12,7 @@ import {
 import CONST from '@src/CONST';
 import IntlStore from '@src/languages/IntlStore';
 import ONYXKEYS from '@src/ONYXKEYS';
-import type {PersonalDetailsList, Policy, Report, ReportAction, ReportActions, ReportAttributesDerivedValue, ReportNameValuePairs, Transaction} from '@src/types/onyx';
+import type {PersonalDetailsList, Policy, Report, ReportAction, ReportActions, ReportAttributesDerivedValue, ReportNameValuePairs} from '@src/types/onyx';
 import {createAdminRoom, createPolicyExpenseChat, createRegularChat, createRegularTaskReport, createSelfDM, createWorkspaceThread} from '../utils/collections/reports';
 import {fakePersonalDetails} from '../utils/LHNTestUtils';
 import {formatPhoneNumber} from '../utils/TestHelper';
@@ -21,16 +20,6 @@ import waitForBatchedUpdates from '../utils/waitForBatchedUpdates';
 
 describe('ReportNameUtils', () => {
     const currentUserAccountID = 5;
-    const computeReportName = (
-        report?: Report,
-        reports?: OnyxCollection<Report>,
-        policies?: OnyxCollection<Policy>,
-        transactions?: OnyxCollection<Transaction>,
-        allReportNameValuePairs?: OnyxCollection<ReportNameValuePairs>,
-        personalDetailsList?: PersonalDetailsList,
-        reportActions?: OnyxCollection<ReportActions>,
-        currentUserID = currentUserAccountID,
-    ) => computeReportNameOriginal(report, reports, policies, transactions, allReportNameValuePairs, personalDetailsList, reportActions, currentUserID);
     const participantsPersonalDetails: PersonalDetailsList = [
         {
             accountID: 1,
@@ -93,16 +82,7 @@ describe('ReportNameUtils', () => {
                 ownerAccountID: currentUserAccountID,
             };
 
-            const name = computeReportName(
-                report,
-                emptyCollections.reports,
-                emptyCollections.policies,
-                undefined,
-                undefined,
-                participantsPersonalDetails,
-                emptyCollections.reportActions,
-                currentUserAccountID,
-            );
+            const name = computeReportName(report, emptyCollections.reports, emptyCollections.policies, undefined, undefined, participantsPersonalDetails, emptyCollections.reportActions);
             expect(name).toBe('Ragnar Lothbrok');
         });
 
@@ -112,16 +92,7 @@ describe('ReportNameUtils', () => {
                 ownerAccountID: currentUserAccountID,
             };
 
-            const name = computeReportName(
-                report,
-                emptyCollections.reports,
-                emptyCollections.policies,
-                undefined,
-                undefined,
-                participantsPersonalDetails,
-                emptyCollections.reportActions,
-                currentUserAccountID,
-            );
+            const name = computeReportName(report, emptyCollections.reports, emptyCollections.policies, undefined, undefined, participantsPersonalDetails, emptyCollections.reportActions);
             expect(name).toBe('floki@vikings.net');
         });
 
@@ -131,16 +102,7 @@ describe('ReportNameUtils', () => {
                 ownerAccountID: currentUserAccountID,
             };
 
-            const name = computeReportName(
-                report,
-                emptyCollections.reports,
-                emptyCollections.policies,
-                undefined,
-                undefined,
-                participantsPersonalDetails,
-                emptyCollections.reportActions,
-                currentUserAccountID,
-            );
+            const name = computeReportName(report, emptyCollections.reports, emptyCollections.policies, undefined, undefined, participantsPersonalDetails, emptyCollections.reportActions);
             expect(name).toBe('(833) 240-3627');
         });
 
@@ -152,16 +114,7 @@ describe('ReportNameUtils', () => {
             };
 
             await Onyx.merge(ONYXKEYS.PERSONAL_DETAILS_LIST, participantsPersonalDetails);
-            const name = computeReportName(
-                report,
-                emptyCollections.reports,
-                emptyCollections.policies,
-                undefined,
-                undefined,
-                participantsPersonalDetails,
-                emptyCollections.reportActions,
-                currentUserAccountID,
-            );
+            const name = computeReportName(report, emptyCollections.reports, emptyCollections.policies, undefined, undefined, participantsPersonalDetails, emptyCollections.reportActions);
             expect(name).toBe('Ragnar, floki@vikings.net, Lagertha, (833) 240-3627');
         });
     });
@@ -169,16 +122,7 @@ describe('ReportNameUtils', () => {
     describe('computeReportName - Admin room', () => {
         test('Active admin room', () => {
             const report = createAdminRoom(10);
-            const name = computeReportName(
-                report,
-                emptyCollections.reports,
-                emptyCollections.policies,
-                undefined,
-                undefined,
-                participantsPersonalDetails,
-                emptyCollections.reportActions,
-                currentUserAccountID,
-            );
+            const name = computeReportName(report, emptyCollections.reports, emptyCollections.policies, undefined, undefined, participantsPersonalDetails, emptyCollections.reportActions);
             expect(name).toBe('#admins');
         });
 
@@ -196,7 +140,6 @@ describe('ReportNameUtils', () => {
                 reportNameValuePairs,
                 participantsPersonalDetails,
                 emptyCollections.reportActions,
-                currentUserAccountID,
             );
             expect(nameEn).toBe('#admins (archived)');
 
@@ -209,7 +152,6 @@ describe('ReportNameUtils', () => {
                 reportNameValuePairs,
                 participantsPersonalDetails,
                 emptyCollections.reportActions,
-                currentUserAccountID,
             );
             expect(nameEs).toBe('#admins (archivado)');
 
@@ -225,16 +167,7 @@ describe('ReportNameUtils', () => {
             };
 
             await Onyx.merge(ONYXKEYS.PERSONAL_DETAILS_LIST, participantsPersonalDetails);
-            const name = computeReportName(
-                report,
-                emptyCollections.reports,
-                emptyCollections.policies,
-                undefined,
-                undefined,
-                participantsPersonalDetails,
-                emptyCollections.reportActions,
-                currentUserAccountID,
-            );
+            const name = computeReportName(report, emptyCollections.reports, emptyCollections.policies, undefined, undefined, participantsPersonalDetails, emptyCollections.reportActions);
             expect(name).toBe("Ragnar Lothbrok's expenses");
         });
     });
@@ -247,16 +180,7 @@ describe('ReportNameUtils', () => {
             };
 
             await Onyx.merge(ONYXKEYS.SESSION, {accountID: currentUserAccountID, email: 'lagertha2@vikings.net', authTokenType: CONST.AUTH_TOKEN_TYPES.SUPPORT});
-            const name = computeReportName(
-                report,
-                emptyCollections.reports,
-                emptyCollections.policies,
-                undefined,
-                undefined,
-                participantsPersonalDetails,
-                emptyCollections.reportActions,
-                currentUserAccountID,
-            );
+            const name = computeReportName(report, emptyCollections.reports, emptyCollections.policies, undefined, undefined, participantsPersonalDetails, emptyCollections.reportActions);
             expect(name).toBe('Lagertha Lothbrok (you)');
         });
     });
@@ -269,16 +193,7 @@ describe('ReportNameUtils', () => {
                 reportName: htmlTaskTitle,
             };
 
-            const name = computeReportName(
-                report,
-                emptyCollections.reports,
-                emptyCollections.policies,
-                undefined,
-                undefined,
-                participantsPersonalDetails,
-                emptyCollections.reportActions,
-                currentUserAccountID,
-            );
+            const name = computeReportName(report, emptyCollections.reports, emptyCollections.policies, undefined, undefined, participantsPersonalDetails, emptyCollections.reportActions);
             expect(name).toBe('heading with link');
         });
     });
@@ -311,16 +226,7 @@ describe('ReportNameUtils', () => {
             };
 
             const expected = translate(CONST.LOCALES.EN, 'iou.submitted', {memo: 'via workflow'});
-            const name = computeReportName(
-                thread,
-                emptyCollections.reports,
-                emptyCollections.policies,
-                undefined,
-                undefined,
-                participantsPersonalDetails,
-                reportActionsCollection,
-                currentUserAccountID,
-            );
+            const name = computeReportName(thread, emptyCollections.reports, emptyCollections.policies, undefined, undefined, participantsPersonalDetails, reportActionsCollection);
             expect(name).toBe(expected);
         });
 
@@ -348,16 +254,7 @@ describe('ReportNameUtils', () => {
             };
 
             const expected = translate(CONST.LOCALES.EN, 'iou.rejectedThisReport');
-            const name = computeReportName(
-                thread,
-                emptyCollections.reports,
-                emptyCollections.policies,
-                undefined,
-                undefined,
-                participantsPersonalDetails,
-                reportActionsCollection,
-                currentUserAccountID,
-            );
+            const name = computeReportName(thread, emptyCollections.reports, emptyCollections.policies, undefined, undefined, participantsPersonalDetails, reportActionsCollection);
             expect(name).toBe(expected);
         });
     });
@@ -426,7 +323,6 @@ describe('ReportNameUtils', () => {
                 reportNameValuePairs,
                 participantsPersonalDetails,
                 emptyCollections.reportActions,
-                currentUserAccountID,
             );
             expect(name).toBe('Ragnar Lothbrok (archived) ');
         });
@@ -438,7 +334,7 @@ describe('ReportNameUtils', () => {
                 ...createRegularChat(1000, [currentUserAccountID, 1, 2]),
             };
 
-            const name = buildReportNameFromParticipantNames({report, personalDetailsList: participantsPersonalDetails, currentUserAccountID});
+            const name = buildReportNameFromParticipantNames({report, personalDetailsList: participantsPersonalDetails});
             expect(name).toBe('Ragnar, floki@vikings.net');
         });
 
@@ -447,7 +343,7 @@ describe('ReportNameUtils', () => {
                 ...createRegularChat(1001, [currentUserAccountID, 1]),
             };
 
-            const name = buildReportNameFromParticipantNames({report, personalDetailsList: participantsPersonalDetails, currentUserAccountID});
+            const name = buildReportNameFromParticipantNames({report, personalDetailsList: participantsPersonalDetails});
             expect(name).toBe('Ragnar Lothbrok');
         });
     });
@@ -465,7 +361,6 @@ describe('ReportNameUtils', () => {
                 report,
                 receiverPolicy,
                 personalDetails: participantsPersonalDetails,
-                currentUserAccountID,
             });
 
             expect(name).toBe('Personal Workspace');
@@ -483,7 +378,6 @@ describe('ReportNameUtils', () => {
                 report,
                 receiverPolicy,
                 personalDetails: participantsPersonalDetails,
-                currentUserAccountID,
             });
 
             const normalizedName = name?.replaceAll('\u00A0', ' ');
diff --git a/tests/unit/ReportSecondaryActionUtilsTest.ts b/tests/unit/ReportSecondaryActionUtilsTest.ts
index 327066c8d7f9..6be0b2325559 100644
--- a/tests/unit/ReportSecondaryActionUtilsTest.ts
+++ b/tests/unit/ReportSecondaryActionUtilsTest.ts
@@ -1451,7 +1451,7 @@ describe('getSecondaryAction', () => {
 
         await Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT}${REPORT_ID}`, report);
 
-        const result = getSecondaryTransactionThreadActions(EMPLOYEE_EMAIL, EMPLOYEE_ACCOUNT_ID, report, {} as Transaction, undefined, {} as Transaction, policy);
+        const result = getSecondaryTransactionThreadActions(EMPLOYEE_EMAIL, report, {} as Transaction, undefined, {} as Transaction, policy);
 
         expect(result.includes(CONST.REPORT.SECONDARY_ACTIONS.DELETE)).toBe(true);
     });
@@ -2441,7 +2441,7 @@ describe('getSecondaryTransactionThreadActions', () => {
         const policy = {} as unknown as Policy;
 
         const result = [CONST.REPORT.TRANSACTION_SECONDARY_ACTIONS.VIEW_DETAILS];
-        expect(getSecondaryTransactionThreadActions(EMPLOYEE_EMAIL, EMPLOYEE_ACCOUNT_ID, report, {} as Transaction, undefined, {} as Transaction, policy)).toEqual(result);
+        expect(getSecondaryTransactionThreadActions(EMPLOYEE_EMAIL, report, {} as Transaction, undefined, {} as Transaction, policy)).toEqual(result);
     });
 
     it('includes HOLD option', () => {
@@ -2460,7 +2460,7 @@ describe('getSecondaryTransactionThreadActions', () => {
         const policy = {} as unknown as Policy;
 
         jest.spyOn(ReportUtils, 'canHoldUnholdReportAction').mockReturnValueOnce({canHoldRequest: true, canUnholdRequest: true});
-        const result = getSecondaryTransactionThreadActions(EMPLOYEE_EMAIL, EMPLOYEE_ACCOUNT_ID, report, transaction, actionR14932, {} as Transaction, policy);
+        const result = getSecondaryTransactionThreadActions(EMPLOYEE_EMAIL, report, transaction, actionR14932, {} as Transaction, policy);
         expect(result.includes(CONST.REPORT.SECONDARY_ACTIONS.HOLD)).toBe(true);
     });
 
@@ -2477,12 +2477,12 @@ describe('getSecondaryTransactionThreadActions', () => {
         } as unknown as Transaction;
 
         jest.spyOn(ReportUtils, 'isHoldCreator').mockReturnValue(false);
-        const result = getSecondaryTransactionThreadActions(EMPLOYEE_EMAIL, EMPLOYEE_ACCOUNT_ID, report, transaction, undefined, {} as Transaction, policy, transactionThreadReport);
+        const result = getSecondaryTransactionThreadActions(EMPLOYEE_EMAIL, report, transaction, undefined, {} as Transaction, policy, transactionThreadReport);
         expect(result).toContain(CONST.REPORT.SECONDARY_ACTIONS.REMOVE_HOLD);
 
         // Do not show if admin is the holder
         jest.spyOn(ReportUtils, 'isHoldCreator').mockReturnValue(true);
-        const result2 = getSecondaryTransactionThreadActions(EMPLOYEE_EMAIL, EMPLOYEE_ACCOUNT_ID, report, transaction, undefined, {} as Transaction, policy, transactionThreadReport);
+        const result2 = getSecondaryTransactionThreadActions(EMPLOYEE_EMAIL, report, transaction, undefined, {} as Transaction, policy, transactionThreadReport);
         expect(result2).not.toContain(CONST.REPORT.SECONDARY_ACTIONS.REMOVE_HOLD);
     });
 
@@ -2499,7 +2499,7 @@ describe('getSecondaryTransactionThreadActions', () => {
 
         await Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT}${REPORT_ID}`, report);
 
-        const result = getSecondaryTransactionThreadActions(EMPLOYEE_EMAIL, EMPLOYEE_ACCOUNT_ID, report, {} as Transaction, undefined, {} as Transaction, policy);
+        const result = getSecondaryTransactionThreadActions(EMPLOYEE_EMAIL, report, {} as Transaction, undefined, {} as Transaction, policy);
         expect(result.includes(CONST.REPORT.SECONDARY_ACTIONS.DELETE)).toBe(true);
     });
 
@@ -2587,7 +2587,7 @@ describe('getSecondaryTransactionThreadActions', () => {
         await Onyx.merge(`${ONYXKEYS.COLLECTION.POLICY}${POLICY_ID}`, policy);
         await Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT}${REPORT_ID}`, report);
 
-        const result = getSecondaryTransactionThreadActions(EMPLOYEE_EMAIL, EMPLOYEE_ACCOUNT_ID, report, transaction, actionR14932, {} as Transaction, policy);
+        const result = getSecondaryTransactionThreadActions(EMPLOYEE_EMAIL, report, transaction, actionR14932, {} as Transaction, policy);
         expect(result.includes(CONST.REPORT.SECONDARY_ACTIONS.SPLIT)).toBe(true);
     });
 
@@ -2623,7 +2623,7 @@ describe('getSecondaryTransactionThreadActions', () => {
         await Onyx.merge(`${ONYXKEYS.COLLECTION.POLICY}${POLICY_ID}`, policy);
         await Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT}${REPORT_ID}`, report);
 
-        const result = getSecondaryTransactionThreadActions(EMPLOYEE_EMAIL, EMPLOYEE_ACCOUNT_ID, report, transaction, actionR14932, {} as Transaction, policy);
+        const result = getSecondaryTransactionThreadActions(EMPLOYEE_EMAIL, report, transaction, actionR14932, {} as Transaction, policy);
         expect(result.includes(CONST.REPORT.SECONDARY_ACTIONS.SPLIT)).toBe(false);
     });
 
@@ -2660,7 +2660,7 @@ describe('getSecondaryTransactionThreadActions', () => {
         await Onyx.merge(`${ONYXKEYS.COLLECTION.POLICY}${POLICY_ID}`, policy);
         await Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT}${REPORT_ID}`, report);
 
-        const result = getSecondaryTransactionThreadActions(EMPLOYEE_EMAIL, EMPLOYEE_ACCOUNT_ID, report, transaction, actionR14932, {} as Transaction, policy);
+        const result = getSecondaryTransactionThreadActions(EMPLOYEE_EMAIL, report, transaction, actionR14932, {} as Transaction, policy);
         expect(result.includes(CONST.REPORT.SECONDARY_ACTIONS.SPLIT)).toBe(false);
     });
 
diff --git a/tests/unit/ReportUtilsTest.ts b/tests/unit/ReportUtilsTest.ts
index d14f7b271b10..b14f5486bf31 100644
--- a/tests/unit/ReportUtilsTest.ts
+++ b/tests/unit/ReportUtilsTest.ts
@@ -25,7 +25,7 @@ import Navigation from '@libs/Navigation/Navigation';
 // eslint-disable-next-line no-restricted-syntax
 import * as PolicyUtils from '@libs/PolicyUtils';
 import {getOriginalMessage, getReportAction, isWhisperAction} from '@libs/ReportActionsUtils';
-import {buildReportNameFromParticipantNames, computeReportName as computeReportNameOriginal, getGroupChatName, getPolicyExpenseChatName, getReportName} from '@libs/ReportNameUtils';
+import {buildReportNameFromParticipantNames, computeReportName, getGroupChatName, getPolicyExpenseChatName, getReportName} from '@libs/ReportNameUtils';
 import type {OptionData} from '@libs/ReportUtils';
 import {
     buildOptimisticChatReport,
@@ -54,7 +54,6 @@ import {
     canSeeDefaultRoom,
     canUserPerformWriteAction,
     createDraftTransactionAndNavigateToParticipantSelector,
-    doesReportBelongToWorkspace,
     excludeParticipantsForDisplay,
     findLastAccessedReport,
     getAllReportActionsErrorsAndReportActionThatRequiresAttention,
@@ -66,7 +65,6 @@ import {
     getDisplayNameForParticipant,
     getDisplayNamesWithTooltips,
     getHarvestOriginalReportID,
-    getHelpPaneReportType,
     getIconsForParticipants,
     getIndicatedMissingPaymentMethod,
     getIOUReportActionDisplayMessage,
@@ -220,16 +218,6 @@ const mockedPolicyUtils = PolicyUtils as jest.Mocked<typeof PolicyUtils>;
 const testDate = DateUtils.getDBTime();
 const currentUserEmail = 'bjorn@vikings.net';
 const currentUserAccountID = 5;
-const computeReportName = (
-    report?: Report,
-    reports?: OnyxCollection<Report>,
-    policies?: OnyxCollection<Policy>,
-    transactions?: OnyxCollection<Transaction>,
-    allReportNameValuePairs?: OnyxCollection<ReportNameValuePairs>,
-    personalDetailsList?: PersonalDetailsList,
-    reportActions?: OnyxCollection<ReportActions>,
-    currentUserID = currentUserAccountID,
-) => computeReportNameOriginal(report, reports, policies, transactions, allReportNameValuePairs, personalDetailsList, reportActions, currentUserID);
 const participantsPersonalDetails: PersonalDetailsList = {
     '1': {
         accountID: 1,
@@ -2174,7 +2162,9 @@ describe('ReportUtils', () => {
                     };
                     const reportName = computeReportName(threadReport, undefined, undefined, undefined, undefined, participantsPersonalDetails, reportActions);
 
-                    expect(reportName).toBe(`there was a problem syncing with QuickBooks ("Sync failed"). Please fix the issue in workspace settings.`);
+                    expect(reportName).toBe(
+                        `there was a problem syncing with QuickBooks ("Sync failed"). Please fix the issue in <a href="https://dev.new.expensify.com:8082/workspaces/1/accounting">workspace settings</a>.`,
+                    );
                 });
 
                 test('should handle concierge company card connection broken action', () => {
@@ -5857,26 +5847,26 @@ describe('ReportUtils', () => {
 
         it('excludes the current user from the report title', () => {
             const {report, personalDetails: testPersonalDetails} = generateFakeReportAndParticipantsPersonalDetails({count: currentUserAccountID + 2});
-            const result = buildReportNameFromParticipantNames({report, personalDetailsList: testPersonalDetails, currentUserAccountID});
+            const result = buildReportNameFromParticipantNames({report, personalDetailsList: testPersonalDetails});
             expect(result).not.toContain('CURRENT');
         });
 
         it('limits to a maximum of 5 participants in the title', () => {
             const {report, personalDetails: testPersonalDetails} = generateFakeReportAndParticipantsPersonalDetails({count: 10});
-            const result = buildReportNameFromParticipantNames({report, personalDetailsList: testPersonalDetails, currentUserAccountID});
+            const result = buildReportNameFromParticipantNames({report, personalDetailsList: testPersonalDetails});
             expect(result.split(',').length).toBeLessThanOrEqual(5);
         });
 
         it('returns full name if only one participant is present (excluding current user)', () => {
             const {report, personalDetails: testPersonalDetails} = generateFakeReportAndParticipantsPersonalDetails({count: 1});
-            const result = buildReportNameFromParticipantNames({report, personalDetailsList: testPersonalDetails, currentUserAccountID});
+            const result = buildReportNameFromParticipantNames({report, personalDetailsList: testPersonalDetails});
             const {displayName} = fakePersonalDetails[1] ?? {};
             expect(result).toEqual(displayName);
         });
 
         it('returns an empty string if there are no participants or all are excluded', () => {
             const {report, personalDetails: testPersonalDetails} = generateFakeReportAndParticipantsPersonalDetails({start: currentUserAccountID - 1, count: 1});
-            const result = buildReportNameFromParticipantNames({report, personalDetailsList: testPersonalDetails, currentUserAccountID});
+            const result = buildReportNameFromParticipantNames({report, personalDetailsList: testPersonalDetails});
             expect(result).toEqual('');
         });
 
@@ -5887,7 +5877,7 @@ describe('ReportUtils', () => {
             const fourthUser = fakePersonalDetails[4];
 
             const incompleteDetails = {2: secondUser, 4: fourthUser};
-            const result = buildReportNameFromParticipantNames({report, personalDetailsList: incompleteDetails, currentUserAccountID});
+            const result = buildReportNameFromParticipantNames({report, personalDetailsList: incompleteDetails});
             const expectedNames = [secondUser?.firstName, fourthUser?.firstName].sort();
             const resultNames = result.split(', ').sort();
             expect(resultNames).toEqual(expect.arrayContaining(expectedNames));
@@ -8099,8 +8089,7 @@ describe('ReportUtils', () => {
             const transaction: Transaction = {
                 ...createRandomTransaction(Number(transactionID)),
                 reportID: parentReport.reportID,
-                created: '',
-                modifiedCreated: '',
+                amount: 0,
             };
             await Onyx.merge(`${ONYXKEYS.COLLECTION.TRANSACTION}${transaction.transactionID}`, transaction);
             await waitForBatchedUpdates();
@@ -8125,8 +8114,7 @@ describe('ReportUtils', () => {
             const transaction: Transaction = {
                 ...createRandomTransaction(12345),
                 reportID: parentReport.reportID,
-                created: '',
-                modifiedCreated: '',
+                amount: 0,
             };
             await Onyx.merge(`${ONYXKEYS.COLLECTION.TRANSACTION}${transaction.transactionID}`, transaction);
             await waitForBatchedUpdates();
@@ -11073,224 +11061,6 @@ describe('ReportUtils', () => {
         });
     });
 
-    describe('doesReportBelongToWorkspace', () => {
-        const policyID = 'test-policy-123';
-        const conciergeReportID = 'concierge-report-456';
-
-        beforeEach(async () => {
-            await Onyx.clear();
-            await waitForBatchedUpdates();
-        });
-
-        it('should return true for concierge chat report when conciergeReportID matches', () => {
-            const conciergeReport: Report = {
-                reportID: conciergeReportID,
-                type: CONST.REPORT.TYPE.CHAT,
-            };
-
-            const result = doesReportBelongToWorkspace(conciergeReport, [], policyID, conciergeReportID);
-            expect(result).toBe(true);
-        });
-
-        it('should return false for concierge chat report when conciergeReportID does not match', () => {
-            const conciergeReport: Report = {
-                reportID: 'different-report-id',
-                type: CONST.REPORT.TYPE.CHAT,
-                policyID: CONST.POLICY.ID_FAKE,
-            };
-
-            const result = doesReportBelongToWorkspace(conciergeReport, [], policyID, conciergeReportID);
-            expect(result).toBe(false);
-        });
-
-        it('should return true for policy related report with matching policyID', () => {
-            const policyReport: Report = {
-                reportID: 'policy-report-123',
-                type: CONST.REPORT.TYPE.CHAT,
-                policyID,
-            };
-
-            const result = doesReportBelongToWorkspace(policyReport, [], policyID, conciergeReportID);
-            expect(result).toBe(true);
-        });
-
-        it('should return true for DM report with participant in workspace', () => {
-            const dmReport: Report = {
-                reportID: 'dm-report-123',
-                type: CONST.REPORT.TYPE.CHAT,
-                policyID: CONST.POLICY.ID_FAKE,
-                participants: {
-                    1: {notificationPreference: CONST.REPORT.NOTIFICATION_PREFERENCE.ALWAYS},
-                    2: {notificationPreference: CONST.REPORT.NOTIFICATION_PREFERENCE.ALWAYS},
-                },
-            };
-            const policyMemberAccountIDs = [1, 2];
-
-            const result = doesReportBelongToWorkspace(dmReport, policyMemberAccountIDs, policyID, conciergeReportID);
-            expect(result).toBe(true);
-        });
-
-        it('should return false for DM report with no participants in workspace', () => {
-            const dmReport: Report = {
-                reportID: 'dm-report-123',
-                type: CONST.REPORT.TYPE.CHAT,
-                policyID: CONST.POLICY.ID_FAKE,
-                participants: {
-                    3: {notificationPreference: CONST.REPORT.NOTIFICATION_PREFERENCE.ALWAYS},
-                    4: {notificationPreference: CONST.REPORT.NOTIFICATION_PREFERENCE.ALWAYS},
-                },
-            };
-            const policyMemberAccountIDs = [1, 2];
-
-            const result = doesReportBelongToWorkspace(dmReport, policyMemberAccountIDs, policyID, conciergeReportID);
-            expect(result).toBe(false);
-        });
-
-        it('should return false for report with no policyID and no matching participants', () => {
-            const report: Report = {
-                reportID: 'report-123',
-                type: CONST.REPORT.TYPE.CHAT,
-                participants: {
-                    5: {notificationPreference: CONST.REPORT.NOTIFICATION_PREFERENCE.ALWAYS},
-                },
-            };
-
-            const result = doesReportBelongToWorkspace(report, [1, 2], policyID, conciergeReportID);
-            expect(result).toBe(false);
-        });
-
-        it('should return false for invoice report with different policyID in invoiceReceiver', () => {
-            const invoiceReport: Report = {
-                reportID: 'invoice-report-123',
-                type: CONST.REPORT.TYPE.INVOICE,
-                policyID: 'different-policy',
-                invoiceReceiver: {
-                    policyID: 'another-different-policy',
-                    type: CONST.REPORT.INVOICE_RECEIVER_TYPE.BUSINESS,
-                },
-            };
-
-            const result = doesReportBelongToWorkspace(invoiceReport, [], policyID, conciergeReportID);
-            expect(result).toBe(false);
-        });
-
-        it('should return true for invoice report with matching policyID in invoiceReceiver', () => {
-            const invoiceReport: Report = {
-                reportID: 'invoice-report-123',
-                type: CONST.REPORT.TYPE.INVOICE,
-                policyID: 'different-policy',
-                invoiceReceiver: {
-                    policyID,
-                    type: CONST.REPORT.INVOICE_RECEIVER_TYPE.BUSINESS,
-                },
-            };
-
-            const result = doesReportBelongToWorkspace(invoiceReport, [], policyID, conciergeReportID);
-            expect(result).toBe(true);
-        });
-    });
-
-    describe('getHelpPaneReportType', () => {
-        const conciergeReportID = 'concierge-report-456';
-
-        it('should return undefined for undefined report', () => {
-            const result = getHelpPaneReportType(undefined, conciergeReportID);
-            expect(result).toBeUndefined();
-        });
-
-        it('should return CHAT_CONCIERGE for concierge chat report', () => {
-            const conciergeReport: Report = {
-                reportID: conciergeReportID,
-                type: CONST.REPORT.TYPE.CHAT,
-            };
-
-            const result = getHelpPaneReportType(conciergeReport, conciergeReportID);
-            expect(result).toBe(CONST.REPORT.HELP_TYPE.CHAT_CONCIERGE);
-        });
-
-        it('should return chatType for report with chatType', () => {
-            const groupChatReport: Report = {
-                reportID: 'group-chat-123',
-                type: CONST.REPORT.TYPE.CHAT,
-                chatType: CONST.REPORT.CHAT_TYPE.GROUP,
-            };
-
-            const result = getHelpPaneReportType(groupChatReport, conciergeReportID);
-            expect(result).toBe(CONST.REPORT.CHAT_TYPE.GROUP);
-        });
-
-        it('should return EXPENSE_REPORT for expense report type', () => {
-            const expenseReport: Report = {
-                reportID: 'expense-report-123',
-                type: CONST.REPORT.TYPE.EXPENSE,
-            };
-
-            const result = getHelpPaneReportType(expenseReport, conciergeReportID);
-            expect(result).toBe(CONST.REPORT.HELP_TYPE.EXPENSE_REPORT);
-        });
-
-        it('should return CHAT for chat report type without chatType', () => {
-            const chatReport: Report = {
-                reportID: 'chat-report-123',
-                type: CONST.REPORT.TYPE.CHAT,
-            };
-
-            const result = getHelpPaneReportType(chatReport, conciergeReportID);
-            expect(result).toBe(CONST.REPORT.HELP_TYPE.CHAT);
-        });
-
-        it('should return IOU for IOU report type', () => {
-            const iouReport: Report = {
-                reportID: 'iou-report-123',
-                type: CONST.REPORT.TYPE.IOU,
-            };
-
-            const result = getHelpPaneReportType(iouReport, conciergeReportID);
-            expect(result).toBe(CONST.REPORT.HELP_TYPE.IOU);
-        });
-
-        it('should return INVOICE for invoice report type', () => {
-            const invoiceReport: Report = {
-                reportID: 'invoice-report-123',
-                type: CONST.REPORT.TYPE.INVOICE,
-            };
-
-            const result = getHelpPaneReportType(invoiceReport, conciergeReportID);
-            expect(result).toBe(CONST.REPORT.HELP_TYPE.INVOICE);
-        });
-
-        it('should return TASK for task report type', () => {
-            const taskReport: Report = {
-                reportID: 'task-report-123',
-                type: CONST.REPORT.TYPE.TASK,
-            };
-
-            const result = getHelpPaneReportType(taskReport, conciergeReportID);
-            expect(result).toBe(CONST.REPORT.HELP_TYPE.TASK);
-        });
-
-        it('should return undefined for unknown report type', () => {
-            const unknownReport: Report = {
-                reportID: 'unknown-report-123',
-                type: 'unknown' as Report['type'],
-            };
-
-            const result = getHelpPaneReportType(unknownReport, conciergeReportID);
-            expect(result).toBeUndefined();
-        });
-
-        it('should not return CHAT_CONCIERGE when conciergeReportID does not match', () => {
-            const chatReport: Report = {
-                reportID: 'regular-chat-123',
-                type: CONST.REPORT.TYPE.CHAT,
-            };
-
-            const result = getHelpPaneReportType(chatReport, conciergeReportID);
-            // This report has type CHAT but is not the concierge report
-            expect(result).toBe(CONST.REPORT.HELP_TYPE.CHAT);
-        });
-    });
-
     describe('createDraftTransactionAndNavigateToParticipantSelector', () => {
         describe('when action is CATEGORIZE', () => {
             beforeEach(async () => {
@@ -11314,7 +11084,7 @@ describe('ReportUtils', () => {
                 await Onyx.merge(ONYXKEYS.NVP_PRIVATE_OWNER_BILLING_GRACE_PERIOD_END, Math.floor(Date.now() / 1000) - 3600);
 
                 // When we call createDraftTransactionAndNavigateToParticipantSelector with the restricted policy
-                createDraftTransactionAndNavigateToParticipantSelector(transaction.transactionID, '1', CONST.IOU.ACTION.CATEGORIZE, '1', undefined, undefined, activePolicy);
+                createDraftTransactionAndNavigateToParticipantSelector(transaction.transactionID, '1', CONST.IOU.ACTION.CATEGORIZE, '1', undefined, activePolicy);
 
                 // Then it should navigate to the restricted action page
                 expect(Navigation.navigate).toHaveBeenCalledWith(ROUTES.RESTRICTED_ACTION.getRoute(activePolicy.id));
@@ -11342,7 +11112,7 @@ describe('ReportUtils', () => {
                 await Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT}${policyExpenseReport.reportID}`, policyExpenseReport);
 
                 // When we call createDraftTransactionAndNavigateToParticipantSelector
-                createDraftTransactionAndNavigateToParticipantSelector(transaction.transactionID, '1', CONST.IOU.ACTION.CATEGORIZE, '1', undefined, undefined, activePolicy);
+                createDraftTransactionAndNavigateToParticipantSelector(transaction.transactionID, '1', CONST.IOU.ACTION.CATEGORIZE, '1', undefined, activePolicy);
 
                 // Then it should navigate to the category step
                 expect(Navigation.navigate).toHaveBeenCalledWith(
@@ -11372,7 +11142,7 @@ describe('ReportUtils', () => {
                 await Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT}${policyExpenseReport.reportID}`, policyExpenseReport);
 
                 // When we call createDraftTransactionAndNavigateToParticipantSelector with undefined activePolicy
-                createDraftTransactionAndNavigateToParticipantSelector(transaction.transactionID, '2', CONST.IOU.ACTION.CATEGORIZE, '2', undefined, undefined, undefined);
+                createDraftTransactionAndNavigateToParticipantSelector(transaction.transactionID, '2', CONST.IOU.ACTION.CATEGORIZE, '2', undefined, undefined);
 
                 // Then it should automatically pick the available policy and navigate to the category step
                 expect(Navigation.navigate).toHaveBeenCalledWith(
@@ -11389,7 +11159,7 @@ describe('ReportUtils', () => {
                 await Onyx.setCollection(ONYXKEYS.COLLECTION.POLICY, {});
 
                 // When we call createDraftTransactionAndNavigateToParticipantSelector with undefined activePolicy
-                createDraftTransactionAndNavigateToParticipantSelector(transaction.transactionID, '1', CONST.IOU.ACTION.CATEGORIZE, '1', undefined, undefined, undefined);
+                createDraftTransactionAndNavigateToParticipantSelector(transaction.transactionID, '1', CONST.IOU.ACTION.CATEGORIZE, '1', undefined, undefined);
 
                 // Then it should navigate to the upgrade page because no policies were found to categorize with
                 expect(Navigation.navigate).toHaveBeenCalledWith(
@@ -11427,7 +11197,7 @@ describe('ReportUtils', () => {
                 await Onyx.merge(`${ONYXKEYS.COLLECTION.POLICY}${policy2.id}`, policy2);
 
                 // When we call createDraftTransactionAndNavigateToParticipantSelector with undefined activePolicy
-                createDraftTransactionAndNavigateToParticipantSelector(transaction.transactionID, '1', CONST.IOU.ACTION.CATEGORIZE, '1', undefined, undefined, undefined);
+                createDraftTransactionAndNavigateToParticipantSelector(transaction.transactionID, '1', CONST.IOU.ACTION.CATEGORIZE, '1', undefined, undefined);
 
                 // Then it should navigate to the upgrade page because it's ambiguous which policy to use
                 expect(Navigation.navigate).toHaveBeenCalledWith(
@@ -11461,7 +11231,7 @@ describe('ReportUtils', () => {
                 await Onyx.merge(`${ONYXKEYS.COLLECTION.POLICY}${activePolicy.id}`, activePolicy);
 
                 // When we call createDraftTransactionAndNavigateToParticipantSelector
-                createDraftTransactionAndNavigateToParticipantSelector(transaction.transactionID, '1', CONST.IOU.ACTION.CATEGORIZE, '1', undefined, undefined, activePolicy);
+                createDraftTransactionAndNavigateToParticipantSelector(transaction.transactionID, '1', CONST.IOU.ACTION.CATEGORIZE, '1', undefined, activePolicy);
 
                 // Then it should log a warning and not navigate
                 expect(logWarnSpy).toHaveBeenCalledWith('policyExpenseReportID is not valid during expense categorizing');
diff --git a/tests/unit/Search/SearchUIUtilsTest.ts b/tests/unit/Search/SearchUIUtilsTest.ts
index dd885cd8b4ef..7d9d0a74caa6 100644
--- a/tests/unit/Search/SearchUIUtilsTest.ts
+++ b/tests/unit/Search/SearchUIUtilsTest.ts
@@ -25,6 +25,7 @@ import {setOptimisticDataForTransactionThreadPreview} from '@userActions/Search'
 import CONST from '@src/CONST';
 import IntlStore from '@src/languages/IntlStore';
 import type {CardFeedForDisplay} from '@src/libs/CardFeedUtils';
+import * as SearchQueryUtils from '@src/libs/SearchQueryUtils';
 import * as SearchUIUtils from '@src/libs/SearchUIUtils';
 import ONYXKEYS from '@src/ONYXKEYS';
 import ROUTES from '@src/ROUTES';
@@ -38,7 +39,6 @@ import waitForBatchedUpdates from '../../utils/waitForBatchedUpdates';
 jest.mock('@src/components/ConfirmedRoute.tsx');
 jest.mock('@src/libs/Navigation/Navigation', () => ({
     navigate: jest.fn(),
-    setNavigationActionToMicrotaskQueue: jest.fn((cb: () => void) => cb()),
 }));
 jest.mock('@userActions/Report', () => ({
     ...jest.requireActual<typeof ReportUserActions>('@userActions/Report'),
@@ -48,6 +48,10 @@ jest.mock('@userActions/Search', () => ({
     ...jest.requireActual<typeof SearchUtils>('@userActions/Search'),
     setOptimisticDataForTransactionThreadPreview: jest.fn(),
 }));
+jest.mock('@src/libs/SearchQueryUtils', () => ({
+    ...jest.requireActual<typeof SearchQueryUtils>('@src/libs/SearchQueryUtils'),
+    getCurrentSearchQueryJSON: jest.fn(),
+}));
 
 const adminAccountID = 18439984;
 const adminEmail = 'admin@policy.com';
@@ -399,7 +403,7 @@ const searchResults: OnyxTypes.SearchResults = {
             currency: 'USD',
             hasEReceipt: false,
             merchant: 'Expense',
-            modifiedAmount: '',
+            modifiedAmount: 0,
             modifiedCreated: '',
             modifiedCurrency: '',
             modifiedMerchant: 'Expense',
@@ -428,7 +432,7 @@ const searchResults: OnyxTypes.SearchResults = {
             currency: 'USD',
             hasEReceipt: false,
             merchant: 'Expense',
-            modifiedAmount: '',
+            modifiedAmount: 0,
             modifiedCreated: '',
             modifiedCurrency: '',
             modifiedMerchant: 'Expense',
@@ -458,7 +462,7 @@ const searchResults: OnyxTypes.SearchResults = {
             currency: 'VND',
             hasEReceipt: false,
             merchant: '(none)',
-            modifiedAmount: '',
+            modifiedAmount: 0,
             modifiedCreated: '',
             modifiedCurrency: '',
             modifiedMerchant: '',
@@ -487,7 +491,7 @@ const searchResults: OnyxTypes.SearchResults = {
             currency: 'VND',
             hasEReceipt: false,
             merchant: '(none)',
-            modifiedAmount: '',
+            modifiedAmount: 0,
             modifiedCreated: '',
             modifiedCurrency: '',
             modifiedMerchant: '',
@@ -774,7 +778,7 @@ const transactionsListItems = [
         currency: 'USD',
         date: '2024-12-21',
         formattedFrom: 'Admin',
-        formattedMerchant: '',
+        formattedMerchant: 'Expense',
         formattedTo: '',
         formattedTotal: 5000,
         from: {
@@ -786,14 +790,14 @@ const transactionsListItems = [
         hasEReceipt: false,
         keyForList: '1',
         merchant: 'Expense',
-        modifiedAmount: '',
+        modifiedAmount: 0,
         modifiedCreated: '',
         modifiedCurrency: '',
         modifiedMerchant: 'Expense',
         parentTransactionID: '',
         pendingAction: CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE,
         reportID: '123456789',
-        shouldShowMerchant: false,
+        shouldShowMerchant: true,
         shouldShowYear: true,
         shouldShowYearSubmitted: true,
         shouldShowYearApproved: false,
@@ -833,7 +837,7 @@ const transactionsListItems = [
         currency: 'USD',
         date: '2024-12-21',
         formattedFrom: 'Admin',
-        formattedMerchant: '',
+        formattedMerchant: 'Expense',
         formattedTo: 'Admin',
         formattedTotal: 5000,
         from: {
@@ -845,13 +849,13 @@ const transactionsListItems = [
         hasEReceipt: false,
         keyForList: '2',
         merchant: 'Expense',
-        modifiedAmount: '',
+        modifiedAmount: 0,
         modifiedCreated: '',
         modifiedCurrency: '',
         modifiedMerchant: 'Expense',
         parentTransactionID: '',
         reportID: '11111',
-        shouldShowMerchant: false,
+        shouldShowMerchant: true,
         shouldShowYear: true,
         shouldShowYearSubmitted: true,
         shouldShowYearApproved: false,
@@ -902,7 +906,7 @@ const transactionsListItems = [
         currency: 'VND',
         hasEReceipt: false,
         merchant: '(none)',
-        modifiedAmount: '',
+        modifiedAmount: 0,
         modifiedCreated: '',
         modifiedCurrency: '',
         modifiedMerchant: '',
@@ -927,7 +931,7 @@ const transactionsListItems = [
         formattedTotal: 1200,
         formattedMerchant: '',
         date: '2025-03-05',
-        shouldShowMerchant: false,
+        shouldShowMerchant: true,
         shouldShowYear: true,
         shouldShowYearSubmitted: true,
         shouldShowYearApproved: false,
@@ -966,7 +970,7 @@ const transactionsListItems = [
         currency: 'VND',
         hasEReceipt: false,
         merchant: '(none)',
-        modifiedAmount: '',
+        modifiedAmount: 0,
         modifiedCreated: '',
         modifiedCurrency: '',
         modifiedMerchant: '',
@@ -991,7 +995,7 @@ const transactionsListItems = [
         formattedTotal: 3200,
         formattedMerchant: '',
         date: '2025-03-05',
-        shouldShowMerchant: false,
+        shouldShowMerchant: true,
         shouldShowYear: true,
         shouldShowYearSubmitted: true,
         shouldShowYearApproved: false,
@@ -1068,7 +1072,7 @@ const transactionReportGroupListItems = [
                 date: '2024-12-21',
                 exported: '',
                 formattedFrom: 'Admin',
-                formattedMerchant: '',
+                formattedMerchant: 'Expense',
                 formattedTo: '',
                 formattedTotal: 5000,
                 from: {
@@ -1080,14 +1084,14 @@ const transactionReportGroupListItems = [
                 hasEReceipt: false,
                 keyForList: '1',
                 merchant: 'Expense',
-                modifiedAmount: '',
+                modifiedAmount: 0,
                 modifiedCreated: '',
                 modifiedCurrency: '',
                 modifiedMerchant: 'Expense',
                 parentTransactionID: '',
                 pendingAction: CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE,
                 reportID: '123456789',
-                shouldShowMerchant: false,
+                shouldShowMerchant: true,
                 shouldShowYear: true,
                 shouldShowYearSubmitted: true,
                 shouldShowYearApproved: false,
@@ -1173,7 +1177,7 @@ const transactionReportGroupListItems = [
                 currency: 'USD',
                 date: '2024-12-21',
                 formattedFrom: 'Admin',
-                formattedMerchant: '',
+                formattedMerchant: 'Expense',
                 formattedTo: 'Admin',
                 formattedTotal: 5000,
                 from: {
@@ -1191,13 +1195,13 @@ const transactionReportGroupListItems = [
                 ],
                 keyForList: '2',
                 merchant: 'Expense',
-                modifiedAmount: '',
+                modifiedAmount: 0,
                 modifiedCreated: '',
                 modifiedCurrency: '',
                 modifiedMerchant: 'Expense',
                 parentTransactionID: '',
                 reportID: '11111',
-                shouldShowMerchant: false,
+                shouldShowMerchant: true,
                 shouldShowYear: true,
                 shouldShowYearSubmitted: true,
                 shouldShowYearApproved: false,
@@ -1294,7 +1298,7 @@ const transactionReportGroupListItems = [
                 currency: 'VND',
                 hasEReceipt: false,
                 merchant: '(none)',
-                modifiedAmount: '',
+                modifiedAmount: 0,
                 modifiedCreated: '',
                 modifiedCurrency: '',
                 modifiedMerchant: '',
@@ -1319,7 +1323,7 @@ const transactionReportGroupListItems = [
                 formattedTotal: 1200,
                 formattedMerchant: '',
                 date: '2025-03-05',
-                shouldShowMerchant: false,
+                shouldShowMerchant: true,
                 shouldShowYear: true,
                 shouldShowYearSubmitted: true,
                 shouldShowYearApproved: false,
@@ -1355,7 +1359,7 @@ const transactionReportGroupListItems = [
                 currency: 'VND',
                 hasEReceipt: false,
                 merchant: '(none)',
-                modifiedAmount: '',
+                modifiedAmount: 0,
                 modifiedCreated: '',
                 modifiedCurrency: '',
                 modifiedMerchant: '',
@@ -1380,7 +1384,7 @@ const transactionReportGroupListItems = [
                 formattedTotal: 3200,
                 formattedMerchant: '',
                 date: '2025-03-05',
-                shouldShowMerchant: false,
+                shouldShowMerchant: true,
                 shouldShowYear: true,
                 shouldShowYearSubmitted: true,
                 shouldShowYearApproved: false,
@@ -2236,6 +2240,73 @@ describe('SearchUIUtils', () => {
         });
     });
 
+    describe('Test getSections with shouldSkipActionFiltering option', () => {
+        beforeEach(() => {
+            // Mock getCurrentSearchQueryJSON to return a query with action filter
+            (SearchQueryUtils.getCurrentSearchQueryJSON as jest.Mock).mockReturnValue({
+                type: 'expense-report',
+                filters: {
+                    operator: 'and',
+                    left: {operator: 'eq', left: 'action', right: 'approve'},
+                },
+                flatFilters: [
+                    {
+                        key: 'action',
+                        filters: [{operator: 'eq', value: 'approve'}],
+                    },
+                ],
+            });
+        });
+
+        afterEach(() => {
+            (SearchQueryUtils.getCurrentSearchQueryJSON as jest.Mock).mockClear();
+        });
+
+        it('should return all expense reports when shouldSkipActionFiltering is true', () => {
+            const result = SearchUIUtils.getSections({
+                type: CONST.SEARCH.DATA_TYPES.EXPENSE_REPORT,
+                data: searchResults.data,
+                currentAccountID: 2074551,
+                currentUserEmail: '',
+                translate: translateLocal,
+                formatPhoneNumber,
+                bankAccountList: {},
+                shouldSkipActionFiltering: true,
+            })[0] as TransactionGroupListItemType[];
+
+            expect(result.length).toBe(4); // All expense reports returned
+        });
+
+        it('should return only filtered expense reports when shouldSkipActionFiltering is false', () => {
+            const result = SearchUIUtils.getSections({
+                type: CONST.SEARCH.DATA_TYPES.EXPENSE_REPORT,
+                data: searchResults.data,
+                currentAccountID: 2074551,
+                currentUserEmail: '',
+                translate: translateLocal,
+                formatPhoneNumber,
+                bankAccountList: {},
+                shouldSkipActionFiltering: false,
+            })[0] as TransactionGroupListItemType[];
+
+            expect(result.length).toBe(2); // Only filtered expense reports returned
+        });
+
+        it('should apply default filtering behavior when shouldSkipActionFiltering is undefined', () => {
+            const result = SearchUIUtils.getSections({
+                type: CONST.SEARCH.DATA_TYPES.EXPENSE_REPORT,
+                data: searchResults.data,
+                currentAccountID: 2074551,
+                currentUserEmail: '',
+                translate: translateLocal,
+                formatPhoneNumber,
+                bankAccountList: {},
+            })[0] as TransactionGroupListItemType[];
+
+            expect(result.length).toBe(2); // Default behavior applies filtering
+        });
+    });
+
     describe('Test getSortedSections', () => {
         it('should return getSortedReportActionData result when type is CHAT', () => {
             const sortedActions = SearchUIUtils.getSortedSections(
@@ -3249,8 +3320,7 @@ describe('SearchUIUtils', () => {
             SearchUIUtils.createAndOpenSearchTransactionThread(transactionListItem, backTo, threadReportID, undefined, false);
 
             expect(setOptimisticDataForTransactionThreadPreview).toHaveBeenCalled();
-            // The full reportAction is passed to preserve originalMessage.type for proper expense type detection
-            expect(createTransactionThreadReport).toHaveBeenCalledWith(report1, reportAction1, undefined, undefined);
+            expect(createTransactionThreadReport).toHaveBeenCalledWith(report1, {reportActionID: '11111111'}, undefined, undefined);
         });
 
         test('Should not navigate if shouldNavigate = false', () => {
diff --git a/tests/unit/Search/deleteSelectedItemsOnSearchTest.ts b/tests/unit/Search/deleteSelectedItemsOnSearchTest.ts
new file mode 100644
index 000000000000..2e5c70209073
--- /dev/null
+++ b/tests/unit/Search/deleteSelectedItemsOnSearchTest.ts
@@ -0,0 +1,273 @@
+/* eslint-disable @typescript-eslint/naming-convention */
+import Onyx from 'react-native-onyx';
+import type {SelectedTransactionInfo} from '@components/Search/types';
+import {bulkDeleteReports} from '@libs/actions/Search';
+import {deleteAppReport} from '@userActions/Report';
+import CONST from '@src/CONST';
+
+jest.mock('@userActions/Report', () => ({
+    deleteAppReport: jest.fn(),
+}));
+
+jest.mock('@libs/API', () => ({
+    write: jest.fn(),
+}));
+
+describe('bulkDeleteReports', () => {
+    beforeEach(() => {
+        jest.clearAllMocks();
+        return Onyx.clear();
+    });
+
+    afterEach(() => {
+        jest.clearAllMocks();
+    });
+
+    describe('Empty Report Deletion', () => {
+        it('should delete empty reports when selected', () => {
+            const hash = 12345;
+            const selectedTransactions: Record<string, SelectedTransactionInfo> = {
+                report_123: {
+                    reportID: 'report_123',
+                    action: CONST.SEARCH.ACTION_TYPES.VIEW,
+                    isSelected: true,
+                    canSplit: false,
+                    canReject: false,
+                    hasBeenSplit: false,
+                    canHold: false,
+                    canChangeReport: false,
+                    isHeld: false,
+                    canUnhold: false,
+                    policyID: 'policy123',
+                    amount: 0,
+                    currency: 'USD',
+                },
+                report_456: {
+                    reportID: 'report_456',
+                    action: CONST.SEARCH.ACTION_TYPES.VIEW,
+                    isSelected: true,
+                    canSplit: false,
+                    canReject: false,
+                    hasBeenSplit: false,
+                    canHold: false,
+                    canChangeReport: false,
+                    isHeld: false,
+                    canUnhold: false,
+                    policyID: 'policy456',
+                    amount: 0,
+                    currency: 'USD',
+                },
+            };
+
+            const currentUserEmail = '';
+            const transactions = {};
+            const transactionsViolations = {};
+            bulkDeleteReports(hash, selectedTransactions, currentUserEmail, transactions, transactionsViolations, {});
+
+            // Should call deleteAppReport for each empty report
+            expect(deleteAppReport).toHaveBeenCalledTimes(2);
+            expect(deleteAppReport).toHaveBeenCalledWith('report_123', currentUserEmail, transactions, transactionsViolations, {});
+            expect(deleteAppReport).toHaveBeenCalledWith('report_456', currentUserEmail, transactions, transactionsViolations, {});
+        });
+
+        it('should handle mixed selection of empty reports and transactions', () => {
+            const hash = 12345;
+            const selectedTransactions: Record<string, SelectedTransactionInfo> = {
+                report_123: {
+                    reportID: 'report_123',
+                    action: CONST.SEARCH.ACTION_TYPES.VIEW,
+                    isSelected: true,
+                    canSplit: false,
+                    canReject: false,
+                    hasBeenSplit: false,
+                    canHold: false,
+                    canChangeReport: false,
+                    isHeld: false,
+                    canUnhold: false,
+                    policyID: 'policy123',
+                    amount: 0,
+                    currency: 'USD',
+                },
+                transaction_789: {
+                    reportID: 'report_456',
+                    action: CONST.SEARCH.ACTION_TYPES.VIEW,
+                    isSelected: true,
+                    canSplit: false,
+                    canReject: false,
+                    hasBeenSplit: false,
+                    canHold: true,
+                    canChangeReport: true,
+                    isHeld: false,
+                    canUnhold: false,
+                    policyID: 'policy456',
+                    amount: 1000,
+                    currency: 'USD',
+                },
+                transaction_101: {
+                    reportID: 'report_456',
+                    action: CONST.SEARCH.ACTION_TYPES.VIEW,
+                    isSelected: true,
+                    canSplit: false,
+                    canReject: false,
+                    hasBeenSplit: false,
+                    canHold: true,
+                    canChangeReport: true,
+                    isHeld: false,
+                    canUnhold: false,
+                    policyID: 'policy456',
+                    amount: 500,
+                    currency: 'USD',
+                },
+            };
+
+            const currentUserEmail = '';
+            const transactions = {};
+            const transactionsViolations = {};
+            bulkDeleteReports(hash, selectedTransactions, currentUserEmail, transactions, transactionsViolations, {});
+
+            // Should call deleteAppReport for empty report
+            expect(deleteAppReport).toHaveBeenCalledTimes(1);
+            expect(deleteAppReport).toHaveBeenCalledWith('report_123', currentUserEmail, transactions, transactionsViolations, {});
+        });
+
+        it('should not delete reports when no empty reports are selected', () => {
+            const hash = 12345;
+            const selectedTransactions: Record<string, SelectedTransactionInfo> = {
+                transaction_789: {
+                    reportID: 'report_456',
+                    action: CONST.SEARCH.ACTION_TYPES.VIEW,
+                    isSelected: true,
+                    canSplit: false,
+                    canReject: false,
+                    hasBeenSplit: false,
+                    canHold: true,
+                    canChangeReport: true,
+                    isHeld: false,
+                    canUnhold: false,
+                    policyID: 'policy456',
+                    amount: 1000,
+                    currency: 'USD',
+                },
+                transaction_101: {
+                    reportID: 'report_456',
+                    action: CONST.SEARCH.ACTION_TYPES.VIEW,
+                    isSelected: true,
+                    canSplit: false,
+                    canReject: false,
+                    hasBeenSplit: false,
+                    canHold: true,
+                    canChangeReport: true,
+                    isHeld: false,
+                    canUnhold: false,
+                    policyID: 'policy456',
+                    amount: 500,
+                    currency: 'USD',
+                },
+            };
+
+            bulkDeleteReports(hash, selectedTransactions, '', {}, {}, {});
+
+            // Should not call deleteAppReport
+            expect(deleteAppReport).not.toHaveBeenCalled();
+        });
+
+        it('should handle empty selection gracefully', () => {
+            const hash = 12345;
+            const selectedTransactions: Record<string, SelectedTransactionInfo> = {};
+
+            bulkDeleteReports(hash, selectedTransactions, '', {}, {}, {});
+
+            // Should not call any deletion functions
+            expect(deleteAppReport).not.toHaveBeenCalled();
+        });
+
+        it('should only delete reports where key matches reportID for VIEW action', () => {
+            const hash = 12345;
+            const selectedTransactions: Record<string, SelectedTransactionInfo> = {
+                report_123: {
+                    reportID: 'report_123',
+                    action: CONST.SEARCH.ACTION_TYPES.VIEW,
+                    isSelected: true,
+                    canSplit: false,
+                    canReject: false,
+                    hasBeenSplit: false,
+                    canHold: false,
+                    canChangeReport: false,
+                    isHeld: false,
+                    canUnhold: false,
+                    policyID: 'policy123',
+                    amount: 0,
+                    currency: 'USD',
+                },
+                different_key: {
+                    reportID: 'report_456',
+                    action: CONST.SEARCH.ACTION_TYPES.VIEW,
+                    isSelected: true,
+                    canSplit: false,
+                    canReject: false,
+                    hasBeenSplit: false,
+                    canHold: false,
+                    canChangeReport: false,
+                    isHeld: false,
+                    canUnhold: false,
+                    policyID: 'policy456',
+                    amount: 0,
+                    currency: 'USD',
+                },
+            };
+
+            const currentUserEmail = '';
+            const transactions = {};
+            const transactionsViolations = {};
+            bulkDeleteReports(hash, selectedTransactions, currentUserEmail, transactions, transactionsViolations, {});
+
+            // Should only call deleteAppReport for the first report where key === reportID
+            expect(deleteAppReport).toHaveBeenCalledTimes(1);
+            expect(deleteAppReport).toHaveBeenCalledWith('report_123', currentUserEmail, transactions, transactionsViolations, {});
+            expect(deleteAppReport).not.toHaveBeenCalledWith('report_456', currentUserEmail, transactions, transactionsViolations);
+        });
+    });
+
+    describe('Transaction Deletion', () => {
+        it('should handle transaction deletion when transactions are selected', () => {
+            const hash = 12345;
+            const selectedTransactions: Record<string, SelectedTransactionInfo> = {
+                transaction_789: {
+                    reportID: 'report_456',
+                    action: CONST.SEARCH.ACTION_TYPES.VIEW,
+                    isSelected: true,
+                    canSplit: false,
+                    canReject: false,
+                    hasBeenSplit: false,
+                    canHold: true,
+                    canChangeReport: true,
+                    isHeld: false,
+                    canUnhold: false,
+                    policyID: 'policy456',
+                    amount: 1000,
+                    currency: 'USD',
+                },
+                transaction_101: {
+                    reportID: 'report_456',
+                    action: CONST.SEARCH.ACTION_TYPES.VIEW,
+                    isSelected: true,
+                    canSplit: false,
+                    canReject: false,
+                    hasBeenSplit: false,
+                    canHold: true,
+                    canChangeReport: true,
+                    isHeld: false,
+                    canUnhold: false,
+                    policyID: 'policy456',
+                    amount: 500,
+                    currency: 'USD',
+                },
+            };
+
+            bulkDeleteReports(hash, selectedTransactions, '', {}, {}, {});
+
+            // Should not call deleteAppReport for transactions
+            expect(deleteAppReport).not.toHaveBeenCalled();
+        });
+    });
+});
diff --git a/tests/unit/Search/handleActionButtonPressTest.ts b/tests/unit/Search/handleActionButtonPressTest.ts
index fa29076f3af6..8786fc8a41ef 100644
--- a/tests/unit/Search/handleActionButtonPressTest.ts
+++ b/tests/unit/Search/handleActionButtonPressTest.ts
@@ -110,7 +110,7 @@ const mockReportItemWithHold = {
             hasEReceipt: false,
             managerID: 1206,
             merchant: 'Qatar',
-            modifiedAmount: '',
+            modifiedAmount: 0,
             modifiedCreated: '',
             modifiedCurrency: '',
             modifiedMerchant: '',
@@ -208,7 +208,7 @@ const mockReportItemWithHold = {
             currency: 'USD',
             hasEReceipt: false,
             merchant: 'Forbes',
-            modifiedAmount: '',
+            modifiedAmount: 0,
             modifiedCreated: '',
             modifiedCurrency: '',
             modifiedMerchant: '',
diff --git a/tests/unit/SearchParserTest.ts b/tests/unit/SearchParserTest.ts
index 32d7b6d79c69..b248fc4576d2 100644
--- a/tests/unit/SearchParserTest.ts
+++ b/tests/unit/SearchParserTest.ts
@@ -779,57 +779,6 @@ const keywordTests = [
             },
         },
     },
-    {
-        query: 'columns:original-amount,tax,report-id',
-        expected: {
-            type: 'expense',
-            status: CONST.SEARCH.STATUS.EXPENSE.ALL,
-            sortBy: 'date',
-            sortOrder: 'desc',
-            columns: ['originalamount', 'taxAmount', 'base62ReportID'],
-            filters: null,
-        },
-    },
-    {
-        query: 'columns:tax',
-        expected: {
-            type: 'expense',
-            status: CONST.SEARCH.STATUS.EXPENSE.ALL,
-            sortBy: 'date',
-            sortOrder: 'desc',
-            columns: 'taxAmount',
-            filters: null,
-        },
-    },
-    {
-        query: 'merchant:tax',
-        expected: {
-            type: 'expense',
-            status: CONST.SEARCH.STATUS.EXPENSE.ALL,
-            sortBy: 'date',
-            sortOrder: 'desc',
-            filters: {
-                operator: 'eq',
-                left: 'merchant',
-                right: 'tax',
-            },
-        },
-    },
-    {
-        query: 'type:expense action:submit columns:group-bank-account,group-from',
-        expected: {
-            type: 'expense',
-            status: CONST.SEARCH.STATUS.EXPENSE.ALL,
-            sortBy: 'date',
-            sortOrder: 'desc',
-            columns: ['groupBankAccount', 'groupFrom'],
-            filters: {
-                left: 'action',
-                operator: 'eq',
-                right: 'submit',
-            },
-        },
-    },
 ];
 
 describe('search parser', () => {
diff --git a/tests/unit/SequentialQueueTest.ts b/tests/unit/SequentialQueueTest.ts
index 3d2d259ba8fa..d2896dc1ba7e 100644
--- a/tests/unit/SequentialQueueTest.ts
+++ b/tests/unit/SequentialQueueTest.ts
@@ -1,5 +1,5 @@
 import Onyx from 'react-native-onyx';
-import type {OnyxSetInput, OnyxUpdate} from 'react-native-onyx';
+import type {OnyxUpdate} from 'react-native-onyx';
 import {waitForActiveRequestsToBeEmpty} from '@libs/E2E/utils/NetworkInterceptor';
 import {getAll, getLength, getOngoingRequest} from '@userActions/PersistedRequests';
 import ONYXKEYS from '@src/ONYXKEYS';
@@ -9,7 +9,7 @@ import type {ConflictActionData} from '../../src/types/onyx/Request';
 import * as TestHelper from '../utils/TestHelper';
 import waitForBatchedUpdates from '../utils/waitForBatchedUpdates';
 
-const request: Request<'userMetadata'> = {
+const request: Request = {
     command: 'ReconnectApp',
     successData: [{key: 'userMetadata', onyxMethod: 'set', value: {accountID: 1234}}],
     failureData: [{key: 'userMetadata', onyxMethod: 'set', value: {}}],
@@ -231,7 +231,7 @@ describe('SequentialQueue', () => {
         const persistedRequest = {...request, persistWhenOngoing: true, initiatedOffline: false};
         SequentialQueue.push(persistedRequest);
 
-        const connectionId = Onyx.connect<typeof ONYXKEYS.PERSISTED_ONGOING_REQUESTS>({
+        const connectionId = Onyx.connect({
             key: ONYXKEYS.PERSISTED_ONGOING_REQUESTS,
             callback: (ongoingRequest) => {
                 if (!ongoingRequest) {
@@ -248,7 +248,7 @@ describe('SequentialQueue', () => {
 
     it('should get the ongoing request from onyx and start processing it', async () => {
         const persistedRequest = {...request, persistWhenOngoing: true, initiatedOffline: false};
-        Onyx.set<typeof ONYXKEYS.PERSISTED_ONGOING_REQUESTS>(ONYXKEYS.PERSISTED_ONGOING_REQUESTS, persistedRequest as OnyxSetInput<typeof ONYXKEYS.PERSISTED_ONGOING_REQUESTS>);
+        Onyx.set(ONYXKEYS.PERSISTED_ONGOING_REQUESTS, persistedRequest);
         SequentialQueue.push({command: 'OpenReport'});
 
         await Promise.resolve();
@@ -260,12 +260,12 @@ describe('SequentialQueue', () => {
 
 describe('SequentialQueue - QueueFlushedData', () => {
     it('should add to queueFlushedData', async () => {
-        const updates: Array<OnyxUpdate<typeof ONYXKEYS.USER_METADATA>> = [{key: 'userMetadata', onyxMethod: 'set', value: {accountID: 1234}}];
+        const updates: OnyxUpdate[] = [{key: 'userMetadata', onyxMethod: 'set', value: {accountID: 1234}}];
         await SequentialQueue.saveQueueFlushedData(...updates);
         expect(SequentialQueue.getQueueFlushedData()).toEqual([{key: 'userMetadata', onyxMethod: 'set', value: {accountID: 1234}}]);
     });
     it('should clear queueFlushedData', async () => {
-        const updates: Array<OnyxUpdate<typeof ONYXKEYS.USER_METADATA>> = [{key: 'userMetadata', onyxMethod: 'set', value: {accountID: 1234}}];
+        const updates: OnyxUpdate[] = [{key: 'userMetadata', onyxMethod: 'set', value: {accountID: 1234}}];
         await SequentialQueue.saveQueueFlushedData(...updates);
         await SequentialQueue.clearQueueFlushedData();
         expect(SequentialQueue.getQueueFlushedData()).toEqual([]);
diff --git a/tests/unit/SidebarUtilsTest.ts b/tests/unit/SidebarUtilsTest.ts
index 0991586fc345..a417d1dc3451 100644
--- a/tests/unit/SidebarUtilsTest.ts
+++ b/tests/unit/SidebarUtilsTest.ts
@@ -356,7 +356,6 @@ describe('SidebarUtils', () => {
                 lastAction: undefined,
                 lastActionReport: undefined,
                 isReportArchived: undefined,
-                currentUserAccountID: 0,
             });
             const optionDataUnpinned = SidebarUtils.getOptionData({
                 report: MOCK_REPORT_UNPINNED,
@@ -372,7 +371,6 @@ describe('SidebarUtils', () => {
                 lastAction: undefined,
                 lastActionReport: undefined,
                 isReportArchived: undefined,
-                currentUserAccountID: 0,
             });
 
             expect(optionDataPinned?.isPinned).toBe(true);
@@ -1174,7 +1172,6 @@ describe('SidebarUtils', () => {
                 lastAction,
                 lastActionReport: undefined,
                 isReportArchived: undefined,
-                currentUserAccountID: 0,
             });
 
             // Then the alternate text should be equal to the message of the last action prepended with the last actor display name.
@@ -1236,7 +1233,6 @@ describe('SidebarUtils', () => {
                 lastAction,
                 lastActionReport: undefined,
                 isReportArchived: undefined,
-                currentUserAccountID: 0,
             });
 
             // Then the alternate text should be equal to the message of the last action prepended with the last actor display name.
@@ -1301,7 +1297,6 @@ describe('SidebarUtils', () => {
                 lastAction,
                 lastActionReport: undefined,
                 isReportArchived: undefined,
-                currentUserAccountID: 0,
             });
 
             // Then the alternate text should show @Hidden.
@@ -1351,7 +1346,6 @@ describe('SidebarUtils', () => {
                     localeCompare,
                     lastActionReport: undefined,
                     isReportArchived: undefined,
-                    currentUserAccountID: 0,
                 });
 
                 expect(optionData?.alternateText).toBe(`test message`);
@@ -1392,7 +1386,6 @@ describe('SidebarUtils', () => {
                     localeCompare,
                     isReportArchived: true,
                     lastActionReport: undefined,
-                    currentUserAccountID: 0,
                 });
 
                 expect(optionData?.alternateText).toBe(`test message`);
@@ -1430,7 +1423,6 @@ describe('SidebarUtils', () => {
                     localeCompare,
                     lastActionReport: undefined,
                     isReportArchived: undefined,
-                    currentUserAccountID: 0,
                 });
 
                 expect(optionData?.alternateText).toBe(`test message`);
@@ -1557,7 +1549,6 @@ describe('SidebarUtils', () => {
                     localeCompare,
                     lastActionReport: undefined,
                     isReportArchived: undefined,
-                    currentUserAccountID: 0,
                 });
 
                 expect(optionData?.alternateText).toBe(formatReportLastMessageText(iouReport.reportName));
@@ -1600,7 +1591,6 @@ describe('SidebarUtils', () => {
                     localeCompare,
                     lastActionReport: undefined,
                     isReportArchived: undefined,
-                    currentUserAccountID: 0,
                 });
 
                 expect(optionData?.alternateText).toBe(`${policy.name} ${CONST.DOT_SEPARATOR} test message`);
@@ -1672,7 +1662,6 @@ describe('SidebarUtils', () => {
                     lastAction,
                     lastActionReport: undefined,
                     isReportArchived: undefined,
-                    currentUserAccountID: session.accountID,
                 });
 
                 // Then the alternate text should be equal to the message of the last action prepended with the last actor display name.
@@ -1733,69 +1722,12 @@ describe('SidebarUtils', () => {
                     lastAction,
                     lastActionReport: undefined,
                     isReportArchived: undefined,
-                    currentUserAccountID: session.accountID,
                 });
 
                 expect(result?.alternateText).toBe(`You: moved this report to the Three's Workspace workspace`);
             });
 
-            it('shows "You:" prefix in a 1:1 chat when report actions are not loaded yet (cold start scenario)', async () => {
-                const session = {
-                    authToken: 'sensitive-auth-token',
-                    encryptedAuthToken: 'sensitive-encrypted-token',
-                    email: 'user@example.com',
-                    accountID: 2,
-                };
-
-                const report: Report = {
-                    ...createRandomReport(9999, undefined),
-                    type: CONST.REPORT.TYPE.CHAT,
-                    lastMessageText: 'someMessage',
-                    lastMessageHtml: 'someMessage',
-                    lastActorAccountID: session.accountID,
-                    lastActionType: CONST.REPORT.ACTIONS.TYPE.ADD_COMMENT,
-                    participants: {
-                        [session.accountID]: {notificationPreference: 'always'},
-                        3: {notificationPreference: 'always'},
-                    },
-                };
-
-                await act(async () => {
-                    await Onyx.set(ONYXKEYS.SESSION, session);
-                    await Onyx.set(`${ONYXKEYS.COLLECTION.REPORT}${report.reportID}`, report);
-
-                    // Note: We intentionally do NOT set REPORT_ACTIONS to simulate cold start
-                    // where report actions haven't been loaded yet
-                });
-
-                const result = SidebarUtils.getOptionData({
-                    report,
-                    reportAttributes: undefined,
-                    reportNameValuePairs: {},
-                    personalDetails: {
-                        [session.accountID]: {accountID: session.accountID},
-                    },
-                    policy: undefined,
-                    parentReportAction: undefined,
-                    oneTransactionThreadReport: undefined,
-                    card: undefined,
-                    translate: translateLocal,
-                    localeCompare,
-                    lastAction: undefined,
-                    lastActionReport: undefined,
-                    isReportArchived: undefined,
-                    lastMessageTextFromReport: report.lastMessageText,
-                    currentUserAccountID: session.accountID,
-                });
-
-                expect(result?.alternateText).toBe('You: someMessage');
-            });
-
             it('returns the last action message as an alternate text if the expense report is the one expense report', async () => {
-                const session = {
-                    accountID: 123,
-                };
-
                 const IOUTransactionID = `${ONYXKEYS.COLLECTION.TRANSACTION}TRANSACTION_IOU` as const;
 
                 iouReportR14932.reportID = '5';
@@ -1821,7 +1753,6 @@ describe('SidebarUtils', () => {
 
                 const lastAction: ReportAction = {
                     ...createRandomReportAction(1),
-                    reportID: iouReportR14932.reportID,
                     message: [
                         {
                             type: 'COMMENT',
@@ -1838,27 +1769,19 @@ describe('SidebarUtils', () => {
                     shouldShow: true,
                     pendingAction: null,
                     actionName: CONST.REPORT.ACTIONS.TYPE.ADD_COMMENT,
-                    actorAccountID: session.accountID,
+                    actorAccountID: undefined,
                 };
 
                 await act(async () => {
                     await Onyx.set(`${ONYXKEYS.COLLECTION.REPORT}${iouReportR14932.reportID}`, iouReportR14932);
                     await Onyx.set(`${ONYXKEYS.COLLECTION.REPORT}${chatReportR14932.reportID}`, chatReportR14932);
                     await Onyx.set(`${ONYXKEYS.COLLECTION.REPORT}${report.reportID}`, report);
-                    await Onyx.set(`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${iouReportR14932.reportID}`, {
-                        [linkedCreateAction.reportActionID]: linkedCreateAction,
-                        [lastAction.reportActionID]: lastAction,
-                    });
-                    await Onyx.set(ONYXKEYS.DERIVED.VISIBLE_REPORT_ACTIONS, {
-                        [iouReportR14932.reportID]: {
-                            [linkedCreateAction.reportActionID]: true,
-                            [lastAction.reportActionID]: true,
-                        },
-                    });
+                    await Onyx.set(`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${report.reportID}`, {[lastAction.reportActionID]: lastAction});
+                    await Onyx.set(`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${iouReportR14932.reportID}`, {[linkedCreateAction.reportActionID]: linkedCreateAction});
                 });
 
                 const result = SidebarUtils.getOptionData({
-                    report: {...iouReportR14932, lastActorAccountID: session.accountID},
+                    report: {...iouReportR14932, lastActorAccountID: undefined},
                     reportAttributes: undefined,
                     reportNameValuePairs: {},
                     personalDetails: {},
@@ -1871,13 +1794,6 @@ describe('SidebarUtils', () => {
                     lastAction,
                     lastActionReport: undefined,
                     isReportArchived: undefined,
-                    currentUserAccountID: session.accountID,
-                    visibleReportActionsData: {
-                        [iouReportR14932.reportID]: {
-                            [linkedCreateAction.reportActionID]: true,
-                            [lastAction.reportActionID]: true,
-                        },
-                    },
                 });
 
                 expect(result?.alternateText).toBe(`You: ${getReportActionMessageText(lastAction)}`);
@@ -1898,7 +1814,6 @@ describe('SidebarUtils', () => {
                 };
                 const lastAction: ReportAction = {
                     ...createRandomReportAction(1),
-                    reportID: '1',
                     message: [
                         {
                             type: 'COMMENT',
@@ -1918,7 +1833,6 @@ describe('SidebarUtils', () => {
                 };
                 const deletedAction: ReportAction = {
                     ...createRandomReportAction(2),
-                    reportID: '1',
                     actionName: 'IOU',
                     actorAccountID: 20337430,
                     automatic: false,
@@ -1998,8 +1912,6 @@ describe('SidebarUtils', () => {
                     lastAction,
                     lastActionReport: undefined,
                     isReportArchived: undefined,
-                    lastMessageTextFromReport: 'test action',
-                    currentUserAccountID: 0,
                 });
 
                 expect(result?.alternateText).toContain(`${getReportActionMessageText(lastAction)}`);
@@ -2085,7 +1997,6 @@ describe('SidebarUtils', () => {
                     lastAction,
                     lastActionReport: undefined,
                     isReportArchived: undefined,
-                    currentUserAccountID: 0,
                 });
 
                 expect(result?.alternateText).toBe(`One: submitted`);
@@ -2183,11 +2094,10 @@ describe('SidebarUtils', () => {
                     localeCompare,
                     lastActionReport: undefined,
                     isReportArchived: undefined,
-                    currentUserAccountID: managerID,
                 });
 
                 const reportPreviewMessage = getReportPreviewMessage(iouReport, iouAction, true, true, null, true, lastReportPreviewAction);
-                expect(result?.alternateText).toBe(`${getLastActorDisplayName({accountID: managerID}, managerID)}: ${reportPreviewMessage}`);
+                expect(result?.alternateText).toBe(`${getLastActorDisplayName({accountID: managerID})}: ${reportPreviewMessage}`);
             });
 
             it("shouldn't add current user prefix if the current user isn't the report's manager for report preview action in a DM chat", async () => {
@@ -2282,7 +2192,6 @@ describe('SidebarUtils', () => {
                     localeCompare,
                     lastActionReport: undefined,
                     isReportArchived: undefined,
-                    currentUserAccountID: managerID,
                 });
 
                 const reportPreviewMessage = getReportPreviewMessage(iouReport, iouAction, true, true, null, true, lastReportPreviewAction);
@@ -2294,7 +2203,7 @@ describe('SidebarUtils', () => {
     describe('sortReportsToDisplayInLHN', () => {
         describe('categorizeReportsForLHN', () => {
             it('should categorize reports into correct groups', () => {
-                const {reports, reportNameValuePairs} = createSidebarTestData();
+                const {reports, reportNameValuePairs, reportAttributes} = createSidebarTestData();
 
                 // Given reportsDrafts contains a draft comment for report '2'
                 const reportsDrafts = {
@@ -2302,7 +2211,7 @@ describe('SidebarUtils', () => {
                 };
 
                 // When the reports are categorized
-                const result = SidebarUtils.categorizeReportsForLHN(reports, reportsDrafts, reportNameValuePairs);
+                const result = SidebarUtils.categorizeReportsForLHN(reports, reportsDrafts, reportNameValuePairs, reportAttributes);
 
                 // Then the reports are categorized into the correct groups
                 expect(result.pinnedAndGBRReports).toHaveLength(1);
@@ -2324,12 +2233,21 @@ describe('SidebarUtils', () => {
                         reportName: 'Attention Report',
                         isPinned: false,
                         hasErrorsOtherThanFailedReceipt: false,
-                        requiresAttention: true,
                     },
                 ]);
 
+                const reportAttributes = {
+                    '0': {
+                        requiresAttention: true,
+                        reportName: 'Test Report',
+                        isEmpty: false,
+                        brickRoadStatus: undefined,
+                        reportErrors: {} as Record<string, string | null>,
+                    },
+                };
+
                 // When the reports are categorized
-                const result = SidebarUtils.categorizeReportsForLHN(reports, undefined, undefined);
+                const result = SidebarUtils.categorizeReportsForLHN(reports, undefined, undefined, reportAttributes);
 
                 // Then the reports are categorized into the correct groups
                 expect(result.pinnedAndGBRReports).toHaveLength(1);
diff --git a/tests/unit/TransactionGroupListItemTest.tsx b/tests/unit/TransactionGroupListItemTest.tsx
index 0a3dc1ebb35e..00f97240254b 100644
--- a/tests/unit/TransactionGroupListItemTest.tsx
+++ b/tests/unit/TransactionGroupListItemTest.tsx
@@ -24,6 +24,49 @@ jest.mock('@libs/SearchUIUtils', () => ({
     getTableMinWidth: jest.fn(() => 0),
 }));
 
+const mockEmptyReport: TransactionReportGroupListItemType = {
+    accountID: 1,
+    chatReportID: '4735435600700077',
+    chatType: undefined,
+    created: '2025-09-19 20:00:47',
+    currency: 'USD',
+    isOneTransactionReport: false,
+    isOwnPolicyExpenseChat: false,
+    isWaitingOnBankAccount: false,
+    managerID: 1,
+    nonReimbursableTotal: 0,
+    oldPolicyName: '',
+    ownerAccountID: 1,
+    parentReportActionID: '2454187434077044186',
+    parentReportID: '4735435600700077',
+    policyID: '06F34677820A4D07',
+    reportID: '515146912679679',
+    reportName: 'Expense Report #515146912679679',
+    stateNum: 1,
+    statusNum: 1,
+    total: 0,
+    type: 'expense',
+    unheldTotal: 0,
+    from: {
+        accountID: 1,
+        avatar: 'https://d2k5nsl2zxldvw.cloudfront.net/images/avatars/default-avatar_15.png',
+        displayName: 'Main Applause QA',
+    },
+    to: {
+        accountID: 1,
+        avatar: 'https://d2k5nsl2zxldvw.cloudfront.net/images/avatars/default-avatar_15.png',
+        displayName: 'Main Applause QA',
+    },
+    transactions: [],
+    groupedBy: 'expense-report',
+    keyForList: '515146912679679',
+    shouldShowYear: false,
+    shouldShowYearSubmitted: false,
+    shouldShowYearApproved: false,
+    shouldShowYearExported: false,
+    action: CONST.SEARCH.ACTION_TYPES.VIEW,
+};
+
 const mockTransaction: TransactionListItemType = {
     accountID: 1,
     amount: 0,
@@ -92,6 +135,56 @@ const mockTransaction: TransactionListItemType = {
     },
 };
 
+const mockNonEmptyReport: TransactionReportGroupListItemType = {
+    accountID: 2,
+    chatReportID: '4735435600700078',
+    chatType: undefined,
+    created: '2025-09-20 10:00:00',
+    currency: 'USD',
+    isOneTransactionReport: false,
+    isOwnPolicyExpenseChat: false,
+    isWaitingOnBankAccount: false,
+    managerID: 2,
+    nonReimbursableTotal: 0,
+    oldPolicyName: '',
+    ownerAccountID: 2,
+    parentReportActionID: '2454187434077044187',
+    parentReportID: '4735435600700078',
+    policyID: '06F34677820A4D07',
+    reportID: '515146912679680',
+    reportName: 'Expense Report #515146912679680',
+    stateNum: 1,
+    statusNum: 1,
+    total: -1284,
+    type: 'expense',
+    unheldTotal: -1284,
+    from: {
+        accountID: 2,
+        avatar: 'https://d2k5nsl2zxldvw.cloudfront.net/images/avatars/default-avatar_16.png',
+        displayName: 'Test User',
+    },
+    to: {
+        accountID: 2,
+        avatar: 'https://d2k5nsl2zxldvw.cloudfront.net/images/avatars/default-avatar_16.png',
+        displayName: 'Test User',
+    },
+    transactions: [
+        {
+            ...mockTransaction,
+            transactionID: '2',
+            reportID: '515146912679680',
+            keyForList: '2',
+        },
+    ],
+    groupedBy: 'expense-report',
+    keyForList: '515146912679680',
+    shouldShowYear: false,
+    shouldShowYearSubmitted: false,
+    shouldShowYearApproved: false,
+    shouldShowYearExported: false,
+    action: CONST.SEARCH.ACTION_TYPES.VIEW,
+};
+
 const mockReport: TransactionReportGroupListItemType = {
     accountID: 1,
     chatReportID: '4735435600700077',
@@ -332,3 +425,232 @@ describe('TransactionGroupListItem', () => {
         expect(screen.getByTestId('ReportSearchHeader')).toBeTruthy();
     });
 });
+
+describe('Empty Report Selection', () => {
+    const mockOnSelectRow = jest.fn();
+    const mockOnCheckboxPress = jest.fn();
+
+    beforeAll(() => {
+        Onyx.init({
+            keys: ONYXKEYS,
+            evictableKeys: [ONYXKEYS.COLLECTION.REPORT_ACTIONS],
+        });
+        jest.spyOn(NativeNavigation, 'useRoute').mockReturnValue({key: '', name: ''});
+    });
+
+    beforeEach(() => {
+        jest.clearAllMocks();
+        mockOnSelectRow.mockClear();
+        mockOnCheckboxPress.mockClear();
+        return act(async () => {
+            await Onyx.clear();
+            await waitForBatchedUpdatesWithAct();
+        });
+    });
+
+    const defaultProps: TransactionGroupListItemProps<TransactionReportGroupListItemType> = {
+        item: mockEmptyReport,
+        showTooltip: false,
+        onSelectRow: mockOnSelectRow,
+        onCheckboxPress: mockOnCheckboxPress,
+        searchType: CONST.SEARCH.DATA_TYPES.EXPENSE_REPORT,
+        canSelectMultiple: true,
+    };
+
+    function TestWrapper({children}: {children: React.ReactNode}) {
+        return (
+            <ComposeProviders components={[OnyxListItemProvider, LocaleContextProvider]}>
+                <ScreenWrapper testID="test">
+                    <SearchContextProvider>{children}</SearchContextProvider>
+                </ScreenWrapper>
+            </ComposeProviders>
+        );
+    }
+
+    const renderTransactionGroupListItem = () => {
+        return render(
+            <TransactionGroupListItem
+                // eslint-disable-next-line react/jsx-props-no-spreading
+                {...defaultProps}
+            />,
+            {wrapper: TestWrapper},
+        );
+    };
+
+    it('should render an empty report with checkbox', async () => {
+        renderTransactionGroupListItem();
+        await waitForBatchedUpdatesWithAct();
+
+        // Then the empty report should be rendered with a checkbox
+        expect(screen.getByRole(CONST.ROLE.CHECKBOX)).toBeTruthy();
+        expect(screen.getByRole(CONST.ROLE.CHECKBOX)).not.toBeChecked();
+        expect(screen.getByTestId('ReportSearchHeader')).toBeTruthy();
+        expect(screen.getByTestId('TotalCell')).toBeTruthy();
+        expect(screen.getByTestId('ActionCell')).toBeTruthy();
+    });
+
+    it('should call onCheckboxPress when checkbox is clicked on an empty report', async () => {
+        renderTransactionGroupListItem();
+        await waitForBatchedUpdatesWithAct();
+
+        // When clicking on the empty report checkbox
+        const checkbox = screen.getByRole(CONST.ROLE.CHECKBOX);
+        expect(checkbox).not.toBeChecked();
+
+        fireEvent.press(checkbox);
+        await waitForBatchedUpdatesWithAct();
+
+        // Then onCheckboxPress should be called with the empty report and undefined (for groupBy reports)
+        expect(mockOnCheckboxPress).toHaveBeenCalledTimes(1);
+        expect(mockOnCheckboxPress).toHaveBeenCalledWith(mockEmptyReport, undefined);
+    });
+
+    it('should call onCheckboxPress multiple times when checkbox is clicked multiple times', async () => {
+        renderTransactionGroupListItem();
+        await waitForBatchedUpdatesWithAct();
+
+        const checkbox = screen.getByRole(CONST.ROLE.CHECKBOX);
+
+        // First click
+        fireEvent.press(checkbox);
+        await waitForBatchedUpdatesWithAct();
+        expect(mockOnCheckboxPress).toHaveBeenCalledTimes(1);
+
+        // Second click
+        fireEvent.press(checkbox);
+        await waitForBatchedUpdatesWithAct();
+
+        // Then onCheckboxPress should be called twice
+        expect(mockOnCheckboxPress).toHaveBeenCalledTimes(2);
+    });
+
+    it('should not show expandable content for an empty report', async () => {
+        renderTransactionGroupListItem();
+        await waitForBatchedUpdatesWithAct();
+
+        // Empty reports should not have expandable transaction content
+        // The AnimatedCollapsible content should not be visible
+        const collapsibleContent = screen.queryByTestId(CONST.ANIMATED_COLLAPSIBLE_CONTENT_TEST_ID);
+
+        // The collapsible content should not be rendered for empty reports
+        expect(collapsibleContent).toBeNull();
+    });
+
+    it('should handle selecting both empty and non-empty reports', async () => {
+        // First render and select an empty report
+        const {unmount: unmountEmpty} = renderTransactionGroupListItem();
+        await waitForBatchedUpdatesWithAct();
+
+        const emptyCheckbox = screen.getByRole(CONST.ROLE.CHECKBOX);
+        expect(emptyCheckbox).not.toBeChecked();
+
+        fireEvent.press(emptyCheckbox);
+        await waitForBatchedUpdatesWithAct();
+
+        expect(mockOnCheckboxPress).toHaveBeenCalledTimes(1);
+        expect(mockOnCheckboxPress).toHaveBeenCalledWith(mockEmptyReport, undefined);
+
+        unmountEmpty();
+        mockOnCheckboxPress.mockClear();
+
+        // Render and select a non-empty report
+        const nonEmptyProps: TransactionGroupListItemProps<TransactionReportGroupListItemType> = {
+            ...defaultProps,
+            item: mockNonEmptyReport,
+        };
+
+        const {unmount: unmountNonEmpty} = render(
+            <TransactionGroupListItem
+                // eslint-disable-next-line react/jsx-props-no-spreading
+                {...nonEmptyProps}
+            />,
+            {wrapper: TestWrapper},
+        );
+        await waitForBatchedUpdatesWithAct();
+
+        const nonEmptyCheckbox = screen.getByRole(CONST.ROLE.CHECKBOX);
+        expect(nonEmptyCheckbox).not.toBeChecked();
+
+        fireEvent.press(nonEmptyCheckbox);
+        await waitForBatchedUpdatesWithAct();
+
+        expect(mockOnCheckboxPress).toHaveBeenCalledTimes(1);
+        expect(mockOnCheckboxPress).toHaveBeenCalledWith(mockNonEmptyReport, undefined);
+
+        unmountNonEmpty();
+    });
+
+    it('should track the number of checkbox presses for multiple selections', async () => {
+        renderTransactionGroupListItem();
+        await waitForBatchedUpdatesWithAct();
+
+        const checkbox = screen.getByRole(CONST.ROLE.CHECKBOX);
+
+        for (let i = 1; i <= 3; i++) {
+            fireEvent.press(checkbox);
+            await waitForBatchedUpdatesWithAct();
+            expect(mockOnCheckboxPress).toHaveBeenCalledTimes(i);
+        }
+
+        expect(mockOnCheckboxPress).toHaveBeenNthCalledWith(1, mockEmptyReport, undefined);
+        expect(mockOnCheckboxPress).toHaveBeenNthCalledWith(2, mockEmptyReport, undefined);
+        expect(mockOnCheckboxPress).toHaveBeenNthCalledWith(3, mockEmptyReport, undefined);
+    });
+
+    it('should show expandable content for non-empty reports', async () => {
+        const nonEmptyProps: TransactionGroupListItemProps<TransactionReportGroupListItemType> = {
+            ...defaultProps,
+            item: mockNonEmptyReport,
+        };
+
+        render(
+            <TransactionGroupListItem
+                // eslint-disable-next-line react/jsx-props-no-spreading
+                {...nonEmptyProps}
+            />,
+            {wrapper: TestWrapper},
+        );
+        await waitForBatchedUpdatesWithAct();
+
+        // Non-empty reports should have an expand button
+        const expandButton = screen.getByLabelText('Expand');
+        expect(expandButton).toBeTruthy();
+
+        // Initially, the collapsible content should not be visible
+        let collapsibleContent = screen.queryByTestId(CONST.ANIMATED_COLLAPSIBLE_CONTENT_TEST_ID);
+        expect(collapsibleContent).toBeNull();
+
+        // Click the expand button
+        fireEvent.press(expandButton);
+        await waitForBatchedUpdatesWithAct();
+
+        // After expanding, the collapsible content should be visible
+        collapsibleContent = screen.queryByTestId(CONST.ANIMATED_COLLAPSIBLE_CONTENT_TEST_ID);
+        expect(collapsibleContent).toBeTruthy();
+
+        // The button label should change to 'Collapse'
+        const collapseButton = screen.getByLabelText('Collapse');
+        expect(collapseButton).toBeTruthy();
+
+        // Click the collapse button
+        fireEvent.press(collapseButton);
+        await waitForBatchedUpdatesWithAct();
+
+        // The button label should change back to 'Expand'
+        const expandButtonAgain = screen.getByLabelText('Expand');
+        expect(expandButtonAgain).toBeTruthy();
+    });
+
+    it('should not show expand button for empty reports', async () => {
+        renderTransactionGroupListItem();
+        await waitForBatchedUpdatesWithAct();
+
+        // Empty reports should have an expand button but it should be disabled
+        const expandButton = screen.queryByLabelText('Expand');
+        expect(expandButton).toBeTruthy();
+
+        // The collapsible content should not be rendered for empty reports
+        const collapsibleContent = screen.queryByTestId(CONST.ANIMATED_COLLAPSIBLE_CONTENT_TEST_ID);
+        expect(collapsibleContent).toBeNull();
+    });
+});
diff --git a/tests/unit/TransactionPreviewUtils.test.ts b/tests/unit/TransactionPreviewUtils.test.ts
index 89d01407f042..9daede4b6fa9 100644
--- a/tests/unit/TransactionPreviewUtils.test.ts
+++ b/tests/unit/TransactionPreviewUtils.test.ts
@@ -106,15 +106,15 @@ describe('TransactionPreviewUtils', () => {
             expect(result.displayAmountText.text).toEqual('$0.00');
         });
 
-        it('returns missing field message when appropriate', () => {
+        it('returns merchant missing and amount missing message when appropriate', () => {
             const functionArgs = {
                 ...basicProps,
-                transaction: {...basicProps.transaction, created: '', amount: 100},
+                transaction: {...basicProps.transaction, merchant: '', amount: 0},
                 originalTransaction: undefined,
                 shouldShowRBR: true,
             };
             const result = getTransactionPreviewTextAndTranslationPaths(functionArgs);
-            expect(result.RBRMessage.translationPath).toEqual('iou.missingMerchant');
+            expect(result.RBRMessage.translationPath).toEqual('violations.reviewRequired');
         });
 
         it('should display showCashOrCard in previewHeaderText', () => {
@@ -140,12 +140,7 @@ describe('TransactionPreviewUtils', () => {
         });
 
         it('displays description when receipt is being scanned', () => {
-            const functionArgs = {
-                ...basicProps,
-                transaction: {...basicProps.transaction, merchant: '(none)', receipt: {state: CONST.IOU.RECEIPT_STATE.SCANNING}},
-                originalTransaction: undefined,
-                merchant: 'Expense',
-            };
+            const functionArgs = {...basicProps, transaction: {...basicProps.transaction, receipt: {state: CONST.IOU.RECEIPT_STATE.SCANNING}}, originalTransaction: undefined};
             const result = getTransactionPreviewTextAndTranslationPaths(functionArgs);
             expect(result.previewHeaderText).toEqual(expect.arrayContaining([{translationPath: 'common.receipt'}]));
         });
@@ -160,7 +155,7 @@ describe('TransactionPreviewUtils', () => {
             const functionArgs = {
                 ...basicProps,
                 transactionDetails: {amount: 300, currency: 'EUR'},
-                transaction: {...basicProps.transaction, merchant: '(none)', receipt: {state: CONST.IOU.RECEIPT_STATE.SCANNING}},
+                transaction: {...basicProps.transaction, receipt: {state: CONST.IOU.RECEIPT_STATE.SCANNING}},
                 originalTransaction: undefined,
             };
             const result = getTransactionPreviewTextAndTranslationPaths(functionArgs);
@@ -227,9 +222,8 @@ describe('TransactionPreviewUtils', () => {
     });
 
     describe('createTransactionPreviewConditionals', () => {
-        const currentUserAccountID = 999;
         beforeAll(() => {
-            Onyx.merge(ONYXKEYS.SESSION, {accountID: currentUserAccountID});
+            Onyx.merge(ONYXKEYS.SESSION, {accountID: 999});
         });
         afterAll(() => {
             Onyx.clear([ONYXKEYS.SESSION]);
@@ -293,7 +287,6 @@ describe('TransactionPreviewUtils', () => {
                         type: CONST.REPORT.ACTIONS.TYPE.IOU,
                     },
                 },
-                currentUserAccountID,
             };
             const result = createTransactionPreviewConditionals(functionArgs);
             expect(result.shouldShowSplitShare).toBeTruthy();
@@ -362,7 +355,6 @@ describe('TransactionPreviewUtils', () => {
                         type: CONST.REPORT.ACTIONS.TYPE.IOU,
                     },
                 },
-                currentUserAccountID,
             };
             const result = createTransactionPreviewConditionals(functionArgs);
             expect(result.shouldShowSplitShare).toBeTruthy();
diff --git a/tests/unit/TransactionTest.ts b/tests/unit/TransactionTest.ts
index be7871abfb34..23599ffeed1c 100644
--- a/tests/unit/TransactionTest.ts
+++ b/tests/unit/TransactionTest.ts
@@ -3,7 +3,7 @@ import type {OnyxEntry} from 'react-native-onyx';
 import Onyx from 'react-native-onyx';
 import OnyxUtils from 'react-native-onyx/dist/OnyxUtils';
 import useOnyx from '@hooks/useOnyx';
-import {changeTransactionsReport, dismissDuplicateTransactionViolation, markAsCash, saveWaypoint} from '@libs/actions/Transaction';
+import {changeTransactionsReport, markAsCash, saveWaypoint} from '@libs/actions/Transaction';
 import DateUtils from '@libs/DateUtils';
 import {getAllNonDeletedTransactions} from '@libs/MoneyRequestReportUtils';
 import type {buildOptimisticNextStep} from '@libs/NextStepUtils';
@@ -125,7 +125,7 @@ describe('Transaction', () => {
                 accountID: CURRENT_USER_ID,
                 email: 'test@example.com',
                 newReport: report,
-                allTransactions,
+                allTransactionsCollection: allTransactions,
             });
             await waitForBatchedUpdates();
             const reportActions = await new Promise<OnyxEntry<ReportActions>>((resolve) => {
@@ -172,7 +172,7 @@ describe('Transaction', () => {
                 accountID: CURRENT_USER_ID,
                 email: 'test@example.com',
                 newReport: report,
-                allTransactions,
+                allTransactionsCollection: allTransactions,
             });
             await waitForBatchedUpdates();
             const reportActions = await new Promise<OnyxEntry<ReportActions>>((resolve) => {
@@ -234,7 +234,7 @@ describe('Transaction', () => {
                 newReport: report,
                 policy: undefined,
                 reportNextStep: mockReportNextStep,
-                allTransactions,
+                allTransactionsCollection: allTransactions,
             });
             await waitForBatchedUpdates();
 
@@ -298,7 +298,7 @@ describe('Transaction', () => {
                 newReport: report,
                 policy: undefined,
                 reportNextStep: mockReportNextStep,
-                allTransactions,
+                allTransactionsCollection: allTransactions,
             });
             await waitForBatchedUpdates();
 
@@ -350,7 +350,7 @@ describe('Transaction', () => {
                 newReport: report,
                 policy: undefined,
                 reportNextStep: undefined,
-                allTransactions,
+                allTransactionsCollection: allTransactions,
             });
             await waitForBatchedUpdates();
 
@@ -413,7 +413,7 @@ describe('Transaction', () => {
                 accountID: CURRENT_USER_ID,
                 email: 'test@example.com',
                 newReport: report,
-                allTransactions,
+                allTransactionsCollection: allTransactions,
             });
             await waitForBatchedUpdates();
 
@@ -468,7 +468,7 @@ describe('Transaction', () => {
                 accountID: CURRENT_USER_ID,
                 email: 'test@example.com',
                 newReport: report,
-                allTransactions,
+                allTransactionsCollection: allTransactions,
             });
             await waitForBatchedUpdates();
 
@@ -520,7 +520,7 @@ describe('Transaction', () => {
                 accountID: customAccountID,
                 email: customEmail,
                 newReport: report,
-                allTransactions,
+                allTransactionsCollection: allTransactions,
             });
             await waitForBatchedUpdates();
 
@@ -578,7 +578,7 @@ describe('Transaction', () => {
                 accountID: CURRENT_USER_ID,
                 email: 'test@example.com',
                 newReport: expenseReport,
-                allTransactions,
+                allTransactionsCollection: allTransactions,
             });
             await waitForBatchedUpdates();
             const report = await new Promise<OnyxEntry<Report>>((resolve) => {
@@ -636,7 +636,7 @@ describe('Transaction', () => {
                 accountID: CURRENT_USER_ID,
                 email: 'test@example.com',
                 newReport: expenseReport,
-                allTransactions,
+                allTransactionsCollection: allTransactions,
             });
             await waitForBatchedUpdates();
             const report = await new Promise<OnyxEntry<Report>>((resolve) => {
@@ -701,7 +701,7 @@ describe('Transaction', () => {
                 accountID: CURRENT_USER_ID,
                 email: 'test@example.com',
                 newReport: newExpenseReport,
-                allTransactions,
+                allTransactionsCollection: allTransactions,
             });
             await waitForBatchedUpdates();
             const report = await new Promise<OnyxEntry<Report>>((resolve) => {
@@ -765,7 +765,7 @@ describe('Transaction', () => {
                 accountID: CURRENT_USER_ID,
                 email: 'test@example.com',
                 newReport: newExpenseReport,
-                allTransactions,
+                allTransactionsCollection: allTransactions,
             });
             await waitForBatchedUpdates();
             const report = await new Promise<OnyxEntry<Report>>((resolve) => {
@@ -822,7 +822,7 @@ describe('Transaction', () => {
                 accountID: CURRENT_USER_ID,
                 email: 'test@example.com',
                 newReport: fakeReport,
-                allTransactions,
+                allTransactionsCollection: allTransactions,
             });
             await waitForBatchedUpdates();
 
@@ -881,7 +881,7 @@ describe('Transaction', () => {
                 accountID: CURRENT_USER_ID,
                 email: 'test@example.com',
                 newReport: fakeReport,
-                allTransactions,
+                allTransactionsCollection: allTransactions,
             });
             await waitForBatchedUpdates();
 
@@ -935,7 +935,7 @@ describe('Transaction', () => {
                 policy,
                 reportNextStep: undefined,
                 policyCategories,
-                allTransactions,
+                allTransactionsCollection: allTransactions,
             });
 
             await waitForBatchedUpdates();
@@ -992,6 +992,20 @@ describe('Transaction', () => {
             expect(updatedRecentWaypoints?.[0]?.address).toBe('123 Main St');
         });
 
+        it('should not save waypoint if missing lat/lng', async () => {
+            const transactionID = 'txn2';
+            const index = '1';
+            const waypoint: RecentWaypoint = {
+                address: 'No LatLng',
+            };
+            const recentWaypointsList: RecentWaypoint[] = [];
+            saveWaypoint({transactionID, index, waypoint, isDraft: false, recentWaypointsList});
+            await waitForBatchedUpdates();
+
+            const updatedRecentWaypoints = await OnyxUtils.get(ONYXKEYS.NVP_RECENT_WAYPOINTS);
+            expect(updatedRecentWaypoints?.length ?? 0).toBe(0);
+        });
+
         it('should not save waypoint if address is YOUR_LOCATION_TEXT', async () => {
             const transactionID = 'txn3';
             const index = '2';
@@ -1199,220 +1213,4 @@ describe('Transaction', () => {
             await mockFetch.resume();
         });
     });
-
-    describe('dismissDuplicateTransactionViolation', () => {
-        it('should optimistically remove DUPLICATED_TRANSACTION violation and add dismissed violation report action', async () => {
-            const transactionID = 'dismissTxn1';
-            const threadReportID = 'threadDismiss1';
-            const mockViolations: TransactionViolation[] = [
-                {name: CONST.VIOLATIONS.DUPLICATED_TRANSACTION, type: 'warning'},
-                {name: CONST.VIOLATIONS.MISSING_CATEGORY, type: 'violation'},
-            ];
-
-            mockFetch.pause();
-
-            // Put violations into Onyx so module-level Onyx.connect in Transaction.ts picks them up
-            await Onyx.merge(`${ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS}${transactionID}`, mockViolations);
-
-            // Prepare a transaction and its IOU action so getIOUActionForReportID finds a childReportID
-            const transaction = generateTransaction({transactionID, reportID: FAKE_OLD_REPORT_ID});
-            const iouAction = {
-                reportActionID: rand64(),
-                actionName: CONST.REPORT.ACTIONS.TYPE.IOU,
-                childReportID: threadReportID,
-                actorAccountID: CURRENT_USER_ID,
-                created: DateUtils.getDBTime(),
-                originalMessage: {
-                    IOUReportID: FAKE_OLD_REPORT_ID,
-                    IOUTransactionID: transactionID,
-                    amount: transaction.amount,
-                    currency: transaction.currency,
-                    type: CONST.IOU.REPORT_ACTION_TYPE.CREATE,
-                },
-            };
-            await Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${FAKE_OLD_REPORT_ID}`, {[iouAction.reportActionID]: iouAction});
-            // Ensure transaction exists in the passed allTransactions mapping
-            const allTransactions = {[`${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`]: transaction};
-
-            // Ensure the child report actions collection exists
-            await Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${threadReportID}`, {});
-
-            // Call the function
-            dismissDuplicateTransactionViolation({
-                transactionIDs: [transactionID],
-                dismissedPersonalDetails: {login: 'tester@example.com', accountID: CURRENT_USER_ID},
-                expenseReport: newReport,
-                policy: undefined,
-                isASAPSubmitBetaEnabled: false,
-                allTransactions,
-            });
-            await waitForBatchedUpdates();
-
-            const optimisticViolations = await OnyxUtils.get(`${ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS}${transactionID}`);
-            expect(optimisticViolations).toEqual([{name: CONST.VIOLATIONS.MISSING_CATEGORY, type: 'violation'}]);
-
-            const reportActions = await OnyxUtils.get(`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${threadReportID}`);
-            const reportActionValues = Object.values(reportActions ?? {});
-            expect(reportActionValues.length).toBe(1);
-            expect(reportActionValues.at(0)?.actionName).toBe(CONST.REPORT.ACTIONS.TYPE.DISMISSED_VIOLATION);
-
-            // Let the mocked API resolve and ensure optimistic state behaves as implementation expects:
-            // The implementation clears the optimistic dismissed-violation report action on success to avoid duplicates,
-            // so after the API resolves the report action should be removed while the filtered violations persist.
-            await mockFetch.resume();
-            await waitForBatchedUpdates();
-
-            const finalViolations = await OnyxUtils.get(`${ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS}${transactionID}`);
-            expect(finalViolations).toEqual([{name: CONST.VIOLATIONS.MISSING_CATEGORY, type: 'violation'}]);
-
-            const finalReportActions = await OnyxUtils.get(`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${threadReportID}`);
-            const finalReportActionValues = Object.values(finalReportActions ?? {});
-            // The optimistic dismissed violation report action is removed on successful API response to avoid duplicates
-            expect(finalReportActionValues.length).toBe(0);
-        });
-
-        it('should restore DUPLICATED_TRANSACTION violation and remove report action when API fails', async () => {
-            const transactionID = 'dismissTxn2';
-            const threadReportID = 'threadDismiss2';
-            const mockViolations: TransactionViolation[] = [{name: CONST.VIOLATIONS.DUPLICATED_TRANSACTION, type: 'warning'}];
-
-            mockFetch.pause();
-
-            await Onyx.merge(`${ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS}${transactionID}`, mockViolations);
-
-            const transaction = generateTransaction({transactionID, reportID: FAKE_OLD_REPORT_ID});
-            const iouAction = {
-                reportActionID: rand64(),
-                actionName: CONST.REPORT.ACTIONS.TYPE.IOU,
-                childReportID: threadReportID,
-                actorAccountID: CURRENT_USER_ID,
-                created: DateUtils.getDBTime(),
-                originalMessage: {
-                    IOUReportID: FAKE_OLD_REPORT_ID,
-                    IOUTransactionID: transactionID,
-                    amount: transaction.amount,
-                    currency: transaction.currency,
-                    type: CONST.IOU.REPORT_ACTION_TYPE.CREATE,
-                },
-            };
-            await Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${FAKE_OLD_REPORT_ID}`, {[iouAction.reportActionID]: iouAction});
-            await Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${threadReportID}`, {});
-            const allTransactions = {[`${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`]: transaction};
-
-            // Make the API fail
-            mockFetch.fail();
-
-            dismissDuplicateTransactionViolation({
-                transactionIDs: [transactionID],
-                dismissedPersonalDetails: {login: 'tester@example.com', accountID: CURRENT_USER_ID},
-                expenseReport: newReport,
-                policy: undefined,
-                isASAPSubmitBetaEnabled: false,
-                allTransactions,
-            });
-            await waitForBatchedUpdates();
-
-            // Resume (the mock is set to fail) and wait for failure handling
-            await mockFetch.resume();
-            await waitForBatchedUpdates();
-
-            const failureViolations = await OnyxUtils.get(`${ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS}${transactionID}`);
-            expect(failureViolations).toEqual(mockViolations);
-
-            const reportActions = await OnyxUtils.get(`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${threadReportID}`);
-            expect(Object.keys(reportActions ?? {}).length).toBe(0);
-        });
-
-        it('should not modify Onyx data when tag list does not exist at given index (empty violations array)', async () => {
-            const transactionID = 'dismissTxn3';
-            const threadReportID = 'threadDismiss3';
-            const mockViolations: TransactionViolation[] = [];
-
-            mockFetch.pause();
-
-            await Onyx.merge(`${ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS}${transactionID}`, mockViolations);
-            await Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${threadReportID}`, {});
-
-            const transaction = generateTransaction({transactionID, reportID: FAKE_OLD_REPORT_ID});
-            const allTransactions = {[`${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`]: transaction};
-
-            dismissDuplicateTransactionViolation({
-                transactionIDs: [transactionID],
-                dismissedPersonalDetails: {login: 'tester@example.com', accountID: CURRENT_USER_ID},
-                expenseReport: newReport,
-                policy: undefined,
-                isASAPSubmitBetaEnabled: false,
-                allTransactions,
-            });
-            await waitForBatchedUpdates();
-
-            const optimisticViolations = await OnyxUtils.get(`${ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS}${transactionID}`);
-            expect(optimisticViolations).toEqual([]);
-
-            await mockFetch.resume();
-        });
-
-        describe('integration with useOnyx', () => {
-            it('works when violations are read via useOnyx hook', async () => {
-                const transactionID = 'dismissTxn4';
-                const threadReportID = 'threadDismiss4';
-                const mockViolations: TransactionViolation[] = [
-                    {name: CONST.VIOLATIONS.DUPLICATED_TRANSACTION, type: 'warning'},
-                    {name: CONST.VIOLATIONS.MISSING_CATEGORY, type: 'violation'},
-                ];
-
-                mockFetch.pause();
-
-                await Onyx.merge(`${ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS}${transactionID}`, mockViolations);
-
-                const transaction = generateTransaction({transactionID, reportID: FAKE_OLD_REPORT_ID});
-                const iouAction = {
-                    reportActionID: rand64(),
-                    actionName: CONST.REPORT.ACTIONS.TYPE.IOU,
-                    childReportID: threadReportID,
-                    actorAccountID: CURRENT_USER_ID,
-                    created: DateUtils.getDBTime(),
-                    originalMessage: {
-                        IOUReportID: FAKE_OLD_REPORT_ID,
-                        IOUTransactionID: transactionID,
-                        amount: transaction.amount,
-                        currency: transaction.currency,
-                        type: CONST.IOU.REPORT_ACTION_TYPE.CREATE,
-                    },
-                };
-                await Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${FAKE_OLD_REPORT_ID}`, {[iouAction.reportActionID]: iouAction});
-                await Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${threadReportID}`, {});
-                const allTransactions = {[`${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`]: transaction};
-
-                const {result} = renderHook(() => useOnyx(`${ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS}${transactionID}`));
-                await waitFor(() => {
-                    expect(result.current[0]).toBeDefined();
-                });
-
-                await act(async () => {
-                    dismissDuplicateTransactionViolation({
-                        transactionIDs: [transactionID],
-                        dismissedPersonalDetails: {login: 'tester@example.com', accountID: CURRENT_USER_ID},
-                        expenseReport: newReport,
-                        policy: undefined,
-                        isASAPSubmitBetaEnabled: false,
-                        allTransactions,
-                    });
-                    await waitForBatchedUpdates();
-                });
-
-                // The useOnyx hook should reflect the optimistic change
-                await waitFor(() => {
-                    expect(result.current[0]).toEqual([{name: CONST.VIOLATIONS.MISSING_CATEGORY, type: 'violation'}]);
-                });
-
-                const reportActions = await OnyxUtils.get(`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${threadReportID}`);
-                const reportActionValues = Object.values(reportActions ?? {});
-                expect(reportActionValues.length).toBe(1);
-                expect(reportActionValues.at(0)?.actionName).toBe(CONST.REPORT.ACTIONS.TYPE.DISMISSED_VIOLATION);
-
-                await mockFetch.resume();
-            });
-        });
-    });
 });
diff --git a/tests/unit/TransactionUtilsTest.ts b/tests/unit/TransactionUtilsTest.ts
index 271c4b71851c..3067e1b00fdd 100644
--- a/tests/unit/TransactionUtilsTest.ts
+++ b/tests/unit/TransactionUtilsTest.ts
@@ -1,5 +1,4 @@
 import Onyx from 'react-native-onyx';
-import type {OnyxCollection} from 'react-native-onyx';
 import DateUtils from '@libs/DateUtils';
 import {shouldShowBrokenConnectionViolation, shouldShowBrokenConnectionViolationForMultipleTransactions} from '@libs/TransactionUtils';
 import CONST from '@src/CONST';
@@ -7,6 +6,7 @@ import IntlStore from '@src/languages/IntlStore';
 import ONYXKEYS from '@src/ONYXKEYS';
 import type {Attendee} from '@src/types/onyx/IOU';
 import type {CustomUnit, Rate} from '@src/types/onyx/Policy';
+import type {ReportCollectionDataSet} from '@src/types/onyx/Report';
 import type {TransactionCustomUnit} from '@src/types/onyx/Transaction';
 import * as TransactionUtils from '../../src/libs/TransactionUtils';
 import type {Policy, Report, Transaction} from '../../src/types/onyx';
@@ -70,12 +70,12 @@ const secondUserOpenReport = {
     stateNum: CONST.REPORT.STATE_NUM.OPEN,
     statusNum: CONST.REPORT.STATUS_NUM.OPEN,
 };
-const reportCollectionDataSet = {
+const reportCollectionDataSet: ReportCollectionDataSet = {
     [`${ONYXKEYS.COLLECTION.REPORT}${FAKE_OPEN_REPORT_ID}`]: openReport,
     [`${ONYXKEYS.COLLECTION.REPORT}${FAKE_PROCESSING_REPORT_ID}`]: processingReport,
     [`${ONYXKEYS.COLLECTION.REPORT}${FAKE_APPROVED_REPORT_ID}`]: approvedReport,
     [`${ONYXKEYS.COLLECTION.REPORT}${FAKE_OPEN_REPORT_SECOND_USER_ID}`]: secondUserOpenReport,
-} as OnyxCollection<Report>;
+};
 const defaultDistanceRatePolicyID1: Record<string, Rate> = {
     customUnitRateID1: {
         currency: 'USD',
@@ -430,7 +430,6 @@ describe('TransactionUtils', () => {
                         name: CONST.CUSTOM_UNITS.NAME_DISTANCE,
                     },
                 },
-                merchant: '(none)',
             });
 
             expect(TransactionUtils.getTransactionType(transaction)).toBe(CONST.SEARCH.TRANSACTION_TYPE.DISTANCE);
@@ -607,7 +606,7 @@ describe('TransactionUtils', () => {
         it('should return (none) if transaction has no merchant', () => {
             const transaction = generateTransaction();
             const merchant = TransactionUtils.getMerchant(transaction);
-            expect(merchant).toBe('Expense');
+            expect(merchant).toBe('(none)');
         });
 
         it('should return modified merchant if transaction has modified merchant', () => {
@@ -1554,141 +1553,6 @@ describe('TransactionUtils', () => {
         });
     });
 
-    describe('getChildTransactions', () => {
-        const originalTransactionID = 'original-123';
-
-        it('should return child transactions that have a valid report', () => {
-            const childTransaction = generateTransaction({
-                transactionID: 'child-1',
-                reportID: FAKE_OPEN_REPORT_ID,
-                comment: {
-                    originalTransactionID,
-                    source: CONST.IOU.TYPE.SPLIT,
-                },
-            });
-
-            const transactions = {
-                [`${ONYXKEYS.COLLECTION.TRANSACTION}child-1`]: childTransaction,
-            };
-
-            const result = TransactionUtils.getChildTransactions(transactions, reportCollectionDataSet, originalTransactionID);
-
-            expect(result).toHaveLength(1);
-            expect(result.at(0)?.transactionID).toBe('child-1');
-        });
-
-        it('should return split child transactions even if their report was deleted', () => {
-            const childTransaction = generateTransaction({
-                transactionID: 'child-2',
-                reportID: 'deleted-report-id',
-                comment: {
-                    originalTransactionID,
-                    source: CONST.IOU.TYPE.SPLIT,
-                },
-            });
-
-            const transactions = {
-                [`${ONYXKEYS.COLLECTION.TRANSACTION}child-2`]: childTransaction,
-            };
-
-            // Report doesn't exist in reportCollectionDataSet
-            const result = TransactionUtils.getChildTransactions(transactions, reportCollectionDataSet, originalTransactionID);
-
-            expect(result).toHaveLength(1);
-            expect(result.at(0)?.transactionID).toBe('child-2');
-        });
-
-        it('should exclude orphaned transactions with reportID "0" from processing', () => {
-            const orphanedTransaction = generateTransaction({
-                transactionID: 'orphaned-1',
-                reportID: '0',
-                comment: {
-                    originalTransactionID,
-                    source: CONST.IOU.TYPE.SPLIT,
-                },
-            });
-
-            const transactions = {
-                [`${ONYXKEYS.COLLECTION.TRANSACTION}orphaned-1`]: orphanedTransaction,
-            };
-
-            // Orphaned split children should be excluded from getChildTransactions for processing
-            const result = TransactionUtils.getChildTransactions(transactions, reportCollectionDataSet, originalTransactionID);
-
-            expect(result).toHaveLength(0);
-        });
-
-        it('should exclude transactions with pendingAction DELETE', () => {
-            const deletingTransaction = generateTransaction({
-                transactionID: 'deleting-1',
-                reportID: FAKE_OPEN_REPORT_ID,
-                pendingAction: CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE,
-                comment: {
-                    originalTransactionID,
-                    source: CONST.IOU.TYPE.SPLIT,
-                },
-            });
-
-            const transactions = {
-                [`${ONYXKEYS.COLLECTION.TRANSACTION}deleting-1`]: deletingTransaction,
-            };
-
-            const result = TransactionUtils.getChildTransactions(transactions, reportCollectionDataSet, originalTransactionID);
-
-            expect(result).toHaveLength(0);
-        });
-
-        it('should only return transactions matching the originalTransactionID', () => {
-            const matchingChild = generateTransaction({
-                transactionID: 'matching-1',
-                reportID: FAKE_OPEN_REPORT_ID,
-                comment: {
-                    originalTransactionID,
-                    source: CONST.IOU.TYPE.SPLIT,
-                },
-            });
-
-            const nonMatchingChild = generateTransaction({
-                transactionID: 'non-matching-1',
-                reportID: FAKE_OPEN_REPORT_ID,
-                comment: {
-                    originalTransactionID: 'different-original-id',
-                    source: CONST.IOU.TYPE.SPLIT,
-                },
-            });
-
-            const transactions = {
-                [`${ONYXKEYS.COLLECTION.TRANSACTION}matching-1`]: matchingChild,
-                [`${ONYXKEYS.COLLECTION.TRANSACTION}non-matching-1`]: nonMatchingChild,
-            };
-
-            const result = TransactionUtils.getChildTransactions(transactions, reportCollectionDataSet, originalTransactionID);
-
-            expect(result).toHaveLength(1);
-            expect(result.at(0)?.transactionID).toBe('matching-1');
-        });
-
-        it('should include orphaned transactions when includeOrphaned=true', () => {
-            const orphanedTransaction = generateTransaction({
-                transactionID: 'orphaned-1',
-                reportID: '0',
-                comment: {
-                    originalTransactionID,
-                    source: CONST.IOU.TYPE.SPLIT,
-                },
-            });
-
-            const transactions = {
-                [`${ONYXKEYS.COLLECTION.TRANSACTION}orphaned-1`]: orphanedTransaction,
-            };
-
-            const result = TransactionUtils.getChildTransactions(transactions, reportCollectionDataSet, originalTransactionID, true);
-
-            expect(result).toHaveLength(1);
-            expect(result.at(0)?.transactionID).toBe('orphaned-1');
-        });
-    });
-
     describe('getConvertedAmount', () => {
         it('should return the absolute amount if transaction is not from expense report, tracked expense and allowNegative is false', () => {
             const transaction = generateTransaction({
diff --git a/tests/unit/TravelInvoicingUtilsTest.ts b/tests/unit/TravelInvoicingUtilsTest.ts
deleted file mode 100644
index 74486947467d..000000000000
--- a/tests/unit/TravelInvoicingUtilsTest.ts
+++ /dev/null
@@ -1,199 +0,0 @@
-import CONST from '@src/CONST';
-import {
-    getIsTravelInvoicingEnabled,
-    getTravelLimit,
-    getTravelSettlementAccount,
-    getTravelSettlementFrequency,
-    getTravelSpend,
-    hasTravelInvoicingSettlementAccount,
-} from '@src/libs/TravelInvoicingUtils';
-import type {BankAccountList} from '@src/types/onyx';
-import type ExpensifyCardSettings from '@src/types/onyx/ExpensifyCardSettings';
-
-describe('TravelInvoicingUtils', () => {
-    describe('PROGRAM_TRAVEL_US constant', () => {
-        it('Should be defined as TRAVEL_US', () => {
-            expect(CONST.TRAVEL.PROGRAM_TRAVEL_US).toBe('TRAVEL_US');
-        });
-    });
-
-    describe('getIsTravelInvoicingEnabled', () => {
-        it('Should return false when cardSettings is undefined', () => {
-            const result = getIsTravelInvoicingEnabled(undefined);
-            expect(result).toBe(false);
-        });
-
-        it('Should return false when cardSettings is null', () => {
-            // Using undefined since OnyxEntry doesn't accept null
-            const result = getIsTravelInvoicingEnabled(undefined);
-            expect(result).toBe(false);
-        });
-
-        it('Should return false when paymentBankAccountID is not set', () => {
-            const cardSettings = {} as ExpensifyCardSettings;
-            const result = getIsTravelInvoicingEnabled(cardSettings);
-            expect(result).toBe(false);
-        });
-
-        it('Should return false when paymentBankAccountID is 0', () => {
-            const cardSettings = {paymentBankAccountID: 0} as ExpensifyCardSettings;
-            const result = getIsTravelInvoicingEnabled(cardSettings);
-            expect(result).toBe(false);
-        });
-
-        it('Should return true when paymentBankAccountID is set to a valid value', () => {
-            const cardSettings = {paymentBankAccountID: 12345} as ExpensifyCardSettings;
-            const result = getIsTravelInvoicingEnabled(cardSettings);
-            expect(result).toBe(true);
-        });
-    });
-
-    describe('hasTravelInvoicingSettlementAccount', () => {
-        it('Should return false when cardSettings is undefined', () => {
-            const result = hasTravelInvoicingSettlementAccount(undefined);
-            expect(result).toBe(false);
-        });
-
-        it('Should return false when paymentBankAccountID is not set', () => {
-            const cardSettings = {} as ExpensifyCardSettings;
-            const result = hasTravelInvoicingSettlementAccount(cardSettings);
-            expect(result).toBe(false);
-        });
-
-        it('Should return false when paymentBankAccountID is DEFAULT_NUMBER_ID (0)', () => {
-            const cardSettings = {paymentBankAccountID: CONST.DEFAULT_NUMBER_ID} as ExpensifyCardSettings;
-            const result = hasTravelInvoicingSettlementAccount(cardSettings);
-            expect(result).toBe(false);
-        });
-
-        it('Should return true when paymentBankAccountID is a valid non-zero value', () => {
-            const cardSettings = {paymentBankAccountID: 67890} as ExpensifyCardSettings;
-            const result = hasTravelInvoicingSettlementAccount(cardSettings);
-            expect(result).toBe(true);
-        });
-    });
-
-    describe('getTravelLimit', () => {
-        it('Should return 0 when cardSettings is undefined', () => {
-            const result = getTravelLimit(undefined);
-            expect(result).toBe(0);
-        });
-
-        it('Should return 0 when remainingLimit is not set', () => {
-            const cardSettings = {} as ExpensifyCardSettings;
-            const result = getTravelLimit(cardSettings);
-            expect(result).toBe(0);
-        });
-
-        it('Should return the remainingLimit value when set', () => {
-            const cardSettings = {remainingLimit: 50000} as ExpensifyCardSettings;
-            const result = getTravelLimit(cardSettings);
-            expect(result).toBe(50000);
-        });
-    });
-
-    describe('getTravelSpend', () => {
-        it('Should return 0 when cardSettings is undefined', () => {
-            const result = getTravelSpend(undefined);
-            expect(result).toBe(0);
-        });
-
-        it('Should return 0 when currentBalance is not set', () => {
-            const cardSettings = {} as ExpensifyCardSettings;
-            const result = getTravelSpend(cardSettings);
-            expect(result).toBe(0);
-        });
-
-        it('Should return the currentBalance value when set', () => {
-            const cardSettings = {currentBalance: 25000} as ExpensifyCardSettings;
-            const result = getTravelSpend(cardSettings);
-            expect(result).toBe(25000);
-        });
-    });
-
-    describe('getTravelSettlementFrequency', () => {
-        it('Should return daily when cardSettings is undefined', () => {
-            const result = getTravelSettlementFrequency(undefined);
-            expect(result).toBe(CONST.EXPENSIFY_CARD.FREQUENCY_SETTING.DAILY);
-        });
-
-        it('Should return daily when monthlySettlementDate is not set', () => {
-            const cardSettings = {} as ExpensifyCardSettings;
-            const result = getTravelSettlementFrequency(cardSettings);
-            expect(result).toBe(CONST.EXPENSIFY_CARD.FREQUENCY_SETTING.DAILY);
-        });
-
-        it('Should return monthly when monthlySettlementDate is set', () => {
-            const cardSettings = {monthlySettlementDate: new Date('2024-01-15')} as ExpensifyCardSettings;
-            const result = getTravelSettlementFrequency(cardSettings);
-            expect(result).toBe(CONST.EXPENSIFY_CARD.FREQUENCY_SETTING.MONTHLY);
-        });
-    });
-
-    describe('getTravelSettlementAccount', () => {
-        const mockBankAccountList: BankAccountList = {
-            bankAccountID: {
-                bankCurrency: 'USD',
-                bankCountry: 'US',
-                accountData: {
-                    addressName: 'Test Company',
-                    accountNumber: '****1234',
-                    routingNumber: '123456789',
-                    bankAccountID: 12345,
-                },
-            },
-        };
-
-        it('Should return undefined when cardSettings is undefined', () => {
-            const result = getTravelSettlementAccount(undefined, mockBankAccountList);
-            expect(result).toBeUndefined();
-        });
-
-        it('Should return undefined when paymentBankAccountID is not set', () => {
-            const cardSettings = {} as ExpensifyCardSettings;
-            const result = getTravelSettlementAccount(cardSettings, mockBankAccountList);
-            expect(result).toBeUndefined();
-        });
-
-        it('Should use paymentBankAccountAddressName when available', () => {
-            const cardSettings = {
-                paymentBankAccountID: 12345,
-                paymentBankAccountAddressName: 'Custom Name',
-                paymentBankAccountNumber: '****5678',
-            } as ExpensifyCardSettings;
-            const result = getTravelSettlementAccount(cardSettings, mockBankAccountList);
-            expect(result).toBeDefined();
-            expect(result?.displayName).toBe('Custom Name');
-            expect(result?.last4).toBe('5678');
-        });
-
-        it('Should fallback to bank account data when paymentBankAccountAddressName is not set', () => {
-            const cardSettings = {
-                paymentBankAccountID: 'bankAccountID' as unknown as number,
-            } as ExpensifyCardSettings;
-            const result = getTravelSettlementAccount(cardSettings, mockBankAccountList);
-            expect(result).toBeDefined();
-            expect(result?.displayName).toBe('Test Company');
-            expect(result?.last4).toBe('1234');
-        });
-
-        it('Should return bankAccountID in the result', () => {
-            const cardSettings = {
-                paymentBankAccountID: 12345,
-            } as ExpensifyCardSettings;
-            const result = getTravelSettlementAccount(cardSettings, mockBankAccountList);
-            expect(result).toBeDefined();
-            expect(result?.bankAccountID).toBe(12345);
-        });
-
-        it('Should handle missing bank account in list gracefully', () => {
-            const cardSettings = {
-                paymentBankAccountID: 99999,
-            } as ExpensifyCardSettings;
-            const result = getTravelSettlementAccount(cardSettings, mockBankAccountList);
-            expect(result).toBeDefined();
-            expect(result?.displayName).toBe('');
-            expect(result?.last4).toBe('');
-        });
-    });
-});
diff --git a/tests/unit/ViolationUtilsTest.ts b/tests/unit/ViolationUtilsTest.ts
index 1f30b815ec44..600411679bf6 100644
--- a/tests/unit/ViolationUtilsTest.ts
+++ b/tests/unit/ViolationUtilsTest.ts
@@ -9,12 +9,6 @@ import type {Policy, PolicyCategories, PolicyTagLists, Report, Transaction, Tran
 import type {TransactionCollectionDataSet} from '@src/types/onyx/Transaction';
 import {translateLocal} from '../utils/TestHelper';
 
-// Mock getCurrentUserEmail from Report actions
-const MOCK_CURRENT_USER_EMAIL = 'test@expensify.com';
-jest.mock('@libs/actions/Report', () => ({
-    getCurrentUserEmail: jest.fn(() => MOCK_CURRENT_USER_EMAIL),
-}));
-
 const categoryOutOfPolicyViolation = {
     name: CONST.VIOLATIONS.CATEGORY_OUT_OF_POLICY,
     type: CONST.VIOLATION_TYPES.VIOLATION,
@@ -605,203 +599,6 @@ describe('getViolationsOnyxData', () => {
             expect(result.value).toEqual(expect.arrayContaining([missingDepartmentTag, missingRegionTag, missingProjectTag]));
         });
     });
-
-    describe('missingAttendees violation', () => {
-        const missingAttendeesViolation = {
-            name: CONST.VIOLATIONS.MISSING_ATTENDEES,
-            type: CONST.VIOLATION_TYPES.VIOLATION,
-            showInReview: true,
-        };
-
-        const ownerAccountID = 123;
-        const otherAccountID = 456;
-
-        let iouReport: Report;
-
-        beforeEach(() => {
-            policy.type = CONST.POLICY.TYPE.CORPORATE;
-            policy.isAttendeeTrackingEnabled = true;
-            policyCategories = {
-                Meals: {
-                    name: 'Meals',
-                    enabled: true,
-                    areAttendeesRequired: true,
-                },
-            };
-            transaction.category = 'Meals';
-            iouReport = {
-                reportID: '1234',
-                ownerAccountID,
-            } as Report;
-        });
-
-        (CONST.IS_ATTENDEES_REQUIRED_FEATURE_DISABLED ? it.skip : it)('should add missingAttendees violation when no attendees are present', () => {
-            transaction.comment = {attendees: []};
-            const result = ViolationsUtils.getViolationsOnyxData(transaction, transactionViolations, policy, policyTags, policyCategories, false, false, false, iouReport);
-            expect(result.value).toEqual(expect.arrayContaining([missingAttendeesViolation]));
-        });
-
-        (CONST.IS_ATTENDEES_REQUIRED_FEATURE_DISABLED ? it.skip : it)('should add missingAttendees violation when only owner is an attendee', () => {
-            transaction.comment = {
-                attendees: [{email: 'owner@example.com', displayName: 'Owner', avatarUrl: '', accountID: ownerAccountID}],
-            };
-            const result = ViolationsUtils.getViolationsOnyxData(transaction, transactionViolations, policy, policyTags, policyCategories, false, false, false, iouReport);
-            expect(result.value).toEqual(expect.arrayContaining([missingAttendeesViolation]));
-        });
-
-        it('should not add missingAttendees violation when there is at least one non-owner attendee', () => {
-            transaction.comment = {
-                attendees: [
-                    {email: 'owner@example.com', displayName: 'Owner', avatarUrl: '', accountID: ownerAccountID},
-                    {email: 'other@example.com', displayName: 'Other', avatarUrl: '', accountID: otherAccountID},
-                ],
-            };
-            const result = ViolationsUtils.getViolationsOnyxData(transaction, transactionViolations, policy, policyTags, policyCategories, false, false, false, iouReport);
-            expect(result.value).not.toEqual(expect.arrayContaining([missingAttendeesViolation]));
-        });
-
-        it('should remove missingAttendees violation when attendees are added', () => {
-            transactionViolations = [missingAttendeesViolation];
-            transaction.comment = {
-                attendees: [
-                    {email: 'owner@example.com', displayName: 'Owner', avatarUrl: '', accountID: ownerAccountID},
-                    {email: 'other@example.com', displayName: 'Other', avatarUrl: '', accountID: otherAccountID},
-                ],
-            };
-            const result = ViolationsUtils.getViolationsOnyxData(transaction, transactionViolations, policy, policyTags, policyCategories, false, false, false, iouReport);
-            expect(result.value).not.toEqual(expect.arrayContaining([missingAttendeesViolation]));
-        });
-
-        it('should not add missingAttendees violation when attendee tracking is disabled', () => {
-            policy.isAttendeeTrackingEnabled = false;
-            transaction.comment = {attendees: []};
-            const result = ViolationsUtils.getViolationsOnyxData(transaction, transactionViolations, policy, policyTags, policyCategories, false, false, false, iouReport);
-            expect(result.value).not.toEqual(expect.arrayContaining([missingAttendeesViolation]));
-        });
-
-        it('should not add missingAttendees violation when category does not require attendees', () => {
-            policyCategories.Meals.areAttendeesRequired = false;
-            transaction.comment = {attendees: []};
-            const result = ViolationsUtils.getViolationsOnyxData(transaction, transactionViolations, policy, policyTags, policyCategories, false, false, false, iouReport);
-            expect(result.value).not.toEqual(expect.arrayContaining([missingAttendeesViolation]));
-        });
-
-        describe('optimistic / offline scenarios (iouReport is undefined)', () => {
-            // In offline scenarios, iouReport is undefined so we can't get ownerAccountID.
-            // The code falls back to using getCurrentUserEmail() to identify the owner by login/email.
-            (CONST.IS_ATTENDEES_REQUIRED_FEATURE_DISABLED ? it.skip : it)('should correctly calculate violation when iouReport is undefined but attendees have matching email', () => {
-                // When iouReport is undefined, we use getCurrentUserEmail() as fallback
-                // If only the current user (matching MOCK_CURRENT_USER_EMAIL) is an attendee, violation should show
-                transactionViolations = [];
-                transaction.comment = {
-                    attendees: [{email: MOCK_CURRENT_USER_EMAIL, displayName: 'Test User', avatarUrl: ''}],
-                };
-                const result = ViolationsUtils.getViolationsOnyxData(transaction, transactionViolations, policy, policyTags, policyCategories, false, false, false, undefined);
-                // Violation should be added since the only attendee is the current user (owner)
-                expect(result.value).toEqual(expect.arrayContaining([missingAttendeesViolation]));
-            });
-
-            it('should not add violation when iouReport is undefined but there are non-owner attendees (by email)', () => {
-                // When there are attendees with different emails than the current user, no violation
-                transactionViolations = [];
-                transaction.comment = {
-                    attendees: [
-                        {email: MOCK_CURRENT_USER_EMAIL, displayName: 'Test User', avatarUrl: ''},
-                        {email: 'other@example.com', displayName: 'Other User', avatarUrl: ''},
-                    ],
-                };
-                const result = ViolationsUtils.getViolationsOnyxData(transaction, transactionViolations, policy, policyTags, policyCategories, false, false, false, undefined);
-                // Violation should NOT be added since there's a non-owner attendee
-                expect(result.value).not.toEqual(expect.arrayContaining([missingAttendeesViolation]));
-            });
-
-            it('should remove violation when non-owner attendee is added (offline)', () => {
-                // If violation existed and a non-owner attendee is added, violation should be removed
-                transactionViolations = [missingAttendeesViolation];
-                transaction.comment = {
-                    attendees: [
-                        {email: MOCK_CURRENT_USER_EMAIL, displayName: 'Test User', avatarUrl: ''},
-                        {email: 'other@example.com', displayName: 'Other User', avatarUrl: ''},
-                    ],
-                };
-                const result = ViolationsUtils.getViolationsOnyxData(transaction, transactionViolations, policy, policyTags, policyCategories, false, false, false, undefined);
-                // Violation should be removed
-                expect(result.value).not.toEqual(expect.arrayContaining([missingAttendeesViolation]));
-            });
-
-            (CONST.IS_ATTENDEES_REQUIRED_FEATURE_DISABLED ? it.skip : it)('should preserve violation when only owner attendee remains (offline)', () => {
-                // If violation existed and only owner attendee remains, violation stays
-                transactionViolations = [missingAttendeesViolation];
-                transaction.comment = {
-                    attendees: [{email: MOCK_CURRENT_USER_EMAIL, displayName: 'Test User', avatarUrl: ''}],
-                };
-                const result = ViolationsUtils.getViolationsOnyxData(transaction, transactionViolations, policy, policyTags, policyCategories, false, false, false, undefined);
-                // Violation should be preserved
-                expect(result.value).toEqual(expect.arrayContaining([missingAttendeesViolation]));
-            });
-        });
-
-        describe('fallback case (iouReport undefined AND getCurrentUserEmail returns falsy)', () => {
-            // This tests the edge case where we cannot identify the owner at all:
-            // - ownerAccountID is undefined (iouReport unavailable)
-            // - getCurrentUserEmail() returns falsy (no current user email)
-            // In this case, we assume owner is one of the attendees, so we need at least 2 attendees
-            // for there to be a non-owner attendee.
-
-            beforeEach(() => {
-                // Mock getCurrentUserEmail to return empty string
-                jest.spyOn(require('@libs/actions/Report'), 'getCurrentUserEmail').mockReturnValue('');
-            });
-
-            afterEach(() => {
-                jest.restoreAllMocks();
-            });
-
-            (CONST.IS_ATTENDEES_REQUIRED_FEATURE_DISABLED ? it.skip : it)("should add missingAttendees violation when no attendees are present (can't identify owner)", () => {
-                transactionViolations = [];
-                transaction.comment = {attendees: []};
-                const result = ViolationsUtils.getViolationsOnyxData(transaction, transactionViolations, policy, policyTags, policyCategories, false, false, false, undefined);
-                // With 0 attendees, attendeesMinusOwnerCount = Math.max(0, 0 - 1) = 0, violation should be added
-                expect(result.value).toEqual(expect.arrayContaining([missingAttendeesViolation]));
-            });
-
-            (CONST.IS_ATTENDEES_REQUIRED_FEATURE_DISABLED ? it.skip : it)('should add missingAttendees violation when only 1 attendee exists (assumed to be owner)', () => {
-                transactionViolations = [];
-                transaction.comment = {
-                    attendees: [{email: 'anyone@example.com', displayName: 'Someone', avatarUrl: ''}],
-                };
-                const result = ViolationsUtils.getViolationsOnyxData(transaction, transactionViolations, policy, policyTags, policyCategories, false, false, false, undefined);
-                // With 1 attendee, attendeesMinusOwnerCount = Math.max(0, 1 - 1) = 0, violation should be added
-                expect(result.value).toEqual(expect.arrayContaining([missingAttendeesViolation]));
-            });
-
-            it('should not add missingAttendees violation when 2+ attendees exist (assumes owner is one of them)', () => {
-                transactionViolations = [];
-                transaction.comment = {
-                    attendees: [
-                        {email: 'person1@example.com', displayName: 'Person 1', avatarUrl: ''},
-                        {email: 'person2@example.com', displayName: 'Person 2', avatarUrl: ''},
-                    ],
-                };
-                const result = ViolationsUtils.getViolationsOnyxData(transaction, transactionViolations, policy, policyTags, policyCategories, false, false, false, undefined);
-                // With 2 attendees, attendeesMinusOwnerCount = Math.max(0, 2 - 1) = 1, no violation
-                expect(result.value).not.toEqual(expect.arrayContaining([missingAttendeesViolation]));
-            });
-
-            it('should remove missingAttendees violation when second attendee is added', () => {
-                transactionViolations = [missingAttendeesViolation];
-                transaction.comment = {
-                    attendees: [
-                        {email: 'person1@example.com', displayName: 'Person 1', avatarUrl: ''},
-                        {email: 'person2@example.com', displayName: 'Person 2', avatarUrl: ''},
-                    ],
-                };
-                const result = ViolationsUtils.getViolationsOnyxData(transaction, transactionViolations, policy, policyTags, policyCategories, false, false, false, undefined);
-                // Violation should be removed since we now have 2 attendees
-                expect(result.value).not.toEqual(expect.arrayContaining([missingAttendeesViolation]));
-            });
-        });
-    });
 });
 
 const getFakeTransaction = (transactionID: string, comment?: Transaction['comment']) => ({
diff --git a/tests/unit/geodesicDistanceTest.ts b/tests/unit/geodesicDistanceTest.ts
deleted file mode 100644
index 8da8f9fc4f65..000000000000
--- a/tests/unit/geodesicDistanceTest.ts
+++ /dev/null
@@ -1,38 +0,0 @@
-import geodesicDistance from '@src/utils/geodesicDistance';
-
-describe('geodesicDistance', () => {
-    it('should return 0 when the two points are identical', () => {
-        const point = {lat: 52.2297, long: 21.0122};
-        const result = geodesicDistance(point, point);
-        expect(result).toEqual(0);
-    });
-
-    it('should calculate the distance of 1 degree latitude', () => {
-        // Calculation: (Earth Radius * 2 * PI) / 360
-        // With R = 6371008.8, 1 degree is approx 111,195.08 meters
-        const p1 = {lat: 0, long: 0};
-        const p2 = {lat: 1, long: 0};
-
-        const result = geodesicDistance(p1, p2);
-        expect(result).toBeCloseTo(111195.08);
-    });
-
-    it('should calculate the distance of 1 degree longitude at the equator', () => {
-        // At the equator, 1 degree longitude equals 1 degree latitude
-        const p1 = {lat: 0, long: 0};
-        const p2 = {lat: 0, long: 1};
-
-        const result = geodesicDistance(p1, p2);
-        expect(result).toBeCloseTo(111195.08);
-    });
-
-    it('should be commutative (distance A->B equals distance B->A)', () => {
-        const p1 = {lat: 40.7128, long: -74.006}; // NYC
-        const p2 = {lat: 51.5074, long: -0.1278}; // London
-
-        const dist1 = geodesicDistance(p1, p2);
-        const dist2 = geodesicDistance(p2, p1);
-
-        expect(dist1).toEqual(dist2);
-    });
-});
diff --git a/tests/unit/hooks/useAllTransactions.test.ts b/tests/unit/hooks/useAllTransactions.test.ts
index 0b4b323d6e79..c278c43f9d79 100644
--- a/tests/unit/hooks/useAllTransactions.test.ts
+++ b/tests/unit/hooks/useAllTransactions.test.ts
@@ -6,11 +6,11 @@ import ONYXKEYS from '@src/ONYXKEYS';
 import type {SearchResults} from '@src/types/onyx';
 import createRandomTransaction from '../../utils/collections/transaction';
 
-let mockCurrentSearchResults: SearchResults | undefined;
+const mockCurrentSearchHash = 12345;
 
 jest.mock('@components/Search/SearchContext', () => ({
     useSearchContext: () => ({
-        currentSearchResults: mockCurrentSearchResults,
+        currentSearchHash: mockCurrentSearchHash,
     }),
 }));
 
@@ -24,7 +24,6 @@ describe('useAllTransactions', () => {
     beforeEach(() => {
         jest.clearAllMocks();
         Onyx.clear();
-        mockCurrentSearchResults = undefined;
     });
 
     it('should return all transactions from collection when no search results', async () => {
@@ -53,7 +52,7 @@ describe('useAllTransactions', () => {
         transaction1.transactionID = 'txn1';
 
         await Onyx.merge(`${ONYXKEYS.COLLECTION.TRANSACTION}txn1`, transaction1);
-        mockCurrentSearchResults = {
+        await Onyx.merge(`${ONYXKEYS.COLLECTION.SNAPSHOT}${mockCurrentSearchHash}`, {
             search: {
                 offset: 0,
                 type: CONST.SEARCH.DATA_TYPES.EXPENSE,
@@ -63,7 +62,7 @@ describe('useAllTransactions', () => {
                 isLoading: false,
             },
             data: undefined,
-        } as unknown as SearchResults;
+        });
 
         const {result} = renderHook(() => useAllTransactions());
 
@@ -82,7 +81,7 @@ describe('useAllTransactions', () => {
         searchTransaction.transactionID = 'searchTxn1';
         collectionTransaction.transactionID = 'collectionTxn1';
 
-        mockCurrentSearchResults = {
+        await Onyx.merge(`${ONYXKEYS.COLLECTION.SNAPSHOT}${mockCurrentSearchHash}`, {
             search: {
                 offset: 0,
                 type: CONST.SEARCH.DATA_TYPES.EXPENSE,
@@ -94,7 +93,7 @@ describe('useAllTransactions', () => {
             data: {
                 [`${ONYXKEYS.COLLECTION.TRANSACTION}searchTxn1`]: searchTransaction,
             },
-        } as unknown as SearchResults;
+        } as unknown as SearchResults);
         await Onyx.merge(`${ONYXKEYS.COLLECTION.TRANSACTION}collectionTxn1`, collectionTransaction);
 
         const {result} = renderHook(() => useAllTransactions());
@@ -118,7 +117,7 @@ describe('useAllTransactions', () => {
         searchTransaction.amount = 1000;
         collectionTransaction.amount = 2000;
 
-        mockCurrentSearchResults = {
+        await Onyx.merge(`${ONYXKEYS.COLLECTION.SNAPSHOT}${mockCurrentSearchHash}`, {
             search: {
                 offset: 0,
                 type: CONST.SEARCH.DATA_TYPES.EXPENSE,
@@ -130,7 +129,7 @@ describe('useAllTransactions', () => {
             data: {
                 [`${ONYXKEYS.COLLECTION.TRANSACTION}txn1`]: searchTransaction,
             },
-        } as unknown as SearchResults;
+        } as unknown as SearchResults);
         await Onyx.merge(`${ONYXKEYS.COLLECTION.TRANSACTION}txn1`, collectionTransaction);
 
         const {result} = renderHook(() => useAllTransactions());
@@ -147,7 +146,7 @@ describe('useAllTransactions', () => {
         const transaction = createRandomTransaction(1);
         transaction.transactionID = 'txn1';
 
-        mockCurrentSearchResults = {
+        await Onyx.merge(`${ONYXKEYS.COLLECTION.SNAPSHOT}${mockCurrentSearchHash}`, {
             search: {
                 offset: 0,
                 type: CONST.SEARCH.DATA_TYPES.EXPENSE,
@@ -160,7 +159,7 @@ describe('useAllTransactions', () => {
                 [`${ONYXKEYS.COLLECTION.TRANSACTION}txn1`]: transaction,
                 [`${ONYXKEYS.COLLECTION.REPORT}report1`]: {reportID: 'report1'},
             },
-        } as unknown as SearchResults;
+        } as unknown as SearchResults);
 
         const {result} = renderHook(() => useAllTransactions());
 
@@ -176,7 +175,7 @@ describe('useAllTransactions', () => {
     });
 
     it('should handle empty collection and empty search results', async () => {
-        mockCurrentSearchResults = {
+        await Onyx.merge(`${ONYXKEYS.COLLECTION.SNAPSHOT}${mockCurrentSearchHash}`, {
             search: {
                 offset: 0,
                 type: CONST.SEARCH.DATA_TYPES.EXPENSE,
@@ -186,7 +185,7 @@ describe('useAllTransactions', () => {
                 isLoading: false,
             },
             data: {},
-        } as unknown as SearchResults;
+        });
 
         const {result} = renderHook(() => useAllTransactions());
 
@@ -201,7 +200,7 @@ describe('useAllTransactions', () => {
         const transaction = createRandomTransaction(1);
         transaction.transactionID = 'txn1';
 
-        mockCurrentSearchResults = {
+        await Onyx.merge(`${ONYXKEYS.COLLECTION.SNAPSHOT}${mockCurrentSearchHash}`, {
             search: {
                 offset: 0,
                 type: CONST.SEARCH.DATA_TYPES.EXPENSE,
@@ -215,7 +214,7 @@ describe('useAllTransactions', () => {
                 [`${ONYXKEYS.COLLECTION.TRANSACTION}txn2`]: null,
                 [`${ONYXKEYS.COLLECTION.TRANSACTION}txn3`]: undefined,
             },
-        } as unknown as SearchResults;
+        } as unknown as SearchResults);
 
         const {result} = renderHook(() => useAllTransactions());
 
@@ -257,16 +256,11 @@ describe('useAllTransactions', () => {
         });
     });
 
-    it('should return search transactions when search results are available', async () => {
-        // This test verifies that search results transactions are returned
-        // Note: Since the mock is static, we can't test reactive updates to search results
-        // Reactive updates are tested via the collection transactions test
+    it('should update when search results change', async () => {
         const transaction1 = createRandomTransaction(1);
-        const transaction2 = createRandomTransaction(2);
         transaction1.transactionID = 'txn1';
-        transaction2.transactionID = 'txn2';
 
-        mockCurrentSearchResults = {
+        await Onyx.merge(`${ONYXKEYS.COLLECTION.SNAPSHOT}${mockCurrentSearchHash}`, {
             search: {
                 offset: 0,
                 type: CONST.SEARCH.DATA_TYPES.EXPENSE,
@@ -277,14 +271,36 @@ describe('useAllTransactions', () => {
             },
             data: {
                 [`${ONYXKEYS.COLLECTION.TRANSACTION}txn1`]: transaction1,
-                [`${ONYXKEYS.COLLECTION.TRANSACTION}txn2`]: transaction2,
             },
-        } as unknown as SearchResults;
+        } as unknown as SearchResults);
 
         const {result} = renderHook(() => useAllTransactions());
 
         await waitFor(() => {
             expect(result.current).toBeDefined();
+            expect(Object.keys(result.current ?? {}).length).toBe(1);
+        });
+
+        // Update search results
+        const transaction2 = createRandomTransaction(2);
+        transaction2.transactionID = 'txn2';
+
+        await Onyx.merge(`${ONYXKEYS.COLLECTION.SNAPSHOT}${mockCurrentSearchHash}`, {
+            search: {
+                offset: 0,
+                type: CONST.SEARCH.DATA_TYPES.EXPENSE,
+                status: CONST.SEARCH.STATUS.EXPENSE.ALL,
+                hasMoreResults: false,
+                hasResults: true,
+                isLoading: false,
+            },
+            data: {
+                [`${ONYXKEYS.COLLECTION.TRANSACTION}txn1`]: transaction1,
+                [`${ONYXKEYS.COLLECTION.TRANSACTION}txn2`]: transaction2,
+            },
+        } as unknown as SearchResults);
+
+        await waitFor(() => {
             expect(Object.keys(result.current ?? {}).length).toBe(2);
         });
 
@@ -294,12 +310,30 @@ describe('useAllTransactions', () => {
         });
     });
 
-    it('should return collection transactions when search results are undefined', async () => {
+    it('should use default search hash when context hash is not available', async () => {
         const transaction = createRandomTransaction(1);
         transaction.transactionID = 'txn1';
+        const searchHash = CONST.DEFAULT_NUMBER_ID;
+
+        // Mock context without search hash
+        jest.doMock('@components/Search/SearchContext', () => ({
+            useSearchContext: () => ({
+                currentSearchHash: undefined,
+            }),
+        }));
 
-        // Keep mockCurrentSearchResults as undefined (set in beforeEach)
         await Onyx.merge(`${ONYXKEYS.COLLECTION.TRANSACTION}txn1`, transaction);
+        await Onyx.merge(`${ONYXKEYS.COLLECTION.SNAPSHOT}${searchHash}`, {
+            search: {
+                offset: 0,
+                type: CONST.SEARCH.DATA_TYPES.EXPENSE,
+                status: CONST.SEARCH.STATUS.EXPENSE.ALL,
+                hasMoreResults: false,
+                hasResults: false,
+                isLoading: false,
+            },
+            data: {},
+        });
 
         const {result} = renderHook(() => useAllTransactions());
 
diff --git a/tests/unit/hooks/useAssignCard.test.ts b/tests/unit/hooks/useAssignCard.test.ts
deleted file mode 100644
index a4e4503f8dac..000000000000
--- a/tests/unit/hooks/useAssignCard.test.ts
+++ /dev/null
@@ -1,261 +0,0 @@
-/* eslint-disable @typescript-eslint/naming-convention */
-import {renderHook} from '@testing-library/react-native';
-import Onyx from 'react-native-onyx';
-import useAssignCard from '@hooks/useAssignCard';
-import useCardFeeds from '@hooks/useCardFeeds';
-import useIsAllowedToIssueCompanyCard from '@hooks/useIsAllowedToIssueCompanyCard';
-import useNetwork from '@hooks/useNetwork';
-import useOnyx from '@hooks/useOnyx';
-import usePolicy from '@hooks/usePolicy';
-import CONST from '@src/CONST';
-import ONYXKEYS from '@src/ONYXKEYS';
-import type {CompanyCardFeed, CompanyCardFeedWithDomainID} from '@src/types/onyx/CardFeeds';
-import waitForBatchedUpdates from '../../utils/waitForBatchedUpdates';
-
-const mockPolicyID = 'policy123';
-const workspaceAccountID = 11111111;
-
-// Custom feed (VCF) - commercial feed
-const mockCustomFeed: CompanyCardFeedWithDomainID = `${CONST.COMPANY_CARD.FEED_BANK_NAME.VISA}#${workspaceAccountID}` as CompanyCardFeedWithDomainID;
-
-// Direct feed (Plaid) - has accountList
-const mockPlaidFeed: CompanyCardFeedWithDomainID = `plaid.ins_123#${workspaceAccountID}` as CompanyCardFeedWithDomainID;
-
-const mockCustomFeedData = {
-    [mockCustomFeed]: {
-        liabilityType: 'personal',
-        pending: false,
-        domainID: workspaceAccountID,
-        customFeedName: 'Custom VCF feed',
-        feed: CONST.COMPANY_CARD.FEED_BANK_NAME.VISA as CompanyCardFeed,
-    },
-};
-
-const mockPlaidFeedData = {
-    [mockPlaidFeed]: {
-        liabilityType: 'corporate',
-        pending: false,
-        domainID: workspaceAccountID,
-        customFeedName: 'Plaid Bank cards',
-        feed: 'plaid.ins_123' as CompanyCardFeed,
-        accountList: ['Plaid Checking 0000', 'Plaid Credit Card 3333'],
-        credentials: 'xxxxx',
-        expiration: Date.now() / 1000 + 86400, // expires tomorrow
-    },
-};
-
-const mockPolicy = {
-    id: mockPolicyID,
-    workspaceAccountID,
-    employeeList: {
-        'user1@example.com': {email: 'user1@example.com'},
-        'user2@example.com': {email: 'user2@example.com'},
-    },
-};
-
-// Mock useOnyx hook
-jest.mock('@hooks/useOnyx', () => ({
-    __esModule: true,
-    default: jest.fn(() => [undefined, {status: 'loaded'}]),
-}));
-
-// Mock all the hooks
-jest.mock('@hooks/useCardFeeds', () => ({
-    __esModule: true,
-    default: jest.fn(),
-}));
-
-jest.mock('@hooks/usePolicy', () => ({
-    __esModule: true,
-    default: jest.fn(),
-}));
-
-jest.mock('@hooks/useNetwork', () => ({
-    __esModule: true,
-    default: jest.fn(),
-}));
-
-jest.mock('@hooks/useIsAllowedToIssueCompanyCard', () => ({
-    __esModule: true,
-    default: jest.fn(),
-}));
-
-jest.mock('@libs/Navigation/Navigation', () => ({
-    __esModule: true,
-    default: {
-        navigate: jest.fn(),
-        setNavigationActionToMicrotaskQueue: jest.fn((callback: () => void) => callback()),
-    },
-}));
-
-jest.mock('@libs/actions/CompanyCards', () => ({
-    clearAddNewCardFlow: jest.fn(),
-    clearAssignCardStepAndData: jest.fn(),
-    setAssignCardStepAndData: jest.fn(),
-    setAddNewCompanyCardStepAndData: jest.fn(),
-    openPolicyCompanyCardsPage: jest.fn(),
-}));
-
-jest.mock('@libs/actions/Plaid', () => ({
-    importPlaidAccounts: jest.fn(),
-}));
-
-// Mock the DelegateNoAccessContext
-jest.mock('@components/DelegateNoAccessModalProvider');
-
-describe('useAssignCard', () => {
-    const mockSetShouldShowOfflineModal = jest.fn();
-
-    beforeAll(() => {
-        Onyx.init({keys: ONYXKEYS});
-    });
-
-    beforeEach(async () => {
-        await Onyx.clear();
-        await waitForBatchedUpdates();
-        jest.clearAllMocks();
-
-        // Default mock returns
-        (usePolicy as jest.Mock).mockReturnValue(mockPolicy);
-        (useNetwork as jest.Mock).mockReturnValue({isOffline: false, onReconnect: jest.fn()});
-        (useIsAllowedToIssueCompanyCard as jest.Mock).mockReturnValue(true);
-        (useOnyx as jest.Mock).mockReturnValue([undefined, {status: 'loaded'}]);
-    });
-
-    afterEach(async () => {
-        jest.restoreAllMocks();
-        await Onyx.clear();
-    });
-
-    describe('isAssigningCardDisabled state', () => {
-        it('should return isAssigningCardDisabled true when feed data is pending', () => {
-            const pendingFeedData = {
-                [mockCustomFeed]: {
-                    ...mockCustomFeedData[mockCustomFeed],
-                    pending: true,
-                },
-            };
-            (useCardFeeds as jest.Mock).mockReturnValue([pendingFeedData, {status: 'loaded'}, undefined]);
-
-            const {result} = renderHook(() =>
-                useAssignCard({
-                    feedName: mockCustomFeed,
-                    policyID: mockPolicyID,
-                    setShouldShowOfflineModal: mockSetShouldShowOfflineModal,
-                }),
-            );
-
-            expect(result.current.isAssigningCardDisabled).toBe(true);
-        });
-
-        it('should return isAssigningCardDisabled true when user is not allowed to issue cards', () => {
-            (useCardFeeds as jest.Mock).mockReturnValue([mockCustomFeedData, {status: 'loaded'}, undefined]);
-            (useIsAllowedToIssueCompanyCard as jest.Mock).mockReturnValue(false);
-
-            const {result} = renderHook(() =>
-                useAssignCard({
-                    feedName: mockCustomFeed,
-                    policyID: mockPolicyID,
-                    setShouldShowOfflineModal: mockSetShouldShowOfflineModal,
-                }),
-            );
-
-            expect(result.current.isAssigningCardDisabled).toBe(true);
-        });
-
-        it('should return isAssigningCardDisabled false when all conditions are met', () => {
-            (useCardFeeds as jest.Mock).mockReturnValue([mockCustomFeedData, {status: 'loaded'}, undefined]);
-
-            const {result} = renderHook(() =>
-                useAssignCard({
-                    feedName: mockCustomFeed,
-                    policyID: mockPolicyID,
-                    setShouldShowOfflineModal: mockSetShouldShowOfflineModal,
-                }),
-            );
-
-            expect(result.current.isAssigningCardDisabled).toBe(false);
-        });
-    });
-
-    describe('assignCard function - offline handling', () => {
-        it('should show offline modal for direct feed when offline', () => {
-            (useCardFeeds as jest.Mock).mockReturnValue([mockPlaidFeedData, {status: 'loaded'}, undefined]);
-            (useNetwork as jest.Mock).mockReturnValue({isOffline: true, onReconnect: jest.fn()});
-
-            const {result} = renderHook(() =>
-                useAssignCard({
-                    feedName: mockPlaidFeed,
-                    policyID: mockPolicyID,
-                    setShouldShowOfflineModal: mockSetShouldShowOfflineModal,
-                }),
-            );
-
-            result.current.assignCard('Plaid Checking 0000', 'Plaid Checking 0000');
-
-            expect(mockSetShouldShowOfflineModal).toHaveBeenCalledWith(true);
-        });
-
-        it('should not show offline modal for commercial feed when offline', () => {
-            (useCardFeeds as jest.Mock).mockReturnValue([mockCustomFeedData, {status: 'loaded'}, undefined]);
-            (useNetwork as jest.Mock).mockReturnValue({isOffline: true, onReconnect: jest.fn()});
-
-            const {result} = renderHook(() =>
-                useAssignCard({
-                    feedName: mockCustomFeed,
-                    policyID: mockPolicyID,
-                    setShouldShowOfflineModal: mockSetShouldShowOfflineModal,
-                }),
-            );
-
-            result.current.assignCard('490901XXXXXX1234', 'v12:74E3CA3C4C0FA02F4C754FEN4RYP3ED1');
-
-            // Commercial feeds should work offline - offline modal should not be shown
-            expect(mockSetShouldShowOfflineModal).not.toHaveBeenCalled();
-        });
-    });
-
-    describe('assignCard function - card identifiers', () => {
-        it('should accept different cardName and cardID for commercial feeds', () => {
-            (useCardFeeds as jest.Mock).mockReturnValue([mockCustomFeedData, {status: 'loaded'}, undefined]);
-
-            const {result} = renderHook(() =>
-                useAssignCard({
-                    feedName: mockCustomFeed,
-                    policyID: mockPolicyID,
-                    setShouldShowOfflineModal: mockSetShouldShowOfflineModal,
-                }),
-            );
-
-            const cardName = '490901XXXXXX1234';
-            const encryptedCardID = 'v12:74E3CA3C4C0FA02F4C754FEN4RYP3ED1';
-
-            // These should be different for commercial feeds
-            expect(cardName).not.toBe(encryptedCardID);
-
-            // The hook should accept both values without throwing
-            expect(() => result.current.assignCard(cardName, encryptedCardID)).not.toThrow();
-        });
-
-        it('should accept same cardName and cardID for direct feeds', () => {
-            (useCardFeeds as jest.Mock).mockReturnValue([mockPlaidFeedData, {status: 'loaded'}, undefined]);
-
-            const {result} = renderHook(() =>
-                useAssignCard({
-                    feedName: mockPlaidFeed,
-                    policyID: mockPolicyID,
-                    setShouldShowOfflineModal: mockSetShouldShowOfflineModal,
-                }),
-            );
-
-            const cardName = 'Plaid Checking 0000';
-            const cardID = 'Plaid Checking 0000';
-
-            // For direct feeds, cardName equals cardID
-            expect(cardName).toBe(cardID);
-
-            // The hook should accept same values without throwing
-            expect(() => result.current.assignCard(cardName, cardID)).not.toThrow();
-        });
-    });
-});
diff --git a/tests/unit/hooks/useCompanyCards.test.ts b/tests/unit/hooks/useCompanyCards.test.ts
index bcb619bef221..ecda33e8c371 100644
--- a/tests/unit/hooks/useCompanyCards.test.ts
+++ b/tests/unit/hooks/useCompanyCards.test.ts
@@ -232,107 +232,4 @@ describe('useCompanyCards', () => {
             expect(result.current.onyxMetadata.lastSelectedFeedMetadata).toBeDefined();
         });
     });
-
-    describe('cardList data structure', () => {
-        const mockCardsListWithEncryptedNumbers = {
-            cardList: {
-                // eslint-disable-next-line @typescript-eslint/naming-convention
-                '490901XXXXXX1234': 'v12:74E3CA3C4C0FA02F4C754FEN4RYP3ED1',
-                // eslint-disable-next-line @typescript-eslint/naming-convention
-                '490901XXXXXX5678': 'v12:74E3CA3C4C0FA02F4C754FEN4RYP3ED2',
-            },
-        };
-
-        it('should return cardList with encrypted card numbers for commercial feeds', async () => {
-            await Onyx.merge(`${ONYXKEYS.COLLECTION.LAST_SELECTED_FEED}${mockPolicyID}`, mockCustomFeed);
-            (useCardFeeds as jest.Mock).mockReturnValue([mockCustomFeedData, {status: 'loaded'}, undefined]);
-            (useCardsList as jest.Mock).mockReturnValue([mockCardsListWithEncryptedNumbers, {status: 'loaded'}]);
-
-            const {result} = renderHook(() => useCompanyCards({policyID: mockPolicyID}));
-
-            // For commercial feeds, cardList contains {cardName: encryptedNumber}
-            expect(result.current.cardList).toEqual(mockCardsListWithEncryptedNumbers.cardList);
-
-            // cardNames should be the keys (display names)
-            expect(result.current.cardNames).toEqual(['490901XXXXXX1234', '490901XXXXXX5678']);
-        });
-
-        it('should have cardList where keys differ from values for commercial feeds', async () => {
-            await Onyx.merge(`${ONYXKEYS.COLLECTION.LAST_SELECTED_FEED}${mockPolicyID}`, mockCustomFeed);
-            (useCardFeeds as jest.Mock).mockReturnValue([mockCustomFeedData, {status: 'loaded'}, undefined]);
-            (useCardsList as jest.Mock).mockReturnValue([mockCardsListWithEncryptedNumbers, {status: 'loaded'}]);
-
-            const {result} = renderHook(() => useCompanyCards({policyID: mockPolicyID}));
-
-            const cardList = result.current.cardList ?? {};
-            const cardNames = Object.keys(cardList);
-            const encryptedNumbers = Object.values(cardList);
-
-            // In commercial feeds, the display name (key) should differ from encrypted value (value)
-            for (const [index, name] of cardNames.entries()) {
-                expect(name).not.toBe(encryptedNumbers.at(index));
-            }
-        });
-
-        it('should not have cardList for direct feeds (accountList is used instead)', async () => {
-            await Onyx.merge(`${ONYXKEYS.COLLECTION.LAST_SELECTED_FEED}${mockPolicyID}`, mockPlaidFeed);
-            (useCardFeeds as jest.Mock).mockReturnValue([mockPlaidFeedData, {status: 'loaded'}, undefined]);
-            (useCardsList as jest.Mock).mockReturnValue([undefined, {status: 'loaded'}]);
-
-            const {result} = renderHook(() => useCompanyCards({policyID: mockPolicyID}));
-
-            // Direct feeds use accountList, not cardList
-            expect(result.current.cardList).toBeUndefined();
-            expect(result.current.selectedFeed?.accountList).toBeDefined();
-            expect(result.current.cardNames).toEqual(['Plaid Checking 0000', 'Plaid Credit Card 3333']);
-        });
-    });
-
-    describe('card ID consistency', () => {
-        it('should ensure direct feed cardNames can be used as identifiers', async () => {
-            await Onyx.merge(`${ONYXKEYS.COLLECTION.LAST_SELECTED_FEED}${mockPolicyID}`, mockOAuthFeed);
-            (useCardFeeds as jest.Mock).mockReturnValue([mockOAuthFeedData, {status: 'loaded'}, undefined]);
-            (useCardsList as jest.Mock).mockReturnValue([undefined, {status: 'loaded'}]);
-
-            const {result} = renderHook(() => useCompanyCards({policyID: mockPolicyID}));
-
-            // For direct feeds, cardNames ARE the identifiers (no encryption)
-            const cardNames = result.current.cardNames ?? [];
-            expect(cardNames).toEqual(['CREDIT CARD...6607', 'CREDIT CARD...5501']);
-
-            // Each card name is both the display value AND the identifier
-            for (const name of cardNames) {
-                expect(typeof name).toBe('string');
-                expect(name.length).toBeGreaterThan(0);
-            }
-        });
-
-        it('should ensure commercial feed cardList maps display names to encrypted identifiers', async () => {
-            const commercialCardsList = {
-                cardList: {
-                    // eslint-disable-next-line @typescript-eslint/naming-convention
-                    'VISA - 1234': 'enc_abc123',
-                    // eslint-disable-next-line @typescript-eslint/naming-convention
-                    'VISA - 5678': 'enc_def456',
-                },
-            };
-
-            await Onyx.merge(`${ONYXKEYS.COLLECTION.LAST_SELECTED_FEED}${mockPolicyID}`, mockCustomFeed);
-            (useCardFeeds as jest.Mock).mockReturnValue([mockCustomFeedData, {status: 'loaded'}, undefined]);
-            (useCardsList as jest.Mock).mockReturnValue([commercialCardsList, {status: 'loaded'}]);
-
-            const {result} = renderHook(() => useCompanyCards({policyID: mockPolicyID}));
-
-            const cardList = result.current.cardList ?? {};
-
-            // Display names are keys
-            expect(Object.keys(cardList)).toEqual(['VISA - 1234', 'VISA - 5678']);
-
-            // Encrypted identifiers are values
-            expect(Object.values(cardList)).toEqual(['enc_abc123', 'enc_def456']);
-
-            // Lookup: given a display name, get the encrypted identifier
-            expect(cardList['VISA - 1234']).toBe('enc_abc123');
-        });
-    });
 });
diff --git a/tests/unit/hooks/useSelectedTransactionsActions.test.ts b/tests/unit/hooks/useSelectedTransactionsActions.test.ts
index 9828fedd55cf..f5043ae58930 100644
--- a/tests/unit/hooks/useSelectedTransactionsActions.test.ts
+++ b/tests/unit/hooks/useSelectedTransactionsActions.test.ts
@@ -43,6 +43,7 @@ jest.mock('@libs/actions/MergeTransaction', () => ({
 
 jest.mock('@libs/actions/Report', () => ({
     exportReportToCSV: jest.fn(),
+    getCurrentUserAccountID: jest.fn(() => 1),
     getCurrentUserEmail: jest.fn(() => 'test@example.com'),
 }));
 
@@ -106,16 +107,6 @@ jest.mock('@hooks/useNetworkWithOfflineStatus', () => ({
         isOffline: mockIsOffline,
     })),
 }));
-const CURRENT_USER_ACCOUNT_ID = 1;
-const CURRENT_USER_LOGIN = 'test@example.com';
-jest.mock('@hooks/useCurrentUserPersonalDetails', () => ({
-    // eslint-disable-next-line @typescript-eslint/naming-convention
-    __esModule: true,
-    default: jest.fn(() => ({
-        login: CURRENT_USER_LOGIN,
-        accountID: CURRENT_USER_ACCOUNT_ID,
-    })),
-}));
 
 describe('useSelectedTransactionsActions', () => {
     const mockBeginExportWithTemplate = jest.fn();
@@ -582,34 +573,18 @@ describe('useSelectedTransactionsActions', () => {
 
     it('should show split option when transaction can be split', async () => {
         const transactionID = '123';
-        const report = {
-            ...createRandomReport(1, undefined),
-            type: CONST.REPORT.TYPE.EXPENSE,
-            ownerAccountID: CURRENT_USER_ACCOUNT_ID,
-            stateNum: CONST.REPORT.STATE_NUM.OPEN,
-            statusNum: CONST.REPORT.STATUS_NUM.OPEN,
-        };
-        const policy = {
-            ...createRandomPolicy(1),
-            isPolicyExpenseChatEnabled: true,
-            role: CONST.POLICY.ROLE.ADMIN,
-            employeeList: {
-                [CURRENT_USER_LOGIN]: {role: CONST.POLICY.ROLE.ADMIN},
-            },
-        };
+        const report = createRandomReport(1, undefined);
+        report.type = CONST.REPORT.TYPE.EXPENSE;
+        const policy = createRandomPolicy(1);
         const reportActions: ReportAction[] = [];
-        const transaction = {
-            ...createRandomTransaction(1),
-            transactionID,
-            amount: 1000,
-            status: CONST.TRANSACTION.STATUS.POSTED,
-        };
+        const transaction = createRandomTransaction(1);
+        transaction.transactionID = transactionID;
 
         mockSelectedTransactionIDs.push(transactionID);
 
         await Onyx.merge(`${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`, transaction);
-        await Onyx.merge(ONYXKEYS.SESSION, {accountID: CURRENT_USER_ACCOUNT_ID});
 
+        jest.spyOn(require('@libs/ReportSecondaryActionUtils'), 'isSplitAction').mockReturnValue(true);
         jest.spyOn(require('@libs/TransactionUtils'), 'getOriginalTransactionWithSplitInfo').mockReturnValue({
             isBillSplit: false,
             isExpenseSplit: false,
diff --git a/tests/unit/useAccountTabIndicatorStatusTest.ts b/tests/unit/useAccountTabIndicatorStatusTest.ts
index 2efe07cfe577..d5b118320db9 100644
--- a/tests/unit/useAccountTabIndicatorStatusTest.ts
+++ b/tests/unit/useAccountTabIndicatorStatusTest.ts
@@ -1,7 +1,6 @@
 import {act, renderHook} from '@testing-library/react-native';
 import type {OnyxMultiSetInput} from 'react-native-onyx';
 import Onyx from 'react-native-onyx';
-import type {IndicatorTestCase} from 'tests/utils/IndicatorTestUtils';
 import useAccountTabIndicatorStatus from '@hooks/useAccountTabIndicatorStatus';
 // eslint-disable-next-line no-restricted-imports
 import {defaultTheme} from '@styles/theme';
@@ -9,57 +8,7 @@ import CONST from '@src/CONST';
 import ONYXKEYS from '@src/ONYXKEYS';
 import waitForBatchedUpdatesWithAct from '../utils/waitForBatchedUpdatesWithAct';
 
-const userID = 'johndoe12@expensify.com';
-
-const brokenCardFeed = {
-    feedName: CONST.COMPANY_CARD.FEED_BANK_NAME.CHASE,
-    workspaceAccountID: 12345,
-};
-
-const TEST_CASES = {
-    hasUserWalletErrors: {
-        name: 'has user wallet errors',
-        indicatorColor: defaultTheme.danger,
-        status: CONST.INDICATOR_STATUS.HAS_USER_WALLET_ERRORS,
-    },
-    hasPaymentMethodError: {
-        name: 'has payment method error',
-        indicatorColor: defaultTheme.danger,
-        status: CONST.INDICATOR_STATUS.HAS_PAYMENT_METHOD_ERROR,
-    },
-    hasReimbursementAccountErrors: {
-        name: 'has reimbursement account errors',
-        indicatorColor: defaultTheme.danger,
-        status: CONST.INDICATOR_STATUS.HAS_REIMBURSEMENT_ACCOUNT_ERRORS,
-    },
-    hasLoginListError: {
-        name: 'has login list error',
-        indicatorColor: defaultTheme.danger,
-        status: CONST.INDICATOR_STATUS.HAS_LOGIN_LIST_ERROR,
-    },
-    hasWalletTermsErrors: {
-        name: 'has wallet terms errors',
-        indicatorColor: defaultTheme.danger,
-        status: CONST.INDICATOR_STATUS.HAS_WALLET_TERMS_ERRORS,
-    },
-    hasCardConnectionError: {
-        name: 'has card connection error',
-        indicatorColor: defaultTheme.danger,
-        status: CONST.INDICATOR_STATUS.HAS_CARD_CONNECTION_ERROR,
-    },
-    hasPhoneNumberError: {
-        name: 'has phone number error',
-        indicatorColor: defaultTheme.danger,
-        status: CONST.INDICATOR_STATUS.HAS_PHONE_NUMBER_ERROR,
-    },
-    hasLoginListInfo: {
-        name: 'has login list info',
-        indicatorColor: defaultTheme.success,
-        status: CONST.INDICATOR_STATUS.HAS_LOGIN_LIST_INFO,
-    },
-} as const satisfies Record<string, IndicatorTestCase>;
-
-const getMockForTestCase = ({status}: IndicatorTestCase) =>
+const getMockForStatus = (status: string) =>
     ({
         [ONYXKEYS.BANK_ACCOUNT_LIST]: {
             // eslint-disable-next-line @typescript-eslint/naming-convention
@@ -93,9 +42,9 @@ const getMockForTestCase = ({status}: IndicatorTestCase) =>
         },
         [ONYXKEYS.LOGIN_LIST]: {
             // eslint-disable-next-line @typescript-eslint/naming-convention
-            [userID]: {
+            'johndoe12@expensify.com': {
                 partnerName: 'John Doe',
-                partnerUserID: userID,
+                partnerUserID: 'johndoe12@expensify.com',
                 validatedDate: status !== CONST.INDICATOR_STATUS.HAS_LOGIN_LIST_INFO ? new Date().toISOString() : undefined,
                 errorFields:
                     status === CONST.INDICATOR_STATUS.HAS_LOGIN_LIST_ERROR
@@ -133,25 +82,72 @@ const getMockForTestCase = ({status}: IndicatorTestCase) =>
                       }
                     : undefined,
         },
-        [ONYXKEYS.SESSION]: {
-            email: userID,
-        },
-        [ONYXKEYS.CARD_LIST]: {
-            card1: {
+        [`${ONYXKEYS.CARD_LIST}`]: {
+            // eslint-disable-next-line @typescript-eslint/naming-convention
+            card123: {
                 bank: 'OTHER_BANK',
                 lastScrapeResult: status === CONST.INDICATOR_STATUS.HAS_CARD_CONNECTION_ERROR ? 403 : 200,
-                fundID: String(brokenCardFeed.workspaceAccountID),
+            },
+            // eslint-disable-next-line @typescript-eslint/naming-convention
+            card456: {
+                bank: 'ANOTHER_BANK',
+                lastScrapeResult: status === CONST.INDICATOR_STATUS.HAS_CARD_CONNECTION_ERROR ? 403 : 200,
             },
         },
-        [`${ONYXKEYS.COLLECTION.POLICY}1` as const]: {
-            id: '1',
-            name: 'Workspace 1',
-            owner: userID,
-            role: 'admin',
-            workspaceAccountID: brokenCardFeed.workspaceAccountID,
+        [ONYXKEYS.SESSION]: {
+            email: 'johndoe12@expensify.com',
         },
     }) as unknown as OnyxMultiSetInput;
 
+type TestCase = {
+    name: string;
+    indicatorColor: string;
+    status: string;
+};
+
+const TEST_CASES: TestCase[] = [
+    {
+        name: 'has user wallet errors',
+        indicatorColor: defaultTheme.danger,
+        status: CONST.INDICATOR_STATUS.HAS_USER_WALLET_ERRORS,
+    },
+    {
+        name: 'has payment method error',
+        indicatorColor: defaultTheme.danger,
+        status: CONST.INDICATOR_STATUS.HAS_PAYMENT_METHOD_ERROR,
+    },
+    {
+        name: 'has reimbursement account errors',
+        indicatorColor: defaultTheme.danger,
+        status: CONST.INDICATOR_STATUS.HAS_REIMBURSEMENT_ACCOUNT_ERRORS,
+    },
+    {
+        name: 'has login list error',
+        indicatorColor: defaultTheme.danger,
+        status: CONST.INDICATOR_STATUS.HAS_LOGIN_LIST_ERROR,
+    },
+    {
+        name: 'has wallet terms errors',
+        indicatorColor: defaultTheme.danger,
+        status: CONST.INDICATOR_STATUS.HAS_WALLET_TERMS_ERRORS,
+    },
+    {
+        name: 'has card connection error',
+        indicatorColor: defaultTheme.danger,
+        status: CONST.INDICATOR_STATUS.HAS_CARD_CONNECTION_ERROR,
+    },
+    {
+        name: 'has phone number error',
+        indicatorColor: defaultTheme.danger,
+        status: CONST.INDICATOR_STATUS.HAS_PHONE_NUMBER_ERROR,
+    },
+    {
+        name: 'has login list info',
+        indicatorColor: defaultTheme.success,
+        status: CONST.INDICATOR_STATUS.HAS_LOGIN_LIST_INFO,
+    },
+];
+
 describe('useAccountTabIndicatorStatus', () => {
     beforeAll(() => {
         Onyx.init({
@@ -159,10 +155,10 @@ describe('useAccountTabIndicatorStatus', () => {
         });
     });
 
-    describe.each(Object.values(TEST_CASES))('$name', (testCase) => {
+    describe.each(TEST_CASES)('$name', (testCase) => {
         beforeAll(async () => {
             await act(async () => {
-                await Onyx.multiSet(getMockForTestCase(testCase));
+                await Onyx.multiSet(getMockForStatus(testCase.status));
                 await waitForBatchedUpdatesWithAct();
             });
         });
@@ -192,7 +188,7 @@ describe('useAccountTabIndicatorStatus', () => {
                     [ONYXKEYS.LOGIN_LIST]: {},
                     [ONYXKEYS.REIMBURSEMENT_ACCOUNT]: {},
                     [ONYXKEYS.PRIVATE_PERSONAL_DETAILS]: {},
-                    [ONYXKEYS.CARD_LIST]: {},
+                    [`${ONYXKEYS.CARD_LIST}`]: {},
                     [ONYXKEYS.SESSION]: {
                         email: 'johndoe12@expensify.com',
                     },
@@ -231,7 +227,7 @@ describe('useAccountTabIndicatorStatus', () => {
                     [ONYXKEYS.LOGIN_LIST]: {},
                     [ONYXKEYS.REIMBURSEMENT_ACCOUNT]: {},
                     [ONYXKEYS.PRIVATE_PERSONAL_DETAILS]: {},
-                    [ONYXKEYS.CARD_LIST]: {},
+                    [`${ONYXKEYS.CARD_LIST}`]: {},
                     [ONYXKEYS.SESSION]: {
                         email: 'johndoe12@expensify.com',
                     },
@@ -271,7 +267,7 @@ describe('useAccountTabIndicatorStatus', () => {
                     [ONYXKEYS.LOGIN_LIST]: {},
                     [ONYXKEYS.REIMBURSEMENT_ACCOUNT]: {},
                     [ONYXKEYS.PRIVATE_PERSONAL_DETAILS]: {},
-                    [ONYXKEYS.CARD_LIST]: {},
+                    [`${ONYXKEYS.CARD_LIST}`]: {},
                     [ONYXKEYS.SESSION]: {
                         email: 'johndoe12@expensify.com',
                     },
@@ -318,7 +314,7 @@ describe('useAccountTabIndicatorStatus', () => {
                     },
                     [ONYXKEYS.REIMBURSEMENT_ACCOUNT]: {},
                     [ONYXKEYS.PRIVATE_PERSONAL_DETAILS]: {},
-                    [ONYXKEYS.CARD_LIST]: {},
+                    [`${ONYXKEYS.CARD_LIST}`]: {},
                     [ONYXKEYS.SESSION]: {
                         email: 'johndoe12@expensify.com',
                     },
@@ -352,7 +348,7 @@ describe('useAccountTabIndicatorStatus', () => {
                     [ONYXKEYS.LOGIN_LIST]: null,
                     [ONYXKEYS.REIMBURSEMENT_ACCOUNT]: null,
                     [ONYXKEYS.PRIVATE_PERSONAL_DETAILS]: null,
-                    [ONYXKEYS.CARD_LIST]: null,
+                    [`${ONYXKEYS.CARD_LIST}`]: null,
                     [ONYXKEYS.SESSION]: null,
                 } as unknown as OnyxMultiSetInput);
                 await waitForBatchedUpdatesWithAct();
@@ -377,10 +373,9 @@ describe('useAccountTabIndicatorStatus', () => {
         it('shows error for third party card with broken connection', async () => {
             await act(async () => {
                 await Onyx.multiSet({
-                    [ONYXKEYS.CARD_LIST]: {
+                    [`${ONYXKEYS.CARD_LIST}`]: {
                         card1: {
-                            bank: brokenCardFeed.feedName,
-                            fundID: String(brokenCardFeed.workspaceAccountID),
+                            bank: 'Chase',
                             lastScrapeResult: 403,
                         },
                     },
@@ -399,10 +394,9 @@ describe('useAccountTabIndicatorStatus', () => {
         it('does not show error for Expensify Card with broken connection', async () => {
             await act(async () => {
                 await Onyx.multiSet({
-                    [ONYXKEYS.CARD_LIST]: {
+                    [`${ONYXKEYS.CARD_LIST}`]: {
                         card1: {
                             bank: CONST.EXPENSIFY_CARD.BANK,
-                            fundID: String(brokenCardFeed.workspaceAccountID),
                             lastScrapeResult: 403,
                         },
                     },
@@ -420,10 +414,9 @@ describe('useAccountTabIndicatorStatus', () => {
         it('does not show error for third party card with good connection', async () => {
             await act(async () => {
                 await Onyx.multiSet({
-                    [ONYXKEYS.CARD_LIST]: {
+                    [`${ONYXKEYS.CARD_LIST}`]: {
                         card1: {
                             bank: 'Chase',
-                            fundID: String(brokenCardFeed.workspaceAccountID),
                             lastScrapeResult: 200,
                         },
                     },
diff --git a/tests/unit/useIndicatorStatusTest.tsx b/tests/unit/useIndicatorStatusTest.tsx
index 2777f6454ca4..69f4ac51503a 100644
--- a/tests/unit/useIndicatorStatusTest.tsx
+++ b/tests/unit/useIndicatorStatusTest.tsx
@@ -1,117 +1,21 @@
 import {act, renderHook} from '@testing-library/react-native';
 import type {OnyxMultiSetInput} from 'react-native-onyx';
 import Onyx from 'react-native-onyx';
+import type {IndicatorStatus} from '@hooks/useIndicatorStatus';
 import useIndicatorStatus from '@hooks/useIndicatorStatus';
 // eslint-disable-next-line no-restricted-imports
 import {defaultTheme} from '@styles/theme';
 import CONST from '@src/CONST';
 import ONYXKEYS from '@src/ONYXKEYS';
-import type {IndicatorTestCase} from '../utils/IndicatorTestUtils';
 import waitForBatchedUpdates from '../utils/waitForBatchedUpdates';
 
-const userID = 'johndoe12@expensify.com';
-const otherUserID = 'otheruser@expensify.com';
-
-const brokenCardFeed = {
-    feedName: CONST.COMPANY_CARD.FEED_BANK_NAME.CHASE,
-    workspaceAccountID: 12345,
-};
-
-const TEST_CASES = {
-    hasPolicyErrors: {
-        name: 'has policy errors',
-        indicatorColor: defaultTheme.danger,
-        status: CONST.INDICATOR_STATUS.HAS_POLICY_ERRORS,
-        policyIDWithErrors: '2',
-    },
-    hasCustomUnitsError: {
-        name: 'has custom units error',
-        indicatorColor: defaultTheme.danger,
-        status: CONST.INDICATOR_STATUS.HAS_CUSTOM_UNITS_ERROR,
-        policyIDWithErrors: '1',
-    },
-    hasEmployeeListError: {
-        name: 'has employee list error',
-        indicatorColor: defaultTheme.danger,
-        status: CONST.INDICATOR_STATUS.HAS_EMPLOYEE_LIST_ERROR,
-        policyIDWithErrors: '3',
-    },
-    hasSyncErrors: {
-        name: 'has sync errors',
-        indicatorColor: defaultTheme.danger,
-        status: CONST.INDICATOR_STATUS.HAS_SYNC_ERRORS,
-        policyIDWithErrors: '4',
-    },
-    hasUserWalletErrors: {
-        name: 'has user wallet errors',
-        indicatorColor: defaultTheme.danger,
-        status: CONST.INDICATOR_STATUS.HAS_USER_WALLET_ERRORS,
-        policyIDWithErrors: undefined,
-    },
-    hasPaymentMethodError: {
-        name: 'has payment method error',
-        indicatorColor: defaultTheme.danger,
-        status: CONST.INDICATOR_STATUS.HAS_PAYMENT_METHOD_ERROR,
-        policyIDWithErrors: undefined,
-    },
-    hasSubscriptionErrors: {
-        name: 'has subscription errors',
-        indicatorColor: defaultTheme.danger,
-        status: CONST.INDICATOR_STATUS.HAS_SUBSCRIPTION_ERRORS,
-        policyIDWithErrors: undefined,
-    },
-    hasReimbursementAccountErrors: {
-        name: 'has reimbursement account errors',
-        indicatorColor: defaultTheme.danger,
-        status: CONST.INDICATOR_STATUS.HAS_REIMBURSEMENT_ACCOUNT_ERRORS,
-        policyIDWithErrors: undefined,
-    },
-    hasLoginListError: {
-        name: 'has login list error',
-        indicatorColor: defaultTheme.danger,
-        status: CONST.INDICATOR_STATUS.HAS_LOGIN_LIST_ERROR,
-        policyIDWithErrors: undefined,
-    },
-    hasWalletTermsErrors: {
-        name: 'has wallet terms errors',
-        indicatorColor: defaultTheme.danger,
-        status: CONST.INDICATOR_STATUS.HAS_WALLET_TERMS_ERRORS,
-        policyIDWithErrors: undefined,
-    },
-    hasCardConnectionError: {
-        name: 'has card connection error',
-        indicatorColor: defaultTheme.danger,
-        status: CONST.INDICATOR_STATUS.HAS_CARD_CONNECTION_ERROR,
-        policyIDWithErrors: undefined,
-    },
-    hasLoginListInfo: {
-        name: 'has login list info',
-        indicatorColor: defaultTheme.success,
-        status: CONST.INDICATOR_STATUS.HAS_LOGIN_LIST_INFO,
-        policyIDWithErrors: undefined,
-    },
-    hasSubscriptionInfo: {
-        name: 'has subscription info',
-        indicatorColor: defaultTheme.success,
-        status: CONST.INDICATOR_STATUS.HAS_SUBSCRIPTION_INFO,
-        policyIDWithErrors: undefined,
-    },
-    hasPendingCardInfo: {
-        name: 'has pending card info',
-        indicatorColor: defaultTheme.success,
-        status: CONST.INDICATOR_STATUS.HAS_PENDING_CARD_INFO,
-        policyIDWithErrors: undefined,
-    },
-} as const satisfies Record<string, IndicatorTestCase>;
-
-const getMockForTestCase = ({status}: IndicatorTestCase, isAdmin: boolean) =>
+const getMockForStatus = (status: IndicatorStatus, isAdmin = true) =>
     ({
         [`${ONYXKEYS.COLLECTION.POLICY}1` as const]: {
             id: '1',
             name: 'Workspace 1',
-            owner: isAdmin ? userID : otherUserID,
+            owner: 'johndoe12@expensify.com',
             role: isAdmin ? 'admin' : 'user',
-            workspaceAccountID: brokenCardFeed.workspaceAccountID,
             customUnits:
                 status === CONST.INDICATOR_STATUS.HAS_CUSTOM_UNITS_ERROR
                     ? {
@@ -124,7 +28,7 @@ const getMockForTestCase = ({status}: IndicatorTestCase, isAdmin: boolean) =>
         [`${ONYXKEYS.COLLECTION.POLICY}2` as const]: {
             id: '2',
             name: 'Workspace 2',
-            owner: userID,
+            owner: 'johndoe12@expensify.com',
             role: isAdmin ? 'admin' : 'user',
             errors:
                 status === CONST.INDICATOR_STATUS.HAS_POLICY_ERRORS
@@ -136,12 +40,12 @@ const getMockForTestCase = ({status}: IndicatorTestCase, isAdmin: boolean) =>
         [`${ONYXKEYS.COLLECTION.POLICY}3` as const]: {
             id: '3',
             name: 'Workspace 3',
-            owner: userID,
+            owner: 'johndoe12@expensify.com',
             role: isAdmin ? 'admin' : 'user',
             employeeList: {
                 // eslint-disable-next-line @typescript-eslint/naming-convention
-                [userID]: {
-                    email: userID,
+                'johndoe12@expensify.com': {
+                    email: 'johndoe12@expensify.com',
                     errors:
                         status === CONST.INDICATOR_STATUS.HAS_EMPLOYEE_LIST_ERROR
                             ? {
@@ -154,7 +58,7 @@ const getMockForTestCase = ({status}: IndicatorTestCase, isAdmin: boolean) =>
         [`${ONYXKEYS.COLLECTION.POLICY}4` as const]: {
             id: '4',
             name: 'Workspace 4',
-            owner: userID,
+            owner: 'johndoe12@expensify.com',
             role: isAdmin ? 'admin' : 'auditor',
             connections:
                 status === CONST.INDICATOR_STATUS.HAS_SYNC_ERRORS
@@ -199,9 +103,9 @@ const getMockForTestCase = ({status}: IndicatorTestCase, isAdmin: boolean) =>
         },
         [ONYXKEYS.LOGIN_LIST]: {
             // eslint-disable-next-line @typescript-eslint/naming-convention
-            [userID]: {
+            'johndoe12@expensify.com': {
                 partnerName: 'John Doe',
-                partnerUserID: userID,
+                partnerUserID: 'johndoe12@expensify.com',
                 validatedDate: status !== CONST.INDICATOR_STATUS.HAS_LOGIN_LIST_INFO ? new Date().toISOString() : undefined,
                 errorFields:
                     status === CONST.INDICATOR_STATUS.HAS_LOGIN_LIST_ERROR
@@ -232,14 +136,8 @@ const getMockForTestCase = ({status}: IndicatorTestCase, isAdmin: boolean) =>
                 cardID: 123456,
                 bank: CONST.EXPENSIFY_CARD.BANK,
                 accountID: 123,
-                fundID: String(brokenCardFeed.workspaceAccountID),
                 state: status === CONST.INDICATOR_STATUS.HAS_PENDING_CARD_INFO ? CONST.EXPENSIFY_CARD.STATE.STATE_NOT_ISSUED : CONST.EXPENSIFY_CARD.STATE.OPEN,
             },
-            card1: {
-                bank: 'OTHER_BANK',
-                lastScrapeResult: status === CONST.INDICATOR_STATUS.HAS_CARD_CONNECTION_ERROR ? 403 : 200,
-                fundID: String(brokenCardFeed.workspaceAccountID),
-            },
         },
         [ONYXKEYS.PRIVATE_PERSONAL_DETAILS]: {
             legalFirstName: 'John',
@@ -254,28 +152,116 @@ const getMockForTestCase = ({status}: IndicatorTestCase, isAdmin: boolean) =>
         },
     }) as OnyxMultiSetInput;
 
-const TEST_CASES_NON_ADMIN = {
-    hasCustomUnitsError: {
+type TestCase = {
+    name: string;
+    indicatorColor: string;
+    status: IndicatorStatus;
+    policyIDWithErrors?: string;
+};
+
+const TEST_CASES: TestCase[] = [
+    {
+        name: 'has policy errors',
+        indicatorColor: defaultTheme.danger,
+        status: CONST.INDICATOR_STATUS.HAS_POLICY_ERRORS,
+        policyIDWithErrors: '2',
+    },
+    {
+        name: 'has custom units error',
+        indicatorColor: defaultTheme.danger,
+        status: CONST.INDICATOR_STATUS.HAS_CUSTOM_UNITS_ERROR,
+        policyIDWithErrors: '1',
+    },
+    {
+        name: 'has employee list error',
+        indicatorColor: defaultTheme.danger,
+        status: CONST.INDICATOR_STATUS.HAS_EMPLOYEE_LIST_ERROR,
+        policyIDWithErrors: '3',
+    },
+    {
+        name: 'has sync errors',
+        indicatorColor: defaultTheme.danger,
+        status: CONST.INDICATOR_STATUS.HAS_SYNC_ERRORS,
+        policyIDWithErrors: '4',
+    },
+    {
+        name: 'has user wallet errors',
+        indicatorColor: defaultTheme.danger,
+        status: CONST.INDICATOR_STATUS.HAS_USER_WALLET_ERRORS,
+        policyIDWithErrors: undefined,
+    },
+    {
+        name: 'has payment method error',
+        indicatorColor: defaultTheme.danger,
+        status: CONST.INDICATOR_STATUS.HAS_PAYMENT_METHOD_ERROR,
+        policyIDWithErrors: undefined,
+    },
+    {
+        name: 'has subscription errors',
+        indicatorColor: defaultTheme.danger,
+        status: CONST.INDICATOR_STATUS.HAS_SUBSCRIPTION_ERRORS,
+        policyIDWithErrors: undefined,
+    },
+    {
+        name: 'has reimbursement account errors',
+        indicatorColor: defaultTheme.danger,
+        status: CONST.INDICATOR_STATUS.HAS_REIMBURSEMENT_ACCOUNT_ERRORS,
+        policyIDWithErrors: undefined,
+    },
+    {
+        name: 'has login list error',
+        indicatorColor: defaultTheme.danger,
+        status: CONST.INDICATOR_STATUS.HAS_LOGIN_LIST_ERROR,
+        policyIDWithErrors: undefined,
+    },
+    {
+        name: 'has wallet terms errors',
+        indicatorColor: defaultTheme.danger,
+        status: CONST.INDICATOR_STATUS.HAS_WALLET_TERMS_ERRORS,
+        policyIDWithErrors: undefined,
+    },
+    {
+        name: 'has login list info',
+        indicatorColor: defaultTheme.success,
+        status: CONST.INDICATOR_STATUS.HAS_LOGIN_LIST_INFO,
+        policyIDWithErrors: undefined,
+    },
+    {
+        name: 'has subscription info',
+        indicatorColor: defaultTheme.success,
+        status: CONST.INDICATOR_STATUS.HAS_SUBSCRIPTION_INFO,
+        policyIDWithErrors: undefined,
+    },
+    {
+        name: 'has pending card info',
+        indicatorColor: defaultTheme.success,
+        status: CONST.INDICATOR_STATUS.HAS_PENDING_CARD_INFO,
+        policyIDWithErrors: undefined,
+    },
+];
+
+const TEST_CASES_NON_ADMIN: TestCase[] = [
+    {
         name: 'has custom units error but not an admin so no RBR',
         indicatorColor: defaultTheme.success,
         status: CONST.INDICATOR_STATUS.HAS_CUSTOM_UNITS_ERROR,
     },
-    hasPolicyErrors: {
+    {
         name: 'has policy errors but not an admin so no RBR',
         indicatorColor: defaultTheme.success,
         status: CONST.INDICATOR_STATUS.HAS_POLICY_ERRORS,
     },
-    hasEmployeeListError: {
+    {
         name: 'has employee list error but not an admin so no RBR',
         indicatorColor: defaultTheme.success,
         status: CONST.INDICATOR_STATUS.HAS_EMPLOYEE_LIST_ERROR,
     },
-    hasSyncErrors: {
+    {
         name: 'has sync errors but not an admin so no RBR',
         indicatorColor: defaultTheme.success,
         status: CONST.INDICATOR_STATUS.HAS_SYNC_ERRORS,
     },
-} as const satisfies Record<string, IndicatorTestCase>;
+];
 
 describe('useIndicatorStatusTest', () => {
     beforeAll(() => {
@@ -283,10 +269,9 @@ describe('useIndicatorStatusTest', () => {
             keys: ONYXKEYS,
         });
     });
-
-    describe.each(Object.values(TEST_CASES))('$name', (testCase) => {
+    describe.each(TEST_CASES)('$name', (testCase) => {
         beforeAll(async () => {
-            await Onyx.multiSet(getMockForTestCase(testCase, true));
+            await Onyx.multiSet(getMockForStatus(testCase.status));
             await waitForBatchedUpdates();
         });
         it('returns correct indicatorColor', async () => {
@@ -314,9 +299,9 @@ describe('useIndicatorStatusTest', () => {
             expect(policyIDWithErrors).toBe(testCase.policyIDWithErrors);
         });
     });
-    describe.each(Object.values(TEST_CASES_NON_ADMIN))('$name', (testCase) => {
+    describe.each(TEST_CASES_NON_ADMIN)('$name', (testCase) => {
         beforeAll(async () => {
-            await Onyx.multiSet(getMockForTestCase(testCase, false));
+            await Onyx.multiSet(getMockForStatus(testCase.status, false));
             await waitForBatchedUpdates();
         });
         it('returns correct indicatorColor', async () => {
diff --git a/tests/unit/useReportPreviewSenderIDTest.ts b/tests/unit/useReportPreviewSenderIDTest.ts
index 056442e93828..a9e7149a84e3 100644
--- a/tests/unit/useReportPreviewSenderIDTest.ts
+++ b/tests/unit/useReportPreviewSenderIDTest.ts
@@ -6,7 +6,6 @@ import initOnyxDerivedValues from '@libs/actions/OnyxDerived';
 import CONST from '@src/CONST';
 import * as PersonalDetailsUtils from '@src/libs/PersonalDetailsUtils';
 import ONYXKEYS from '@src/ONYXKEYS';
-import type {Report} from '@src/types/onyx';
 import {toCollectionDataSet} from '@src/types/utils/CollectionDataSet';
 import {actionR14932, actionR98765} from '../../__mocks__/reportData/actions';
 import personalDetails from '../../__mocks__/reportData/personalDetails';
@@ -30,25 +29,6 @@ const validAction = {
     childManagerAccountID: iouReportR14932.managerID,
 };
 
-const optimisticAction = {
-    ...actionR98765,
-    childReportID: iouReportR14932.reportID,
-    actionName: CONST.REPORT.ACTIONS.TYPE.REPORT_PREVIEW,
-    childOwnerAccountID: iouReportR14932.ownerAccountID,
-    childManagerAccountID: iouReportR14932.managerID,
-    isOptimisticAction: true,
-};
-const CURRENT_USER_EMAIL = 'test@example.com';
-const CURRENT_USER_ACCOUNT_ID = 1;
-jest.mock('@hooks/useCurrentUserPersonalDetails', () => ({
-    // eslint-disable-next-line @typescript-eslint/naming-convention
-    __esModule: true,
-    default: jest.fn(() => ({
-        email: CURRENT_USER_EMAIL,
-        accountID: CURRENT_USER_ACCOUNT_ID,
-    })),
-}));
-
 describe('useReportPreviewSenderID', () => {
     const mockedDMChatRoom = {...chatReportR14932, chatType: undefined};
 
@@ -60,11 +40,7 @@ describe('useReportPreviewSenderID', () => {
     beforeAll(() => {
         Onyx.init({
             keys: ONYXKEYS,
-            initialKeyStates: {
-                [ONYXKEYS.SESSION]: {accountID: CURRENT_USER_ACCOUNT_ID, email: CURRENT_USER_EMAIL},
-            },
         });
-
         initOnyxDerivedValues();
         jest.spyOn(PersonalDetailsUtils, 'getPersonalDetailByEmail').mockImplementation((email) => personalDetails[mockedEmailToID[email]]);
     });
@@ -179,22 +155,4 @@ describe('useReportPreviewSenderID', () => {
         await waitForBatchedUpdatesWithAct();
         expect(result.current).toBe(iouReportR14932.ownerAccountID);
     });
-
-    it('returns currentUserAccountID as reportPreviewSenderID when action is optimistic and iouReport is an IOU report', async () => {
-        const MOCK_IOU_REPORT: Report = {
-            reportID: '1',
-            type: CONST.REPORT.TYPE.IOU,
-        };
-        const {result} = renderHook(
-            () =>
-                useReportPreviewSenderID({
-                    action: optimisticAction,
-                    iouReport: MOCK_IOU_REPORT,
-                    chatReport: mockedDMChatRoom,
-                }),
-            {wrapper: OnyxListItemProvider},
-        );
-        await waitForBatchedUpdatesWithAct();
-        expect(result.current).toBe(CURRENT_USER_ACCOUNT_ID);
-    });
 });
diff --git a/tests/unit/useSidebarOrderedReportsTest.tsx b/tests/unit/useSidebarOrderedReportsTest.tsx
index 98c7004ca966..f26f42a7230e 100644
--- a/tests/unit/useSidebarOrderedReportsTest.tsx
+++ b/tests/unit/useSidebarOrderedReportsTest.tsx
@@ -202,6 +202,7 @@ describe('useSidebarOrderedReports', () => {
             expect.any(Function), // localeCompare
             expect.any(Object), // reportsDrafts
             expect.any(Object), // reportNameValuePairs
+            expect.any(Object), // reportAttributes
         );
     });
 
diff --git a/tests/unit/useTodosTest.ts b/tests/unit/useTodosTest.ts
index a7fb015075d4..08c569096cca 100644
--- a/tests/unit/useTodosTest.ts
+++ b/tests/unit/useTodosTest.ts
@@ -16,14 +16,6 @@ const POLICY_WITH_CONNECTION_ID = 'policy_with_connection';
 
 // This keeps the error "@rnmapbox/maps native code not available." from causing the tests to fail
 jest.mock('@components/ConfirmedRoute.tsx');
-jest.mock('@hooks/useCurrentUserPersonalDetails', () => ({
-    // eslint-disable-next-line @typescript-eslint/naming-convention
-    __esModule: true,
-    default: jest.fn(() => ({
-        email: CURRENT_USER_EMAIL,
-        accountID: CURRENT_USER_ACCOUNT_ID,
-    })),
-}));
 
 const createMockReport = (reportID: string, overrides: Partial<Report> = {}): Report =>
     ({
diff --git a/tests/unit/useWorkspacesTabIndicatorStatusTest.ts b/tests/unit/useWorkspacesTabIndicatorStatusTest.ts
deleted file mode 100644
index 6f1c51c7a9df..000000000000
--- a/tests/unit/useWorkspacesTabIndicatorStatusTest.ts
+++ /dev/null
@@ -1,349 +0,0 @@
-import {act, renderHook} from '@testing-library/react-native';
-import type {OnyxMultiSetInput} from 'react-native-onyx';
-import Onyx from 'react-native-onyx';
-import type {IndicatorTestCase} from 'tests/utils/IndicatorTestUtils';
-import useWorkspacesTabIndicatorStatus from '@hooks/useWorkspacesTabIndicatorStatus';
-// eslint-disable-next-line no-restricted-imports
-import {defaultTheme} from '@styles/theme';
-import CONST from '@src/CONST';
-import ONYXKEYS from '@src/ONYXKEYS';
-import waitForBatchedUpdatesWithAct from '../utils/waitForBatchedUpdatesWithAct';
-
-const userID = 'admin@expensify.com';
-const otherUserID = 'employee@example.com';
-
-const WORKSPACE = {
-    policyID: '1',
-    workspaceAccountID: 12345,
-    policyName: 'Test Workspace',
-};
-
-const TEST_CASES = {
-    hasPolicyErrors: {
-        name: 'has policy errors',
-        indicatorColor: defaultTheme.danger,
-        status: CONST.INDICATOR_STATUS.HAS_POLICY_ERRORS,
-    },
-    hasCustomUnitsError: {
-        name: 'has custom units error',
-        indicatorColor: defaultTheme.danger,
-        status: CONST.INDICATOR_STATUS.HAS_CUSTOM_UNITS_ERROR,
-    },
-    hasEmployeeListError: {
-        name: 'has employee list error',
-        indicatorColor: defaultTheme.danger,
-        status: CONST.INDICATOR_STATUS.HAS_EMPLOYEE_LIST_ERROR,
-    },
-    hasSyncErrors: {
-        name: 'has sync errors',
-        indicatorColor: defaultTheme.danger,
-        status: CONST.INDICATOR_STATUS.HAS_SYNC_ERRORS,
-    },
-    hasQBOExportError: {
-        name: 'has QBO export error',
-        indicatorColor: defaultTheme.danger,
-        status: CONST.INDICATOR_STATUS.HAS_QBO_EXPORT_ERROR,
-    },
-    hasUberCredentialsError: {
-        name: 'has Uber credentials error',
-        indicatorColor: defaultTheme.danger,
-        status: CONST.INDICATOR_STATUS.HAS_UBER_CREDENTIALS_ERROR,
-    },
-} as const satisfies Record<string, IndicatorTestCase>;
-
-const getMockForTestCase = ({name}: IndicatorTestCase) =>
-    ({
-        [ONYXKEYS.SESSION]: {
-            email: userID,
-        },
-        [`${ONYXKEYS.COLLECTION.POLICY}${WORKSPACE.policyID}` as const]: {
-            id: WORKSPACE.policyID,
-            name: WORKSPACE.policyName,
-            owner: userID,
-            role: 'admin',
-            workspaceAccountID: WORKSPACE.workspaceAccountID,
-            // Policy errors
-            errors: name === TEST_CASES.hasPolicyErrors.name ? {policyError: 'Something went wrong'} : undefined,
-            errorFields: undefined,
-            // Custom units errors
-            customUnits: name === TEST_CASES.hasCustomUnitsError.name ? {errors: {customUnitError: 'Invalid custom unit'}} : undefined,
-            // Employee list errors
-            employeeList:
-                name === TEST_CASES.hasEmployeeListError.name
-                    ? {
-                          otherUserID: {
-                              email: otherUserID,
-                              errors: {employeeError: 'Employee error'},
-                          },
-                      }
-                    : undefined,
-            // Sync errors - use connections with sync errors
-            // hasSynchronizationErrorMessage requires: !isSyncInProgress && lastSync exists && isSuccessful === false && errorDate exists
-            connections: {
-                ...(name === TEST_CASES.hasSyncErrors.name
-                    ? {
-                          quickbooksOnline: {
-                              lastSync: {
-                                  errorMessage: 'Sync failed',
-                                  isSuccessful: false,
-                                  errorDate: new Date().toISOString(),
-                              },
-                          },
-                      }
-                    : {}),
-                ...(name === TEST_CASES.hasQBOExportError.name
-                    ? {
-                          quickbooksOnline: {
-                              config: {
-                                  reimbursableExpensesExportDestination: 'VENDOR_BILL',
-                                  reimbursableExpensesAccount: undefined,
-                              },
-                          },
-                      }
-                    : {}),
-            },
-            // Uber credentials error
-            receiptPartners:
-                name === TEST_CASES.hasUberCredentialsError.name
-                    ? {
-                          uber: {
-                              error: 'Invalid Uber credentials',
-                          },
-                      }
-                    : undefined,
-        },
-        // Sync progress - not in progress
-        [`${ONYXKEYS.COLLECTION.POLICY_CONNECTION_SYNC_PROGRESS}${WORKSPACE.policyID}` as const]:
-            name === TEST_CASES.hasSyncErrors.name
-                ? {
-                      stageInProgress: null,
-                      connectionName: 'quickbooksOnline',
-                  }
-                : undefined,
-    }) as unknown as OnyxMultiSetInput;
-
-describe('useWorkspacesTabIndicatorStatus', () => {
-    beforeAll(() => {
-        Onyx.init({
-            keys: ONYXKEYS,
-        });
-    });
-
-    describe.each(Object.values(TEST_CASES))('$name', (testCase) => {
-        beforeAll(async () => {
-            await act(async () => {
-                await Onyx.multiSet(getMockForTestCase(testCase));
-                await waitForBatchedUpdatesWithAct();
-            });
-        });
-
-        it('returns correct indicatorColor', async () => {
-            const {result} = renderHook(() => useWorkspacesTabIndicatorStatus());
-            await waitForBatchedUpdatesWithAct();
-            const {indicatorColor} = result.current;
-            expect(indicatorColor).toBe(testCase.indicatorColor);
-        });
-
-        it('returns correct status', async () => {
-            const {result} = renderHook(() => useWorkspacesTabIndicatorStatus());
-            await waitForBatchedUpdatesWithAct();
-            const {status} = result.current;
-            expect(status).toBe(testCase.status);
-        });
-
-        it('returns policyIDWithErrors', async () => {
-            const {result} = renderHook(() => useWorkspacesTabIndicatorStatus());
-            await waitForBatchedUpdatesWithAct();
-            const {policyIDWithErrors} = result.current;
-            expect(policyIDWithErrors).toBe(WORKSPACE.policyID);
-        });
-    });
-
-    describe('no errors', () => {
-        beforeAll(async () => {
-            await act(async () => {
-                await Onyx.multiSet({
-                    [ONYXKEYS.SESSION]: {
-                        email: userID,
-                    },
-                    [`${ONYXKEYS.COLLECTION.POLICY}${WORKSPACE.policyID}` as const]: {
-                        id: WORKSPACE.policyID,
-                        name: WORKSPACE.policyName,
-                        owner: userID,
-                        role: 'admin',
-                        workspaceAccountID: WORKSPACE.workspaceAccountID,
-                    },
-                    [`${ONYXKEYS.CARD_LIST}`]: {},
-                } as unknown as OnyxMultiSetInput);
-                await waitForBatchedUpdatesWithAct();
-            });
-        });
-
-        it('returns undefined status when no errors exist', async () => {
-            const {result} = renderHook(() => useWorkspacesTabIndicatorStatus());
-            await waitForBatchedUpdatesWithAct();
-            const {status} = result.current;
-            expect(status).toBeUndefined();
-        });
-
-        it('returns success color when no errors exist', async () => {
-            const {result} = renderHook(() => useWorkspacesTabIndicatorStatus());
-            await waitForBatchedUpdatesWithAct();
-            const {indicatorColor} = result.current;
-            expect(indicatorColor).toBe(defaultTheme.success);
-        });
-
-        it('returns undefined policyIDWithErrors when no errors exist', async () => {
-            const {result} = renderHook(() => useWorkspacesTabIndicatorStatus());
-            await waitForBatchedUpdatesWithAct();
-            const {policyIDWithErrors} = result.current;
-            expect(policyIDWithErrors).toBeUndefined();
-        });
-    });
-
-    describe('non-admin user', () => {
-        beforeAll(async () => {
-            await act(async () => {
-                await Onyx.multiSet({
-                    [ONYXKEYS.SESSION]: {
-                        email: otherUserID,
-                    },
-                    [`${ONYXKEYS.COLLECTION.POLICY}${WORKSPACE.policyID}` as const]: {
-                        id: WORKSPACE.policyID,
-                        name: WORKSPACE.policyName,
-                        owner: userID,
-                        role: 'user', // Non-admin role
-                        workspaceAccountID: WORKSPACE.workspaceAccountID,
-                        // Policy errors should NOT show for non-admin
-                        errors: {policyError: 'Something went wrong'},
-                    },
-                    [`${ONYXKEYS.CARD_LIST}`]: {},
-                } as unknown as OnyxMultiSetInput);
-                await waitForBatchedUpdatesWithAct();
-            });
-        });
-
-        it('does not show policy errors for non-admin', async () => {
-            const {result} = renderHook(() => useWorkspacesTabIndicatorStatus());
-            await waitForBatchedUpdatesWithAct();
-            const {status} = result.current;
-            // Policy errors require admin role
-            expect(status).toBeUndefined();
-        });
-    });
-
-    describe('multiple policies with errors', () => {
-        const SECOND_WORKSPACE = {
-            policyID: '2',
-            workspaceAccountID: 67890,
-            policyName: 'Second Workspace',
-        };
-
-        beforeAll(async () => {
-            await act(async () => {
-                await Onyx.multiSet({
-                    [ONYXKEYS.SESSION]: {
-                        email: userID,
-                    },
-                    [`${ONYXKEYS.COLLECTION.POLICY}${WORKSPACE.policyID}` as const]: {
-                        id: WORKSPACE.policyID,
-                        name: WORKSPACE.policyName,
-                        owner: userID,
-                        role: 'admin',
-                        workspaceAccountID: WORKSPACE.workspaceAccountID,
-                        // No errors on first policy
-                    },
-                    [`${ONYXKEYS.COLLECTION.POLICY}${SECOND_WORKSPACE.policyID}` as const]: {
-                        id: SECOND_WORKSPACE.policyID,
-                        name: SECOND_WORKSPACE.policyName,
-                        owner: userID,
-                        role: 'admin',
-                        workspaceAccountID: SECOND_WORKSPACE.workspaceAccountID,
-                        // Errors on second policy
-                        errors: {policyError: 'Something went wrong'},
-                    },
-                    [`${ONYXKEYS.CARD_LIST}`]: {},
-                } as unknown as OnyxMultiSetInput);
-                await waitForBatchedUpdatesWithAct();
-            });
-        });
-
-        it('returns error status when at least one policy has errors', async () => {
-            const {result} = renderHook(() => useWorkspacesTabIndicatorStatus());
-            await waitForBatchedUpdatesWithAct();
-            const {status, indicatorColor} = result.current;
-
-            expect(status).toBe(CONST.INDICATOR_STATUS.HAS_POLICY_ERRORS);
-            expect(indicatorColor).toBe(defaultTheme.danger);
-        });
-
-        it('returns the policyID of the policy with errors', async () => {
-            const {result} = renderHook(() => useWorkspacesTabIndicatorStatus());
-            await waitForBatchedUpdatesWithAct();
-            const {policyIDWithErrors} = result.current;
-
-            expect(policyIDWithErrors).toBe(SECOND_WORKSPACE.policyID);
-        });
-    });
-
-    describe('missing data', () => {
-        beforeAll(async () => {
-            // Clear all Onyx data first to ensure clean state
-            await Onyx.clear();
-            await waitForBatchedUpdatesWithAct();
-        });
-
-        it('handles missing data gracefully', async () => {
-            const {result} = renderHook(() => useWorkspacesTabIndicatorStatus());
-            await waitForBatchedUpdatesWithAct();
-            const {status, indicatorColor, policyIDWithErrors} = result.current;
-
-            expect(status).toBeUndefined();
-            expect(indicatorColor).toBe(defaultTheme.success);
-            expect(policyIDWithErrors).toBeUndefined();
-        });
-    });
-
-    describe('error priority', () => {
-        beforeAll(async () => {
-            await act(async () => {
-                await Onyx.multiSet({
-                    [ONYXKEYS.SESSION]: {
-                        email: userID,
-                    },
-                    [`${ONYXKEYS.COLLECTION.POLICY}${WORKSPACE.policyID}` as const]: {
-                        id: WORKSPACE.policyID,
-                        name: WORKSPACE.policyName,
-                        owner: userID,
-                        role: 'admin',
-                        workspaceAccountID: WORKSPACE.workspaceAccountID,
-                        // Multiple errors at once
-                        errors: {policyError: 'Policy error'},
-                        customUnits: {errors: {customUnitError: 'Custom unit error'}},
-                        employeeList: {
-                            [otherUserID]: {
-                                email: otherUserID,
-                                errors: {employeeError: 'Employee error'},
-                            },
-                        },
-                    },
-                    [`${ONYXKEYS.CARD_LIST}`]: {},
-                } as unknown as OnyxMultiSetInput);
-                await waitForBatchedUpdatesWithAct();
-            });
-        });
-
-        it('returns the first error found based on check order', async () => {
-            const {result} = renderHook(() => useWorkspacesTabIndicatorStatus());
-            await waitForBatchedUpdatesWithAct();
-            const {status} = result.current;
-
-            // Based on the order in useNavigationTabBarIndicatorChecks:
-            // 1. HAS_POLICY_ERRORS
-            // 2. HAS_CUSTOM_UNITS_ERROR
-            // 3. HAS_EMPLOYEE_LIST_ERROR
-            // etc.
-            expect(status).toBe(CONST.INDICATOR_STATUS.HAS_POLICY_ERRORS);
-        });
-    });
-});
diff --git a/tests/utils/IndicatorTestUtils.ts b/tests/utils/IndicatorTestUtils.ts
deleted file mode 100644
index 24bdcf5f9760..000000000000
--- a/tests/utils/IndicatorTestUtils.ts
+++ /dev/null
@@ -1,11 +0,0 @@
-import type {IndicatorStatus} from '@hooks/useNavigationTabBarIndicatorChecks';
-
-type IndicatorTestCase = {
-    name: string;
-    indicatorColor: string;
-    status: IndicatorStatus | undefined;
-    policyIDWithErrors?: string;
-};
-
-// eslint-disable-next-line import/prefer-default-export
-export type {IndicatorTestCase};
diff --git a/tests/utils/OnyxUpdateMockUtils.ts b/tests/utils/OnyxUpdateMockUtils.ts
index c9c289c11a7f..f864c6500cb5 100644
--- a/tests/utils/OnyxUpdateMockUtils.ts
+++ b/tests/utils/OnyxUpdateMockUtils.ts
@@ -1,9 +1,8 @@
 import type {OnyxUpdate} from 'react-native-onyx';
 import CONST from '@src/CONST';
-import type ONYXKEYS from '@src/ONYXKEYS';
 import type {OnyxUpdatesFromServer} from '@src/types/onyx';
 
-const createUpdate = (lastUpdateID: number, successData: Array<OnyxUpdate<typeof ONYXKEYS.COLLECTION.REPORT_ACTIONS>> = [], previousUpdateID?: number): OnyxUpdatesFromServer => ({
+const createUpdate = (lastUpdateID: number, successData: OnyxUpdate[] = [], previousUpdateID?: number): OnyxUpdatesFromServer => ({
     type: CONST.ONYX_UPDATE_TYPES.HTTPS,
     lastUpdateID,
     previousUpdateID: previousUpdateID ?? lastUpdateID - 1,
diff --git a/tests/utils/TestNavigationContainer.tsx b/tests/utils/TestNavigationContainer.tsx
index 007b8791dbd5..8ae0725f83bf 100644
--- a/tests/utils/TestNavigationContainer.tsx
+++ b/tests/utils/TestNavigationContainer.tsx
@@ -120,6 +120,10 @@ function TestSearchFullscreenNavigator() {
                 name={SCREENS.SEARCH.ROOT}
                 getComponent={getEmptyComponent()}
             />
+            <SearchStack.Screen
+                name={SCREENS.SEARCH.MONEY_REQUEST_REPORT}
+                getComponent={getEmptyComponent()}
+            />
         </SearchStack.Navigator>
     );
 }
diff --git a/tests/utils/collections/sidebarReports.ts b/tests/utils/collections/sidebarReports.ts
index 857177490b90..05f3f3b112d6 100644
--- a/tests/utils/collections/sidebarReports.ts
+++ b/tests/utils/collections/sidebarReports.ts
@@ -17,7 +17,6 @@ function createSidebarReport(
         type?: ValueOf<typeof CONST.REPORT.TYPE>;
         isPinned?: boolean;
         hasErrorsOtherThanFailedReceipt?: boolean;
-        requiresAttention?: boolean;
         lastVisibleActionCreated?: string;
         isOwnPolicyExpenseChat?: boolean;
         chatType?: ValueOf<typeof CONST.REPORT.CHAT_TYPE>;
@@ -25,7 +24,7 @@ function createSidebarReport(
         policyID?: string;
         currency?: string;
     } = {},
-): Report & {hasErrorsOtherThanFailedReceipt?: boolean; requiresAttention?: boolean} {
+): Report & {hasErrorsOtherThanFailedReceipt?: boolean} {
     const reportID = index.toString();
     const baseReport = createRandomReport(index, options.chatType ?? CONST.REPORT.CHAT_TYPE.POLICY_ROOM);
 
@@ -36,7 +35,6 @@ function createSidebarReport(
         type: options.type ?? CONST.REPORT.TYPE.CHAT,
         isPinned: options.isPinned ?? false,
         hasErrorsOtherThanFailedReceipt: options.hasErrorsOtherThanFailedReceipt ?? false,
-        requiresAttention: options.requiresAttention ?? false,
         lastVisibleActionCreated: options.lastVisibleActionCreated ?? '2024-01-01 10:00:00',
         isOwnPolicyExpenseChat: options.isOwnPolicyExpenseChat ?? false,
         ownerAccountID: options.ownerAccountID ?? index,
@@ -60,10 +58,9 @@ function createSidebarReportsCollection(
         ownerAccountID?: number;
         policyID?: string;
         currency?: string;
-        requiresAttention?: boolean;
     }>,
 ): ReportsToDisplayInLHN {
-    return createCollection<Report & {hasErrorsOtherThanFailedReceipt?: boolean; requiresAttention?: boolean}>(
+    return createCollection<Report & {hasErrorsOtherThanFailedReceipt?: boolean}>(
         (item) => item.reportID,
         (index) => createSidebarReport(index, reportConfigs.at(index) ?? {}),
         reportConfigs.length,
diff --git a/tests/utils/collections/transaction.ts b/tests/utils/collections/transaction.ts
index fb199363b2c0..cffd6cb6a63d 100644
--- a/tests/utils/collections/transaction.ts
+++ b/tests/utils/collections/transaction.ts
@@ -41,7 +41,7 @@ export default function createRandomTransaction(index: number): Transaction {
         receipt: {filename: randWord()},
         reimbursable: randBoolean(),
         hasEReceipt: randBoolean(),
-        modifiedAmount: '',
+        modifiedAmount: 0,
     };
 }
 
