diff --git a/ios/Podfile.lock b/ios/Podfile.lock
index b0e84d3d033f..3e2e603c95cc 100644
--- a/ios/Podfile.lock
+++ b/ios/Podfile.lock
@@ -166,6 +166,7 @@ PODS:
     - GoogleUtilities/Environment (~> 7.7)
     - "GoogleUtilities/NSData+zlib (~> 7.7)"
   - fmt (9.1.0)
+  - ForkInputMask (7.3.3)
   - FullStory (1.52.0)
   - fullstory_react-native (1.7.2):
     - DoubleConversion
@@ -1604,6 +1605,28 @@ PODS:
     - ReactCommon/turbomodule/bridging
     - ReactCommon/turbomodule/core
     - Yoga
+  - react-native-advanced-input-mask (1.2.1):
+    - DoubleConversion
+    - ForkInputMask (~> 7.3.2)
+    - glog
+    - hermes-engine
+    - RCT-Folly (= 2024.01.01.00)
+    - RCTRequired
+    - RCTTypeSafety
+    - React-Core
+    - React-debug
+    - React-Fabric
+    - React-featureflags
+    - React-graphics
+    - React-ImageManager
+    - React-NativeModulesApple
+    - React-RCTFabric
+    - React-rendererdebug
+    - React-utils
+    - ReactCodegen
+    - ReactCommon/turbomodule/bridging
+    - ReactCommon/turbomodule/core
+    - Yoga
   - react-native-airship (19.2.1):
     - AirshipFrameworkProxy (= 7.1.2)
     - DoubleConversion
@@ -2880,6 +2903,7 @@ DEPENDENCIES:
   - React-logger (from `../node_modules/react-native/ReactCommon/logger`)
   - React-Mapbuffer (from `../node_modules/react-native/ReactCommon`)
   - React-microtasksnativemodule (from `../node_modules/react-native/ReactCommon/react/nativemodule/microtasks`)
+  - react-native-advanced-input-mask (from `../node_modules/react-native-advanced-input-mask`)
   - "react-native-airship (from `../node_modules/@ua/react-native-airship`)"
   - react-native-app-logs (from `../node_modules/react-native-app-logs`)
   - react-native-blob-util (from `../node_modules/react-native-blob-util`)
@@ -2968,6 +2992,7 @@ SPEC REPOS:
     - FirebaseInstallations
     - FirebasePerformance
     - FirebaseRemoteConfig
+    - ForkInputMask
     - GoogleAppMeasurement
     - GoogleDataTransport
     - GoogleSignIn
@@ -3093,6 +3118,8 @@ EXTERNAL SOURCES:
     :path: "../node_modules/react-native/ReactCommon"
   React-microtasksnativemodule:
     :path: "../node_modules/react-native/ReactCommon/react/nativemodule/microtasks"
+  react-native-advanced-input-mask:
+    :path: "../node_modules/react-native-advanced-input-mask"
   react-native-airship:
     :path: "../node_modules/@ua/react-native-airship"
   react-native-app-logs:
@@ -3270,6 +3297,7 @@ SPEC CHECKSUMS:
   FirebasePerformance: 0c01a7a496657d7cea86d40c0b1725259d164c6c
   FirebaseRemoteConfig: 2d6e2cfdb49af79535c8af8a80a4a5009038ec2b
   fmt: 10c6e61f4be25dc963c36bd73fc7b1705fe975be
+  ForkInputMask: 55e3fbab504b22da98483e9f9a6514b98fdd2f3c
   FullStory: c8a10b2358c0d33c57be84d16e4c440b0434b33d
   fullstory_react-native: 63a803cca04b0447a71daa73e4df3f7b56e1919d
   glog: 08b301085f15bcbb6ff8632a8ebaf239aae04e6a
@@ -3323,6 +3351,7 @@ SPEC CHECKSUMS:
   React-logger: 26155dc23db5c9038794db915f80bd2044512c2e
   React-Mapbuffer: ad1ba0205205a16dbff11b8ade6d1b3959451658
   React-microtasksnativemodule: e771eb9eb6ace5884ee40a293a0e14a9d7a4343c
+  react-native-advanced-input-mask: 22e3bd2a0f38fada50b475c98bf39d39053097a3
   react-native-airship: e10f6823d8da49bbcb2db4bdb16ff954188afccc
   react-native-app-logs: ee32b6e80bf8d1b883dfc5ac96efa7c1bd9a06a5
   react-native-blob-util: 221c61c98ae507b758472ac4d2d489119d1a6c44
diff --git a/package-lock.json b/package-lock.json
index 1147dbf592ef..167a9c9fa843 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -79,6 +79,7 @@
         "react-fast-pdf": "^1.0.22",
         "react-map-gl": "^7.1.3",
         "react-native": "0.76.3",
+        "react-native-advanced-input-mask": "1.2.1",
         "react-native-android-location-enabler": "^2.0.1",
         "react-native-app-logs": "0.3.1",
         "react-native-blob-util": "0.19.4",
@@ -32027,6 +32028,23 @@
         }
       }
     },
+    "node_modules/react-native-advanced-input-mask": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/react-native-advanced-input-mask/-/react-native-advanced-input-mask-1.2.1.tgz",
+      "integrity": "sha512-qXK6l8f5zOLrWxhrtA2od4R2UsV8OEcvFlZlX5VTp3sB/JlHW/iJd15m8Rgn/mcJFfvnKlHmVVHJefDrUOJFvA==",
+      "license": "MIT",
+      "workspaces": [
+        "example",
+        "WebExample"
+      ],
+      "engines": {
+        "node": ">= 18.0.0"
+      },
+      "peerDependencies": {
+        "react": "*",
+        "react-native": "*"
+      }
+    },
     "node_modules/react-native-android-location-enabler": {
       "version": "2.0.1",
       "license": "MIT",
diff --git a/package.json b/package.json
index 88ec87bff8d0..94ded80495b4 100644
--- a/package.json
+++ b/package.json
@@ -144,6 +144,7 @@
     "react-fast-pdf": "^1.0.22",
     "react-map-gl": "^7.1.3",
     "react-native": "0.76.3",
+    "react-native-advanced-input-mask": "1.2.1",
     "react-native-android-location-enabler": "^2.0.1",
     "react-native-app-logs": "0.3.1",
     "react-native-blob-util": "0.19.4",
diff --git a/src/components/AmountWithoutCurrencyInput.tsx b/src/components/AmountWithoutCurrencyInput.tsx
new file mode 100644
index 000000000000..4d54258dbef0
--- /dev/null
+++ b/src/components/AmountWithoutCurrencyInput.tsx
@@ -0,0 +1,46 @@
+import React from 'react';
+import type {ForwardedRef} from 'react';
+import CONST from '@src/CONST';
+import TextInput from './TextInput';
+import type {BaseTextInputProps, BaseTextInputRef} from './TextInput/BaseTextInput/types';
+
+type AmountFormProps = {
+    /** Amount supplied by the FormProvider */
+    value?: string;
+
+    /** Callback to update the amount in the FormProvider */
+    onInputChange?: (value: string) => void;
+
+    /** Should we allow negative number as valid input */
+    shouldAllowNegative?: boolean;
+} & Partial<BaseTextInputProps>;
+
+function AmountWithoutCurrencyInput(
+    {value: amount, shouldAllowNegative = false, inputID, name, defaultValue, accessibilityLabel, role, label, ...rest}: AmountFormProps,
+    ref: ForwardedRef<BaseTextInputRef>,
+) {
+    return (
+        <TextInput
+            inputID={inputID}
+            name={name}
+            label={label}
+            defaultValue={defaultValue}
+            accessibilityLabel={accessibilityLabel}
+            role={role}
+            ref={ref}
+            keyboardType={!shouldAllowNegative ? CONST.KEYBOARD_TYPE.DECIMAL_PAD : undefined}
+            type="mask"
+            mask="[09999999].[09]"
+            allowedKeys="0123456789.,"
+            // On android autoCapitalize="words" is necessary when keyboardType="decimal-pad" or inputMode="decimal" to prevent input lag.
+            // See https://github.com/Expensify/App/issues/51868 for more information
+            autoCapitalize="words"
+            // eslint-disable-next-line react/jsx-props-no-spreading
+            {...rest}
+        />
+    );
+}
+
+AmountWithoutCurrencyInput.displayName = 'AmountWithoutCurrencyForm';
+
+export default React.forwardRef(AmountWithoutCurrencyInput);
diff --git a/src/components/Form/FormProvider.tsx b/src/components/Form/FormProvider.tsx
index 0b84f0034035..bf3746b61776 100644
--- a/src/components/Form/FormProvider.tsx
+++ b/src/components/Form/FormProvider.tsx
@@ -326,7 +326,8 @@ function FormProvider(
                 value: inputValues[inputID],
                 // As the text input is controlled, we never set the defaultValue prop
                 // as this is already happening by the value prop.
-                defaultValue: undefined,
+                // If it's uncontrolled, then we set the `defaultValue` prop to actual value
+                defaultValue: inputProps.uncontrolled ? inputProps.defaultValue : undefined,
                 onTouched: (event) => {
                     if (!inputProps.shouldSetTouchedOnBlurOnly) {
                         setTimeout(() => {
diff --git a/src/components/Form/types.ts b/src/components/Form/types.ts
index d6bcc28e09bf..02cc4e899b32 100644
--- a/src/components/Form/types.ts
+++ b/src/components/Form/types.ts
@@ -118,6 +118,7 @@ type InputComponentBaseProps<TValue extends ValueTypeKey = ValueTypeKey> = Input
     autoGrowHeight?: boolean;
     blurOnSubmit?: boolean;
     shouldSubmitForm?: boolean;
+    uncontrolled?: boolean;
 };
 
 type FormOnyxValues<TFormID extends OnyxFormKey = OnyxFormKey> = Omit<OnyxValues[TFormID], keyof BaseForm>;
diff --git a/src/components/RNMaskedTextInput.tsx b/src/components/RNMaskedTextInput.tsx
new file mode 100644
index 000000000000..22a69d2c7fbd
--- /dev/null
+++ b/src/components/RNMaskedTextInput.tsx
@@ -0,0 +1,39 @@
+import type {ForwardedRef} from 'react';
+import React from 'react';
+import type {TextInput} from 'react-native';
+import type {MaskedTextInputProps} from 'react-native-advanced-input-mask';
+import {MaskedTextInput} from 'react-native-advanced-input-mask';
+import Animated from 'react-native-reanimated';
+import useTheme from '@hooks/useTheme';
+
+// Convert the underlying TextInput into an Animated component so that we can take an animated ref and pass it to a worklet
+const AnimatedTextInput = Animated.createAnimatedComponent(MaskedTextInput);
+
+type AnimatedTextInputRef = typeof AnimatedTextInput & TextInput & HTMLInputElement;
+
+function RNMaskedTextInputWithRef(props: MaskedTextInputProps, ref: ForwardedRef<AnimatedTextInputRef>) {
+    const theme = useTheme();
+
+    return (
+        <AnimatedTextInput
+            // disable autocomplete to prevent part of mask to be present on Android when value is empty
+            autocomplete={false}
+            allowFontScaling={false}
+            textBreakStrategy="simple"
+            keyboardAppearance={theme.colorScheme}
+            ref={(refHandle) => {
+                if (typeof ref !== 'function') {
+                    return;
+                }
+                ref(refHandle as AnimatedTextInputRef);
+            }}
+            // eslint-disable-next-line
+            {...props}
+        />
+    );
+}
+
+RNMaskedTextInputWithRef.displayName = 'RNMaskedTextInputWithRef';
+
+export default React.forwardRef(RNMaskedTextInputWithRef);
+export type {AnimatedTextInputRef};
diff --git a/src/components/Search/SearchAutocompleteInput.tsx b/src/components/Search/SearchAutocompleteInput.tsx
index ae18442745de..2fea54f5d0ce 100644
--- a/src/components/Search/SearchAutocompleteInput.tsx
+++ b/src/components/Search/SearchAutocompleteInput.tsx
@@ -138,7 +138,7 @@ function SearchAutocompleteInput(
                         isLoading={!!isSearchingForReports}
                         ref={ref}
                         onKeyPress={handleKeyPress(onSubmit)}
-                        isMarkdownEnabled
+                        type="markdown"
                         multiline={false}
                         parser={(input: string) => {
                             'worklet';
diff --git a/src/components/TextInput/BaseTextInput/implementations.ts b/src/components/TextInput/BaseTextInput/implementations.ts
new file mode 100644
index 000000000000..80b91ace7cff
--- /dev/null
+++ b/src/components/TextInput/BaseTextInput/implementations.ts
@@ -0,0 +1,14 @@
+import RNMarkdownTextInput from '@components/RNMarkdownTextInput';
+import RNMaskedTextInput from '@components/RNMaskedTextInput';
+import RNTextInput from '@components/RNTextInput';
+import type {BaseTextInputProps, InputType} from './types';
+
+type InputComponentType = React.ComponentType<BaseTextInputProps>;
+
+const InputComponentMap = new Map<InputType, InputComponentType>([
+    ['default', RNTextInput],
+    ['mask', RNMaskedTextInput as InputComponentType],
+    ['markdown', RNMarkdownTextInput],
+]);
+
+export default InputComponentMap;
diff --git a/src/components/TextInput/BaseTextInput/index.native.tsx b/src/components/TextInput/BaseTextInput/index.native.tsx
index 8d1800ce3b65..af537a981cee 100644
--- a/src/components/TextInput/BaseTextInput/index.native.tsx
+++ b/src/components/TextInput/BaseTextInput/index.native.tsx
@@ -10,7 +10,6 @@ import Icon from '@components/Icon';
 import * as Expensicons from '@components/Icon/Expensicons';
 import PressableWithoutFeedback from '@components/Pressable/PressableWithoutFeedback';
 import type {AnimatedMarkdownTextInputRef} from '@components/RNMarkdownTextInput';
-import RNMarkdownTextInput from '@components/RNMarkdownTextInput';
 import type {AnimatedTextInputRef} from '@components/RNTextInput';
 import RNTextInput from '@components/RNTextInput';
 import Text from '@components/Text';
@@ -26,6 +25,7 @@ import useThemeStyles from '@hooks/useThemeStyles';
 import isInputAutoFilled from '@libs/isInputAutoFilled';
 import variables from '@styles/variables';
 import CONST from '@src/CONST';
+import InputComponentMap from './implementations';
 import type {BaseTextInputProps, BaseTextInputRef} from './types';
 
 function BaseTextInput(
@@ -62,7 +62,7 @@ function BaseTextInput(
         prefixCharacter = '',
         suffixCharacter = '',
         inputID,
-        isMarkdownEnabled = false,
+        type = 'default',
         excludedMarkdownStyles = [],
         shouldShowClearButton = false,
         prefixContainerStyle = [],
@@ -71,11 +71,13 @@ function BaseTextInput(
         suffixStyle = [],
         contentWidth,
         loadingSpinnerStyle,
+        uncontrolled,
         ...props
     }: BaseTextInputProps,
     ref: ForwardedRef<BaseTextInputRef>,
 ) {
-    const InputComponent = isMarkdownEnabled ? RNMarkdownTextInput : RNTextInput;
+    const InputComponent = InputComponentMap.get(type) ?? RNTextInput;
+    const isMarkdownEnabled = type === 'markdown';
     const isAutoGrowHeightMarkdown = isMarkdownEnabled && autoGrowHeight;
 
     const inputProps = {shouldSaveDraft: false, shouldUseDefaultValue: false, ...props};
@@ -379,7 +381,7 @@ function BaseTextInput(
                                 showSoftInputOnFocus={!disableKeyboard}
                                 keyboardType={inputProps.keyboardType}
                                 inputMode={!disableKeyboard ? inputProps.inputMode : CONST.INPUT_MODE.NONE}
-                                value={value}
+                                value={uncontrolled ? undefined : value}
                                 selection={inputProps.selection}
                                 readOnly={isReadOnly}
                                 defaultValue={defaultValue}
diff --git a/src/components/TextInput/BaseTextInput/index.tsx b/src/components/TextInput/BaseTextInput/index.tsx
index 7c16345f0709..ec9f7a7249c0 100644
--- a/src/components/TextInput/BaseTextInput/index.tsx
+++ b/src/components/TextInput/BaseTextInput/index.tsx
@@ -10,7 +10,6 @@ import Icon from '@components/Icon';
 import * as Expensicons from '@components/Icon/Expensicons';
 import PressableWithoutFeedback from '@components/Pressable/PressableWithoutFeedback';
 import type {AnimatedMarkdownTextInputRef} from '@components/RNMarkdownTextInput';
-import RNMarkdownTextInput from '@components/RNMarkdownTextInput';
 import type {AnimatedTextInputRef} from '@components/RNTextInput';
 import RNTextInput from '@components/RNTextInput';
 import SwipeInterceptPanResponder from '@components/SwipeInterceptPanResponder';
@@ -29,6 +28,7 @@ import {scrollToRight} from '@libs/InputUtils';
 import isInputAutoFilled from '@libs/isInputAutoFilled';
 import variables from '@styles/variables';
 import CONST from '@src/CONST';
+import InputComponentMap from './implementations';
 import type {BaseTextInputProps, BaseTextInputRef} from './types';
 
 function BaseTextInput(
@@ -65,7 +65,7 @@ function BaseTextInput(
         prefixCharacter = '',
         suffixCharacter = '',
         inputID,
-        isMarkdownEnabled = false,
+        type = 'default',
         excludedMarkdownStyles = [],
         shouldShowClearButton = false,
         shouldUseDisabledStyles = true,
@@ -75,11 +75,13 @@ function BaseTextInput(
         suffixStyle = [],
         contentWidth,
         loadingSpinnerStyle,
+        uncontrolled = false,
         ...inputProps
     }: BaseTextInputProps,
     ref: ForwardedRef<BaseTextInputRef>,
 ) {
-    const InputComponent = isMarkdownEnabled ? RNMarkdownTextInput : RNTextInput;
+    const InputComponent = InputComponentMap.get(type) ?? RNTextInput;
+    const isMarkdownEnabled = type === 'markdown';
     const isAutoGrowHeightMarkdown = isMarkdownEnabled && autoGrowHeight;
 
     const theme = useTheme();
@@ -382,7 +384,7 @@ function BaseTextInput(
                                 onPressOut={inputProps.onPress}
                                 showSoftInputOnFocus={!disableKeyboard}
                                 inputMode={inputProps.inputMode}
-                                value={value}
+                                value={uncontrolled ? undefined : value}
                                 selection={inputProps.selection}
                                 readOnly={isReadOnly}
                                 defaultValue={defaultValue}
diff --git a/src/components/TextInput/BaseTextInput/types.ts b/src/components/TextInput/BaseTextInput/types.ts
index af4631604579..105d48625131 100644
--- a/src/components/TextInput/BaseTextInput/types.ts
+++ b/src/components/TextInput/BaseTextInput/types.ts
@@ -1,8 +1,10 @@
 import type {MarkdownRange, MarkdownStyle} from '@expensify/react-native-live-markdown';
 import type {GestureResponderEvent, StyleProp, TextInputProps, TextStyle, ViewStyle} from 'react-native';
+import type {MaskedTextInputOwnProps} from 'react-native-advanced-input-mask/lib/typescript/src/types';
 import type {AnimatedTextInputRef} from '@components/RNTextInput';
 import type IconAsset from '@src/types/utils/IconAsset';
 
+type InputType = 'markdown' | 'mask' | 'default';
 type CustomBaseTextInputProps = {
     /** Input label */
     label?: string;
@@ -116,12 +118,12 @@ type CustomBaseTextInputProps = {
     /** Type of autocomplete */
     autoCompleteType?: string;
 
-    /** Should live markdown be enabled. Changes RNTextInput component to RNMarkdownTextInput */
-    isMarkdownEnabled?: boolean;
-
     /** List of markdowns that won't be styled as a markdown */
     excludedMarkdownStyles?: Array<keyof MarkdownStyle>;
 
+    /** A set of styles for markdown elements (such as link, h1, emoji etc.) */
+    markdownStyle?: MarkdownStyle;
+
     /** Custom parser function for RNMarkdownTextInput */
     parser?: (input: string) => MarkdownRange[];
 
@@ -148,10 +150,22 @@ type CustomBaseTextInputProps = {
 
     /** The width of inner content */
     contentWidth?: number;
+
+    /** The type (internal implementation) of input. Can be one of: `default`, `mask`, `markdown` */
+    type?: InputType;
+
+    /** The mask of the masked input */
+    mask?: MaskedTextInputOwnProps['mask'];
+
+    /** A set of permitted characters for the input */
+    allowedKeys?: MaskedTextInputOwnProps['allowedKeys'];
+
+    /** Whether the input should be enforced to be uncontrolled. Default is `false` */
+    uncontrolled?: boolean;
 };
 
 type BaseTextInputRef = HTMLFormElement | AnimatedTextInputRef;
 
 type BaseTextInputProps = CustomBaseTextInputProps & TextInputProps;
 
-export type {BaseTextInputProps, BaseTextInputRef, CustomBaseTextInputProps};
+export type {BaseTextInputProps, BaseTextInputRef, CustomBaseTextInputProps, InputType};
diff --git a/src/pages/PrivateNotes/PrivateNotesEditPage.tsx b/src/pages/PrivateNotes/PrivateNotesEditPage.tsx
index deab122e3006..42e83dbff6b0 100644
--- a/src/pages/PrivateNotes/PrivateNotesEditPage.tsx
+++ b/src/pages/PrivateNotes/PrivateNotesEditPage.tsx
@@ -18,12 +18,12 @@ import Navigation from '@libs/Navigation/Navigation';
 import type {PlatformStackScreenProps} from '@libs/Navigation/PlatformStackNavigation/types';
 import type {PrivateNotesNavigatorParamList} from '@libs/Navigation/types';
 import Parser from '@libs/Parser';
-import * as ReportUtils from '@libs/ReportUtils';
+import {goBackFromPrivateNotes, navigateToDetailsPage} from '@libs/ReportUtils';
 import updateMultilineInputRange from '@libs/updateMultilineInputRange';
 import type {WithReportAndPrivateNotesOrNotFoundProps} from '@pages/home/report/withReportAndPrivateNotesOrNotFound';
 import withReportAndPrivateNotesOrNotFound from '@pages/home/report/withReportAndPrivateNotesOrNotFound';
 import variables from '@styles/variables';
-import * as ReportActions from '@userActions/Report';
+import {clearPrivateNotesError, getDraftPrivateNote, handleUserDeletedLinksInHtml, savePrivateNotesDraft, updatePrivateNotes} from '@userActions/Report';
 import CONST from '@src/CONST';
 import ONYXKEYS from '@src/ONYXKEYS';
 import ROUTES from '@src/ROUTES';
@@ -46,7 +46,7 @@ function PrivateNotesEditPage({route, report, accountID}: PrivateNotesEditPagePr
 
     // We need to edit the note in markdown format, but display it in HTML format
     const [privateNote, setPrivateNote] = useState(
-        () => ReportActions.getDraftPrivateNote(report.reportID).trim() || Parser.htmlToMarkdown(report?.privateNotes?.[Number(route.params.accountID)]?.note ?? '').trim(),
+        () => getDraftPrivateNote(report.reportID).trim() || Parser.htmlToMarkdown(report?.privateNotes?.[Number(route.params.accountID)]?.note ?? '').trim(),
     );
 
     /**
@@ -56,7 +56,7 @@ function PrivateNotesEditPage({route, report, accountID}: PrivateNotesEditPagePr
     const debouncedSavePrivateNote = useMemo(
         () =>
             lodashDebounce((text: string) => {
-                ReportActions.savePrivateNotesDraft(report.reportID, text);
+                savePrivateNotesDraft(report.reportID, text);
             }, 1000),
         [report.reportID],
     );
@@ -85,8 +85,8 @@ function PrivateNotesEditPage({route, report, accountID}: PrivateNotesEditPagePr
         const originalNote = report?.privateNotes?.[Number(route.params.accountID)]?.note ?? '';
         let editedNote = '';
         if (privateNote.trim() !== originalNote.trim()) {
-            editedNote = ReportActions.handleUserDeletedLinksInHtml(privateNote.trim(), Parser.htmlToMarkdown(originalNote).trim());
-            ReportActions.updatePrivateNotes(report.reportID, Number(route.params.accountID), editedNote);
+            editedNote = handleUserDeletedLinksInHtml(privateNote.trim(), Parser.htmlToMarkdown(originalNote).trim());
+            updatePrivateNotes(report.reportID, Number(route.params.accountID), editedNote);
         }
 
         // We want to delete saved private note draft after saving the note
@@ -94,7 +94,7 @@ function PrivateNotesEditPage({route, report, accountID}: PrivateNotesEditPagePr
 
         Keyboard.dismiss();
         if (!Object.values<Note>({...report.privateNotes, [route.params.accountID]: {note: editedNote}}).some((item) => item.note)) {
-            ReportUtils.navigateToDetailsPage(report, backTo);
+            navigateToDetailsPage(report, backTo);
         } else {
             Navigation.setNavigationActionToMicrotaskQueue(() => Navigation.goBack(ROUTES.PRIVATE_NOTES_LIST.getRoute(report.reportID, backTo)));
         }
@@ -108,7 +108,7 @@ function PrivateNotesEditPage({route, report, accountID}: PrivateNotesEditPagePr
         >
             <HeaderWithBackButton
                 title={translate('privateNotes.title')}
-                onBackButtonPress={() => ReportUtils.goBackFromPrivateNotes(report, accountID, backTo)}
+                onBackButtonPress={() => goBackFromPrivateNotes(report, accountID, backTo)}
                 shouldShowBackButton
                 onCloseButtonPress={() => Navigation.dismissModal()}
             />
@@ -130,7 +130,7 @@ function PrivateNotesEditPage({route, report, accountID}: PrivateNotesEditPagePr
                     errors={{
                         ...(report?.privateNotes?.[Number(route.params.accountID)]?.errors ?? ''),
                     }}
-                    onClose={() => ReportActions.clearPrivateNotesError(report.reportID, Number(route.params.accountID))}
+                    onClose={() => clearPrivateNotesError(report.reportID, Number(route.params.accountID))}
                     style={[styles.mb3]}
                 >
                     <InputWrapper
@@ -159,7 +159,7 @@ function PrivateNotesEditPage({route, report, accountID}: PrivateNotesEditPagePr
                             }
                             privateNotesInput.current = el;
                         }}
-                        isMarkdownEnabled
+                        type="markdown"
                     />
                 </OfflineWithFeedback>
             </FormProvider>
diff --git a/src/pages/RoomDescriptionPage.tsx b/src/pages/RoomDescriptionPage.tsx
index 69faef68f766..9017b3f8ed7e 100644
--- a/src/pages/RoomDescriptionPage.tsx
+++ b/src/pages/RoomDescriptionPage.tsx
@@ -17,10 +17,10 @@ import Navigation from '@libs/Navigation/Navigation';
 import type {PlatformStackRouteProp} from '@libs/Navigation/PlatformStackNavigation/types';
 import type {ReportDescriptionNavigatorParamList} from '@libs/Navigation/types';
 import Parser from '@libs/Parser';
-import * as ReportUtils from '@libs/ReportUtils';
+import {canEditReportDescription, getReportDescription} from '@libs/ReportUtils';
 import updateMultilineInputRange from '@libs/updateMultilineInputRange';
 import variables from '@styles/variables';
-import * as Report from '@userActions/Report';
+import {updateDescription} from '@userActions/Report';
 import CONST from '@src/CONST';
 import ONYXKEYS from '@src/ONYXKEYS';
 import ROUTES from '@src/ROUTES';
@@ -40,7 +40,7 @@ function RoomDescriptionPage({report, policies}: RoomDescriptionPageProps) {
     const route = useRoute<PlatformStackRouteProp<ReportDescriptionNavigatorParamList, typeof SCREENS.REPORT_DESCRIPTION_ROOT>>();
     const backTo = route.params.backTo;
     const styles = useThemeStyles();
-    const [description, setDescription] = useState(() => Parser.htmlToMarkdown(ReportUtils.getReportDescription(report)));
+    const [description, setDescription] = useState(() => Parser.htmlToMarkdown(getReportDescription(report)));
     const reportDescriptionInputRef = useRef<BaseTextInputRef | null>(null);
     const focusTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);
     const {translate} = useLocalize();
@@ -58,7 +58,7 @@ function RoomDescriptionPage({report, policies}: RoomDescriptionPageProps) {
         const previousValue = report?.description ?? '';
         const newValue = description.trim();
 
-        Report.updateDescription(report.reportID, previousValue, newValue);
+        updateDescription(report.reportID, previousValue, newValue);
         goBack();
     }, [report.reportID, report.description, description, goBack]);
 
@@ -76,7 +76,7 @@ function RoomDescriptionPage({report, policies}: RoomDescriptionPageProps) {
         }, []),
     );
 
-    const canEdit = ReportUtils.canEditReportDescription(report, policy);
+    const canEdit = canEditReportDescription(report, policy);
     return (
         <ScreenWrapper
             shouldEnableMaxHeight
@@ -118,7 +118,7 @@ function RoomDescriptionPage({report, policies}: RoomDescriptionPageProps) {
                             value={description}
                             onChangeText={handleReportDescriptionChange}
                             autoCapitalize="none"
-                            isMarkdownEnabled
+                            type="markdown"
                         />
                     </View>
                 </FormProvider>
diff --git a/src/pages/Search/SearchAdvancedFiltersPage/SearchFiltersAmountPage.tsx b/src/pages/Search/SearchAdvancedFiltersPage/SearchFiltersAmountPage.tsx
index 6473da9fc9f5..913387703053 100644
--- a/src/pages/Search/SearchAdvancedFiltersPage/SearchFiltersAmountPage.tsx
+++ b/src/pages/Search/SearchAdvancedFiltersPage/SearchFiltersAmountPage.tsx
@@ -1,7 +1,7 @@
 import React from 'react';
 import {View} from 'react-native';
 import {useOnyx} from 'react-native-onyx';
-import AmountWithoutCurrencyForm from '@components/AmountWithoutCurrencyForm';
+import AmountWithoutCurrencyInput from '@components/AmountWithoutCurrencyInput';
 import FormProvider from '@components/Form/FormProvider';
 import InputWrapper from '@components/Form/InputWrapper';
 import type {FormOnyxValues} from '@components/Form/types';
@@ -61,7 +61,7 @@ function SearchFiltersAmountPage() {
             >
                 <View style={styles.mb5}>
                     <InputWrapper
-                        InputComponent={AmountWithoutCurrencyForm}
+                        InputComponent={AmountWithoutCurrencyInput}
                         inputID={INPUT_IDS.GREATER_THAN}
                         name={INPUT_IDS.GREATER_THAN}
                         defaultValue={greaterThanFormattedAmount}
@@ -69,17 +69,19 @@ function SearchFiltersAmountPage() {
                         accessibilityLabel={translate('search.filters.amount.greaterThan')}
                         role={CONST.ROLE.PRESENTATION}
                         ref={inputCallbackRef}
+                        uncontrolled
                     />
                 </View>
                 <View style={styles.mb5}>
                     <InputWrapper
-                        InputComponent={AmountWithoutCurrencyForm}
+                        InputComponent={AmountWithoutCurrencyInput}
                         inputID={INPUT_IDS.LESS_THAN}
                         name={INPUT_IDS.LESS_THAN}
                         defaultValue={lessThanFormattedAmount}
                         label={translate('search.filters.amount.lessThan')}
                         accessibilityLabel={translate('search.filters.amount.lessThan')}
                         role={CONST.ROLE.PRESENTATION}
+                        uncontrolled
                     />
                 </View>
             </FormProvider>
diff --git a/src/pages/iou/request/step/IOURequestStepDescription.tsx b/src/pages/iou/request/step/IOURequestStepDescription.tsx
index f4a8ee827ff1..7006b66ed3b9 100644
--- a/src/pages/iou/request/step/IOURequestStepDescription.tsx
+++ b/src/pages/iou/request/step/IOURequestStepDescription.tsx
@@ -11,14 +11,14 @@ import useAutoFocusInput from '@hooks/useAutoFocusInput';
 import useLocalize from '@hooks/useLocalize';
 import usePolicy from '@hooks/usePolicy';
 import useThemeStyles from '@hooks/useThemeStyles';
-import * as ErrorUtils from '@libs/ErrorUtils';
-import * as IOUUtils from '@libs/IOUUtils';
+import {addErrorMessage} from '@libs/ErrorUtils';
+import {shouldUseTransactionDraft} from '@libs/IOUUtils';
 import Navigation from '@libs/Navigation/Navigation';
-import * as ReportActionsUtils from '@libs/ReportActionsUtils';
-import * as ReportUtils from '@libs/ReportUtils';
-import * as TransactionUtils from '@libs/TransactionUtils';
+import {isMoneyRequestAction} from '@libs/ReportActionsUtils';
+import {canEditMoneyRequest} from '@libs/ReportUtils';
+import {areRequiredFieldsEmpty} from '@libs/TransactionUtils';
 import variables from '@styles/variables';
-import * as IOU from '@userActions/IOU';
+import {setDraftSplitTransaction, setMoneyRequestDescription, updateMoneyRequestDescription} from '@userActions/IOU';
 import CONST from '@src/CONST';
 import ONYXKEYS from '@src/ONYXKEYS';
 import type SCREENS from '@src/SCREENS';
@@ -76,7 +76,7 @@ function IOURequestStepDescription({
             const errors = {};
 
             if (values.moneyRequestComment.length > CONST.DESCRIPTION_LIMIT) {
-                ErrorUtils.addErrorMessage(
+                addErrorMessage(
                     errors,
                     'moneyRequestComment',
                     translate('common.error.characterLimitExceedCounter', {length: values.moneyRequestComment.length, limit: CONST.DESCRIPTION_LIMIT}),
@@ -112,16 +112,16 @@ function IOURequestStepDescription({
 
         // In the split flow, when editing we use SPLIT_TRANSACTION_DRAFT to save draft value
         if (isEditingSplitBill) {
-            IOU.setDraftSplitTransaction(transaction?.transactionID, {comment: newComment});
+            setDraftSplitTransaction(transaction?.transactionID, {comment: newComment});
             navigateBack();
             return;
         }
-        const isTransactionDraft = IOUUtils.shouldUseTransactionDraft(action);
+        const isTransactionDraft = shouldUseTransactionDraft(action);
 
-        IOU.setMoneyRequestDescription(transaction?.transactionID, newComment, isTransactionDraft);
+        setMoneyRequestDescription(transaction?.transactionID, newComment, isTransactionDraft);
 
         if (action === CONST.IOU.ACTION.EDIT) {
-            IOU.updateMoneyRequestDescription(transaction?.transactionID, reportID, newComment, policy, policyTags, policyCategories);
+            updateMoneyRequestDescription(transaction?.transactionID, reportID, newComment, policy, policyTags, policyCategories);
         }
 
         navigateBack();
@@ -129,9 +129,9 @@ function IOURequestStepDescription({
 
     const isEditing = action === CONST.IOU.ACTION.EDIT;
     const isSplitBill = iouType === CONST.IOU.TYPE.SPLIT;
-    const canEditSplitBill = isSplitBill && reportAction && session?.accountID === reportAction.actorAccountID && TransactionUtils.areRequiredFieldsEmpty(transaction);
+    const canEditSplitBill = isSplitBill && reportAction && session?.accountID === reportAction.actorAccountID && areRequiredFieldsEmpty(transaction);
     // eslint-disable-next-line rulesdir/no-negated-variables
-    const shouldShowNotFoundPage = isEditing && (isSplitBill ? !canEditSplitBill : !ReportActionsUtils.isMoneyRequestAction(reportAction) || !ReportUtils.canEditMoneyRequest(reportAction));
+    const shouldShowNotFoundPage = isEditing && (isSplitBill ? !canEditSplitBill : !isMoneyRequestAction(reportAction) || !canEditMoneyRequest(reportAction));
     const isReportInGroupPolicy = !!report?.policyID && report.policyID !== CONST.POLICY.ID_FAKE;
 
     return (
@@ -164,7 +164,7 @@ function IOURequestStepDescription({
                         autoGrowHeight
                         maxAutoGrowHeight={variables.textInputAutoGrowMaxHeight}
                         shouldSubmitForm
-                        isMarkdownEnabled
+                        type="markdown"
                         excludedMarkdownStyles={!isReportInGroupPolicy ? ['mentionReport'] : []}
                         ref={inputCallbackRef}
                     />
diff --git a/src/pages/tasks/NewTaskDescriptionPage.tsx b/src/pages/tasks/NewTaskDescriptionPage.tsx
index 4b2c08c95fb1..e70b6ea15d20 100644
--- a/src/pages/tasks/NewTaskDescriptionPage.tsx
+++ b/src/pages/tasks/NewTaskDescriptionPage.tsx
@@ -11,15 +11,15 @@ import TextInput from '@components/TextInput';
 import useAutoFocusInput from '@hooks/useAutoFocusInput';
 import useLocalize from '@hooks/useLocalize';
 import useThemeStyles from '@hooks/useThemeStyles';
-import * as ErrorUtils from '@libs/ErrorUtils';
+import {addErrorMessage} from '@libs/ErrorUtils';
 import Navigation from '@libs/Navigation/Navigation';
 import type {PlatformStackScreenProps} from '@libs/Navigation/PlatformStackNavigation/types';
 import type {NewTaskNavigatorParamList} from '@libs/Navigation/types';
 import Parser from '@libs/Parser';
-import * as ReportUtils from '@libs/ReportUtils';
+import {getCommentLength} from '@libs/ReportUtils';
 import updateMultilineInputRange from '@libs/updateMultilineInputRange';
 import variables from '@styles/variables';
-import * as TaskActions from '@userActions/Task';
+import {setDescriptionValue} from '@userActions/Task';
 import CONST from '@src/CONST';
 import ONYXKEYS from '@src/ONYXKEYS';
 import ROUTES from '@src/ROUTES';
@@ -41,15 +41,15 @@ function NewTaskDescriptionPage({task, route}: NewTaskDescriptionPageProps) {
 
     const goBack = () => Navigation.goBack(ROUTES.NEW_TASK.getRoute(route.params?.backTo));
     const onSubmit = (values: FormOnyxValues<typeof ONYXKEYS.FORMS.NEW_TASK_FORM>) => {
-        TaskActions.setDescriptionValue(values.taskDescription);
+        setDescriptionValue(values.taskDescription);
         goBack();
     };
 
     const validate = (values: FormOnyxValues<typeof ONYXKEYS.FORMS.NEW_TASK_FORM>): FormInputErrors<typeof ONYXKEYS.FORMS.NEW_TASK_FORM> => {
         const errors = {};
-        const taskDescriptionLength = ReportUtils.getCommentLength(values.taskDescription);
+        const taskDescriptionLength = getCommentLength(values.taskDescription);
         if (taskDescriptionLength > CONST.DESCRIPTION_LIMIT) {
-            ErrorUtils.addErrorMessage(errors, 'taskDescription', translate('common.error.characterLimitExceedCounter', {length: taskDescriptionLength, limit: CONST.DESCRIPTION_LIMIT}));
+            addErrorMessage(errors, 'taskDescription', translate('common.error.characterLimitExceedCounter', {length: taskDescriptionLength, limit: CONST.DESCRIPTION_LIMIT}));
         }
 
         return errors;
@@ -91,7 +91,7 @@ function NewTaskDescriptionPage({task, route}: NewTaskDescriptionPageProps) {
                             autoGrowHeight
                             maxAutoGrowHeight={variables.textInputAutoGrowMaxHeight}
                             shouldSubmitForm
-                            isMarkdownEnabled
+                            type="markdown"
                         />
                     </View>
                 </FormProvider>
diff --git a/src/pages/tasks/NewTaskDetailsPage.tsx b/src/pages/tasks/NewTaskDetailsPage.tsx
index ffb199c6108d..f225727f10c3 100644
--- a/src/pages/tasks/NewTaskDetailsPage.tsx
+++ b/src/pages/tasks/NewTaskDetailsPage.tsx
@@ -11,15 +11,15 @@ import TextInput from '@components/TextInput';
 import useAutoFocusInput from '@hooks/useAutoFocusInput';
 import useLocalize from '@hooks/useLocalize';
 import useThemeStyles from '@hooks/useThemeStyles';
-import * as ErrorUtils from '@libs/ErrorUtils';
+import {addErrorMessage} from '@libs/ErrorUtils';
 import Navigation from '@libs/Navigation/Navigation';
 import type {PlatformStackScreenProps} from '@libs/Navigation/PlatformStackNavigation/types';
 import type {NewTaskNavigatorParamList} from '@libs/Navigation/types';
 import Parser from '@libs/Parser';
-import * as ReportUtils from '@libs/ReportUtils';
+import {getCommentLength} from '@libs/ReportUtils';
 import playSound, {SOUNDS} from '@libs/Sound';
 import variables from '@styles/variables';
-import * as TaskActions from '@userActions/Task';
+import {createTaskAndNavigate, dismissModalAndClearOutTaskInfo, setDetailsValue, setShareDestinationValue} from '@userActions/Task';
 import CONST from '@src/CONST';
 import ONYXKEYS from '@src/ONYXKEYS';
 import ROUTES from '@src/ROUTES';
@@ -56,13 +56,13 @@ function NewTaskDetailsPage({task, route}: NewTaskDetailsPageProps) {
 
         if (!values.taskTitle) {
             // We error if the user doesn't enter a task name
-            ErrorUtils.addErrorMessage(errors, 'taskTitle', translate('newTaskPage.pleaseEnterTaskName'));
+            addErrorMessage(errors, 'taskTitle', translate('newTaskPage.pleaseEnterTaskName'));
         } else if (values.taskTitle.length > CONST.TITLE_CHARACTER_LIMIT) {
-            ErrorUtils.addErrorMessage(errors, 'taskTitle', translate('common.error.characterLimitExceedCounter', {length: values.taskTitle.length, limit: CONST.TITLE_CHARACTER_LIMIT}));
+            addErrorMessage(errors, 'taskTitle', translate('common.error.characterLimitExceedCounter', {length: values.taskTitle.length, limit: CONST.TITLE_CHARACTER_LIMIT}));
         }
-        const taskDescriptionLength = ReportUtils.getCommentLength(values.taskDescription);
+        const taskDescriptionLength = getCommentLength(values.taskDescription);
         if (taskDescriptionLength > CONST.DESCRIPTION_LIMIT) {
-            ErrorUtils.addErrorMessage(errors, 'taskDescription', translate('common.error.characterLimitExceedCounter', {length: taskDescriptionLength, limit: CONST.DESCRIPTION_LIMIT}));
+            addErrorMessage(errors, 'taskDescription', translate('common.error.characterLimitExceedCounter', {length: taskDescriptionLength, limit: CONST.DESCRIPTION_LIMIT}));
         }
 
         return errors;
@@ -71,19 +71,12 @@ function NewTaskDetailsPage({task, route}: NewTaskDetailsPageProps) {
     // On submit, we want to call the assignTask function and wait to validate
     // the response
     const onSubmit = (values: FormOnyxValues<typeof ONYXKEYS.FORMS.NEW_TASK_FORM>) => {
-        TaskActions.setDetailsValue(values.taskTitle, values.taskDescription);
+        setDetailsValue(values.taskTitle, values.taskDescription);
 
         if (skipConfirmation) {
-            TaskActions.setShareDestinationValue(task?.parentReportID ?? '-1');
+            setShareDestinationValue(task?.parentReportID);
             playSound(SOUNDS.DONE);
-            TaskActions.createTaskAndNavigate(
-                task?.parentReportID ?? '-1',
-                values.taskTitle,
-                values.taskDescription ?? '',
-                task?.assignee ?? '',
-                task.assigneeAccountID,
-                task.assigneeChatReport,
-            );
+            createTaskAndNavigate(task?.parentReportID ?? '-1', values.taskTitle, values.taskDescription ?? '', task?.assignee ?? '', task.assigneeAccountID, task.assigneeChatReport);
         } else {
             Navigation.navigate(ROUTES.NEW_TASK.getRoute(backTo));
         }
@@ -98,7 +91,7 @@ function NewTaskDetailsPage({task, route}: NewTaskDetailsPageProps) {
             <HeaderWithBackButton
                 title={translate('newTaskPage.assignTask')}
                 shouldShowBackButton
-                onBackButtonPress={() => TaskActions.dismissModalAndClearOutTaskInfo(backTo)}
+                onBackButtonPress={() => dismissModalAndClearOutTaskInfo(backTo)}
             />
             <FormProvider
                 formID={ONYXKEYS.FORMS.NEW_TASK_FORM}
@@ -136,7 +129,7 @@ function NewTaskDetailsPage({task, route}: NewTaskDetailsPageProps) {
                         defaultValue={Parser.htmlToMarkdown(Parser.replace(taskDescription))}
                         value={taskDescription}
                         onValueChange={setTaskDescription}
-                        isMarkdownEnabled
+                        type="markdown"
                     />
                 </View>
             </FormProvider>
diff --git a/src/pages/tasks/TaskDescriptionPage.tsx b/src/pages/tasks/TaskDescriptionPage.tsx
index 86a7cbc54a23..9fdf1757ca96 100644
--- a/src/pages/tasks/TaskDescriptionPage.tsx
+++ b/src/pages/tasks/TaskDescriptionPage.tsx
@@ -13,17 +13,17 @@ import withCurrentUserPersonalDetails from '@components/withCurrentUserPersonalD
 import type {WithCurrentUserPersonalDetailsProps} from '@components/withCurrentUserPersonalDetails';
 import useLocalize from '@hooks/useLocalize';
 import useThemeStyles from '@hooks/useThemeStyles';
-import * as ErrorUtils from '@libs/ErrorUtils';
+import {addErrorMessage} from '@libs/ErrorUtils';
 import Navigation from '@libs/Navigation/Navigation';
 import type {PlatformStackRouteProp} from '@libs/Navigation/PlatformStackNavigation/types';
 import type {ReportDescriptionNavigatorParamList} from '@libs/Navigation/types';
 import Parser from '@libs/Parser';
-import * as ReportUtils from '@libs/ReportUtils';
+import {getCommentLength, getParsedComment, isOpenTaskReport, isTaskReport} from '@libs/ReportUtils';
 import updateMultilineInputRange from '@libs/updateMultilineInputRange';
 import withReportOrNotFound from '@pages/home/report/withReportOrNotFound';
 import type {WithReportOrNotFoundProps} from '@pages/home/report/withReportOrNotFound';
 import variables from '@styles/variables';
-import * as Task from '@userActions/Task';
+import {canModifyTask, editTask} from '@userActions/Task';
 import CONST from '@src/CONST';
 import ONYXKEYS from '@src/ONYXKEYS';
 import type SCREENS from '@src/SCREENS';
@@ -40,10 +40,10 @@ function TaskDescriptionPage({report, currentUserPersonalDetails}: TaskDescripti
     const validate = useCallback(
         (values: FormOnyxValues<typeof ONYXKEYS.FORMS.EDIT_TASK_FORM>): FormInputErrors<typeof ONYXKEYS.FORMS.EDIT_TASK_FORM> => {
             const errors = {};
-            const parsedDescription = ReportUtils.getParsedComment(values?.description);
-            const taskDescriptionLength = ReportUtils.getCommentLength(parsedDescription);
+            const parsedDescription = getParsedComment(values?.description);
+            const taskDescriptionLength = getCommentLength(parsedDescription);
             if (values?.description && taskDescriptionLength > CONST.DESCRIPTION_LIMIT) {
-                ErrorUtils.addErrorMessage(errors, 'description', translate('common.error.characterLimitExceedCounter', {length: taskDescriptionLength, limit: CONST.DESCRIPTION_LIMIT}));
+                addErrorMessage(errors, 'description', translate('common.error.characterLimitExceedCounter', {length: taskDescriptionLength, limit: CONST.DESCRIPTION_LIMIT}));
             }
 
             return errors;
@@ -56,7 +56,7 @@ function TaskDescriptionPage({report, currentUserPersonalDetails}: TaskDescripti
             if (values.description !== Parser.htmlToMarkdown(report?.description ?? '') && !isEmptyObject(report)) {
                 // Set the description of the report in the store and then call EditTask API
                 // to update the description of the report on the server
-                Task.editTask(report, {description: values.description});
+                editTask(report, {description: values.description});
             }
 
             Navigation.dismissModal(report?.reportID);
@@ -64,7 +64,7 @@ function TaskDescriptionPage({report, currentUserPersonalDetails}: TaskDescripti
         [report],
     );
 
-    if (!ReportUtils.isTaskReport(report)) {
+    if (!isTaskReport(report)) {
         Navigation.isNavigationReady().then(() => {
             Navigation.dismissModal(report?.reportID);
         });
@@ -72,9 +72,9 @@ function TaskDescriptionPage({report, currentUserPersonalDetails}: TaskDescripti
     const inputRef = useRef<AnimatedTextInputRef | null>(null);
     const focusTimeoutRef = useRef<NodeJS.Timeout | null>(null);
 
-    const isOpen = ReportUtils.isOpenTaskReport(report);
-    const canModifyTask = Task.canModifyTask(report, currentUserPersonalDetails.accountID);
-    const isTaskNonEditable = ReportUtils.isTaskReport(report) && (!canModifyTask || !isOpen);
+    const isOpen = isOpenTaskReport(report);
+    const canActuallyModifyTask = canModifyTask(report, currentUserPersonalDetails.accountID);
+    const isTaskNonEditable = isTaskReport(report) && (!canActuallyModifyTask || !isOpen);
 
     useFocusEffect(
         useCallback(() => {
@@ -132,7 +132,7 @@ function TaskDescriptionPage({report, currentUserPersonalDetails}: TaskDescripti
                             autoGrowHeight
                             maxAutoGrowHeight={variables.textInputAutoGrowMaxHeight}
                             shouldSubmitForm
-                            isMarkdownEnabled
+                            type="markdown"
                         />
                     </View>
                 </FormProvider>
diff --git a/src/pages/workspace/WorkspaceNewRoomPage.tsx b/src/pages/workspace/WorkspaceNewRoomPage.tsx
index c64c53306a1f..0ce996d1a2e6 100644
--- a/src/pages/workspace/WorkspaceNewRoomPage.tsx
+++ b/src/pages/workspace/WorkspaceNewRoomPage.tsx
@@ -24,14 +24,14 @@ import usePrevious from '@hooks/usePrevious';
 import useResponsiveLayout from '@hooks/useResponsiveLayout';
 import useSafeAreaInsets from '@hooks/useSafeAreaInsets';
 import useThemeStyles from '@hooks/useThemeStyles';
-import * as ErrorUtils from '@libs/ErrorUtils';
+import {addErrorMessage} from '@libs/ErrorUtils';
 import localeCompare from '@libs/LocaleCompare';
 import Navigation from '@libs/Navigation/Navigation';
-import * as PolicyUtils from '@libs/PolicyUtils';
-import * as ReportUtils from '@libs/ReportUtils';
-import * as ValidationUtils from '@libs/ValidationUtils';
+import {getActivePolicies} from '@libs/PolicyUtils';
+import {buildOptimisticChatReport, getCommentLength, getParsedComment, isPolicyAdmin} from '@libs/ReportUtils';
+import {isExistingRoomName, isReservedRoomName, isValidRoomName} from '@libs/ValidationUtils';
 import variables from '@styles/variables';
-import * as Report from '@userActions/Report';
+import {addPolicyReport, clearNewRoomFormError} from '@userActions/Report';
 import CONST from '@src/CONST';
 import ONYXKEYS from '@src/ONYXKEYS';
 import ROUTES from '@src/ROUTES';
@@ -64,7 +64,7 @@ function WorkspaceNewRoomPage() {
 
     const workspaceOptions = useMemo(
         () =>
-            PolicyUtils.getActivePolicies(policies, session?.email)
+            getActivePolicies(policies, session?.email)
                 ?.filter((policy) => policy.type !== CONST.POLICY.TYPE.PERSONAL)
                 .map((policy) => ({
                     label: policy.name,
@@ -79,12 +79,12 @@ function WorkspaceNewRoomPage() {
         }
         return '';
     });
-    const isPolicyAdmin = useMemo(() => {
+    const isAdminPolicy = useMemo(() => {
         if (!policyID) {
             return false;
         }
 
-        return ReportUtils.isPolicyAdmin(policyID, policies);
+        return isPolicyAdmin(policyID, policies);
     }, [policyID, policies]);
     const [newRoomReportID, setNewRoomReportID] = useState<string>();
 
@@ -92,9 +92,9 @@ function WorkspaceNewRoomPage() {
      * @param values - form input values passed by the Form component
      */
     const submit = (values: FormOnyxValues<typeof ONYXKEYS.FORMS.NEW_ROOM_FORM>) => {
-        const participants = [session?.accountID ?? -1];
-        const parsedDescription = ReportUtils.getParsedComment(values.reportDescription ?? '', {policyID});
-        const policyReport = ReportUtils.buildOptimisticChatReport(
+        const participants = [session?.accountID ?? CONST.DEFAULT_NUMBER_ID];
+        const parsedDescription = getParsedComment(values.reportDescription ?? '', {policyID});
+        const policyReport = buildOptimisticChatReport(
             participants,
             values.roomName,
             CONST.REPORT.CHAT_TYPE.POLICY_ROOM,
@@ -110,11 +110,11 @@ function WorkspaceNewRoomPage() {
             parsedDescription,
         );
         setNewRoomReportID(policyReport.reportID);
-        Report.addPolicyReport(policyReport);
+        addPolicyReport(policyReport);
     };
 
     useEffect(() => {
-        Report.clearNewRoomFormError();
+        clearNewRoomFormError();
     }, []);
 
     useEffect(() => {
@@ -140,12 +140,12 @@ function WorkspaceNewRoomPage() {
     }, [isLoading, errorFields]);
 
     useEffect(() => {
-        if (isPolicyAdmin) {
+        if (isAdminPolicy) {
             return;
         }
 
         setWriteCapability(CONST.REPORT.WRITE_CAPABILITIES.ALL);
-    }, [isPolicyAdmin]);
+    }, [isAdminPolicy]);
 
     /**
      * @param values - form input values passed by the Form component
@@ -157,27 +157,23 @@ function WorkspaceNewRoomPage() {
 
             if (!values.roomName || values.roomName === CONST.POLICY.ROOM_PREFIX) {
                 // We error if the user doesn't enter a room name or left blank
-                ErrorUtils.addErrorMessage(errors, 'roomName', translate('newRoomPage.pleaseEnterRoomName'));
-            } else if (values.roomName !== CONST.POLICY.ROOM_PREFIX && !ValidationUtils.isValidRoomName(values.roomName)) {
+                addErrorMessage(errors, 'roomName', translate('newRoomPage.pleaseEnterRoomName'));
+            } else if (values.roomName !== CONST.POLICY.ROOM_PREFIX && !isValidRoomName(values.roomName)) {
                 // We error if the room name has invalid characters
-                ErrorUtils.addErrorMessage(errors, 'roomName', translate('newRoomPage.roomNameInvalidError'));
-            } else if (ValidationUtils.isReservedRoomName(values.roomName)) {
+                addErrorMessage(errors, 'roomName', translate('newRoomPage.roomNameInvalidError'));
+            } else if (isReservedRoomName(values.roomName)) {
                 // Certain names are reserved for default rooms and should not be used for policy rooms.
-                ErrorUtils.addErrorMessage(errors, 'roomName', translate('newRoomPage.roomNameReservedError', {reservedName: values.roomName}));
-            } else if (ValidationUtils.isExistingRoomName(values.roomName, reports, values.policyID ?? '-1')) {
+                addErrorMessage(errors, 'roomName', translate('newRoomPage.roomNameReservedError', {reservedName: values.roomName}));
+            } else if (isExistingRoomName(values.roomName, reports, values.policyID)) {
                 // Certain names are reserved for default rooms and should not be used for policy rooms.
-                ErrorUtils.addErrorMessage(errors, 'roomName', translate('newRoomPage.roomAlreadyExistsError'));
+                addErrorMessage(errors, 'roomName', translate('newRoomPage.roomAlreadyExistsError'));
             } else if (values.roomName.length > CONST.TITLE_CHARACTER_LIMIT) {
-                ErrorUtils.addErrorMessage(errors, 'roomName', translate('common.error.characterLimitExceedCounter', {length: values.roomName.length, limit: CONST.TITLE_CHARACTER_LIMIT}));
+                addErrorMessage(errors, 'roomName', translate('common.error.characterLimitExceedCounter', {length: values.roomName.length, limit: CONST.TITLE_CHARACTER_LIMIT}));
             }
 
-            const descriptionLength = ReportUtils.getCommentLength(values.reportDescription, {policyID});
+            const descriptionLength = getCommentLength(values.reportDescription, {policyID});
             if (descriptionLength > CONST.REPORT_DESCRIPTION.MAX_LENGTH) {
-                ErrorUtils.addErrorMessage(
-                    errors,
-                    'reportDescription',
-                    translate('common.error.characterLimitExceedCounter', {length: descriptionLength, limit: CONST.REPORT_DESCRIPTION.MAX_LENGTH}),
-                );
+                addErrorMessage(errors, 'reportDescription', translate('common.error.characterLimitExceedCounter', {length: descriptionLength, limit: CONST.REPORT_DESCRIPTION.MAX_LENGTH}));
             }
 
             if (!values.policyID) {
@@ -289,7 +285,7 @@ function WorkspaceNewRoomPage() {
                                 maxLength={CONST.REPORT_DESCRIPTION.MAX_LENGTH}
                                 autoCapitalize="none"
                                 shouldInterceptSwipe
-                                isMarkdownEnabled
+                                type="markdown"
                             />
                         </View>
                         <View style={[styles.mhn5]}>
@@ -302,7 +298,7 @@ function WorkspaceNewRoomPage() {
                                 onValueChange={(value) => setPolicyID(value as typeof policyID)}
                             />
                         </View>
-                        {isPolicyAdmin && (
+                        {isAdminPolicy && (
                             <View style={styles.mhn5}>
                                 <InputWrapper
                                     InputComponent={ValuePicker}
diff --git a/src/pages/workspace/WorkspaceProfileDescriptionPage.tsx b/src/pages/workspace/WorkspaceProfileDescriptionPage.tsx
index 005087d53009..54ee3c1753ef 100644
--- a/src/pages/workspace/WorkspaceProfileDescriptionPage.tsx
+++ b/src/pages/workspace/WorkspaceProfileDescriptionPage.tsx
@@ -103,7 +103,7 @@ function WorkspaceProfileDescriptionPage({policy}: Props) {
                             autoFocus
                             onChangeText={setDescription}
                             autoGrowHeight
-                            isMarkdownEnabled
+                            type="markdown"
                             ref={(el: BaseTextInputRef | null): void => {
                                 if (!isInputInitializedRef.current) {
                                     updateMultilineInputRange(el);
