Repository: splunk/addonfactory-ucc-generator (language: python)

Issue:
BUG: Inputs table do not reflect the changes when input is edited
### Description

The inputs table does not reflect the changes when input is edited.

Steps to reproduce:
1. Create an input on the inputs page
2. Edit the input and change the value of any field. For example - interval.

Expectation:
- The new value should be seen in the inputs table on the page.

Actual:
- The old value is still seen.
- The new value is only seen in the details section.
- Things get correct when the page is refreshed once.

<img width="1339" alt="Screenshot 2024-10-29 at 3 53 18 PM" src="https://github.com/user-attachments/assets/0a401046-125f-4b55-9583-05441154f953">


### What UCC version are you using?

5.51.1

### Additional System Info

Python 3.7, Linux, Mac


Discussion / hints:
Jira ticket was created - https://splunk.atlassian.net/browse/ADDON-76309.

Fix patch:
diff --git a/.coveragerc b/.coveragerc
index 3be3f434a..e6d50447c 100644
--- a/.coveragerc
+++ b/.coveragerc
@@ -6,4 +6,4 @@ omit =
     splunk_add_on_ucc_framework/templates/input.module-template
 
 [report]
-fail_under = 81
+fail_under = 81.5
diff --git a/.gitignore b/.gitignore
index 303e93381..1f5efe983 100644
--- a/.gitignore
+++ b/.gitignore
@@ -38,8 +38,9 @@ site/
 assets/
 Splunk_TA_Dynatrace/*
 Splunk_TA_Dynatrace_ucc/*
-demo_addon_for_splunk/
 demo_addon_for_splunk_already_exists/
+demo_addon_for_splunk_license/
+addon_name
 init_addon_for_ucc_package/
 
 # UI build
diff --git a/README.md b/README.md
index bf43d3868..f08026fc6 100644
--- a/README.md
+++ b/README.md
@@ -1,7 +1,8 @@
-# splunk-add-on-ucc-framework
+# UCC
 
 ![PyPI](https://img.shields.io/pypi/v/splunk-add-on-ucc-framework)
 ![Python](https://img.shields.io/pypi/pyversions/splunk-add-on-ucc-framework.svg)
+![PyPI monthly downloads](https://img.shields.io/pypi/dm/splunk-add-on-ucc-framework)
 
 ## What is UCC?
 
diff --git a/docs/additional_packaging.md b/docs/additional_packaging.md
index ea63cead0..1a3c7c4d4 100644
--- a/docs/additional_packaging.md
+++ b/docs/additional_packaging.md
@@ -2,7 +2,7 @@
 
 To extend the build process, you can create a `additional_packaging.py` file in the same file level where you have your globalConfig file.
 
-This file should at least have:
+This file should have either of the below two functions:
 
 - the `cleanup_output_files` function, which accepts `output_path` (str), `add-on name` (str) as its arguments.
 - the `additional_packaging` function, which accepts `add-on name` (str) as its only argument.
@@ -19,5 +19,5 @@ See the following example for proper usage:
 Below is an example of additional_packaging.py containing both the implementations of functions.
 
 ```python
---8<-- "tests/testdata/test_addons/package_global_config_everything_uccignore/additional_packaging.py"
+--8<-- "tests/testdata/test_addons/package_global_config_everything/additional_packaging.py"
 ```
diff --git a/docs/commands.md b/docs/commands.md
index 8e2c2c28c..1a7199895 100644
--- a/docs/commands.md
+++ b/docs/commands.md
@@ -74,8 +74,11 @@ It takes the following parameters:
 * `--addon-display-name` - [required] add-on "official" name.
 * `--addon-input-name` - [required] name of the generated input.
 * `--addon-version` - [optional] version of the generated add-on, with `0.0.1` by default.
-* `--overwrite` - [optional] overwrites the already existing folder.
-    By default, you can't generate a new add-on to an already existing folder.
+* `--overwrite` - [optional] overwrites the already existing folder. By default, you can't generate a new add-on to an already existing folder.
+* `--add-license` - [optional] Adds license agreement such as [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt), [MIT License](https://mit-license.org/), or
+[SPLUNK PRE-RELEASE SOFTWARE LICENSE AGREEMENT](https://www.splunk.com/en_us/legal/splunk-pre-release-software-license-agreement.html) in your `package/LICENSES` directory. If not mentioned an empty License.txt will be generated.
+
+> **Note:** The add-on will not build if the input for `--add-license` is not one of the following: `Apache License 2.0`, `MIT License`, or `SPLUNK PRE-RELEASE SOFTWARE LICENSE AGREEMENT`. If you want to keep another license in your add-on, place it in `package/LICENSES` directory and it will be shipped
 
 ## `ucc-gen import-from-aob`
 
diff --git a/docs/images/inputs/Tabs_Output.png b/docs/images/inputs/Tabs_Output.png
index b67fb1911..29802f4c3 100644
Binary files a/docs/images/inputs/Tabs_Output.png and b/docs/images/inputs/Tabs_Output.png differ
diff --git a/docs/index.md b/docs/index.md
index 194f2f627..88532b402 100644
--- a/docs/index.md
+++ b/docs/index.md
@@ -4,10 +4,10 @@ Universal Configuration Console (UCC) is a framework that simplifies the process
 
 The UCC framework helps you to maintain consistency and a uniform look and feel across different add-ons. You can easily update and modify your add-ons.
 
-The UCC framework is available as a GitHub action. See <https://github.com/splunk/addonfactory-ucc-generator-action>.
-
 To work with UCC framework, you can also use Splunk Extension. It helps you to create, test, and debug the add-ons in a simple way. For more information, see [Visual Studio Code Extension for Splunk](https://marketplace.visualstudio.com/items?itemName=Splunk.splunk).
 
+To see how UCC can be used in an add-on, see [Example TA](https://github.com/splunk/splunk-example-ta).
+
 ## Libraries
 
 UCC-based add-ons are powered by the following Splunk libraries:
diff --git a/docs/inputs/index.md b/docs/inputs/index.md
index cd32f4b78..7abceb562 100644
--- a/docs/inputs/index.md
+++ b/docs/inputs/index.md
@@ -11,17 +11,18 @@ provided, a dropdown field will appear on the Inputs page. In contrast, a button
 
 ### Properties
 
-| Property                                                                  | Type   | Description                                                                                                                                                                                                                                                                                                                                          |
-| ------------------------------------------------------------------------- | ------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| title<span class="required-asterisk">\*</span>                            | string | -                                                                                                                                                                                                                                                                                                                                                    |
-| description                                                               | string | It provides a brief summary of an inputs page.                                                                                                                                                                                                                                                                                                       |
-| [subDescription](../advanced/sub_description.md)                          | object | It provides broader description of an inputs page.                                                                                                                                                                                                                                                                                                   |
-| menu                                                                      | object | This property allows you to enable the [custom menu](../custom_ui_extensions/custom_menu.md) feature.                                                                                                                                                                                                                                                |
-| [table](../table.md)                                                      | object | It displays input stanzas in a tabular format.                                                                                                                                                                                                                                                                                                       |
-| groupsMenu                                                                | array  | This property allows you to enable the [multi-level menu](./multilevel_menu.md) feature.                                                                                                                                                                                                                                                             |
-| [services](#services-properties)<span class="required-asterisk">\*</span> | array  | It specifies a list of modular inputs.                                                                                                                                                                                                                                                                                                               |
-| readonlyFieldId                                                           | string | A field of the boolean entity that UCC checks for each input. If the field's value is [truthful](https://docs.splunk.com/Documentation/Splunk/latest/SearchReference/ListOfDataTypes), the corresponding input cannot be edited from the UI. There is no way to change this from the UI; it is supposed to be changed via REST.                      |
-| hideFieldId                                                               | string | A field of the boolean entity that UCC checks for each input. If the field's value is [truthful](https://docs.splunk.com/Documentation/Splunk/latest/SearchReference/ListOfDataTypes), the corresponding input is hidden from the UI. There is no way to change this from the UI; it is supposed to be changed via REST. Check out an example below. |
+| Property                                                                  | Type    | Description                                                                                                                                                                                                                                                                                                                                          |
+| ------------------------------------------------------------------------- | ------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| title<span class="required-asterisk">\*</span>                            | string  | -                                                                                                                                                                                                                                                                                                                                                    |
+| description                                                               | string  | It provides a brief summary of an inputs page.                                                                                                                                                                                                                                                                                                       |
+| [subDescription](../advanced/sub_description.md)                          | object  | It provides broader description of an inputs page.                                                                                                                                                                                                                                                                                                   |
+| menu                                                                      | object  | This property allows you to enable the [custom menu](../custom_ui_extensions/custom_menu.md) feature.                                                                                                                                                                                                                                                |
+| [table](../table.md)                                                      | object  | It displays input stanzas in a tabular format.                                                                                                                                                                                                                                                                                                       |
+| groupsMenu                                                                | array   | This property allows you to enable the [multi-level menu](./multilevel_menu.md) feature.                                                                                                                                                                                                                                                             |
+| [services](#services-properties)<span class="required-asterisk">\*</span> | array   | It specifies a list of modular inputs.                                                                                                                                                                                                                                                                                                               |
+| readonlyFieldId                                                           | string  | A field of the boolean entity that UCC checks for each input. If the field's value is [truthful](https://docs.splunk.com/Documentation/Splunk/latest/SearchReference/ListOfDataTypes), the corresponding input cannot be edited from the UI. There is no way to change this from the UI; it is supposed to be changed via REST.                      |
+| hideFieldId                                                               | string  | A field of the boolean entity that UCC checks for each input. If the field's value is [truthful](https://docs.splunk.com/Documentation/Splunk/latest/SearchReference/ListOfDataTypes), the corresponding input is hidden from the UI. There is no way to change this from the UI; it is supposed to be changed via REST. Check out an example below. |
+| useInputToggleConfirmation                                                | boolean | When true, displays a confirmation modal before toggling an input's status between active and inactive.                                                                                                                                                                                                                                                                 |
 
 ### Services Properties
 
diff --git a/docs/quickstart.md b/docs/quickstart.md
index 917028ebf..02c25370f 100644
--- a/docs/quickstart.md
+++ b/docs/quickstart.md
@@ -22,7 +22,7 @@ Depending on which operating system you use, follow one of the procedures:
 Set up the Python virtual environment:
 
 ```bash
- python3 -m venv .venv
+python3 -m venv .venv
 ```
 
 If you use cmd.exe, activate the virtual environment with the following command:
@@ -42,8 +42,8 @@ If you use PowerShell, activate the virtual environment with the following comma
 Set up and activate the Python virtual environment:
 
 ```bash
- python3 -m venv .venv
- source .venv/bin/activate
+python3 -m venv .venv
+source .venv/bin/activate
 ```
 
 ### Install UCC package
@@ -75,7 +75,7 @@ ucc-gen build --source demo_addon_for_splunk/package
 ### Package the add-on
 
 ```bash
-ucc-gen package --path output/<add-on-name>
+ucc-gen package --path output/demo_addon_for_splunk
 ```
 
 The archive is created on the same level as your `globalConfig.json` file.
diff --git a/poetry.lock b/poetry.lock
index 138e67e22..bcd31c78f 100644
--- a/poetry.lock
+++ b/poetry.lock
@@ -1283,13 +1283,13 @@ xmltodict = ">=0.13.0,<0.14.0"
 
 [[package]]
 name = "pytest-splunk-addon-ui-smartx"
-version = "5.3.0"
+version = "5.3.1"
 description = "Library to support testing Splunk Add-on UX"
 optional = false
 python-versions = "<4.0,>=3.7"
 files = [
-    {file = "pytest_splunk_addon_ui_smartx-5.3.0-py3-none-any.whl", hash = "sha256:bd3b646469d869757d9fef4be9129fa373265121f027af21729828aa38726392"},
-    {file = "pytest_splunk_addon_ui_smartx-5.3.0.tar.gz", hash = "sha256:0b684382320aaf18b0047fd61a32fc9df232bd06d8b2b47b3716a65236390b26"},
+    {file = "pytest_splunk_addon_ui_smartx-5.3.1-py3-none-any.whl", hash = "sha256:a7a095e8b0f61f212ab569ec67e5ab4e44dc9e77acf05e3f01c9cacd99f959fe"},
+    {file = "pytest_splunk_addon_ui_smartx-5.3.1.tar.gz", hash = "sha256:eacb9cf725bb4bbfe6646eee3bbed3a585b6ea190879d9ed5afc5db784e1b0aa"},
 ]
 
 [package.dependencies]
@@ -1782,4 +1782,4 @@ testing = ["big-O", "flake8 (<5)", "jaraco.functools", "jaraco.itertools", "more
 [metadata]
 lock-version = "2.0"
 python-versions = ">=3.7,<3.13"
-content-hash = "0435209576291a24a097f17bcf32f89216d592fb01e88fe72c521cb7379ff474"
+content-hash = "ec35c6372a95df5d2d6e94ae22b949438cbcddfb05737c643c6990a79a32e140"
diff --git a/pyproject.toml b/pyproject.toml
index cc36327b1..c87359e09 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -53,14 +53,14 @@ jsonschema = "^4.4.0"
 PyYAML = "^6.0"
 defusedxml = "^0.7.1"
 colorama = "^0.4.6"
-packaging = "24.0"
+packaging = ">=23.0"
 
 [tool.poetry.group.dev.dependencies]
 mkdocs = "^1.4.2"
 importlib-metadata = {version="*", python="<3.8"}
 pytest = "^7.2.1"
 pytest-splunk-addon = "^5.4.0"
-pytest-splunk-addon-ui-smartx = "^5.3.0"
+pytest-splunk-addon-ui-smartx = "^5.3.1"
 pytest-rerunfailures = "^11.1.1"
 mkdocs-material = "^9.1.3"
 mkdocstrings = {version=">=0", extras=["python"]}
diff --git a/renovate.json b/renovate.json
index 180f5c14f..f0a217688 100644
--- a/renovate.json
+++ b/renovate.json
@@ -24,7 +24,7 @@
       "matchManagers": [
         "poetry"
       ],
-      "matchPackagePrefixes": [
+      "matchPackageNames": [
         "importlib-metadata",
         "pytest",
         "pytest-cov",
@@ -35,6 +35,23 @@
       ],
       "enabled": false
     },
+    {
+      "description": "Ignore Python version updates",
+      "matchManagers": ["poetry"],
+      "matchPackageNames": ["python"],
+      "enabled": false
+    },
+    {
+      "description": "Ignore mkdocs and its plugins that drop Python 3.7 support",
+      "matchPackageNames": [
+        "/^mkdocs"
+      ],
+      "matchUpdateTypes": [
+        "major",
+        "minor"
+      ],
+      "enabled": false
+    },
     {
       "matchPackageNames": ["urllib3"],
       "allowedVersions": "<2.0.0"
diff --git a/splunk_add_on_ucc_framework/commands/build.py b/splunk_add_on_ucc_framework/commands/build.py
index b6d94c9f4..bd0641c16 100644
--- a/splunk_add_on_ucc_framework/commands/build.py
+++ b/splunk_add_on_ucc_framework/commands/build.py
@@ -655,6 +655,8 @@ def generate(
                 "additional_packaging.py is present but does not have `additional_packaging`. "
                 "Skipping additional packaging."
             )
+        # clean-up sys.path manipulation
+        sys.path.pop(0)
 
     if global_config:
         logger.info("Generating OpenAPI file")
diff --git a/splunk_add_on_ucc_framework/commands/init.py b/splunk_add_on_ucc_framework/commands/init.py
index acdd4564a..798f77370 100644
--- a/splunk_add_on_ucc_framework/commands/init.py
+++ b/splunk_add_on_ucc_framework/commands/init.py
@@ -67,6 +67,7 @@ def _generate_addon(
     addon_version: str,
     addon_rest_root: str | None = None,
     overwrite: bool = False,
+    add_license: str | None = None,
 ) -> str:
     generated_addon_path = os.path.join(
         os.getcwd(),
@@ -103,9 +104,21 @@ def _generate_addon(
         _f.write(global_config_rendered_content)
     package_path = os.path.join(generated_addon_path, "package")
     os.makedirs(package_path)
-    package_license_path = os.path.join(package_path, "LICENSE.txt")
-    with open(package_license_path, "w") as _f:
-        pass
+    package_license_dir = os.path.join(package_path, "LICENSES")
+    os.makedirs(package_license_dir)
+
+    if add_license:
+        package_license_path = os.path.join(package_license_dir, f"{add_license}.txt")
+        template_path = utils.get_license_path(add_license)
+        with open(template_path) as content:
+            license_content = content.read()
+        with open(package_license_path, "w") as _f:
+            _f.write(license_content)
+    else:
+        # add-on licenses are to be kept in package/LICENSES directory only
+        package_license_path = os.path.join(package_license_dir, "LICENSE.txt")
+        with open(package_license_path, "w") as _f:
+            pass
     package_readme_path = os.path.join(package_path, "README.txt")
     with open(package_readme_path, "w") as _f:
         pass
@@ -117,6 +130,7 @@ def _generate_addon(
             addon_name=addon_name,
             addon_version=addon_version,
             addon_display_name=addon_display_name,
+            add_license=add_license,
         )
     )
     with open(package_app_manifest_path, "w") as _f:
@@ -160,6 +174,7 @@ def init(
     addon_version: str,
     addon_rest_root: str | None = None,
     overwrite: bool = False,
+    add_license: str | None = None,
 ) -> str:
     if not _is_valid_addon_name(addon_name):
         logger.error(
@@ -199,12 +214,12 @@ def init(
         addon_version,
         addon_rest_root,
         overwrite,
+        add_license,
     )
     logger.info(f"Generated add-on is located here {generated_addon_path}")
-    logger.info(
-        "LICENSE.txt and README.txt are empty, "
-        "you may need to modify the content of those files\n"
-    )
+    if add_license:
+        logger.info(f"Specified {add_license} has been added to Licenses directory.")
+    logger.info("README.txt is empty, you may need to modify the content of this file.")
     logger.info(
         f"""You have generated your add-on and are wondering what to do next? \
 UCC offers many solutions to improve add-ons!
diff --git a/splunk_add_on_ucc_framework/install_python_libraries.py b/splunk_add_on_ucc_framework/install_python_libraries.py
index fa5e00783..40ae0baea 100644
--- a/splunk_add_on_ucc_framework/install_python_libraries.py
+++ b/splunk_add_on_ucc_framework/install_python_libraries.py
@@ -95,25 +95,27 @@ def _pip_is_lib_installed(
 
     lib_installed_cmd = f"{installer} -m pip show --version {libname}"
 
-    if version and allow_higher_version:
-        cmd = f'{lib_installed_cmd} | grep "Version"'
-    elif version and not allow_higher_version:
-        cmd = f'{lib_installed_cmd} | grep "Version: {version}"'
-    else:
-        cmd = lib_installed_cmd
-
     try:
         my_env = os.environ.copy()
         my_env["PYTHONPATH"] = target
-        if allow_higher_version:
-            result = _subprocess_run(command=cmd, env=my_env)
-            if result.returncode != 0:
-                return False
-            result_version = result.stdout.decode("utf-8").split("Version:")[1].strip()
-            return Version(result_version) >= Version(version)
+
+        # Disable writing of .pyc files (__pycache__)
+        my_env["PYTHONDONTWRITEBYTECODE"] = "1"
+
+        result = _subprocess_run(command=lib_installed_cmd, env=my_env)
+        if result.returncode != 0 or "Version:" not in result.stdout.decode("utf-8"):
+            return False
+
+        if version:
+            pip_show_result = result.stdout.decode("utf-8").splitlines()
+            result_row = next(el for el in pip_show_result if el.startswith("Version:"))
+            result_version = result_row.split("Version:")[1].strip()
+            if allow_higher_version:
+                return Version(result_version) >= Version(version)
+            return Version(result_version) == Version(version)
         else:
-            return_code = _subprocess_run(command=cmd, env=my_env).returncode
-            return return_code == 0
+            return result.returncode == 0
+
     except OSError as e:
         raise CouldNotInstallRequirements from e
 
diff --git a/splunk_add_on_ucc_framework/main.py b/splunk_add_on_ucc_framework/main.py
index 71c86af6e..20e8cf734 100644
--- a/splunk_add_on_ucc_framework/main.py
+++ b/splunk_add_on_ucc_framework/main.py
@@ -200,6 +200,21 @@ def main(argv: Optional[Sequence[str]] = None) -> int:
         default=False,
         help="overwrite already generated add-on folder",
     )
+    init_parser.add_argument(
+        "--add-license",
+        type=str,
+        choices=[
+            "Apache License 2.0",
+            "MIT License",
+            "SPLUNK PRE-RELEASE SOFTWARE LICENSE AGREEMENT",
+        ],
+        help=(
+            "adds any one of license agreement such as 'Apache License 2.0', 'MIT License', or "
+            "'SPLUNK PRE-RELEASE SOFTWARE LICENSE AGREEMENT' to the `<your_add-on_name>/package/LICENSES` directory."
+        ),
+        required=False,
+        default=None,
+    )
 
     import_from_aob_parser = subparsers.add_parser(
         "import-from-aob", description="[Experimental] Import from AoB"
@@ -235,6 +250,7 @@ def main(argv: Optional[Sequence[str]] = None) -> int:
             addon_input_name=args.addon_input_name,
             addon_version=args.addon_version,
             overwrite=args.overwrite,
+            add_license=args.add_license,
         )
     if args.command == "import-from-aob":
         import_from_aob.import_from_aob(
diff --git a/splunk_add_on_ucc_framework/schema/schema.json b/splunk_add_on_ucc_framework/schema/schema.json
index a99243630..74271bbe4 100644
--- a/splunk_add_on_ucc_framework/schema/schema.json
+++ b/splunk_add_on_ucc_framework/schema/schema.json
@@ -3115,6 +3115,9 @@
         },
         "readonlyFieldId": {
           "type": "string"
+        },
+        "useInputToggleConfirmation": {
+          "$ref": "#/definitions/useInputToggleConfirmation"
         }
       },
       "required": [
@@ -3162,6 +3165,9 @@
               "table": {
                 "$ref": "#/definitions/InputsTable"
               },
+              "useInputToggleConfirmation": {
+                "$ref": "#/definitions/useInputToggleConfirmation"
+              },
               "entity": {
                 "$ref": "#/definitions/AnyOfEntity"
               },
@@ -3279,6 +3285,11 @@
       "type": "string",
       "description": "Text displayed next to entity field"
     },
+    "useInputToggleConfirmation": {
+      "type": "boolean",
+      "description": "When true displays additional confirmation modal when toggling single input status.",
+      "default": false
+    },
     "IntervalEntity": {
       "type": "object",
       "properties": {
diff --git a/tests/testdata/expected_addons/expected_output_global_config_everything/Splunk_TA_UCCExample/LICENSES/Apache-2.0.txt b/splunk_add_on_ucc_framework/templates/Licenses/Apache License 2.0.txt
similarity index 100%
rename from tests/testdata/expected_addons/expected_output_global_config_everything/Splunk_TA_UCCExample/LICENSES/Apache-2.0.txt
rename to splunk_add_on_ucc_framework/templates/Licenses/Apache License 2.0.txt
diff --git a/splunk_add_on_ucc_framework/templates/Licenses/MIT License.txt b/splunk_add_on_ucc_framework/templates/Licenses/MIT License.txt
new file mode 100644
index 000000000..03e8bb5ab
--- /dev/null
+++ b/splunk_add_on_ucc_framework/templates/Licenses/MIT License.txt
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright [yyyy] [name of copyright owner]
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
\ No newline at end of file
diff --git a/splunk_add_on_ucc_framework/templates/Licenses/SPLUNK PRE-RELEASE SOFTWARE LICENSE AGREEMENT.txt b/splunk_add_on_ucc_framework/templates/Licenses/SPLUNK PRE-RELEASE SOFTWARE LICENSE AGREEMENT.txt
new file mode 100644
index 000000000..6a79e6de5
--- /dev/null
+++ b/splunk_add_on_ucc_framework/templates/Licenses/SPLUNK PRE-RELEASE SOFTWARE LICENSE AGREEMENT.txt
@@ -0,0 +1,49 @@
+THIS PRE-RELEASE SOFTWARE LICENSE AGREEMENT (THE "AGREEMENT") GOVERNS YOUR USE OF THE PRE-RELEASE SOFTWARE (DEFINED BELOW) PROVIDED BY SPLUNK LLC, AND/OR ITS AFFILIATES ("SPLUNK”). YOU WILL BE REQUIRED TO INDICATE YOUR AGREEMENT TO THIS AGREEMENT IN ORDER TO ACCESS OR DOWNLOAD THE PRE-RELEASE SOFTWARE OR TO COMPLETE THE INSTALLATION PROCESS FOR THE PRE-RELEASE SOFTWARE. BY CLICKING ON THE "YES" OR “I ACCEPT” BUTTON (OR OTHER BUTTON OR MECHANISM DESIGNED TO ACKNOWLEDGE AGREEMENT TO THE TERMS OF THIS AGREEMENT), OR BY DOWNLOADING, ACCESSING OR INSTALLING THE PRE-RELEASE SOFTWARE, YOU ARE CONSENTING TO BE BOUND BY THIS AGREEMENT.
+
+NOTE: THIS IS THE ONLY AGREEMENT BETWEEN YOU AND SPLUNK GOVERNING YOUR USE OF THE PRE-RELEASE SOFTWARE, AND THIS AGREEMENT SHALL SUPERSEDE ANY OTHER TERMS OF USE OR LICENSE AGREEMENT THAT MAY APPEAR DURING THE INSTALLATION OR DOWNLOADING OF THE PRE-RELEASE SOFTWARE.
+
+IF YOU AGREE TO THESE TERMS ON BEHALF OF A BUSINESS, YOU REPRESENT AND WARRANT THAT YOU HAVE THE POWER AND AUTHORITY TO BIND THAT BUSINESS TO THIS AGREEMENT, AND YOUR AGREEMENT TO THESE TERMS WILL BE TREATED AS THE AGREEMENT OF THE BUSINESS. IN THAT EVENT, "YOU" AND "YOUR" REFER HEREIN TO THAT BUSINESS.
+
+IF YOU ARE UNWILLING TO AGREE TO THIS AGREEMENT, OR YOU DO NOT HAVE THE RIGHT, POWER AND AUTHORITY TO ACT ON BEHALF OF AND BIND YOUR BUSINESS, DO NOT CLICK ON THE BUTTON AND DO NOT INSTALL, DOWNLOAD, ACCESS, OR OTHERWISE USE THE PRE-RELEASE SOFTWARE AND CANCEL THE LOADING OF THE PRE-RELEASE SOFTWARE.
+
+1. DEFINITIONS.
+
+“Pre-Release Software” means the pre-release version of the Splunk product, service, technology identified on the software download page or landing page or invitation message (the “Cover Page”), whether labeled as alpha, beta, pre-release, preview or otherwise, provided to you by Splunk under this Agreement. Pre-Release Software may include any enhancements, updates, upgrades, derivatives or bug fixes to such product, service or technology and any documentation, add-ons, templates, sample data sets or hardware devices as provided by Splunk.
+
+“Data” means the raw data you upload or submit to the Pre-Release Software and the processed result of the raw data generated by you using the Pre-Release Software.
+
+“Feedback” means all suggestions, comments, opinions, code, input, ideas, reports, information, know-how or other feedback provided by you (whether in oral, electronic or written form) to Splunk in connection with your use of the Pre-Release Software. Feedback does not include Data, unless submitted or communicated by you to Splunk as part of Feedback.
+
+“Internal Purposes” means internal business use with your systems, networks, devices and data for the purposes of internal testing and evaluation of the Pre-Release Software in order to provide Feedback to Splunk regarding the Pre-Release Software.  Such use does not include use of your systems, networks or devices as part of services you provide for a third party's benefit.
+
+2. PRE-RELEASE SOFTWARE LICENSE. Subject to your compliance with the terms and conditions of this Agreement, Splunk grants you a non-exclusive, non-sublicensable, nontransferable, revocable, limited license during the term of the Agreement to use a single copy of the Pre-Release Software at your principal office in a secure location, only in connection with and solely for the Internal Purposes.
+
+3. LICENSE RESTRICTIONS. Except as expressly authorized in this Agreement or by Splunk, you will not, and will not permit any third party to: (i) access or use the Pre-Release Software for any other purposes than the Internal Purposes (including for any competitive analysis, commercial, professional, or other for-profit purposes); (ii) copy the Pre-Release Software (except as required to run the Pre-Release Software and for reasonable backup purposes); (iii) modify, adapt, or create derivative works of the Pre-Release Software; (iv) rent, lease, loan, resell, transfer, sublicense or distribute the Pre-Release Software to any third party; (v) use or offer any functionality of the Pre-Release Software on a service provider, service bureau, hosted, software as a service, or time sharing basis; (vi) decompile, disassemble or reverse-engineer the Pre-Release Software or otherwise attempt to derive the Pre-Release Software source code, algorithms, methods or techniques used or embodied in the Pre-Release Software; (vii) disclose to any third party the results of any benchmark tests or other evaluation of the Pre-Release Software, or (viii) remove, alter, obscure, cover or change any trademark, copyright or other proprietary notices, labels or markings from or on the Pre-Release Software; (ix) interfere with or disrupt servers or networks connected to any website through which the Pre-Release Software provided; or (x) use the Pre-Release Software to collect or store personal data about any person or entity. Any consultant, contractor, or agent hired to perform services for you may operate the Pre-Release Software on your behalf under these terms and conditions, provided that: (a) you are responsible for ensuring that any such third party agrees to abide by and fully comply with the terms of this Agreement on the same basis as applicable to you; (b) such use is only in connection with your Internal Purposes; (c) such use does not represent or constitute an increase in the scope of the licenses provided hereunder; and (d) you remain fully liable for any and all acts or omissions by such third parties related to this Agreement. Any violation of this Section shall be a material breach of this Agreement subject to immediate termination of this Agreement for which no notice from Splunk shall be required.
+
+4. CONFIDENTIALITY. You agree to hold the Pre-Release Software (including all intellectual property rights therein, such as any patents, inventions, copyrights, design rights, trade secrets and know-how) and any related information (“Confidential Information”), whether in oral or written form, confidential. Confidential Information may include information relating to features, functionalities, improvements, code, pricing, business strategies, product roadmaps, development plans, marketing materials, data sets, customer lists or other proprietary third-party information. You will hold such Confidential Information in strict confidence and not use or disclose the Confidential Information, in whole or in part, except as expressly permitted in this Agreement. You may disclose Confidential Information to your employees, but only to the extent they have a need to know to test the Pre-Release Software and you have advised them that such information is Confidential. You agree to instruct any such employees in advance who will have access to the Pre-Release Software that they must comply with the restrictions set forth in this Agreement. You shall have no obligation to maintain the confidentiality of any information which: (a) is or becomes publicly available without breach of this Agreement; (b) is rightfully received by you from a third party without an obligation of confidentiality and without breach of this Agreement; (c) is developed independently by you without access to or use of the Confidential Information; or (d) has been approved for release by written authorization of the party that owns the Confidential Information. You will notify immediately upon discovery of any unauthorized use or disclosure of Confidential Information or any other breach of this Agreement by you or your personnel, and will cooperate with Splunk in every reasonable way to help Splunk regain possession of the Confidential Information and prevent its further unauthorized use or disclosure. You acknowledge that any breach of its obligations under this Agreement with respect to the proprietary rights or Confidential Information will cause Splunk irreparable injury for which there are inadequate remedies at law, and therefore, Splunk will be entitled to equitable relief in addition to all other remedies provided by this Agreement or available at law or in equity.
+
+5. TERM AND TERMINATION. This Agreement will be effective from the earlier of (a) the date it is accepted by you and (b) the date on which you first installed, downloaded or accessed a copy of the Pre-Release Software and shall continue until terminated. This Agreement may be terminated at any time by either party, with or without cause, effective upon notice of termination. This Agreement will terminate automatically upon the end of the Pre-Release Software project as identified on the Cover Page or upon commercial release (if any) of the Pre-Release Software, whichever is earlier. This is time-sensitive software, so it will stop functioning on the termination date. Upon termination, you will immediately cease all use of the Pre-Release Software and destroy the Pre-Release Software, or upon request by Splunk, return to Splunk the Pre-Release Software and other Confidential Information that are in your possession or control. Upon Splunk’s request, you will certify in writing that you have returned or destroyed all copies of the Pre-Release Software and Confidential Information. Sections 1, 3, 4, 6, 7, 8, 9, 10, 11, 15, and 16 will survive termination of this Agreement.
+
+6. OWNERSHIP. Splunk, its suppliers and/or its licensors own all worldwide right, title and interest in and to the Pre-Release Software, including all worldwide patent rights (including patent applications and disclosures); copyright rights (including copyrights, copyright registration and copy rights with respect to computer software, software design, software code, software architecture, firmware, programming tools, graphic user interfaces, reports, dashboard, business rules, use cases, screens, alerts, notifications, drawings, specifications and databases); moral rights; trade secrets and other rights with respect to confidential or proprietary information; know-how; other rights with respect to inventions, discoveries, ideas, improvements, techniques, formulae, algorithms, processes, schematics, testing procedures, technical information and other technology; and any other intellectual and industrial property rights, whether or not subject to registration or protection; and all rights under any license or other arrangement with respect to the foregoing. Except as expressly stated in this Agreement, Splunk does not grant you any intellectual property rights in the Pre-Release Software, and all right, title, and interest in and to all copies of the Pre-Release Software not expressly granted remain with Splunk, its suppliers and/or its licensors. The Pre-Release Software is copyrighted and protected by the laws of the United States and other countries, and international treaty provisions. You acknowledge that the Pre-Release Software is licensed and not sold.
+
+7. FEEDBACK. Splunk, in its sole discretion, may or may not respond to your Feedback or promise to address all your Feedback in the development of future features or functionalities of the Pre-Release Software or any related or subsequent versions of such Pre-Release Software. In the event Splunk uses your Feedback, you grant Splunk an unrestricted, perpetual, worldwide, exclusive, transferable, irrevocable, sublicensable, royalty-free, fully paid-up license to use, copy, modify, create derivative works of, make, have made, distribute (through multiple tiers of distribution), publicly perform or display, import, export, sell, offer to sell, rent, or license copies of the Feedback as part of or in connection with any Splunk product, service, technology, content, material, specification or documentation. You warrant that the Feedback does not infringe any copyright or trade secret of any third party, and that you have no knowledge of any patent of any third party that may be infringed by the Feedback (including any implementation thereof recommended by you). You further warrant that your Feedback is not subject to any license terms that would purport to require Splunk to comply with any additional obligations with respect to any Splunk product or service that incorporates your Feedback.
+
+8. DATA. You hereby grant Splunk a perpetual, irrevocable, non-exclusive, royalty-free, paid-up, worldwide, sublicensable license to use, access, transmit, host, store, and display the Data solely for the purpose of providing and improving the Pre-Release Software. Splunk (or its sublicensees) may exercise such license for purposes of providing, maintaining, repairing, administering and improving the Pre-Release Software or in developing new products or services, including rights to extract, compile, aggregate, synthesize, use, and otherwise analyze all or any portion of the Data. You represent, warrant and agree that the Data and other materials you provide or make available to Splunk will include only information relevant to the Pre-Release Software and the use thereof and will not include any personally identifiable information or any protected health data. You acknowledge and agree that you are solely responsible for all Data you upload or submit using the Pre-Release Software and for your conduct while using the Pre-Release Software. You acknowledge and agree that: (a) you will evaluate and bear all risks associated with the use of any Data; (b) you are responsible for protecting and backing up the Data; (c) you are responsible for protecting the confidentiality of any Data; and (d) under no circumstances will Splunk be liable in any way for any Data, including, but not limited to, any errors or omissions in any Data, or any loss or damages or any kind incurred as a result of your use, deletion, modification, or correction of any Data. Splunk has no responsibility to store, protect, remove or delete any Data for you and shall have no liability for the deletion of or failure to store any Data.
+
+9. WARRANTY DISCLAIMER. THE PRE-RELEASE SOFTWARE IS PROVIDED “AS IS”. SPLUNK DISCLAIMS ANY AND ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, QUIET ENJOYMENT AND WARRANTIES ARISING OUT OF COURSE OF DEALING OR USAGE OF TRADE OR BY STATUTE OR IN LAW. SPLUNK SPECIFICALLY DOES NOT WARRANT THAT THE PRE-RELEASE SOFTWARE WILL MEET YOUR REQUIREMENTS, THE OPERATION OR OUTPUT OF THE PRE-RELEASE SOFTWARE WILL BE ERROR-FREE, ACCURATE, RELIABLE, COMPLETE OR UNINTERRUPTED. Splunk is not obligated to support, update or upgrade the Pre-Release Software.
+
+10. NO RELIANCE. Splunk has no obligations about any forward-looking statements made in connection with or in the course of providing the Pre-Release Software. Forward-looking statements are statements regarding future Splunk events, product offerings, product performance, customer uses or the expected financial performance of Splunk. Any such statements reflect current expectations and estimates based on factors currently known and that actual events or results could differ materially.  Splunk does not assume any obligation to update any forward-looking statements made during the Pre-Release Software project.  In addition, any information about our roadmap outlines our general product direction and is subject to change at any time without notice.  It is for informational purposes only and shall not be incorporated into this Agreement or any contract or other commitment.  Splunk undertakes no obligation either to develop the features or functionality described in the forward-looking statement or to include any such feature or functionality in a future release, including those you are reviewing as a part of this Pre-Release Software. You expressly acknowledge that the Pre-Release Software has not been fully tested and may contain defects or deficiencies which may not be corrected by Splunk, that the Pre-Release Software may undergo significant changes prior to release of the corresponding generally available final version.
+
+11. LIMITATION OF LIABILITY. IN NO EVENT WILL SPLUNK BE LIABLE TO YOU FOR ANY SPECIAL, INDIRECT, INCIDENTAL, CONSEQUENTIAL OR PUNITIVE DAMAGES (INCLUDING LOSS OF USE, DATA, OR PROFITS, BUSINESS INTERRUPTION, OR COSTS OF PROCURING SUBSTITUTE PRE-RELEASE SOFTWARE) ARISING OUT OF OR IN CONNECTION WITH THIS AGREEMENT OR THE USE OR PERFORMANCE OF THE PRE-RELEASE SOFTWARE, WHETHER SUCH LIABILITY ARISES FROM CONTRACT, WARRANTY, TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, AND WHETHER OR NOT SPLUNK HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH LOSS OR DAMAGE. THE PARTIES HAVE AGREED THAT THESE LIMITATIONS WILL SURVIVE AND APPLY EVEN IF ANY REMEDY IS FOUND TO HAVE FAILED OF ITS ESSENTIAL PURPOSE. WITHOUT LIMITING THE FOREGOING, SPLUNK WILL HAVE NO LIABILITY OR RESPONSIBILITY FOR ANY BUSINESS INTERRUPTION OR LOSS OF DATA ARISING FROM THE AUTOMATIC TERMINATION OF THE LICENSE RIGHTS GRANTED HEREIN AND ANY ASSOCIATED CESSATION OF THE PRE-RELEASE SOFTWARE FUNCTIONS OR ANY UNANTICIPATED OR UNSCHEDULED DOWNTIME FOR ANY REASON OR ANY DELETION, CORRUPTION OR DAMAGE OF DATA ON OR THROUGH THE PRE-RELEASE SOFTWARE. SPLUNK'S TOTAL CUMULATIVE LIABILITY TO YOU, FROM ALL CAUSES OF ACTION AND ALL THEORIES OF LIABILITY, WILL BE LIMITED TO AND WILL NOT EXCEED ONE HUNDRED DOLLARS ($100.00). BECAUSE SOME STATES OR JURISDICTIONS DO NOT ALLOW LIMITATION OR EXCLUSION OF CONSEQUENTIAL OR INCIDENTAL DAMAGES, THE ABOVE LIMITATION MAY NOT APPLY TO YOU.
+
+12. PRIVACY. You acknowledge that Splunk and its providers may obtain information and data from you in connection with your registration, installation, and use of the Pre-Release Software, including, without limitation, personal information. Splunk may also collect and process technical and related environmental or performance information about your use of the Pre-Release Software (which may include, without limitation, data ingest volume, search concurrency, number of unique user log-ins, Internet protocol addresses, operating system, configuration information, application software, session duration, page view, operational use, and other such information) and use this information to support and troubleshoot issues, provide updates, analyze trends and improve Splunk’s products or services. You hereby consent to Splunk and its providers maintaining, using, storing and disclosing such information and data (including, without limitation, personal information, if any, in conformity with Splunk Privacy Policy, which may be updated from time to time). You further consent to receiving electronic communications and notifications from Splunk in connection with your use of the Pre-Release Software.
+
+13. EXPORT. You will comply fully with all relevant export laws and regulations of the United States and any other country (“Export Laws”) where you use any of the Pre-Release Software. You represent and warrant that you are not (a) located in, or a resident or a national of, a restricted country; or (b) on any of the relevant U.S. Government Lists of prohibited persons, including but not limited to the Treasury Department’s List of Specially Designated Nationals and the Commerce Department’s List of Denied Persons or Entity List.  You further represent and warrant that you shall not export, re-export, ship, transfer the Pre-Release Software to any restricted countries or restricted end users or use the Pre-Release Software in any restricted countries or for any purposes prohibited by the Export Laws, including, but not limited to, nuclear, chemical, missile or biological weapons related end uses. You understand that the requirements and restrictions of the Export Laws may vary depending on the specific Pre-Release Software and may change over time, and that, to determine the precise controls applicable to the Pre-Release Software, it is necessary to refer to the U.S. Export Administration Regulations and the U.S. Department of Treasury, Office of Foreign Assets Control Regulations.
+
+14. GOVERNMENT END USER RIGHTS. You acknowledge that all Pre-Release Software and Confidential Information were developed entirely at private expense and that no part of the Pre-Release Software or Confidential Information was first produced in the performance of a Government contract. You agree that the Pre-Release Software and any derivatives thereof are "commercial items" as defined in 48 C.F.R. § 2.101, and if you are a U.S. Government agency or instrumentality or if you are providing all or any part of the Pre-Release Software or any derivatives thereof to the U.S. Government, such use, duplication, reproduction, release, modification, disclosure or transfer of this commercial product and data, is restricted in accordance with 48 C.F.R. § 12.211, 48 C.F.R. § 12.212, 48 C.F.R. § 227.7102-2, and 48 C.F.R. § 227.7202, as applicable. Consistent with 48 C.F.R. § 12.211, 48 C.F.R. § 12.212, 48 C.F.R. § 227.7102-1 through 48 C.F.R. § 227.7102-3, and 48 C.F.R. §§ 227.7202-1 through 227.7202-4, as applicable, the Pre-Release Software is licensed to U.S. Government end users (i) only as Commercial Items and (ii) with only those rights as are granted to all other users pursuant to this Agreement and any related agreement(s), as applicable. Accordingly, you will have no rights in the Pre-Release Software except as expressly agreed to in writing by you and Splunk.
+
+15. CHOICE OF LAW AND DISPUTES. For other than the U.S. Government as a party, this Agreement shall be governed by and construed in accordance with the laws of the State of California, as if performed wholly within the state and without giving effect to the principles of conflict of law rules of any jurisdiction or the United Nations Convention on Contracts for the International Sale of Goods, the application of which is expressly excluded. Any legal action or proceeding arising under this Agreement will be brought exclusively in the federal or state courts located in San Francisco, California and the parties hereby consent to personal jurisdiction and venue therein.
+
+16. GENERAL. All notices required or permitted under this Agreement hereto will be in writing and delivered in person, by confirmed facsimile transmission, by overnight delivery service, or by registered or certified mail, postage prepaid with return receipt requested, and in each instance will be deemed given upon receipt. You may not assign, delegate or transfer this Agreement, in whole or in part, by agreement, operation of law or otherwise. You acknowledge that Splunk may assign, subcontract or delegate any of its rights or obligations under this Agreement. Any attempt to assign this Agreement other than as permitted herein shall be null and void. Subject to the foregoing, this Agreement will bind and inure to the benefit of the parties’ permitted successors and assigns. This Agreement along with any additional terms incorporated herein by reference constitute the complete and exclusive understanding and agreement between the parties relating only to the subject matter of the Pre-Release Software and Confidential Information and shall supersede any and all prior or contemporaneous agreements, communications and understandings, written or oral, relating to such subject matter. This Agreement is limited to the use of Pre-Release Software and Confidential Information and as such, this Agreement is separate from and shall have no effect on any other agreement you may have with Splunk. Any waiver, modification or amendment of any provision of this Agreement will be effective only if in writing and signed by duly authorized representatives of both parties. All rights and remedies, whether conferred hereunder or by any other instrument or law, will be cumulative and may be exercised singularly or concurrently. The failure by either party to enforce any provisions of this Agreement will not constitute a waiver of any other right hereunder or of any subsequent enforcement of that or any other provisions. The terms and conditions stated herein are declared to be severable. If a court of competent jurisdiction holds any provision of this Agreement invalid or unenforceable, the remaining provisions of the Agreement will remain in full force and effect, and the provision affected will be construed so as to be enforceable to the maximum extent permissible by law.
+
+Updated February 16, 2017
\ No newline at end of file
diff --git a/splunk_add_on_ucc_framework/templates/app.manifest.init-template b/splunk_add_on_ucc_framework/templates/app.manifest.init-template
index 16a839b2c..c3d05058c 100644
--- a/splunk_add_on_ucc_framework/templates/app.manifest.init-template
+++ b/splunk_add_on_ucc_framework/templates/app.manifest.init-template
@@ -25,8 +25,13 @@
         },
         "commonInformationModels": null,
         "license": {
-            "name": null,
-            "text": "LICENSE.txt",
+            {% if add_license -%}
+            "name": "{{add_license}}",
+            "text": "./LICENSES/{{add_license}}.txt",
+            {%- else -%}
+            "name": "LICENSE.txt",
+            "text": "./LICENSES/LICENSE.txt",
+            {%- endif %}
             "uri": null
         },
         "privacyPolicy": {
diff --git a/splunk_add_on_ucc_framework/utils.py b/splunk_add_on_ucc_framework/utils.py
index 5872de3bf..f0d364b8f 100644
--- a/splunk_add_on_ucc_framework/utils.py
+++ b/splunk_add_on_ucc_framework/utils.py
@@ -38,6 +38,10 @@ def get_j2_env() -> jinja2.Environment:
     )
 
 
+def get_license_path(file_name: str) -> str:
+    return join(dirname(__file__), "templates", "Licenses", f"{file_name}.txt")
+
+
 def recursive_overwrite(src: str, dest: str, ui_source_map: bool = False) -> None:
     """
     Method to copy from src to dest recursively.
diff --git a/ui/.eslintrc.js b/ui/.eslintrc.js
index 5f68acd17..f160bb342 100644
--- a/ui/.eslintrc.js
+++ b/ui/.eslintrc.js
@@ -26,6 +26,7 @@ module.exports = {
         // https://typescript-eslint.io/rules/no-use-before-define/#how-to-use
         'no-use-before-define': 'off',
         '@typescript-eslint/no-use-before-define': ['error', { variables: false }],
+        'jest/expect-expect': 'error',
     },
     root: true,
 };
diff --git a/ui/jest.polyfills.ts b/ui/jest.polyfills.ts
index 94ad52b31..597b8c0eb 100644
--- a/ui/jest.polyfills.ts
+++ b/ui/jest.polyfills.ts
@@ -9,15 +9,19 @@
  * you don't want to deal with this.
  */
 
+const { performance } = require('node:perf_hooks');
 const { TextDecoder, TextEncoder } = require('node:util');
 const { TransformStream } = require('node:stream/web');
 const { BroadcastChannel } = require('node:worker_threads');
+const { clearImmediate } = require('node:timers');
 
 Object.defineProperties(globalThis, {
     TextDecoder: { value: TextDecoder },
     TextEncoder: { value: TextEncoder },
     TransformStream: { value: TransformStream },
     BroadcastChannel: { value: BroadcastChannel },
+    clearImmediate: { value: clearImmediate },
+    performance: { value: performance },
 });
 
 const { Blob } = require('node:buffer');
diff --git a/ui/src/components/CheckboxGroup/stories/__images__/CheckboxGroup-input-page-view-chromium.png b/ui/src/components/CheckboxGroup/stories/__images__/CheckboxGroup-input-page-view-chromium.png
index 8c9d0ffff..5c0467b08 100644
--- a/ui/src/components/CheckboxGroup/stories/__images__/CheckboxGroup-input-page-view-chromium.png
+++ b/ui/src/components/CheckboxGroup/stories/__images__/CheckboxGroup-input-page-view-chromium.png
@@ -1,3 +1,3 @@
 version https://git-lfs.github.com/spec/v1
-oid sha256:ba82abe77bd2a19627d3ca369ea967d124df0587a0c4975e471a567863a1fc11
-size 35401
+oid sha256:c45e224b046e77516c4c66a3fa283162e2dfee1ae07501cb32f4ac10814697ef
+size 35327
diff --git a/ui/src/components/CheckboxGroup/stories/__images__/CheckboxGroup-required-view-chromium.png b/ui/src/components/CheckboxGroup/stories/__images__/CheckboxGroup-required-view-chromium.png
index 29fc7a258..7e57bca03 100644
--- a/ui/src/components/CheckboxGroup/stories/__images__/CheckboxGroup-required-view-chromium.png
+++ b/ui/src/components/CheckboxGroup/stories/__images__/CheckboxGroup-required-view-chromium.png
@@ -1,3 +1,3 @@
 version https://git-lfs.github.com/spec/v1
-oid sha256:75dcf61492b5842f47d360c4a8e40641c9f84a4ad3a147d69c6ea4abf89f1ef8
-size 42188
+oid sha256:f6b617ade1d7e335afc51794a2e59613bf57787a888c574dc90597507bf6ad56
+size 42123
diff --git a/ui/src/components/ControlWrapper/ControlWrapper.tsx b/ui/src/components/ControlWrapper/ControlWrapper.tsx
index 6719b6625..6014b3b8f 100644
--- a/ui/src/components/ControlWrapper/ControlWrapper.tsx
+++ b/ui/src/components/ControlWrapper/ControlWrapper.tsx
@@ -26,7 +26,7 @@ const ControlGroupWrapper = styled(ControlGroup).attrs((props: { dataName: strin
     }
 `;
 
-interface ControlWrapperProps {
+export interface ControlWrapperProps {
     mode: Mode;
     utilityFuncts: UtilControlWrapper;
     value: AcceptableFormValueOrNullish;
@@ -128,12 +128,17 @@ class ControlWrapper extends React.PureComponent<ControlWrapperProps> {
             </>
         );
 
-        const isFieldRequired = // modifiedEntitiesData takes precedence over entity
-            this.props?.modifiedEntitiesData?.required || this.props.entity?.required === undefined
-                ? 'oauth_field' in (this.props.entity || {}) // if required is undefined use true for oauth fields and false for others
-                : this.props.entity?.required; // if required present use required
-        const label = this.props?.modifiedEntitiesData?.label || this?.props?.entity?.label || '';
+        const isRequiredModified =
+            typeof this.props?.modifiedEntitiesData?.required === 'boolean'
+                ? this.props?.modifiedEntitiesData?.required
+                : this.props.entity?.required;
+
+        const isFieldRequired =
+            isRequiredModified === undefined // // if oauth_field exists field required by default
+                ? 'oauth_field' in (this.props.entity || {}) // if oauth_field does not exists not required by default
+                : isRequiredModified;
 
+        const label = this.props?.modifiedEntitiesData?.label || this?.props?.entity?.label || '';
         return (
             this.props.display && (
                 <ControlGroupWrapper
diff --git a/ui/src/components/ControlWrapper/stories/ControlWrapper.stories.ts b/ui/src/components/ControlWrapper/stories/ControlWrapper.stories.ts
index 9abcd4ccd..dec319531 100644
--- a/ui/src/components/ControlWrapper/stories/ControlWrapper.stories.ts
+++ b/ui/src/components/ControlWrapper/stories/ControlWrapper.stories.ts
@@ -49,3 +49,37 @@ export const Base: Story = {
         fileNameToDisplay: 'Previous File',
     },
 };
+
+export const WithModifications: Story = {
+    args: {
+        ...Base.args,
+        entity: {
+            field: 'url',
+            label: 'URL',
+            type: 'text',
+            help: 'Enter the URL, for example',
+            required: true,
+            encrypted: false,
+        },
+        modifiedEntitiesData: { required: false, label: 'Modified URL', help: 'Modified help' },
+    },
+};
+
+export const WithModificationsMakeRequired: Story = {
+    args: {
+        ...Base.args,
+        entity: {
+            field: 'url',
+            label: 'URL',
+            type: 'text',
+            help: 'Enter the URL, for example',
+            required: false,
+            encrypted: false,
+        },
+        modifiedEntitiesData: {
+            required: true,
+            label: 'Modified URL',
+            help: 'Modified help required',
+        },
+    },
+};
diff --git a/ui/src/components/ControlWrapper/stories/__images__/ControlWrapper-with-modifications-chromium.png b/ui/src/components/ControlWrapper/stories/__images__/ControlWrapper-with-modifications-chromium.png
new file mode 100644
index 000000000..271a6a90e
--- /dev/null
+++ b/ui/src/components/ControlWrapper/stories/__images__/ControlWrapper-with-modifications-chromium.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:4e72b95fe11dd76434351e3094a6a1760453d66d575ec2626ffc6a53e2c52222
+size 5193
diff --git a/ui/src/components/ControlWrapper/stories/__images__/ControlWrapper-with-modifications-make-required-chromium.png b/ui/src/components/ControlWrapper/stories/__images__/ControlWrapper-with-modifications-make-required-chromium.png
new file mode 100644
index 000000000..93cf28987
--- /dev/null
+++ b/ui/src/components/ControlWrapper/stories/__images__/ControlWrapper-with-modifications-make-required-chromium.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:62a4a0b035421679e26638d8406db1d23c07cdfe292a730c1ef3319be6e41491
+size 6130
diff --git a/ui/src/components/table/CustomTable.tsx b/ui/src/components/table/CustomTable.tsx
index 5ac928783..233461fbf 100644
--- a/ui/src/components/table/CustomTable.tsx
+++ b/ui/src/components/table/CustomTable.tsx
@@ -29,6 +29,7 @@ interface CustomTableProps {
     sortDir: SortDirection;
     sortKey?: string;
     tableConfig: ITableConfig;
+    useInputToggleConfirmation?: boolean;
 }
 
 interface IEntityModal {
@@ -63,6 +64,7 @@ const CustomTable: React.FC<CustomTableProps> = ({
     sortDir,
     sortKey,
     tableConfig,
+    useInputToggleConfirmation,
 }) => {
     const unifiedConfigs: GlobalConfig = getUnifiedConfigs();
     const [entityModal, setEntityModal] = useState<IEntityModal>({ open: false });
@@ -263,6 +265,7 @@ const CustomTable: React.FC<CustomTableProps> = ({
                         rowActions={actions}
                         headerMapping={headerMapping}
                         readonly={isReadonlyRow(readonlyFieldId, row)}
+                        useInputToggleConfirmation={useInputToggleConfirmation}
                         {...{
                             handleEditActionClick,
                             handleCloneActionClick,
diff --git a/ui/src/components/table/CustomTableControl.jsx b/ui/src/components/table/CustomTableControl.jsx
index 544dd32f2..6ffb0d5d2 100644
--- a/ui/src/components/table/CustomTableControl.jsx
+++ b/ui/src/components/table/CustomTableControl.jsx
@@ -21,75 +21,51 @@ class CustomTableControl extends Component {
         this.state = {
             loading: true,
             row: { ...props.row },
-            checkMethodIsPresent: false,
-            methodNotPresentError: '',
+            checkMethodIsPresent: false, // Flag to track if methods are available in custom control
+            methodNotPresentError: '', // Stores error message if a method is missing
+            rowUpdatedByControl: false, // Flag to track if the row was updated by custom control
         };
-        this.shouldRender = true;
+        this.shouldRender = true; // Flag to control rendering logic
     }
 
-    componentDidMount() {
-        const globalConfig = getUnifiedConfigs();
-        this.loadCustomControl()
-            .then(async (Control) => {
-                if (typeof Control !== 'function') {
-                    this.setState({
-                        loading: false,
-                        methodNotPresentError: 'Loaded module is not a constructor function',
-                    });
-                    return;
-                }
-                this.customControl = new Control(
-                    globalConfig,
-                    this.props.serviceName,
-                    this.el,
-                    this.state.row,
-                    this.props.field
-                );
+    // Lifecycle method that updates the component's state when props change
+    static getDerivedStateFromProps(nextProps, prevState) {
+        // Update row data only if the row prop has changed and it wasn't updated by control itself
+        if (!prevState.rowUpdatedByControl && nextProps.row !== prevState.row) {
+            return {
+                row: { ...nextProps.row },
+                loading: false, // Set loading to false when new row data is received
+            };
+        }
+        return null;
+    }
 
-                const result = await this.callCustomMethod('getDLRows');
-                try {
-                    // check if getDLRow is exist in the custom input row file
-                    if (result && typeof result === 'object' && !Array.isArray(result)) {
-                        this.setState({
-                            row: { ...result },
-                            checkMethodIsPresent: true,
-                            loading: false,
-                        });
-                    } else if (result !== null) {
-                        // check if getDLRow return invalid object
-                        this.setState({
-                            loading: false,
-                            checkMethodIsPresent: true,
-                            methodNotPresentError: 'getDLRows method did not return a valid object',
-                        });
-                    } else {
-                        // if getDLRow is not present then check render method is present or not
-                        this.handleNoGetDLRows();
-                    }
-                } catch (error) {
-                    onCustomControlError({ methodName: 'getDLRows', error });
-                    this.handleNoGetDLRows();
-                }
-            })
-            .catch(() =>
-                this.setState({
-                    loading: false,
-                    methodNotPresentError: 'Error loading custom control',
-                })
-            );
+    // Lifecycle method called after the component has been mounted (first render)
+    componentDidMount() {
+        this.initializeCustomControl();
     }
 
     shouldComponentUpdate(nextProps, nextState) {
-        if (this.props.row !== nextProps.row) {
+        // Trigger re-render if row prop or state has changed
+        if (this.props.row !== nextProps.row || this.state.row !== nextState.row) {
             return true;
         }
+        // Check if loading state is false and shouldRender flag is true to trigger re-render
         if (!nextState.loading && this.shouldRender) {
-            this.shouldRender = false;
+            this.shouldRender = false; // Disable further re-renders
             return true;
         }
         return false;
     }
 
+    componentDidUpdate(prevProps) {
+        // If the row prop has changed, re-initialize the custom control
+        if (prevProps.row !== this.props.row) {
+            this.initializeCustomControl();
+            this.setState({ rowUpdatedByControl: false });
+        }
+    }
+
     loadCustomControl = () =>
         new Promise((resolve, reject) => {
             const { type, fileName } = this.props;
@@ -142,6 +118,61 @@ class CustomTableControl extends Component {
         }));
     };
 
+    // Function to initialize the custom control, loading the module and calling methods on it
+    async initializeCustomControl() {
+        const globalConfig = getUnifiedConfigs();
+        this.loadCustomControl()
+            .then(async (Control) => {
+                if (typeof Control !== 'function') {
+                    this.setState({
+                        loading: false,
+                        methodNotPresentError: 'Loaded module is not a constructor function',
+                    });
+                    return;
+                }
+
+                this.customControl = new Control(
+                    globalConfig,
+                    this.props.serviceName,
+                    this.el,
+                    this.state.row,
+                    this.props.field
+                );
+
+                // Call the "getDLRows" method on the custom control instance
+                const result = await this.callCustomMethod('getDLRows');
+                try {
+                    if (result && typeof result === 'object' && !Array.isArray(result)) {
+                        // If getDLRows returns a valid object, update state with new row data
+                        this.setState({
+                            row: { ...result },
+                            checkMethodIsPresent: true,
+                            loading: false,
+                            rowUpdatedByControl: true,
+                        });
+                    } else if (result !== null) {
+                        // If result is not valid, show an error
+                        this.setState({
+                            loading: false,
+                            checkMethodIsPresent: true,
+                            methodNotPresentError: 'getDLRows method did not return a valid object',
+                        });
+                    } else {
+                        this.handleNoGetDLRows();
+                    }
+                } catch (error) {
+                    onCustomControlError({ methodName: 'getDLRows', error });
+                    this.handleNoGetDLRows();
+                }
+            })
+            .catch(() =>
+                this.setState({
+                    loading: false,
+                    methodNotPresentError: 'Error loading custom control',
+                })
+            );
+    }
+
     render() {
         const { row, loading, checkMethodIsPresent, methodNotPresentError } = this.state;
         const { moreInfo } = this.props;
diff --git a/ui/src/components/table/CustomTableRow.tsx b/ui/src/components/table/CustomTableRow.tsx
index bc4511485..daa6a1c5e 100644
--- a/ui/src/components/table/CustomTableRow.tsx
+++ b/ui/src/components/table/CustomTableRow.tsx
@@ -1,4 +1,4 @@
-import React, { ReactElement, useCallback } from 'react';
+import React, { ReactElement, useCallback, useState } from 'react';
 
 import WaitSpinner from '@splunk/react-ui/WaitSpinner';
 import Switch from '@splunk/react-ui/Switch';
@@ -15,6 +15,7 @@ import { _ } from '@splunk/ui-utils/i18n';
 import CustomTableControl from './CustomTableControl';
 import { ActionButtonComponent } from './CustomTableStyle';
 import { getTableCellValue } from './table.utils';
+import AcceptModal from '../AcceptModal/AcceptModal';
 import { RowDataFields } from '../../context/TableContext';
 
 const TableCellWrapper = styled(Table.Cell)`
@@ -40,6 +41,7 @@ interface CustomTableRowProps {
     handleEditActionClick: (row: RowDataFields) => void;
     handleCloneActionClick: (row: RowDataFields) => void;
     handleDeleteActionClick: (row: RowDataFields) => void;
+    useInputToggleConfirmation?: boolean;
 }
 
 interface CellHeader {
@@ -57,8 +59,11 @@ function CustomTableRow(props: CustomTableRowProps) {
         handleEditActionClick,
         handleCloneActionClick,
         handleDeleteActionClick,
+        useInputToggleConfirmation,
     } = props;
 
+    const [displayAcceptToggling, setDisplayAcceptToggling] = useState(false);
+
     const getCustomCell = (customRow: RowDataFields, header: CellHeader) =>
         header.customCell?.src &&
         header.customCell?.type &&
@@ -133,6 +138,17 @@ function CustomTableRow(props: CustomTableRowProps) {
         [handleEditActionClick, handleCloneActionClick, handleDeleteActionClick]
     );
 
+    const handleAcceptModal = (accepted: boolean) => {
+        if (accepted) {
+            handleToggleActionClick(row);
+        }
+        setDisplayAcceptToggling(false);
+    };
+
+    const verifyToggleActionClick = () => {
+        setDisplayAcceptToggling(true);
+    };
+
     let statusContent: string | ReactElement = row.disabled ? 'Inactive' : 'Active';
     // eslint-disable-next-line no-underscore-dangle
     if (row.__toggleShowSpinner) {
@@ -159,13 +175,25 @@ function CustomTableRow(props: CustomTableRowProps) {
                             </Table.Cell>
                         );
                     } else if (header.field === 'disabled') {
+                        const activeText = headerMapping?.disabled?.false
+                            ? headerMapping.disabled.false
+                            : 'Active';
+
+                        const inactiveText = headerMapping?.disabled?.true
+                            ? headerMapping.disabled.true
+                            : 'Inactive';
+
                         cellHTML = (
                             <Table.Cell data-column={header.field} key={header.field}>
                                 <SwitchWrapper>
                                     <Switch
                                         key={row.name}
                                         value={row.disabled}
-                                        onClick={() => handleToggleActionClick(row)}
+                                        onClick={() =>
+                                            useInputToggleConfirmation
+                                                ? verifyToggleActionClick()
+                                                : handleToggleActionClick(row)
+                                        }
                                         selected={!row.disabled}
                                         disabled={
                                             // eslint-disable-next-line no-underscore-dangle
@@ -185,6 +213,20 @@ function CustomTableRow(props: CustomTableRowProps) {
                                         )}
                                     />
                                     <span data-test="status">{statusContent}</span>
+                                    {displayAcceptToggling && (
+                                        <AcceptModal
+                                            message={`Do you want to make ${row.name} input ${
+                                                row.disabled ? activeText : inactiveText
+                                            }?`}
+                                            open={displayAcceptToggling}
+                                            handleRequestClose={handleAcceptModal}
+                                            title={`Make input ${
+                                                row.disabled ? activeText : inactiveText
+                                            }?`}
+                                            declineBtnLabel="No"
+                                            acceptBtnLabel="Yes"
+                                        />
+                                    )}
                                 </SwitchWrapper>
                             </Table.Cell>
                         );
diff --git a/ui/src/components/table/TableHeader.jsx b/ui/src/components/table/TableHeader.jsx
index 1e41906ee..ff3daf6c0 100644
--- a/ui/src/components/table/TableHeader.jsx
+++ b/ui/src/components/table/TableHeader.jsx
@@ -2,6 +2,8 @@ import React from 'react';
 import PropTypes from 'prop-types';
 import Select from '@splunk/react-ui/Select';
 import Paginator from '@splunk/react-ui/Paginator';
+import { Typography } from '@splunk/react-ui/Typography';
+
 import styled from 'styled-components';
 import { _ } from '@splunk/ui-utils/i18n';
 
@@ -71,13 +73,24 @@ function TableHeader({
         );
     };
 
+    const getInputCountStatus = () => {
+        const enabledRowCount = allFilteredData.filter((item) => !item.disabled).length;
+        const showCountStatus = `(${enabledRowCount} of ${totalElement} enabled)`;
+
+        return (
+            <Typography as="span" className="inputNumber">
+                {totalElement}
+                {totalElement > 1 ? _(` ${itemLabel}s`) : _(` ${itemLabel}`)}
+                &nbsp;
+                {page === PAGE_INPUT && totalElement >= pageSize ? showCountStatus : null}
+            </Typography>
+        );
+    };
+
     return (
         <TableHeaderWrapper>
             <div>
-                <span className="inputNumber">
-                    {totalElement}
-                    {totalElement > 1 ? _(` ${itemLabel}s`) : _(` ${itemLabel}`)}
-                </span>
+                {getInputCountStatus()}
                 {page === PAGE_INPUT ? (
                     <TableSelectBoxWrapper>
                         <Select
diff --git a/ui/src/components/table/TableWrapper.tsx b/ui/src/components/table/TableWrapper.tsx
index b2f7c39b4..4abb0f880 100644
--- a/ui/src/components/table/TableWrapper.tsx
+++ b/ui/src/components/table/TableWrapper.tsx
@@ -49,9 +49,9 @@ const getTableConfigAndServices = (
                 tableConfig: unifiedConfigs.pages.inputs.table,
                 readonlyFieldId: unifiedConfigs.pages.inputs.readonlyFieldId,
                 hideFieldId: unifiedConfigs.pages.inputs.hideFieldId,
+                useInputToggleConfirmation: unifiedConfigs.pages.inputs.useInputToggleConfirmation,
             };
         }
-
         const serviceWithTable = services?.find((x) => x.name === serviceName);
         const tableData = serviceWithTable && 'table' in serviceWithTable && serviceWithTable.table;
 
@@ -62,6 +62,10 @@ const getTableConfigAndServices = (
             },
             readonlyFieldId: undefined,
             hideFieldId: undefined,
+            useInputToggleConfirmation:
+                serviceWithTable &&
+                'useInputToggleConfirmation' in serviceWithTable &&
+                Boolean(serviceWithTable.useInputToggleConfirmation),
         };
     }
 
@@ -120,10 +124,11 @@ const TableWrapper: React.FC<ITableWrapperProps> = ({
         useTableContext()!;
 
     const unifiedConfigs = getUnifiedConfigs();
-    const { services, tableConfig, readonlyFieldId, hideFieldId } = useMemo(
-        () => getTableConfigAndServices(page, unifiedConfigs, serviceName),
-        [page, unifiedConfigs, serviceName]
-    );
+    const { services, tableConfig, readonlyFieldId, hideFieldId, useInputToggleConfirmation } =
+        useMemo(
+            () => getTableConfigAndServices(page, unifiedConfigs, serviceName),
+            [page, unifiedConfigs, serviceName]
+        );
 
     const moreInfo = tableConfig && 'moreInfo' in tableConfig ? tableConfig?.moreInfo : null;
     const headers = tableConfig && 'header' in tableConfig ? tableConfig?.header : null;
@@ -135,6 +140,7 @@ const TableWrapper: React.FC<ITableWrapperProps> = ({
             isComponentMounted.current = false;
         };
     }, []);
+
     useEffect(() => {
         const abortController = new AbortController();
 
@@ -365,6 +371,7 @@ const TableWrapper: React.FC<ITableWrapperProps> = ({
                 sortKey={sortKey}
                 handleOpenPageStyleDialog={handleOpenPageStyleDialog}
                 tableConfig={tableConfig}
+                useInputToggleConfirmation={useInputToggleConfirmation}
             />
         </>
     );
diff --git a/ui/src/components/table/stories/__images__/TableWrapper-ouath-basic-chromium.png b/ui/src/components/table/stories/__images__/TableWrapper-ouath-basic-chromium.png
index 0ce27c13f..fce79ad2c 100644
--- a/ui/src/components/table/stories/__images__/TableWrapper-ouath-basic-chromium.png
+++ b/ui/src/components/table/stories/__images__/TableWrapper-ouath-basic-chromium.png
@@ -1,3 +1,3 @@
 version https://git-lfs.github.com/spec/v1
-oid sha256:be0a6fe4a2d07cfdf32ba7724158dff463ac459a327e8cc29c18543796ba5cab
-size 25440
+oid sha256:9448eab903a077e23e743b7ac9ae83110415f87b97ba2225fd29e4602ed46336
+size 25254
diff --git a/ui/src/components/table/stories/__images__/TableWrapper-simple-config-with-status-mapped-chromium.png b/ui/src/components/table/stories/__images__/TableWrapper-simple-config-with-status-mapped-chromium.png
index 4bd5994dc..91804cd64 100644
--- a/ui/src/components/table/stories/__images__/TableWrapper-simple-config-with-status-mapped-chromium.png
+++ b/ui/src/components/table/stories/__images__/TableWrapper-simple-config-with-status-mapped-chromium.png
@@ -1,3 +1,3 @@
 version https://git-lfs.github.com/spec/v1
-oid sha256:c6b17039340782e2df7bad9f5c5c7f982c4622f7543e4a310985cb4d48a8238a
-size 53330
+oid sha256:f4c60b5badec10d0762da0daeb27cb9a5f8789aff8a70c7fe99f1c6f886bfc78
+size 53163
diff --git a/ui/src/components/table/stories/__images__/TableWrapper-simple-table-style-page-chromium.png b/ui/src/components/table/stories/__images__/TableWrapper-simple-table-style-page-chromium.png
index 395cd71e0..bfb898861 100644
--- a/ui/src/components/table/stories/__images__/TableWrapper-simple-table-style-page-chromium.png
+++ b/ui/src/components/table/stories/__images__/TableWrapper-simple-table-style-page-chromium.png
@@ -1,3 +1,3 @@
 version https://git-lfs.github.com/spec/v1
-oid sha256:27fb19e29c6a81b6fb472fc5a733c523584efb42170ff491a3bac9b401f6211d
-size 47044
+oid sha256:8499aa9d774977ffb8d16ed531e06e46c5824e31dd381e7dd84f9b6b5ae49fd9
+size 46852
diff --git a/ui/src/components/table/stories/configMockups.ts b/ui/src/components/table/stories/configMockups.ts
index f92c8a354..ad514b95f 100644
--- a/ui/src/components/table/stories/configMockups.ts
+++ b/ui/src/components/table/stories/configMockups.ts
@@ -113,7 +113,7 @@ export const SIMPLE_NAME_TABLE_MOCK_DATA = {
 
 export const getSimpleConfig = () => {
     const configCp = JSON.parse(JSON.stringify(SIMPLE_NAME_TABLE_MOCK_DATA));
-    return configCp;
+    return configCp as GlobalConfig;
 };
 
 export const TABLE_CONFIG_WITH_MAPPING = {
@@ -376,3 +376,119 @@ export const getSimpleConfigStylePage = () => {
     const configCp = JSON.parse(JSON.stringify(SIMPLE_TABLE_MOCK_DATA_STYLE_PAGE));
     return configCp;
 };
+
+export const SIMPLE_NAME_TABLE_MOCK_DATA_WITH_STATUS_TOGGLE_CONFIRMATION = {
+    pages: {
+        configuration: {
+            tabs: [
+                {
+                    name: 'account',
+                    table: {
+                        actions: ['edit', 'delete', 'clone'],
+                        header: [
+                            {
+                                label: 'Name',
+                                field: 'name',
+                            },
+                        ],
+                    },
+                    entity: [
+                        {
+                            type: 'text',
+                            label: 'Name',
+                            validators: [
+                                {
+                                    type: 'string',
+                                    errorMsg: 'Length of ID should be between 1 and 50',
+                                    minLength: 1,
+                                    maxLength: 50,
+                                },
+                                {
+                                    type: 'regex',
+                                    errorMsg:
+                                        'Name must begin with a letter and consist exclusively of alphanumeric characters and underscores.',
+                                    pattern: '^[a-zA-Z]\\w*$',
+                                },
+                            ],
+                            field: 'name',
+                            help: 'Enter a unique name for this account.',
+                            required: true,
+                        },
+                    ],
+                    title: 'Account',
+                    restHandlerModule: 'splunk_ta_uccexample_validate_account_rh',
+                    restHandlerClass: 'CustomAccountValidator',
+                },
+            ],
+            title: 'Configuration',
+            description: 'Set up your add-on',
+        },
+        inputs: {
+            services: [
+                {
+                    name: 'example_input_one',
+                    entity: [
+                        {
+                            type: 'text',
+                            label: 'Name',
+                            validators: [
+                                {
+                                    type: 'regex',
+                                    errorMsg:
+                                        'Input Name must begin with a letter and consist exclusively of alphanumeric characters and underscores.',
+                                    pattern: '^[a-zA-Z]\\w*$',
+                                },
+                                {
+                                    type: 'string',
+                                    errorMsg: 'Length of input name should be between 1 and 100',
+                                    minLength: 1,
+                                    maxLength: 100,
+                                },
+                            ],
+                            field: 'name',
+                            help: 'A unique name for the data input.',
+                            required: true,
+                        },
+                        {
+                            type: 'checkbox',
+                            label: 'Example Checkbox',
+                            field: 'input_one_checkbox',
+                            help: 'This is an example checkbox for the input one entity',
+                            defaultValue: true,
+                        },
+                    ],
+                    title: 'Example Input One',
+                },
+            ],
+            title: 'Inputs',
+            description: 'Manage your data inputs',
+            useInputToggleConfirmation: true,
+            table: {
+                actions: ['edit', 'delete', 'search', 'clone'],
+                header: [
+                    {
+                        label: 'Name',
+                        field: 'name',
+                    },
+                    {
+                        label: 'Status',
+                        field: 'disabled',
+                    },
+                ],
+                moreInfo: [
+                    {
+                        label: 'Name',
+                        field: 'name',
+                    },
+                ],
+            },
+        },
+    },
+    meta: {
+        name: 'Splunk_TA_UCCExample',
+        restRoot: 'splunk_ta_uccexample',
+        version: '5.41.0R9c5fbfe0',
+        displayName: 'Splunk UCC test Add-on',
+        schemaVersion: '0.0.3',
+    },
+} satisfies GlobalConfig;
diff --git a/ui/src/components/table/stories/rowDataMockup.ts b/ui/src/components/table/stories/rowDataMockup.ts
index f36b58b08..1a811c3c1 100644
--- a/ui/src/components/table/stories/rowDataMockup.ts
+++ b/ui/src/components/table/stories/rowDataMockup.ts
@@ -394,6 +394,98 @@ export const ROW_DATA = [
     },
 ];
 
+export const ROW_DATA_FOR_COUNT = [
+    ...ROW_DATA,
+    {
+        name: 'testsomethingelse1',
+        id: 'https://localhost:8000/servicesNS/nobody/Splunk_TA_UCCExample/splunk_ta_uccexample_account/testsomethingelse',
+        updated: '1970-01-01T00:00:00+00:00',
+        links: {
+            alternate:
+                '/servicesNS/nobody/Splunk_TA_UCCExample/splunk_ta_uccexample_account/testsomethingelse',
+            list: '/servicesNS/nobody/Splunk_TA_UCCExample/splunk_ta_uccexample_account/testsomethingelse',
+            edit: '/servicesNS/nobody/Splunk_TA_UCCExample/splunk_ta_uccexample_account/testsomethingelse',
+            remove: '/servicesNS/nobody/Splunk_TA_UCCExample/splunk_ta_uccexample_account/testsomethingelse',
+        },
+        author: 'admin',
+        acl: {
+            app: 'Splunk_TA_UCCExample',
+            can_change_perms: true,
+            can_list: true,
+            can_share_app: true,
+            can_share_global: true,
+            can_share_user: true,
+            can_write: true,
+            modifiable: true,
+            owner: 'admin',
+            perms: {
+                read: ['*'],
+                write: ['admin', 'sc_admin'],
+            },
+            removable: true,
+            sharing: 'global',
+        },
+        content: {
+            account_multiple_select: 'two',
+            account_radio: '1',
+            auth_type: 'basic',
+            custom_endpoint: 'login.example.com',
+            disabled: true,
+            'eai:acl': null,
+            'eai:appName': 'Splunk_TA_UCCExample',
+            'eai:userName': 'nobody',
+            password: '******',
+            custom_text: 'testsomethingelse',
+            token: '******',
+            username: 'test1',
+        },
+    },
+    {
+        name: 'zzzzzzzz',
+        id: 'https://localhost:8000/servicesNS/nobody/Splunk_TA_UCCExample/splunk_ta_uccexample_account/zzzzzzz',
+        updated: '1970-01-01T00:00:00+00:00',
+        links: {
+            alternate:
+                '/servicesNS/nobody/Splunk_TA_UCCExample/splunk_ta_uccexample_account/zzzzzzz',
+            list: '/servicesNS/nobody/Splunk_TA_UCCExample/splunk_ta_uccexample_account/zzzzzzz',
+            edit: '/servicesNS/nobody/Splunk_TA_UCCExample/splunk_ta_uccexample_account/zzzzzzz',
+            remove: '/servicesNS/nobody/Splunk_TA_UCCExample/splunk_ta_uccexample_account/zzzzzzz',
+        },
+        author: 'admin',
+        acl: {
+            app: 'Splunk_TA_UCCExample',
+            can_change_perms: true,
+            can_list: true,
+            can_share_app: true,
+            can_share_global: true,
+            can_share_user: true,
+            can_write: true,
+            modifiable: true,
+            owner: 'admin',
+            perms: {
+                read: ['*'],
+                write: ['admin', 'sc_admin'],
+            },
+            removable: true,
+            sharing: 'global',
+        },
+        content: {
+            account_multiple_select: 'one',
+            account_radio: '1',
+            auth_type: 'basic',
+            custom_endpoint: 'login.example.com',
+            disabled: true,
+            'eai:acl': null,
+            'eai:appName': 'Splunk_TA_UCCExample',
+            'eai:userName': 'nobody',
+            password: '******',
+            custom_text: '222222',
+            token: '******',
+            username: 'zzzzz',
+        },
+    },
+];
+
 export const MockRowData = {
     links: {
         create: `/servicesNS/nobody/-/splunk_ta_uccexample_account/_new`,
@@ -402,6 +494,22 @@ export const MockRowData = {
     entry: ROW_DATA,
     messages: [],
 };
+export const MockRowDataForStatusCount = {
+    links: {
+        create: `/servicesNS/nobody/-/splunk_ta_uccexample_account/_new`,
+    },
+    updated: '2023-08-21T11:54:12+00:00',
+    entry: ROW_DATA_FOR_COUNT,
+    messages: [],
+};
+
+export const MockRowDataTogglingResponseDisableTrue = {
+    entry: [{ content: { disabled: true } }],
+};
+
+export const MockRowDataTogglingResponseDisableFalse = {
+    entry: [{ content: { disabled: false } }],
+};
 
 export const ServerHandlers = [
     http.get(`/servicesNS/nobody/-/splunk_ta_uccexample_account`, () =>
diff --git a/ui/src/context/TableContext.tsx b/ui/src/context/TableContext.tsx
index 027fa333c..1416aa047 100644
--- a/ui/src/context/TableContext.tsx
+++ b/ui/src/context/TableContext.tsx
@@ -8,6 +8,7 @@ export type RowDataFields = {
     disabled?: boolean;
     id?: string;
     index?: string;
+    __toggleShowSpinner?: boolean;
 } & AcceptableFormRecord;
 
 // serviceName > specificRowName > dataForRow
diff --git a/ui/src/pages/Configuration/stories/__images__/ConfigurationPage-configuration-page-view-chromium.png b/ui/src/pages/Configuration/stories/__images__/ConfigurationPage-configuration-page-view-chromium.png
index 046f648b0..edc86c859 100644
--- a/ui/src/pages/Configuration/stories/__images__/ConfigurationPage-configuration-page-view-chromium.png
+++ b/ui/src/pages/Configuration/stories/__images__/ConfigurationPage-configuration-page-view-chromium.png
@@ -1,3 +1,3 @@
 version https://git-lfs.github.com/spec/v1
-oid sha256:8d4895cbb18b7cbc661c4935325f344549f1949ea7c01a7d3f90be5547f984ce
-size 59002
+oid sha256:03e4e711ec487ae7a72d1c275a1d8de677b97b08e9514ca1f0a51b40d6ae38ec
+size 58881
diff --git a/ui/src/pages/Configuration/stories/__images__/ConfigurationPage-configuration-view-add-chromium.png b/ui/src/pages/Configuration/stories/__images__/ConfigurationPage-configuration-view-add-chromium.png
index 2c26bda21..40f05296f 100644
--- a/ui/src/pages/Configuration/stories/__images__/ConfigurationPage-configuration-view-add-chromium.png
+++ b/ui/src/pages/Configuration/stories/__images__/ConfigurationPage-configuration-view-add-chromium.png
@@ -1,3 +1,3 @@
 version https://git-lfs.github.com/spec/v1
-oid sha256:f5bfed616a2daff376e49f3b1863de4e060d7e184693f58bcd3bb3abd69aa5b5
-size 109484
+oid sha256:1de7642ee200080de4747d18dff55c6f0adb2199c0ccd5f19b843d943718d08e
+size 109381
diff --git a/ui/src/pages/Input/stories/__images__/InputPage-input-page-expanded-row-chromium.png b/ui/src/pages/Input/stories/__images__/InputPage-input-page-expanded-row-chromium.png
index dcc98f323..b741bd32e 100644
--- a/ui/src/pages/Input/stories/__images__/InputPage-input-page-expanded-row-chromium.png
+++ b/ui/src/pages/Input/stories/__images__/InputPage-input-page-expanded-row-chromium.png
@@ -1,3 +1,3 @@
 version https://git-lfs.github.com/spec/v1
-oid sha256:7f0cacf018fc363c693cd7a149cd771898e2e34742cfcabd600b924c1277ae06
-size 48439
+oid sha256:c6c927a12be99bf113c5b77b6515d0106df3ec6dbf5fc4657dccaed073d3658c
+size 48449
diff --git a/ui/src/pages/Input/stories/__images__/InputPage-input-page-view-add-chromium.png b/ui/src/pages/Input/stories/__images__/InputPage-input-page-view-add-chromium.png
index 5fad51f3d..f7b43bc62 100644
--- a/ui/src/pages/Input/stories/__images__/InputPage-input-page-view-add-chromium.png
+++ b/ui/src/pages/Input/stories/__images__/InputPage-input-page-view-add-chromium.png
@@ -1,3 +1,3 @@
 version https://git-lfs.github.com/spec/v1
-oid sha256:1d2ac3519dde33947fe59a4984f3ab0bd9715fbe6c0e876ec1c9a732ff770eb1
-size 88896
+oid sha256:889386b88a11aada93e0201f937b9be17155db91817ebecd70dd84981304b1b8
+size 88868
diff --git a/ui/src/pages/Input/stories/__images__/InputPage-input-page-view-chromium.png b/ui/src/pages/Input/stories/__images__/InputPage-input-page-view-chromium.png
index 98b79d6fd..4a4c6ae74 100644
--- a/ui/src/pages/Input/stories/__images__/InputPage-input-page-view-chromium.png
+++ b/ui/src/pages/Input/stories/__images__/InputPage-input-page-view-chromium.png
@@ -1,3 +1,3 @@
 version https://git-lfs.github.com/spec/v1
-oid sha256:ac995df944a3ec1fc31a8a4db2144441d89ef55a72c871912f7f27ba1fa7ca29
-size 40748
+oid sha256:0fd5382e10d3196b13dada10677ae996396f2d9156176d6273a62a9e46429706
+size 40735
diff --git a/ui/src/pages/Input/stories/__images__/InputPage-input-page-view-update-input-chromium.png b/ui/src/pages/Input/stories/__images__/InputPage-input-page-view-update-input-chromium.png
index c20cd2a87..834faac7a 100644
--- a/ui/src/pages/Input/stories/__images__/InputPage-input-page-view-update-input-chromium.png
+++ b/ui/src/pages/Input/stories/__images__/InputPage-input-page-view-update-input-chromium.png
@@ -1,3 +1,3 @@
 version https://git-lfs.github.com/spec/v1
-oid sha256:05cba4e67993b6a1b152628b574b9e765428c1ec6addea5f8951bc9e47ebd1fa
-size 89167
+oid sha256:94c158447ce4da53a25bd4546945d02939184b0dbae378e21d02362afb6e3c82
+size 89124
diff --git a/ui/src/pages/stories/__images__/GlobalConfigPlayground-global-config-playground-chromium.png b/ui/src/pages/stories/__images__/GlobalConfigPlayground-global-config-playground-chromium.png
index 9be0aae12..86bf1cdeb 100644
--- a/ui/src/pages/stories/__images__/GlobalConfigPlayground-global-config-playground-chromium.png
+++ b/ui/src/pages/stories/__images__/GlobalConfigPlayground-global-config-playground-chromium.png
@@ -1,3 +1,3 @@
 version https://git-lfs.github.com/spec/v1
-oid sha256:68ddd13b7feccb5aac38c0215dc12645198341bed1f4793bcd8009913476284b
-size 62321
+oid sha256:2294c1d592caca2fdb028950cfaed8c8ea6ae514572334ed2ba2c46062da863d
+size 62175
diff --git a/ui/src/types/globalConfig/pages.ts b/ui/src/types/globalConfig/pages.ts
index b8539d2e1..5fdf3bc84 100644
--- a/ui/src/types/globalConfig/pages.ts
+++ b/ui/src/types/globalConfig/pages.ts
@@ -96,10 +96,13 @@ export const TableLessServiceSchema = z.object({
     inputHelperModule: z.string().optional(),
     hideForPlatform: z.enum(['cloud', 'enterprise']).optional(),
 });
+
 export const TableFullServiceSchema = TableLessServiceSchema.extend({
     description: z.string().optional(),
     table: TableSchema,
+    useInputToggleConfirmation: z.boolean().optional(),
 });
+
 export const InputsPageRegular = z
     .object({
         title: z.string(),
@@ -149,6 +152,7 @@ export const InputsPageTableSchema = z
         services: z.array(TableLessServiceSchema.strict()),
         hideFieldId: z.string().optional(),
         readonlyFieldId: z.string().optional(),
+        useInputToggleConfirmation: z.boolean().optional(),
     })
     .strict();
 


Test patch:
diff --git a/.github/workflows/build-test-release.yml b/.github/workflows/build-test-release.yml
index 495d32f30..0afc0b68d 100644
--- a/.github/workflows/build-test-release.yml
+++ b/.github/workflows/build-test-release.yml
@@ -325,8 +325,7 @@ jobs:
     needs: build-test-addon
     if: |
       !cancelled() &&
-      needs.build-test-addon.result == 'success' &&
-      ( github.base_ref == 'main' || github.ref_name == 'main' )
+      needs.build-test-addon.result == 'success'
     runs-on: ubuntu-latest
     strategy:
       fail-fast: false
diff --git a/tests/smoke/test_ucc_build.py b/tests/smoke/test_ucc_build.py
index 22f8de63c..0620e5b33 100644
--- a/tests/smoke/test_ucc_build.py
+++ b/tests/smoke/test_ucc_build.py
@@ -1,3 +1,4 @@
+import sys
 import os
 import re
 import tempfile
@@ -189,6 +190,7 @@ def test_ucc_generate_with_everything(caplog):
             ("appserver", "static", "alerticon.png"),
             ("bin", "splunk_ta_uccexample", "modalert_test_alert_helper.py"),
             ("appserver", "static", "js", "build", "entry_page.js.map"),
+            ("lib", "__pycache__"),
         ]
         for af in files_should_be_absent:
             actual_file_path = path.join(actual_folder, *af)
@@ -467,6 +469,8 @@ def test_ucc_generate_with_everything_uccignore(caplog):
     Checks the deprecation warning of .uccignore present in a repo with
     its functionality still working.
     """
+    # clean-up cached `additional_packaging` module when running all tests
+    sys.modules.pop("additional_packaging", "")
     with tempfile.TemporaryDirectory() as temp_dir:
         package_folder = path.join(
             path.dirname(path.realpath(__file__)),
diff --git a/tests/smoke/test_ucc_init.py b/tests/smoke/test_ucc_init.py
index 6f462e9bb..87c2f37a7 100644
--- a/tests/smoke/test_ucc_init.py
+++ b/tests/smoke/test_ucc_init.py
@@ -17,6 +17,7 @@ def test_ucc_init():
         "1.0.0",
         "demo-addon-for-splunk",
         overwrite=True,
+        add_license="MIT License",
     )
     expected_folder = os.path.join(
         os.path.dirname(__file__),
@@ -30,10 +31,10 @@ def test_ucc_init():
         ("README.md",),
         ("globalConfig.json",),
         ("package", "README.txt"),
-        ("package", "LICENSE.txt"),
         ("package", "app.manifest"),
         ("package", "bin", "demo_input_helper.py"),
         ("package", "lib", "requirements.txt"),
+        ("package", "LICENSES", "MIT License.txt"),
     ]
     helpers.compare_file_content(
         files_to_be_equal,
diff --git a/tests/testdata/expected_addons/expected_addon_after_init/demo_addon_for_splunk/package/LICENSES/MIT License.txt b/tests/testdata/expected_addons/expected_addon_after_init/demo_addon_for_splunk/package/LICENSES/MIT License.txt
new file mode 100644
index 000000000..03e8bb5ab
--- /dev/null
+++ b/tests/testdata/expected_addons/expected_addon_after_init/demo_addon_for_splunk/package/LICENSES/MIT License.txt
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright [yyyy] [name of copyright owner]
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
\ No newline at end of file
diff --git a/tests/testdata/expected_addons/expected_addon_after_init/demo_addon_for_splunk/package/app.manifest b/tests/testdata/expected_addons/expected_addon_after_init/demo_addon_for_splunk/package/app.manifest
index 13470c6d0..7c64a17c7 100644
--- a/tests/testdata/expected_addons/expected_addon_after_init/demo_addon_for_splunk/package/app.manifest
+++ b/tests/testdata/expected_addons/expected_addon_after_init/demo_addon_for_splunk/package/app.manifest
@@ -25,8 +25,8 @@
         },
         "commonInformationModels": null,
         "license": {
-            "name": null,
-            "text": "LICENSE.txt",
+            "name": "MIT License",
+            "text": "./LICENSES/MIT License.txt",
             "uri": null
         },
         "privacyPolicy": {
diff --git a/tests/testdata/expected_addons/expected_files_conflict_test/expected_log.json b/tests/testdata/expected_addons/expected_files_conflict_test/expected_log.json
index 0aa40f75e..f6a38719c 100644
--- a/tests/testdata/expected_addons/expected_files_conflict_test/expected_log.json
+++ b/tests/testdata/expected_addons/expected_files_conflict_test/expected_log.json
@@ -2,7 +2,7 @@
   "Detailed information about created/copied/modified/conflict files": "INFO",
   "Read more about it here: https://splunk.github.io/addonfactory-ucc-generator/quickstart/#verbose-mode": "INFO",
   "\u001b[33mapp.manifest                                                                    modified\u001b[0m": "INFO",
-  "\u001b[32mLICENSE.txt                                                                     copied\u001b[0m": "INFO",
+  "\u001b[32mLICENSES/LICENSE.txt                                                            copied\u001b[0m": "INFO",
   "\u001b[32mREADME.txt                                                                      copied\u001b[0m": "INFO",
   "VERSION                                                                         created\u001b[0m": "INFO",
   "\u001b[31mbin/import_declare_test.py                                                      conflict\u001b[0m": "INFO",
diff --git a/tests/testdata/expected_addons/expected_output_global_config_everything/.appinspect_api.expect.yaml b/tests/testdata/expected_addons/expected_output_global_config_everything/.appinspect_api.expect.yaml
index d57b094a2..e69de29bb 100644
--- a/tests/testdata/expected_addons/expected_output_global_config_everything/.appinspect_api.expect.yaml
+++ b/tests/testdata/expected_addons/expected_output_global_config_everything/.appinspect_api.expect.yaml
@@ -1,2 +0,0 @@
-check_for_compiled_python:
-  comment: 'Expected failure as compiled python file was detected in your build.'
\ No newline at end of file
diff --git a/tests/testdata/test_addons/package_global_config_everything/LICENSES/Apache-2.0.txt b/tests/testdata/expected_addons/expected_output_global_config_everything/Splunk_TA_UCCExample/LICENSES/Apache License 2.0.txt
similarity index 100%
rename from tests/testdata/test_addons/package_global_config_everything/LICENSES/Apache-2.0.txt
rename to tests/testdata/expected_addons/expected_output_global_config_everything/Splunk_TA_UCCExample/LICENSES/Apache License 2.0.txt
diff --git a/tests/testdata/test_addons/package_files_conflict_test/package/LICENSE.txt b/tests/testdata/test_addons/package_files_conflict_test/package/LICENSE.txt
deleted file mode 100644
index e69de29bb..000000000
diff --git a/tests/testdata/expected_addons/expected_addon_after_init/demo_addon_for_splunk/package/LICENSE.txt b/tests/testdata/test_addons/package_files_conflict_test/package/LICENSES/LICENSE.txt
similarity index 100%
rename from tests/testdata/expected_addons/expected_addon_after_init/demo_addon_for_splunk/package/LICENSE.txt
rename to tests/testdata/test_addons/package_files_conflict_test/package/LICENSES/LICENSE.txt
diff --git a/tests/testdata/test_addons/package_global_config_everything/additional_packaging.py b/tests/testdata/test_addons/package_global_config_everything/additional_packaging.py
new file mode 100644
index 000000000..208d9e5ef
--- /dev/null
+++ b/tests/testdata/test_addons/package_global_config_everything/additional_packaging.py
@@ -0,0 +1,36 @@
+from os.path import sep, exists, dirname, realpath, join
+from os import remove, system, _exit, WEXITSTATUS
+
+def additional_packaging(ta_name=None):
+    """
+    `build-ui.sh` builds custom component present in source code and ships them in the output directory
+    """
+    if exists(
+        join(dirname(realpath(__file__)), "build-ui.sh")
+    ):
+        system("chmod +x ./build-ui.sh")
+        return_code = system("./build-ui.sh")
+        if return_code != 0:
+            _exit(WEXITSTATUS(return_code))
+
+def cleanup_output_files(output_path: str, ta_name: str) -> None:
+    """
+    prepare a list for the files to be deleted after the source code has been copied to output directory
+    :param output_path: The path provided in `--output` argument in ucc-gen command or the default output path.
+    :param ta_name: The add-on name which is passed as a part of `--addon-name` argument during `ucc-gen init` 
+                    or present in app.manifest file of add-on.
+    """
+    files_to_delete = []
+    files_to_delete.append(sep.join([output_path, ta_name, "default", "redundant.conf"]))
+    files_to_delete.append(sep.join([output_path, ta_name, "bin", "template_modinput_layout.py"]))
+    files_to_delete.append(sep.join([output_path, ta_name, "bin", "example_one_input_one.py"]))
+    files_to_delete.append(sep.join([output_path, ta_name, "bin", "template_rest_handler_script.py"]))
+    files_to_delete.append(sep.join([output_path, ta_name, "bin", "file_does_not_exist.py"]))
+    files_to_delete.append(sep.join([output_path, ta_name, "default", "nav", "views", "file_copied_from_source_code.xml"]))
+
+    for delete_file in files_to_delete:
+        try:
+            remove(delete_file)
+        except (FileNotFoundError):
+            # simply pass if the file doesn't exist
+            pass
\ No newline at end of file
diff --git a/tests/testdata/test_addons/package_global_config_everything/globalConfig.json b/tests/testdata/test_addons/package_global_config_everything/globalConfig.json
index 877e52159..08fd75367 100644
--- a/tests/testdata/test_addons/package_global_config_everything/globalConfig.json
+++ b/tests/testdata/test_addons/package_global_config_everything/globalConfig.json
@@ -1906,10 +1906,10 @@
     "meta": {
         "name": "Splunk_TA_UCCExample",
         "restRoot": "splunk_ta_uccexample",
-        "version": "5.52.0+70c7e9d6b",
+        "version": "5.53.2+ed749a5ec",
         "displayName": "Splunk UCC test Add-on",
         "schemaVersion": "0.0.9",
-        "_uccVersion": "5.52.0",
+        "_uccVersion": "5.53.2",
         "supportedThemes": [
             "light",
             "dark"
diff --git a/tests/testdata/test_addons/package_global_config_everything/package/LICENSES/Apache License 2.0.txt b/tests/testdata/test_addons/package_global_config_everything/package/LICENSES/Apache License 2.0.txt
new file mode 100644
index 000000000..4ed90b952
--- /dev/null
+++ b/tests/testdata/test_addons/package_global_config_everything/package/LICENSES/Apache License 2.0.txt
@@ -0,0 +1,208 @@
+Apache License
+
+Version 2.0, January 2004
+
+http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION,
+AND DISTRIBUTION
+
+   1. Definitions.
+
+      
+
+"License" shall mean the terms and conditions for use, reproduction, and distribution
+as defined by Sections 1 through 9 of this document.
+
+      
+
+"Licensor" shall mean the copyright owner or entity authorized by the copyright
+owner that is granting the License.
+
+      
+
+"Legal Entity" shall mean the union of the acting entity and all other entities
+that control, are controlled by, or are under common control with that entity.
+For the purposes of this definition, "control" means (i) the power, direct
+or indirect, to cause the direction or management of such entity, whether
+by contract or otherwise, or (ii) ownership of fifty percent (50%) or more
+of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+      
+
+"You" (or "Your") shall mean an individual or Legal Entity exercising permissions
+granted by this License.
+
+      
+
+"Source" form shall mean the preferred form for making modifications, including
+but not limited to software source code, documentation source, and configuration
+files.
+
+      
+
+"Object" form shall mean any form resulting from mechanical transformation
+or translation of a Source form, including but not limited to compiled object
+code, generated documentation, and conversions to other media types.
+
+      
+
+"Work" shall mean the work of authorship, whether in Source or Object form,
+made available under the License, as indicated by a copyright notice that
+is included in or attached to the work (an example is provided in the Appendix
+below).
+
+      
+
+"Derivative Works" shall mean any work, whether in Source or Object form,
+that is based on (or derived from) the Work and for which the editorial revisions,
+annotations, elaborations, or other modifications represent, as a whole, an
+original work of authorship. For the purposes of this License, Derivative
+Works shall not include works that remain separable from, or merely link (or
+bind by name) to the interfaces of, the Work and Derivative Works thereof.
+
+      
+
+"Contribution" shall mean any work of authorship, including the original version
+of the Work and any modifications or additions to that Work or Derivative
+Works thereof, that is intentionally submitted to Licensor for inclusion in
+the Work by the copyright owner or by an individual or Legal Entity authorized
+to submit on behalf of the copyright owner. For the purposes of this definition,
+"submitted" means any form of electronic, verbal, or written communication
+sent to the Licensor or its representatives, including but not limited to
+communication on electronic mailing lists, source code control systems, and
+issue tracking systems that are managed by, or on behalf of, the Licensor
+for the purpose of discussing and improving the Work, but excluding communication
+that is conspicuously marked or otherwise designated in writing by the copyright
+owner as "Not a Contribution."
+
+      
+
+"Contributor" shall mean Licensor and any individual or Legal Entity on behalf
+of whom a Contribution has been received by Licensor and subsequently incorporated
+within the Work.
+
+2. Grant of Copyright License. Subject to the terms and conditions of this
+License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive,
+no-charge, royalty-free, irrevocable copyright license to reproduce, prepare
+Derivative Works of, publicly display, publicly perform, sublicense, and distribute
+the Work and such Derivative Works in Source or Object form.
+
+3. Grant of Patent License. Subject to the terms and conditions of this License,
+each Contributor hereby grants to You a perpetual, worldwide, non-exclusive,
+no-charge, royalty-free, irrevocable (except as stated in this section) patent
+license to make, have made, use, offer to sell, sell, import, and otherwise
+transfer the Work, where such license applies only to those patent claims
+licensable by such Contributor that are necessarily infringed by their Contribution(s)
+alone or by combination of their Contribution(s) with the Work to which such
+Contribution(s) was submitted. If You institute patent litigation against
+any entity (including a cross-claim or counterclaim in a lawsuit) alleging
+that the Work or a Contribution incorporated within the Work constitutes direct
+or contributory patent infringement, then any patent licenses granted to You
+under this License for that Work shall terminate as of the date such litigation
+is filed.
+
+4. Redistribution. You may reproduce and distribute copies of the Work or
+Derivative Works thereof in any medium, with or without modifications, and
+in Source or Object form, provided that You meet the following conditions:
+
+(a) You must give any other recipients of the Work or Derivative Works a copy
+of this License; and
+
+(b) You must cause any modified files to carry prominent notices stating that
+You changed the files; and
+
+(c) You must retain, in the Source form of any Derivative Works that You distribute,
+all copyright, patent, trademark, and attribution notices from the Source
+form of the Work, excluding those notices that do not pertain to any part
+of the Derivative Works; and
+
+(d) If the Work includes a "NOTICE" text file as part of its distribution,
+then any Derivative Works that You distribute must include a readable copy
+of the attribution notices contained within such NOTICE file, excluding those
+notices that do not pertain to any part of the Derivative Works, in at least
+one of the following places: within a NOTICE text file distributed as part
+of the Derivative Works; within the Source form or documentation, if provided
+along with the Derivative Works; or, within a display generated by the Derivative
+Works, if and wherever such third-party notices normally appear. The contents
+of the NOTICE file are for informational purposes only and do not modify the
+License. You may add Your own attribution notices within Derivative Works
+that You distribute, alongside or as an addendum to the NOTICE text from the
+Work, provided that such additional attribution notices cannot be construed
+as modifying the License.
+
+You may add Your own copyright statement to Your modifications and may provide
+additional or different license terms and conditions for use, reproduction,
+or distribution of Your modifications, or for any such Derivative Works as
+a whole, provided Your use, reproduction, and distribution of the Work otherwise
+complies with the conditions stated in this License.
+
+5. Submission of Contributions. Unless You explicitly state otherwise, any
+Contribution intentionally submitted for inclusion in the Work by You to the
+Licensor shall be under the terms and conditions of this License, without
+any additional terms or conditions. Notwithstanding the above, nothing herein
+shall supersede or modify the terms of any separate license agreement you
+may have executed with Licensor regarding such Contributions.
+
+6. Trademarks. This License does not grant permission to use the trade names,
+trademarks, service marks, or product names of the Licensor, except as required
+for reasonable and customary use in describing the origin of the Work and
+reproducing the content of the NOTICE file.
+
+7. Disclaimer of Warranty. Unless required by applicable law or agreed to
+in writing, Licensor provides the Work (and each Contributor provides its
+Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied, including, without limitation, any warranties
+or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR
+A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness
+of using or redistributing the Work and assume any risks associated with Your
+exercise of permissions under this License.
+
+8. Limitation of Liability. In no event and under no legal theory, whether
+in tort (including negligence), contract, or otherwise, unless required by
+applicable law (such as deliberate and grossly negligent acts) or agreed to
+in writing, shall any Contributor be liable to You for damages, including
+any direct, indirect, special, incidental, or consequential damages of any
+character arising as a result of this License or out of the use or inability
+to use the Work (including but not limited to damages for loss of goodwill,
+work stoppage, computer failure or malfunction, or any and all other commercial
+damages or losses), even if such Contributor has been advised of the possibility
+of such damages.
+
+9. Accepting Warranty or Additional Liability. While redistributing the Work
+or Derivative Works thereof, You may choose to offer, and charge a fee for,
+acceptance of support, warranty, indemnity, or other liability obligations
+and/or rights consistent with this License. However, in accepting such obligations,
+You may act only on Your own behalf and on Your sole responsibility, not on
+behalf of any other Contributor, and only if You agree to indemnify, defend,
+and hold each Contributor harmless for any liability incurred by, or claims
+asserted against, such Contributor by reason of your accepting any such warranty
+or additional liability. END OF TERMS AND CONDITIONS
+
+APPENDIX: How to apply the Apache License to your work.
+
+To apply the Apache License to your work, attach the following boilerplate
+notice, with the fields enclosed by brackets "[]" replaced with your own identifying
+information. (Don't include the brackets!) The text should be enclosed in
+the appropriate comment syntax for the file format. We also recommend that
+a file or class name and description of purpose be included on the same "printed
+page" as the copyright notice for easier identification within third-party
+archives.
+
+Copyright [yyyy] [name of copyright owner]
+
+Licensed under the Apache License, Version 2.0 (the "License");
+
+you may not use this file except in compliance with the License.
+
+You may obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+
+distributed under the License is distributed on an "AS IS" BASIS,
+
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+
+See the License for the specific language governing permissions and
+
+limitations under the License.
diff --git a/tests/testdata/test_addons/package_global_config_everything/package/app.manifest b/tests/testdata/test_addons/package_global_config_everything/package/app.manifest
index e42e5a046..c947b9b82 100644
--- a/tests/testdata/test_addons/package_global_config_everything/package/app.manifest
+++ b/tests/testdata/test_addons/package_global_config_everything/package/app.manifest
@@ -24,7 +24,7 @@
     "commonInformationModels": null,
     "license": {
       "name": null,
-      "text": "LICENSES/Apache-2.0.txt",
+      "text": "LICENSES/Apache License 2.0.txt",
       "uri": null
     },
     "privacyPolicy": {
diff --git a/tests/testdata/test_addons/package_global_config_everything_uccignore/LICENSES/Apache-2.0.txt b/tests/testdata/test_addons/package_global_config_everything_uccignore/LICENSES/Apache-2.0.txt
deleted file mode 100644
index 33195b0f8..000000000
--- a/tests/testdata/test_addons/package_global_config_everything_uccignore/LICENSES/Apache-2.0.txt
+++ /dev/null
@@ -1,1 +0,0 @@
-dummy apache license
\ No newline at end of file
diff --git a/tests/testdata/test_addons/package_global_config_everything_uccignore/additional_packaging.py b/tests/testdata/test_addons/package_global_config_everything_uccignore/additional_packaging.py
index 8af85b880..5b62ad240 100644
--- a/tests/testdata/test_addons/package_global_config_everything_uccignore/additional_packaging.py
+++ b/tests/testdata/test_addons/package_global_config_everything_uccignore/additional_packaging.py
@@ -1,6 +1,6 @@
 
-from os.path import sep, exists, dirname, realpath, join
-from os import remove, system, _exit, WEXITSTATUS
+from os.path import sep
+from os import remove
 
 def cleanup_output_files(output_path: str, ta_name: str) -> None:
     """
diff --git a/tests/testdata/test_addons/package_global_config_everything_uccignore/package/LICENSES/Apache License 2.0.txt b/tests/testdata/test_addons/package_global_config_everything_uccignore/package/LICENSES/Apache License 2.0.txt
new file mode 100644
index 000000000..775f420fa
--- /dev/null
+++ b/tests/testdata/test_addons/package_global_config_everything_uccignore/package/LICENSES/Apache License 2.0.txt
@@ -0,0 +1,1 @@
+test Apache license
diff --git a/tests/testdata/test_addons/package_global_config_multi_input/globalConfig.json b/tests/testdata/test_addons/package_global_config_multi_input/globalConfig.json
index 8002ac8db..b6393c616 100644
--- a/tests/testdata/test_addons/package_global_config_multi_input/globalConfig.json
+++ b/tests/testdata/test_addons/package_global_config_multi_input/globalConfig.json
@@ -387,63 +387,226 @@
                     "name": "example_input_one",
                     "description": "This is a description for Input One",
                     "title": "Example Input",
-                    "entity": [],
+                    "entity": [
+                        {
+                            "type": "text",
+                            "label": "Name",
+                            "validators": [
+                                {
+                                    "type": "regex",
+                                    "errorMsg": "Input Name must begin with a letter and consist exclusively of alphanumeric characters and underscores.",
+                                    "pattern": "^[a-zA-Z]\\w*$"
+                                },
+                                {
+                                    "type": "string",
+                                    "errorMsg": "Length of input name should be between 1 and 100",
+                                    "minLength": 1,
+                                    "maxLength": 100
+                                }
+                            ],
+                            "field": "name",
+                            "help": "A unique name for the data input.",
+                            "required": true
+                        },
+                        {
+                            "type": "interval",
+                            "field": "interval",
+                            "label": "Interval",
+                            "help": "Time interval of the data input, in seconds.",
+                            "required": true
+                        }
+                    ],
                     "table": {
                         "actions": [
                             "edit",
                             "delete",
                             "clone"
                         ],
-                        "header": [],
-                        "moreInfo": []
+                        "header": [
+                            {
+                                "label": "Name",
+                                "field": "name"
+                            },
+                            {
+                                "label": "Interval",
+                                "field": "interval"
+                            },
+                            {
+                                "label": "Status",
+                                "field": "disabled"
+                            }
+                        ],
+                        "moreInfo": [
+                            {
+                                "label": "Name",
+                                "field": "name"
+                            },
+                            {
+                                "label": "Interval",
+                                "field": "interval"
+                            },
+                            {
+                                "label": "Status",
+                                "field": "disabled"
+                            }
+                        ]
                     },
                     "warning": {
-                      "create": {
-                        "message": "Warning text for create mode"
-                      },
-                      "edit": {
-                        "message": "Warning text for edit mode"
-                      },
-                      "clone": {
-                        "message": "Warning text for clone mode"
-                      },
-                      "config": {
-                        "message": "Warning text for config mode"
-                      }
+                        "create": {
+                            "message": "Warning text for create mode"
+                        },
+                        "edit": {
+                            "message": "Warning text for edit mode"
+                        },
+                        "clone": {
+                            "message": "Warning text for clone mode"
+                        },
+                        "config": {
+                            "message": "Warning text for config mode"
+                        }
                     }
                 },
                 {
                     "name": "example_input_two",
                     "description": "This is a description for Input Two",
                     "title": "Example Input Two",
-                    "entity": [],
+                    "entity": [
+                        {
+                            "type": "text",
+                            "label": "Name",
+                            "validators": [
+                                {
+                                    "type": "regex",
+                                    "errorMsg": "Input Name must begin with a letter and consist exclusively of alphanumeric characters and underscores.",
+                                    "pattern": "^[a-zA-Z]\\w*$"
+                                },
+                                {
+                                    "type": "string",
+                                    "errorMsg": "Length of input name should be between 1 and 100",
+                                    "minLength": 1,
+                                    "maxLength": 100
+                                }
+                            ],
+                            "field": "name",
+                            "help": "A unique name for the data input.",
+                            "required": true
+                        },
+                        {
+                            "type": "interval",
+                            "field": "interval",
+                            "label": "Interval",
+                            "help": "Time interval of the data input, in seconds.",
+                            "required": true
+                        }
+                    ],
                     "table": {
                         "actions": [
                             "edit",
                             "delete",
                             "clone"
                         ],
-                        "header": [],
-                        "moreInfo": [],
+                        "header": [
+                            {
+                                "label": "Name",
+                                "field": "name"
+                            },
+                            {
+                                "label": "Interval",
+                                "field": "interval"
+                            },
+                            {
+                                "label": "Status",
+                                "field": "disabled"
+                            }
+                        ],
+                        "moreInfo": [
+                            {
+                                "label": "Name",
+                                "field": "name"
+                            },
+                            {
+                                "label": "Interval",
+                                "field": "interval"
+                            },
+                            {
+                                "label": "Status",
+                                "field": "disabled"
+                            }
+                        ],
                         "customRow": {
                             "type": "external",
                             "src": "custom_row"
                         }
-                    }
+                    },
+                    "useInputToggleConfirmation": true
                 },
                 {
                     "name": "example_input_three",
                     "description": "Input hidden for cloud",
                     "title": "Example Input Three Hidden Cloud",
-                    "entity": [],
+                    "entity": [
+                        {
+                            "type": "text",
+                            "label": "Name",
+                            "validators": [
+                                {
+                                    "type": "regex",
+                                    "errorMsg": "Input Name must begin with a letter and consist exclusively of alphanumeric characters and underscores.",
+                                    "pattern": "^[a-zA-Z]\\w*$"
+                                },
+                                {
+                                    "type": "string",
+                                    "errorMsg": "Length of input name should be between 1 and 100",
+                                    "minLength": 1,
+                                    "maxLength": 100
+                                }
+                            ],
+                            "field": "name",
+                            "help": "A unique name for the data input.",
+                            "required": true
+                        },
+                        {
+                            "type": "interval",
+                            "field": "interval",
+                            "label": "Interval",
+                            "help": "Time interval of the data input, in seconds.",
+                            "required": true
+                        }
+                    ],
                     "table": {
                         "actions": [
                             "edit",
                             "delete",
                             "clone"
                         ],
-                        "header": [],
-                        "moreInfo": [],
+                        "header": [
+                            {
+                                "label": "Name",
+                                "field": "name"
+                            },
+                            {
+                                "label": "Interval",
+                                "field": "interval"
+                            },
+                            {
+                                "label": "Status",
+                                "field": "disabled"
+                            }
+                        ],
+                        "moreInfo": [
+                            {
+                                "label": "Name",
+                                "field": "name"
+                            },
+                            {
+                                "label": "Interval",
+                                "field": "interval"
+                            },
+                            {
+                                "label": "Status",
+                                "field": "disabled"
+                            }
+                        ],
                         "customRow": {
                             "type": "external",
                             "src": "custom_row"
@@ -455,15 +618,69 @@
                     "name": "example_input_four",
                     "description": "Input hidden for enterprise",
                     "title": "Example Input Four Hidden Enterprise",
-                    "entity": [],
+                    "entity": [
+                        {
+                            "type": "text",
+                            "label": "Name",
+                            "validators": [
+                                {
+                                    "type": "regex",
+                                    "errorMsg": "Input Name must begin with a letter and consist exclusively of alphanumeric characters and underscores.",
+                                    "pattern": "^[a-zA-Z]\\w*$"
+                                },
+                                {
+                                    "type": "string",
+                                    "errorMsg": "Length of input name should be between 1 and 100",
+                                    "minLength": 1,
+                                    "maxLength": 100
+                                }
+                            ],
+                            "field": "name",
+                            "help": "A unique name for the data input.",
+                            "required": true
+                        },
+                        {
+                            "type": "interval",
+                            "field": "interval",
+                            "label": "Interval",
+                            "help": "Time interval of the data input, in seconds.",
+                            "required": true
+                        }
+                    ],
                     "table": {
                         "actions": [
                             "edit",
                             "delete",
                             "clone"
                         ],
-                        "header": [],
-                        "moreInfo": [],
+                        "header": [
+                            {
+                                "label": "Name",
+                                "field": "name"
+                            },
+                            {
+                                "label": "Interval",
+                                "field": "interval"
+                            },
+                            {
+                                "label": "Status",
+                                "field": "disabled"
+                            }
+                        ],
+                        "moreInfo": [
+                            {
+                                "label": "Name",
+                                "field": "name"
+                            },
+                            {
+                                "label": "Interval",
+                                "field": "interval"
+                            },
+                            {
+                                "label": "Status",
+                                "field": "disabled"
+                            }
+                        ],
                         "customRow": {
                             "type": "external",
                             "src": "custom_row"
@@ -477,9 +694,9 @@
     "meta": {
         "name": "Splunk_TA_UCCExample",
         "restRoot": "splunk_ta_uccexample",
-        "version": "5.50.1+099cf36c",
+        "version": "5.52.0+2e44cba94",
         "displayName": "Splunk UCC test Add-on",
-        "schemaVersion": "0.0.8",
-        "_uccVersion": "5.50.1"
+        "schemaVersion": "0.0.9",
+        "_uccVersion": "5.52.0"
     }
 }
diff --git a/tests/ui/conftest.py b/tests/ui/conftest.py
index 7a758fec1..5bf78fa18 100644
--- a/tests/ui/conftest.py
+++ b/tests/ui/conftest.py
@@ -1,7 +1,15 @@
+from typing import Any, Iterator
+
 import pytest
 
 from tests.ui.pages.account_page import AccountPage
 from tests.ui.test_configuration_page_account_tab import _ACCOUNT_CONFIG
+from pytest_splunk_addon_ui_smartx import utils as s_utils
+
+from _pytest.assertion import truncate
+
+truncate.DEFAULT_MAX_LINES = 9999
+truncate.DEFAULT_MAX_CHARS = 9999
 
 
 @pytest.fixture
@@ -13,3 +21,30 @@ def add_delete_account(ucc_smartx_rest_helper):
     kwargs = _ACCOUNT_CONFIG
     yield account.backend_conf.post_stanza(url, kwargs)
     account.backend_conf.delete_all_stanzas()
+
+
+@pytest.hookimpl(hookwrapper=True)
+def pytest_runtest_call(item: pytest.Item) -> Iterator[Any]:
+    """
+    Implemented hook to:
+    - check browser logs for severe logs after each test run.
+    """
+
+    yield
+
+    IGNORED = {
+        "appLogo.png - Failed to load resource: the server responded with a status of 404 (Not Found)",
+    }
+
+    browser_logs = s_utils.get_browser_logs(item.selenium_helper.browser)
+    severe_logs = [
+        log
+        for log in browser_logs
+        if log.level == s_utils.LogLevel.SEVERE
+        and not any(ignored in log.message for ignored in IGNORED)
+    ]
+
+    if severe_logs:
+        log_msg = [f"{log.level}: {log.source} - {log.message}" for log in severe_logs]
+        msg = "Severe logs found in browser console logs: \n" + "\n".join(log_msg)
+        pytest.fail(msg, pytrace=True)
diff --git a/tests/ui/test_configuration_page_account_tab.py b/tests/ui/test_configuration_page_account_tab.py
index 6617ff7d4..204f3e607 100644
--- a/tests/ui/test_configuration_page_account_tab.py
+++ b/tests/ui/test_configuration_page_account_tab.py
@@ -1033,8 +1033,11 @@ def test_account_helplink(self, ucc_smartx_selenium_helper, ucc_smartx_rest_help
         account = AccountPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
         go_to_link = "https://docs.splunk.com/Documentation"
         account.entity.open()
-        with account.entity.help_link.open_link():
-            self.assert_util(account.entity.help_link.get_current_url, go_to_link)
+
+        assert (
+            account.entity.help_link.internal_container.get_attribute("href")
+            == go_to_link
+        )
 
     @pytest.mark.execute_enterprise_cloud_true
     @pytest.mark.forwarder
diff --git a/tests/ui/test_input_page.py b/tests/ui/test_input_page.py
index 176da970d..9876c7e62 100644
--- a/tests/ui/test_input_page.py
+++ b/tests/ui/test_input_page.py
@@ -1037,8 +1037,11 @@ def test_example_input_one_help_link(
         go_to_link = "https://docs.splunk.com/Documentation"
         input_page.create_new_input.select("Example Input One")
         input_page.entity1.example_account.wait_for_values()
-        with input_page.entity1.help_link.open_link():
-            self.assert_util(input_page.entity1.help_link.get_current_url, go_to_link)
+
+        assert (
+            input_page.entity1.help_link.internal_container.get_attribute("href")
+            == go_to_link
+        )
 
     @pytest.mark.execute_enterprise_cloud_true
     @pytest.mark.forwarder
diff --git a/tests/unit/commands/test_init.py b/tests/unit/commands/test_init.py
index 74bcf3166..c5f221e2e 100644
--- a/tests/unit/commands/test_init.py
+++ b/tests/unit/commands/test_init.py
@@ -93,6 +93,7 @@ def test__is_valid_input_name(input_name, expected):
                 "0.0.1",
                 "addon_name",
                 False,
+                None,
             ),
         ),
         (
@@ -110,6 +111,7 @@ def test__is_valid_input_name(input_name, expected):
                 "0.0.1",
                 "addon_name",
                 False,
+                None,
             ),
         ),
         (
@@ -119,6 +121,7 @@ def test__is_valid_input_name(input_name, expected):
                 "addon_display_name": "Addon For Demo",
                 "addon_input_name": "input_name",
                 "addon_version": "0.0.1",
+                "add_license": "Apache License 2.0",
             },
             (
                 "addon_name",
@@ -127,6 +130,7 @@ def test__is_valid_input_name(input_name, expected):
                 "0.0.1",
                 "addon_rest_root",
                 False,
+                "Apache License 2.0",
             ),
         ),
     ],
diff --git a/tests/unit/test_global_config_validator.py b/tests/unit/test_global_config_validator.py
index fd365a374..43dc3b9f2 100644
--- a/tests/unit/test_global_config_validator.py
+++ b/tests/unit/test_global_config_validator.py
@@ -579,3 +579,15 @@ def test_should_warn_on_empty_validators(schema_json):
             field["validators"] = [number_validator]
 
     assert not should_warn_on_empty_validators(oauth_entity)
+
+
+def test_config_validation_status_toggle_confirmation():
+    global_config_path = helpers.get_testdata_file_path(
+        "valid_config_with_input_status_confirmation.json"
+    )
+    global_config = global_config_lib.GlobalConfig(global_config_path)
+
+    validator = GlobalConfigValidator(helpers.get_path_to_source_dir(), global_config)
+
+    with does_not_raise():
+        validator.validate()
diff --git a/tests/unit/test_install_python_libraries.py b/tests/unit/test_install_python_libraries.py
index 8e2d4972a..d6740fbf0 100644
--- a/tests/unit/test_install_python_libraries.py
+++ b/tests/unit/test_install_python_libraries.py
@@ -1,12 +1,17 @@
 import os
 import stat
+from collections import namedtuple
 from typing import List
 from unittest import mock
 
 import pytest
+
 import tests.unit.helpers as helpers
 from splunk_add_on_ucc_framework.global_config import OSDependentLibraryConfig
 
+from splunk_add_on_ucc_framework import (
+    install_python_libraries as install_python_libraries_module,
+)
 from splunk_add_on_ucc_framework.install_python_libraries import (
     CouldNotInstallRequirements,
     SplunktaucclibNotFound,
@@ -24,8 +29,9 @@
 
 
 class MockSubprocessResult:
-    def __init__(self, returncode):
+    def __init__(self, returncode, stdout=b""):
         self.returncode = returncode
+        self.stdout = stdout
 
 
 @mock.patch("subprocess.run", autospec=True)
@@ -277,8 +283,23 @@ def test_install_libraries_valid_os_libraries(
         "valid_config_with_os_libraries.json"
     )
     global_config = gc.GlobalConfig(global_config_path)
-
-    mock_subprocess_run.return_value = MockSubprocessResult(0)
+    mock_subprocess_run.side_effect = [
+        MockSubprocessResult(0),  # mock subprocess.run from _pip_install
+        MockSubprocessResult(0),  # mock subprocess.run from _pip_install
+        MockSubprocessResult(
+            0, b"Version: 41.0.5"
+        ),  # mock subprocess.run from _pip_is_lib_installed
+        MockSubprocessResult(0),  # mock subprocess.run from _pip_install
+        MockSubprocessResult(
+            0, b"Version: 41.0.5"
+        ),  # mock subprocess.run from _pip_is_lib_installed
+        MockSubprocessResult(0),  # mock subprocess.run from _pip_install
+        MockSubprocessResult(
+            0, b"Version: 1.5.1"
+        ),  # mock subprocess.run from _pip_is_lib_installed
+        MockSubprocessResult(0),  # mock subprocess.run from _pip_install
+        MockSubprocessResult(0),  # mock subprocess.run from _pip_install
+    ]
     tmp_ucc_lib_target = tmp_path / "ucc-lib-target"
     tmp_lib_path = tmp_path / "lib"
     tmp_lib_path.mkdir()
@@ -365,15 +386,14 @@ def test_install_libraries_version_mismatch(
     tmp_lib_reqs_file = tmp_lib_path / "requirements.txt"
     tmp_lib_reqs_file.write_text("splunktaucclib\n")
 
-    version_mismatch_shell_cmd = (
-        'python3 -m pip show --version cryptography | grep "Version: 41.0.5"'
-    )
+    version_mismatch_shell_cmd = "python3 -m pip show --version cryptography"
     mock_subprocess_run.side_effect = (
-        lambda command, shell=True, env=None, capture_output=True: MockSubprocessResult(
-            1
+        lambda command, shell=True, env=None, capture_output=True: (
+            MockSubprocessResult(1)
+            if command == version_mismatch_shell_cmd
+            and ucc_lib_target == env["PYTHONPATH"]
+            else MockSubprocessResult(0, b"Version: 40.0.0")
         )
-        if command == version_mismatch_shell_cmd and ucc_lib_target == env["PYTHONPATH"]
-        else MockSubprocessResult(0)
     )
 
     with pytest.raises(CouldNotInstallRequirements):
@@ -509,6 +529,19 @@ def test_is_pip_lib_installed_wrong_arguments():
         _pip_is_lib_installed("i", "t", "l", allow_higher_version=True)
 
 
+def test_is_pip_lib_installed_do_not_write_bytecode(monkeypatch):
+    Result = namedtuple("Result", ["returncode", "stdout", "stderr"])
+
+    def run(command, env):
+        assert command == "python3 -m pip show --version libname"
+        assert env["PYTHONPATH"] == "target"
+        assert env["PYTHONDONTWRITEBYTECODE"] == "1"
+        return Result(0, b"Version: 1.0.0", b"")
+
+    monkeypatch.setattr(install_python_libraries_module, "_subprocess_run", run)
+    assert _pip_is_lib_installed("python3", "target", "libname")
+
+
 @mock.patch("subprocess.run", autospec=True)
 def test_install_libraries_pip_custom_flag(mock_subprocess_run):
     mock_subprocess_run.return_value = MockSubprocessResult(0)
diff --git a/tests/unit/test_main.py b/tests/unit/test_main.py
index 6b8d187eb..73a6e8923 100644
--- a/tests/unit/test_main.py
+++ b/tests/unit/test_main.py
@@ -348,6 +348,7 @@ def test_build_command(mock_ucc_gen_generate, args, expected_parameters):
                 "addon_version": "0.0.1",
                 "addon_rest_root": None,
                 "overwrite": False,
+                "add_license": None,
             },
         ),
         (
@@ -361,6 +362,8 @@ def test_build_command(mock_ucc_gen_generate, args, expected_parameters):
                 "Splunk Add-on for Demo",
                 "--addon-input-name",
                 "demo_input",
+                "--add-license",
+                "MIT License",
             ],
             {
                 "addon_name": "splunk_add_on_for_demo",
@@ -369,6 +372,7 @@ def test_build_command(mock_ucc_gen_generate, args, expected_parameters):
                 "addon_version": "0.0.1",
                 "addon_rest_root": "splunk_add_on_for_demo",
                 "overwrite": False,
+                "add_license": "MIT License",
             },
         ),
     ],
@@ -380,6 +384,25 @@ def test_init_command(mock_init_command, args, expected_parameters):
     mock_init_command.assert_called_with(**expected_parameters)
 
 
+@pytest.mark.parametrize(
+    "args",
+    [
+        (
+            {
+                "addon_name": "splunk_add_on_for_demo",
+                "addon_display_name": "Addon For Demo",
+                "addon_input_name": "input_name",
+                "addon_version": "0.0.1",
+                "add_license": "Apache License",
+            }
+        ),
+    ],
+)
+def test_init_command_incorrect_license(args):
+    with pytest.raises(SystemExit):
+        main.main(args)
+
+
 @pytest.mark.parametrize(
     "args,expected_parameters",
     [
diff --git a/tests/unit/test_utils.py b/tests/unit/test_utils.py
index a10bda04a..aa4e97c42 100644
--- a/tests/unit/test_utils.py
+++ b/tests/unit/test_utils.py
@@ -3,6 +3,7 @@
 
 import dunamai
 import pytest
+from unittest.mock import patch
 
 from splunk_add_on_ucc_framework import exceptions, utils
 
@@ -35,6 +36,14 @@ def test_get_j2_env():
     assert sorted(expected_list_of_templates) == sorted(list_of_templates)
 
 
+@patch("splunk_add_on_ucc_framework.utils.__file__", "/mocked/path/utils")
+def test_get_license_path():
+    file_name = "example_license"
+    expected_path = "/mocked/path/templates/Licenses/example_license.txt"
+    actual_path = utils.get_license_path(file_name)
+    assert actual_path == expected_path
+
+
 @mock.patch("splunk_add_on_ucc_framework.utils.dunamai.Version", autospec=True)
 def test_get_version_from_git_when_runtime_error_from_dunamai(mock_version_class):
     mock_version_class.from_git.side_effect = RuntimeError
@@ -121,3 +130,17 @@ def test_dump_yaml_config(tmp_path):
         content = f.read()
 
     assert expected_content == content
+
+
+@pytest.mark.parametrize(
+    "test_path,expected_path",
+    [
+        ("/home/john/Test/test.txt", "home/john/Test/test.txt"),
+        ("\\home\\john\\Test\\test.txt", "home/john/Test/test.txt"),
+        ("\\\\home\\\\john\\\\Test\\\\test.txt", "home/john/Test/test.txt"),
+    ],
+)
+def test_get_os_path(test_path, expected_path):
+    stripped_path = utils.get_os_path(test_path)
+
+    assert stripped_path == expected_path
diff --git a/tests/unit/testdata/valid_config_with_input_status_confirmation.json b/tests/unit/testdata/valid_config_with_input_status_confirmation.json
new file mode 100644
index 000000000..d8189ca5f
--- /dev/null
+++ b/tests/unit/testdata/valid_config_with_input_status_confirmation.json
@@ -0,0 +1,90 @@
+{
+  "pages": {
+    "configuration": {
+      "tabs": [
+        {
+          "name": "account",
+          "table": {
+            "actions": ["edit", "delete", "clone"],
+            "header": [
+              {
+                "label": "Name",
+                "field": "name"
+              }
+            ]
+          },
+          "entity": [
+            {
+              "type": "text",
+              "label": "Name",
+              "validators": [
+                {
+                  "type": "string",
+                  "errorMsg": "Length of ID should be between 1 and 50",
+                  "minLength": 1,
+                  "maxLength": 50
+                },
+                {
+                  "type": "regex",
+                  "errorMsg": "Name must begin with a letter and consist exclusively of alphanumeric characters and underscores.",
+                  "pattern": "^[a-zA-Z]\\w*$"
+                }
+              ],
+              "field": "name",
+              "help": "Enter a unique name for this account.",
+              "required": true
+            }
+          ],
+          "title": "Account"
+        }
+      ],
+      "title": "Configuration",
+      "description": "Set up your add-on"
+    },
+    "inputs": {
+      "title": "Status toggle confirmation test",
+      "services": [
+        {
+          "name": "example_input_one",
+          "title": "Input one status toggle confirmation test",
+          "entity": [
+            {
+              "type": "text",
+              "label": "Name",
+              "field": "name"
+            }
+          ]
+        },
+        {
+          "name": "example_input_two",
+          "title": "Input two status toggle confirmation test",
+          "entity": [
+            {
+              "type": "text",
+              "label": "Name",
+              "field": "name"
+            }
+          ]
+        }
+      ],
+      "table": {
+        "actions": ["edit", "delete", "clone"],
+        "header": [
+          {
+            "label": "Name",
+            "field": "name"
+          }
+        ]
+      },
+      "useInputToggleConfirmation": true
+    }
+  },
+  "meta": {
+    "name": "Splunk_TA_UCCExample",
+    "restRoot": "splunk_ta_uccexample",
+    "version": "5.39.0Ra9e840a6",
+    "displayName": "Splunk UCC test Add-on",
+    "schemaVersion": "0.0.3",
+    "_uccVersion": "5.39.0"
+  }
+}
diff --git a/ui/src/components/ControlWrapper/test/ControlWrapper.test.tsx b/ui/src/components/ControlWrapper/test/ControlWrapper.test.tsx
new file mode 100644
index 000000000..0c4a3569d
--- /dev/null
+++ b/ui/src/components/ControlWrapper/test/ControlWrapper.test.tsx
@@ -0,0 +1,129 @@
+import { render, screen } from '@testing-library/react';
+import React from 'react';
+import ControlWrapper, { ControlWrapperProps } from '../ControlWrapper';
+
+const renderControlWrapper = (props: Partial<ControlWrapperProps>) => {
+    render(
+        <ControlWrapper
+            mode="create"
+            utilityFuncts={{
+                utilCustomFunctions: {
+                    setState: () => {},
+                    setErrorFieldMsg: () => {},
+                    clearAllErrorMsg: () => {},
+                    setErrorMsg: () => {},
+                },
+                handleChange: () => {},
+                addCustomValidator: () => {},
+            }}
+            value=""
+            display
+            error={false}
+            disabled={false}
+            serviceName="testServiceName"
+            dependencyValues={undefined}
+            entity={{
+                field: 'url',
+                label: 'URL',
+                type: 'text',
+                help: 'Enter the URL, for example',
+                required: true,
+                validators: [
+                    {
+                        errorMsg:
+                            "Invalid URL provided. URL should start with 'https' as only secure URLs are supported. Provide URL in this format",
+                        type: 'regex',
+                        pattern: '^(https://)[^/]+/?$',
+                    },
+                ],
+                encrypted: false,
+            }}
+            {...props}
+        />
+    );
+};
+
+it('check if required star displayed correctly', () => {
+    renderControlWrapper({});
+    const requiredStar = screen.queryByText('*');
+    expect(requiredStar).toBeInTheDocument();
+});
+
+it('check if required star not displayed', () => {
+    renderControlWrapper({
+        entity: {
+            field: 'url',
+            label: 'URL',
+            type: 'text',
+            required: false,
+        },
+    });
+    const requiredStar = screen.queryByText('*');
+    expect(requiredStar).not.toBeInTheDocument();
+});
+
+it('check if required star displayed correctly from modifiedEntitiesData', () => {
+    renderControlWrapper({
+        entity: {
+            field: 'url',
+            label: 'URL',
+            type: 'text',
+            required: false,
+        },
+        modifiedEntitiesData: { required: true },
+    });
+    const requiredStar = screen.queryByText('*');
+    expect(requiredStar).toBeInTheDocument();
+});
+
+it('check if required star not displayed due to modifiedEntitiesData', () => {
+    renderControlWrapper({
+        entity: {
+            field: 'url',
+            label: 'URL',
+            type: 'text',
+            required: true,
+        },
+        modifiedEntitiesData: { required: false },
+    });
+
+    const requiredStar = screen.queryByText('*');
+    expect(requiredStar).not.toBeInTheDocument();
+});
+
+it('check if label and help updated due to modifiedEntitiesData', () => {
+    const modifications = { required: false, label: 'Modified URL', help: 'Modified help' };
+    renderControlWrapper({
+        entity: {
+            field: 'url',
+            label: 'URL',
+            help: 'Enter the URL, for example',
+            type: 'text',
+            required: true,
+        },
+        modifiedEntitiesData: modifications,
+    });
+
+    const label = screen.getByTestId('label'); // label replaced
+    expect(label).toHaveTextContent(modifications.label);
+
+    const help = screen.getByTestId('help'); // help replaced
+    expect(help).toHaveTextContent(modifications.help);
+});
+
+it('check if help added due to modifiedEntitiesData', () => {
+    const modifications = { help: 'Modified help' };
+
+    renderControlWrapper({
+        entity: {
+            field: 'url',
+            label: 'URL',
+            type: 'text',
+            required: true,
+        },
+        modifiedEntitiesData: modifications,
+    });
+
+    const help = screen.getByTestId('help');
+    expect(help).toHaveTextContent(modifications.help);
+});
diff --git a/ui/src/components/DeleteModal/DeleteModal.test.tsx b/ui/src/components/DeleteModal/DeleteModal.test.tsx
index 37de666b3..dbd8dbc4d 100644
--- a/ui/src/components/DeleteModal/DeleteModal.test.tsx
+++ b/ui/src/components/DeleteModal/DeleteModal.test.tsx
@@ -5,7 +5,6 @@ import { http, HttpResponse } from 'msw';
 import DeleteModal from './DeleteModal';
 import { server } from '../../mocks/server';
 
-jest.mock('immutability-helper');
 jest.mock('../../util/util');
 
 const handleClose = jest.fn();
diff --git a/ui/src/components/SingleInputComponent/SingleInputComponent.test.tsx b/ui/src/components/SingleInputComponent/SingleInputComponent.test.tsx
index f4c2b624d..e8563e1e1 100644
--- a/ui/src/components/SingleInputComponent/SingleInputComponent.test.tsx
+++ b/ui/src/components/SingleInputComponent/SingleInputComponent.test.tsx
@@ -207,7 +207,9 @@ it('should fetch options from API when endpointUrl is provided', async () => {
         />
     );
     await userEvent.click(screen.getByRole('combobox'));
-    await screen.findByRole('option', { name: firstEntry.content.testLabel });
+    expect(
+        await screen.findByRole('option', { name: firstEntry.content.testLabel })
+    ).toBeInTheDocument();
 
     const secondEntry = mockedEntries[1];
     rerender(
@@ -217,17 +219,23 @@ it('should fetch options from API when endpointUrl is provided', async () => {
         />
     );
     await userEvent.click(screen.getByRole('combobox'));
-    await screen.findByRole('option', { name: secondEntry.content.testLabel });
+    expect(
+        await screen.findByRole('option', { name: secondEntry.content.testLabel })
+    ).toBeInTheDocument();
 
     const thirdEntry = mockedEntries[2];
     rerender(
         <SingleInputComponent {...baseProps} dependencyValues={{ name: true, region: false }} />
     );
     await userEvent.click(screen.getByRole('combobox'));
-    await screen.findByRole('option', { name: thirdEntry.content.testLabel });
+    expect(
+        await screen.findByRole('option', { name: thirdEntry.content.testLabel })
+    ).toBeInTheDocument();
 
     const fourthEntry = mockedEntries[3];
     rerender(<SingleInputComponent {...baseProps} dependencyValues={{ name: 0, region: 0 }} />);
     await userEvent.click(screen.getByRole('combobox'));
-    await screen.findByRole('option', { name: fourthEntry.content.testLabel });
+    expect(
+        await screen.findByRole('option', { name: fourthEntry.content.testLabel })
+    ).toBeInTheDocument();
 });
diff --git a/ui/src/components/table/tests/CustomTableRowConfirmation.test.tsx b/ui/src/components/table/tests/CustomTableRowConfirmation.test.tsx
new file mode 100644
index 000000000..1d63bd705
--- /dev/null
+++ b/ui/src/components/table/tests/CustomTableRowConfirmation.test.tsx
@@ -0,0 +1,152 @@
+import { render, screen, within } from '@testing-library/react';
+import React from 'react';
+import userEvent from '@testing-library/user-event';
+
+import { BrowserRouter } from 'react-router-dom';
+import { http, HttpResponse } from 'msw';
+import { TableContextProvider } from '../../../context/TableContext';
+import { server } from '../../../mocks/server';
+import { setUnifiedConfig } from '../../../util/util';
+import { SIMPLE_NAME_TABLE_MOCK_DATA_WITH_STATUS_TOGGLE_CONFIRMATION } from '../stories/configMockups';
+import {
+    MockRowData,
+    MockRowDataTogglingResponseDisableFalse,
+    MockRowDataTogglingResponseDisableTrue,
+} from '../stories/rowDataMockup';
+import TableWrapper, { ITableWrapperProps } from '../TableWrapper';
+import { invariant } from '../../../util/invariant';
+
+beforeEach(() => {
+    const props = {
+        page: 'inputs',
+        serviceName: 'example_input_one',
+        handleRequestModalOpen: jest.fn(),
+        handleOpenPageStyleDialog: jest.fn(),
+        displayActionBtnAllRows: false,
+    } satisfies ITableWrapperProps;
+
+    server.use(
+        http.get('/servicesNS/nobody/-/splunk_ta_uccexample_example_input_one', () =>
+            HttpResponse.json(MockRowData)
+        )
+    );
+
+    setUnifiedConfig(SIMPLE_NAME_TABLE_MOCK_DATA_WITH_STATUS_TOGGLE_CONFIRMATION);
+
+    render(
+        <TableContextProvider>
+            <TableWrapper {...props} />
+        </TableContextProvider>,
+        { wrapper: BrowserRouter }
+    );
+});
+
+const getRowData = (isDisabled: boolean) => {
+    const active = MockRowData.entry.find(
+        (entry) => entry.content.disabled === isDisabled // api mocks are created for aaaaaa entity
+    );
+    return active;
+};
+
+const serverUseDisabledForEntity = (entity: string, isDisabledTrue: boolean) => {
+    server.use(
+        http.post(`/servicesNS/nobody/-/splunk_ta_uccexample_example_input_one/${entity}`, () =>
+            HttpResponse.json(
+                isDisabledTrue
+                    ? MockRowDataTogglingResponseDisableTrue
+                    : MockRowDataTogglingResponseDisableFalse
+            )
+        )
+    );
+};
+
+const getRowElements = async (isDisabled: boolean) => {
+    const activeRowData = getRowData(isDisabled);
+    invariant(activeRowData, 'Active row not found');
+    const activeRow = await screen.findByLabelText(`row-${activeRowData?.name}`);
+
+    const statusCell = within(activeRow).getByTestId('status');
+
+    const statusToggle = within(activeRow).getByRole('switch');
+
+    return { activeRowData, activeRow, statusCell, statusToggle };
+};
+
+it('Status toggling with acceptance model - displayed correctly', async () => {
+    const { activeRowData, statusToggle } = await getRowElements(false);
+
+    await userEvent.click(statusToggle);
+
+    const acceptModal = await screen.findByRole('dialog', { name: /Make input Inactive?/i });
+
+    screen.getByText(`Do you want to make ${activeRowData?.name} input Inactive?`);
+
+    screen.getByRole('button', { name: 'Yes' });
+    const noBtn = screen.getByRole('button', { name: 'No' });
+
+    await userEvent.click(noBtn);
+
+    expect(acceptModal).not.toBeInTheDocument();
+});
+
+it('Status toggling with acceptance model - toggles state', async () => {
+    const { activeRowData, statusCell, statusToggle } = await getRowElements(false);
+
+    expect(statusCell).toHaveTextContent('Active');
+
+    serverUseDisabledForEntity(activeRowData.name, true);
+
+    await userEvent.click(statusToggle);
+
+    await screen.findByRole('dialog', { name: 'Make input Inactive?' });
+
+    const yesBtn = await screen.findByRole('button', { name: 'Yes' });
+    await userEvent.click(yesBtn);
+
+    expect(statusCell).toHaveTextContent('Inactive');
+
+    serverUseDisabledForEntity(activeRowData.name, false);
+
+    await userEvent.click(statusToggle);
+
+    await screen.findByRole('dialog', { name: 'Make input Active?' });
+
+    const yesBtn2 = await screen.findByRole('button', { name: 'Yes' });
+    await userEvent.click(yesBtn2);
+
+    expect(statusCell).toHaveTextContent('Active');
+});
+
+it('Status toggling with acceptance model - decline modal still Active', async () => {
+    const { activeRowData, statusCell, statusToggle } = await getRowElements(false);
+
+    expect(statusCell).toHaveTextContent('Active');
+
+    serverUseDisabledForEntity(activeRowData.name, true);
+
+    await userEvent.click(statusToggle);
+
+    await screen.findByRole('dialog', { name: 'Make input Inactive?' });
+
+    const noBtn = await screen.findByRole('button', { name: 'No' });
+    await userEvent.click(noBtn);
+
+    expect(statusCell).toHaveTextContent('Active');
+});
+
+it('Status toggling with acceptance model - decline modal still Inactive', async () => {
+    const { activeRowData, statusCell, statusToggle } = await getRowElements(true);
+
+    expect(statusCell).toHaveTextContent('Inactive');
+
+    serverUseDisabledForEntity(activeRowData.name, true);
+
+    await userEvent.click(statusToggle);
+
+    await screen.findByRole('dialog', { name: 'Make input Active?' });
+
+    const noBtn = await screen.findByRole('button', { name: 'No' });
+    await userEvent.click(noBtn);
+
+    expect(statusCell).toHaveTextContent('Inactive');
+});
diff --git a/ui/src/components/table/tests/TableExpansionRow.test.tsx b/ui/src/components/table/tests/TableExpansionRow.test.tsx
new file mode 100644
index 000000000..0dcca8b66
--- /dev/null
+++ b/ui/src/components/table/tests/TableExpansionRow.test.tsx
@@ -0,0 +1,172 @@
+import { render, screen, waitFor, waitForElementToBeRemoved, within } from '@testing-library/react';
+import userEvent from '@testing-library/user-event';
+import React from 'react';
+import { http, HttpResponse } from 'msw';
+import { BrowserRouter } from 'react-router-dom';
+import TableWrapper, { ITableWrapperProps } from '../TableWrapper';
+import { server } from '../../../mocks/server';
+import { TableContextProvider } from '../../../context/TableContext';
+import { setUnifiedConfig } from '../../../util/util';
+import { getSimpleConfig } from '../stories/configMockups';
+import { getMockServerResponseForInput } from '../../../mocks/server-response';
+import { GlobalConfig } from '../../../types/globalConfig/globalConfig';
+import { getBuildDirPath } from '../../../util/script';
+import mockCustomInputRow from '../../../../../tests/testdata/test_addons/package_global_config_everything/package/appserver/static/js/build/custom/custom_input_row';
+
+const inputName = 'example_input_one';
+const interval = 7766;
+const updatedInterval = 7788;
+
+const props = {
+    page: 'inputs',
+    serviceName: inputName,
+    handleRequestModalOpen: jest.fn(),
+    handleOpenPageStyleDialog: jest.fn(),
+} satisfies ITableWrapperProps;
+
+const baseConfig = getSimpleConfig();
+const customRowFileName = 'CustomInputRow';
+
+function setup() {
+    jest.mock(`${getBuildDirPath()}/custom/${customRowFileName}.js`, () => mockCustomInputRow, {
+        virtual: true,
+    });
+
+    const headers = [
+        {
+            label: 'Name',
+            field: 'name',
+        },
+        {
+            label: 'Interval',
+            field: 'interval',
+        },
+    ];
+    setUnifiedConfig({
+        ...baseConfig,
+        pages: {
+            ...baseConfig.pages,
+            inputs: {
+                title: inputName,
+                services: [
+                    {
+                        title: inputName,
+                        name: inputName,
+                        entity: [
+                            {
+                                label: 'Name',
+                                field: 'name',
+                                type: 'text',
+                            },
+                            {
+                                label: 'Interval',
+                                field: 'interval',
+                                type: 'text',
+                            },
+                        ],
+                    },
+                ],
+                table: {
+                    actions: ['edit'],
+                    header: headers,
+                    moreInfo: headers,
+                    customRow: {
+                        src: customRowFileName,
+                        type: 'external',
+                    },
+                },
+            },
+        },
+    } satisfies GlobalConfig);
+
+    server.use(
+        http.get(`/servicesNS/nobody/-/splunk_ta_uccexample_${inputName}`, () =>
+            HttpResponse.json(
+                getMockServerResponseForInput([
+                    {
+                        name: inputName,
+                        content: {
+                            interval,
+                        },
+                    },
+                ])
+            )
+        )
+    );
+
+    render(
+        <TableContextProvider>
+            <TableWrapper {...props} />
+        </TableContextProvider>,
+        { wrapper: BrowserRouter }
+    );
+}
+
+async function expectIntervalInExpandedRow(inputRow: HTMLElement, expectedInterval: number) {
+    const arrow = within(inputRow).getByRole('cell', { name: /expandable/i });
+    const isExpanded = arrow.getAttribute('aria-expanded');
+    if (isExpanded === 'false') {
+        await userEvent.click(arrow);
+    }
+    await waitFor(() => expect(arrow.getAttribute('aria-expanded')).not.toBe('false'));
+    const loading = screen.queryByText('Loading...');
+    if (loading) {
+        await waitForElementToBeRemoved(loading);
+    }
+
+    const allDefinitions = screen.getAllByRole('definition').map((el) => el.textContent);
+
+    expect(allDefinitions).toContain(`${expectedInterval} sec`);
+}
+
+it('should update custom Expansion Row when Input has changed', async () => {
+    setup();
+    const inputRow = await screen.findByRole('row', { name: `row-${inputName}` });
+
+    // simulate the server response for the post request
+    server.use(
+        http.post(
+            `/servicesNS/nobody/-/splunk_ta_uccexample_${inputName}/${inputName}`,
+            async ({ request }) => {
+                const formData = await request.formData();
+                const formDataObject: Record<string, string> = {};
+                formData.forEach((value, key) => {
+                    if (typeof value === 'string') {
+                        formDataObject[key] = value;
+                    }
+                });
+                return HttpResponse.json(
+                    getMockServerResponseForInput([
+                        {
+                            name: inputName,
+                            content: formDataObject,
+                        },
+                    ])
+                );
+            }
+        )
+    );
+
+    await expectIntervalInExpandedRow(
+        await screen.findByRole('row', { name: `row-${inputName}` }),
+        interval
+    );
+
+    await userEvent.click(within(inputRow).getByRole('button', { name: /edit/i }));
+    const dialog = await screen.findByRole('dialog');
+
+    const textBoxes = within(dialog).getAllByRole('textbox');
+    expect(textBoxes).toHaveLength(2);
+    const intervalInput = textBoxes[1];
+    expect(intervalInput).toHaveValue(interval.toString());
+    await userEvent.clear(intervalInput);
+    await userEvent.type(intervalInput, updatedInterval.toString());
+    await userEvent.click(screen.getByRole('button', { name: /update/i }));
+
+    await screen.findByRole('cell', { name: updatedInterval.toString() });
+
+    await expectIntervalInExpandedRow(
+        await screen.findByRole('row', { name: `row-${inputName}` }),
+        updatedInterval
+    );
+});
diff --git a/ui/src/components/table/tests/TableWrapper.test.tsx b/ui/src/components/table/tests/TableWrapper.test.tsx
index df1d27445..f420e6271 100644
--- a/ui/src/components/table/tests/TableWrapper.test.tsx
+++ b/ui/src/components/table/tests/TableWrapper.test.tsx
@@ -3,14 +3,16 @@ import userEvent from '@testing-library/user-event';
 import React from 'react';
 import { http, HttpResponse } from 'msw';
 import { BrowserRouter } from 'react-router-dom';
-import { MockRowData } from '../stories/rowDataMockup';
+import { MockRowData, MockRowDataForStatusCount } from '../stories/rowDataMockup';
 import TableWrapper, { ITableWrapperProps } from '../TableWrapper';
 import { server } from '../../../mocks/server';
 import { TableContextProvider } from '../../../context/TableContext';
 import { setUnifiedConfig } from '../../../util/util';
-import { getSimpleConfigWithMapping, SIMPLE_NAME_TABLE_MOCK_DATA } from '../stories/configMockups';
-
-jest.mock('immutability-helper');
+import {
+    getSimpleConfigStylePage,
+    getSimpleConfigWithMapping,
+    SIMPLE_NAME_TABLE_MOCK_DATA,
+} from '../stories/configMockups';
 
 const handleRequestModalOpen = jest.fn();
 const handleOpenPageStyleDialog = jest.fn();
@@ -183,3 +185,29 @@ it('Correctly render status labels with mapped values', async () => {
     const inActiveStatusCell = within(inActiveRow).getByTestId('status');
     expect(inActiveStatusCell).toHaveTextContent('Disabled Field');
 });
+
+it('Check inputs count is visible', async () => {
+    const props = {
+        page: 'inputs',
+        serviceName: 'example_input_one',
+        handleRequestModalOpen,
+        handleOpenPageStyleDialog,
+        displayActionBtnAllRows: false,
+    } satisfies ITableWrapperProps;
+    server.use(
+        http.get('/servicesNS/nobody/-/splunk_ta_uccexample_example_input_one', () =>
+            HttpResponse.json(MockRowDataForStatusCount)
+        )
+    );
+
+    setUnifiedConfig(getSimpleConfigStylePage());
+
+    render(
+        <TableContextProvider>
+            <TableWrapper {...props} />
+        </TableContextProvider>,
+        { wrapper: BrowserRouter }
+    );
+    const statusCount = await screen.findByText('11 Inputs (7 of 11 enabled)');
+    expect(statusCount).toBeInTheDocument();
+});