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

Issue:
Feature request - generate SHC related synchronisation configuration

When creating and Add-on with ucc-gen, we should generate automatically the relevant configuration for the Add-on to work properly in Search Head Cluster and synchronise the configuration file amongs the members.

This is achieved via the generation of a server.conf:

```
# server.conf

[shclustering]
conf_replication_include.<ta_name>_settings = true
conf_replication_include.<ta_name>_account = true
```

oauth if in use would added too.


Discussion / hints:
I think we can provide a flag to `ucc-gen` to include SHC synchronisation. I am not sure if each add-on needs SHC by default. @guilhemmarchand what do you think?
@arys-splunk 
My opinion is that yes the Addon should include it automatically.

If running in standalone this won't have any effects, and if running in SHC then it works automatically as it should be.
Users shouldn't to think about about that, this is a root cause of potential loss of time and frustration for users for no technically justified reason.

Many users will not know it and will think they need to handle it from the SHC deployer, or even worst manually, sometimes leading to break the config UI if they do it wrong (unreadable hash)

We can take the example of the phantom Addon which used not to include it and now bundles it by default, so we should


I'll work on this one this week.
Unfortunately, I am a bit busy right now, but I think that we can merge this feature request in a bigger feature request which may be resolve #285.

The idea is to merge all the configuration instead of rewriting them.
I'll put here some of the examples from add-ons: https://github.com/guilhemmarchand/TA-ms-teams-alert-action/issues/40 and https://github.com/guilhemmarchand/TA-ms-teams-alert-action/issues/26

Fix patch:
diff --git a/.addonmatrix b/.addonmatrix
new file mode 100644
index 000000000..dfb15b129
--- /dev/null
+++ b/.addonmatrix
@@ -0,0 +1,1 @@
+--splunkfeatures METRICS_MULTI,PYTHON3
\ No newline at end of file
diff --git a/.licenserc.yaml b/.licenserc.yaml
index cf33543c2..c038d130e 100644
--- a/.licenserc.yaml
+++ b/.licenserc.yaml
@@ -19,9 +19,7 @@ header:
     copyright-owner: Splunk Inc.
 
   paths-ignore:
-    - ".circleci/"
     - ".github/"
-    - ".vscode/"
     - "dist"
     - "**/*.md"
     - "LICENSE"
@@ -29,7 +27,7 @@ header:
     - "*.lock"
     - "docs/**"
     - "splunk_add_on_ucc_framework/templates/*"
-    - "splunk_add_on_ucc_framework/modular_alert_builder/build_core/arf_template/**"
+    - "splunk_add_on_ucc_framework/commands/modular_alert_builder/arf_template/**"
     - "tests/**"
     - "README.md"
     - "mkdocs.yml"
diff --git a/.releaserc b/.releaserc
index f58279c18..2be5ae077 100644
--- a/.releaserc
+++ b/.releaserc
@@ -76,7 +76,7 @@
         "@semantic-release/git",
         {
           "assets": ["NOTICE", "CHANGELOG.md", "pyproject.toml", "splunk_add_on_ucc_framework/__init__.py"],
-          "message": "chore(release): ${nextRelease.version}\n\n${nextRelease.notes}",
+          "message": "chore(release): ${nextRelease.version}\n\n${nextRelease.notes} [ci skip]",
         },
       ],
       ["@semantic-release/github", { "assets": ["NOTICE", "pyproject.toml"] }],
diff --git a/docs/advanced/groups_feature.md b/docs/advanced/groups_feature.md
new file mode 100644
index 000000000..a0fe87ffb
--- /dev/null
+++ b/docs/advanced/groups_feature.md
@@ -0,0 +1,54 @@
+Using this functionality, the Inputs page form can be divided into distinct sections, each comprising relevant fields. If the `isExpandable` property is set to true in the global config file, the group will be of the [collapsible panel](https://splunkui.splunk.com/Packages/react-ui/CollapsiblePanel) type. 
+
+The groups will be displayed at the bottom of the form.
+
+### Properties
+- `label` to display the title of a specific group.
+- `fields` to specify the list of fields in a group. All fields must be present in the **entity**.
+- `options`:
+    - `isExpandable` can be used to hide/show fields of the group. The default value is **false**.
+    - `expand` to show all fields of the group while opening the form. The default value is **false**.
+    
+### Usage
+```
+{
+  "name": "aws_config",
+  "title": "Config",
+  "groups": [
+    {
+      "label": "AWS Input Configuration",
+      "options": {
+        "isExpandable": false
+      },
+      "fields": [
+        "name",
+        "aws_account"
+      ]
+    },
+    {
+      "label": "Splunk-related Configuration",
+      "options": {
+        "isExpandable": false
+      },
+      "fields": [
+        "sourcetype",
+        "index"
+      ]
+    },
+    {
+      "label": "Advanced Settings",
+      "options": {
+        "expand": false,
+        "isExpandable": true
+      },
+      "fields": [
+        "polling_interval"
+      ]
+    }
+  ],
+  "entity": []
+},
+```
+### Output
+This is how it looks like in the UI:
+![image](../images/Groups_Feature.png)
diff --git a/docs/components.md b/docs/components.md
index 72c15c10c..7ad82abdb 100644
--- a/docs/components.md
+++ b/docs/components.md
@@ -70,8 +70,8 @@ TBD
 
 Underlying `@splunk/react-ui` component: [`File`](https://splunkui.splunk.com/Packages/react-ui/File).
 
-The current implementation of the `file` component only supports `JSON` files 
-and accepts only 1 file (can be dragged into). 
+Define the file formats your add-on supports under `supportedFileTypes` key (it is required).
+`maxFileSize` value will be considered in KB.
 
 Usage example below:
 
@@ -82,23 +82,15 @@ Usage example below:
     "help": "Upload service account's certificate",
     "field": "service_account",
     "options": {
-        "fileSupportMessage": "Support message"
+        "fileSupportMessage": "Support message",
+        "supportedFileTypes": ["json", "pem"],
+        "maxFileSize": 100
     },
-    "validators": [
-        {
-            "type": "file",
-            "supportedFileTypes": [
-                "json"
-            ]
-        }
-    ],
     "encrypted": true,
     "required": true
 }
 ```
 
-> Note: `validators` field should be present for the file input exactly as it is in the example above.
-
 This is how it looks like in the UI:
 
 ![image](images/components/file_component_example.png)
diff --git a/docs/contributing.md b/docs/contributing.md
index f1da043b7..5f29df7f1 100644
--- a/docs/contributing.md
+++ b/docs/contributing.md
@@ -25,9 +25,11 @@ poetry run pytest tests/unit
 
 ### UI tests
 
+If you need to run UI tests for the PR, please add a label "run-ui-tests". 
+
 1. With local version of ucc-gen create UCCExample TA to output directory:
     ```
-    poetry run ucc-gen --source tests/testdata/test_addons/package_global_config_configuration/package
+    poetry run ucc-gen --source tests/testdata/test_addons/package_global_config_inputs_configuration_alerts/package
     ```
 2. Install docker and run containerized Splunk Enterprise using script:
     ```
@@ -37,7 +39,7 @@ poetry run pytest tests/unit
 3. Install any browser and specific to this browser driver such as [chromedriver](https://chromedriver.chromium.org/getting-started/) for Chrome.
 4. Run tests using command:
     ```
-    poetry run pytest tests/ui 
+    poetry run pytest tests/ui
     ```
    Default test parameters are using Splunk connection details and credentials from earlier step and `chromedriver` is used as a default webdriver.  
    To use different browser or Splunk configuration set proper parameters according to the [smartx-ui-test-library](https://addon-factory-smartx-ui-test-library.readthedocs.io/en/latest/how_to_use.html) documentation.
diff --git a/docs/custom_ui_extensions/custom_cell.md b/docs/custom_ui_extensions/custom_cell.md
index eebc5d9ea..ea43c99a6 100644
--- a/docs/custom_ui_extensions/custom_cell.md
+++ b/docs/custom_ui_extensions/custom_cell.md
@@ -1,35 +1,49 @@
-Custom Cell is used when the content of a table cell needs to be updated.
-We can use Custom Cell inside the table header in the inputs and configuration page.
+A Custom Cell is used to update the content of a table cell. 
 
-Here is how you specify a custom cell hook:
-```
-"customCell": {
-  "src": "custom_cell",
-  "type": "external"
-}
-```
-The custom_cell file's relative path to globalConfig file is `appserver/static/js/build/custom/custom_cell.js`
-
-### Usage
-
-Use Custom Cell in the configuration table:
-![image](../images/Custom_Cell_GlobalConfig.png)
+`customCell` attribute will be used in the table header on the inputs and configuration page.
 
 ### Properties
 
 | Property          | Description |
 | ----------------- | ----------- |
-| globalConfig      | It is an hierarchical object having the properties and their values same as the globalConfig file. |
-| el                | The html element of the custom cell. |
+| globalConfig       | It is a hierarchical object that contains the globalConfig file's properties and values. |
+| el                | The `el` is used to render a custom cell element in a table. |
 | serviceName       | The name of the service/tab specified in the globalConfig file. |
 | row               | The object of the record for which the CustomRowInput constructor is called. |
-| field             | The name of the field as specified in the globalConfig file. |
+| field              | The name of the field as specified in the globalConfig file. |
 
 ### Methods
 
 | Property          | Description |
 | ----------------- | ----------- |
-| Render            | This method should contain the rendering logic for the custom component. This method is called when the create, edit or clone form is rendered. |
+| render            | `render` is a method which should have logic for the custom cell component, and it will be executed automatically when the create, edit, or clone actions performed. |
+
+### Usage
+
+```
+{
+    "name": "account",
+    "title": "Account"
+    "entity": [],
+    "table": {
+        "actions": ["edit", "delete", "clone"],
+        "header": [{
+            "label": "Name",
+            "field": "name"
+        }, {
+            "label": "Auth Type",
+            "field": "auth_type"
+        }, {
+            "label": "Test Custom Cell",
+            "field": "test_custom_cell",
+            "customCell": {
+                "src": "CustomInputCell",
+                "type": "external"
+            }
+        }]
+    }
+}
+```
 
 ### Example
 
@@ -68,7 +82,10 @@ class CustomInputCell {
 export default CustomInputCell; 
 ```
 
+> Note: The Javascript file for the custom cell should be saved in the custom folder at `appserver/static/js/build/custom/`.
+
 ### Output
 
-This is how custom cell looks:
-![image](../images/Custom_Cell_Output.png)
+This is how it looks like in the UI:
+
+![image](../images/custom_ui_extensions/Custom_Cell_Output.png)
diff --git a/docs/custom_ui_extensions/custom_control.md b/docs/custom_ui_extensions/custom_control.md
index 568daccb8..16e6ab7ff 100644
--- a/docs/custom_ui_extensions/custom_control.md
+++ b/docs/custom_ui_extensions/custom_control.md
@@ -1,38 +1,53 @@
-Custom Control class is used to create a custom input component.
-
-Here is how you specify a custom control hook for a service/tab in the globalConfig.json file:
-```
-{
-    "type": "custom",
-    "options": {
-        "src": "custom_control",
-        "type": "external"
-    }
-}
-```
-The custom_control file's relative path to globalConfig is `appserver/static/js/build/custom/custom_control.js`
-
-### Usage
-
-Use custom control in the tabs:
-![image](../images/Custom_Control_GlobalConfig.png)
+The Custom Control feature allows you to display any customised input component in the form. The developer can easily design and render any complex input component with this feature. Modern TAs frequently require the use of complex input components, and this feature will allow them to use the custom component in the form that is best suited to their needs without relying on newer releases of UCC that support their component.
 
 ### Properties
 
 | Property          | Description |
 | ----------------- | ----------- |
-| globalConfig      | It is an hierarchical object having the properties and their values same as the globalConfig file. |
-| el                | The html element of the custom row. |
-| data              | This object has information about the value, mode of execution (create, edit, clone), service/tab name in which the custom component resides, etc. |
+| globalConfig       | It is a hierarchical object that contains the globalConfig file's properties and values. |
+| el                | The `el` is used to render a custom input element in a form. |
+| data              | The `data` object holds details regarding the execution mode (create, edit, clone), the value of a field, and the service name where this custom component is being rendered. |
 | setValue          | This method is used to set the value of the custom component. <p>setValue: ƒ (newValue)</p> |
-| util              | This is a utility object with various functions that can be used to manipulate the page UI. There are 4 methods associated : <ul><li>`clearAllErrorMsg`: ƒ (State)</li><li>`setErrorFieldMsg`: ƒ (field, msg)</li><li>`setErrorMsg`: ƒ (msg)</li><li>`setState`: ƒ setState(callback)</li></ul>|
+| util              | This is a utility object with various functions that can be used to manipulate the UI. <br>There are 4 methods associated : <ul><li>`clearAllErrorMsg`: ƒ (State)</li><li>`setErrorFieldMsg`: ƒ (field, msg)</li><li>`setErrorMsg`: ƒ (msg)</li><li>`setState`: ƒ setState(callback)</li></ul> |
 
 ### Methods
 
 | Property          | Description |
 | ----------------- | ----------- |
-| Render            | This method should contain the rendering logic for the custom component. This method is called when the create, edit or clone form is rendered. |
-| Validation        | This method should contain the validation logic for the value of the custom component. |
+| render            | `render` is a method which should have logic for the custom component, and it will be executed automatically when the create, edit, or clone actions performed. |
+| validation        | This method should contain the validation logic for the value of the custom component. |
+
+### Usage
+
+```
+{
+    "name": "account",
+    "table": {},
+    "entity": [
+        {
+            "type": "custom",
+            "label": "Example Custom Control",
+            "field": "custom_control_field",
+            "help": "This is an example multipleSelect for account entity",
+            "options":{
+                "src": "custom_control",
+                "type": "external"
+            },
+            "required": true
+        },
+        {
+            "type": "text",
+            "label": "Name",
+            "options": {
+                "placeholder": "Required"
+            },
+            "field": "name",
+            "help": "Enter a unique name for this account.",
+            "required": true
+        },
+    ]
+}
+```
 
 ### Example
 
@@ -41,11 +56,11 @@ class CustomControl {
     /**
      *
      * @constructor
-     * @param {Object} globalConfig - Global configuration.
+     * @param {object} globalConfig - Global configuration.
      * @param {element} el - The element of the custom row.
-     * @param {string} data - Service name.
-     * @param {object} util - the utility object
-     * @param {function} setValue - set value of the custom field
+     * @param {object} data - Mode, serviceName, and value.
+     * @param {object} util - The utility object.
+     * @param {function} setValue - set value of the custom field.
      */
     constructor(globalConfig, el, data, setValue, util) {
         this.globalConfig = globalConfig;
@@ -55,6 +70,15 @@ class CustomControl {
         this.setValue = setValue;
     }
 
+    _onSelectOptionChange() { }
+
+    validation(field, value) {
+        // Validation logic for value. Return the error message if failed.
+        if (value === 'input_two') {
+            return 'Wrong value selected.';
+        }
+    }
+
     render() {
         let content_html = `
             <select id="custom_control">
@@ -65,39 +89,18 @@ class CustomControl {
 
         this.el.innerHTML = content_html;
 
-        $('select#custom_control').on('change', () => this._onCheckBoxChange());
+        $('select#custom_control').on('change', () => this._onSelectOptionChange());
         return this;
     }
-
-    // This method is called when checkbox changed
-    _onCheckBoxChange() {
-        this._updateState();
-    }
-
-    _updateState() {
-        const btn = document.querySelector('#custom_control');
-        this.util.setState((prevState) => {
-            const data = { ...prevState.data };
-            data.custom_control_field.value = btn.value;
-            return { data };
-        });
-    }
-
-    validation(field, value) {
-        // Validation logic for value. Return the error message if failed.
-        if (value === 'input_two') {
-            return 'Wrong value selected.';
-        }
-    }
 }
 
 export default CustomControl;
 ```
 
+> Note: The Javascript file for the custom control should be saved in the custom folder at `appserver/static/js/build/custom/`.
+
 ### Output
 
-This is how custom control looks:
-![image](../images/Custom_Control_Output.png)
+This is how it looks like in the UI:
 
-Here's how custom validations look:
-![image](../images/Custom_Control_Validations.png)
+![image](../images/custom_ui_extensions/Custom_Control_Output.png)
diff --git a/docs/custom_ui_extensions/custom_hook.md b/docs/custom_ui_extensions/custom_hook.md
index f61686761..5c8bbec7c 100644
--- a/docs/custom_ui_extensions/custom_hook.md
+++ b/docs/custom_ui_extensions/custom_hook.md
@@ -4,35 +4,17 @@ Hook is nothing more than Javascript event handling on the events `onCreate`, `o
 
 Hooks can be used inside the services and tabs placed next to the entity tag. 
 
-The configuration and code for adding a hook to an entity are shown below. 
-
-```
-"hook": {
-  "src": "custom_hook",
-  "type": "external"
-}
-```
-The type key needs to be set as external to webpack the custom extensions. UCC  expects scripts marked as external to follow the ESM syntax for exporting and importing modules. Any other value or not specifying type will default to old requireJS (AMD) import syntax. Aditionally, the custom javascript file and the imported modules will not get webpack-ed.
-
-The custom_hook file's relative path to globalConfig file is `appserver/static/js/build/custom/custom_hook.js`
-
-### Usage
-
-Use hook in the services:
-![image](../images/Use_Hook_in_the_services.png)
-
-Use hook in the tabs:
-![image](../images/Use_Hook_in_the_tabs.png)
+The `type` key needs to be set as external to webpack the custom extensions. UCC  expects scripts marked as external to follow the ESM syntax for exporting and importing modules. Any other value or not specifying type will default to old requireJS (AMD) import syntax. Aditionally, the custom javascript file and the imported modules will not get webpack-ed.
 
 ### Properties
 
 | Property          | Description |
 | ----------------- | ----------- |
-| globalConfig      | It is an hierarchical object having the properties and their values same as the globalConfig file. |
+| globalConfig       | It is a hierarchical object that contains the globalConfig file's properties and values. |
 | serviceName       | The name of the service/tab specified in the globalConfig. |
-| state             | State is an object that represents the actual state value of the components in the service/tab when the hook's constructor is called. Updating this object will not update the state of the page. Use the `util.setState` method to update the page's state. |
+| state             | `state` is an object that represents the actual state value of the components in the service/tab when the hook's constructor is called. Updating this object will not update the state of the page. Use the `util.setState` method to update the page's state. The `state` object contains the actual state data along with the  `errorMsg` and `warningMsg` properties. |
 | mode              | There are three possible modes: Edit, Clone and Delete. Which are used in service/tab components. |
-| util              | This is a utility object with various functions that can be used to manipulate the page UI. There are 4 methods associated : <ul><li>`clearAllErrorMsg`: ƒ (State)</li><li>`setErrorFieldMsg`: ƒ (field, msg)</li><li>`setErrorMsg`: ƒ (msg)</li><li>`setState`: ƒ setState(callback)</li></ul>|
+| util              | This is a utility object with various functions that can be used to manipulate the page UI. <br>There are 4 methods associated : <ul><li>`clearAllErrorMsg`: ƒ (State)</li><li>`setErrorFieldMsg`: ƒ (field, msg)</li><li>`setErrorMsg`: ƒ (msg)</li><li>`setState`: ƒ setState(callback)</li></ul> |
 | groupName         | The name of the menu group from which the inputs service is called. This parameter should only be used with the multi-level menu feature. |
 
 ### Methods
@@ -41,15 +23,34 @@ We can use these methods to overirde existing methods according to the functiona
 
 | Property          | Description |
 | ----------------- | ----------- |
-| onCreate      | This method is called when we click on the "Add/Create" button for creating a new record on the page. |
-| debounce       | This method is used to create another special method which does not get executed on every call. This functionality can be useful when listening for an event. <p>For Example, we only want to show help text/error when the user has stopped typing for 500ms in a text-box and not on every key press.  In this scenario, the debounce method will induce a time wait every time a key is pressed and the method will only execute when there is no other call to it within that time wait.</p> |
-| onChange             | This method is called when the value of any field is changed. |
-| onRender              | This method is called once whenever the user clicks on a "Add", "Edit" or "Clone" button. |
-| onSave              | This method is called when the user clicks the "Save" button after creating, editing or cloning a record. |
-| onSaveSuccess              | This method is called when a record has been successfully saved. |
-| onSaveFail              | This method is called when a record fails to save due to any error. |
-| onEditLoad              | This method is called when the user clicks on a "Edit" button for an existing record. |
+| onCreate          | This method is called when we click on the "Add/Create" button for creating a new record on the page. |
+| debounce          | This method is used to create another special method which does not get executed on every call. This functionality can be useful when listening for an event. <p>For Example, we only want to show help text/error when the user has stopped typing for 500ms in a text-box and not on every key press.  In this scenario, the debounce method will induce a time wait every time a key is pressed and the method will only execute when there is no other call to it within that time wait.</p> |
+| onChange          | This method is called when the value of any field is changed. |
+| onRender          | This method is called once whenever the user clicks on a "Add", "Edit" or "Clone" button. |
+| onSave            | This method is called when the user clicks the "Save" button after creating, editing or cloning a record. |
+| onSaveSuccess     | This method is called when a record has been successfully saved. |
+| onSaveFail        | This method is called when a record fails to save due to any error. |
+| onEditLoad        | This method is called when the user clicks on a "Edit" button for an existing record. |
+
+### Usage
 
+```
+"inputs": {
+    "title": "Inputs",
+    "description": "Manage your data inputs",
+    "services": [
+        {
+            "name": "example_input_one",
+            "title": "Example Input One",
+            "hook": {
+                "src": "input_hook",
+                "type": "external"
+            },
+            "entity": []
+        }
+    ]
+}
+```
 
 ### Example
 
@@ -186,3 +187,5 @@ class Hook {
 
 export default Hook;
 ```
+
+> Note: The Javascript file for the custom control should be saved in the custom folder at `appserver/static/js/build/custom/`.
diff --git a/docs/custom_ui_extensions/custom_menu.md b/docs/custom_ui_extensions/custom_menu.md
index 777303973..3f3e6dfa3 100644
--- a/docs/custom_ui_extensions/custom_menu.md
+++ b/docs/custom_ui_extensions/custom_menu.md
@@ -1,34 +1,40 @@
-Custom Menu can be created when there is more than one input is present in the input page.
+Custom Menu can be created when there is more than one input present on the inputs page. 
 
-In addition to the multiple inputs, we can use this menu to create a custom component at the top right corner of the Input page.
-
-Here is how you specify a custom menu:
-```
-"menu": {
-  "src": "custom_menu",
-  "type": "external"
-}
-```
-The custom_menu file's relative path to globalConfig file is `appserver/static/js/build/custom/custom_menu.js`
-
-### Usage
+> This feature is deprecated (will be removed in the next major version) as [`Multilevel Menu`](https://splunk.github.io/addonfactory-ucc-generator/tabs/#multi-level-menu) is now ready to use if more than one input is available.
 
-Use Custom Menu in the configuration table:
-![image](../images/Custom_Menu_GlobalConfig.png)
+In addition to the multiple inputs, we can use this menu to create a custom component at the top right corner of the Input page.
 
 ### Properties
 
 | Property          | Description |
 | ----------------- | ----------- |
-| globalConfig      | It is an hierarchical object having the properties and their values same as the globalConfig file. |
-| el                | The html element of the custom row. |
+| globalConfig       | It is a hierarchical object that contains the globalConfig file's properties and values. |
+| el                | The `el` is used to render a custom element (on the top right corner) on the Inputs page. |
 | setValue          | This method is used to set the value of the custom component. <p>setValue: ƒ (newValue)</p> |
 
 ### Methods
 
 | Property          | Description |
 | ----------------- | ----------- |
-| Render            | This method should contain the rendering logic for the custom component. |
+| render            | `render` is a method which should have logic for the custom menu, and it will be executed automatically when inputs page is rendered. |
+
+### Usage
+```
+"inputs": {
+    "title": "Inputs",
+    "description": "Manage your data inputs",
+    "services": [],
+    "table": {
+        "actions": ["edit", "enable", "delete", "clone"],
+        "header": [],
+        "moreInfo": []
+    },
+    "menu": {
+        "src": "custom_menu",
+        "type": "external"
+    }
+}
+```
 
 ### Example
 
@@ -40,7 +46,7 @@ class CustomMenu {
     * @constructor
     * @param {Object} globalConfig - Global configuration.
     * @param {element} el - The element of the custom menu.
-    * @param {function} setValue - set value of the custom field
+    * @param {function} setValue - set value of the custom field.
     */
     constructor(globalConfig, el, setValue) {
         this.globalConfig = globalConfig;
@@ -61,7 +67,10 @@ class CustomMenu {
 export default CustomMenu;
 ```
 
+> Note: The Javascript file for the custom control should be saved in the custom folder at `appserver/static/js/build/custom/`.
+
 ### Output
 
-This is how custom menu looks:
-![image](../images/Custom_Menu_Output.png)
+This is how it looks like in the UI:
+
+![image](../images/custom_ui_extensions/Custom_Menu_Output.png)
diff --git a/docs/custom_ui_extensions/custom_row.md b/docs/custom_ui_extensions/custom_row.md
index 54da367de..edd0535ec 100644
--- a/docs/custom_ui_extensions/custom_row.md
+++ b/docs/custom_ui_extensions/custom_row.md
@@ -1,26 +1,11 @@
-When clicking on the left side icon provided in each row, the input specific details are displayed.
-To update the existing details, we can use the Custom Row feature.
-
-Here is how you specify a custom row hook:
-```
-"customRow": {
-  "src": "custom_row",
-  "type": "external"
-}
-```
-The custom_row file's relative path to globalConfig file is `appserver/static/js/build/custom/custom_row.js`
-
-### Usage
-
-Use Custom Row in the inputs table:
-![image](../images/Custom_Row_GlobalConfig.png)
+When a row is expanded on the Inputs table, Custom Row is utilized to incorporate a customized element. By clicking on the icon provided on the left side of each row, the input-specific details are displayed.
 
 ### Properties
 
 | Property          | Description |
 | ----------------- | ----------- |
-| globalConfig      | It is an hierarchical object having the properties and their values same as the globalConfig file. |
-| el                | The html element of the custom cell. |
+| globalConfig       | It is a hierarchical object that contains the globalConfig file's properties and values. |
+| el                | The `el` is used to render a customized element on the Inputs table when a row is expanded. |
 | serviceName       | The name of the service/tab specified in the globalConfig file. |
 | row               | The object of the record for which the CustomRowInput constructor is called. |
 
@@ -28,7 +13,26 @@ Use Custom Row in the inputs table:
 
 | Property          | Description |
 | ----------------- | ----------- |
-| Render            | This method should contain the rendering logic for the custom component. This method is called when the create, edit or clone form is rendered. |
+| render            | `render` is a method which should have logic for the custom row component, and it will be executed automatically when the create, edit, or clone actions performed. |
+
+### Usage
+
+```
+"inputs": {
+    "title": "Inputs",
+    "description": "Manage your data inputs",
+    "services": [],
+    "table": {
+        "actions": ["edit", "enable", "delete", "clone"],
+        "header": [],
+        "customRow": {
+            "src": "custom_input_row",
+            "type": "external"
+        }
+    }
+}
+```
+
 
 ### Example
 
@@ -59,7 +63,10 @@ class CustomInputRow {
 export default CustomInputRow;
 ```
 
+> Note: The Javascript file for the custom control should be saved in the custom folder at `appserver/static/js/build/custom/`.
+
 ### Output
 
-This is how custom row looks:
-![image](../images/Custom_Row_Output.png)
+This is how it looks like in the UI:
+
+![image](../images/custom_ui_extensions/Custom_Row_Output.png)
diff --git a/docs/custom_ui_extensions/custom_tab.md b/docs/custom_ui_extensions/custom_tab.md
index d89536490..589c2a1dd 100644
--- a/docs/custom_ui_extensions/custom_tab.md
+++ b/docs/custom_ui_extensions/custom_tab.md
@@ -1,8 +1,20 @@
-Custom Tab feature can be used to render any customized UI component in the TA. With this feature, the developer can design and render any complex input with ease. This is an advanced feature and can be leveraged with limitless functionalities. Modern TAs are receiving complex use cases and this feature will allow them to design the UI perfectly for their case without having to depend on the newer releases of UCC supporting their component.
+Custom Tab feature can be used to render any customized UI component in the Configuration tabs. With this feature, the developer can design and render any complex input with ease. This is an advanced feature and can be leveraged with limitless functionalities. Modern TAs are receiving complex use cases and this feature will allow them to design the UI perfectly for their case without having to depend on the newer releases of UCC supporting their component.
+
+### Properties
+
+| Property | Description                                                                                        |
+| -------- | -------------------------------------------------------------------------------------------------- |
+| tab      | It is an object with the properties and values of a custom tab object from the global config file. |
+| el       | The `el` is used to render a customized component on the Configuration tabs. |
+
+### Methods
+
+| Property | Description                                                              |
+| -------- | ------------------------------------------------------------------------ |
+| render   | `render` is a method which should have logic for the custom component, and it will be executed automatically when configuration page is rendered. |
 
 ### Usage
 
-Use Custom Tab in the Configuration page:
 ```
 "configuration": {
     "title": "Configuration",
@@ -36,19 +48,6 @@ Use Custom Tab in the Configuration page:
 }
 ```
 
-### Properties
-
-| Property | Description                                                                                        |
-| -------- | -------------------------------------------------------------------------------------------------- |
-| tab      | It is an object with the properties and values of a custom tab object from the global config file. |
-| el       | The html element of the custom tab.                                                                |
-
-### Methods
-
-| Property | Description                                                              |
-| -------- | ------------------------------------------------------------------------ |
-| Render   | This method should contain the rendering logic for the custom component. |
-
 ### Example
 
 ```
@@ -57,7 +56,7 @@ class CustomTab {
     /**
     * Custom Tab
     * @constructor
-    * @param {Object} tab - tab details.
+    * @param {Object} tab - Tab details.
     * @param {element} el - The element of the custom menu.
     */
     constructor(tab, el) {
@@ -76,5 +75,6 @@ export default CustomTab;
 
 ### Output
 
-This is how Custom Tab looks:
-![image](../images/Custom_Tab_Output.png)
+This is how it looks like in the UI:
+
+![image](../images/custom_ui_extensions/Custom_Tab_Output.png)
diff --git a/docs/dot_conf_files.md b/docs/dot_conf_files.md
new file mode 100644
index 000000000..0cf3397a5
--- /dev/null
+++ b/docs/dot_conf_files.md
@@ -0,0 +1,45 @@
+# .conf files
+
+`ucc-gen` generates the following `.conf` files in the `default` directory.
+If any of the `.conf` file is present in the source directory, `ucc-gen` will
+just copy the file to the output folder. The only exception is `app.conf` file.
+
+> Note: for most of the use cases, generated configuration is sufficient, if you
+> need to adjust the file which being generated, please ping us for a feature 
+> request or create a file in the `default` location, so it will be taken 
+> instead of being generated. 
+
+## `app.conf`
+
+`ucc-gen` will merge the file present in the `default` folder with some 
+additional information generated during the build time. But if you don't need 
+anything specific, you don't need to have `app.conf` in the source folder. 
+
+It uses `app.manifest` file to determine add-on description, add-on name, add-on
+title and add-on author (taking first one if multiple defined). Make sure that
+your `app.manifest` is up-to-date, so `app.conf` will have relevant information
+as well.
+
+Also, `triggers` stanza will be created by `ucc-gen`, it will determine what 
+are the `.conf` files used in the add-on and generates the relevant key-value 
+pairs.
+
+## `inputs.conf`
+
+`ucc-gen` will generate a stanza for every input defined in the `globalConfig` 
+file and set `python.version` to `python3`.
+
+## `server.conf`
+
+`ucc-gen` will generate `shclustering` stanza, it will determine what are the 
+`.conf` files used in the add-on and generates the relevant key-value pairs.
+
+## `web.conf`
+ 
+`ucc-gen` will generate all needed information about the endpoints being exposed
+from the add-on.
+
+## `restmap.conf`
+
+`ucc-gen` will generate all needed information about the configuration of every
+endpoint.
diff --git a/docs/images/Custom_Cell_GlobalConfig.png b/docs/images/Custom_Cell_GlobalConfig.png
deleted file mode 100644
index a8b735b3f..000000000
Binary files a/docs/images/Custom_Cell_GlobalConfig.png and /dev/null differ
diff --git a/docs/images/Custom_Cell_Output.png b/docs/images/Custom_Cell_Output.png
deleted file mode 100644
index 3abd9bf58..000000000
Binary files a/docs/images/Custom_Cell_Output.png and /dev/null differ
diff --git a/docs/images/Custom_Control_GlobalConfig.png b/docs/images/Custom_Control_GlobalConfig.png
deleted file mode 100644
index 5c7ce5dcb..000000000
Binary files a/docs/images/Custom_Control_GlobalConfig.png and /dev/null differ
diff --git a/docs/images/Custom_Control_Output.png b/docs/images/Custom_Control_Output.png
deleted file mode 100644
index 3434f4194..000000000
Binary files a/docs/images/Custom_Control_Output.png and /dev/null differ
diff --git a/docs/images/Custom_Control_Validations.png b/docs/images/Custom_Control_Validations.png
deleted file mode 100644
index cf253ead5..000000000
Binary files a/docs/images/Custom_Control_Validations.png and /dev/null differ
diff --git a/docs/images/Custom_Menu_GlobalConfig.png b/docs/images/Custom_Menu_GlobalConfig.png
deleted file mode 100644
index 75534237b..000000000
Binary files a/docs/images/Custom_Menu_GlobalConfig.png and /dev/null differ
diff --git a/docs/images/Custom_Menu_Output.png b/docs/images/Custom_Menu_Output.png
deleted file mode 100644
index 86b33856d..000000000
Binary files a/docs/images/Custom_Menu_Output.png and /dev/null differ
diff --git a/docs/images/Custom_Row_GlobalConfig.png b/docs/images/Custom_Row_GlobalConfig.png
deleted file mode 100644
index f120b1e31..000000000
Binary files a/docs/images/Custom_Row_GlobalConfig.png and /dev/null differ
diff --git a/docs/images/Custom_Row_Output.png b/docs/images/Custom_Row_Output.png
deleted file mode 100644
index 8713d73ac..000000000
Binary files a/docs/images/Custom_Row_Output.png and /dev/null differ
diff --git a/docs/images/Groups_Feature.png b/docs/images/Groups_Feature.png
new file mode 100644
index 000000000..849976667
Binary files /dev/null and b/docs/images/Groups_Feature.png differ
diff --git a/docs/images/Use_Hook_in_the_services.png b/docs/images/Use_Hook_in_the_services.png
deleted file mode 100644
index bdb47e50d..000000000
Binary files a/docs/images/Use_Hook_in_the_services.png and /dev/null differ
diff --git a/docs/images/Use_Hook_in_the_tabs.png b/docs/images/Use_Hook_in_the_tabs.png
deleted file mode 100644
index 3aa9042cd..000000000
Binary files a/docs/images/Use_Hook_in_the_tabs.png and /dev/null differ
diff --git a/docs/images/custom_ui_extensions/Custom_Cell_Output.png b/docs/images/custom_ui_extensions/Custom_Cell_Output.png
new file mode 100644
index 000000000..79d7e1ab0
Binary files /dev/null and b/docs/images/custom_ui_extensions/Custom_Cell_Output.png differ
diff --git a/docs/images/custom_ui_extensions/Custom_Control_Output.png b/docs/images/custom_ui_extensions/Custom_Control_Output.png
new file mode 100644
index 000000000..06c97d73a
Binary files /dev/null and b/docs/images/custom_ui_extensions/Custom_Control_Output.png differ
diff --git a/docs/images/Custom_Mapping_GlobalConfig.png b/docs/images/custom_ui_extensions/Custom_Mapping_GlobalConfig.png
similarity index 100%
rename from docs/images/Custom_Mapping_GlobalConfig.png
rename to docs/images/custom_ui_extensions/Custom_Mapping_GlobalConfig.png
diff --git a/docs/images/custom_ui_extensions/Custom_Menu_Output.png b/docs/images/custom_ui_extensions/Custom_Menu_Output.png
new file mode 100644
index 000000000..642c5826d
Binary files /dev/null and b/docs/images/custom_ui_extensions/Custom_Menu_Output.png differ
diff --git a/docs/images/custom_ui_extensions/Custom_Row_Output.png b/docs/images/custom_ui_extensions/Custom_Row_Output.png
new file mode 100644
index 000000000..c2a08c38a
Binary files /dev/null and b/docs/images/custom_ui_extensions/Custom_Row_Output.png differ
diff --git a/docs/images/Custom_Tab_Output.png b/docs/images/custom_ui_extensions/Custom_Tab_Output.png
similarity index 100%
rename from docs/images/Custom_Tab_Output.png
rename to docs/images/custom_ui_extensions/Custom_Tab_Output.png
diff --git a/docs/index.md b/docs/index.md
index 9d794c06e..6bcc9bf91 100644
--- a/docs/index.md
+++ b/docs/index.md
@@ -28,9 +28,7 @@ which is a new UI framework based on React.
 * Generate UI (`appserver` folder)
 * Generate Python REST handlers to support UI CRUD operations (`bin` folder)
 * Generate OpenAPI description document (`static/openapi.json` file)
-* Generate UI-related `.conf` files (`web.conf`, `restmap.conf`)
-* Generate `README` folder (with `.conf.spec` files)
-* Generate other `.conf` files (`inputs.conf`)
+* Generate `.conf` files (more info [here](dot_conf_files.md))
 * Install Python requirements (`lib` folder)
 * Generate metadata files (`metadata` folder)
 * Possibility to extend UI with custom code
diff --git a/docs/openapi.md b/docs/openapi.md
index 21b0b6f81..65791685e 100644
--- a/docs/openapi.md
+++ b/docs/openapi.md
@@ -1,9 +1,7 @@
 # OpenAPI description document
 
-`ucc-gen` command is executed with `--openapi` argument enabled by default.
-There have to be defined valid `globalConfi.json` and `app.manifest` to have OpenAPI description document (`static/openapi.json` file) generated.
-
-To disable OpenAPI functionality for `ucc-gen` run, call it with `--openapi=0` argument.
+OpenAPI description document is generated with `ucc-gen` command. 
+There has to be defined valid `globalConfi.json` and `app.manifest` to have the document (`static/openapi.json` file) generated.
 
 ## How to find the document?
 
diff --git a/example/globalConfig.json b/example/globalConfig.json
index ce40f2fdd..af1d40a44 100644
--- a/example/globalConfig.json
+++ b/example/globalConfig.json
@@ -161,7 +161,7 @@
     "meta": {
         "name": "Splunk_TA_dummy_data",
         "restRoot": "Splunk_TA_dummy_data",
-        "version": "5.20.0R9f9c8fed",
+        "version": "5.21.0R3e77121c",
         "displayName": "Splunk_TA_dummy_data",
         "schemaVersion": "0.0.3"
     }
diff --git a/example/package/app.manifest b/example/package/app.manifest
index 2bd19d56a..71becf049 100644
--- a/example/package/app.manifest
+++ b/example/package/app.manifest
@@ -5,8 +5,8 @@
         "author": [
             {
                 "company": null,
-                "email": null,
-                "name": ""
+                "email": "addonfactory@splunk.com",
+                "name": "Splunk Inc."
             }
         ],
         "classification": {
diff --git a/get-ucc-ui.sh b/get-ucc-ui.sh
index baad72ea7..a4a949dc8 100755
--- a/get-ucc-ui.sh
+++ b/get-ucc-ui.sh
@@ -13,4 +13,4 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 #
-wget https://github.com/splunk/addonfactory-ucc-base-ui/releases/download/v1.22.0/splunk-ucc-ui.tgz
+wget https://github.com/splunk/addonfactory-ucc-base-ui/releases/download/v1.23.1/splunk-ucc-ui.tgz
diff --git a/mkdocs.yml b/mkdocs.yml
index 3fcf56383..1943ee315 100644
--- a/mkdocs.yml
+++ b/mkdocs.yml
@@ -24,6 +24,7 @@ theme:
 nav:
   - Home: "index.md"
   - Quickstart: "quickstart.md"
+  - ".conf files": "dot_conf_files.md"
   - Example: "example.md"
   - Components: "components.md"
   - Tabs: "tabs.md"
@@ -42,5 +43,6 @@ nav:
     - Dependent Dropdown: "advanced/dependent_dropdown.md"
     - OAuth Support: "advanced/oAuth_support.md"
     - Custom REST Handler: "advanced/custom_rest_handler.md"
+    - Groups Feature: "advanced/groups_feature.md"
   - Troubleshooting: "troubleshooting.md"
   - Contributing: "contributing.md"
diff --git a/poetry.lock b/poetry.lock
index 45d7d33fb..bd031ebbc 100644
--- a/poetry.lock
+++ b/poetry.lock
@@ -18,14 +18,6 @@ python-versions = ">=3.6"
 python-dateutil = ">=2.7.0"
 typing-extensions = {version = "*", markers = "python_version < \"3.8\""}
 
-[[package]]
-name = "atomicwrites"
-version = "1.4.1"
-description = "Atomic file writes."
-category = "dev"
-optional = false
-python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
-
 [[package]]
 name = "attrs"
 version = "22.2.0"
@@ -37,10 +29,10 @@ python-versions = ">=3.6"
 [package.extras]
 cov = ["attrs", "coverage-enable-subprocess", "coverage[toml] (>=5.3)"]
 dev = ["attrs"]
-docs = ["furo", "sphinx", "myst-parser", "zope.interface", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier"]
+docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope.interface"]
 tests = ["attrs", "zope.interface"]
-tests-no-zope = ["hypothesis", "pympler", "pytest (>=4.3.0)", "pytest-xdist", "cloudpickle", "mypy (>=0.971,<0.990)", "pytest-mypy-plugins"]
-tests_no_zope = ["hypothesis", "pympler", "pytest (>=4.3.0)", "pytest-xdist", "cloudpickle", "mypy (>=0.971,<0.990)", "pytest-mypy-plugins"]
+tests-no-zope = ["cloudpickle", "hypothesis", "mypy (>=0.971,<0.990)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist"]
+tests_no_zope = ["cloudpickle", "hypothesis", "mypy (>=0.971,<0.990)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist"]
 
 [[package]]
 name = "binaryornot"
@@ -151,7 +143,18 @@ optional = false
 python-versions = ">=3.7"
 
 [package.extras]
-dev = ["tox", "coverage", "lxml", "xmlschema (>=1.9.0)", "sphinx", "memory-profiler", "flake8", "mypy (==0.950)"]
+dev = ["coverage", "flake8", "lxml", "memory-profiler", "mypy (==0.950)", "sphinx", "tox", "xmlschema (>=1.9.0)"]
+
+[[package]]
+name = "exceptiongroup"
+version = "1.1.0"
+description = "Backport of PEP 654 (exception groups)"
+category = "dev"
+optional = false
+python-versions = ">=3.7"
+
+[package.extras]
+test = ["pytest (>=6)"]
 
 [[package]]
 name = "execnet"
@@ -185,8 +188,8 @@ optional = false
 python-versions = ">=3.7"
 
 [package.extras]
-docs = ["furo (>=2022.12.7)", "sphinx-autodoc-typehints (>=1.19.5)", "sphinx (>=5.3)"]
-testing = ["covdefaults (>=2.2.2)", "coverage (>=7.0.1)", "pytest-cov (>=4)", "pytest-timeout (>=2.1)", "pytest (>=7.2)"]
+docs = ["furo (>=2022.12.7)", "sphinx (>=5.3)", "sphinx-autodoc-typehints (>=1.19.5)"]
+testing = ["covdefaults (>=2.2.2)", "coverage (>=7.0.1)", "pytest (>=7.2)", "pytest-cov (>=4)", "pytest-timeout (>=2.1)"]
 
 [[package]]
 name = "future"
@@ -200,7 +203,7 @@ python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*"
 name = "ghp-import"
 version = "2.1.0"
 description = "Copy your docs directly to the gh-pages branch."
-category = "dev"
+category = "main"
 optional = false
 python-versions = "*"
 
@@ -208,11 +211,11 @@ python-versions = "*"
 python-dateutil = ">=2.8.1"
 
 [package.extras]
-dev = ["twine", "markdown", "flake8", "wheel"]
+dev = ["flake8", "markdown", "twine", "wheel"]
 
 [[package]]
 name = "httplib2"
-version = "0.20.4"
+version = "0.21.0"
 description = "A comprehensive HTTP client library."
 category = "dev"
 optional = false
@@ -242,9 +245,9 @@ typing-extensions = {version = ">=3.6.4", markers = "python_version < \"3.8\""}
 zipp = ">=0.5"
 
 [package.extras]
-docs = ["sphinx (>=3.5)", "jaraco.packaging (>=9)", "rst.linker (>=1.9)", "furo", "sphinx-lint", "jaraco.tidelift (>=1.4)"]
+docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"]
 perf = ["ipython"]
-testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "flake8 (<5)", "pytest-cov", "pytest-enabler (>=1.3)", "packaging", "pyfakefs", "flufl.flake8", "pytest-perf (>=0.9.2)", "pytest-black (>=0.3.7)", "pytest-mypy (>=0.9.1)", "pytest-flake8", "importlib-resources (>=1.3)"]
+testing = ["flake8 (<5)", "flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)"]
 
 [[package]]
 name = "importlib-resources"
@@ -258,8 +261,8 @@ python-versions = ">=3.7"
 zipp = {version = ">=3.1.0", markers = "python_version < \"3.10\""}
 
 [package.extras]
-docs = ["sphinx (>=3.5)", "jaraco.packaging (>=9)", "rst.linker (>=1.9)", "furo", "sphinx-lint", "jaraco.tidelift (>=1.4)"]
-testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "flake8 (<5)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-black (>=0.3.7)", "pytest-mypy (>=0.9.1)", "pytest-flake8"]
+docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"]
+testing = ["flake8 (<5)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"]
 
 [[package]]
 name = "iniconfig"
@@ -344,7 +347,7 @@ source = ["Cython (>=0.29.7)"]
 name = "markdown"
 version = "3.3.7"
 description = "Python implementation of Markdown."
-category = "dev"
+category = "main"
 optional = false
 python-versions = ">=3.6"
 
@@ -366,7 +369,7 @@ python-versions = ">=3.7"
 name = "mergedeep"
 version = "1.3.4"
 description = "A deep merge function for 🐍."
-category = "dev"
+category = "main"
 optional = false
 python-versions = ">=3.6"
 
@@ -374,7 +377,7 @@ python-versions = ">=3.6"
 name = "mkdocs"
 version = "1.4.2"
 description = "Project documentation with Markdown."
-category = "dev"
+category = "main"
 optional = false
 python-versions = ">=3.7"
 
@@ -394,30 +397,32 @@ watchdog = ">=2.0"
 
 [package.extras]
 i18n = ["babel (>=2.9.0)"]
-min-versions = ["babel (==2.9.0)", "click (==7.0)", "colorama (==0.4)", "ghp-import (==1.0)", "importlib-metadata (==4.3)", "jinja2 (==2.11.1)", "markdown (==3.2.1)", "markupsafe (==2.0.1)", "mergedeep (==1.3.4)", "packaging (==20.5)", "pyyaml-env-tag (==0.1)", "pyyaml (==5.1)", "typing-extensions (==3.10)", "watchdog (==2.0)"]
+min-versions = ["babel (==2.9.0)", "click (==7.0)", "colorama (==0.4)", "ghp-import (==1.0)", "importlib-metadata (==4.3)", "jinja2 (==2.11.1)", "markdown (==3.2.1)", "markupsafe (==2.0.1)", "mergedeep (==1.3.4)", "packaging (==20.5)", "pyyaml (==5.1)", "pyyaml-env-tag (==0.1)", "typing-extensions (==3.10)", "watchdog (==2.0)"]
 
 [[package]]
 name = "mkdocs-material"
-version = "8.5.11"
+version = "9.0.15"
 description = "Documentation that simply works"
-category = "dev"
+category = "main"
 optional = false
 python-versions = ">=3.7"
 
 [package.dependencies]
-jinja2 = ">=3.0.2"
+colorama = ">=0.4"
+jinja2 = ">=3.0"
 markdown = ">=3.2"
-mkdocs = ">=1.4.0"
+mkdocs = ">=1.4.2"
 mkdocs-material-extensions = ">=1.1"
-pygments = ">=2.12"
-pymdown-extensions = ">=9.4"
+pygments = ">=2.14"
+pymdown-extensions = ">=9.9.1"
+regex = ">=2022.4.24"
 requests = ">=2.26"
 
 [[package]]
 name = "mkdocs-material-extensions"
 version = "1.1.1"
 description = "Extension pack for Python Markdown and MkDocs Material."
-category = "dev"
+category = "main"
 optional = false
 python-versions = ">=3.7"
 
@@ -490,7 +495,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
 name = "pygments"
 version = "2.14.0"
 description = "Pygments is a syntax highlighting package written in Python."
-category = "dev"
+category = "main"
 optional = false
 python-versions = ">=3.6"
 
@@ -501,7 +506,7 @@ plugins = ["importlib-metadata"]
 name = "pymdown-extensions"
 version = "9.9.2"
 description = "Extension pack for Python Markdown."
-category = "dev"
+category = "main"
 optional = false
 python-versions = ">=3.7"
 
@@ -517,7 +522,7 @@ optional = false
 python-versions = ">=3.6.8"
 
 [package.extras]
-diagrams = ["railroad-diagrams", "jinja2"]
+diagrams = ["jinja2", "railroad-diagrams"]
 
 [[package]]
 name = "pyrsistent"
@@ -529,25 +534,24 @@ python-versions = ">=3.7"
 
 [[package]]
 name = "pytest"
-version = "6.2.5"
+version = "7.2.1"
 description = "pytest: simple powerful testing with Python"
 category = "dev"
 optional = false
-python-versions = ">=3.6"
+python-versions = ">=3.7"
 
 [package.dependencies]
-atomicwrites = {version = ">=1.0", markers = "sys_platform == \"win32\""}
 attrs = ">=19.2.0"
 colorama = {version = "*", markers = "sys_platform == \"win32\""}
+exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""}
 importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""}
 iniconfig = "*"
 packaging = "*"
 pluggy = ">=0.12,<2.0"
-py = ">=1.8.2"
-toml = "*"
+tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""}
 
 [package.extras]
-testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", "xmlschema"]
+testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "xmlschema"]
 
 [[package]]
 name = "pytest-html"
@@ -584,9 +588,22 @@ python-versions = "*"
 [package.dependencies]
 pytest = "*"
 
+[[package]]
+name = "pytest-rerunfailures"
+version = "11.1.1"
+description = "pytest plugin to re-run tests to eliminate flaky failures"
+category = "dev"
+optional = false
+python-versions = ">=3.7"
+
+[package.dependencies]
+importlib-metadata = {version = ">=1", markers = "python_version < \"3.8\""}
+packaging = ">=17.1"
+pytest = ">=5.3"
+
 [[package]]
 name = "pytest-splunk-addon"
-version = "4.1.2"
+version = "5.0.0"
 description = "A Dynamic test tool for Splunk Apps and Add-ons"
 category = "dev"
 optional = false
@@ -597,7 +614,6 @@ addonfactory-splunk-conf-parser-lib = ">=0.3.3,<0.4.0"
 defusedxml = ">=0.7.1,<0.8.0"
 Faker = ">=13.12.0,<14.0.0"
 filelock = ">=3.0,<4.0"
-httplib2 = "<=0.20.4"
 jsonschema = ">=4.2.1,<5.0.0"
 junitparser = ">=2.2.0,<3.0.0"
 pytest = ">5.4.0,<7.3"
@@ -605,6 +621,7 @@ pytest-ordering = ">=0.6,<0.7"
 pytest-xdist = ">=2.3.0"
 requests = ">=2,<3"
 splunk-sdk = ">=1.6,<2.0"
+splunksplwrapper = ">=1.0.1,<2.0.0"
 xmlschema = ">=1.11.3,<2.0.0"
 xmltodict = ">=0.13.0,<0.14.0"
 
@@ -613,7 +630,7 @@ docker = ["lovely-pytest-docker (>=0,<1)"]
 
 [[package]]
 name = "pytest-splunk-addon-ui-smartx"
-version = "2.3.0"
+version = "2.3.3b1"
 description = "Library to support testing Splunk Add-on UX"
 category = "dev"
 optional = false
@@ -621,17 +638,17 @@ python-versions = ">=3.7,<4.0"
 
 [package.dependencies]
 cssselect = "*"
-future = ">=0.18,<0.19"
 lxml = ">=4.8.0,<5.0.0"
 msedge-selenium-tools = "*"
 pytest-html = "*"
+pytest-splunk-addon = ">=5.0.0,<6.0.0"
 selenium = "*"
 urllib3 = ">=1.21.1,<2.0.0"
 webdriver-manager = "*"
 
 [[package]]
 name = "pytest-xdist"
-version = "3.1.0"
+version = "3.2.0"
 description = "pytest xdist plugin for distributed testing, most importantly across multiple CPUs"
 category = "dev"
 optional = false
@@ -694,13 +711,21 @@ python-versions = ">=3.6"
 name = "pyyaml-env-tag"
 version = "0.1"
 description = "A custom YAML tag for referencing environment variables in YAML files. "
-category = "dev"
+category = "main"
 optional = false
 python-versions = ">=3.6"
 
 [package.dependencies]
 pyyaml = "*"
 
+[[package]]
+name = "regex"
+version = "2022.10.31"
+description = "Alternative regular expression module, to replace re."
+category = "main"
+optional = false
+python-versions = ">=3.6"
+
 [[package]]
 name = "requests"
 version = "2.28.2"
@@ -740,12 +765,25 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*"
 
 [[package]]
 name = "splunk-sdk"
-version = "1.7.2"
+version = "1.7.3"
 description = "The Splunk Software Development Kit for Python."
 category = "dev"
 optional = false
 python-versions = "*"
 
+[[package]]
+name = "splunksplwrapper"
+version = "1.0.1"
+description = "Package to interact with Splunk"
+category = "dev"
+optional = false
+python-versions = ">=3.7,<4.0"
+
+[package.dependencies]
+defusedxml = ">=0.7.1,<0.8.0"
+httplib2 = ">=0.21.0,<0.22.0"
+splunk-sdk = ">=1.6.18,<2.0.0"
+
 [[package]]
 name = "text-unidecode"
 version = "1.3"
@@ -755,20 +793,20 @@ optional = false
 python-versions = "*"
 
 [[package]]
-name = "toml"
-version = "0.10.2"
-description = "Python Library for Tom's Obvious, Minimal Language"
+name = "tomli"
+version = "2.0.1"
+description = "A lil' TOML parser"
 category = "dev"
 optional = false
-python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*"
+python-versions = ">=3.7"
 
 [[package]]
 name = "tqdm"
-version = "4.64.1"
+version = "4.65.0"
 description = "Fast, Extensible Progress Meter"
 category = "dev"
 optional = false
-python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7"
+python-versions = ">=3.7"
 
 [package.dependencies]
 colorama = {version = "*", markers = "platform_system == \"Windows\""}
@@ -796,15 +834,15 @@ optional = false
 python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*"
 
 [package.extras]
-brotli = ["brotlicffi (>=0.8.0)", "brotli (>=1.0.9)", "brotlipy (>=0.6.0)"]
-secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "urllib3-secure-extra", "ipaddress"]
+brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)", "brotlipy (>=0.6.0)"]
+secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress", "pyOpenSSL (>=0.14)", "urllib3-secure-extra"]
 socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"]
 
 [[package]]
 name = "watchdog"
 version = "2.2.1"
 description = "Filesystem events monitoring"
-category = "dev"
+category = "main"
 optional = false
 python-versions = ">=3.6"
 
@@ -838,8 +876,8 @@ elementpath = ">=2.5.0,<3.0.0"
 
 [package.extras]
 codegen = ["elementpath (>=2.5.0,<3.0.0)", "jinja2"]
-dev = ["tox", "coverage", "lxml", "elementpath (>=2.5.0,<3.0.0)", "memory-profiler", "sphinx", "sphinx-rtd-theme", "jinja2", "flake8", "mypy", "lxml-stubs"]
-docs = ["elementpath (>=2.5.0,<3.0.0)", "sphinx", "sphinx-rtd-theme", "jinja2"]
+dev = ["coverage", "elementpath (>=2.5.0,<3.0.0)", "flake8", "jinja2", "lxml", "lxml-stubs", "memory-profiler", "mypy", "sphinx", "sphinx-rtd-theme", "tox"]
+docs = ["elementpath (>=2.5.0,<3.0.0)", "jinja2", "sphinx", "sphinx-rtd-theme"]
 
 [[package]]
 name = "xmltodict"
@@ -858,84 +896,693 @@ optional = false
 python-versions = ">=3.7"
 
 [package.extras]
-docs = ["sphinx (>=3.5)", "jaraco.packaging (>=9)", "rst.linker (>=1.9)", "furo", "sphinx-lint", "jaraco.tidelift (>=1.4)"]
-testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "flake8 (<5)", "pytest-cov", "pytest-enabler (>=1.3)", "jaraco.itertools", "func-timeout", "jaraco.functools", "more-itertools", "pytest-black (>=0.3.7)", "pytest-mypy (>=0.9.1)", "pytest-flake8"]
+docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"]
+testing = ["flake8 (<5)", "func-timeout", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"]
 
 [metadata]
 lock-version = "1.1"
 python-versions = "^3.7"
-content-hash = "1fee094eecd9f6f4671f90454f16933bfc0afd2923a26e400aa819bcc95ba78f"
+content-hash = "9c29a66f497650e18428e4929c2369022334891ea0f90b3e8df82b2f9927de24"
 
 [metadata.files]
-addonfactory-splunk-conf-parser-lib = []
-arrow = []
-atomicwrites = []
-attrs = []
-binaryornot = []
-certifi = []
-chardet = []
-charset-normalizer = []
-click = []
-colorama = []
-cookiecutter = []
-cssselect = []
-defusedxml = []
-dunamai = []
-elementpath = []
-execnet = []
-faker = []
-filelock = []
-future = []
-ghp-import = []
-httplib2 = []
-idna = []
-importlib-metadata = []
-importlib-resources = []
-iniconfig = []
-jinja2 = []
-jinja2-time = []
-jsonschema = []
-junitparser = []
-lxml = []
-markdown = []
-markupsafe = []
-mergedeep = []
-mkdocs = []
-mkdocs-material = []
-mkdocs-material-extensions = []
-msedge-selenium-tools = []
-openapi3 = []
-packaging = []
-pkgutil-resolve-name = []
-pluggy = []
-py = []
-pygments = []
-pymdown-extensions = []
-pyparsing = []
-pyrsistent = []
-pytest = []
-pytest-html = []
-pytest-metadata = []
-pytest-ordering = []
-pytest-splunk-addon = []
-pytest-splunk-addon-ui-smartx = []
-pytest-xdist = []
-python-dateutil = []
-python-dotenv = []
-python-slugify = []
-pyyaml = []
-pyyaml-env-tag = []
-requests = []
-selenium = []
-six = []
-splunk-sdk = []
-text-unidecode = []
-toml = []
-tqdm = []
-typing-extensions = []
-urllib3 = []
-watchdog = []
-webdriver-manager = []
-xmlschema = []
-xmltodict = []
-zipp = []
+addonfactory-splunk-conf-parser-lib = [
+    {file = "addonfactory_splunk_conf_parser_lib-0.3.4-py3-none-any.whl", hash = "sha256:f2eb25bd03d4fd464b8b0304a87d5dc1e2935c42a6c262c6461b9b73b8e30217"},
+    {file = "addonfactory_splunk_conf_parser_lib-0.3.4.tar.gz", hash = "sha256:e550105c8c85a6f553688e5b1f4f55ae7ca758a1a428cbce1e0b9b73b9f4e35d"},
+]
+arrow = [
+    {file = "arrow-1.2.3-py3-none-any.whl", hash = "sha256:5a49ab92e3b7b71d96cd6bfcc4df14efefc9dfa96ea19045815914a6ab6b1fe2"},
+    {file = "arrow-1.2.3.tar.gz", hash = "sha256:3934b30ca1b9f292376d9db15b19446088d12ec58629bc3f0da28fd55fb633a1"},
+]
+attrs = [
+    {file = "attrs-22.2.0-py3-none-any.whl", hash = "sha256:29e95c7f6778868dbd49170f98f8818f78f3dc5e0e37c0b1f474e3561b240836"},
+    {file = "attrs-22.2.0.tar.gz", hash = "sha256:c9227bfc2f01993c03f68db37d1d15c9690188323c067c641f1a35ca58185f99"},
+]
+binaryornot = [
+    {file = "binaryornot-0.4.4-py2.py3-none-any.whl", hash = "sha256:b8b71173c917bddcd2c16070412e369c3ed7f0528926f70cac18a6c97fd563e4"},
+    {file = "binaryornot-0.4.4.tar.gz", hash = "sha256:359501dfc9d40632edc9fac890e19542db1a287bbcfa58175b66658392018061"},
+]
+certifi = [
+    {file = "certifi-2022.12.7-py3-none-any.whl", hash = "sha256:4ad3232f5e926d6718ec31cfc1fcadfde020920e278684144551c91769c7bc18"},
+    {file = "certifi-2022.12.7.tar.gz", hash = "sha256:35824b4c3a97115964b408844d64aa14db1cc518f6562e8d7261699d1350a9e3"},
+]
+chardet = [
+    {file = "chardet-5.1.0-py3-none-any.whl", hash = "sha256:362777fb014af596ad31334fde1e8c327dfdb076e1960d1694662d46a6917ab9"},
+    {file = "chardet-5.1.0.tar.gz", hash = "sha256:0d62712b956bc154f85fb0a266e2a3c5913c2967e00348701b32411d6def31e5"},
+]
+charset-normalizer = [
+    {file = "charset-normalizer-3.0.1.tar.gz", hash = "sha256:ebea339af930f8ca5d7a699b921106c6e29c617fe9606fa7baa043c1cdae326f"},
+    {file = "charset_normalizer-3.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:88600c72ef7587fe1708fd242b385b6ed4b8904976d5da0893e31df8b3480cb6"},
+    {file = "charset_normalizer-3.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c75ffc45f25324e68ab238cb4b5c0a38cd1c3d7f1fb1f72b5541de469e2247db"},
+    {file = "charset_normalizer-3.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:db72b07027db150f468fbada4d85b3b2729a3db39178abf5c543b784c1254539"},
+    {file = "charset_normalizer-3.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:62595ab75873d50d57323a91dd03e6966eb79c41fa834b7a1661ed043b2d404d"},
+    {file = "charset_normalizer-3.0.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ff6f3db31555657f3163b15a6b7c6938d08df7adbfc9dd13d9d19edad678f1e8"},
+    {file = "charset_normalizer-3.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:772b87914ff1152b92a197ef4ea40efe27a378606c39446ded52c8f80f79702e"},
+    {file = "charset_normalizer-3.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70990b9c51340e4044cfc394a81f614f3f90d41397104d226f21e66de668730d"},
+    {file = "charset_normalizer-3.0.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:292d5e8ba896bbfd6334b096e34bffb56161c81408d6d036a7dfa6929cff8783"},
+    {file = "charset_normalizer-3.0.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:2edb64ee7bf1ed524a1da60cdcd2e1f6e2b4f66ef7c077680739f1641f62f555"},
+    {file = "charset_normalizer-3.0.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:31a9ddf4718d10ae04d9b18801bd776693487cbb57d74cc3458a7673f6f34639"},
+    {file = "charset_normalizer-3.0.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:44ba614de5361b3e5278e1241fda3dc1838deed864b50a10d7ce92983797fa76"},
+    {file = "charset_normalizer-3.0.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:12db3b2c533c23ab812c2b25934f60383361f8a376ae272665f8e48b88e8e1c6"},
+    {file = "charset_normalizer-3.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c512accbd6ff0270939b9ac214b84fb5ada5f0409c44298361b2f5e13f9aed9e"},
+    {file = "charset_normalizer-3.0.1-cp310-cp310-win32.whl", hash = "sha256:502218f52498a36d6bf5ea77081844017bf7982cdbe521ad85e64cabee1b608b"},
+    {file = "charset_normalizer-3.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:601f36512f9e28f029d9481bdaf8e89e5148ac5d89cffd3b05cd533eeb423b59"},
+    {file = "charset_normalizer-3.0.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0298eafff88c99982a4cf66ba2efa1128e4ddaca0b05eec4c456bbc7db691d8d"},
+    {file = "charset_normalizer-3.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a8d0fc946c784ff7f7c3742310cc8a57c5c6dc31631269876a88b809dbeff3d3"},
+    {file = "charset_normalizer-3.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:87701167f2a5c930b403e9756fab1d31d4d4da52856143b609e30a1ce7160f3c"},
+    {file = "charset_normalizer-3.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:14e76c0f23218b8f46c4d87018ca2e441535aed3632ca134b10239dfb6dadd6b"},
+    {file = "charset_normalizer-3.0.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0c0a590235ccd933d9892c627dec5bc7511ce6ad6c1011fdf5b11363022746c1"},
+    {file = "charset_normalizer-3.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8c7fe7afa480e3e82eed58e0ca89f751cd14d767638e2550c77a92a9e749c317"},
+    {file = "charset_normalizer-3.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:79909e27e8e4fcc9db4addea88aa63f6423ebb171db091fb4373e3312cb6d603"},
+    {file = "charset_normalizer-3.0.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8ac7b6a045b814cf0c47f3623d21ebd88b3e8cf216a14790b455ea7ff0135d18"},
+    {file = "charset_normalizer-3.0.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:72966d1b297c741541ca8cf1223ff262a6febe52481af742036a0b296e35fa5a"},
+    {file = "charset_normalizer-3.0.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:f9d0c5c045a3ca9bedfc35dca8526798eb91a07aa7a2c0fee134c6c6f321cbd7"},
+    {file = "charset_normalizer-3.0.1-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:5995f0164fa7df59db4746112fec3f49c461dd6b31b841873443bdb077c13cfc"},
+    {file = "charset_normalizer-3.0.1-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4a8fcf28c05c1f6d7e177a9a46a1c52798bfe2ad80681d275b10dcf317deaf0b"},
+    {file = "charset_normalizer-3.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:761e8904c07ad053d285670f36dd94e1b6ab7f16ce62b9805c475b7aa1cffde6"},
+    {file = "charset_normalizer-3.0.1-cp311-cp311-win32.whl", hash = "sha256:71140351489970dfe5e60fc621ada3e0f41104a5eddaca47a7acb3c1b851d6d3"},
+    {file = "charset_normalizer-3.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:9ab77acb98eba3fd2a85cd160851816bfce6871d944d885febf012713f06659c"},
+    {file = "charset_normalizer-3.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:84c3990934bae40ea69a82034912ffe5a62c60bbf6ec5bc9691419641d7d5c9a"},
+    {file = "charset_normalizer-3.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:74292fc76c905c0ef095fe11e188a32ebd03bc38f3f3e9bcb85e4e6db177b7ea"},
+    {file = "charset_normalizer-3.0.1-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c95a03c79bbe30eec3ec2b7f076074f4281526724c8685a42872974ef4d36b72"},
+    {file = "charset_normalizer-3.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f4c39b0e3eac288fedc2b43055cfc2ca7a60362d0e5e87a637beac5d801ef478"},
+    {file = "charset_normalizer-3.0.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:df2c707231459e8a4028eabcd3cfc827befd635b3ef72eada84ab13b52e1574d"},
+    {file = "charset_normalizer-3.0.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:93ad6d87ac18e2a90b0fe89df7c65263b9a99a0eb98f0a3d2e079f12a0735837"},
+    {file = "charset_normalizer-3.0.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:59e5686dd847347e55dffcc191a96622f016bc0ad89105e24c14e0d6305acbc6"},
+    {file = "charset_normalizer-3.0.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:cd6056167405314a4dc3c173943f11249fa0f1b204f8b51ed4bde1a9cd1834dc"},
+    {file = "charset_normalizer-3.0.1-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:083c8d17153ecb403e5e1eb76a7ef4babfc2c48d58899c98fcaa04833e7a2f9a"},
+    {file = "charset_normalizer-3.0.1-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:f5057856d21e7586765171eac8b9fc3f7d44ef39425f85dbcccb13b3ebea806c"},
+    {file = "charset_normalizer-3.0.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:7eb33a30d75562222b64f569c642ff3dc6689e09adda43a082208397f016c39a"},
+    {file = "charset_normalizer-3.0.1-cp36-cp36m-win32.whl", hash = "sha256:95dea361dd73757c6f1c0a1480ac499952c16ac83f7f5f4f84f0658a01b8ef41"},
+    {file = "charset_normalizer-3.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:eaa379fcd227ca235d04152ca6704c7cb55564116f8bc52545ff357628e10602"},
+    {file = "charset_normalizer-3.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3e45867f1f2ab0711d60c6c71746ac53537f1684baa699f4f668d4c6f6ce8e14"},
+    {file = "charset_normalizer-3.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cadaeaba78750d58d3cc6ac4d1fd867da6fc73c88156b7a3212a3cd4819d679d"},
+    {file = "charset_normalizer-3.0.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:911d8a40b2bef5b8bbae2e36a0b103f142ac53557ab421dc16ac4aafee6f53dc"},
+    {file = "charset_normalizer-3.0.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:503e65837c71b875ecdd733877d852adbc465bd82c768a067badd953bf1bc5a3"},
+    {file = "charset_normalizer-3.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a60332922359f920193b1d4826953c507a877b523b2395ad7bc716ddd386d866"},
+    {file = "charset_normalizer-3.0.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:16a8663d6e281208d78806dbe14ee9903715361cf81f6d4309944e4d1e59ac5b"},
+    {file = "charset_normalizer-3.0.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:a16418ecf1329f71df119e8a65f3aa68004a3f9383821edcb20f0702934d8087"},
+    {file = "charset_normalizer-3.0.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:9d9153257a3f70d5f69edf2325357251ed20f772b12e593f3b3377b5f78e7ef8"},
+    {file = "charset_normalizer-3.0.1-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:02a51034802cbf38db3f89c66fb5d2ec57e6fe7ef2f4a44d070a593c3688667b"},
+    {file = "charset_normalizer-3.0.1-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:2e396d70bc4ef5325b72b593a72c8979999aa52fb8bcf03f701c1b03e1166918"},
+    {file = "charset_normalizer-3.0.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:11b53acf2411c3b09e6af37e4b9005cba376c872503c8f28218c7243582df45d"},
+    {file = "charset_normalizer-3.0.1-cp37-cp37m-win32.whl", hash = "sha256:0bf2dae5291758b6f84cf923bfaa285632816007db0330002fa1de38bfcb7154"},
+    {file = "charset_normalizer-3.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:2c03cc56021a4bd59be889c2b9257dae13bf55041a3372d3295416f86b295fb5"},
+    {file = "charset_normalizer-3.0.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:024e606be3ed92216e2b6952ed859d86b4cfa52cd5bc5f050e7dc28f9b43ec42"},
+    {file = "charset_normalizer-3.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4b0d02d7102dd0f997580b51edc4cebcf2ab6397a7edf89f1c73b586c614272c"},
+    {file = "charset_normalizer-3.0.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:358a7c4cb8ba9b46c453b1dd8d9e431452d5249072e4f56cfda3149f6ab1405e"},
+    {file = "charset_normalizer-3.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:81d6741ab457d14fdedc215516665050f3822d3e56508921cc7239f8c8e66a58"},
+    {file = "charset_normalizer-3.0.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8b8af03d2e37866d023ad0ddea594edefc31e827fee64f8de5611a1dbc373174"},
+    {file = "charset_normalizer-3.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9cf4e8ad252f7c38dd1f676b46514f92dc0ebeb0db5552f5f403509705e24753"},
+    {file = "charset_normalizer-3.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e696f0dd336161fca9adbb846875d40752e6eba585843c768935ba5c9960722b"},
+    {file = "charset_normalizer-3.0.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c22d3fe05ce11d3671297dc8973267daa0f938b93ec716e12e0f6dee81591dc1"},
+    {file = "charset_normalizer-3.0.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:109487860ef6a328f3eec66f2bf78b0b72400280d8f8ea05f69c51644ba6521a"},
+    {file = "charset_normalizer-3.0.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:37f8febc8ec50c14f3ec9637505f28e58d4f66752207ea177c1d67df25da5aed"},
+    {file = "charset_normalizer-3.0.1-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:f97e83fa6c25693c7a35de154681fcc257c1c41b38beb0304b9c4d2d9e164479"},
+    {file = "charset_normalizer-3.0.1-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:a152f5f33d64a6be73f1d30c9cc82dfc73cec6477ec268e7c6e4c7d23c2d2291"},
+    {file = "charset_normalizer-3.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:39049da0ffb96c8cbb65cbf5c5f3ca3168990adf3551bd1dee10c48fce8ae820"},
+    {file = "charset_normalizer-3.0.1-cp38-cp38-win32.whl", hash = "sha256:4457ea6774b5611f4bed5eaa5df55f70abde42364d498c5134b7ef4c6958e20e"},
+    {file = "charset_normalizer-3.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:e62164b50f84e20601c1ff8eb55620d2ad25fb81b59e3cd776a1902527a788af"},
+    {file = "charset_normalizer-3.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8eade758719add78ec36dc13201483f8e9b5d940329285edcd5f70c0a9edbd7f"},
+    {file = "charset_normalizer-3.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8499ca8f4502af841f68135133d8258f7b32a53a1d594aa98cc52013fff55678"},
+    {file = "charset_normalizer-3.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3fc1c4a2ffd64890aebdb3f97e1278b0cc72579a08ca4de8cd2c04799a3a22be"},
+    {file = "charset_normalizer-3.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:00d3ffdaafe92a5dc603cb9bd5111aaa36dfa187c8285c543be562e61b755f6b"},
+    {file = "charset_normalizer-3.0.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c2ac1b08635a8cd4e0cbeaf6f5e922085908d48eb05d44c5ae9eabab148512ca"},
+    {file = "charset_normalizer-3.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f6f45710b4459401609ebebdbcfb34515da4fc2aa886f95107f556ac69a9147e"},
+    {file = "charset_normalizer-3.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ae1de54a77dc0d6d5fcf623290af4266412a7c4be0b1ff7444394f03f5c54e3"},
+    {file = "charset_normalizer-3.0.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3b590df687e3c5ee0deef9fc8c547d81986d9a1b56073d82de008744452d6541"},
+    {file = "charset_normalizer-3.0.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ab5de034a886f616a5668aa5d098af2b5385ed70142090e2a31bcbd0af0fdb3d"},
+    {file = "charset_normalizer-3.0.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9cb3032517f1627cc012dbc80a8ec976ae76d93ea2b5feaa9d2a5b8882597579"},
+    {file = "charset_normalizer-3.0.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:608862a7bf6957f2333fc54ab4399e405baad0163dc9f8d99cb236816db169d4"},
+    {file = "charset_normalizer-3.0.1-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:0f438ae3532723fb6ead77e7c604be7c8374094ef4ee2c5e03a3a17f1fca256c"},
+    {file = "charset_normalizer-3.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:356541bf4381fa35856dafa6a965916e54bed415ad8a24ee6de6e37deccf2786"},
+    {file = "charset_normalizer-3.0.1-cp39-cp39-win32.whl", hash = "sha256:39cf9ed17fe3b1bc81f33c9ceb6ce67683ee7526e65fde1447c772afc54a1bb8"},
+    {file = "charset_normalizer-3.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:0a11e971ed097d24c534c037d298ad32c6ce81a45736d31e0ff0ad37ab437d59"},
+    {file = "charset_normalizer-3.0.1-py3-none-any.whl", hash = "sha256:7e189e2e1d3ed2f4aebabd2d5b0f931e883676e51c7624826e0a4e5fe8a0bf24"},
+]
+click = [
+    {file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"},
+    {file = "click-8.1.3.tar.gz", hash = "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e"},
+]
+colorama = [
+    {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"},
+    {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"},
+]
+cookiecutter = [
+    {file = "cookiecutter-2.1.1-py2.py3-none-any.whl", hash = "sha256:9f3ab027cec4f70916e28f03470bdb41e637a3ad354b4d65c765d93aad160022"},
+    {file = "cookiecutter-2.1.1.tar.gz", hash = "sha256:f3982be8d9c53dac1261864013fdec7f83afd2e42ede6f6dd069c5e149c540d5"},
+]
+cssselect = [
+    {file = "cssselect-1.2.0-py2.py3-none-any.whl", hash = "sha256:da1885f0c10b60c03ed5eccbb6b68d6eff248d91976fcde348f395d54c9fd35e"},
+    {file = "cssselect-1.2.0.tar.gz", hash = "sha256:666b19839cfaddb9ce9d36bfe4c969132c647b92fc9088c4e23f786b30f1b3dc"},
+]
+defusedxml = [
+    {file = "defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61"},
+    {file = "defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69"},
+]
+dunamai = [
+    {file = "dunamai-1.15.0-py3-none-any.whl", hash = "sha256:646d7a6c07d0ec8412ac43c1a3546f1d1b52f3ed918f4bfbefe32439b49dec7e"},
+    {file = "dunamai-1.15.0.tar.gz", hash = "sha256:d6088922df3226a8234c228803bb01902a83766d04c2cddb33d4dd3bf85ec9a5"},
+]
+elementpath = [
+    {file = "elementpath-2.5.3-py3-none-any.whl", hash = "sha256:5ef1d51e8daa670f007914ff0f78ca7b2ecaa47e0ea0c5c699a29e6bc5f50385"},
+    {file = "elementpath-2.5.3.tar.gz", hash = "sha256:b8aeb6f27dddc10fb9201b62090628a846cbae8577f3544cb1075fa38d0817f6"},
+]
+exceptiongroup = [
+    {file = "exceptiongroup-1.1.0-py3-none-any.whl", hash = "sha256:327cbda3da756e2de031a3107b81ab7b3770a602c4d16ca618298c526f4bec1e"},
+    {file = "exceptiongroup-1.1.0.tar.gz", hash = "sha256:bcb67d800a4497e1b404c2dd44fca47d3b7a5e5433dbab67f96c1a685cdfdf23"},
+]
+execnet = [
+    {file = "execnet-1.9.0-py2.py3-none-any.whl", hash = "sha256:a295f7cc774947aac58dde7fdc85f4aa00c42adf5d8f5468fc630c1acf30a142"},
+    {file = "execnet-1.9.0.tar.gz", hash = "sha256:8f694f3ba9cc92cab508b152dcfe322153975c29bda272e2fd7f3f00f36e47c5"},
+]
+faker = [
+    {file = "Faker-13.16.0-py3-none-any.whl", hash = "sha256:920f94d5aa865fd922bc29f2cf75c75b4d86b30eec23e7174d7513241b759b05"},
+    {file = "Faker-13.16.0.tar.gz", hash = "sha256:25c5be99bc5fd8676eea8c1490e0de87f6d9734651c7af2cefc99b322b2936f4"},
+]
+filelock = [
+    {file = "filelock-3.9.0-py3-none-any.whl", hash = "sha256:f58d535af89bb9ad5cd4df046f741f8553a418c01a7856bf0d173bbc9f6bd16d"},
+    {file = "filelock-3.9.0.tar.gz", hash = "sha256:7b319f24340b51f55a2bf7a12ac0755a9b03e718311dac567a0f4f7fabd2f5de"},
+]
+future = [
+    {file = "future-0.18.3.tar.gz", hash = "sha256:34a17436ed1e96697a86f9de3d15a3b0be01d8bc8de9c1dffd59fb8234ed5307"},
+]
+ghp-import = [
+    {file = "ghp-import-2.1.0.tar.gz", hash = "sha256:9c535c4c61193c2df8871222567d7fd7e5014d835f97dc7b7439069e2413d343"},
+    {file = "ghp_import-2.1.0-py3-none-any.whl", hash = "sha256:8337dd7b50877f163d4c0289bc1f1c7f127550241988d568c1db512c4324a619"},
+]
+httplib2 = [
+    {file = "httplib2-0.21.0-py3-none-any.whl", hash = "sha256:987c8bb3eb82d3fa60c68699510a692aa2ad9c4bd4f123e51dfb1488c14cdd01"},
+    {file = "httplib2-0.21.0.tar.gz", hash = "sha256:fc144f091c7286b82bec71bdbd9b27323ba709cc612568d3000893bfd9cb4b34"},
+]
+idna = [
+    {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"},
+    {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"},
+]
+importlib-metadata = [
+    {file = "importlib_metadata-6.0.0-py3-none-any.whl", hash = "sha256:7efb448ec9a5e313a57655d35aa54cd3e01b7e1fbcf72dce1bf06119420f5bad"},
+    {file = "importlib_metadata-6.0.0.tar.gz", hash = "sha256:e354bedeb60efa6affdcc8ae121b73544a7aa74156d047311948f6d711cd378d"},
+]
+importlib-resources = [
+    {file = "importlib_resources-5.10.2-py3-none-any.whl", hash = "sha256:7d543798b0beca10b6a01ac7cafda9f822c54db9e8376a6bf57e0cbd74d486b6"},
+    {file = "importlib_resources-5.10.2.tar.gz", hash = "sha256:e4a96c8cc0339647ff9a5e0550d9f276fc5a01ffa276012b58ec108cfd7b8484"},
+]
+iniconfig = [
+    {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"},
+    {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"},
+]
+jinja2 = [
+    {file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"},
+    {file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"},
+]
+jinja2-time = [
+    {file = "jinja2-time-0.2.0.tar.gz", hash = "sha256:d14eaa4d315e7688daa4969f616f226614350c48730bfa1692d2caebd8c90d40"},
+    {file = "jinja2_time-0.2.0-py2.py3-none-any.whl", hash = "sha256:d3eab6605e3ec8b7a0863df09cc1d23714908fa61aa6986a845c20ba488b4efa"},
+]
+jsonschema = [
+    {file = "jsonschema-4.17.3-py3-none-any.whl", hash = "sha256:a870ad254da1a8ca84b6a2905cac29d265f805acc57af304784962a2aa6508f6"},
+    {file = "jsonschema-4.17.3.tar.gz", hash = "sha256:0f864437ab8b6076ba6707453ef8f98a6a0d512a80e93f8abdb676f737ecb60d"},
+]
+junitparser = [
+    {file = "junitparser-2.8.0-py2.py3-none-any.whl", hash = "sha256:e1a7d41e0c92ca032c46eed07a6268c478f90ec1f411ea8a76b69f245e57cfb6"},
+    {file = "junitparser-2.8.0.tar.gz", hash = "sha256:a8d4290ab9fb93f2015e0dbef61ef93b7ea110e99099087a453f55c8e1481adf"},
+]
+lxml = [
+    {file = "lxml-4.9.2-cp27-cp27m-macosx_10_15_x86_64.whl", hash = "sha256:76cf573e5a365e790396a5cc2b909812633409306c6531a6877c59061e42c4f2"},
+    {file = "lxml-4.9.2-cp27-cp27m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b1f42b6921d0e81b1bcb5e395bc091a70f41c4d4e55ba99c6da2b31626c44892"},
+    {file = "lxml-4.9.2-cp27-cp27m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:9f102706d0ca011de571de32c3247c6476b55bb6bc65a20f682f000b07a4852a"},
+    {file = "lxml-4.9.2-cp27-cp27m-win32.whl", hash = "sha256:8d0b4612b66ff5d62d03bcaa043bb018f74dfea51184e53f067e6fdcba4bd8de"},
+    {file = "lxml-4.9.2-cp27-cp27m-win_amd64.whl", hash = "sha256:4c8f293f14abc8fd3e8e01c5bd86e6ed0b6ef71936ded5bf10fe7a5efefbaca3"},
+    {file = "lxml-4.9.2-cp27-cp27mu-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2899456259589aa38bfb018c364d6ae7b53c5c22d8e27d0ec7609c2a1ff78b50"},
+    {file = "lxml-4.9.2-cp27-cp27mu-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6749649eecd6a9871cae297bffa4ee76f90b4504a2a2ab528d9ebe912b101975"},
+    {file = "lxml-4.9.2-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:a08cff61517ee26cb56f1e949cca38caabe9ea9fbb4b1e10a805dc39844b7d5c"},
+    {file = "lxml-4.9.2-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:85cabf64adec449132e55616e7ca3e1000ab449d1d0f9d7f83146ed5bdcb6d8a"},
+    {file = "lxml-4.9.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:8340225bd5e7a701c0fa98284c849c9b9fc9238abf53a0ebd90900f25d39a4e4"},
+    {file = "lxml-4.9.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:1ab8f1f932e8f82355e75dda5413a57612c6ea448069d4fb2e217e9a4bed13d4"},
+    {file = "lxml-4.9.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:699a9af7dffaf67deeae27b2112aa06b41c370d5e7633e0ee0aea2e0b6c211f7"},
+    {file = "lxml-4.9.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b9cc34af337a97d470040f99ba4282f6e6bac88407d021688a5d585e44a23184"},
+    {file = "lxml-4.9.2-cp310-cp310-win32.whl", hash = "sha256:d02a5399126a53492415d4906ab0ad0375a5456cc05c3fc0fc4ca11771745cda"},
+    {file = "lxml-4.9.2-cp310-cp310-win_amd64.whl", hash = "sha256:a38486985ca49cfa574a507e7a2215c0c780fd1778bb6290c21193b7211702ab"},
+    {file = "lxml-4.9.2-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:c83203addf554215463b59f6399835201999b5e48019dc17f182ed5ad87205c9"},
+    {file = "lxml-4.9.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:2a87fa548561d2f4643c99cd13131acb607ddabb70682dcf1dff5f71f781a4bf"},
+    {file = "lxml-4.9.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:d6b430a9938a5a5d85fc107d852262ddcd48602c120e3dbb02137c83d212b380"},
+    {file = "lxml-4.9.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:3efea981d956a6f7173b4659849f55081867cf897e719f57383698af6f618a92"},
+    {file = "lxml-4.9.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:df0623dcf9668ad0445e0558a21211d4e9a149ea8f5666917c8eeec515f0a6d1"},
+    {file = "lxml-4.9.2-cp311-cp311-win32.whl", hash = "sha256:da248f93f0418a9e9d94b0080d7ebc407a9a5e6d0b57bb30db9b5cc28de1ad33"},
+    {file = "lxml-4.9.2-cp311-cp311-win_amd64.whl", hash = "sha256:3818b8e2c4b5148567e1b09ce739006acfaa44ce3156f8cbbc11062994b8e8dd"},
+    {file = "lxml-4.9.2-cp35-cp35m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ca989b91cf3a3ba28930a9fc1e9aeafc2a395448641df1f387a2d394638943b0"},
+    {file = "lxml-4.9.2-cp35-cp35m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:822068f85e12a6e292803e112ab876bc03ed1f03dddb80154c395f891ca6b31e"},
+    {file = "lxml-4.9.2-cp35-cp35m-win32.whl", hash = "sha256:be7292c55101e22f2a3d4d8913944cbea71eea90792bf914add27454a13905df"},
+    {file = "lxml-4.9.2-cp36-cp36m-macosx_10_15_x86_64.whl", hash = "sha256:b26a29f0b7fc6f0897f043ca366142d2b609dc60756ee6e4e90b5f762c6adc53"},
+    {file = "lxml-4.9.2-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:ab323679b8b3030000f2be63e22cdeea5b47ee0abd2d6a1dc0c8103ddaa56cd7"},
+    {file = "lxml-4.9.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:689bb688a1db722485e4610a503e3e9210dcc20c520b45ac8f7533c837be76fe"},
+    {file = "lxml-4.9.2-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:f49e52d174375a7def9915c9f06ec4e569d235ad428f70751765f48d5926678c"},
+    {file = "lxml-4.9.2-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:36c3c175d34652a35475a73762b545f4527aec044910a651d2bf50de9c3352b1"},
+    {file = "lxml-4.9.2-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:a35f8b7fa99f90dd2f5dc5a9fa12332642f087a7641289ca6c40d6e1a2637d8e"},
+    {file = "lxml-4.9.2-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:58bfa3aa19ca4c0f28c5dde0ff56c520fbac6f0daf4fac66ed4c8d2fb7f22e74"},
+    {file = "lxml-4.9.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:bc718cd47b765e790eecb74d044cc8d37d58562f6c314ee9484df26276d36a38"},
+    {file = "lxml-4.9.2-cp36-cp36m-win32.whl", hash = "sha256:d5bf6545cd27aaa8a13033ce56354ed9e25ab0e4ac3b5392b763d8d04b08e0c5"},
+    {file = "lxml-4.9.2-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:05ca3f6abf5cf78fe053da9b1166e062ade3fa5d4f92b4ed688127ea7d7b1d03"},
+    {file = "lxml-4.9.2-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:a5da296eb617d18e497bcf0a5c528f5d3b18dadb3619fbdadf4ed2356ef8d941"},
+    {file = "lxml-4.9.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:04876580c050a8c5341d706dd464ff04fd597095cc8c023252566a8826505726"},
+    {file = "lxml-4.9.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:c9ec3eaf616d67db0764b3bb983962b4f385a1f08304fd30c7283954e6a7869b"},
+    {file = "lxml-4.9.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2a29ba94d065945944016b6b74e538bdb1751a1db6ffb80c9d3c2e40d6fa9894"},
+    {file = "lxml-4.9.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:a82d05da00a58b8e4c0008edbc8a4b6ec5a4bc1e2ee0fb6ed157cf634ed7fa45"},
+    {file = "lxml-4.9.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:223f4232855ade399bd409331e6ca70fb5578efef22cf4069a6090acc0f53c0e"},
+    {file = "lxml-4.9.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d17bc7c2ccf49c478c5bdd447594e82692c74222698cfc9b5daae7ae7e90743b"},
+    {file = "lxml-4.9.2-cp37-cp37m-win32.whl", hash = "sha256:b64d891da92e232c36976c80ed7ebb383e3f148489796d8d31a5b6a677825efe"},
+    {file = "lxml-4.9.2-cp37-cp37m-win_amd64.whl", hash = "sha256:a0a336d6d3e8b234a3aae3c674873d8f0e720b76bc1d9416866c41cd9500ffb9"},
+    {file = "lxml-4.9.2-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:da4dd7c9c50c059aba52b3524f84d7de956f7fef88f0bafcf4ad7dde94a064e8"},
+    {file = "lxml-4.9.2-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:821b7f59b99551c69c85a6039c65b75f5683bdc63270fec660f75da67469ca24"},
+    {file = "lxml-4.9.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:e5168986b90a8d1f2f9dc1b841467c74221bd752537b99761a93d2d981e04889"},
+    {file = "lxml-4.9.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:8e20cb5a47247e383cf4ff523205060991021233ebd6f924bca927fcf25cf86f"},
+    {file = "lxml-4.9.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:13598ecfbd2e86ea7ae45ec28a2a54fb87ee9b9fdb0f6d343297d8e548392c03"},
+    {file = "lxml-4.9.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:880bbbcbe2fca64e2f4d8e04db47bcdf504936fa2b33933efd945e1b429bea8c"},
+    {file = "lxml-4.9.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:7d2278d59425777cfcb19735018d897ca8303abe67cc735f9f97177ceff8027f"},
+    {file = "lxml-4.9.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5344a43228767f53a9df6e5b253f8cdca7dfc7b7aeae52551958192f56d98457"},
+    {file = "lxml-4.9.2-cp38-cp38-win32.whl", hash = "sha256:925073b2fe14ab9b87e73f9a5fde6ce6392da430f3004d8b72cc86f746f5163b"},
+    {file = "lxml-4.9.2-cp38-cp38-win_amd64.whl", hash = "sha256:9b22c5c66f67ae00c0199f6055705bc3eb3fcb08d03d2ec4059a2b1b25ed48d7"},
+    {file = "lxml-4.9.2-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:5f50a1c177e2fa3ee0667a5ab79fdc6b23086bc8b589d90b93b4bd17eb0e64d1"},
+    {file = "lxml-4.9.2-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:090c6543d3696cbe15b4ac6e175e576bcc3f1ccfbba970061b7300b0c15a2140"},
+    {file = "lxml-4.9.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:63da2ccc0857c311d764e7d3d90f429c252e83b52d1f8f1d1fe55be26827d1f4"},
+    {file = "lxml-4.9.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:5b4545b8a40478183ac06c073e81a5ce4cf01bf1734962577cf2bb569a5b3bbf"},
+    {file = "lxml-4.9.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2e430cd2824f05f2d4f687701144556646bae8f249fd60aa1e4c768ba7018947"},
+    {file = "lxml-4.9.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6804daeb7ef69e7b36f76caddb85cccd63d0c56dedb47555d2fc969e2af6a1a5"},
+    {file = "lxml-4.9.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a6e441a86553c310258aca15d1c05903aaf4965b23f3bc2d55f200804e005ee5"},
+    {file = "lxml-4.9.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ca34efc80a29351897e18888c71c6aca4a359247c87e0b1c7ada14f0ab0c0fb2"},
+    {file = "lxml-4.9.2-cp39-cp39-win32.whl", hash = "sha256:6b418afe5df18233fc6b6093deb82a32895b6bb0b1155c2cdb05203f583053f1"},
+    {file = "lxml-4.9.2-cp39-cp39-win_amd64.whl", hash = "sha256:f1496ea22ca2c830cbcbd473de8f114a320da308438ae65abad6bab7867fe38f"},
+    {file = "lxml-4.9.2-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:b264171e3143d842ded311b7dccd46ff9ef34247129ff5bf5066123c55c2431c"},
+    {file = "lxml-4.9.2-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:0dc313ef231edf866912e9d8f5a042ddab56c752619e92dfd3a2c277e6a7299a"},
+    {file = "lxml-4.9.2-pp38-pypy38_pp73-macosx_10_15_x86_64.whl", hash = "sha256:16efd54337136e8cd72fb9485c368d91d77a47ee2d42b057564aae201257d419"},
+    {file = "lxml-4.9.2-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:0f2b1e0d79180f344ff9f321327b005ca043a50ece8713de61d1cb383fb8ac05"},
+    {file = "lxml-4.9.2-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:7b770ed79542ed52c519119473898198761d78beb24b107acf3ad65deae61f1f"},
+    {file = "lxml-4.9.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:efa29c2fe6b4fdd32e8ef81c1528506895eca86e1d8c4657fda04c9b3786ddf9"},
+    {file = "lxml-4.9.2-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7e91ee82f4199af8c43d8158024cbdff3d931df350252288f0d4ce656df7f3b5"},
+    {file = "lxml-4.9.2-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:b23e19989c355ca854276178a0463951a653309fb8e57ce674497f2d9f208746"},
+    {file = "lxml-4.9.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:01d36c05f4afb8f7c20fd9ed5badca32a2029b93b1750f571ccc0b142531caf7"},
+    {file = "lxml-4.9.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7b515674acfdcadb0eb5d00d8a709868173acece5cb0be3dd165950cbfdf5409"},
+    {file = "lxml-4.9.2.tar.gz", hash = "sha256:2455cfaeb7ac70338b3257f41e21f0724f4b5b0c0e7702da67ee6c3640835b67"},
+]
+markdown = [
+    {file = "Markdown-3.3.7-py3-none-any.whl", hash = "sha256:f5da449a6e1c989a4cea2631aa8ee67caa5a2ef855d551c88f9e309f4634c621"},
+    {file = "Markdown-3.3.7.tar.gz", hash = "sha256:cbb516f16218e643d8e0a95b309f77eb118cb138d39a4f27851e6a63581db874"},
+]
+markupsafe = [
+    {file = "MarkupSafe-2.1.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:665a36ae6f8f20a4676b53224e33d456a6f5a72657d9c83c2aa00765072f31f7"},
+    {file = "MarkupSafe-2.1.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:340bea174e9761308703ae988e982005aedf427de816d1afe98147668cc03036"},
+    {file = "MarkupSafe-2.1.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22152d00bf4a9c7c83960521fc558f55a1adbc0631fbb00a9471e097b19d72e1"},
+    {file = "MarkupSafe-2.1.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28057e985dace2f478e042eaa15606c7efccb700797660629da387eb289b9323"},
+    {file = "MarkupSafe-2.1.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca244fa73f50a800cf8c3ebf7fd93149ec37f5cb9596aa8873ae2c1d23498601"},
+    {file = "MarkupSafe-2.1.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d9d971ec1e79906046aa3ca266de79eac42f1dbf3612a05dc9368125952bd1a1"},
+    {file = "MarkupSafe-2.1.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:7e007132af78ea9df29495dbf7b5824cb71648d7133cf7848a2a5dd00d36f9ff"},
+    {file = "MarkupSafe-2.1.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7313ce6a199651c4ed9d7e4cfb4aa56fe923b1adf9af3b420ee14e6d9a73df65"},
+    {file = "MarkupSafe-2.1.2-cp310-cp310-win32.whl", hash = "sha256:c4a549890a45f57f1ebf99c067a4ad0cb423a05544accaf2b065246827ed9603"},
+    {file = "MarkupSafe-2.1.2-cp310-cp310-win_amd64.whl", hash = "sha256:835fb5e38fd89328e9c81067fd642b3593c33e1e17e2fdbf77f5676abb14a156"},
+    {file = "MarkupSafe-2.1.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2ec4f2d48ae59bbb9d1f9d7efb9236ab81429a764dedca114f5fdabbc3788013"},
+    {file = "MarkupSafe-2.1.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:608e7073dfa9e38a85d38474c082d4281f4ce276ac0010224eaba11e929dd53a"},
+    {file = "MarkupSafe-2.1.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:65608c35bfb8a76763f37036547f7adfd09270fbdbf96608be2bead319728fcd"},
+    {file = "MarkupSafe-2.1.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2bfb563d0211ce16b63c7cb9395d2c682a23187f54c3d79bfec33e6705473c6"},
+    {file = "MarkupSafe-2.1.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:da25303d91526aac3672ee6d49a2f3db2d9502a4a60b55519feb1a4c7714e07d"},
+    {file = "MarkupSafe-2.1.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:9cad97ab29dfc3f0249b483412c85c8ef4766d96cdf9dcf5a1e3caa3f3661cf1"},
+    {file = "MarkupSafe-2.1.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:085fd3201e7b12809f9e6e9bc1e5c96a368c8523fad5afb02afe3c051ae4afcc"},
+    {file = "MarkupSafe-2.1.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1bea30e9bf331f3fef67e0a3877b2288593c98a21ccb2cf29b74c581a4eb3af0"},
+    {file = "MarkupSafe-2.1.2-cp311-cp311-win32.whl", hash = "sha256:7df70907e00c970c60b9ef2938d894a9381f38e6b9db73c5be35e59d92e06625"},
+    {file = "MarkupSafe-2.1.2-cp311-cp311-win_amd64.whl", hash = "sha256:e55e40ff0cc8cc5c07996915ad367fa47da6b3fc091fdadca7f5403239c5fec3"},
+    {file = "MarkupSafe-2.1.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a6e40afa7f45939ca356f348c8e23048e02cb109ced1eb8420961b2f40fb373a"},
+    {file = "MarkupSafe-2.1.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf877ab4ed6e302ec1d04952ca358b381a882fbd9d1b07cccbfd61783561f98a"},
+    {file = "MarkupSafe-2.1.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:63ba06c9941e46fa389d389644e2d8225e0e3e5ebcc4ff1ea8506dce646f8c8a"},
+    {file = "MarkupSafe-2.1.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f1cd098434e83e656abf198f103a8207a8187c0fc110306691a2e94a78d0abb2"},
+    {file = "MarkupSafe-2.1.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:55f44b440d491028addb3b88f72207d71eeebfb7b5dbf0643f7c023ae1fba619"},
+    {file = "MarkupSafe-2.1.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:a6f2fcca746e8d5910e18782f976489939d54a91f9411c32051b4aab2bd7c513"},
+    {file = "MarkupSafe-2.1.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:0b462104ba25f1ac006fdab8b6a01ebbfbce9ed37fd37fd4acd70c67c973e460"},
+    {file = "MarkupSafe-2.1.2-cp37-cp37m-win32.whl", hash = "sha256:7668b52e102d0ed87cb082380a7e2e1e78737ddecdde129acadb0eccc5423859"},
+    {file = "MarkupSafe-2.1.2-cp37-cp37m-win_amd64.whl", hash = "sha256:6d6607f98fcf17e534162f0709aaad3ab7a96032723d8ac8750ffe17ae5a0666"},
+    {file = "MarkupSafe-2.1.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:a806db027852538d2ad7555b203300173dd1b77ba116de92da9afbc3a3be3eed"},
+    {file = "MarkupSafe-2.1.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a4abaec6ca3ad8660690236d11bfe28dfd707778e2442b45addd2f086d6ef094"},
+    {file = "MarkupSafe-2.1.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f03a532d7dee1bed20bc4884194a16160a2de9ffc6354b3878ec9682bb623c54"},
+    {file = "MarkupSafe-2.1.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4cf06cdc1dda95223e9d2d3c58d3b178aa5dacb35ee7e3bbac10e4e1faacb419"},
+    {file = "MarkupSafe-2.1.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:22731d79ed2eb25059ae3df1dfc9cb1546691cc41f4e3130fe6bfbc3ecbbecfa"},
+    {file = "MarkupSafe-2.1.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:f8ffb705ffcf5ddd0e80b65ddf7bed7ee4f5a441ea7d3419e861a12eaf41af58"},
+    {file = "MarkupSafe-2.1.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:8db032bf0ce9022a8e41a22598eefc802314e81b879ae093f36ce9ddf39ab1ba"},
+    {file = "MarkupSafe-2.1.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2298c859cfc5463f1b64bd55cb3e602528db6fa0f3cfd568d3605c50678f8f03"},
+    {file = "MarkupSafe-2.1.2-cp38-cp38-win32.whl", hash = "sha256:50c42830a633fa0cf9e7d27664637532791bfc31c731a87b202d2d8ac40c3ea2"},
+    {file = "MarkupSafe-2.1.2-cp38-cp38-win_amd64.whl", hash = "sha256:bb06feb762bade6bf3c8b844462274db0c76acc95c52abe8dbed28ae3d44a147"},
+    {file = "MarkupSafe-2.1.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:99625a92da8229df6d44335e6fcc558a5037dd0a760e11d84be2260e6f37002f"},
+    {file = "MarkupSafe-2.1.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8bca7e26c1dd751236cfb0c6c72d4ad61d986e9a41bbf76cb445f69488b2a2bd"},
+    {file = "MarkupSafe-2.1.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40627dcf047dadb22cd25ea7ecfe9cbf3bbbad0482ee5920b582f3809c97654f"},
+    {file = "MarkupSafe-2.1.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40dfd3fefbef579ee058f139733ac336312663c6706d1163b82b3003fb1925c4"},
+    {file = "MarkupSafe-2.1.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:090376d812fb6ac5f171e5938e82e7f2d7adc2b629101cec0db8b267815c85e2"},
+    {file = "MarkupSafe-2.1.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:2e7821bffe00aa6bd07a23913b7f4e01328c3d5cc0b40b36c0bd81d362faeb65"},
+    {file = "MarkupSafe-2.1.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:c0a33bc9f02c2b17c3ea382f91b4db0e6cde90b63b296422a939886a7a80de1c"},
+    {file = "MarkupSafe-2.1.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:b8526c6d437855442cdd3d87eede9c425c4445ea011ca38d937db299382e6fa3"},
+    {file = "MarkupSafe-2.1.2-cp39-cp39-win32.whl", hash = "sha256:137678c63c977754abe9086a3ec011e8fd985ab90631145dfb9294ad09c102a7"},
+    {file = "MarkupSafe-2.1.2-cp39-cp39-win_amd64.whl", hash = "sha256:0576fe974b40a400449768941d5d0858cc624e3249dfd1e0c33674e5c7ca7aed"},
+    {file = "MarkupSafe-2.1.2.tar.gz", hash = "sha256:abcabc8c2b26036d62d4c746381a6f7cf60aafcc653198ad678306986b09450d"},
+]
+mergedeep = [
+    {file = "mergedeep-1.3.4-py3-none-any.whl", hash = "sha256:70775750742b25c0d8f36c55aed03d24c3384d17c951b3175d898bd778ef0307"},
+    {file = "mergedeep-1.3.4.tar.gz", hash = "sha256:0096d52e9dad9939c3d975a774666af186eda617e6ca84df4c94dec30004f2a8"},
+]
+mkdocs = [
+    {file = "mkdocs-1.4.2-py3-none-any.whl", hash = "sha256:c8856a832c1e56702577023cd64cc5f84948280c1c0fcc6af4cd39006ea6aa8c"},
+    {file = "mkdocs-1.4.2.tar.gz", hash = "sha256:8947af423a6d0facf41ea1195b8e1e8c85ad94ac95ae307fe11232e0424b11c5"},
+]
+mkdocs-material = [
+    {file = "mkdocs_material-9.0.15-py3-none-any.whl", hash = "sha256:734bcf6af9759888385ee15952c2e8a475d8568ded20965da321f0d8117dfe8f"},
+    {file = "mkdocs_material-9.0.15.tar.gz", hash = "sha256:d856bc67bc0115b1f258ca012724e17b72a9aea9b8b4d287c38460704f14eeb4"},
+]
+mkdocs-material-extensions = [
+    {file = "mkdocs_material_extensions-1.1.1-py3-none-any.whl", hash = "sha256:e41d9f38e4798b6617ad98ca8f7f1157b1e4385ac1459ca1e4ea219b556df945"},
+    {file = "mkdocs_material_extensions-1.1.1.tar.gz", hash = "sha256:9c003da71e2cc2493d910237448c672e00cefc800d3d6ae93d2fc69979e3bd93"},
+]
+msedge-selenium-tools = [
+    {file = "msedge-selenium-tools-3.141.4.tar.gz", hash = "sha256:e1d397b2830c6c6f282cc0da2c6745631ab039c9dcd92dcf51b30f135c96caf2"},
+    {file = "msedge_selenium_tools-3.141.4-py3-none-any.whl", hash = "sha256:92583d2b14cedc557ac72fba5b47c71582f852e65c80352bfa47ea41b0cef6a0"},
+]
+openapi3 = [
+    {file = "openapi3-1.7.0-py2.py3-none-any.whl", hash = "sha256:d2a967ccbe5259fc1345fe957903ce0c5cf1bfbc0d9a9093ff33944823705e59"},
+    {file = "openapi3-1.7.0.tar.gz", hash = "sha256:c3016f242d5e6c12a361eb7021086ad308417aa53858afae9c59abe05d88ca60"},
+]
+packaging = [
+    {file = "packaging-23.0-py3-none-any.whl", hash = "sha256:714ac14496c3e68c99c29b00845f7a2b85f3bb6f1078fd9f72fd20f0570002b2"},
+    {file = "packaging-23.0.tar.gz", hash = "sha256:b6ad297f8907de0fa2fe1ccbd26fdaf387f5f47c7275fedf8cce89f99446cf97"},
+]
+pkgutil-resolve-name = [
+    {file = "pkgutil_resolve_name-1.3.10-py3-none-any.whl", hash = "sha256:ca27cc078d25c5ad71a9de0a7a330146c4e014c2462d9af19c6b828280649c5e"},
+    {file = "pkgutil_resolve_name-1.3.10.tar.gz", hash = "sha256:357d6c9e6a755653cfd78893817c0853af365dd51ec97f3d358a819373bbd174"},
+]
+pluggy = [
+    {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"},
+    {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"},
+]
+py = [
+    {file = "py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"},
+    {file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"},
+]
+pygments = [
+    {file = "Pygments-2.14.0-py3-none-any.whl", hash = "sha256:fa7bd7bd2771287c0de303af8bfdfc731f51bd2c6a47ab69d117138893b82717"},
+    {file = "Pygments-2.14.0.tar.gz", hash = "sha256:b3ed06a9e8ac9a9aae5a6f5dbe78a8a58655d17b43b93c078f094ddc476ae297"},
+]
+pymdown-extensions = [
+    {file = "pymdown_extensions-9.9.2-py3-none-any.whl", hash = "sha256:c3d804eb4a42b85bafb5f36436342a5ad38df03878bb24db8855a4aa8b08b765"},
+    {file = "pymdown_extensions-9.9.2.tar.gz", hash = "sha256:ebb33069bafcb64d5f5988043331d4ea4929325dc678a6bcf247ddfcf96499f8"},
+]
+pyparsing = [
+    {file = "pyparsing-3.0.9-py3-none-any.whl", hash = "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc"},
+    {file = "pyparsing-3.0.9.tar.gz", hash = "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb"},
+]
+pyrsistent = [
+    {file = "pyrsistent-0.19.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:20460ac0ea439a3e79caa1dbd560344b64ed75e85d8703943e0b66c2a6150e4a"},
+    {file = "pyrsistent-0.19.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4c18264cb84b5e68e7085a43723f9e4c1fd1d935ab240ce02c0324a8e01ccb64"},
+    {file = "pyrsistent-0.19.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4b774f9288dda8d425adb6544e5903f1fb6c273ab3128a355c6b972b7df39dcf"},
+    {file = "pyrsistent-0.19.3-cp310-cp310-win32.whl", hash = "sha256:5a474fb80f5e0d6c9394d8db0fc19e90fa540b82ee52dba7d246a7791712f74a"},
+    {file = "pyrsistent-0.19.3-cp310-cp310-win_amd64.whl", hash = "sha256:49c32f216c17148695ca0e02a5c521e28a4ee6c5089f97e34fe24163113722da"},
+    {file = "pyrsistent-0.19.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f0774bf48631f3a20471dd7c5989657b639fd2d285b861237ea9e82c36a415a9"},
+    {file = "pyrsistent-0.19.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ab2204234c0ecd8b9368dbd6a53e83c3d4f3cab10ecaf6d0e772f456c442393"},
+    {file = "pyrsistent-0.19.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e42296a09e83028b3476f7073fcb69ffebac0e66dbbfd1bd847d61f74db30f19"},
+    {file = "pyrsistent-0.19.3-cp311-cp311-win32.whl", hash = "sha256:64220c429e42a7150f4bfd280f6f4bb2850f95956bde93c6fda1b70507af6ef3"},
+    {file = "pyrsistent-0.19.3-cp311-cp311-win_amd64.whl", hash = "sha256:016ad1afadf318eb7911baa24b049909f7f3bb2c5b1ed7b6a8f21db21ea3faa8"},
+    {file = "pyrsistent-0.19.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c4db1bd596fefd66b296a3d5d943c94f4fac5bcd13e99bffe2ba6a759d959a28"},
+    {file = "pyrsistent-0.19.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aeda827381f5e5d65cced3024126529ddc4289d944f75e090572c77ceb19adbf"},
+    {file = "pyrsistent-0.19.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:42ac0b2f44607eb92ae88609eda931a4f0dfa03038c44c772e07f43e738bcac9"},
+    {file = "pyrsistent-0.19.3-cp37-cp37m-win32.whl", hash = "sha256:e8f2b814a3dc6225964fa03d8582c6e0b6650d68a232df41e3cc1b66a5d2f8d1"},
+    {file = "pyrsistent-0.19.3-cp37-cp37m-win_amd64.whl", hash = "sha256:c9bb60a40a0ab9aba40a59f68214eed5a29c6274c83b2cc206a359c4a89fa41b"},
+    {file = "pyrsistent-0.19.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:a2471f3f8693101975b1ff85ffd19bb7ca7dd7c38f8a81701f67d6b4f97b87d8"},
+    {file = "pyrsistent-0.19.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc5d149f31706762c1f8bda2e8c4f8fead6e80312e3692619a75301d3dbb819a"},
+    {file = "pyrsistent-0.19.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3311cb4237a341aa52ab8448c27e3a9931e2ee09561ad150ba94e4cfd3fc888c"},
+    {file = "pyrsistent-0.19.3-cp38-cp38-win32.whl", hash = "sha256:f0e7c4b2f77593871e918be000b96c8107da48444d57005b6a6bc61fb4331b2c"},
+    {file = "pyrsistent-0.19.3-cp38-cp38-win_amd64.whl", hash = "sha256:c147257a92374fde8498491f53ffa8f4822cd70c0d85037e09028e478cababb7"},
+    {file = "pyrsistent-0.19.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b735e538f74ec31378f5a1e3886a26d2ca6351106b4dfde376a26fc32a044edc"},
+    {file = "pyrsistent-0.19.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99abb85579e2165bd8522f0c0138864da97847875ecbd45f3e7e2af569bfc6f2"},
+    {file = "pyrsistent-0.19.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3a8cb235fa6d3fd7aae6a4f1429bbb1fec1577d978098da1252f0489937786f3"},
+    {file = "pyrsistent-0.19.3-cp39-cp39-win32.whl", hash = "sha256:c74bed51f9b41c48366a286395c67f4e894374306b197e62810e0fdaf2364da2"},
+    {file = "pyrsistent-0.19.3-cp39-cp39-win_amd64.whl", hash = "sha256:878433581fc23e906d947a6814336eee031a00e6defba224234169ae3d3d6a98"},
+    {file = "pyrsistent-0.19.3-py3-none-any.whl", hash = "sha256:ccf0d6bd208f8111179f0c26fdf84ed7c3891982f2edaeae7422575f47e66b64"},
+    {file = "pyrsistent-0.19.3.tar.gz", hash = "sha256:1a2994773706bbb4995c31a97bc94f1418314923bd1048c6d964837040376440"},
+]
+pytest = [
+    {file = "pytest-7.2.1-py3-none-any.whl", hash = "sha256:c7c6ca206e93355074ae32f7403e8ea12163b1163c976fee7d4d84027c162be5"},
+    {file = "pytest-7.2.1.tar.gz", hash = "sha256:d45e0952f3727241918b8fd0f376f5ff6b301cc0777c6f9a556935c92d8a7d42"},
+]
+pytest-html = [
+    {file = "pytest-html-3.2.0.tar.gz", hash = "sha256:c4e2f4bb0bffc437f51ad2174a8a3e71df81bbc2f6894604e604af18fbe687c3"},
+    {file = "pytest_html-3.2.0-py3-none-any.whl", hash = "sha256:868c08564a68d8b2c26866f1e33178419bb35b1e127c33784a28622eb827f3f3"},
+]
+pytest-metadata = [
+    {file = "pytest_metadata-2.0.4-py3-none-any.whl", hash = "sha256:acb739f89fabb3d798c099e9e0c035003062367a441910aaaf2281bc1972ee14"},
+    {file = "pytest_metadata-2.0.4.tar.gz", hash = "sha256:fcc653f65fe3035b478820b5284fbf0f52803622ee3f60a2faed7a7d3ba1f41e"},
+]
+pytest-ordering = [
+    {file = "pytest-ordering-0.6.tar.gz", hash = "sha256:561ad653626bb171da78e682f6d39ac33bb13b3e272d406cd555adb6b006bda6"},
+    {file = "pytest_ordering-0.6-py2-none-any.whl", hash = "sha256:27fba3fc265f5d0f8597e7557885662c1bdc1969497cd58aff6ed21c3b617de2"},
+    {file = "pytest_ordering-0.6-py3-none-any.whl", hash = "sha256:3f314a178dbeb6777509548727dc69edf22d6d9a2867bf2d310ab85c403380b6"},
+]
+pytest-rerunfailures = [
+    {file = "pytest-rerunfailures-11.1.1.tar.gz", hash = "sha256:acab447edff7c29a76b8410207c48da01406a161653c99a325cf5703d44eb162"},
+    {file = "pytest_rerunfailures-11.1.1-py3-none-any.whl", hash = "sha256:4333983de0914f79d942a6ec29332f2c9cfe2d2d47ba2b634f3617b7f9d94f86"},
+]
+pytest-splunk-addon = [
+    {file = "pytest_splunk_addon-5.0.0-py3-none-any.whl", hash = "sha256:3826ff3461d19e73f96659bc23fbc54c8aab733891a5c1659b14db71a5aca7b0"},
+    {file = "pytest_splunk_addon-5.0.0.tar.gz", hash = "sha256:0cc2d43be34e7c1494082ece859771e4c1e7de69cdad89a6a6f7ccb270b97c22"},
+]
+pytest-splunk-addon-ui-smartx = [
+    {file = "pytest_splunk_addon_ui_smartx-2.3.3b1-py3-none-any.whl", hash = "sha256:cbd242a2c7af3a94a145de0ace6fb1c571f11de4dbfd9564c24543fd296a30ed"},
+    {file = "pytest_splunk_addon_ui_smartx-2.3.3b1.tar.gz", hash = "sha256:cd0b4228e3730deb2296f247a828fa29bc6eba589d3cb99c715fa730f66a13d7"},
+]
+pytest-xdist = [
+    {file = "pytest-xdist-3.2.0.tar.gz", hash = "sha256:fa10f95a2564cd91652f2d132725183c3b590d9fdcdec09d3677386ecf4c1ce9"},
+    {file = "pytest_xdist-3.2.0-py3-none-any.whl", hash = "sha256:336098e3bbd8193276867cc87db8b22903c3927665dff9d1ac8684c02f597b68"},
+]
+python-dateutil = [
+    {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"},
+    {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"},
+]
+python-dotenv = [
+    {file = "python-dotenv-0.21.1.tar.gz", hash = "sha256:1c93de8f636cde3ce377292818d0e440b6e45a82f215c3744979151fa8151c49"},
+    {file = "python_dotenv-0.21.1-py3-none-any.whl", hash = "sha256:41e12e0318bebc859fcc4d97d4db8d20ad21721a6aa5047dd59f090391cb549a"},
+]
+python-slugify = [
+    {file = "python-slugify-8.0.0.tar.gz", hash = "sha256:f1da83f3c7ab839b3f84543470cd95bdb5a81f1a0b80fed502f78b7dca256062"},
+    {file = "python_slugify-8.0.0-py2.py3-none-any.whl", hash = "sha256:51f217508df20a6c166c7821683384b998560adcf8f19a6c2ca8b460528ccd9c"},
+]
+pyyaml = [
+    {file = "PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53"},
+    {file = "PyYAML-6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c"},
+    {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc"},
+    {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b"},
+    {file = "PyYAML-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5"},
+    {file = "PyYAML-6.0-cp310-cp310-win32.whl", hash = "sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513"},
+    {file = "PyYAML-6.0-cp310-cp310-win_amd64.whl", hash = "sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a"},
+    {file = "PyYAML-6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d4b0ba9512519522b118090257be113b9468d804b19d63c71dbcf4a48fa32358"},
+    {file = "PyYAML-6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:81957921f441d50af23654aa6c5e5eaf9b06aba7f0a19c18a538dc7ef291c5a1"},
+    {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:afa17f5bc4d1b10afd4466fd3a44dc0e245382deca5b3c353d8b757f9e3ecb8d"},
+    {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dbad0e9d368bb989f4515da330b88a057617d16b6a8245084f1b05400f24609f"},
+    {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:432557aa2c09802be39460360ddffd48156e30721f5e8d917f01d31694216782"},
+    {file = "PyYAML-6.0-cp311-cp311-win32.whl", hash = "sha256:bfaef573a63ba8923503d27530362590ff4f576c626d86a9fed95822a8255fd7"},
+    {file = "PyYAML-6.0-cp311-cp311-win_amd64.whl", hash = "sha256:01b45c0191e6d66c470b6cf1b9531a771a83c1c4208272ead47a3ae4f2f603bf"},
+    {file = "PyYAML-6.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86"},
+    {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f"},
+    {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92"},
+    {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4"},
+    {file = "PyYAML-6.0-cp36-cp36m-win32.whl", hash = "sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293"},
+    {file = "PyYAML-6.0-cp36-cp36m-win_amd64.whl", hash = "sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57"},
+    {file = "PyYAML-6.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c"},
+    {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0"},
+    {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0ce82d761c532fe4ec3f87fc45688bdd3a4c1dc5e0b4a19814b9009a29baefd4"},
+    {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:231710d57adfd809ef5d34183b8ed1eeae3f76459c18fb4a0b373ad56bedcdd9"},
+    {file = "PyYAML-6.0-cp37-cp37m-win32.whl", hash = "sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737"},
+    {file = "PyYAML-6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d"},
+    {file = "PyYAML-6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b"},
+    {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba"},
+    {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34"},
+    {file = "PyYAML-6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287"},
+    {file = "PyYAML-6.0-cp38-cp38-win32.whl", hash = "sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78"},
+    {file = "PyYAML-6.0-cp38-cp38-win_amd64.whl", hash = "sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07"},
+    {file = "PyYAML-6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b"},
+    {file = "PyYAML-6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174"},
+    {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803"},
+    {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3"},
+    {file = "PyYAML-6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0"},
+    {file = "PyYAML-6.0-cp39-cp39-win32.whl", hash = "sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb"},
+    {file = "PyYAML-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c"},
+    {file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"},
+]
+pyyaml-env-tag = [
+    {file = "pyyaml_env_tag-0.1-py3-none-any.whl", hash = "sha256:af31106dec8a4d68c60207c1886031cbf839b68aa7abccdb19868200532c2069"},
+    {file = "pyyaml_env_tag-0.1.tar.gz", hash = "sha256:70092675bda14fdec33b31ba77e7543de9ddc88f2e5b99160396572d11525bdb"},
+]
+regex = [
+    {file = "regex-2022.10.31-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a8ff454ef0bb061e37df03557afda9d785c905dab15584860f982e88be73015f"},
+    {file = "regex-2022.10.31-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1eba476b1b242620c266edf6325b443a2e22b633217a9835a52d8da2b5c051f9"},
+    {file = "regex-2022.10.31-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0e5af9a9effb88535a472e19169e09ce750c3d442fb222254a276d77808620b"},
+    {file = "regex-2022.10.31-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d03fe67b2325cb3f09be029fd5da8df9e6974f0cde2c2ac6a79d2634e791dd57"},
+    {file = "regex-2022.10.31-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a9d0b68ac1743964755ae2d89772c7e6fb0118acd4d0b7464eaf3921c6b49dd4"},
+    {file = "regex-2022.10.31-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a45b6514861916c429e6059a55cf7db74670eaed2052a648e3e4d04f070e001"},
+    {file = "regex-2022.10.31-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8b0886885f7323beea6f552c28bff62cbe0983b9fbb94126531693ea6c5ebb90"},
+    {file = "regex-2022.10.31-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5aefb84a301327ad115e9d346c8e2760009131d9d4b4c6b213648d02e2abe144"},
+    {file = "regex-2022.10.31-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:702d8fc6f25bbf412ee706bd73019da5e44a8400861dfff7ff31eb5b4a1276dc"},
+    {file = "regex-2022.10.31-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:a3c1ebd4ed8e76e886507c9eddb1a891673686c813adf889b864a17fafcf6d66"},
+    {file = "regex-2022.10.31-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:50921c140561d3db2ab9f5b11c5184846cde686bb5a9dc64cae442926e86f3af"},
+    {file = "regex-2022.10.31-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:7db345956ecce0c99b97b042b4ca7326feeec6b75facd8390af73b18e2650ffc"},
+    {file = "regex-2022.10.31-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:763b64853b0a8f4f9cfb41a76a4a85a9bcda7fdda5cb057016e7706fde928e66"},
+    {file = "regex-2022.10.31-cp310-cp310-win32.whl", hash = "sha256:44136355e2f5e06bf6b23d337a75386371ba742ffa771440b85bed367c1318d1"},
+    {file = "regex-2022.10.31-cp310-cp310-win_amd64.whl", hash = "sha256:bfff48c7bd23c6e2aec6454aaf6edc44444b229e94743b34bdcdda2e35126cf5"},
+    {file = "regex-2022.10.31-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4b4b1fe58cd102d75ef0552cf17242705ce0759f9695334a56644ad2d83903fe"},
+    {file = "regex-2022.10.31-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:542e3e306d1669b25936b64917285cdffcd4f5c6f0247636fec037187bd93542"},
+    {file = "regex-2022.10.31-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c27cc1e4b197092e50ddbf0118c788d9977f3f8f35bfbbd3e76c1846a3443df7"},
+    {file = "regex-2022.10.31-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8e38472739028e5f2c3a4aded0ab7eadc447f0d84f310c7a8bb697ec417229e"},
+    {file = "regex-2022.10.31-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:76c598ca73ec73a2f568e2a72ba46c3b6c8690ad9a07092b18e48ceb936e9f0c"},
+    {file = "regex-2022.10.31-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c28d3309ebd6d6b2cf82969b5179bed5fefe6142c70f354ece94324fa11bf6a1"},
+    {file = "regex-2022.10.31-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9af69f6746120998cd9c355e9c3c6aec7dff70d47247188feb4f829502be8ab4"},
+    {file = "regex-2022.10.31-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a5f9505efd574d1e5b4a76ac9dd92a12acb2b309551e9aa874c13c11caefbe4f"},
+    {file = "regex-2022.10.31-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:5ff525698de226c0ca743bfa71fc6b378cda2ddcf0d22d7c37b1cc925c9650a5"},
+    {file = "regex-2022.10.31-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:4fe7fda2fe7c8890d454f2cbc91d6c01baf206fbc96d89a80241a02985118c0c"},
+    {file = "regex-2022.10.31-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:2cdc55ca07b4e70dda898d2ab7150ecf17c990076d3acd7a5f3b25cb23a69f1c"},
+    {file = "regex-2022.10.31-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:44a6c2f6374e0033873e9ed577a54a3602b4f609867794c1a3ebba65e4c93ee7"},
+    {file = "regex-2022.10.31-cp311-cp311-win32.whl", hash = "sha256:d8716f82502997b3d0895d1c64c3b834181b1eaca28f3f6336a71777e437c2af"},
+    {file = "regex-2022.10.31-cp311-cp311-win_amd64.whl", hash = "sha256:61edbca89aa3f5ef7ecac8c23d975fe7261c12665f1d90a6b1af527bba86ce61"},
+    {file = "regex-2022.10.31-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:0a069c8483466806ab94ea9068c34b200b8bfc66b6762f45a831c4baaa9e8cdd"},
+    {file = "regex-2022.10.31-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d26166acf62f731f50bdd885b04b38828436d74e8e362bfcb8df221d868b5d9b"},
+    {file = "regex-2022.10.31-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ac741bf78b9bb432e2d314439275235f41656e189856b11fb4e774d9f7246d81"},
+    {file = "regex-2022.10.31-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:75f591b2055523fc02a4bbe598aa867df9e953255f0b7f7715d2a36a9c30065c"},
+    {file = "regex-2022.10.31-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b30bddd61d2a3261f025ad0f9ee2586988c6a00c780a2fb0a92cea2aa702c54"},
+    {file = "regex-2022.10.31-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ef4163770525257876f10e8ece1cf25b71468316f61451ded1a6f44273eedeb5"},
+    {file = "regex-2022.10.31-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7b280948d00bd3973c1998f92e22aa3ecb76682e3a4255f33e1020bd32adf443"},
+    {file = "regex-2022.10.31-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:d0213671691e341f6849bf33cd9fad21f7b1cb88b89e024f33370733fec58742"},
+    {file = "regex-2022.10.31-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:22e7ebc231d28393dfdc19b185d97e14a0f178bedd78e85aad660e93b646604e"},
+    {file = "regex-2022.10.31-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:8ad241da7fac963d7573cc67a064c57c58766b62a9a20c452ca1f21050868dfa"},
+    {file = "regex-2022.10.31-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:586b36ebda81e6c1a9c5a5d0bfdc236399ba6595e1397842fd4a45648c30f35e"},
+    {file = "regex-2022.10.31-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:0653d012b3bf45f194e5e6a41df9258811ac8fc395579fa82958a8b76286bea4"},
+    {file = "regex-2022.10.31-cp36-cp36m-win32.whl", hash = "sha256:144486e029793a733e43b2e37df16a16df4ceb62102636ff3db6033994711066"},
+    {file = "regex-2022.10.31-cp36-cp36m-win_amd64.whl", hash = "sha256:c14b63c9d7bab795d17392c7c1f9aaabbffd4cf4387725a0ac69109fb3b550c6"},
+    {file = "regex-2022.10.31-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:4cac3405d8dda8bc6ed499557625585544dd5cbf32072dcc72b5a176cb1271c8"},
+    {file = "regex-2022.10.31-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23cbb932cc53a86ebde0fb72e7e645f9a5eec1a5af7aa9ce333e46286caef783"},
+    {file = "regex-2022.10.31-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:74bcab50a13960f2a610cdcd066e25f1fd59e23b69637c92ad470784a51b1347"},
+    {file = "regex-2022.10.31-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:78d680ef3e4d405f36f0d6d1ea54e740366f061645930072d39bca16a10d8c93"},
+    {file = "regex-2022.10.31-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce6910b56b700bea7be82c54ddf2e0ed792a577dfaa4a76b9af07d550af435c6"},
+    {file = "regex-2022.10.31-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:659175b2144d199560d99a8d13b2228b85e6019b6e09e556209dfb8c37b78a11"},
+    {file = "regex-2022.10.31-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:1ddf14031a3882f684b8642cb74eea3af93a2be68893901b2b387c5fd92a03ec"},
+    {file = "regex-2022.10.31-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b683e5fd7f74fb66e89a1ed16076dbab3f8e9f34c18b1979ded614fe10cdc4d9"},
+    {file = "regex-2022.10.31-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:2bde29cc44fa81c0a0c8686992c3080b37c488df167a371500b2a43ce9f026d1"},
+    {file = "regex-2022.10.31-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:4919899577ba37f505aaebdf6e7dc812d55e8f097331312db7f1aab18767cce8"},
+    {file = "regex-2022.10.31-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:9c94f7cc91ab16b36ba5ce476f1904c91d6c92441f01cd61a8e2729442d6fcf5"},
+    {file = "regex-2022.10.31-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ae1e96785696b543394a4e3f15f3f225d44f3c55dafe3f206493031419fedf95"},
+    {file = "regex-2022.10.31-cp37-cp37m-win32.whl", hash = "sha256:c670f4773f2f6f1957ff8a3962c7dd12e4be54d05839b216cb7fd70b5a1df394"},
+    {file = "regex-2022.10.31-cp37-cp37m-win_amd64.whl", hash = "sha256:8e0caeff18b96ea90fc0eb6e3bdb2b10ab5b01a95128dfeccb64a7238decf5f0"},
+    {file = "regex-2022.10.31-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:131d4be09bea7ce2577f9623e415cab287a3c8e0624f778c1d955ec7c281bd4d"},
+    {file = "regex-2022.10.31-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e613a98ead2005c4ce037c7b061f2409a1a4e45099edb0ef3200ee26ed2a69a8"},
+    {file = "regex-2022.10.31-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:052b670fafbe30966bbe5d025e90b2a491f85dfe5b2583a163b5e60a85a321ad"},
+    {file = "regex-2022.10.31-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aa62a07ac93b7cb6b7d0389d8ef57ffc321d78f60c037b19dfa78d6b17c928ee"},
+    {file = "regex-2022.10.31-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5352bea8a8f84b89d45ccc503f390a6be77917932b1c98c4cdc3565137acc714"},
+    {file = "regex-2022.10.31-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:20f61c9944f0be2dc2b75689ba409938c14876c19d02f7585af4460b6a21403e"},
+    {file = "regex-2022.10.31-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:29c04741b9ae13d1e94cf93fca257730b97ce6ea64cfe1eba11cf9ac4e85afb6"},
+    {file = "regex-2022.10.31-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:543883e3496c8b6d58bd036c99486c3c8387c2fc01f7a342b760c1ea3158a318"},
+    {file = "regex-2022.10.31-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b7a8b43ee64ca8f4befa2bea4083f7c52c92864d8518244bfa6e88c751fa8fff"},
+    {file = "regex-2022.10.31-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:6a9a19bea8495bb419dc5d38c4519567781cd8d571c72efc6aa959473d10221a"},
+    {file = "regex-2022.10.31-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:6ffd55b5aedc6f25fd8d9f905c9376ca44fcf768673ffb9d160dd6f409bfda73"},
+    {file = "regex-2022.10.31-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:4bdd56ee719a8f751cf5a593476a441c4e56c9b64dc1f0f30902858c4ef8771d"},
+    {file = "regex-2022.10.31-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8ca88da1bd78990b536c4a7765f719803eb4f8f9971cc22d6ca965c10a7f2c4c"},
+    {file = "regex-2022.10.31-cp38-cp38-win32.whl", hash = "sha256:5a260758454580f11dd8743fa98319bb046037dfab4f7828008909d0aa5292bc"},
+    {file = "regex-2022.10.31-cp38-cp38-win_amd64.whl", hash = "sha256:5e6a5567078b3eaed93558842346c9d678e116ab0135e22eb72db8325e90b453"},
+    {file = "regex-2022.10.31-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5217c25229b6a85049416a5c1e6451e9060a1edcf988641e309dbe3ab26d3e49"},
+    {file = "regex-2022.10.31-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4bf41b8b0a80708f7e0384519795e80dcb44d7199a35d52c15cc674d10b3081b"},
+    {file = "regex-2022.10.31-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0cf0da36a212978be2c2e2e2d04bdff46f850108fccc1851332bcae51c8907cc"},
+    {file = "regex-2022.10.31-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d403d781b0e06d2922435ce3b8d2376579f0c217ae491e273bab8d092727d244"},
+    {file = "regex-2022.10.31-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a37d51fa9a00d265cf73f3de3930fa9c41548177ba4f0faf76e61d512c774690"},
+    {file = "regex-2022.10.31-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4f781ffedd17b0b834c8731b75cce2639d5a8afe961c1e58ee7f1f20b3af185"},
+    {file = "regex-2022.10.31-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d243b36fbf3d73c25e48014961e83c19c9cc92530516ce3c43050ea6276a2ab7"},
+    {file = "regex-2022.10.31-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:370f6e97d02bf2dd20d7468ce4f38e173a124e769762d00beadec3bc2f4b3bc4"},
+    {file = "regex-2022.10.31-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:597f899f4ed42a38df7b0e46714880fb4e19a25c2f66e5c908805466721760f5"},
+    {file = "regex-2022.10.31-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7dbdce0c534bbf52274b94768b3498abdf675a691fec5f751b6057b3030f34c1"},
+    {file = "regex-2022.10.31-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:22960019a842777a9fa5134c2364efaed5fbf9610ddc5c904bd3a400973b0eb8"},
+    {file = "regex-2022.10.31-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:7f5a3ffc731494f1a57bd91c47dc483a1e10048131ffb52d901bfe2beb6102e8"},
+    {file = "regex-2022.10.31-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7ef6b5942e6bfc5706301a18a62300c60db9af7f6368042227ccb7eeb22d0892"},
+    {file = "regex-2022.10.31-cp39-cp39-win32.whl", hash = "sha256:395161bbdbd04a8333b9ff9763a05e9ceb4fe210e3c7690f5e68cedd3d65d8e1"},
+    {file = "regex-2022.10.31-cp39-cp39-win_amd64.whl", hash = "sha256:957403a978e10fb3ca42572a23e6f7badff39aa1ce2f4ade68ee452dc6807692"},
+    {file = "regex-2022.10.31.tar.gz", hash = "sha256:a3a98921da9a1bf8457aeee6a551948a83601689e5ecdd736894ea9bbec77e83"},
+]
+requests = [
+    {file = "requests-2.28.2-py3-none-any.whl", hash = "sha256:64299f4909223da747622c030b781c0d7811e359c37124b4bd368fb8c6518baa"},
+    {file = "requests-2.28.2.tar.gz", hash = "sha256:98b1b2782e3c6c4904938b84c0eb932721069dfdb9134313beff7c83c2df24bf"},
+]
+selenium = [
+    {file = "selenium-3.141.0-py2.py3-none-any.whl", hash = "sha256:2d7131d7bc5a5b99a2d9b04aaf2612c411b03b8ca1b1ee8d3de5845a9be2cb3c"},
+    {file = "selenium-3.141.0.tar.gz", hash = "sha256:deaf32b60ad91a4611b98d8002757f29e6f2c2d5fcaf202e1c9ad06d6772300d"},
+]
+six = [
+    {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"},
+    {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"},
+]
+splunk-sdk = [
+    {file = "splunk-sdk-1.7.3.tar.gz", hash = "sha256:21c4564095e04857b8c206db8197cdda64708bf7b6cefddf2fd9ac88cfd45196"},
+]
+splunksplwrapper = [
+    {file = "splunksplwrapper-1.0.1-py3-none-any.whl", hash = "sha256:3ba28266a6a093d2c39ccdf56edbd6528a84abebd0b7ff23cf24244a43a8f14d"},
+    {file = "splunksplwrapper-1.0.1.tar.gz", hash = "sha256:d6102ab03fea642ed445adf38f11a151668e07a1a2dd5f2c1ff62d8c5626414e"},
+]
+text-unidecode = [
+    {file = "text-unidecode-1.3.tar.gz", hash = "sha256:bad6603bb14d279193107714b288be206cac565dfa49aa5b105294dd5c4aab93"},
+    {file = "text_unidecode-1.3-py2.py3-none-any.whl", hash = "sha256:1311f10e8b895935241623731c2ba64f4c455287888b18189350b67134a822e8"},
+]
+tomli = [
+    {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"},
+    {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"},
+]
+tqdm = [
+    {file = "tqdm-4.65.0-py3-none-any.whl", hash = "sha256:c4f53a17fe37e132815abceec022631be8ffe1b9381c2e6e30aa70edc99e9671"},
+    {file = "tqdm-4.65.0.tar.gz", hash = "sha256:1871fb68a86b8fb3b59ca4cdd3dcccbc7e6d613eeed31f4c332531977b89beb5"},
+]
+typing-extensions = [
+    {file = "typing_extensions-4.4.0-py3-none-any.whl", hash = "sha256:16fa4864408f655d35ec496218b85f79b3437c829e93320c7c9215ccfd92489e"},
+    {file = "typing_extensions-4.4.0.tar.gz", hash = "sha256:1511434bb92bf8dd198c12b1cc812e800d4181cfcb867674e0f8279cc93087aa"},
+]
+urllib3 = [
+    {file = "urllib3-1.26.14-py2.py3-none-any.whl", hash = "sha256:75edcdc2f7d85b137124a6c3c9fc3933cdeaa12ecb9a6a959f22797a0feca7e1"},
+    {file = "urllib3-1.26.14.tar.gz", hash = "sha256:076907bf8fd355cde77728471316625a4d2f7e713c125f51953bb5b3eecf4f72"},
+]
+watchdog = [
+    {file = "watchdog-2.2.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a09483249d25cbdb4c268e020cb861c51baab2d1affd9a6affc68ffe6a231260"},
+    {file = "watchdog-2.2.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5100eae58133355d3ca6c1083a33b81355c4f452afa474c2633bd2fbbba398b3"},
+    {file = "watchdog-2.2.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e618a4863726bc7a3c64f95c218437f3349fb9d909eb9ea3a1ed3b567417c661"},
+    {file = "watchdog-2.2.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:102a60093090fc3ff76c983367b19849b7cc24ec414a43c0333680106e62aae1"},
+    {file = "watchdog-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:748ca797ff59962e83cc8e4b233f87113f3cf247c23e6be58b8a2885c7337aa3"},
+    {file = "watchdog-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6ccd8d84b9490a82b51b230740468116b8205822ea5fdc700a553d92661253a3"},
+    {file = "watchdog-2.2.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:6e01d699cd260d59b84da6bda019dce0a3353e3fcc774408ae767fe88ee096b7"},
+    {file = "watchdog-2.2.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8586d98c494690482c963ffb24c49bf9c8c2fe0589cec4dc2f753b78d1ec301d"},
+    {file = "watchdog-2.2.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:adaf2ece15f3afa33a6b45f76b333a7da9256e1360003032524d61bdb4c422ae"},
+    {file = "watchdog-2.2.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:83a7cead445008e880dbde833cb9e5cc7b9a0958edb697a96b936621975f15b9"},
+    {file = "watchdog-2.2.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f8ac23ff2c2df4471a61af6490f847633024e5aa120567e08d07af5718c9d092"},
+    {file = "watchdog-2.2.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:d0f29fd9f3f149a5277929de33b4f121a04cf84bb494634707cfa8ea8ae106a8"},
+    {file = "watchdog-2.2.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:967636031fa4c4955f0f3f22da3c5c418aa65d50908d31b73b3b3ffd66d60640"},
+    {file = "watchdog-2.2.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:96cbeb494e6cbe3ae6aacc430e678ce4b4dd3ae5125035f72b6eb4e5e9eb4f4e"},
+    {file = "watchdog-2.2.1-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:61fdb8e9c57baf625e27e1420e7ca17f7d2023929cd0065eb79c83da1dfbeacd"},
+    {file = "watchdog-2.2.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:4cb5ecc332112017fbdb19ede78d92e29a8165c46b68a0b8ccbd0a154f196d5e"},
+    {file = "watchdog-2.2.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a480d122740debf0afac4ddd583c6c0bb519c24f817b42ed6f850e2f6f9d64a8"},
+    {file = "watchdog-2.2.1-py3-none-manylinux2014_aarch64.whl", hash = "sha256:978a1aed55de0b807913b7482d09943b23a2d634040b112bdf31811a422f6344"},
+    {file = "watchdog-2.2.1-py3-none-manylinux2014_armv7l.whl", hash = "sha256:8c28c23972ec9c524967895ccb1954bc6f6d4a557d36e681a36e84368660c4ce"},
+    {file = "watchdog-2.2.1-py3-none-manylinux2014_i686.whl", hash = "sha256:c27d8c1535fd4474e40a4b5e01f4ba6720bac58e6751c667895cbc5c8a7af33c"},
+    {file = "watchdog-2.2.1-py3-none-manylinux2014_ppc64.whl", hash = "sha256:d6b87477752bd86ac5392ecb9eeed92b416898c30bd40c7e2dd03c3146105646"},
+    {file = "watchdog-2.2.1-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:cece1aa596027ff56369f0b50a9de209920e1df9ac6d02c7f9e5d8162eb4f02b"},
+    {file = "watchdog-2.2.1-py3-none-manylinux2014_s390x.whl", hash = "sha256:8b5cde14e5c72b2df5d074774bdff69e9b55da77e102a91f36ef26ca35f9819c"},
+    {file = "watchdog-2.2.1-py3-none-manylinux2014_x86_64.whl", hash = "sha256:e038be858425c4f621900b8ff1a3a1330d9edcfeaa1c0468aeb7e330fb87693e"},
+    {file = "watchdog-2.2.1-py3-none-win32.whl", hash = "sha256:bc43c1b24d2f86b6e1cc15f68635a959388219426109233e606517ff7d0a5a73"},
+    {file = "watchdog-2.2.1-py3-none-win_amd64.whl", hash = "sha256:17f1708f7410af92ddf591e94ae71a27a13974559e72f7e9fde3ec174b26ba2e"},
+    {file = "watchdog-2.2.1-py3-none-win_ia64.whl", hash = "sha256:195ab1d9d611a4c1e5311cbf42273bc541e18ea8c32712f2fb703cfc6ff006f9"},
+    {file = "watchdog-2.2.1.tar.gz", hash = "sha256:cdcc23c9528601a8a293eb4369cbd14f6b4f34f07ae8769421252e9c22718b6f"},
+]
+webdriver-manager = [
+    {file = "webdriver_manager-3.8.5-py2.py3-none-any.whl", hash = "sha256:2d807ec270d2d990022b86efabd4096053e0a1e7a34c6174f9937320dfdc6826"},
+    {file = "webdriver_manager-3.8.5.tar.gz", hash = "sha256:e671f3b738af52351341d6df6674c2f0b959db0fe978e9a7135cfa36d1ad9560"},
+]
+xmlschema = [
+    {file = "xmlschema-1.11.3-py3-none-any.whl", hash = "sha256:56cb8c028457fa8948587339a1c3fa75a0317472ab6710f34ba2c0cb57d6b710"},
+    {file = "xmlschema-1.11.3.tar.gz", hash = "sha256:28a135028f7ab1e0c934fc0c6717a66b2dc5f166d123dfe6ce61afc671ad113f"},
+]
+xmltodict = [
+    {file = "xmltodict-0.13.0-py2.py3-none-any.whl", hash = "sha256:aa89e8fd76320154a40d19a0df04a4695fb9dc5ba977cbb68ab3e4eb225e7852"},
+    {file = "xmltodict-0.13.0.tar.gz", hash = "sha256:341595a488e3e01a85a9d8911d8912fd922ede5fecc4dce437eb4b6c8d037e56"},
+]
+zipp = [
+    {file = "zipp-3.12.1-py3-none-any.whl", hash = "sha256:6c4fe274b8f85ec73c37a8e4e3fa00df9fb9335da96fb789e3b96b318e5097b3"},
+    {file = "zipp-3.12.1.tar.gz", hash = "sha256:a3cac813d40993596b39ea9e93a18e8a2076d5c378b8bc88ec32ab264e04ad02"},
+]
diff --git a/pyproject.toml b/pyproject.toml
index e0bd21226..eb1f42ccb 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -43,14 +43,15 @@ jsonschema = "^4.4.0"
 PyYAML = "^6.0"
 cookiecutter = "^2.1.1"
 openapi3 = "^1.7.0"
+mkdocs-material = "^9.0.15"
 
 [tool.poetry.dev-dependencies]
-pytest = "^6.2"
 mkdocs = "^1.4.2"
-mkdocs-material = "^8.5.10"
-pytest-splunk-addon-ui-smartx = "^2.3.0"
-pytest-splunk-addon = "^4.0.3"
 importlib-metadata = {version="*", python="<3.8"}
+pytest = "^7.2.1"
+pytest-splunk-addon = "^5.0.0"
+pytest-splunk-addon-ui-smartx = "2.3.3b1"
+pytest-rerunfailures = "^11.1.1"
 
 [tool.poetry.scripts]
 ucc-gen="splunk_add_on_ucc_framework.main:main"
diff --git a/run_splunk.sh b/run_splunk.sh
index 26e8ef034..f8b856303 100755
--- a/run_splunk.sh
+++ b/run_splunk.sh
@@ -13,4 +13,15 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 #
-docker run -v "$PWD/output:/opt/splunk/etc/apps/" -p 8000:8000 -p 8088:8088 -p 8089:8089 -p 9997:9997 -e "SPLUNK_START_ARGS=--accept-license" -e "SPLUNK_PASSWORD=Chang3d!" -e "SPLUNK_HEC_TOKEN=4a8a737d-5452-426c-a6f7-106dca4e813f" -d --rm --name splunk splunk/splunk:latest
+docker run \
+  -v "$PWD/output:/opt/splunk/etc/apps/" \
+  -p 8000:8000 \
+  -p 8088:8088 \
+  -p 8089:8089 \
+  -p 9997:9997 \
+  -e "SPLUNK_START_ARGS=--accept-license" \
+  -e "SPLUNK_PASSWORD=Chang3d!" \
+  -e "SPLUNK_HEC_TOKEN=4a8a737d-5452-426c-a6f7-106dca4e813f" \
+  -d \
+  --rm \
+  --name splunk splunk/splunk:${1:-latest}
diff --git a/splunk_add_on_ucc_framework/__init__.py b/splunk_add_on_ucc_framework/__init__.py
index ad79413e7..a1e834918 100644
--- a/splunk_add_on_ucc_framework/__init__.py
+++ b/splunk_add_on_ucc_framework/__init__.py
@@ -17,8 +17,6 @@
 
 import logging
 
-from splunk_add_on_ucc_framework.commands import build
-
 logger = logging.getLogger("ucc_gen")
 logger.setLevel(logging.INFO)
 formatter = logging.Formatter("%(asctime)s %(levelname)s: %(message)s")
@@ -26,14 +24,3 @@
 stream_handler.setLevel(logging.INFO)
 stream_handler.setFormatter(formatter)
 logger.addHandler(stream_handler)
-
-
-def generate(
-    source="package",
-    config=None,
-    ta_version=None,
-    outputdir=None,
-    python_binary_name="python3",
-    openapi=True,
-):
-    build.generate(source, config, ta_version, outputdir, python_binary_name, openapi)
diff --git a/splunk_add_on_ucc_framework/app_conf.py b/splunk_add_on_ucc_framework/app_conf.py
index 1c3dae304..1a6b6406a 100644
--- a/splunk_add_on_ucc_framework/app_conf.py
+++ b/splunk_add_on_ucc_framework/app_conf.py
@@ -14,9 +14,12 @@
 # limitations under the License.
 #
 import time
-from typing import IO
+from typing import Sequence
 
 import addonfactory_splunk_conf_parser_lib as conf_parser
+from splunk_add_on_ucc_framework import app_manifest as app_manifest_lib
+
+APP_CONF_FILE_NAME = "app.conf"
 
 
 class AppConf:
@@ -26,7 +29,12 @@ def __init__(self):
     def read(self, path: str) -> None:
         self._app_conf.read(path)
 
-    def update(self, version: str, name: str, description: str, title: str) -> None:
+    def update(
+        self,
+        version: str,
+        app_manifest: app_manifest_lib.AppManifest,
+        conf_file_names: Sequence[str],
+    ) -> None:
         if "launcher" not in self._app_conf:
             self._app_conf.add_section("launcher")
         if "id" not in self._app_conf:
@@ -37,13 +45,25 @@ def update(self, version: str, name: str, description: str, title: str) -> None:
             self._app_conf.add_section("package")
         if "ui" not in self._app_conf:
             self._app_conf.add_section("ui")
+        if "triggers" not in self._app_conf and conf_file_names:
+            self._app_conf.add_section("triggers")
 
         self._app_conf["launcher"]["version"] = version
-        self._app_conf["launcher"]["description"] = description
+        self._app_conf["launcher"]["description"] = app_manifest.get_description()
+        authors = app_manifest.get_authors()
+        first_author = authors[0]
+        self._app_conf["launcher"]["author"] = first_author["name"]
         self._app_conf["id"]["version"] = version
+        self._app_conf["id"]["name"] = app_manifest.get_addon_name()
         self._app_conf["install"]["build"] = str(int(time.time()))
-        self._app_conf["package"]["id"] = name
-        self._app_conf["ui"]["label"] = title
+        self._app_conf["install"]["is_configured"] = "true"
+        self._app_conf["install"]["state"] = "enabled"
+        self._app_conf["package"]["id"] = app_manifest.get_addon_name()
+        self._app_conf["ui"]["label"] = app_manifest.get_title()
+        self._app_conf["ui"]["is_visible"] = "true"
+        for conf_file_name in conf_file_names:
+            self._app_conf["triggers"][f"reload.{conf_file_name}"] = "simple"
 
-    def write(self, fd: IO) -> None:
-        self._app_conf.write(fd)
+    def write(self, path: str) -> None:
+        with open(path, "w") as fd:
+            self._app_conf.write(fd)
diff --git a/splunk_add_on_ucc_framework/commands/build.py b/splunk_add_on_ucc_framework/commands/build.py
index ac6e56583..0f23eede8 100644
--- a/splunk_add_on_ucc_framework/commands/build.py
+++ b/splunk_add_on_ucc_framework/commands/build.py
@@ -26,15 +26,20 @@
 
 from splunk_add_on_ucc_framework import (
     __version__,
-    app_conf,
     exceptions,
     global_config_update,
     global_config_validator,
-    meta_conf,
     utils,
 )
+from splunk_add_on_ucc_framework import app_conf as app_conf_lib
+from splunk_add_on_ucc_framework import meta_conf as meta_conf_lib
+from splunk_add_on_ucc_framework import server_conf as server_conf_lib
 from splunk_add_on_ucc_framework import app_manifest as app_manifest_lib
 from splunk_add_on_ucc_framework import global_config as global_config_lib
+from splunk_add_on_ucc_framework import normalize
+from splunk_add_on_ucc_framework.commands.modular_alert_builder import (
+    generate_alerts,
+)
 from splunk_add_on_ucc_framework.commands.rest_builder import (
     global_config_builder_schema,
     global_config_post_processor,
@@ -44,7 +49,6 @@
     SplunktaucclibNotFound,
     install_python_libraries,
 )
-from splunk_add_on_ucc_framework.start_alert_build import alert_build
 from splunk_add_on_ucc_framework.commands.openapi_generator import (
     ucc_to_oas,
 )
@@ -54,6 +58,7 @@
 
 PARENT_DIR = ".."
 internal_root_dir = os.path.dirname(os.path.dirname(__file__))
+# nosemgrep: splunk.autoescape-disabled
 j2_env = Environment(
     loader=FileSystemLoader(os.path.join(internal_root_dir, "templates"))
 )
@@ -297,15 +302,16 @@ def _make_modular_alerts(
         global_config: Object representing globalConfig.
         outputdir: Output directory.
     """
-
-    if global_config.content.get("alerts"):
-        alert_build(
-            {"alerts": global_config.content["alerts"]},
+    if global_config.has_alerts():
+        envs = normalize.normalize(
+            {
+                "alerts": global_config.alerts,
+            },
             ta_name,
             global_config.namespace,
-            outputdir,
-            internal_root_dir,
         )
+        logger.info("Generating alerts code")
+        generate_alerts(internal_root_dir, outputdir, envs)
 
 
 def _get_ignore_list(ta_name, path):
@@ -422,24 +428,23 @@ def _get_addon_version(addon_version: Optional[str]) -> str:
 
 
 def generate(
-    source,
-    config_path,
-    addon_version,
-    outputdir=None,
-    python_binary_name="python3",
-    openapi=True,
+    source: str,
+    config_path: Optional[str] = None,
+    addon_version: Optional[str] = None,
+    output_directory: Optional[str] = None,
+    python_binary_name: str = "python3",
 ):
     logger.info(f"ucc-gen version {__version__} is used")
     logger.info(f"Python binary name to use: {python_binary_name}")
-    if outputdir is None:
-        outputdir = os.path.join(os.getcwd(), "output")
+    if output_directory is None:
+        output_directory = os.path.join(os.getcwd(), "output")
     addon_version = _get_addon_version(addon_version)
+    logger.info(f"Add-on will be built with version '{addon_version}'")
     if not os.path.exists(source):
         raise NotADirectoryError(f"{os.path.abspath(source)} not found.")
-    logger.info(f"Cleaning out directory {outputdir}")
-    shutil.rmtree(os.path.join(outputdir), ignore_errors=True)
-    os.makedirs(os.path.join(outputdir))
-    logger.info(f"Cleaned out directory {outputdir}")
+    shutil.rmtree(os.path.join(output_directory), ignore_errors=True)
+    os.makedirs(os.path.join(output_directory))
+    logger.info(f"Cleaned out directory {output_directory}")
     app_manifest_path = os.path.abspath(
         os.path.join(source, app_manifest_lib.APP_MANIFEST_FILE_NAME),
     )
@@ -468,6 +473,7 @@ def generate(
         is_global_config_yaml = True if config_path.endswith(".yaml") else False
 
     if os.path.isfile(config_path):
+        logger.info(f"Using globalConfig file located @ {config_path}")
         global_config = global_config_lib.GlobalConfig()
         global_config.parse(config_path, is_global_config_yaml)
         try:
@@ -481,22 +487,23 @@ def generate(
             sys.exit(1)
         global_config.update_addon_version(addon_version)
         global_config.dump(global_config.original_path)
+        logger.info(
+            f"Updated and saved add-on version in the globalConfig file to {addon_version}"
+        )
         global_config_update.handle_global_config_update(global_config)
         scheme = global_config_builder_schema.GlobalConfigBuilderSchema(
             global_config, j2_env
         )
-        logger.info(f"Building add-on with version {addon_version}")
-        logger.info(f"Package ID is {ta_name}")
-        logger.info("Copy UCC template directory")
         _recursive_overwrite(
-            os.path.join(internal_root_dir, "package"), os.path.join(outputdir, ta_name)
+            os.path.join(internal_root_dir, "package"),
+            os.path.join(output_directory, ta_name),
         )
-        logger.info("Copy globalConfig to output")
+        logger.info("Copied UCC template directory")
         global_config_file = (
             "globalConfig.yaml" if is_global_config_yaml else "globalConfig.json"
         )
         output_global_config_path = os.path.join(
-            outputdir,
+            output_directory,
             ta_name,
             "appserver",
             "static",
@@ -508,8 +515,8 @@ def generate(
             config_path,
             output_global_config_path,
         )
-        ucc_lib_target = os.path.join(outputdir, ta_name, "lib")
-        logger.info(f"Install add-on requirements into {ucc_lib_target} from {source}")
+        logger.info("Copied globalConfig to output")
+        ucc_lib_target = os.path.join(output_directory, ta_name, "lib")
         try:
             install_python_libraries(
                 source, ucc_lib_target, python_binary_name, includes_ui=True
@@ -517,16 +524,19 @@ def generate(
         except SplunktaucclibNotFound as e:
             logger.error(str(e))
             sys.exit(1)
-        _replace_token(ta_name, outputdir)
-        _generate_rest(ta_name, scheme, outputdir)
+        logger.info(
+            f"Installed add-on requirements into {ucc_lib_target} from {source}"
+        )
+        _replace_token(ta_name, output_directory)
+        _generate_rest(ta_name, scheme, output_directory)
         _modify_and_replace_token_for_oauth_templates(
             ta_name,
             global_config,
-            outputdir,
+            output_directory,
         )
         if global_config.has_inputs():
             default_no_input_xml_file = os.path.join(
-                outputdir,
+                output_directory,
                 ta_name,
                 "default",
                 "data",
@@ -535,61 +545,96 @@ def generate(
                 "default_no_input.xml",
             )
             os.remove(default_no_input_xml_file)
-            _add_modular_input(ta_name, global_config, outputdir)
+            _add_modular_input(ta_name, global_config, output_directory)
         else:
-            _handle_no_inputs(ta_name, outputdir)
-        _make_modular_alerts(ta_name, global_config, outputdir)
+            _handle_no_inputs(ta_name, output_directory)
+        _make_modular_alerts(ta_name, global_config, output_directory)
+
+        conf_file_names = []
+        conf_file_names.extend(list(scheme.settings_conf_file_names))
+        conf_file_names.extend(list(scheme.configs_conf_file_names))
+        conf_file_names.extend(list(scheme.oauth_conf_file_names))
+
+        source_server_conf_path = os.path.join(source, "default", "server.conf")
+        # For now, only create server.conf only if no server.conf is present in
+        # the source package.
+        if not os.path.isfile(source_server_conf_path):
+            server_conf = server_conf_lib.ServerConf()
+            server_conf.create_default(conf_file_names)
+            output_server_conf_path = os.path.join(
+                output_directory,
+                ta_name,
+                "default",
+                server_conf_lib.SERVER_CONF_FILE_NAME,
+            )
+            server_conf.write(output_server_conf_path)
+            logger.info(
+                f"Created default {server_conf_lib.SERVER_CONF_FILE_NAME} file in the output folder"
+            )
     else:
-        logger.info(f"Building add-on with version {addon_version}")
+        global_config = None
+        conf_file_names = []
         logger.warning(
-            "Skipped generating UI components as globalConfig file does not exist."
+            "Skipped generating UI components as globalConfig file does not exist"
         )
-        ucc_lib_target = os.path.join(outputdir, ta_name, "lib")
-
-        logger.info(f"Install add-on requirements into {ucc_lib_target} from {source}")
+        ucc_lib_target = os.path.join(output_directory, ta_name, "lib")
         install_python_libraries(source, ucc_lib_target, python_binary_name)
+        logger.info(
+            f"Installed add-on requirements into {ucc_lib_target} from {source}"
+        )
 
     ignore_list = _get_ignore_list(
         ta_name, os.path.abspath(os.path.join(source, PARENT_DIR, ".uccignore"))
     )
     _remove_listed_files(ignore_list)
-    logger.info("Copy package directory")
-    _recursive_overwrite(source, os.path.join(outputdir, ta_name))
+    if ignore_list:
+        logger.info(f"Removed {ignore_list} files")
+    _recursive_overwrite(source, os.path.join(output_directory, ta_name))
+    logger.info("Copied package directory")
 
     default_meta_conf_path = os.path.join(
-        outputdir, ta_name, "metadata", "default.meta"
+        output_directory, ta_name, "metadata", meta_conf_lib.DEFAULT_META_FILE_NAME
     )
     if not os.path.exists(default_meta_conf_path):
-        os.makedirs(os.path.join(outputdir, ta_name, "metadata"), exist_ok=True)
-        with open(default_meta_conf_path, "w") as default_meta_conf_fd:
-            meta_conf.MetaConf().create_default(default_meta_conf_fd)
+        os.makedirs(os.path.join(output_directory, ta_name, "metadata"), exist_ok=True)
+        meta_conf = meta_conf_lib.MetaConf()
+        meta_conf.create_default()
+        meta_conf.write(default_meta_conf_path)
+        logger.info(
+            f"Created default {meta_conf_lib.DEFAULT_META_FILE_NAME} file in the output folder"
+        )
 
-    with open(os.path.join(outputdir, ta_name, "VERSION"), "w") as version_file:
+    with open(os.path.join(output_directory, ta_name, "VERSION"), "w") as version_file:
         version_file.write(addon_version)
         version_file.write("\n")
         version_file.write(addon_version)
+        logger.info("Updated VERSION file")
 
     app_manifest.update_addon_version(addon_version)
     output_manifest_path = os.path.abspath(
-        os.path.join(outputdir, ta_name, app_manifest_lib.APP_MANIFEST_FILE_NAME)
+        os.path.join(output_directory, ta_name, app_manifest_lib.APP_MANIFEST_FILE_NAME)
     )
     with open(output_manifest_path, "w") as manifest_file:
         manifest_file.write(str(app_manifest))
+        logger.info(
+            f"Updated {app_manifest_lib.APP_MANIFEST_FILE_NAME} file in the output folder"
+        )
 
-    app_config = app_conf.AppConf()
-    path = os.path.join(outputdir, ta_name, "default", "app.conf")
-    app_config.read(path)
-    app_config.update(
-        addon_version, ta_name, app_manifest.get_description(), app_manifest.get_title()
+    app_conf = app_conf_lib.AppConf()
+    output_app_conf_path = os.path.join(
+        output_directory, ta_name, "default", app_conf_lib.APP_CONF_FILE_NAME
     )
-    with open(path, "w") as app_conf_fd:
-        app_config.write(app_conf_fd)
+    app_conf.read(output_app_conf_path)
+    app_conf.update(addon_version, app_manifest, conf_file_names)
+    app_conf.write(output_app_conf_path)
+    logger.info(f"Updated {app_conf_lib.APP_CONF_FILE_NAME} file in the output folder")
 
     license_dir = os.path.abspath(os.path.join(source, PARENT_DIR, "LICENSES"))
-
     if os.path.exists(license_dir):
         logger.info("Copy LICENSES directory")
-        _recursive_overwrite(license_dir, os.path.join(outputdir, ta_name, "LICENSES"))
+        _recursive_overwrite(
+            license_dir, os.path.join(output_directory, ta_name, "LICENSES")
+        )
 
     if os.path.exists(
         os.path.abspath(os.path.join(source, PARENT_DIR, "additional_packaging.py"))
@@ -599,13 +644,13 @@ def generate(
 
         additional_packaging(ta_name)
 
-    if os.path.isfile(config_path) and openapi:
+    if global_config:
         logger.info("Generating OpenAPI file")
         open_api_object = ucc_to_oas.transform(global_config, app_manifest)
         open_api = OpenAPI(open_api_object.json)
 
         output_openapi_folder = os.path.abspath(
-            os.path.join(outputdir, ta_name, "static")
+            os.path.join(output_directory, ta_name, "static")
         )
         output_openapi_path = os.path.join(output_openapi_folder, "openapi.json")
         if not os.path.isdir(output_openapi_folder):
diff --git a/splunk_add_on_ucc_framework/commands/init.py b/splunk_add_on_ucc_framework/commands/init.py
index 9e86ece92..5fe747dc4 100644
--- a/splunk_add_on_ucc_framework/commands/init.py
+++ b/splunk_add_on_ucc_framework/commands/init.py
@@ -15,6 +15,7 @@
 #
 import logging
 import os
+import sys
 
 from cookiecutter import exceptions, main
 
@@ -27,7 +28,7 @@ def init(
     addon_input_name: str,
     addon_version: str,
     overwrite: bool = False,
-):
+) -> str:
     try:
         generated_addon_path = main.cookiecutter(
             template=os.path.join(
@@ -48,8 +49,10 @@ def init(
             "LICENSE.txt and README.txt are empty, "
             "you may need to modify the content of those files. "
         )
+        return generated_addon_path
     except exceptions.OutputDirExistsException:
         logger.error(
             "The location is already taken, use `--overwrite` "
             "option to overwrite the content of existing folder."
         )
+        sys.exit(1)
diff --git a/splunk_add_on_ucc_framework/commands/init_template/{{cookiecutter.addon_name}}/package/default/app.conf b/splunk_add_on_ucc_framework/commands/init_template/{{cookiecutter.addon_name}}/package/default/app.conf
deleted file mode 100644
index 3b554e0ea..000000000
--- a/splunk_add_on_ucc_framework/commands/init_template/{{cookiecutter.addon_name}}/package/default/app.conf
+++ /dev/null
@@ -1,23 +0,0 @@
-[install]
-is_configured = false
-state = enabled
-build = 1
-
-[launcher]
-description = {{cookiecutter.addon_display_name}}
-version = {{cookiecutter.addon_version}}
-
-[ui]
-is_visible = true
-label = {{cookiecutter.addon_display_name}}
-
-[package]
-id = {{cookiecutter.addon_name}}
-
-[id]
-name = {{cookiecutter.addon_name}}
-version = {{cookiecutter.addon_version}}
-
-[triggers]
-reload.{{cookiecutter.addon_name}}_settings = simple
-reload.{{cookiecutter.addon_name}}_account = simple
diff --git a/splunk_add_on_ucc_framework/commands/init_template/{{cookiecutter.addon_name}}/package/default/server.conf b/splunk_add_on_ucc_framework/commands/init_template/{{cookiecutter.addon_name}}/package/default/server.conf
deleted file mode 100644
index cfcc16cc0..000000000
--- a/splunk_add_on_ucc_framework/commands/init_template/{{cookiecutter.addon_name}}/package/default/server.conf
+++ /dev/null
@@ -1,3 +0,0 @@
-[shclustering]
-conf_replication_include.{{cookiecutter.addon_name}}_settings = true
-conf_replication_include.{{cookiecutter.addon_name}}_account = true
diff --git a/splunk_add_on_ucc_framework/commands/init_template/{{cookiecutter.addon_name}}/package/default/{{cookiecutter.addon_name}}_settings.conf b/splunk_add_on_ucc_framework/commands/init_template/{{cookiecutter.addon_name}}/package/default/{{cookiecutter.addon_name}}_settings.conf
deleted file mode 100644
index f2566d453..000000000
--- a/splunk_add_on_ucc_framework/commands/init_template/{{cookiecutter.addon_name}}/package/default/{{cookiecutter.addon_name}}_settings.conf
+++ /dev/null
@@ -1,2 +0,0 @@
-[logging]
-loglevel = INFO
diff --git a/splunk_add_on_ucc_framework/commands/modular_alert_builder/__init__.py b/splunk_add_on_ucc_framework/commands/modular_alert_builder/__init__.py
new file mode 100644
index 000000000..89117be8e
--- /dev/null
+++ b/splunk_add_on_ucc_framework/commands/modular_alert_builder/__init__.py
@@ -0,0 +1,83 @@
+#
+# Copyright 2021 Splunk Inc.
+#
+# 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.
+#
+import logging
+import os
+import shutil
+
+from splunk_add_on_ucc_framework.commands.modular_alert_builder.alert_actions_conf_gen import (
+    generate_alert_actions_conf,
+)
+from splunk_add_on_ucc_framework.commands.modular_alert_builder.alert_actions_html_gen import (
+    generate_alert_actions_html_files,
+)
+from splunk_add_on_ucc_framework.commands.modular_alert_builder.alert_actions_py_gen import (
+    generate_alert_actions_py_files,
+)
+
+logger = logging.getLogger("ucc_gen")
+
+
+def _copy_alert_icon_to_output(
+    internal_root_dir: str,
+    output_directory: str,
+    addon_name: str,
+):
+    shutil.copy(
+        os.path.join(internal_root_dir, "static", "alerticon.png"),
+        os.path.join(output_directory, addon_name, "appserver", "static"),
+    )
+
+
+def generate_alerts(internal_source_dir: str, output_dir: str, envs):
+    output_content = {}
+    conf_return = None
+    html_return = None
+    py_return = None
+    global_settings = envs["global_settings"]
+
+    _copy_alert_icon_to_output(internal_source_dir, output_dir, envs["product_id"])
+    package_dir = os.path.join(output_dir, envs["product_id"])
+
+    build_components = envs["build_components"]
+    if build_components["conf"]:
+        conf_return = generate_alert_actions_conf(
+            input_setting=envs["schema.content"],
+            package_path=package_dir,
+            global_settings=global_settings,
+        )
+
+    if build_components["html"]:
+        html_return = generate_alert_actions_html_files(
+            input_setting=envs["schema.content"],
+            package_path=package_dir,
+            html_setting=envs["html_setting"],
+        )
+
+    if build_components["py"]:
+        py_return = generate_alert_actions_py_files(
+            input_setting=envs["schema.content"],
+            package_path=package_dir,
+            global_settings=global_settings,
+        )
+
+    if conf_return:
+        output_content["conf"] = conf_return
+    if html_return:
+        output_content["html"] = conf_return
+    if py_return:
+        output_content["py"] = py_return
+
+    return output_content
diff --git a/splunk_add_on_ucc_framework/modular_alert_builder/build_core/alert_actions_conf_gen.py b/splunk_add_on_ucc_framework/commands/modular_alert_builder/alert_actions_conf_gen.py
similarity index 92%
rename from splunk_add_on_ucc_framework/modular_alert_builder/build_core/alert_actions_conf_gen.py
rename to splunk_add_on_ucc_framework/commands/modular_alert_builder/alert_actions_conf_gen.py
index 71a25b19e..53d722999 100644
--- a/splunk_add_on_ucc_framework/modular_alert_builder/build_core/alert_actions_conf_gen.py
+++ b/splunk_add_on_ucc_framework/commands/modular_alert_builder/alert_actions_conf_gen.py
@@ -23,16 +23,16 @@
 
 from jinja2 import Environment, FileSystemLoader
 
-from splunk_add_on_ucc_framework.modular_alert_builder.build_core import (
+from splunk_add_on_ucc_framework.commands.modular_alert_builder import (
     alert_actions_exceptions as aae,
 )
-from splunk_add_on_ucc_framework.modular_alert_builder.build_core import (
+from splunk_add_on_ucc_framework.commands.modular_alert_builder import (
     arf_consts as ac,
 )
-from splunk_add_on_ucc_framework.modular_alert_builder.build_core.alert_actions_helper import (
+from splunk_add_on_ucc_framework.commands.modular_alert_builder.alert_actions_helper import (
     write_file,
 )
-from splunk_add_on_ucc_framework.modular_alert_builder.build_core.alert_actions_merge import (
+from splunk_add_on_ucc_framework.commands.modular_alert_builder.alert_actions_merge import (
     remove_alert_from_conf_file,
 )
 
@@ -53,6 +53,7 @@ def __init__(
         self._all_settings = input_setting
         self._alert_settings = input_setting[ac.MODULAR_ALERTS]
         self._package_path = package_path
+        # nosemgrep: splunk.autoescape-disabled
         self._templates = Environment(
             loader=FileSystemLoader(
                 op.join(op.dirname(op.realpath(__file__)), "arf_template")
@@ -87,21 +88,6 @@ def get_spec_file_path(self, spec_file=None, create_dir_path=True):
             os.makedirs(readme_path)
         return op.join(readme_path, spec_file)
 
-    def get_icon_dir(self, create_dir_path=True):
-        icon_dir = op.join(self._package_path, "appserver", "static")
-        if not op.exists(icon_dir) and create_dir_path:
-            os.makedirs(icon_dir)
-        return icon_dir
-
-    def get_icon_name(self, alert):
-        return "alert_" + alert[ac.SHORT_NAME] + ".png"
-
-    def get_icon_path(self, alert, create_dir_path=True):
-        return op.join(
-            self.get_icon_dir(create_dir_path=create_dir_path),
-            self.get_icon_name(alert),
-        )
-
 
 class AlertActionsConfGeneration(AlertActionsConfBase):
     DEFAULT_CONF_TEMPLATE = "alert_actions.conf.template"
@@ -179,7 +165,7 @@ def generate_conf(self):
                 if k == "parameters":
                     for param in v:
                         param_name = param["name"].strip()
-                        if param.get("default_value"):
+                        if param.get("default_value") is not None:
                             param_default_value = str(
                                 param.get("default_value")
                             ).strip()
diff --git a/splunk_add_on_ucc_framework/modular_alert_builder/build_core/alert_actions_exceptions.py b/splunk_add_on_ucc_framework/commands/modular_alert_builder/alert_actions_exceptions.py
similarity index 100%
rename from splunk_add_on_ucc_framework/modular_alert_builder/build_core/alert_actions_exceptions.py
rename to splunk_add_on_ucc_framework/commands/modular_alert_builder/alert_actions_exceptions.py
diff --git a/splunk_add_on_ucc_framework/commands/modular_alert_builder/alert_actions_helper.py b/splunk_add_on_ucc_framework/commands/modular_alert_builder/alert_actions_helper.py
new file mode 100644
index 000000000..8e67649ae
--- /dev/null
+++ b/splunk_add_on_ucc_framework/commands/modular_alert_builder/alert_actions_helper.py
@@ -0,0 +1,68 @@
+#
+# Copyright 2021 Splunk Inc.
+#
+# 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.
+#
+import logging
+import os.path as op
+import sys
+from os import makedirs, remove
+
+import addonfactory_splunk_conf_parser_lib as conf_parser
+
+from splunk_add_on_ucc_framework.commands.modular_alert_builder.alert_actions_merge import (
+    merge_conf_file,
+)
+
+logger = logging.getLogger("ucc_gen")
+
+
+def write_file(file_name, file_path, content, merge="stanza_overwrite"):
+    logger.debug('operation="write", object="%s" object_type="file"', file_path)
+
+    do_merge = False
+    if file_name.endswith(".conf") or file_name.endswith("conf.spec"):
+        do_merge = True
+    else:
+        logger.info(
+            'event="Will not merge file="%s", '
+            + 'reason="Only support conf file merge"',
+            file_path,
+        )
+
+    if file_path:
+        new_file = None
+        if op.exists(file_path) and do_merge:
+            new_file = op.join(op.dirname(file_path), "new_" + file_name)
+        if new_file:
+            try:
+                with open(new_file, "w+") as fhandler:
+                    fhandler.write(content)
+                merge_conf_file(new_file, file_path, merge)
+            finally:
+                if op.exists(new_file):
+                    remove(new_file)
+        else:
+            if not op.exists(op.dirname(file_path)):
+                makedirs(op.dirname(file_path))
+            with open(file_path, "w+") as fhandler:
+                fhandler.write(content)
+            if do_merge:
+                # need to process the file with conf parser
+                parser = conf_parser.TABConfigParser()
+                parser.read(file_path)
+                with open(file_path, "w") as df:
+                    parser.write(df)
+    else:
+        sys.stdout.write(f"\n##################File {file_name}##################\n")
+        sys.stdout.write(content)
diff --git a/splunk_add_on_ucc_framework/modular_alert_builder/build_core/alert_actions_html_gen.py b/splunk_add_on_ucc_framework/commands/modular_alert_builder/alert_actions_html_gen.py
similarity index 92%
rename from splunk_add_on_ucc_framework/modular_alert_builder/build_core/alert_actions_html_gen.py
rename to splunk_add_on_ucc_framework/commands/modular_alert_builder/alert_actions_html_gen.py
index 9236b9acf..454ab6d46 100644
--- a/splunk_add_on_ucc_framework/modular_alert_builder/build_core/alert_actions_html_gen.py
+++ b/splunk_add_on_ucc_framework/commands/modular_alert_builder/alert_actions_html_gen.py
@@ -21,16 +21,16 @@
 
 from jinja2 import Environment, FileSystemLoader
 
-from splunk_add_on_ucc_framework.modular_alert_builder.build_core import (
+from splunk_add_on_ucc_framework.commands.modular_alert_builder import (
     alert_actions_exceptions as aae,
 )
-from splunk_add_on_ucc_framework.modular_alert_builder.build_core import (
+from splunk_add_on_ucc_framework.commands.modular_alert_builder import (
     arf_consts as ac,
 )
-from splunk_add_on_ucc_framework.modular_alert_builder.build_core.alert_actions_helper import (
+from splunk_add_on_ucc_framework.commands.modular_alert_builder.alert_actions_helper import (
     write_file,
 )
-from splunk_add_on_ucc_framework.modular_alert_builder.build_core.alert_actions_template import (
+from splunk_add_on_ucc_framework.commands.modular_alert_builder.alert_actions_template import (
     AlertActionsTemplateMgr,
 )
 
@@ -42,6 +42,7 @@ def __init__(self, input_setting=None, package_path=None):
         self._all_setting = input_setting
         self._package_path = package_path
         self._current_alert = None
+        # nosemgrep: splunk.autoescape-disabled
         self._templates = Environment(
             loader=FileSystemLoader(
                 [
diff --git a/splunk_add_on_ucc_framework/modular_alert_builder/build_core/alert_actions_merge.py b/splunk_add_on_ucc_framework/commands/modular_alert_builder/alert_actions_merge.py
similarity index 96%
rename from splunk_add_on_ucc_framework/modular_alert_builder/build_core/alert_actions_merge.py
rename to splunk_add_on_ucc_framework/commands/modular_alert_builder/alert_actions_merge.py
index c96599909..122ec88e1 100644
--- a/splunk_add_on_ucc_framework/modular_alert_builder/build_core/alert_actions_merge.py
+++ b/splunk_add_on_ucc_framework/commands/modular_alert_builder/alert_actions_merge.py
@@ -21,10 +21,10 @@
 
 import addonfactory_splunk_conf_parser_lib as conf_parser
 
-from splunk_add_on_ucc_framework.modular_alert_builder.build_core import (
+from splunk_add_on_ucc_framework.commands.modular_alert_builder import (
     alert_actions_exceptions as aae,
 )
-from splunk_add_on_ucc_framework.modular_alert_builder.build_core import (
+from splunk_add_on_ucc_framework.commands.modular_alert_builder import (
     arf_consts as ac,
 )
 
diff --git a/splunk_add_on_ucc_framework/modular_alert_builder/build_core/alert_actions_py_gen.py b/splunk_add_on_ucc_framework/commands/modular_alert_builder/alert_actions_py_gen.py
similarity index 92%
rename from splunk_add_on_ucc_framework/modular_alert_builder/build_core/alert_actions_py_gen.py
rename to splunk_add_on_ucc_framework/commands/modular_alert_builder/alert_actions_py_gen.py
index 6fb314423..d6fab3399 100644
--- a/splunk_add_on_ucc_framework/modular_alert_builder/build_core/alert_actions_py_gen.py
+++ b/splunk_add_on_ucc_framework/commands/modular_alert_builder/alert_actions_py_gen.py
@@ -19,13 +19,13 @@
 
 from jinja2 import Environment, FileSystemLoader
 
-from splunk_add_on_ucc_framework.modular_alert_builder.build_core import (
+from splunk_add_on_ucc_framework.commands.modular_alert_builder import (
     alert_actions_exceptions as aae,
 )
-from splunk_add_on_ucc_framework.modular_alert_builder.build_core import (
+from splunk_add_on_ucc_framework.commands.modular_alert_builder import (
     arf_consts as ac,
 )
-from splunk_add_on_ucc_framework.modular_alert_builder.build_core.alert_actions_helper import (
+from splunk_add_on_ucc_framework.commands.modular_alert_builder.alert_actions_helper import (
     write_file,
 )
 
@@ -43,6 +43,7 @@ def __init__(
         self._alert_actions_setting = input_setting[ac.MODULAR_ALERTS]
         self._ta_name = self._all_setting.get(ac.SHORT_NAME)
         self._lib_dir = self.get_python_lib_dir_name(self._ta_name)
+        # nosemgrep: splunk.autoescape-disabled
         self._templates = Environment(
             loader=FileSystemLoader(
                 op.join(op.dirname(op.realpath(__file__)), "arf_template")
@@ -59,7 +60,7 @@ def get_python_lib_dir_name(self, app_name):
     def get_alert_py_name(self, helper=""):
         return self._current_alert[ac.SHORT_NAME] + helper + ".py"
 
-    def get_alert_py_path(self, helper=""):
+    def get_alert_py_path(self):
         if not self._package_path:
             return None
         return op.join(self._package_path, "bin", self.get_alert_py_name())
@@ -74,15 +75,6 @@ def get_alert_helper_py_path(self):
             self._package_path, "bin", self._lib_dir, self.get_alert_helper_py_name()
         )
 
-    def get_declare_py_name(self):
-        return self._lib_dir + "_declare.py"
-
-    def get_decalre_py_path(self):
-        if not self._package_path:
-            return None
-        bin_dir = op.join(self._package_path, "bin")
-        return op.join(bin_dir, self.get_declare_py_name())
-
     def get_template_py_files(self):
         bin_dir = op.join(self._package_path, "bin")
         return [
diff --git a/splunk_add_on_ucc_framework/modular_alert_builder/build_core/alert_actions_template.py b/splunk_add_on_ucc_framework/commands/modular_alert_builder/alert_actions_template.py
similarity index 80%
rename from splunk_add_on_ucc_framework/modular_alert_builder/build_core/alert_actions_template.py
rename to splunk_add_on_ucc_framework/commands/modular_alert_builder/alert_actions_template.py
index fc8065e91..00ce8978d 100644
--- a/splunk_add_on_ucc_framework/modular_alert_builder/build_core/alert_actions_template.py
+++ b/splunk_add_on_ucc_framework/commands/modular_alert_builder/alert_actions_template.py
@@ -22,14 +22,8 @@ class AlertActionsTemplateMgr:
     DEFAULT_TEMPLATE_DIR = op.join(CURRENT_DIR, "arf_template")
     DEFAULT_HTML_LOOKUP_DIR = op.join(DEFAULT_TEMPLATE_DIR, "default_html_theme")
 
-    def __init__(self, template_dir=None, html_theme=None):
-        self._template_dir = (
-            template_dir or AlertActionsTemplateMgr.DEFAULT_TEMPLATE_DIR
-        )
+    def __init__(self, html_theme=None):
         self._html_theme = html_theme or AlertActionsTemplateMgr.DEFAULT_HTML_LOOKUP_DIR
 
-    def get_template_dir(self):
-        return self._template_dir
-
     def get_html_lookup_dir(self):
         return self._html_theme
diff --git a/splunk_add_on_ucc_framework/modular_alert_builder/build_core/arf_consts.py b/splunk_add_on_ucc_framework/commands/modular_alert_builder/arf_consts.py
similarity index 100%
rename from splunk_add_on_ucc_framework/modular_alert_builder/build_core/arf_consts.py
rename to splunk_add_on_ucc_framework/commands/modular_alert_builder/arf_consts.py
diff --git a/splunk_add_on_ucc_framework/modular_alert_builder/build_core/arf_template/alert_action.py.template b/splunk_add_on_ucc_framework/commands/modular_alert_builder/arf_template/alert_action.py.template
similarity index 100%
rename from splunk_add_on_ucc_framework/modular_alert_builder/build_core/arf_template/alert_action.py.template
rename to splunk_add_on_ucc_framework/commands/modular_alert_builder/arf_template/alert_action.py.template
diff --git a/splunk_add_on_ucc_framework/modular_alert_builder/build_core/arf_template/alert_action_helper.py.template b/splunk_add_on_ucc_framework/commands/modular_alert_builder/arf_template/alert_action_helper.py.template
similarity index 100%
rename from splunk_add_on_ucc_framework/modular_alert_builder/build_core/arf_template/alert_action_helper.py.template
rename to splunk_add_on_ucc_framework/commands/modular_alert_builder/arf_template/alert_action_helper.py.template
diff --git a/splunk_add_on_ucc_framework/modular_alert_builder/build_core/arf_template/alert_actions.conf.spec.template b/splunk_add_on_ucc_framework/commands/modular_alert_builder/arf_template/alert_actions.conf.spec.template
similarity index 100%
rename from splunk_add_on_ucc_framework/modular_alert_builder/build_core/arf_template/alert_actions.conf.spec.template
rename to splunk_add_on_ucc_framework/commands/modular_alert_builder/arf_template/alert_actions.conf.spec.template
diff --git a/splunk_add_on_ucc_framework/modular_alert_builder/build_core/arf_template/alert_actions.conf.template b/splunk_add_on_ucc_framework/commands/modular_alert_builder/arf_template/alert_actions.conf.template
similarity index 100%
rename from splunk_add_on_ucc_framework/modular_alert_builder/build_core/arf_template/alert_actions.conf.template
rename to splunk_add_on_ucc_framework/commands/modular_alert_builder/arf_template/alert_actions.conf.template
diff --git a/splunk_add_on_ucc_framework/modular_alert_builder/build_core/arf_template/default_html_theme/basecontrol.html b/splunk_add_on_ucc_framework/commands/modular_alert_builder/arf_template/default_html_theme/basecontrol.html
similarity index 100%
rename from splunk_add_on_ucc_framework/modular_alert_builder/build_core/arf_template/default_html_theme/basecontrol.html
rename to splunk_add_on_ucc_framework/commands/modular_alert_builder/arf_template/default_html_theme/basecontrol.html
diff --git a/splunk_add_on_ucc_framework/modular_alert_builder/build_core/arf_template/default_html_theme/checkbox.html b/splunk_add_on_ucc_framework/commands/modular_alert_builder/arf_template/default_html_theme/checkbox.html
similarity index 100%
rename from splunk_add_on_ucc_framework/modular_alert_builder/build_core/arf_template/default_html_theme/checkbox.html
rename to splunk_add_on_ucc_framework/commands/modular_alert_builder/arf_template/default_html_theme/checkbox.html
diff --git a/splunk_add_on_ucc_framework/modular_alert_builder/build_core/arf_template/default_html_theme/default.html b/splunk_add_on_ucc_framework/commands/modular_alert_builder/arf_template/default_html_theme/default.html
similarity index 100%
rename from splunk_add_on_ucc_framework/modular_alert_builder/build_core/arf_template/default_html_theme/default.html
rename to splunk_add_on_ucc_framework/commands/modular_alert_builder/arf_template/default_html_theme/default.html
diff --git a/splunk_add_on_ucc_framework/modular_alert_builder/build_core/arf_template/default_html_theme/default2.html b/splunk_add_on_ucc_framework/commands/modular_alert_builder/arf_template/default_html_theme/default2.html
similarity index 100%
rename from splunk_add_on_ucc_framework/modular_alert_builder/build_core/arf_template/default_html_theme/default2.html
rename to splunk_add_on_ucc_framework/commands/modular_alert_builder/arf_template/default_html_theme/default2.html
diff --git a/splunk_add_on_ucc_framework/modular_alert_builder/build_core/arf_template/default_html_theme/default3.html b/splunk_add_on_ucc_framework/commands/modular_alert_builder/arf_template/default_html_theme/default3.html
similarity index 100%
rename from splunk_add_on_ucc_framework/modular_alert_builder/build_core/arf_template/default_html_theme/default3.html
rename to splunk_add_on_ucc_framework/commands/modular_alert_builder/arf_template/default_html_theme/default3.html
diff --git a/splunk_add_on_ucc_framework/modular_alert_builder/build_core/arf_template/default_html_theme/dropdownlist.html b/splunk_add_on_ucc_framework/commands/modular_alert_builder/arf_template/default_html_theme/dropdownlist.html
similarity index 100%
rename from splunk_add_on_ucc_framework/modular_alert_builder/build_core/arf_template/default_html_theme/dropdownlist.html
rename to splunk_add_on_ucc_framework/commands/modular_alert_builder/arf_template/default_html_theme/dropdownlist.html
diff --git a/splunk_add_on_ucc_framework/modular_alert_builder/build_core/arf_template/default_html_theme/dropdownlist_splunk_search.html b/splunk_add_on_ucc_framework/commands/modular_alert_builder/arf_template/default_html_theme/dropdownlist_splunk_search.html
similarity index 100%
rename from splunk_add_on_ucc_framework/modular_alert_builder/build_core/arf_template/default_html_theme/dropdownlist_splunk_search.html
rename to splunk_add_on_ucc_framework/commands/modular_alert_builder/arf_template/default_html_theme/dropdownlist_splunk_search.html
diff --git a/splunk_add_on_ucc_framework/modular_alert_builder/build_core/arf_template/default_html_theme/helper.html b/splunk_add_on_ucc_framework/commands/modular_alert_builder/arf_template/default_html_theme/helper.html
similarity index 100%
rename from splunk_add_on_ucc_framework/modular_alert_builder/build_core/arf_template/default_html_theme/helper.html
rename to splunk_add_on_ucc_framework/commands/modular_alert_builder/arf_template/default_html_theme/helper.html
diff --git a/splunk_add_on_ucc_framework/modular_alert_builder/build_core/arf_template/default_html_theme/radio.html b/splunk_add_on_ucc_framework/commands/modular_alert_builder/arf_template/default_html_theme/radio.html
similarity index 100%
rename from splunk_add_on_ucc_framework/modular_alert_builder/build_core/arf_template/default_html_theme/radio.html
rename to splunk_add_on_ucc_framework/commands/modular_alert_builder/arf_template/default_html_theme/radio.html
diff --git a/splunk_add_on_ucc_framework/modular_alert_builder/build_core/arf_template/default_html_theme/text.html b/splunk_add_on_ucc_framework/commands/modular_alert_builder/arf_template/default_html_theme/text.html
similarity index 100%
rename from splunk_add_on_ucc_framework/modular_alert_builder/build_core/arf_template/default_html_theme/text.html
rename to splunk_add_on_ucc_framework/commands/modular_alert_builder/arf_template/default_html_theme/text.html
diff --git a/splunk_add_on_ucc_framework/modular_alert_builder/build_core/arf_template/eventtypes.conf.template b/splunk_add_on_ucc_framework/commands/modular_alert_builder/arf_template/eventtypes.conf.template
similarity index 100%
rename from splunk_add_on_ucc_framework/modular_alert_builder/build_core/arf_template/eventtypes.conf.template
rename to splunk_add_on_ucc_framework/commands/modular_alert_builder/arf_template/eventtypes.conf.template
diff --git a/splunk_add_on_ucc_framework/modular_alert_builder/build_core/arf_template/mod_alert.html.template b/splunk_add_on_ucc_framework/commands/modular_alert_builder/arf_template/mod_alert.html.template
similarity index 100%
rename from splunk_add_on_ucc_framework/modular_alert_builder/build_core/arf_template/mod_alert.html.template
rename to splunk_add_on_ucc_framework/commands/modular_alert_builder/arf_template/mod_alert.html.template
diff --git a/splunk_add_on_ucc_framework/modular_alert_builder/build_core/arf_template/tags.conf.template b/splunk_add_on_ucc_framework/commands/modular_alert_builder/arf_template/tags.conf.template
similarity index 100%
rename from splunk_add_on_ucc_framework/modular_alert_builder/build_core/arf_template/tags.conf.template
rename to splunk_add_on_ucc_framework/commands/modular_alert_builder/arf_template/tags.conf.template
diff --git a/splunk_add_on_ucc_framework/commands/openapi_generator/ucc_to_oas.py b/splunk_add_on_ucc_framework/commands/openapi_generator/ucc_to_oas.py
index 8e098e808..af259b652 100644
--- a/splunk_add_on_ucc_framework/commands/openapi_generator/ucc_to_oas.py
+++ b/splunk_add_on_ucc_framework/commands/openapi_generator/ucc_to_oas.py
@@ -309,9 +309,9 @@ def __add_paths(
     for tab in global_config.pages.configuration.tabs:
         open_api_object = __assign_ta_paths(
             open_api_object=open_api_object,
-            path=f"/{global_config.meta.restRoot}_settings/{tab.name}"
-            if tab.name in ["logging", "proxy"]
-            else f"/{global_config.meta.restRoot}_{tab.name}",
+            path=f"/{global_config.meta.restRoot}_{tab.name}"
+            if hasattr(tab, "table")
+            else f"/{global_config.meta.restRoot}_settings/{tab.name}",
             path_name=tab.name,
             actions=tab.table.actions
             if hasattr(tab, "table") and hasattr(tab.table, "actions")
diff --git a/splunk_add_on_ucc_framework/commands/rest_builder/builder.py b/splunk_add_on_ucc_framework/commands/rest_builder/builder.py
index e5dc0cb4a..158bce4e8 100644
--- a/splunk_add_on_ucc_framework/commands/rest_builder/builder.py
+++ b/splunk_add_on_ucc_framework/commands/rest_builder/builder.py
@@ -96,7 +96,7 @@ def build(self):
                     self.output.put(
                         self.output.default,
                         endpoint.conf_name + ".conf",
-                        endpoint.generate_default_conf(),
+                        endpoint.generate_conf_with_default_values(),
                     )
 
                 self.output.put(
diff --git a/splunk_add_on_ucc_framework/commands/rest_builder/endpoint/base.py b/splunk_add_on_ucc_framework/commands/rest_builder/endpoint/base.py
index 3227c75ae..aaeac1de0 100644
--- a/splunk_add_on_ucc_framework/commands/rest_builder/endpoint/base.py
+++ b/splunk_add_on_ucc_framework/commands/rest_builder/endpoint/base.py
@@ -63,14 +63,18 @@ def name_default(self):
     def name_rh(self):
         raise NotImplementedError()
 
-    def generate_spec(self, omit_kv_pairs=False):
+    def generate_spec(self):
         title = self._title_template.format(self.name_spec)
-        if omit_kv_pairs:
-            return title
         lines = [field.generate_spec() for field in self._fields]
         lines.insert(0, title)
         return "\n".join(lines)
 
+    def generate_conf_with_default_values(self):
+        title = self._title_template.format(self.name_spec)
+        lines = [field.generate_conf_with_default_value() for field in self._fields]
+        lines.insert(0, title)
+        return "\n".join(lines)
+
     def generate_rh(self):
         fields = []
         for field in self._fields:
@@ -147,8 +151,10 @@ def generate_spec(self):
         specs = [entity.generate_spec() for entity in self._entities]
         return "\n\n".join(specs)
 
-    def generate_default_conf(self):
-        specs = [entity.generate_spec(True) for entity in self._entities]
+    def generate_conf_with_default_values(self):
+        specs = [
+            entity.generate_conf_with_default_values() for entity in self._entities
+        ]
         return "\n\n".join(specs)
 
     def generate_rh(self) -> str:
diff --git a/splunk_add_on_ucc_framework/commands/rest_builder/endpoint/field.py b/splunk_add_on_ucc_framework/commands/rest_builder/endpoint/field.py
index 8295b35c7..c9fbc6b9f 100644
--- a/splunk_add_on_ucc_framework/commands/rest_builder/endpoint/field.py
+++ b/splunk_add_on_ucc_framework/commands/rest_builder/endpoint/field.py
@@ -45,6 +45,11 @@ def generate_spec(self) -> str:
             value="",
         )
 
+    def generate_conf_with_default_value(self) -> str:
+        return self._kv_template.format(
+            name=self._name, value=self._default if self._default is not None else ""
+        )
+
     def _indent_validator(self) -> str:
         validator = indent(self._validator)
         return validator[4:]
diff --git a/splunk_add_on_ucc_framework/commands/rest_builder/global_config_builder_schema.py b/splunk_add_on_ucc_framework/commands/rest_builder/global_config_builder_schema.py
index 992cf32a8..9b77220c2 100644
--- a/splunk_add_on_ucc_framework/commands/rest_builder/global_config_builder_schema.py
+++ b/splunk_add_on_ucc_framework/commands/rest_builder/global_config_builder_schema.py
@@ -20,7 +20,7 @@
 
 
 import json
-from typing import Any, Dict, List, Type
+from typing import Any, Dict, List, Type, Set
 
 from splunk_add_on_ucc_framework import global_config as global_config_lib
 
@@ -60,14 +60,10 @@ def _is_true(val):
 class GlobalConfigBuilderSchema:
     def __init__(self, global_config: global_config_lib.GlobalConfig, j2_env):
         self.global_config = global_config
-        self._configs = []
-        self._settings = []
-        for configuration in self.global_config.tabs:
-            if "table" in configuration:
-                self._configs.append(configuration)
-            else:
-                self._settings.append(configuration)
         self.j2_env = j2_env
+        self._settings_conf_file_names: Set[str] = set()
+        self._configs_conf_file_names: Set[str] = set()
+        self._oauth_conf_file_names: Set[str] = set()
         self._endpoints: Dict[str, RestEndpointBuilder] = {}
         self._parse_builder_schema()
 
@@ -80,12 +76,16 @@ def namespace(self) -> str:
         return self.global_config.namespace
 
     @property
-    def configs(self):
-        return self._configs
+    def settings_conf_file_names(self):
+        return self._settings_conf_file_names
+
+    @property
+    def configs_conf_file_names(self):
+        return self._configs_conf_file_names
 
     @property
-    def settings(self):
-        return self._settings
+    def oauth_conf_file_names(self):
+        return self._oauth_conf_file_names
 
     @property
     def endpoints(self) -> List[RestEndpointBuilder]:
@@ -97,7 +97,7 @@ def _parse_builder_schema(self):
         self._builder_inputs()
 
     def _builder_configs(self):
-        for config in self._configs:
+        for config in self.global_config.configs:
             endpoint_obj = self._get_endpoint(
                 config["name"],
                 SingleModelEndpointBuilder,
@@ -116,14 +116,16 @@ def _builder_configs(self):
             # If we have given oauth support then we have to add endpoint for accesstoken
             for entity_element in config["entity"]:
                 if entity_element["type"] == "oauth":
-                    self._get_endpoint(
+                    oauth_endpoint = self._get_endpoint(
                         "oauth",
                         OAuthModelEndpointBuilder,
                         app_name=self.global_config.product,
                     )
+                    self._oauth_conf_file_names.add(oauth_endpoint.conf_name)
+            self._configs_conf_file_names.add(endpoint_obj.conf_name)
 
     def _builder_settings(self):
-        for setting in self._settings:
+        for setting in self.global_config.settings:
             endpoint_obj = self._get_endpoint(
                 "settings",
                 MultipleModelEndpointBuilder,
@@ -137,6 +139,7 @@ def _builder_settings(self):
                 fields,
             )
             endpoint_obj.add_entity(entity)
+            self._settings_conf_file_names.add(endpoint_obj.conf_name)
 
     def _builder_inputs(self):
         for input_item in self.global_config.inputs:
diff --git a/splunk_add_on_ucc_framework/global_config.py b/splunk_add_on_ucc_framework/global_config.py
index 846f8b07e..14fcbccd7 100644
--- a/splunk_add_on_ucc_framework/global_config.py
+++ b/splunk_add_on_ucc_framework/global_config.py
@@ -60,6 +60,26 @@ def inputs(self):
     def tabs(self):
         return self._content["pages"]["configuration"]["tabs"]
 
+    @property
+    def settings(self):
+        settings = []
+        for tab in self.tabs:
+            if "table" not in tab:
+                settings.append(tab)
+        return settings
+
+    @property
+    def configs(self):
+        configs = []
+        for tab in self.tabs:
+            if "table" in tab:
+                configs.append(tab)
+        return configs
+
+    @property
+    def alerts(self):
+        return self._content.get("alerts", [])
+
     @property
     def meta(self):
         return self._content["meta"]
@@ -96,3 +116,6 @@ def update_addon_version(self, version: str) -> None:
 
     def has_inputs(self) -> bool:
         return bool(self.inputs)
+
+    def has_alerts(self) -> bool:
+        return bool(self.alerts)
diff --git a/splunk_add_on_ucc_framework/global_config_update.py b/splunk_add_on_ucc_framework/global_config_update.py
index 7d8c1057e..0dafe33d1 100644
--- a/splunk_add_on_ucc_framework/global_config_update.py
+++ b/splunk_add_on_ucc_framework/global_config_update.py
@@ -67,10 +67,12 @@ def handle_global_config_update(global_config: global_config_lib.GlobalConfig):
     """Handle changes in globalConfig file."""
     current_schema_version = global_config.schema_version
     version = current_schema_version if current_schema_version else "0.0.0"
+    logger.info(f"Current globalConfig schema version is {current_schema_version}")
 
     if _version_tuple(version) < _version_tuple("0.0.1"):
         _handle_biased_terms_update(global_config)
         global_config.dump(global_config.original_path)
+        logger.info("Updated globalConfig schema to version 0.0.1")
 
     if _version_tuple(version) < _version_tuple("0.0.2"):
         for tab in global_config.tabs:
@@ -130,7 +132,9 @@ def handle_global_config_update(global_config: global_config_lib.GlobalConfig):
                     del service_options["onLoad"]
         global_config.update_schema_version("0.0.2")
         global_config.dump(global_config.original_path)
+        logger.info("Updated globalConfig schema to version 0.0.2")
 
     if _version_tuple(version) < _version_tuple("0.0.3"):
         _handle_dropping_api_version_update(global_config)
         global_config.dump(global_config.original_path)
+        logger.info("Updated globalConfig schema to version 0.0.3")
diff --git a/splunk_add_on_ucc_framework/global_config_validator.py b/splunk_add_on_ucc_framework/global_config_validator.py
index 8c1169652..831bdecd9 100644
--- a/splunk_add_on_ucc_framework/global_config_validator.py
+++ b/splunk_add_on_ucc_framework/global_config_validator.py
@@ -118,9 +118,8 @@ def _validate_file_type_entity(self) -> None:
         """
         Validates that file-based field has all necessary fields.
         Things should be provided in case of file field:
-            * validators field
-            * at least 1 validator (file validator)
-            * only `json` is now supported in `supportedFileTypes` field
+            * options field
+            * supportedFileTypes field should be present in options
         """
         pages = self._config["pages"]
         configuration = pages["configuration"]
@@ -129,26 +128,19 @@ def _validate_file_type_entity(self) -> None:
             entities = tab["entity"]
             for entity in entities:
                 if entity["type"] == "file":
-                    validators = entity.get("validators")
-                    if validators is None:
+                    options = entity.get("options")
+                    if options is None:
                         raise GlobalConfigValidatorException(
-                            f"File validator should be present for "
+                            f"Options field for the file type should be present "
+                            f"for '{entity['field']}' field."
+                        )
+                    supported_file_types = options.get("supportedFileTypes")
+                    if supported_file_types is None:
+                        raise GlobalConfigValidatorException(
+                            f"You should define your supported file types in "
+                            f"the `supportedFileTypes` field for the "
                             f"'{entity['field']}' field."
                         )
-                    for validator in validators:
-                        if validator.get("type") == "file":
-                            supported_file_types = validator.get("supportedFileTypes")
-                            if supported_file_types is None:
-                                raise GlobalConfigValidatorException(
-                                    f"`json` should be present in the "
-                                    f"'supportedFileTypes' for "
-                                    f"'{entity['field']}' field."
-                                )
-                            if supported_file_types[0] != "json":
-                                raise GlobalConfigValidatorException(
-                                    f"`json` is only currently supported for "
-                                    f"file input for '{entity['field']}' field."
-                                )
 
     def _validate_string_validator(self, entity_field: str, validator: Dict[str, Any]):
         """
@@ -385,6 +377,60 @@ def _validate_duplicates(self) -> None:
         if inputs:
             self._validate_inputs_duplicates(inputs)
 
+    def _validate_alerts(self) -> None:
+        # TODO: test cases should be added here.
+        alerts = self._config.get("alerts", [])
+        for alert in alerts:
+            fields = []
+            alert_entity = alert.get("entity")
+            if alert_entity is None:
+                continue
+            for entity in alert_entity:
+                if entity.get("field") in fields:
+                    raise GlobalConfigValidatorException(
+                        "Field names should be unique across alerts"
+                    )
+                else:
+                    fields.append(entity.get("field"))
+                if entity.get("type") in ("radio", "singleSelect"):
+                    if not entity.get("options"):
+                        raise GlobalConfigValidatorException(
+                            "{} type must have options parameter".format(
+                                entity.get("type")
+                            )
+                        )
+                elif entity.get("options"):
+                    raise GlobalConfigValidatorException(
+                        "{} type must not contain options parameter".format(
+                            entity.get("type")
+                        )
+                    )
+                if entity.get("type") in ("singleSelectSplunkSearch",):
+                    if not all(
+                        [
+                            entity.get("search"),
+                            entity.get("valueField"),
+                            entity.get("labelField"),
+                        ]
+                    ):
+                        raise GlobalConfigValidatorException(
+                            "{} type must have search, valueLabel and valueField parameters".format(
+                                entity.get("type")
+                            )
+                        )
+                elif any(
+                    [
+                        entity.get("search"),
+                        entity.get("valueField"),
+                        entity.get("labelField"),
+                    ]
+                ):
+                    raise GlobalConfigValidatorException(
+                        "{} type must not contain search, valueField or labelField parameter".format(
+                            entity.get("type")
+                        )
+                    )
+
     def validate(self) -> None:
         self._validate_config_against_schema()
         self._validate_configuration_tab_table_has_name_field()
@@ -393,3 +439,4 @@ def validate(self) -> None:
         self._validate_validators()
         self._validate_multilevel_menu()
         self._validate_duplicates()
+        self._validate_alerts()
diff --git a/splunk_add_on_ucc_framework/main.py b/splunk_add_on_ucc_framework/main.py
index 6c75d1760..df0cfce3c 100644
--- a/splunk_add_on_ucc_framework/main.py
+++ b/splunk_add_on_ucc_framework/main.py
@@ -17,7 +17,7 @@
 import sys
 from typing import Optional, Sequence
 
-from splunk_add_on_ucc_framework import generate
+from splunk_add_on_ucc_framework.commands import build
 from splunk_add_on_ucc_framework.commands import init
 
 
@@ -62,14 +62,14 @@ def main(argv: Optional[Sequence[str]] = None):
         "--source",
         type=str,
         nargs="?",
-        help="Folder containing the app.manifest and app source",
+        help="Folder containing the app.manifest and app source.",
         default="package",
     )
     build_parser.add_argument(
         "--config",
         type=str,
         nargs="?",
-        help="Path to configuration file, defaults to globalConfig file in parent directory of source provided",
+        help="Path to configuration file, defaults to globalConfig file in parent directory of source provided.",
         default=None,
     )
     build_parser.add_argument(
@@ -82,51 +82,49 @@ def main(argv: Optional[Sequence[str]] = None):
     build_parser.add_argument(
         "--python-binary-name",
         type=str,
-        help="Python binary name to use to install requirements",
+        help="Python binary name to use to install requirements.",
         default="python3",
     )
-    build_parser.add_argument(
-        "--openapi",
-        type=bool,
-        help="Generate OpenAPI Description document and expose in /static/openapi.json endpoint",
-        default=True,
-    )
 
-    init_parser = subparsers.add_parser("init", description="Bootstrap an add-on")
+    init_parser = subparsers.add_parser("init", description="Bootstrap an add-on.")
     init_parser.add_argument(
         "--addon-name",
         type=str,
-        help="Add-on name",
+        help="Add-on name.",
         required=True,
     )
     init_parser.add_argument(
         "--addon-display-name",
         type=str,
-        help="Add-on display name",
+        help="Add-on display name.",
         required=True,
     )
     init_parser.add_argument(
         "--addon-input-name",
         type=str,
-        help="Add-on input name",
+        help="Add-on input name.",
         required=True,
     )
     init_parser.add_argument(
         "--addon-version",
         type=str,
-        help="Add-on version",
+        help="Add-on version.",
         default="0.0.1",
     )
-    init_parser.add_argument("--overwrite", action="store_true", default=False)
+    init_parser.add_argument(
+        "--overwrite",
+        action="store_true",
+        default=False,
+        help="Overwrite already generated add-on folder.",
+    )
 
     args = parser.parse_args(argv)
     if args.command == "build":
-        generate(
+        build.generate(
             source=args.source,
-            config=args.config,
-            ta_version=args.ta_version,
+            config_path=args.config,
+            addon_version=args.ta_version,
             python_binary_name=args.python_binary_name,
-            openapi=args.openapi,
         )
     if args.command == "init":
         init.init(
diff --git a/splunk_add_on_ucc_framework/meta_conf.py b/splunk_add_on_ucc_framework/meta_conf.py
index 4a02dfbaf..fc921a7d2 100644
--- a/splunk_add_on_ucc_framework/meta_conf.py
+++ b/splunk_add_on_ucc_framework/meta_conf.py
@@ -13,8 +13,6 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 #
-from typing import IO
-
 import addonfactory_splunk_conf_parser_lib as conf_parser
 
 DEFAULT = """
@@ -25,12 +23,16 @@
 access = read : [ * ], write : [ admin, sc_admin ]
 export = system
 """
+DEFAULT_META_FILE_NAME = "default.meta"
 
 
 class MetaConf:
     def __init__(self):
         self._meta_conf = conf_parser.TABConfigParser()
 
-    def create_default(self, fd: IO) -> None:
+    def create_default(self) -> None:
         self._meta_conf.read_string(DEFAULT)
-        self._meta_conf.write(fd)
+
+    def write(self, path: str) -> None:
+        with open(path, "w") as fd:
+            self._meta_conf.write(fd)
diff --git a/splunk_add_on_ucc_framework/modular_alert_builder/__init__.py b/splunk_add_on_ucc_framework/modular_alert_builder/__init__.py
deleted file mode 100644
index 53f72338e..000000000
--- a/splunk_add_on_ucc_framework/modular_alert_builder/__init__.py
+++ /dev/null
@@ -1,16 +0,0 @@
-#
-# Copyright 2021 Splunk Inc.
-#
-# 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/splunk_add_on_ucc_framework/modular_alert_builder/build_core/__init__.py b/splunk_add_on_ucc_framework/modular_alert_builder/build_core/__init__.py
deleted file mode 100644
index 9f276afd9..000000000
--- a/splunk_add_on_ucc_framework/modular_alert_builder/build_core/__init__.py
+++ /dev/null
@@ -1,175 +0,0 @@
-#
-# Copyright 2021 Splunk Inc.
-#
-# 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.
-#
-
-
-import logging
-import os
-import re
-import shutil
-
-from splunk_add_on_ucc_framework.modular_alert_builder.build_core.alert_actions_conf_gen import (
-    generate_alert_actions_conf,
-)
-from splunk_add_on_ucc_framework.modular_alert_builder.build_core.alert_actions_html_gen import (
-    generate_alert_actions_html_files,
-)
-from splunk_add_on_ucc_framework.modular_alert_builder.build_core.alert_actions_py_gen import (
-    generate_alert_actions_py_files,
-)
-
-logger = logging.getLogger("ucc_gen")
-
-cache_path = {}  # type: ignore
-
-
-def check_file_name(file_name, env):
-    # file_name is string, read from setting file
-    # this function replaces all ${short_name} and other to its real value
-    if file_name in cache_path:
-        return cache_path[file_name]
-
-    search = re.findall(r"\${\!?([\w\-\.]+)}", file_name, re.MULTILINE)
-    if not search:
-        cache_path[file_name] = file_name
-        return file_name
-
-    new_str = file_name
-    for gp in search:
-        if gp in env:
-            new_str = new_str.replace("${%s}" % gp, env[gp], re.MULTILINE)
-            new_str = new_str.replace(
-                "${!%s}" % gp, re.sub(r"[^\w]+", "_", env[gp].lower()), re.MULTILINE
-            )
-
-    # Disable the cache to avoid conflict
-    # cache_path[file_name] = new_str
-    return new_str
-
-
-def check_file_list(dirName, file_list, env):
-    ret = []
-    for dname in file_list:
-        new_dname = check_file_name(dname, env)
-        if new_dname != dname:
-            ret.append((check_file_name(dirName, env), dname, new_dname))
-
-    return ret
-
-
-def prepare_ta_directory_tree(src, dest, envs):
-    """
-    If dest doesn't exist, then generate a new TA directory tree.
-    If dest exists, then merge with the new one
-    """
-    output_dir = dest
-
-    if not output_dir:
-        # if not output, then all content will be print to screen
-        logger.info('event="No output_dir", will print content to screen"')
-        return output_dir
-
-    if os.path.exists(output_dir):
-        logger.info('event="output_dir=%s already exist"', output_dir)
-        output_dir = os.path.join(output_dir, envs["product_id"] + "_temp_output")
-        logger.info('event="generate a new output_dir=%s"', output_dir)
-        if os.path.exists(output_dir):
-            shutil.rmtree(output_dir)
-
-    try:
-        # copy file
-        logger.info('event="Copying directory tree: src=%s dest=%s"', src, output_dir)
-        shutil.copytree(src, output_dir)
-
-        # process each file's name
-        logger.info(
-            'event="Replace each file name\'s placeholder under dir=%s"', output_dir
-        )
-        move_list = []
-        for dirName, subdirList, fileList in os.walk(output_dir):
-            move_list.extend(check_file_list(dirName, subdirList, envs))
-            move_list.extend(check_file_list(dirName, fileList, envs))
-
-        for x, y, z in move_list:
-            shutil.move(os.path.sep.join([x, y]), os.path.sep.join([x, z]))
-
-    except Exception as e:
-        if output_dir != dest and os.path.exists(output_dir):
-            logger.info('clean temp_output_dir="%s"', output_dir)
-            shutil.rmtree(output_dir)
-        raise e
-    return output_dir
-
-
-def generate_alerts(src, dest, envs):
-    output_dir = dest
-    package_dir = None
-    output_content = {}
-    conf_return = None
-    html_return = None
-    py_return = None
-    global_settings = envs["global_settings"]
-
-    try:
-        if dest:
-            output_dir = prepare_ta_directory_tree(src, dest, envs)
-            package_dir = os.path.join(dest, envs["product_id"])
-
-        build_components = envs["build_components"]
-        if build_components["conf"]:
-            conf_return = generate_alert_actions_conf(
-                input_setting=envs["schema.content"],
-                package_path=package_dir,
-                global_settings=global_settings,
-            )
-
-        if build_components["html"]:
-            html_return = generate_alert_actions_html_files(
-                input_setting=envs["schema.content"],
-                package_path=package_dir,
-                html_setting=envs["html_setting"],
-            )
-
-        if build_components["py"]:
-            py_return = generate_alert_actions_py_files(
-                input_setting=envs["schema.content"],
-                package_path=package_dir,
-                global_settings=global_settings,
-            )
-
-        if conf_return:
-            output_content["conf"] = conf_return
-        if html_return:
-            output_content["html"] = conf_return
-        if py_return:
-            output_content["py"] = py_return
-
-        if output_dir != dest:
-            """
-            Which means the previous output_dir already there
-            """
-            from . import alert_actions_merge
-
-            alert_actions_merge.merge(
-                os.path.join(output_dir, envs["product_id"]),
-                os.path.join(dest, envs["product_id"]),
-            )
-            logger.info('event="merged %s to %s', output_dir, dest)
-    finally:
-        if output_dir != dest and os.path.exists(output_dir):
-            logger.info('clean temp_output_dir="%s"', output_dir)
-            shutil.rmtree(output_dir)
-
-    return output_content
diff --git a/splunk_add_on_ucc_framework/modular_alert_builder/build_core/alert_actions_helper.py b/splunk_add_on_ucc_framework/modular_alert_builder/build_core/alert_actions_helper.py
deleted file mode 100644
index 141b95ca2..000000000
--- a/splunk_add_on_ucc_framework/modular_alert_builder/build_core/alert_actions_helper.py
+++ /dev/null
@@ -1,403 +0,0 @@
-#
-# Copyright 2021 Splunk Inc.
-#
-# 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.
-#
-import logging
-import os.path as op
-import sys
-from os import makedirs, remove
-
-import addonfactory_splunk_conf_parser_lib as conf_parser
-
-from splunk_add_on_ucc_framework.modular_alert_builder.build_core.alert_actions_merge import (
-    merge_conf_file,
-)
-
-logger = logging.getLogger("ucc_gen")
-
-
-def write_file(file_name, file_path, content, merge="stanza_overwrite"):
-    logger.debug('operation="write", object="%s" object_type="file"', file_path)
-
-    do_merge = False
-    if file_name.endswith(".conf") or file_name.endswith("conf.spec"):
-        do_merge = True
-    else:
-        logger.info(
-            'event="Will not merge file="%s", '
-            + 'reason="Only support conf file merge"',
-            file_path,
-        )
-
-    if file_path:
-        new_file = None
-        if op.exists(file_path) and do_merge:
-            new_file = op.join(op.dirname(file_path), "new_" + file_name)
-        if new_file:
-            try:
-                with open(new_file, "w+") as fhandler:
-                    fhandler.write(content)
-                merge_conf_file(new_file, file_path, merge)
-            finally:
-                if op.exists(new_file):
-                    remove(new_file)
-        else:
-            if not op.exists(op.dirname(file_path)):
-                makedirs(op.dirname(file_path))
-            with open(file_path, "w+") as fhandler:
-                fhandler.write(content)
-            if do_merge:
-                # need to process the file with conf parser
-                parser = conf_parser.TABConfigParser()
-                parser.read(file_path)
-                with open(file_path, "w") as df:
-                    parser.write(df)
-    else:
-        sys.stdout.write(f"\n##################File {file_name}##################\n")
-        sys.stdout.write(content)
-
-
-GLOBAL_SETTING_TYPE_MAP = {"text": "text", "checkbox": "bool", "password": "password"}
-
-GLOBAL_SETTING_VALUE_NAME_MAP = {
-    "text": "content",
-    "bool": "bool",
-    "password": "password",
-}
-
-
-def convert_custom_setting(parameters):
-    """
-    convert
-    [{
-        "default_value": "message",
-        "name": "notification_type",
-        "required": true,
-        "help_string": "Choose style of HipChat notification.",
-        "possible_values": {
-             "Application Card": "card",
-             "Message": "message"
-         },
-         "label": "Notification Style",
-         "format_type": "dropdownlist",
-         "value": "xxxx"
-      }]
-    to
-    [{
-    "title": "customized key",
-    "name": "customized name",
-    "type": "text",
-    "description": "description of customized key"
-    }]
-    """
-    formated = []
-    if not parameters:
-        return formated
-
-    for param in parameters:
-        if param.get("format_type") not in list(GLOBAL_SETTING_TYPE_MAP.keys()):
-            msg = 'format_type="{}" is not support for global setting'.format(
-                param.get("format_type")
-            )
-            raise Exception(msg)
-
-        one_param = {
-            "title": param.get("label"),
-            "name": param.get("name"),
-            "type": GLOBAL_SETTING_TYPE_MAP[param.get("format_type")],
-            "description": param.get("help_string"),
-        }
-        formated.append(one_param)
-
-    return formated
-
-
-def convert_global_setting(global_settings):
-    """
-      convert
-      {
-      "customized_settings": {
-          "string_label": {
-          "type": "text",
-          "content": "string"
-          },
-          "password": {
-          "type": "password",
-          "password": "123"
-          },
-          "checkbox": {
-          "type": "bool",
-          "bool": true
-          }
-      },
-      "proxy_settings": {
-          "proxy_password": "sef",
-          "proxy_type": "http",
-          "proxy_url": "1.2.3.4",
-      },
-      "global_settings": {
-          "log_level": "INFO"
-      }
-    to
-      {
-      "title": "Proxy",
-      "name": "proxy",
-      "type": "default_proxy",
-      "description": "proxy settings"
-      },
-      {
-      "title": "Account Key Title",
-      "name": "username",
-      "type": "default_account",
-      "description": "The username of the user account"
-      },
-      {
-      "title": "Account Secret Title",
-      "name": "password",
-      "type": "default_account",
-      "description": "The password of the user account"
-      },
-      {
-      "title": "customized key",
-      "name": "customized name",
-      "type": "text",
-      "description": "description of customized key"
-    """
-    converted = []
-    if not global_settings:
-        return converted
-
-    for type, settings in list(global_settings.items()):
-        if type == "proxy_settings":
-            proxy = {
-                "title": "Proxy",
-                "name": "proxy",
-                "type": "default_proxy",
-                "description": "proxy settings",
-            }
-            converted.append(proxy)
-        elif type == "log_settings":
-            logging = {
-                "title": "Logging",
-                "name": "logging",
-                "type": "default_logging",
-                "description": "logging setting",
-            }
-            converted.append(logging)
-        elif type == "credential_settings":
-            username = {
-                "title": "Account Key Title",
-                "name": "tab_default_account_username",
-                "type": "default_account",
-                "description": "The username of the user account",
-            }
-            password = {
-                "title": "Account Secret Title",
-                "name": "tab_default_account_password",
-                "type": "default_account",
-                "description": "The password of the user account",
-            }
-            converted.append(username)
-            converted.append(password)
-        elif type == "customized_settings":
-            custom_settings = convert_custom_setting(settings)
-            converted += custom_settings
-    return converted
-
-
-def convert_global_setting_previous(global_settings):
-    """
-        convert global_settings=[
-            {
-                "type": "proxy"
-            },
-            {
-                "type": "logging"
-            },
-            {
-                "type": "account"
-            },
-            {
-                "type": "custom",
-                "parameters": []
-            }
-        ]
-            to [
-        {
-        "title": "Proxy",
-        "name": "proxy",
-        "type": "default_proxy",
-        "description": "proxy settings"
-        },
-        {
-        "title": "Account Key Title",
-        "name": "username",
-        "type": "default_account",
-        "description": "The username of the user account"
-        },
-        {
-        "title": "Account Secret Title",
-        "name": "password",
-        "type": "default_account",
-        "description": "The password of the user account"
-        },
-        {
-        "title": "customized key",
-        "name": "customized name",
-        "type": "text",
-        "description": "description of customized key"
-        }
-    ]
-    """
-    converted = []
-    if not global_settings:
-        return converted
-
-    for setting in global_settings:
-        if setting.get("type") == "proxy":
-            proxy = {
-                "title": "Proxy",
-                "name": "proxy",
-                "type": "default_proxy",
-                "description": "proxy settings",
-            }
-            converted.append(proxy)
-        elif setting.get("type") == "logging":
-            logging = {
-                "title": "Logging",
-                "name": "logging",
-                "type": "default_logging",
-                "description": "logging setting",
-            }
-            converted.append(logging)
-        elif setting.get("type") == "account":
-            username = {
-                "title": "Account Key Title",
-                "name": "username",
-                "type": "default_account",
-                "description": "The username of the user account",
-            }
-            password = {
-                "title": "Account Secret Title",
-                "name": "password",
-                "type": "default_account",
-                "description": "The password of the user account",
-            }
-            converted.append(username)
-            converted.append(password)
-        elif setting.get("type") == "custom":
-            custom_settings = convert_custom_setting(setting.get("parameters"))
-            converted += custom_settings
-    return converted
-
-
-def get_test_parameter_type(param):
-    if not param:
-        return None
-
-    if param.get("format_type") in list(GLOBAL_SETTING_TYPE_MAP.keys()):
-        return GLOBAL_SETTING_TYPE_MAP.get(param.get("format_type"))
-    return None
-
-
-def get_parameter_type(param, parameters_meta, logger):
-    if not parameters_meta:
-        logger.info('parameters_meta="None"')
-        return None
-
-    if not param:
-        logger.info('param="None"')
-        return None
-
-    for param_meta in parameters_meta:
-        if param == param_meta["name"]:
-            return GLOBAL_SETTING_TYPE_MAP.get(param_meta["format_type"])
-
-    return None
-
-
-def convert_test_global_settings(test_global_settings, logger):
-    """
-        convert to:
-    {
-      "customized_settings": {
-        "string_label": {
-          "type": "text",
-          "content": "string"
-        },
-        "password": {
-          "type": "password",
-          "password": "123"
-        },
-        "checkbox": {
-          "type": "bool",
-          "bool": true
-        }
-      },
-      "proxy_settings": {
-        "proxy_password": "sef",
-        "proxy_type": "http",
-        "proxy_url": "1.2.3.4",
-        "proxy_rdns": "0",
-        "proxy_username": "sdf",
-        "proxy_port": "34",
-        "proxy_enabled": "1"
-      },
-      "global_settings": {
-        "log_level": "INFO"
-      }
-    }
-    """
-    if not test_global_settings:
-        logger.info('test_global_settings="%s"', test_global_settings)
-        return {}
-
-    converted = {}
-    for type, settings in list(test_global_settings.items()):
-        if type == "customized_settings":
-            converted["customized_settings"] = {}
-            for setting in settings:
-                type = get_test_parameter_type(setting)
-                if not type:
-                    msg = f"No type for {setting} in customized_settings"
-                    raise NotImplementedError(msg)
-
-                converted["customized_settings"][setting["name"]] = {
-                    "type": type,
-                    GLOBAL_SETTING_VALUE_NAME_MAP[type]: setting.get("value"),
-                }
-        elif type == "log_settings":
-            converted["global_settings"] = settings
-        else:
-            converted[type] = settings
-    return converted
-
-
-def split_path(path):
-    """
-    split a path into a list
-    """
-    if not path:
-        return None
-    paths = []
-    (head, tail) = op.split(path)
-    while tail:
-        paths.insert(0, tail)
-        (head, tail) = op.split(head)
-    (drive, rest) = op.splitdrive(head)
-    if drive:
-        paths.insert(0, drive)
-    else:
-        paths.insert(0, head)
-    return paths
diff --git a/splunk_add_on_ucc_framework/server_conf.py b/splunk_add_on_ucc_framework/server_conf.py
new file mode 100644
index 000000000..85c724bb9
--- /dev/null
+++ b/splunk_add_on_ucc_framework/server_conf.py
@@ -0,0 +1,36 @@
+#
+# Copyright 2021 Splunk Inc.
+#
+# 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.
+#
+from typing import Sequence
+
+import addonfactory_splunk_conf_parser_lib as conf_parser
+
+SERVER_CONF_FILE_NAME = "server.conf"
+
+
+class ServerConf:
+    def __init__(self):
+        self._server_conf = conf_parser.TABConfigParser()
+
+    def create_default(self, conf_file_names: Sequence[str]):
+        self._server_conf.add_section("shclustering")
+        for conf_file_name in conf_file_names:
+            self._server_conf["shclustering"][
+                f"conf_replication_include.{conf_file_name}"
+            ] = "true"
+
+    def write(self, path: str) -> None:
+        with open(path, "w") as fd:
+            self._server_conf.write(fd)
diff --git a/splunk_add_on_ucc_framework/start_alert_build.py b/splunk_add_on_ucc_framework/start_alert_build.py
deleted file mode 100644
index a44dd363c..000000000
--- a/splunk_add_on_ucc_framework/start_alert_build.py
+++ /dev/null
@@ -1,91 +0,0 @@
-#
-# Copyright 2021 Splunk Inc.
-#
-# 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.
-#
-
-
-import logging
-import os
-import traceback
-
-from splunk_add_on_ucc_framework import normalize
-from splunk_add_on_ucc_framework.modular_alert_builder.build_core import generate_alerts
-
-logger = logging.getLogger("ucc_gen")
-
-
-def validate(alert):
-    try:
-        fields = []
-        if alert.get("entity"):
-            for entity in alert.get("entity"):
-                if entity.get("field") in fields:
-                    raise Exception("Field names should be unique")
-                else:
-                    fields.append(entity.get("field"))
-
-                if entity.get("type") in ["radio", "singleSelect"]:
-                    if not entity.get("options"):
-                        raise Exception(
-                            "{} type must have options parameter".format(
-                                entity.get("type")
-                            )
-                        )
-                elif entity.get("options"):
-                    raise Exception(
-                        "{} type must not contain options parameter".format(
-                            entity.get("type")
-                        )
-                    )
-
-                if entity.get("type") in ["singleSelectSplunkSearch"]:
-                    if not all(
-                        [
-                            entity.get("search"),
-                            entity.get("valueField"),
-                            entity.get("labelField"),
-                        ]
-                    ):
-                        raise Exception(
-                            "{} type must have search, valueLabel and valueField parameters".format(
-                                entity.get("type")
-                            )
-                        )
-                elif any(
-                    [
-                        entity.get("search"),
-                        entity.get("valueField"),
-                        entity.get("labelField"),
-                    ]
-                ):
-                    raise Exception(
-                        "{} type must not contain search, valueField or labelField parameter".format(
-                            entity.get("type")
-                        )
-                    )
-
-    except Exception:
-        logger.error(traceback.format_exc())
-        raise
-
-
-def alert_build(schema_content, product_id, short_name, output_dir, sourcedir):
-    for alert in schema_content["alerts"]:
-        validate(alert)
-
-    # Get the alert schema with required structure
-    envs = normalize.normalize(schema_content, product_id, short_name)
-    pack_folder = os.path.join(sourcedir, "arf_dir_templates", "modular_alert_package")
-    # Generate Alerts
-    generate_alerts(pack_folder, output_dir, envs)
diff --git a/splunk_add_on_ucc_framework/arf_dir_templates/modular_alert_package/${product_id}/appserver/static/alerticon.png b/splunk_add_on_ucc_framework/static/alerticon.png
similarity index 100%
rename from splunk_add_on_ucc_framework/arf_dir_templates/modular_alert_package/${product_id}/appserver/static/alerticon.png
rename to splunk_add_on_ucc_framework/static/alerticon.png


Test patch:
diff --git a/.github/workflows/build-test-release.yml b/.github/workflows/build-test-release.yml
index 04a4b0e5c..7f7e2bf7f 100644
--- a/.github/workflows/build-test-release.yml
+++ b/.github/workflows/build-test-release.yml
@@ -12,6 +12,16 @@ on:
     branches: [main, develop, "release/**"]
 
 jobs:
+  meta:
+    runs-on: ubuntu-latest
+    outputs:
+      matrix_supportedSplunk: ${{ steps.matrix.outputs.supportedSplunk }}
+    steps:
+      - uses: actions/checkout@v3
+      - name: matrix
+        id: matrix
+        uses: splunk/addonfactory-test-matrix-action@v1
+
   fossa-scan:
     continue-on-error: true
     runs-on: ubuntu-latest
@@ -102,14 +112,24 @@ jobs:
       - run: poetry run pytest tests/unit
 
   test-ui:
-    name: test-ui -m ${{ matrix.test-mark }}
+    name: test-ui Splunk ${{ matrix.splunk.version }} -m ${{ matrix.test-mark }}
+    if: contains(github.event.pull_request.labels.*.name, 'run-ui-tests')
     runs-on: ubuntu-latest
     continue-on-error: true
+    needs:
+      - meta
+      - test-unit
+      - test-smoke
     strategy:
       matrix:
+        splunk: ${{ fromJson(needs.meta.outputs.matrix_supportedSplunk) }}
         test-mark:
-          - "default"
-          - "logging_page and not default"
+          - "logging"
+          - "proxy"
+          - "account"
+          - "custom"
+          - "alert"
+          - "input"
     steps:
       - uses: actions/checkout@v3
       - uses: actions/setup-python@v4
@@ -130,10 +150,10 @@ jobs:
           tar -zxf splunk-ucc-ui.tgz -C splunk_add_on_ucc_framework/
           poetry build
       - name: Create Example TA
-        run: poetry run ucc-gen --source tests/testdata/test_addons/package_global_config_configuration/package
+        run: poetry run ucc-gen --source tests/testdata/test_addons/package_global_config_inputs_configuration_alerts/package
       - name: Run Splunk in docker
         run: |
-          ./run_splunk.sh
+          ./run_splunk.sh ${{ matrix.splunk.version }}
           until curl -Lsk "https://localhost:8088/services/collector/health" &>/dev/null ; do echo -n "Waiting for HEC-" && sleep 5 ; done
         timeout-minutes: 5
       - name: Run Pytest
@@ -168,10 +188,12 @@ jobs:
         run: pip install splunk-packaging-toolkit
       - name: Slim tests/expected_output_global_config_inputs_configuration_alerts/Splunk_TA_UCCExample
         run: mkdir tests/slimmed; slim package tests/testdata/expected_addons/expected_output_global_config_inputs_configuration_alerts/Splunk_TA_UCCExample -o tests/slimmed
-      - uses: splunk/appinspect-cli-action@v1.5
+      - uses: splunk/appinspect-cli-action@v1.6
         with:
           app_path: tests/slimmed
           included_tags: ${{ matrix.tags }}
+          appinspect_manual_checks: tests/testdata/expected_addons/expected_output_global_config_inputs_configuration_alerts/.appinspect.manualcheck.yaml
+          appinspect_expected_failures: tests/testdata/expected_addons/expected_output_global_config_inputs_configuration_alerts/.appinspect.expect.yaml
 
   pre-commit:
     runs-on: ubuntu-latest
@@ -227,8 +249,12 @@ jobs:
         run: cp -f THIRDPARTY NOTICE
       - name: Semantic Release
         id: semantic
-        uses: splunk/semantic-release-action@v1.2
+        uses: splunk/semantic-release-action@v1.3
         with:
+          git_committer_name: ${{ secrets.SA_GH_USER_NAME }}
+          git_committer_email: ${{ secrets.SA_GH_USER_EMAIL }}
+          gpg_private_key: ${{ secrets.SA_GPG_PRIVATE_KEY }}
+          passphrase: ${{ secrets.SA_GPG_PASSPHRASE }}
           extra_plugins: |
             @google/semantic-release-replace-plugin
         env:
@@ -239,4 +265,4 @@ jobs:
         with:
           pypi_username: ${{ secrets.PYPI_USERNAME }}
           pypi_token: ${{ secrets.PYPI_TOKEN }}
-  
\ No newline at end of file
+  
diff --git a/tests/smoke/helpers.py b/tests/smoke/helpers.py
new file mode 100644
index 000000000..e81829a6b
--- /dev/null
+++ b/tests/smoke/helpers.py
@@ -0,0 +1,30 @@
+import difflib
+import os
+from typing import List, Tuple
+
+
+def compare_file_content(
+    files_to_be_equal: List[Tuple[str]],
+    expected_folder: str,
+    actual_folder: str,
+):
+    diff_results = []
+    for f in files_to_be_equal:
+        expected_file_path = os.path.join(expected_folder, *f)
+        actual_file_path = os.path.join(actual_folder, *f)
+        with open(expected_file_path) as expected_file:
+            expected_file_lines = expected_file.readlines()
+        with open(actual_file_path) as actual_file:
+            actual_file_lines = actual_file.readlines()
+        for line in difflib.unified_diff(
+            actual_file_lines,
+            expected_file_lines,
+            fromfile=actual_file_path,
+            tofile=expected_file_path,
+            lineterm="",
+        ):
+            diff_results.append(line)
+    if diff_results:
+        for result in diff_results:
+            print(result)
+        assert False, "Some diffs were found"
diff --git a/tests/smoke/test_ucc_build.py b/tests/smoke/test_ucc_build.py
index 3c06a1577..193107de2 100644
--- a/tests/smoke/test_ucc_build.py
+++ b/tests/smoke/test_ucc_build.py
@@ -1,8 +1,9 @@
-import difflib
 import tempfile
 from os import path
 
-import splunk_add_on_ucc_framework as ucc
+from tests.smoke import helpers
+
+from splunk_add_on_ucc_framework.commands import build
 
 
 def test_ucc_generate():
@@ -14,7 +15,7 @@ def test_ucc_generate():
         "package_global_config_inputs_configuration_alerts",
         "package",
     )
-    ucc.generate(source=package_folder)
+    build.generate(source=package_folder)
 
 
 def test_ucc_generate_with_add_on_from_example_folder():
@@ -32,7 +33,7 @@ def test_ucc_generate_with_add_on_from_example_folder():
         "example",
         "globalConfig.json",
     )
-    ucc.generate(source=package_folder, config=config_path)
+    build.generate(source=package_folder, config_path=config_path)
 
 
 def test_ucc_generate_with_config_param():
@@ -55,7 +56,7 @@ def test_ucc_generate_with_config_param():
         "package_global_config_inputs_configuration_alerts",
         "globalConfig.json",
     )
-    ucc.generate(source=package_folder, config=config_path)
+    build.generate(source=package_folder, config_path=config_path)
 
 
 def test_ucc_generate_with_inputs_configuration_alerts():
@@ -68,7 +69,7 @@ def test_ucc_generate_with_inputs_configuration_alerts():
             "package_global_config_inputs_configuration_alerts",
             "package",
         )
-        ucc.generate(source=package_folder, outputdir=temp_dir)
+        build.generate(source=package_folder, output_directory=temp_dir)
 
         expected_folder = path.join(
             path.dirname(__file__),
@@ -93,6 +94,7 @@ def test_ucc_generate_with_inputs_configuration_alerts():
             ("default", "tags.conf"),
             ("default", "splunk_ta_uccexample_settings.conf"),
             ("default", "web.conf"),
+            ("default", "server.conf"),
             ("default", "data", "ui", "alerts", "test_alert.html"),
             ("default", "data", "ui", "nav", "default.xml"),
             ("default", "data", "ui", "views", "configuration.xml"),
@@ -119,26 +121,11 @@ def test_ucc_generate_with_inputs_configuration_alerts():
             ("README", "splunk_ta_uccexample_settings.conf.spec"),
             ("metadata", "default.meta"),
         ]
-        diff_results = []
-        for f in files_to_be_equal:
-            expected_file_path = path.join(expected_folder, *f)
-            actual_file_path = path.join(actual_folder, *f)
-            with open(expected_file_path) as expected_file:
-                expected_file_lines = expected_file.readlines()
-            with open(actual_file_path) as actual_file:
-                actual_file_lines = actual_file.readlines()
-            for line in difflib.unified_diff(
-                actual_file_lines,
-                expected_file_lines,
-                fromfile=actual_file_path,
-                tofile=expected_file_path,
-                lineterm="",
-            ):
-                diff_results.append(line)
-        if diff_results:
-            for result in diff_results:
-                print(result)
-            assert False, "Some diffs were found"
+        helpers.compare_file_content(
+            files_to_be_equal,
+            expected_folder,
+            actual_folder,
+        )
         files_to_exist = [
             ("static", "appIcon.png"),
             ("static", "appIcon_2x.png"),
@@ -166,7 +153,9 @@ def test_ucc_generate_with_configuration():
             "package_global_config_configuration",
             "package",
         )
-        ucc.generate(source=package_folder, outputdir=temp_dir, ta_version="1.1.1")
+        build.generate(
+            source=package_folder, output_directory=temp_dir, addon_version="1.1.1"
+        )
 
         expected_folder = path.join(
             path.dirname(__file__),
@@ -187,6 +176,7 @@ def test_ucc_generate_with_configuration():
             ("default", "restmap.conf"),
             ("default", "splunk_ta_uccexample_settings.conf"),
             ("default", "web.conf"),
+            ("default", "server.conf"),
             ("default", "data", "ui", "nav", "default.xml"),
             ("default", "data", "ui", "views", "configuration.xml"),
             ("default", "data", "ui", "views", "splunk_ta_uccexample_redirect.xml"),
@@ -199,26 +189,11 @@ def test_ucc_generate_with_configuration():
             ("metadata", "default.meta"),
             ("static", "openapi.json"),
         ]
-        diff_results = []
-        for f in files_to_be_equal:
-            expected_file_path = path.join(expected_folder, *f)
-            actual_file_path = path.join(actual_folder, *f)
-            with open(expected_file_path) as expected_file:
-                expected_file_lines = expected_file.readlines()
-            with open(actual_file_path) as actual_file:
-                actual_file_lines = actual_file.readlines()
-            for line in difflib.unified_diff(
-                actual_file_lines,
-                expected_file_lines,
-                fromfile=actual_file_path,
-                tofile=expected_file_path,
-                lineterm="",
-            ):
-                diff_results.append(line)
-        if diff_results:
-            for result in diff_results:
-                print(result)
-            assert False, "Some diffs were found"
+        helpers.compare_file_content(
+            files_to_be_equal,
+            expected_folder,
+            actual_folder,
+        )
         files_to_exist = [
             ("static", "appIcon.png"),
             ("static", "appIcon_2x.png"),
@@ -246,7 +221,7 @@ def test_ucc_generate_with_configuration_files_only():
             "package_no_global_config",
             "package",
         )
-        ucc.generate(source=package_folder, outputdir=temp_dir)
+        build.generate(source=package_folder, output_directory=temp_dir)
 
         expected_folder = path.join(
             path.dirname(__file__),
@@ -269,26 +244,11 @@ def test_ucc_generate_with_configuration_files_only():
             ("default", "tags.conf"),
             ("metadata", "default.meta"),
         ]
-        diff_results = []
-        for f in files_to_be_equal:
-            expected_file_path = path.join(expected_folder, *f)
-            actual_file_path = path.join(actual_folder, *f)
-            with open(expected_file_path) as expected_file:
-                expected_file_lines = expected_file.readlines()
-            with open(actual_file_path) as actual_file:
-                actual_file_lines = actual_file.readlines()
-            for line in difflib.unified_diff(
-                actual_file_lines,
-                expected_file_lines,
-                fromfile=actual_file_path,
-                tofile=expected_file_path,
-                lineterm="",
-            ):
-                diff_results.append(line)
-        if diff_results:
-            for result in diff_results:
-                print(result)
-            assert False, "Some diffs were found"
+        helpers.compare_file_content(
+            files_to_be_equal,
+            expected_folder,
+            actual_folder,
+        )
         files_to_not_exist = [
             ("default", "data", "ui", "nav", "default_no_input.xml"),
         ]
@@ -307,7 +267,7 @@ def test_ucc_generate_openapi_with_configuration_files_only():
             "package_no_global_config",
             "package",
         )
-        ucc.generate(source=package_folder, outputdir=temp_dir)
+        build.generate(source=package_folder, output_directory=temp_dir)
 
         expected_file_path = path.join(
             temp_dir, "Splunk_TA_UCCExample", "static", "openapi.json"
diff --git a/tests/smoke/test_ucc_init.py b/tests/smoke/test_ucc_init.py
index e69de29bb..7b7fa6809 100644
--- a/tests/smoke/test_ucc_init.py
+++ b/tests/smoke/test_ucc_init.py
@@ -0,0 +1,67 @@
+import os
+
+import pytest
+
+from tests.smoke import helpers
+
+from splunk_add_on_ucc_framework.commands import init
+from splunk_add_on_ucc_framework.commands import build
+
+
+def test_ucc_init():
+    addon_name = "demo_addon_for_splunk"
+    generated_addon_path = init.init(
+        addon_name,
+        "Demo Add-on for Splunk",
+        "demo_input",
+        "1.0.0",
+        overwrite=True,
+    )
+    expected_folder = os.path.join(
+        os.path.dirname(__file__),
+        "..",
+        "testdata",
+        "expected_addons",
+        "expected_addon_after_init",
+        addon_name,
+    )
+    files_to_be_equal = [
+        ("README.md",),
+        ("globalConfig.json",),
+        ("package", "README.txt"),
+        ("package", "LICENSE.txt"),
+        ("package", "app.manifest"),
+        ("package", "bin", "demo_input.py"),
+        ("package", "lib", "requirements.txt"),
+    ]
+    helpers.compare_file_content(
+        files_to_be_equal,
+        expected_folder,
+        generated_addon_path,
+    )
+    build.generate(
+        os.path.join(generated_addon_path, "package"),
+        os.path.join(generated_addon_path, "globalConfig.json"),
+        "1.0.0",
+    )
+
+
+def test_ucc_init_if_same_output_then_sys_exit():
+    addon_name = "demo_addon_for_splunk_already_exists"
+    init.init(
+        addon_name,
+        "Demo Add-on for Splunk",
+        "demo_input",
+        "1.0.0",
+        # This `overwrite` is not needed, but it's better to have it for the
+        # local runs, so it overwrites the existing folder locally, but the
+        # next run should produce an error.
+        overwrite=True,
+    )
+    with pytest.raises(SystemExit):
+        init.init(
+            addon_name,
+            "Demo Add-on for Splunk",
+            "demo_input",
+            "1.0.0",
+        )
diff --git a/tests/testdata/expected_addons/expected_addon_after_init/demo_addon_for_splunk/globalConfig.json b/tests/testdata/expected_addons/expected_addon_after_init/demo_addon_for_splunk/globalConfig.json
index 1451a60fa..a98e5426a 100644
--- a/tests/testdata/expected_addons/expected_addon_after_init/demo_addon_for_splunk/globalConfig.json
+++ b/tests/testdata/expected_addons/expected_addon_after_init/demo_addon_for_splunk/globalConfig.json
@@ -199,7 +199,7 @@
     "meta": {
         "name": "demo_addon_for_splunk",
         "restRoot": "demo_addon_for_splunk",
-        "version": "5.18.0R2b855ba9",
+        "version": "1.0.0",
         "displayName": "Demo Add-on for Splunk",
         "schemaVersion": "0.0.3"
     }
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 2906523f5..13470c6d0 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
@@ -5,7 +5,7 @@
         "id": {
             "group": null,
             "name": "demo_addon_for_splunk",
-            "version": "0.0.1"
+            "version": "1.0.0"
         },
         "author": [
             {
diff --git a/tests/testdata/expected_addons/expected_addon_after_init/demo_addon_for_splunk/package/bin/demo_input.py b/tests/testdata/expected_addons/expected_addon_after_init/demo_addon_for_splunk/package/bin/demo_input.py
index a228b40ff..99e509575 100644
--- a/tests/testdata/expected_addons/expected_addon_after_init/demo_addon_for_splunk/package/bin/demo_input.py
+++ b/tests/testdata/expected_addons/expected_addon_after_init/demo_addon_for_splunk/package/bin/demo_input.py
@@ -35,7 +35,7 @@ def get_data_from_api(logger: logging.Logger, api_key: str):
         },
         {
             "line2": "world",
-        }
+        },
     ]
     return dummy_data
 
diff --git a/tests/testdata/expected_addons/expected_addon_after_init/demo_addon_for_splunk/package/default/app.conf b/tests/testdata/expected_addons/expected_addon_after_init/demo_addon_for_splunk/package/default/app.conf
deleted file mode 100644
index fa82d7baf..000000000
--- a/tests/testdata/expected_addons/expected_addon_after_init/demo_addon_for_splunk/package/default/app.conf
+++ /dev/null
@@ -1,23 +0,0 @@
-[install]
-is_configured = false
-state = enabled
-build = 1
-
-[launcher]
-description = Demo Add-on for Splunk
-version = 0.0.1
-
-[ui]
-is_visible = true
-label = Demo Add-on for Splunk
-
-[package]
-id = demo_addon_for_splunk
-
-[id]
-name = demo_addon_for_splunk
-version = 0.0.1
-
-[triggers]
-reload.demo_addon_for_splunk_settings = simple
-reload.demo_addon_for_splunk_account = simple
diff --git a/tests/testdata/expected_addons/expected_addon_after_init/demo_addon_for_splunk/package/default/demo_addon_for_splunk_settings.conf b/tests/testdata/expected_addons/expected_addon_after_init/demo_addon_for_splunk/package/default/demo_addon_for_splunk_settings.conf
deleted file mode 100644
index f2566d453..000000000
--- a/tests/testdata/expected_addons/expected_addon_after_init/demo_addon_for_splunk/package/default/demo_addon_for_splunk_settings.conf
+++ /dev/null
@@ -1,2 +0,0 @@
-[logging]
-loglevel = INFO
diff --git a/tests/testdata/expected_addons/expected_output_global_config_configuration/Splunk_TA_UCCExample/default/server.conf b/tests/testdata/expected_addons/expected_output_global_config_configuration/Splunk_TA_UCCExample/default/server.conf
new file mode 100644
index 000000000..a9c28078c
--- /dev/null
+++ b/tests/testdata/expected_addons/expected_output_global_config_configuration/Splunk_TA_UCCExample/default/server.conf
@@ -0,0 +1,5 @@
+[shclustering]
+conf_replication_include.splunk_ta_uccexample_settings = true
+conf_replication_include.splunk_ta_uccexample_account = true
+conf_replication_include.splunk_ta_uccexample_oauth = true
+
diff --git a/tests/testdata/expected_addons/expected_output_global_config_configuration/Splunk_TA_UCCExample/default/splunk_ta_uccexample_settings.conf b/tests/testdata/expected_addons/expected_output_global_config_configuration/Splunk_TA_UCCExample/default/splunk_ta_uccexample_settings.conf
index 28afc468b..13a8a4c5d 100644
--- a/tests/testdata/expected_addons/expected_output_global_config_configuration/Splunk_TA_UCCExample/default/splunk_ta_uccexample_settings.conf
+++ b/tests/testdata/expected_addons/expected_output_global_config_configuration/Splunk_TA_UCCExample/default/splunk_ta_uccexample_settings.conf
@@ -1,5 +1,20 @@
 [proxy]
+proxy_enabled = 
+proxy_type = http
+proxy_url = 
+proxy_port = 
+proxy_username = 
+proxy_password = 
+proxy_rdns = 
 
 [logging]
+loglevel = INFO
 
-[custom_abc]
\ No newline at end of file
+[custom_abc]
+testString = 
+testNumber = 
+testRegex = 
+testEmail = 
+testIpv4 = 
+testDate = 
+testUrl = 
\ No newline at end of file
diff --git a/tests/testdata/expected_addons/expected_output_global_config_configuration/Splunk_TA_UCCExample/static/openapi.json b/tests/testdata/expected_addons/expected_output_global_config_configuration/Splunk_TA_UCCExample/static/openapi.json
index 97c981e24..a8261c223 100644
--- a/tests/testdata/expected_addons/expected_output_global_config_configuration/Splunk_TA_UCCExample/static/openapi.json
+++ b/tests/testdata/expected_addons/expected_output_global_config_configuration/Splunk_TA_UCCExample/static/openapi.json
@@ -507,7 +507,7 @@
                 }
             ]
         },
-        "/splunk_ta_uccexample_custom_abc": {
+        "/splunk_ta_uccexample_settings/custom_abc": {
             "get": {
                 "responses": {
                     "200": {
diff --git a/tests/testdata/expected_addons/expected_output_global_config_inputs_configuration_alerts/.appinspect.expect.yaml b/tests/testdata/expected_addons/expected_output_global_config_inputs_configuration_alerts/.appinspect.expect.yaml
new file mode 100644
index 000000000..39837449a
--- /dev/null
+++ b/tests/testdata/expected_addons/expected_output_global_config_inputs_configuration_alerts/.appinspect.expect.yaml
@@ -0,0 +1,4 @@
+check_that_extracted_splunk_app_does_not_contain_prohibited_directories_or_files:
+  comment: 'Y'
+check_that_splunk_app_package_does_not_contain_files_outside_of_app:
+  comment: 'Y'
diff --git a/tests/testdata/expected_addons/expected_output_global_config_inputs_configuration_alerts/.appinspect.manualcheck.yaml b/tests/testdata/expected_addons/expected_output_global_config_inputs_configuration_alerts/.appinspect.manualcheck.yaml
new file mode 100644
index 000000000..71505b725
--- /dev/null
+++ b/tests/testdata/expected_addons/expected_output_global_config_inputs_configuration_alerts/.appinspect.manualcheck.yaml
@@ -0,0 +1,34 @@
+check_for_remote_code_execution_in_javascript:
+  comment: 'Y'
+check_external_data_sources:
+  comment: 'Y'
+check_splunk_logo:
+  comment: 'Y'
+check_hard_coded_paths:
+  comment: 'Y'
+check_editing_and_proofreading:
+  comment: 'Y'
+check_install_on_claimed_targets:
+  comment: 'Y'
+check_link_includes_contact_info:
+  comment: 'Y'
+check_for_auto_update_features:
+  comment: 'Y'
+check_for_known_vulnerabilities_in_third_party_libraries:
+  comment: 'Y'
+check_for_reverse_shells:
+  comment: 'Y'
+check_authorization_credentials:
+  comment: 'Y'
+check_embedded_links:
+  comment: 'Y'
+check_fs_writes:
+  comment: 'Y'
+check_for_stacktrace_returned_to_user:
+  comment: 'Y'
+check_dependencies:
+  comment: 'Y'
+check_documented_included_open_source:
+  comment: 'Y'
+check_requires_access_to_files_outside_apps_dir:
+  comment: 'Y'
diff --git a/tests/testdata/expected_addons/expected_output_global_config_inputs_configuration_alerts/Splunk_TA_UCCExample/bin/example_input_two.py b/tests/testdata/expected_addons/expected_output_global_config_inputs_configuration_alerts/Splunk_TA_UCCExample/bin/example_input_two.py
index d364264d6..0945ceec0 100644
--- a/tests/testdata/expected_addons/expected_output_global_config_inputs_configuration_alerts/Splunk_TA_UCCExample/bin/example_input_two.py
+++ b/tests/testdata/expected_addons/expected_output_global_config_inputs_configuration_alerts/Splunk_TA_UCCExample/bin/example_input_two.py
@@ -56,7 +56,7 @@ def get_scheme(self):
         scheme.add_argument(
             smi.Argument(
                 'input_two_radio',
-                required_on_create=False,
+                required_on_create=True,
             )
         )
         
diff --git a/tests/testdata/expected_addons/expected_output_global_config_inputs_configuration_alerts/Splunk_TA_UCCExample/bin/splunk_ta_uccexample_rh_example_input_one.py b/tests/testdata/expected_addons/expected_output_global_config_inputs_configuration_alerts/Splunk_TA_UCCExample/bin/splunk_ta_uccexample_rh_example_input_one.py
index 36a61a428..ad29a486c 100644
--- a/tests/testdata/expected_addons/expected_output_global_config_inputs_configuration_alerts/Splunk_TA_UCCExample/bin/splunk_ta_uccexample_rh_example_input_one.py
+++ b/tests/testdata/expected_addons/expected_output_global_config_inputs_configuration_alerts/Splunk_TA_UCCExample/bin/splunk_ta_uccexample_rh_example_input_one.py
@@ -19,7 +19,7 @@
         'input_one_checkbox',
         required=False,
         encrypted=False,
-        default=None,
+        default=True,
         validator=None
     ), 
     field.RestField(
@@ -40,7 +40,7 @@
         'multipleSelectTest',
         required=False,
         encrypted=False,
-        default=None,
+        default='a|b',
         validator=None
     ), 
     field.RestField(
diff --git a/tests/testdata/expected_addons/expected_output_global_config_inputs_configuration_alerts/Splunk_TA_UCCExample/bin/splunk_ta_uccexample_rh_example_input_two.py b/tests/testdata/expected_addons/expected_output_global_config_inputs_configuration_alerts/Splunk_TA_UCCExample/bin/splunk_ta_uccexample_rh_example_input_two.py
index 841bb879b..518d8d424 100644
--- a/tests/testdata/expected_addons/expected_output_global_config_inputs_configuration_alerts/Splunk_TA_UCCExample/bin/splunk_ta_uccexample_rh_example_input_two.py
+++ b/tests/testdata/expected_addons/expected_output_global_config_inputs_configuration_alerts/Splunk_TA_UCCExample/bin/splunk_ta_uccexample_rh_example_input_two.py
@@ -57,9 +57,9 @@
     ), 
     field.RestField(
         'input_two_radio',
-        required=False,
+        required=True,
         encrypted=False,
-        default='yes',
+        default=None,
         validator=None
     ), 
     field.RestField(
diff --git a/tests/testdata/expected_addons/expected_output_global_config_inputs_configuration_alerts/Splunk_TA_UCCExample/default/alert_actions.conf b/tests/testdata/expected_addons/expected_output_global_config_inputs_configuration_alerts/Splunk_TA_UCCExample/default/alert_actions.conf
index 8e17c30bc..1d0f42d79 100644
--- a/tests/testdata/expected_addons/expected_output_global_config_inputs_configuration_alerts/Splunk_TA_UCCExample/default/alert_actions.conf
+++ b/tests/testdata/expected_addons/expected_output_global_config_inputs_configuration_alerts/Splunk_TA_UCCExample/default/alert_actions.conf
@@ -7,7 +7,7 @@ is_custom = 1
 payload_format = json
 icon_path = alerticon.png
 param.name = xyz
-param.all_incidents = 
+param.all_incidents = 0
 param.table_list = problem
 param.action = two
 param.account = 
diff --git a/tests/testdata/expected_addons/expected_output_global_config_inputs_configuration_alerts/Splunk_TA_UCCExample/default/app.conf b/tests/testdata/expected_addons/expected_output_global_config_inputs_configuration_alerts/Splunk_TA_UCCExample/default/app.conf
index b22215a7b..d8cb2e620 100644
--- a/tests/testdata/expected_addons/expected_output_global_config_inputs_configuration_alerts/Splunk_TA_UCCExample/default/app.conf
+++ b/tests/testdata/expected_addons/expected_output_global_config_inputs_configuration_alerts/Splunk_TA_UCCExample/default/app.conf
@@ -1,11 +1,3 @@
-######################################################
-#
-# ${package.name}
-#
-# ${copyright}
-#
-######################################################
-
 [install]
 build = 1628020885
 
@@ -17,7 +9,6 @@ description = Splunk Add-on for UCC Example
 [ui]
 is_visible = true
 label = Splunk Add-on for UCC Example
-docs_section_override = AddOns:released
 
 [package]
 id = Splunk_TA_UCCExample
diff --git a/tests/testdata/expected_addons/expected_output_global_config_inputs_configuration_alerts/Splunk_TA_UCCExample/default/data/ui/alerts/test_alert.html b/tests/testdata/expected_addons/expected_output_global_config_inputs_configuration_alerts/Splunk_TA_UCCExample/default/data/ui/alerts/test_alert.html
index a778001b3..a89edc88f 100644
--- a/tests/testdata/expected_addons/expected_output_global_config_inputs_configuration_alerts/Splunk_TA_UCCExample/default/data/ui/alerts/test_alert.html
+++ b/tests/testdata/expected_addons/expected_output_global_config_inputs_configuration_alerts/Splunk_TA_UCCExample/default/data/ui/alerts/test_alert.html
@@ -57,7 +57,7 @@
     <div class="controls">
 		<splunk-search-dropdown name="action.test_alert.param.account" id="test_alert_account"                 value-field="title"
                 label-field="title"
-                search="| rest /servicesNS/nobody/TA-SNOW/admin/TA_SNOW_account | dedup title"
+                search="| rest /servicesNS/nobody/Splunk_TA_UCCExample/splunk_ta_uccexample_account | dedup title"
  />
             <span class="help-block">
         Select the account from the dropdown
diff --git a/tests/testdata/expected_addons/expected_output_global_config_inputs_configuration_alerts/Splunk_TA_UCCExample/default/server.conf b/tests/testdata/expected_addons/expected_output_global_config_inputs_configuration_alerts/Splunk_TA_UCCExample/default/server.conf
new file mode 100644
index 000000000..a9c28078c
--- /dev/null
+++ b/tests/testdata/expected_addons/expected_output_global_config_inputs_configuration_alerts/Splunk_TA_UCCExample/default/server.conf
@@ -0,0 +1,5 @@
+[shclustering]
+conf_replication_include.splunk_ta_uccexample_settings = true
+conf_replication_include.splunk_ta_uccexample_account = true
+conf_replication_include.splunk_ta_uccexample_oauth = true
+
diff --git a/tests/testdata/expected_addons/expected_output_global_config_inputs_configuration_alerts/Splunk_TA_UCCExample/default/splunk_ta_uccexample_settings.conf b/tests/testdata/expected_addons/expected_output_global_config_inputs_configuration_alerts/Splunk_TA_UCCExample/default/splunk_ta_uccexample_settings.conf
index 28afc468b..13a8a4c5d 100644
--- a/tests/testdata/expected_addons/expected_output_global_config_inputs_configuration_alerts/Splunk_TA_UCCExample/default/splunk_ta_uccexample_settings.conf
+++ b/tests/testdata/expected_addons/expected_output_global_config_inputs_configuration_alerts/Splunk_TA_UCCExample/default/splunk_ta_uccexample_settings.conf
@@ -1,5 +1,20 @@
 [proxy]
+proxy_enabled = 
+proxy_type = http
+proxy_url = 
+proxy_port = 
+proxy_username = 
+proxy_password = 
+proxy_rdns = 
 
 [logging]
+loglevel = INFO
 
-[custom_abc]
\ No newline at end of file
+[custom_abc]
+testString = 
+testNumber = 
+testRegex = 
+testEmail = 
+testIpv4 = 
+testDate = 
+testUrl = 
\ No newline at end of file
diff --git a/tests/testdata/test_addons/package_global_config_inputs_configuration_alerts/globalConfig.json b/tests/testdata/test_addons/package_global_config_inputs_configuration_alerts/globalConfig.json
index 0908b7a46..48fdce735 100644
--- a/tests/testdata/test_addons/package_global_config_inputs_configuration_alerts/globalConfig.json
+++ b/tests/testdata/test_addons/package_global_config_inputs_configuration_alerts/globalConfig.json
@@ -347,7 +347,7 @@
                         },
                         {
                             "field": "testNumber",
-                            "label": "Test number",
+                            "label": "Test Number",
                             "type": "text",
                             "validators": [
                                 {
@@ -361,7 +361,7 @@
                         },
                         {
                             "field": "testRegex",
-                            "label": "Test regex",
+                            "label": "Test Regex",
                             "type": "text",
                             "validators": [
                                 {
@@ -383,7 +383,7 @@
                         },
                         {
                             "field": "testIpv4",
-                            "label": "Test ipv4",
+                            "label": "Test Ipv4",
                             "type": "text",
                             "validators": [
                                 {
@@ -393,7 +393,7 @@
                         },
                         {
                             "field": "testDate",
-                            "label": "Test date",
+                            "label": "Test Date",
                             "type": "text",
                             "validators": [
                                 {
@@ -403,7 +403,7 @@
                         },
                         {
                             "field": "testUrl",
-                            "label": "Test url",
+                            "label": "Test Url",
                             "type": "text",
                             "validators": [
                                 {
@@ -449,7 +449,8 @@
                             "type": "checkbox",
                             "label": "Example Checkbox",
                             "field": "input_one_checkbox",
-                            "help": "This is an example checkbox for the input one entity"
+                            "help": "This is an example checkbox for the input one entity",
+                            "defaultValue": true
                         },
                         {
                             "type": "radio",
@@ -512,6 +513,7 @@
                             "field": "multipleSelectTest",
                             "label": "Multiple Select Test",
                             "type": "multipleSelect",
+                            "defaultValue": "a|b",
                             "options": {
                                 "delimiter": "|",
                                 "items": [
@@ -776,9 +778,8 @@
                             "type": "radio",
                             "label": "Example Radio",
                             "field": "input_two_radio",
-                            "defaultValue": "yes",
                             "help": "This is an example radio button for the input two entity",
-                            "required": false,
+                            "required": true,
                             "options": {
                                 "items": [
                                     {
@@ -940,7 +941,7 @@
                         "field": "name"
                     },
                     {
-                        "label": "Account Name",
+                        "label": "Account",
                         "field": "account"
                     },
                     {
@@ -1096,7 +1097,7 @@
                     "type": "singleSelectSplunkSearch",
                     "label": "Select Account",
                     "field": "account",
-                    "search": "| rest /servicesNS/nobody/TA-SNOW/admin/TA_SNOW_account | dedup title",
+                    "search": "| rest /servicesNS/nobody/Splunk_TA_UCCExample/splunk_ta_uccexample_account | dedup title",
                     "valueField": "title",
                     "labelField": "title",
                     "help": "Select the account from the dropdown",
@@ -1108,7 +1109,7 @@
     "meta": {
         "name": "Splunk_TA_UCCExample",
         "restRoot": "splunk_ta_uccexample",
-        "version": "5.20.0R9f9c8fed",
+        "version": "5.21.0R9e9820c9",
         "displayName": "Splunk UCC test Add-on",
         "schemaVersion": "0.0.3"
     }
diff --git a/tests/testdata/test_addons/package_global_config_inputs_configuration_alerts/package/default/app.conf b/tests/testdata/test_addons/package_global_config_inputs_configuration_alerts/package/default/app.conf
deleted file mode 100644
index af80bbf04..000000000
--- a/tests/testdata/test_addons/package_global_config_inputs_configuration_alerts/package/default/app.conf
+++ /dev/null
@@ -1,23 +0,0 @@
-######################################################
-#
-# ${package.name}
-#
-# ${copyright}
-#
-######################################################
-
-[install]
-build = 0
-
-[launcher]
-author = Splunk Inc.
-version = 0.1.0
-description = Splunk_TA_UCCExample
-
-[ui]
-is_visible = true
-label = Splunk_TA_UCCExample
-docs_section_override=AddOns:released
-
-[package]
-id = Splunk_TA_UCCExample
diff --git a/tests/ui/conftest.py b/tests/ui/conftest.py
index 35db07722..4676eec29 100644
--- a/tests/ui/conftest.py
+++ b/tests/ui/conftest.py
@@ -1,33 +1,15 @@
-#
-# Copyright 2021 Splunk Inc.
-#
-# 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.
-#
-
 import pytest
 
+from tests.ui.pages.account_page import AccountPage
+from tests.ui.test_account_page import ACCOUNT_CONFIG
 
-@pytest.fixture(scope="session")
-def example_ta():
-    """
-    Fixture for example TA used for testing.
-    """
-    ta_name = "Splunk_TA_UCCExample"
-
-    ta_info = {
-        "name": "Splunk_TA_UCCExample",
-        "proxy_url": f"servicesNS/nobody/{ta_name}/{ta_name}_settings/proxy",
-        "default_log_level": "INFO",
-    }
 
-    return ta_info
+@pytest.fixture
+def add_delete_account(ucc_smartx_rest_helper):
+    account = AccountPage(
+        ucc_smartx_rest_helper=ucc_smartx_rest_helper, open_page=False
+    )
+    url = account._get_account_endpoint()
+    kwargs = ACCOUNT_CONFIG
+    yield account.backend_conf.post_stanza(url, kwargs)
+    account.backend_conf.delete_all_stanzas()
diff --git a/tests/ui/constants.py b/tests/ui/constants.py
new file mode 100644
index 000000000..8c0eacc86
--- /dev/null
+++ b/tests/ui/constants.py
@@ -0,0 +1,1 @@
+ADDON_NAME = "Splunk_TA_UCCExample"
diff --git a/tests/ui/pages/__init__.py b/tests/ui/pages/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/tests/ui/pages/account_page.py b/tests/ui/pages/account_page.py
new file mode 100644
index 000000000..d9e03c31a
--- /dev/null
+++ b/tests/ui/pages/account_page.py
@@ -0,0 +1,157 @@
+from pytest_splunk_addon_ui_smartx.pages.page import Page
+from pytest_splunk_addon_ui_smartx.components.base_component import Selector
+from pytest_splunk_addon_ui_smartx.components.base_component import BaseComponent
+from pytest_splunk_addon_ui_smartx.components.tabs import Tab
+from pytest_splunk_addon_ui_smartx.components.entity import Entity
+from pytest_splunk_addon_ui_smartx.components.controls.button import Button
+from pytest_splunk_addon_ui_smartx.components.controls.single_select import SingleSelect
+from pytest_splunk_addon_ui_smartx.components.controls.oauth_select import OAuthSelect
+from pytest_splunk_addon_ui_smartx.components.controls.multi_select import MultiSelect
+from pytest_splunk_addon_ui_smartx.components.controls.checkbox import Checkbox
+from pytest_splunk_addon_ui_smartx.components.controls.textbox import TextBox
+from pytest_splunk_addon_ui_smartx.components.controls.learn_more import LearnMore
+from pytest_splunk_addon_ui_smartx.components.controls.toggle import Toggle
+from pytest_splunk_addon_ui_smartx.components.controls.message import Message
+from pytest_splunk_addon_ui_smartx.components.conf_table import ConfigurationTable
+from pytest_splunk_addon_ui_smartx.backend_confs import ListBackendConf
+
+from tests.ui import constants as C
+
+
+class AccountEntity(Entity):
+    def __init__(self, browser, container):
+        """
+        :param browser: The selenium webdriver
+        :param container: The container in which the entity is located in
+        """
+        add_btn = Button(
+            browser,
+            Selector(
+                select=container.select + ' button[data-test="button"][label="Add"]'
+            ),
+        )
+        entity_container = Selector(select='[data-test="modal"]')
+
+        super().__init__(browser, entity_container, add_btn=add_btn)
+
+        # Controls
+        self.name = TextBox(
+            browser, Selector(select='[data-test="control-group"][data-name="name"]')
+        )
+        self.environment = SingleSelect(
+            browser,
+            Selector(select='[data-test="control-group"][data-name="custom_endpoint"]'),
+            False,
+        )
+        self.account_radio = Toggle(
+            browser,
+            Selector(select='[data-test="control-group"][data-name="account_radio"]'),
+        )
+        self.example_checkbox = Checkbox(
+            browser,
+            Selector(
+                select='[data-test="control-group"][data-name="account_checkbox"]'
+            ),
+        )
+        self.multiple_select = MultiSelect(
+            browser,
+            Selector(
+                select='[data-test="control-group"][data-name="account_multiple_select"]'
+            ),
+        )
+        self.auth_key = OAuthSelect(
+            browser,
+            Selector(select='[data-test="control-group"][data-name="auth_type"]'),
+        )
+        self.username = TextBox(
+            browser,
+            Selector(select='[data-test="control-group"][data-name="username"]'),
+        )
+        self.password = TextBox(
+            browser,
+            Selector(select='[data-test="control-group"][data-name="password"]'),
+        )
+        self.security_token = TextBox(
+            browser, Selector(select='[data-test="control-group"][data-name="token"]')
+        )
+        self.client_id = TextBox(
+            browser,
+            Selector(select='[data-test="control-group"][data-name="client_id"]'),
+        )
+        self.client_secret = TextBox(
+            browser,
+            Selector(select='[data-test="control-group"][data-name="client_secret"]'),
+        )
+        self.redirect_url = TextBox(
+            browser,
+            Selector(select='[data-test="control-group"][data-name="redirect_url"]'),
+        )
+        self.search_query = TextBox(
+            browser, Selector(select='[data-test="textbox"][role="textbox"]')
+        )
+        self.help_link = LearnMore(
+            browser,
+            Selector(
+                select=entity_container.select
+                + ' [data-test="control-group"][data-name="example_help_link"]'
+            ),
+        )
+        self.title = BaseComponent(browser, Selector(select='[data-test="title"]'))
+
+
+class AccountPage(Page):
+    """
+    Page: Server page
+    """
+
+    def __init__(
+        self,
+        ucc_smartx_selenium_helper=None,
+        ucc_smartx_rest_helper=None,
+        open_page=True,
+    ):
+        """
+        :param ucc_smartx_selenium_helper: smartx configuration fixture
+        """
+        super().__init__(ucc_smartx_selenium_helper, ucc_smartx_rest_helper, open_page)
+        account_container = Selector(select='div[id="accountTab"]')
+
+        if ucc_smartx_selenium_helper:
+            self.title = Message(
+                ucc_smartx_selenium_helper.browser,
+                Selector(select='[data-test="column"] .pageTitle'),
+            )
+            self.description = Message(
+                ucc_smartx_selenium_helper.browser,
+                Selector(select='[data-test="column"] .pageSubtitle'),
+            )
+            self.table = ConfigurationTable(
+                ucc_smartx_selenium_helper.browser, account_container
+            )
+            self.entity = AccountEntity(
+                ucc_smartx_selenium_helper.browser, account_container
+            )
+
+        if ucc_smartx_rest_helper:
+            self.backend_conf = ListBackendConf(
+                self._get_account_endpoint(),
+                ucc_smartx_rest_helper.username,
+                ucc_smartx_rest_helper.password,
+            )
+
+    def open(self):
+        """
+        Open the required page. Page(super) class opens the page by default.
+        """
+
+        self.browser.get(
+            f"{self.splunk_web_url}/en-US/app/{C.ADDON_NAME}/configuration"
+        )
+        tab = Tab(self.browser)
+        tab.open_tab("account")
+
+    def _get_account_endpoint(self):
+        """
+        Get rest endpoint for the configuration
+        """
+        return f"{self.splunk_mgmt_url}/servicesNS/nobody/{C.ADDON_NAME}/splunk_ta_uccexample_account"
diff --git a/tests/ui/pages/alert_action_page.py b/tests/ui/pages/alert_action_page.py
new file mode 100644
index 000000000..32cf72601
--- /dev/null
+++ b/tests/ui/pages/alert_action_page.py
@@ -0,0 +1,79 @@
+from pytest_splunk_addon_ui_smartx.components.base_component import Selector
+from pytest_splunk_addon_ui_smartx.pages.page import Page
+from pytest_splunk_addon_ui_smartx.backend_confs import ListBackendConf
+from pytest_splunk_addon_ui_smartx.alert_actions import AlertEntity, ActionEntity
+from pytest_splunk_addon_ui_smartx.alert_actions.components.textbox import AlertTextBox
+from pytest_splunk_addon_ui_smartx.alert_actions.components.checkbox import (
+    AlertCheckbox,
+)
+from pytest_splunk_addon_ui_smartx.alert_actions.components.single_select import (
+    AlertSingleSelect,
+)
+from pytest_splunk_addon_ui_smartx.alert_actions.components.toggle import AlertToggle
+from pytest_splunk_addon_ui_smartx.alert_actions.components.account_select import (
+    AlertAccountSelect,
+)
+from pytest_splunk_addon_ui_smartx.alert_actions.components.table import AlertTable
+
+
+from tests.ui import constants as C
+
+
+class TestAction(ActionEntity):
+    """
+    Form to configure a new Input
+    """
+
+    def __init__(self, browser):
+        """
+        :param browser: The selenium webdriver
+        """
+
+        super().__init__(browser)
+
+        # Controls
+        self.name = AlertTextBox(
+            browser, Selector(select="#test_alert_name"), use_child_input=True
+        )
+        self.all_incident = AlertCheckbox(
+            browser, Selector(select="#test_alert_all_incidents")
+        )
+        self.table_list = AlertSingleSelect(
+            browser, Selector(select="#test_alert_table_list")
+        )
+        self.action = AlertToggle(
+            browser, Selector(select='input[name="action.test_alert.param.action"]')
+        )
+        self.account = AlertAccountSelect(
+            browser, Selector(select="#test_alert_account")
+        )
+
+
+class AlertPage(Page):
+    def __init__(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper, open_page=True
+    ):
+        super().__init__(ucc_smartx_selenium_helper, ucc_smartx_rest_helper, open_page)
+        if ucc_smartx_selenium_helper:
+            self.alert_table = AlertTable(ucc_smartx_selenium_helper.browser)
+            self.alert_entity = AlertEntity(
+                ucc_smartx_selenium_helper, ucc_smartx_rest_helper
+            )
+            self.action_entity = TestAction(ucc_smartx_selenium_helper.browser)
+        if ucc_smartx_rest_helper:
+            self.backend_conf = ListBackendConf(
+                self._get_alert_endpoint(),
+                ucc_smartx_rest_helper.username,
+                ucc_smartx_rest_helper.password,
+            )
+
+    def open(self):
+        """
+        Abstract Method. Open the page
+        """
+        self.browser.get(
+            f"{self.splunk_web_url}/en-US/manager/{C.ADDON_NAME}/saved/searches"
+        )
+
+    def _get_alert_endpoint(self):
+        return f"{self.splunk_mgmt_url}/servicesNS/admin/{C.ADDON_NAME}/saved/searches/"
diff --git a/tests/ui/pages/custom_page.py b/tests/ui/pages/custom_page.py
new file mode 100644
index 000000000..8453cbf77
--- /dev/null
+++ b/tests/ui/pages/custom_page.py
@@ -0,0 +1,80 @@
+from pytest_splunk_addon_ui_smartx.components.base_component import Selector
+from pytest_splunk_addon_ui_smartx.components.tabs import Tab
+from pytest_splunk_addon_ui_smartx.components.entity import Entity
+from pytest_splunk_addon_ui_smartx.components.controls.textbox import TextBox
+from pytest_splunk_addon_ui_smartx.backend_confs import SingleBackendConf
+
+from tests.ui import constants as C
+
+
+class CustomPage(Entity):
+    def __init__(
+        self,
+        ucc_smartx_selenium_helper=None,
+        ucc_smartx_rest_helper=None,
+    ):
+        """
+        :param ucc_smartx_selenium_helper: fixture contains browser, urls and session key
+        """
+        entity_container = Selector(select='div[id="custom_abcTab"]')
+
+        # Components
+        if ucc_smartx_selenium_helper:
+            super().__init__(ucc_smartx_selenium_helper.browser, entity_container)
+            self.splunk_web_url = ucc_smartx_selenium_helper.splunk_web_url
+            self.open()
+            self.test_string = TextBox(
+                ucc_smartx_selenium_helper.browser,
+                Selector(select='[data-test="control-group"][data-name="testString"]'),
+            )
+            self.test_number = TextBox(
+                ucc_smartx_selenium_helper.browser,
+                Selector(select='[data-test="control-group"][data-name="testNumber"]'),
+            )
+            self.test_regex = TextBox(
+                ucc_smartx_selenium_helper.browser,
+                Selector(select='[data-test="control-group"][data-name="testRegex"]'),
+            )
+            self.test_email = TextBox(
+                ucc_smartx_selenium_helper.browser,
+                Selector(select='[data-test="control-group"][data-name="testEmail"]'),
+            )
+            self.test_ipv4 = TextBox(
+                ucc_smartx_selenium_helper.browser,
+                Selector(select='[data-test="control-group"][data-name="testIpv4"]'),
+            )
+            self.test_date = TextBox(
+                ucc_smartx_selenium_helper.browser,
+                Selector(select='[data-test="control-group"][data-name="testDate"]'),
+            )
+            self.test_url = TextBox(
+                ucc_smartx_selenium_helper.browser,
+                Selector(select='[data-test="control-group"][data-name="testUrl"]'),
+            )
+
+        if ucc_smartx_rest_helper:
+            self.splunk_mgmt_url = ucc_smartx_rest_helper.splunk_mgmt_url
+            self.backend_conf = SingleBackendConf(
+                self._get_custom_url(),
+                ucc_smartx_rest_helper.username,
+                ucc_smartx_rest_helper.password,
+            )
+
+    def open(self):
+        """
+        Open the required page. Page(super) class opens the page by default.
+        """
+        self.browser.get(
+            f"{self.splunk_web_url}/en-US/app/{C.ADDON_NAME}/configuration"
+        )
+        tab = Tab(self.browser)
+        tab.open_tab("custom_abc")
+
+    def _get_custom_url(self):
+        """
+        get rest endpoint for the configuration
+        """
+        return (
+            f"{self.splunk_mgmt_url}/servicesNS/nobody/{C.ADDON_NAME}/"
+            f"configs/conf-splunk_ta_uccexample_settings/custom_abc"
+        )
diff --git a/tests/ui/pages/input_page.py b/tests/ui/pages/input_page.py
new file mode 100644
index 000000000..86e124524
--- /dev/null
+++ b/tests/ui/pages/input_page.py
@@ -0,0 +1,248 @@
+from pytest_splunk_addon_ui_smartx.pages.page import Page
+from pytest_splunk_addon_ui_smartx.components.base_component import Selector
+from pytest_splunk_addon_ui_smartx.components.base_component import BaseComponent
+from pytest_splunk_addon_ui_smartx.components.dropdown import Dropdown
+from pytest_splunk_addon_ui_smartx.components.entity import Entity
+from pytest_splunk_addon_ui_smartx.components.controls.button import Button
+from pytest_splunk_addon_ui_smartx.components.controls.checkbox import Checkbox
+from pytest_splunk_addon_ui_smartx.components.controls.learn_more import LearnMore
+from pytest_splunk_addon_ui_smartx.components.controls.textbox import TextBox
+from pytest_splunk_addon_ui_smartx.components.controls.single_select import SingleSelect
+from pytest_splunk_addon_ui_smartx.components.controls.multi_select import MultiSelect
+from pytest_splunk_addon_ui_smartx.components.controls.message import Message
+from pytest_splunk_addon_ui_smartx.components.input_table import InputTable
+from pytest_splunk_addon_ui_smartx.backend_confs import ListBackendConf
+from pytest_splunk_addon_ui_smartx.components.controls.toggle import Toggle
+
+from tests.ui import constants as C
+
+
+class ExampleInputOne(Entity):
+    """
+    Form to configure a new Input
+    """
+
+    def __init__(self, browser, container):
+        """
+        :param browser: The selenium webdriver
+        :param container: The container in which the entity is located in
+        """
+        add_btn = Button(
+            browser, Selector(select=container.select + '[id="addInputBtn"]')
+        )
+        entity_container = Selector(select='[data-test="modal"]')
+
+        super().__init__(browser, entity_container, add_btn=add_btn)
+
+        # Controls
+        self.name = TextBox(
+            browser, Selector(select=' [data-test="control-group"][data-name="name"]')
+        )
+        self.example_checkbox = Checkbox(
+            browser,
+            Selector(
+                select=entity_container.select
+                + ' [data-test="control-group"][data-name="input_one_checkbox"]'
+            ),
+        )
+        self.example_radio = Toggle(
+            browser,
+            Selector(
+                select=entity_container.select
+                + ' [data-test="control-group"][data-name="input_one_radio"]'
+            ),
+        )
+        self.single_select_group_test = SingleSelect(
+            browser,
+            Selector(
+                select=entity_container.select
+                + ' [data-test="control-group"][data-name="singleSelectTest"]'
+            ),
+            allow_new_values=True,
+        )
+        self.multiple_select_test = MultiSelect(
+            browser,
+            Selector(
+                select=entity_container.select
+                + ' [data-test="control-group"][data-name="multipleSelectTest"]'
+            ),
+        )
+        self.interval = TextBox(
+            browser,
+            Selector(select=' [data-test="control-group"][data-name="interval"]'),
+        )
+        self.index = SingleSelect(
+            browser,
+            Selector(
+                select=entity_container.select
+                + ' [data-test="control-group"][data-name="index"]'
+            ),
+            allow_new_values=True,
+        )
+        self.example_account = SingleSelect(
+            browser,
+            Selector(
+                select=entity_container.select
+                + ' [data-test="control-group"][data-name="account"]'
+            ),
+        )
+        self.object = TextBox(
+            browser, Selector(select=' [data-test="control-group"][data-name="object"]')
+        )
+        self.object_fields = TextBox(
+            browser,
+            Selector(select=' [data-test="control-group"][data-name="object_fields"]'),
+        )
+        self.order_by = TextBox(
+            browser,
+            Selector(select=' [data-test="control-group"][data-name="order_by"]'),
+        )
+        self.query_start_date = TextBox(
+            browser,
+            Selector(select=' [data-test="control-group"][data-name="start_date"]'),
+        )
+        self.limit = TextBox(
+            browser, Selector(select=' [data-test="control-group"][data-name="limit"]')
+        )
+        self.help_link = LearnMore(
+            browser,
+            Selector(
+                select=entity_container.select
+                + ' [data-test="control-group"][data-name="example_help_link"]'
+            ),
+        )
+        self.title = BaseComponent(browser, Selector(select=' [data-test="title"]'))
+
+
+class ExampleInputTwo(Entity):
+    """
+    Form to configure a new Input
+    """
+
+    def __init__(self, browser, container):
+        """
+        :param browser: The selenium webdriver
+        :param container: The container in which the entity is located in
+        """
+        add_btn = Button(
+            browser, Selector(select=container.select + ' [id="addInputBtn"]')
+        )
+        entity_container = Selector(select=' [data-test="modal"]')
+
+        super().__init__(browser, entity_container, add_btn=add_btn)
+
+        # Controls
+        self.name = TextBox(
+            browser, Selector(select='[data-test="control-group"][data-name="name"]')
+        )
+        self.interval = TextBox(
+            browser,
+            Selector(select=' [data-test="control-group"][data-name="interval"]'),
+        )
+        self.index = SingleSelect(
+            browser,
+            Selector(
+                select=entity_container.select
+                + ' [data-test="control-group"][data-name="index"]'
+            ),
+            allow_new_values=True,
+        )
+        self.example_account = SingleSelect(
+            browser,
+            Selector(
+                select=entity_container.select
+                + ' [data-test="control-group"][data-name="account"]'
+            ),
+        )
+        self.example_multiple_select = MultiSelect(
+            browser,
+            Selector(
+                select=entity_container.select
+                + ' [data-test="control-group"][data-name="input_two_multiple_select"]'
+            ),
+        )
+        self.example_checkbox = Checkbox(
+            browser,
+            Selector(
+                select=entity_container.select
+                + ' [data-test="control-group"][data-name="input_two_checkbox"]'
+            ),
+        )
+        self.example_radio = Toggle(
+            browser,
+            Selector(
+                select=entity_container.select
+                + ' [data-test="control-group"][data-name="input_two_radio"]'
+            ),
+        )
+        self.query_start_date = TextBox(
+            browser,
+            Selector(select=' [data-test="control-group"][data-name="start_date"]'),
+        )
+        self.help_link = LearnMore(
+            browser,
+            Selector(
+                select=entity_container.select
+                + ' [data-test="control-group"][data-name="example_help_link"]'
+            ),
+        )
+        self.title = BaseComponent(browser, Selector(select=' [data-test="title"]'))
+
+
+class InputPage(Page):
+    """
+    Page: Input page
+    """
+
+    def __init__(
+        self,
+        ucc_smartx_selenium_helper=None,
+        ucc_smartx_rest_helper=None,
+        open_page=True,
+    ):
+        super().__init__(ucc_smartx_selenium_helper, ucc_smartx_rest_helper, open_page)
+
+        input_container = Selector(select=' div[role="main"]')
+        if ucc_smartx_selenium_helper:
+            self.title = Message(
+                ucc_smartx_selenium_helper.browser,
+                Selector(select=' [data-test="column"] .pageTitle'),
+            )
+            self.description = Message(
+                ucc_smartx_selenium_helper.browser,
+                Selector(select=' [data-test="column"] .pageSubtitle'),
+            )
+            self.create_new_input = Dropdown(
+                ucc_smartx_selenium_helper.browser,
+                Selector(select='[id="addInputBtn"]'),
+            )
+            self.table = InputTable(
+                ucc_smartx_selenium_helper.browser,
+                input_container,
+                mapping={"status": "disabled", "input_type": 3},
+            )
+            self.entity1 = ExampleInputOne(
+                ucc_smartx_selenium_helper.browser, input_container
+            )
+            self.entity2 = ExampleInputTwo(
+                ucc_smartx_selenium_helper.browser, input_container
+            )
+            self.pagination = Dropdown(
+                ucc_smartx_selenium_helper.browser, Selector(select=".dropdownPage")
+            )
+            self.type_filter = Dropdown(
+                ucc_smartx_selenium_helper.browser, Selector(select=".dropdownInput")
+            )
+
+        if ucc_smartx_rest_helper:
+            self.backend_conf = ListBackendConf(
+                self._get_input_endpoint(),
+                ucc_smartx_rest_helper.username,
+                ucc_smartx_rest_helper.password,
+            )
+
+    def open(self):
+        self.browser.get(f"{self.splunk_web_url}/en-US/app/{C.ADDON_NAME}/inputs")
+
+    def _get_input_endpoint(self):
+        return f"{self.splunk_mgmt_url}/servicesNS/nobody/{C.ADDON_NAME}/configs/conf-inputs"
diff --git a/tests/ui/pytest.ini b/tests/ui/pytest.ini
index 50471c1e5..a2d0b95e3 100644
--- a/tests/ui/pytest.ini
+++ b/tests/ui/pytest.ini
@@ -1,19 +1,3 @@
-#
-# Copyright 2021 Splunk Inc.
-#
-# 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.
-#
-
 [pytest]
 norecursedirs = .git .venv venv build node_modules package output assets
 addopts = -vv
@@ -24,8 +8,17 @@ addopts = -vv
           --splunk-hec-token=9b741d03-43e9-4164-908b-e09102327d22
           --browser=chrome
           --local
+          --log-level=INFO
+          --reruns 3
 filterwarnings =
     ignore::DeprecationWarning
 markers =
-    default: tests for default configuration without user interaction for quick regression run
-    logging_page: test related for logging page
\ No newline at end of file
+    proxy: tests related to the proxy page
+    logging: tests related to the logging page
+    account: tests related to the account page
+    custom: tests related to the custom page
+    alert: tests related to the alert page
+    input: tests related to the input page
+    execute_enterprise_cloud_true: tests to be executed on enterprise cloud
+    forwarder: tests to be run on forwarder/standalone
+    sanity_test: tests for sanity check of addons
diff --git a/tests/ui/test_account_page.py b/tests/ui/test_account_page.py
new file mode 100644
index 000000000..9fa4407d7
--- /dev/null
+++ b/tests/ui/test_account_page.py
@@ -0,0 +1,1073 @@
+from pytest_splunk_addon_ui_smartx.base_test import UccTester
+from tests.ui.pages.account_page import AccountPage
+
+import pytest
+import copy
+
+
+ACCOUNT_CONFIG = {
+    "name": "TestAccount",
+    "account_checkbox": 1,
+    "account_multiple_select": "one",
+    "account_radio": "yes",
+    "auth_type": "basic",
+    "custom_endpoint": "login.example.com",
+    "username": "TestUser",
+    "password": "TestPassword",
+    "token": "TestToken",
+    "client_id": "",
+    "client_secret": "",
+    "redirect_url": "",
+    "endpoint": "",
+    "example_help_link": "",
+}
+
+
+@pytest.fixture
+def add_account(ucc_smartx_rest_helper):
+    account = AccountPage(
+        ucc_smartx_rest_helper=ucc_smartx_rest_helper, open_page=False
+    )
+    url = account._get_account_endpoint()
+    kwargs = ACCOUNT_CONFIG
+    yield account.backend_conf.post_stanza(url, kwargs)
+
+
+@pytest.fixture
+def add_multiple_account(ucc_smartx_rest_helper):
+    account = AccountPage(
+        ucc_smartx_rest_helper=ucc_smartx_rest_helper, open_page=False
+    )
+    url = account._get_account_endpoint()
+    for i in range(12):
+        kwargs = copy.deepcopy(ACCOUNT_CONFIG)
+        kwargs["name"] = kwargs["name"] + str(i)
+        account.backend_conf.post_stanza(url, kwargs)
+
+
+@pytest.fixture(autouse=True)
+def delete_accounts(ucc_smartx_rest_helper):
+    yield
+    account = AccountPage(
+        ucc_smartx_rest_helper=ucc_smartx_rest_helper, open_page=False
+    )
+    account.backend_conf.delete_all_stanzas()
+
+
+class TestAccount(UccTester):
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.account
+    def test_account_default_rows_in_table(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper
+    ):
+        """Verifies the default number of rows in the table"""
+        account = AccountPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        self.assert_util(account.table.get_row_count, 0)
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.account
+    def test_account_sort_functionality(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper, add_multiple_account
+    ):
+        """Verifies sorting functionality for name column"""
+        account = AccountPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        account.table.sort_column("Name")
+        sort_order = account.table.get_sort_order()
+        column_values = list(account.table.get_column_values("Name"))
+        column_values = list(str(item) for item in column_values)
+        sorted_values = sorted(column_values, key=str.lower)
+        self.assert_util(sort_order["header"].lower(), "name")
+        self.assert_util(column_values, sorted_values)
+        self.assert_util(sort_order["ascending"], True)
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.account
+    def test_account_count(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper, add_multiple_account
+    ):
+        """Verifies count on table"""
+        account = AccountPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        self.assert_util(
+            account.table.get_count_title,
+            f"{len(account.backend_conf.get_all_stanzas())} Items",
+        )
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.account
+    def test_accounts_filter_functionality_negative(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper, add_account
+    ):
+        """Verifies the filter functionality (Negative)"""
+        account = AccountPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        account.table.set_filter("hello")
+        self.assert_util(account.table.get_row_count, 0)
+        self.assert_util(
+            account.table.get_count_title,
+            f"{account.table.get_row_count()} Item",
+        )
+        account.table.clean_filter()
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.account
+    def test_accounts_filter_functionality_positive(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper, add_account
+    ):
+        """Verifies the filter functionality (Positive)"""
+        account = AccountPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        account.table.set_filter("TestAccount")
+        self.assert_util(account.table.get_row_count, 1)
+        self.assert_util(
+            account.table.get_count_title,
+            f"{account.table.get_row_count()} Item",
+        )
+        account.table.clean_filter()
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.account
+    def test_account_pagination(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper, add_multiple_account
+    ):
+        """Verifies pagination list"""
+        account = AccountPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        name_column_page1 = account.table.get_column_values("name")
+        account.table.switch_to_next()
+        name_column_page2 = account.table.get_column_values("name")
+        self.assert_util(name_column_page1, name_column_page2, "!=")
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.account
+    def test_account_title_and_description(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper
+    ):
+        """Verifies the title and description of the page"""
+        account = AccountPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        self.assert_util(account.title.wait_to_display, "Configuration")
+        self.assert_util(account.description.wait_to_display, "Set up your add-on")
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.account
+    def test_account_add_valid_title(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper
+    ):
+        """Verifies the title of the 'Add Entity'"""
+        account = AccountPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        account.entity.open()
+        self.assert_util(
+            account.entity.title.container.get_attribute("textContent").strip(),
+            "Add Account",
+        )
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.account
+    def test_account_edit_valid_title(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper, add_account
+    ):
+        """Verifies the title of the 'Edit Entity'"""
+        account = AccountPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        account.table.edit_row(ACCOUNT_CONFIG["name"])
+        self.assert_util(
+            account.entity.title.container.get_attribute("textContent").strip(),
+            "Update Account",
+        )
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.account
+    def test_account_clone_valid_title(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper, add_account
+    ):
+        """Verifies the title of the 'Clone Entity'"""
+        account = AccountPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        account.table.clone_row(ACCOUNT_CONFIG["name"])
+        self.assert_util(
+            account.entity.title.container.get_attribute("textContent").strip(),
+            "Clone Account",
+        )
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.account
+    def test_account_delete_valid_title(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper, add_account
+    ):
+        """Verifies the title of the 'Delete Entity'"""
+        account = AccountPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        account.table.delete_row(ACCOUNT_CONFIG["name"], prompt_msg=True)
+        self.assert_util(
+            account.entity.title.container.get_attribute("textContent").strip(),
+            "Delete Confirmation",
+        )
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.account
+    def test_account_add_close_entity(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper
+    ):
+        """Verifies close functionality at time of add"""
+        account = AccountPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        account.entity.open()
+        self.assert_util(account.entity.close, True)
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.account
+    def test_account_add_cancel_entity(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper
+    ):
+        """Verifies cancel functionality at time of add"""
+        account = AccountPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        account.entity.open()
+        self.assert_util(account.entity.cancel, True)
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.account
+    def test_account_delete_close_entity(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper, add_account
+    ):
+        """Verifies close functionality at time of delete"""
+        account = AccountPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        self.assert_util(
+            account.table.delete_row,
+            True,
+            left_args={"name": ACCOUNT_CONFIG["name"], "close": True},
+        )
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.account
+    def test_account_delete_cancel_entity(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper, add_account
+    ):
+        """Verifies cancel functionality at time of delete"""
+        account = AccountPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+
+        self.assert_util(
+            account.table.delete_row,
+            True,
+            left_args={"name": ACCOUNT_CONFIG["name"], "cancel": True},
+        )
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.account
+    def test_account_edit_close_entity(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper, add_account
+    ):
+        """Verifies close functionality at time of edit"""
+        account = AccountPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        account.table.edit_row(ACCOUNT_CONFIG["name"])
+        self.assert_util(account.entity.close, True)
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.account
+    def test_account_edit_cancel_entity(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper, add_account
+    ):
+        """Verifies cancel functionality at time of edit"""
+        account = AccountPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        account.table.edit_row(ACCOUNT_CONFIG["name"])
+        self.assert_util(account.entity.cancel, True)
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.account
+    def test_account_clone_close_entity(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper, add_account
+    ):
+        """Verifies close functionality at time of clone"""
+        account = AccountPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        account.table.clone_row(ACCOUNT_CONFIG["name"])
+        self.assert_util(account.entity.close, True)
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.account
+    def test_account_clone_cancel_entity(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper, add_account
+    ):
+        """Verifies cancel functionality at time of clone"""
+        account = AccountPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        account.table.clone_row(ACCOUNT_CONFIG["name"])
+        self.assert_util(account.entity.cancel, True)
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.account
+    def test_account_delete_valid_prompt_message(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper, add_account
+    ):
+        """Verifies the prompt message of the 'Delete Entity'"""
+        account = AccountPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        prompt_message = account.table.delete_row(
+            ACCOUNT_CONFIG["name"], prompt_msg=True
+        )
+        self.assert_util(
+            prompt_message,
+            'Are you sure you want to delete "{}" ? Ensure that no input is '
+            'configured with "{}" as this will stop data collection for '
+            "that input.".format(ACCOUNT_CONFIG["name"], ACCOUNT_CONFIG["name"]),
+        )
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.account
+    def test_account_required_field_username(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper
+    ):
+        """Verifies required field username"""
+        account = AccountPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        account.entity.open()
+        account.entity.name.set_value(ACCOUNT_CONFIG["name"])
+        account.entity.environment.select("Value2")
+        account.entity.multiple_select.select("Option Two")
+        account.entity.password.set_value("TestEditPassword")
+        account.entity.security_token.set_value("TestEditToken")
+        account.entity.account_radio.select("No")
+        self.assert_util(
+            account.entity.save,
+            "Field Username is required",
+            left_args={"expect_error": True},
+        )
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.account
+    def test_account_required_field_password(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper
+    ):
+        """Verifies required field password"""
+        account = AccountPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        account.entity.open()
+        account.entity.name.set_value(ACCOUNT_CONFIG["name"])
+        account.entity.environment.select("Value2")
+        account.entity.multiple_select.select("Option Two")
+        account.entity.username.set_value("TestEditUser")
+        account.entity.security_token.set_value("TestEditToken")
+        account.entity.account_radio.select("No")
+        self.assert_util(
+            account.entity.save,
+            "Field Password is required",
+            left_args={"expect_error": True},
+        )
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.account
+    def test_account_encrypted_field_password(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper
+    ):
+        """Verifies if the password field is masked or not in the Textbox"""
+        account = AccountPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        account.entity.open()
+        textbox_type = account.entity.password.get_type()
+        self.assert_util(textbox_type, "password")
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.account
+    def test_account_required_field_name(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper
+    ):
+        """Verifies required field name"""
+        account = AccountPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        account.entity.open()
+        account.entity.environment.select("Value2")
+        account.entity.multiple_select.select("Option Two")
+        account.entity.username.set_value("TestEditUser")
+        account.entity.password.set_value("TestEditPassword")
+        account.entity.security_token.set_value("TestEditToken")
+        account.entity.account_radio.select("No")
+        self.assert_util(
+            account.entity.save,
+            "Field Name is required",
+            left_args={"expect_error": True},
+        )
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.account
+    def test_account_basic_fields_label_entity(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper
+    ):
+        """Verifies basic account field label"""
+        account = AccountPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        account.entity.open()
+        self.assert_util(account.entity.name.get_input_label, "Name")
+        self.assert_util(
+            account.entity.environment.get_input_label, "Example Environment"
+        )
+        self.assert_util(
+            account.entity.example_checkbox.get_input_label, "Example Checkbox"
+        )
+        self.assert_util(account.entity.account_radio.get_input_label, "Example Radio")
+        self.assert_util(
+            account.entity.multiple_select.get_input_label, "Example Multiple Select"
+        )
+        self.assert_util(account.entity.auth_key.get_input_label, "Auth Type")
+        self.assert_util(account.entity.username.get_input_label, "Username")
+        self.assert_util(account.entity.password.get_input_label, "Password")
+        self.assert_util(
+            account.entity.security_token.get_input_label, "Security Token"
+        )
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.account
+    def test_account_oauth_fields_label_entity(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper
+    ):
+        """Verifies oauth account field label"""
+        account = AccountPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        account.entity.open()
+        account.entity.auth_key.select("OAuth 2.0 Authentication")
+        self.assert_util(account.entity.name.get_input_label, "Name")
+        self.assert_util(
+            account.entity.environment.get_input_label, "Example Environment"
+        )
+        self.assert_util(
+            account.entity.example_checkbox.get_input_label, "Example Checkbox"
+        )
+        self.assert_util(account.entity.account_radio.get_input_label, "Example Radio")
+        self.assert_util(
+            account.entity.multiple_select.get_input_label, "Example Multiple Select"
+        )
+        self.assert_util(account.entity.auth_key.get_input_label, "Auth Type")
+        self.assert_util(account.entity.client_id.get_input_label, "Client Id")
+        self.assert_util(account.entity.client_secret.get_input_label, "Client Secret")
+        self.assert_util(account.entity.redirect_url.get_input_label, "Redirect url")
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.account
+    def test_account_fields_placeholder_value(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper
+    ):
+        """Verifies account field placeholder value"""
+        account = AccountPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        account.entity.open()
+        self.assert_util(account.entity.name.get_placeholder_value, "Required")
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.account
+    def test_account_help_text_entity(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper
+    ):
+        """Verifies help text for the field name"""
+        account = AccountPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        account.entity.open()
+        self.assert_util(
+            account.entity.name.get_help_text, "Enter a unique name for this account."
+        )
+        self.assert_util(
+            account.entity.example_checkbox.get_help_text,
+            "This is an example checkbox for the account entity",
+        )
+        self.assert_util(
+            account.entity.account_radio.get_help_text,
+            "This is an example radio button for the account entity",
+        )
+        self.assert_util(
+            account.entity.multiple_select.get_help_text,
+            "This is an example multipleSelect for account entity",
+        )
+        self.assert_util(
+            account.entity.username.get_help_text,
+            "Enter the username for this account.",
+        )
+        self.assert_util(
+            account.entity.password.get_help_text,
+            "Enter the password for this account.",
+        )
+        self.assert_util(
+            account.entity.security_token.get_help_text, "Enter the security token."
+        )
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.account
+    @pytest.mark.xfail(
+        reason="account.entity.environment.cancel_selected_value() is flaky, "
+        "passing locally, not working in CI, will be investigated later."
+    )
+    def test_account_required_field_example_environment(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper
+    ):
+        """Verifies required field example environment"""
+        account = AccountPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        account.entity.open()
+        account.entity.name.set_value(ACCOUNT_CONFIG["name"])
+        account.entity.multiple_select.select("Option Two")
+        account.entity.username.set_value("TestEditUser")
+        account.entity.password.set_value("TestEditPassword")
+        account.entity.security_token.set_value("TestEditToken")
+        account.entity.account_radio.select("No")
+        account.entity.environment.cancel_selected_value()
+        self.assert_util(
+            account.entity.save,
+            "Field Example Environment is required",
+            left_args={"expect_error": True},
+        )
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.account
+    def test_account_required_field_example_multiple_select(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper
+    ):
+        """Verifies required field example multiple select"""
+        account = AccountPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        account.entity.open()
+        account.entity.name.set_value(ACCOUNT_CONFIG["name"])
+        account.entity.environment.select("Value2")
+        account.entity.username.set_value("TestEditUser")
+        account.entity.password.set_value("TestEditPassword")
+        account.entity.security_token.set_value("TestEditToken")
+        account.entity.account_radio.select("No")
+        self.assert_util(
+            account.entity.save,
+            "Field Example Multiple Select is required",
+            left_args={"expect_error": True},
+        )
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.account
+    def test_account_required_field_client_id(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper
+    ):
+        """Verifies required field client id"""
+        account = AccountPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        account.entity.open()
+        account.entity.name.set_value(ACCOUNT_CONFIG["name"])
+        account.entity.environment.select("Value2")
+        account.entity.account_radio.select("No")
+        account.entity.multiple_select.select("Option Two")
+        account.entity.auth_key.select("OAuth 2.0 Authentication")
+        self.assert_util(
+            account.entity.save,
+            "Field Client Id is required",
+            left_args={"expect_error": True},
+        )
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.account
+    def test_account_required_field_client_secret(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper
+    ):
+        """Verifies required field client secret"""
+        account = AccountPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        account.entity.open()
+        account.entity.auth_key.select("OAuth 2.0 Authentication")
+        account.entity.name.set_value(ACCOUNT_CONFIG["name"])
+        account.entity.multiple_select.select("Option One")
+        account.entity.account_radio.select("No")
+        account.entity.client_id.set_value("TestClientId")
+        self.assert_util(
+            account.entity.save,
+            "Field Client Secret is required",
+            left_args={"expect_error": True},
+        )
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.account
+    def test_account_encrypted_field_client_secret(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper
+    ):
+        """Verifies if the password field is masked or not in the Textbox"""
+        account = AccountPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        account.entity.open()
+        account.entity.auth_key.select("OAuth 2.0 Authentication")
+        textbox_type = account.entity.client_secret.get_type()
+        self.assert_util(textbox_type, "password")
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.account
+    def test_account_valid_account_name(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper
+    ):
+        """Verifies whether adding special characters, number in starting of name field displays validation error"""
+        account = AccountPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        account.entity.open()
+        account.entity.username.set_value(ACCOUNT_CONFIG["username"])
+        account.entity.password.set_value(ACCOUNT_CONFIG["password"])
+        account.entity.name.set_value("123TestAccount")
+        self.assert_util(
+            account.entity.save,
+            "Name must begin with a letter and consist exclusively of alphanumeric characters and underscores.",
+            left_args={"expect_error": True},
+        )
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.account
+    def test_account_valid_length_name(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper
+    ):
+        """Verifies the name field should not be more than 50 characters"""
+        account = AccountPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        account.entity.open()
+        account.entity.username.set_value(ACCOUNT_CONFIG["username"])
+        account.entity.password.set_value(ACCOUNT_CONFIG["password"])
+        account.entity.name.set_value("t" * 51)
+        self.assert_util(
+            account.entity.save,
+            "Length of ID should be between 1 and 50",
+            left_args={"expect_error": True},
+        )
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.account
+    def test_account_default_value_example_environment(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper
+    ):
+        """Verifies default value of example environment"""
+        account = AccountPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        account.entity.open()
+        account.entity.name.set_value(ACCOUNT_CONFIG["name"])
+        account.entity.username.set_value(ACCOUNT_CONFIG["username"])
+        self.assert_util(account.entity.environment.get_value, "Value1")
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.account
+    def test_account_list_example_environment(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper
+    ):
+        """Verifies example environment list dropdown"""
+        account = AccountPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        account.entity.open()
+        self.assert_util(
+            account.entity.environment.list_of_values, ["Value1", "Value2", "Other"]
+        )
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.account
+    def test_account_default_value_auth_type(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper
+    ):
+        """Verifies default value of auth type"""
+        account = AccountPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        account.entity.open()
+        self.assert_util(account.entity.auth_key.get_value, "basic")
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.account
+    def test_account_list_auth_type(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper
+    ):
+        """Verifies auth type list dropdown"""
+        account = AccountPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        account.entity.open()
+        self.assert_util(
+            account.entity.auth_key.list_of_values(),
+            ["Basic Authentication", "OAuth 2.0 Authentication"],
+        )
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.account
+    def test_account_checked_example_checkbox(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper
+    ):
+        """Verifies Check/Uncheck in example checkbox"""
+        account = AccountPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        account.entity.open()
+        account.entity.example_checkbox.check()
+        self.assert_util(account.entity.example_checkbox.is_checked, True)
+        account.entity.example_checkbox.uncheck()
+        self.assert_util(account.entity.example_checkbox.is_checked, False)
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.account
+    def test_account_select_value_example_environment(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper
+    ):
+        """Verifies example environment select value"""
+        account = AccountPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        account.entity.open()
+        account.entity.environment.select("Value2")
+        self.assert_util(account.entity.environment.get_value, "Value2")
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.account
+    def test_account_list_example_multiple_select(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper
+    ):
+        """Verifies example multiple select list dropdown"""
+        account = AccountPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        account.entity.open()
+        self.assert_util(
+            account.entity.multiple_select.list_of_values(),
+            ["Option One", "Option Two"],
+        )
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.account
+    def test_account_select_value_example_multiple_select(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper
+    ):
+        """Verifies example multiple select value"""
+        account = AccountPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        account.entity.open()
+        account.entity.multiple_select.select("Option One")
+        account.entity.multiple_select.select("Option Two")
+        self.assert_util(
+            account.entity.multiple_select.get_values, ["Option One", "Option Two"]
+        )
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.account
+    def test_account_search_value_example_multiple_select(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper
+    ):
+        """Verifies example multiple select search functionality"""
+        account = AccountPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        account.entity.open()
+        self.assert_util(
+            account.entity.multiple_select.search_get_list,
+            ["Option One"],
+            left_args={"value": "Option One"},
+        )
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.account
+    def test_account_default_value_example_radio(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper
+    ):
+        """Verifies default value of example radio"""
+        account = AccountPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        account.entity.open()
+        self.assert_util(account.entity.account_radio.get_value, "Yes")
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.account
+    def test_add_account_duplicate_name(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper, add_account
+    ):
+        """Verifies by saving an entity with duplicate name at time of add it displays and error"""
+        account = AccountPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        account.entity.open()
+        account.entity.name.set_value(ACCOUNT_CONFIG["name"])
+        account.entity.multiple_select.select("Option One")
+        account.entity.username.set_value(ACCOUNT_CONFIG["username"])
+        account.entity.password.set_value(ACCOUNT_CONFIG["password"])
+        account.entity.account_radio.select("Yes")
+        self.assert_util(
+            account.entity.save,
+            "Name {} is already in use".format(ACCOUNT_CONFIG["name"]),
+            left_args={"expect_error": True},
+        )
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.account
+    @pytest.mark.sanity_test
+    def test_account_delete_row_frontend_validation(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper, add_account
+    ):
+        """Verifies the frontend delete functionlity"""
+        account = AccountPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        account.table.delete_row(ACCOUNT_CONFIG["name"])
+        account.table.wait_for_rows_to_appear(0)
+        self.assert_util(ACCOUNT_CONFIG["name"], account.table.get_table, "not in")
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.account
+    def test_account_edit_uneditable_field_name(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper, add_account
+    ):
+        """Verifies the frontend uneditable fields at time of edit of the account"""
+        account = AccountPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        account.table.edit_row(ACCOUNT_CONFIG["name"])
+        self.assert_util(account.entity.name.is_editable, False)
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.account
+    def test_account_credentials_encrypted_value(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper, add_account
+    ):
+        """Verifies the default number of rows in the table"""
+        account = AccountPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        account.table.wait_for_rows_to_appear(1)
+        assert account.backend_conf.get_stanza(ACCOUNT_CONFIG["name"]) == {
+            "account_checkbox": "1",
+            "account_multiple_select": ACCOUNT_CONFIG["account_multiple_select"],
+            "account_radio": "1",
+            "auth_type": ACCOUNT_CONFIG["auth_type"],
+            "username": ACCOUNT_CONFIG["username"],
+            "custom_endpoint": ACCOUNT_CONFIG["custom_endpoint"],
+            "disabled": False,
+            "password": "******",
+            "token": "******",
+        }
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.account
+    @pytest.mark.sanity_test
+    def test_account_add_frontend_validation(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper
+    ):
+        """Verifies the frontend after adding account"""
+        account = AccountPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        account.entity.open()
+        account.entity.name.set_value(ACCOUNT_CONFIG["name"])
+        account.entity.username.set_value(ACCOUNT_CONFIG["username"])
+        account.entity.multiple_select.select("Option One")
+        account.entity.password.set_value(ACCOUNT_CONFIG["password"])
+        account.entity.security_token.set_value("TestToken")
+        self.assert_util(account.entity.save, True)
+        account.table.wait_for_rows_to_appear(1)
+        self.assert_util(
+            account.table.get_table()[ACCOUNT_CONFIG["name"]],
+            {
+                "name": ACCOUNT_CONFIG["name"],
+                "auth type": "basic",
+                "actions": "Edit | Clone | Delete",
+            },
+        )
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.account
+    @pytest.mark.sanity_test
+    def test_account_edit_frontend_validation(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper, add_account
+    ):
+        """Verifies the frontend edit functionality"""
+        account = AccountPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        account.table.edit_row(ACCOUNT_CONFIG["name"])
+        account.entity.environment.select("Value2")
+        account.entity.multiple_select.select("Option Two")
+        account.entity.username.set_value("TestEditUser")
+        account.entity.password.set_value("TestEditPassword")
+        account.entity.security_token.set_value("TestEditToken")
+        account.entity.account_radio.select("No")
+        self.assert_util(account.entity.save, True)
+        account.table.wait_for_rows_to_appear(1)
+        self.assert_util(
+            account.table.get_table()[ACCOUNT_CONFIG["name"]],
+            {
+                "name": "TestAccount",
+                "auth type": "basic",
+                "actions": "Edit | Clone | Delete",
+            },
+        )
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.account
+    def test_clone_account_duplicate_name(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper, add_account
+    ):
+        """Verifies by saving an entity with duplicate name at time of clone it displays and error"""
+        account = AccountPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        account.table.clone_row(ACCOUNT_CONFIG["name"])
+        account.entity.name.set_value(ACCOUNT_CONFIG["name"])
+        self.assert_util(
+            account.entity.save,
+            "Name {} is already in use".format(ACCOUNT_CONFIG["name"]),
+            left_args={"expect_error": True},
+        )
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.account
+    @pytest.mark.sanity_test
+    def test_account_clone_frontend_validation(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper, add_account
+    ):
+        """Verifies the frontend clone functionality"""
+        account = AccountPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        account.table.wait_for_rows_to_appear(1)
+        account.table.clone_row(ACCOUNT_CONFIG["name"])
+        account.entity.name.set_value("TestAccount2")
+        account.entity.username.set_value("TestUserClone")
+        account.entity.password.set_value("TestPasswordClone")
+        account.entity.security_token.set_value("TestTokenClone")
+        account.entity.account_radio.select("Yes")
+        self.assert_util(account.entity.save, True)
+        self.assert_util(
+            account.table.get_table()["TestAccount2"],
+            {
+                "name": "TestAccount2",
+                "auth type": "basic",
+                "actions": "Edit | Clone | Delete",
+            },
+        )
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.account
+    def test_account_clone_default_values(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper, add_account
+    ):
+        """Verifies the frontend default fields at time of clone"""
+        account = AccountPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        account.table.clone_row(ACCOUNT_CONFIG["name"])
+        self.assert_util(account.entity.name.get_value, "")
+        self.assert_util(account.entity.username.get_value, "TestUser")
+        self.assert_util(account.entity.multiple_select.get_values, ["Option One"])
+        self.assert_util(account.entity.auth_key.get_value, "basic")
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.account
+    @pytest.mark.sanity_test
+    def test_account_add_backend_validation(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper
+    ):
+        """Verifies the account in backend after adding account from frontend"""
+        account = AccountPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        account.entity.open()
+        account.entity.name.set_value(ACCOUNT_CONFIG["name"])
+        account.entity.username.set_value(ACCOUNT_CONFIG["username"])
+        account.entity.multiple_select.select("Option One")
+        account.entity.password.set_value(ACCOUNT_CONFIG["password"])
+        account.entity.security_token.set_value(ACCOUNT_CONFIG["token"])
+        self.assert_util(account.entity.save, True)
+        account.table.wait_for_rows_to_appear(1)
+        assert account.backend_conf.get_stanza(
+            ACCOUNT_CONFIG["name"], decrypt=True
+        ) == {
+            "account_multiple_select": ACCOUNT_CONFIG["account_multiple_select"],
+            "account_radio": "1",
+            "auth_type": ACCOUNT_CONFIG["auth_type"],
+            "username": ACCOUNT_CONFIG["username"],
+            "custom_endpoint": ACCOUNT_CONFIG["custom_endpoint"],
+            "disabled": False,
+            "password": ACCOUNT_CONFIG["password"],
+            "token": ACCOUNT_CONFIG["token"],
+        }
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.account
+    @pytest.mark.sanity_test
+    def test_account_edit_backend_validation(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper, add_account
+    ):
+        """Verifies the account in backend after editing account from frontend"""
+        account = AccountPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        account.table.edit_row(ACCOUNT_CONFIG["name"])
+        account.entity.multiple_select.select("Option Two")
+        account.entity.username.set_value("TestEditUser")
+        account.entity.password.set_value("TestEditPassword")
+        account.entity.security_token.set_value("TestEditToken")
+        account.entity.account_radio.select("No")
+        account.entity.save()
+        account.table.wait_for_rows_to_appear(1)
+        assert account.backend_conf.get_stanza(
+            ACCOUNT_CONFIG["name"], decrypt=True
+        ) == {
+            "account_checkbox": "1",
+            "account_multiple_select": "one,two",
+            "account_radio": "0",
+            "auth_type": "basic",
+            "username": "TestEditUser",
+            "custom_endpoint": "login.example.com",
+            "disabled": False,
+            "password": "TestEditPassword",
+            "token": "TestEditToken",
+        }
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.account
+    @pytest.mark.sanity_test
+    def test_account_clone_backend_validation(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper, add_account
+    ):
+        """Verifies the account in backend after cloning account from frontend"""
+        account = AccountPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        account.table.wait_for_rows_to_appear(1)
+        account.table.clone_row(ACCOUNT_CONFIG["name"])
+        account.entity.name.set_value("TestAccountClone")
+        account.entity.multiple_select.select("Option Two")
+        account.entity.username.set_value("TestCloneUser")
+        account.entity.password.set_value("TestEditPassword")
+        account.entity.security_token.set_value("TestEditToken")
+        account.entity.account_radio.select("No")
+        account.entity.save()
+        account.table.wait_for_rows_to_appear(2)
+        assert account.backend_conf.get_stanza("TestAccountClone", decrypt=True) == {
+            "account_checkbox": "1",
+            "account_multiple_select": "one,two",
+            "account_radio": "0",
+            "auth_type": "basic",
+            "username": "TestCloneUser",
+            "custom_endpoint": "login.example.com",
+            "disabled": False,
+            "password": "TestEditPassword",
+            "token": "TestEditToken",
+        }
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.account
+    @pytest.mark.sanity_test
+    def test_account_delete_row_backend_validation(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper, add_account
+    ):
+        """Verifies the account in backend after deleting the account from frontend"""
+        account = AccountPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        account.table.delete_row(ACCOUNT_CONFIG["name"])
+        account.table.wait_for_rows_to_appear(0)
+        self.assert_util(
+            ACCOUNT_CONFIG["name"],
+            account.backend_conf.get_all_stanzas().keys(),
+            "not in",
+        )
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.account
+    def test_account_helplink(self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper):
+        """Verifies whether the table help link redirects to the correct URL"""
+        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)
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.account
+    def test_account_delete_account_in_use(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper, add_account
+    ):
+        """Verifies by deleting the input used account"""
+        account = AccountPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        self.assert_util(
+            account.table.delete_row,
+            r'Are you sure you want to delete "TestAccount" ? Ensure that no '
+            r'input is configured with "TestAccount" as this will stop '
+            r"data collection for that input.",
+            left_args={"name": ACCOUNT_CONFIG["name"], "prompt_msg": True},
+        )
diff --git a/tests/ui/test_alert_actions_page.py b/tests/ui/test_alert_actions_page.py
new file mode 100644
index 000000000..e29e0c692
--- /dev/null
+++ b/tests/ui/test_alert_actions_page.py
@@ -0,0 +1,226 @@
+import pytest
+from pytest_splunk_addon_ui_smartx.base_test import UccTester
+from pytest_splunk_addon_ui_smartx.components.base_component import Selector
+from pytest_splunk_addon_ui_smartx.components.controls.button import Button
+
+from tests.ui.pages.alert_action_page import AlertPage
+
+
+@pytest.fixture(autouse=True)
+def setup_alert(ucc_smartx_selenium_helper):
+    """
+    Skip the popups in Splunk before executing the tests
+    """
+    try:
+        # Splunk 8.x
+        if not setup_alert.first_execution:
+            return
+        AlertPage(ucc_smartx_selenium_helper, None, open_page=False)
+        intro_popup = Button(
+            ucc_smartx_selenium_helper.browser,
+            Selector(select=".modal-footer .btn-save"),
+        )
+        intro_popup.wait_to_be_clickable()
+        intro_popup.click()
+        setup_alert.first_execution = False
+
+        # Splunk 8.2.x
+        intro_popup = Button(
+            ucc_smartx_selenium_helper.browser,
+            Selector(select='[data-test="label"]'),
+        )
+        intro_popup.wait_to_be_clickable()
+        intro_popup.click()
+
+        # Splunk 8.0.x
+        important_changes_coming = Button(
+            ucc_smartx_selenium_helper.browser,
+            Selector(
+                select='div[data-test-name="python3-notification-modal"] '
+                'button[data-test="button"][data-appearance="secondary"]'
+            ),
+        )
+        important_changes_coming.wait_to_be_clickable()
+        important_changes_coming.click()
+    except:  # noqa: E722
+        pass
+
+
+setup_alert.first_execution = True
+
+
+@pytest.fixture
+def clean_alert(ucc_smartx_rest_helper):
+    yield None
+
+    alert_page = AlertPage(None, ucc_smartx_rest_helper, open_page=False)
+    alert_page.backend_conf.delete_all_stanzas(query="search=test_alert")
+
+
+class TestAlertActions(UccTester):
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.alert
+    def test_action_in_list(self, ucc_smartx_selenium_helper):
+        alert_page = AlertPage(ucc_smartx_selenium_helper, None)
+        alert_page.alert_entity.open()
+        alert_page.alert_entity.add_action_dropdown.wait_for_values()
+        self.assert_util(
+            "Test Alert",
+            alert_page.alert_entity.add_action_dropdown.get_value_list,
+            "in",
+        )
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.alert
+    def test_dropdown_list(self, ucc_smartx_selenium_helper):
+        alert_page = AlertPage(ucc_smartx_selenium_helper, None)
+        alert_page.alert_entity.open()
+        alert_page.alert_entity.add_action_dropdown.wait_for_values()
+        alert_page.alert_entity.add_action_dropdown.select_action("Test Alert")
+
+        self.assert_util(
+            alert_page.action_entity.table_list.list_of_values, ["incident", "problem"]
+        )
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.alert
+    def test_account_functionality(
+        self, ucc_smartx_selenium_helper, add_delete_account
+    ):
+        alert_page = AlertPage(ucc_smartx_selenium_helper, None)
+        alert_page.alert_entity.open()
+        alert_page.alert_entity.add_action_dropdown.wait_for_values()
+        alert_page.alert_entity.add_action_dropdown.select_action("Test Alert")
+
+        alert_page.action_entity.account.select("TestAccount")
+        alert_page.action_entity.account.wait_for_values()
+        self.assert_util(alert_page.action_entity.account.get_value, "TestAccount")
+        alert_page.action_entity.account.cancel_selected_value()
+        alert_page.action_entity.account.wait_for_values()
+        self.assert_util(
+            alert_page.action_entity.account.get_value, "TestAccount", "!="
+        )
+        self.assert_util(
+            "TestAccount", alert_page.action_entity.account.list_of_values, "in"
+        )
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.alert
+    def test_checkbox(self, ucc_smartx_selenium_helper):
+        alert_page = AlertPage(ucc_smartx_selenium_helper, None)
+        alert_page.alert_entity.open()
+        alert_page.alert_entity.add_action_dropdown.wait_for_values()
+        alert_page.alert_entity.add_action_dropdown.select_action("Test Alert")
+
+        alert_page.action_entity.all_incident.toggle()
+        self.assert_util(alert_page.action_entity.all_incident.is_checked, True)
+        alert_page.action_entity.all_incident.toggle()
+        self.assert_util(alert_page.action_entity.all_incident.is_checked, False)
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.alert
+    def test_single_select(self, ucc_smartx_selenium_helper):
+        alert_page = AlertPage(ucc_smartx_selenium_helper, None)
+        alert_page.alert_entity.open()
+        alert_page.alert_entity.add_action_dropdown.wait_for_values()
+        alert_page.alert_entity.add_action_dropdown.select_action("Test Alert")
+
+        self.assert_util(
+            alert_page.action_entity.table_list.list_of_values, ["incident", "problem"]
+        )
+        alert_page.action_entity.table_list.select("problem")
+        self.assert_util(alert_page.action_entity.table_list.get_value, "problem")
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.alert
+    def test_toggle(self, ucc_smartx_selenium_helper):
+        alert_page = AlertPage(ucc_smartx_selenium_helper, None)
+        alert_page.alert_entity.open()
+        alert_page.alert_entity.add_action_dropdown.wait_for_values()
+        alert_page.alert_entity.add_action_dropdown.select_action("Test Alert")
+
+        alert_page.action_entity.action.select("Delete")
+        assert alert_page.action_entity.action.get_value() == "Delete"
+        alert_page.action_entity.action.select("Update")
+        assert alert_page.action_entity.action.get_value() == "Update"
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.sanity_test
+    @pytest.mark.alert
+    def test_alert_action_save(
+        self, ucc_smartx_selenium_helper, clean_alert, add_delete_account
+    ):
+        alert_page = AlertPage(ucc_smartx_selenium_helper, None)
+        alert_page.alert_entity.open()
+        alert_page.alert_entity.add_action_dropdown.wait_for_values()
+
+        # Add Alert Configs
+        alert_page.alert_entity.name.set_value("test_alert")
+        alert_page.alert_entity.search.set_value("| search index=_internal" + "\ue007")
+
+        # Open Action
+        alert_page.alert_entity.add_action_dropdown.select_action("Test Alert")
+
+        # Add Action Configs
+        alert_page.action_entity.name.set_value("test_action")
+        alert_page.action_entity.all_incident.toggle()
+        alert_page.action_entity.action.select("Delete")
+        alert_page.action_entity.account.select("TestAccount")
+        alert_page.alert_entity.save()
+        alert_page = AlertPage(ucc_smartx_selenium_helper, None)
+        alert_page.alert_table.wait_for_rows_to_appear()
+        assert "test_alert" in alert_page.alert_table.get_column_values("name")
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.alert
+    def test_alert_help_text_entity(self, ucc_smartx_selenium_helper):
+        alert_page = AlertPage(ucc_smartx_selenium_helper, None)
+        alert_page.alert_entity.open()
+        alert_page.alert_entity.add_action_dropdown.wait_for_values()
+        alert_page.alert_entity.add_action_dropdown.select_action("Test Alert")
+        self.assert_util(
+            alert_page.action_entity.name.get_help_text, "Please enter your name"
+        )
+        self.assert_util(
+            alert_page.action_entity.all_incident.get_help_text,
+            "Tick if you want to update all incidents/problems",
+        )
+        self.assert_util(
+            alert_page.action_entity.table_list.get_help_text, "Please select the table"
+        )
+        self.assert_util(
+            alert_page.action_entity.action.get_help_text,
+            "Select the action you want to perform",
+        )
+        self.assert_util(
+            alert_page.action_entity.account.get_help_text,
+            "Select the account from the dropdown",
+        )
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.alert
+    def test_alert_action_label_entity(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper
+    ):
+        """Verifies the alert field labels"""
+        alert_page = AlertPage(ucc_smartx_selenium_helper, None)
+        alert_page.alert_entity.open()
+        alert_page.alert_entity.add_action_dropdown.wait_for_values()
+        alert_page.alert_entity.add_action_dropdown.select_action("Test Alert")
+        self.assert_util(alert_page.action_entity.name.get_input_label, "Name *")
+        self.assert_util(
+            alert_page.action_entity.table_list.get_input_label, "Table List"
+        )
+        self.assert_util(alert_page.action_entity.action.get_input_label, "Action:")
+        self.assert_util(
+            alert_page.action_entity.account.get_input_label, "Select Account *"
+        )
diff --git a/tests/ui/test_custom_page.py b/tests/ui/test_custom_page.py
new file mode 100644
index 000000000..203c4b7c0
--- /dev/null
+++ b/tests/ui/test_custom_page.py
@@ -0,0 +1,242 @@
+from pytest_splunk_addon_ui_smartx.base_test import UccTester
+from tests.ui.pages.custom_page import CustomPage
+import pytest
+
+DEFAULT_CONFIGURATION = {
+    "testNumber": "",
+    "testRegex": "",
+    "testString": "",
+    "testEmail": "",
+    "testIpv4": "",
+    "testDate": "",
+    "testUrl": "",
+}
+
+
+@pytest.fixture
+def reset_configuration(ucc_smartx_selenium_helper, ucc_smartx_rest_helper):
+    yield
+    custom = CustomPage(ucc_smartx_rest_helper=ucc_smartx_rest_helper)
+    custom.backend_conf.update_parameters(DEFAULT_CONFIGURATION)
+
+
+class TestCustomPage(UccTester):
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.custom
+    def test_custom_fields_label_entity(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper
+    ):
+        """Verifies custom fields label"""
+        custom = CustomPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        self.assert_util(custom.test_string.get_input_label, "Test String")
+        self.assert_util(custom.test_number.get_input_label, "Test Number")
+        self.assert_util(custom.test_regex.get_input_label, "Test Regex")
+        self.assert_util(custom.test_email.get_input_label, "Test Email")
+        self.assert_util(custom.test_ipv4.get_input_label, "Test Ipv4")
+        self.assert_util(custom.test_date.get_input_label, "Test Date")
+        self.assert_util(custom.test_url.get_input_label, "Test Url")
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.custom
+    def test_custom_fields_placeholder_value(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper
+    ):
+        """Verifies custom fields placeholder value"""
+        custom = CustomPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        self.assert_util(custom.test_string.get_placeholder_value, "optional")
+        self.assert_util(custom.test_number.get_placeholder_value, "optional")
+        self.assert_util(custom.test_regex.get_placeholder_value, "optional")
+        self.assert_util(custom.test_email.get_placeholder_value, "optional")
+        self.assert_util(custom.test_ipv4.get_placeholder_value, "optional")
+        self.assert_util(custom.test_date.get_placeholder_value, "optional")
+        self.assert_util(custom.test_url.get_placeholder_value, "optional")
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.custom
+    @pytest.mark.sanity_test
+    def test_custom_frontend_backend_validation(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper, reset_configuration
+    ):
+        """This test case checks the validates frontend save in custom tab"""
+        custom = CustomPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        custom.test_string.set_value("test_str")
+        custom.test_number.set_value("7")
+        custom.test_regex.set_value("test_rex")
+        custom.test_email.set_value("test@a.b")
+        custom.test_ipv4.set_value("1.10.1.100")
+        custom.test_date.set_value("2020-09-18")
+        custom.test_url.set_value("https://docs.splunk.com/Documentation")
+        self.assert_util(custom.save, True)
+        self.assert_util(
+            custom.backend_conf.get_stanza,
+            {
+                "disabled": False,
+                "testNumber": "7",
+                "testRegex": "test_rex",
+                "testString": "test_str",
+                "testEmail": "test@a.b",
+                "testIpv4": "1.10.1.100",
+                "testDate": "2020-09-18",
+                "testUrl": "https://docs.splunk.com/Documentation",
+            },
+        )
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.custom
+    def test_custom_valid_length_test_string_greater(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper
+    ):
+        """This test case checks length of test string field should be greater than 4"""
+        custom = CustomPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        custom.test_string.set_value("test")
+        self.assert_util(
+            custom.save,
+            r"Length of Test String should be greater than or equal to 5",
+            left_args={"expect_error": True},
+        )
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.custom
+    def test_custom_valid_length_test_string_less(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper
+    ):
+        """This test case checks length of test string field should be less than 11"""
+        custom = CustomPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        custom.test_string.set_value("test_string")
+        self.assert_util(
+            custom.save,
+            r"Length of Test String should be less than or equal to 10",
+            left_args={"expect_error": True},
+        )
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.custom
+    def test_custom_valid_input_test_number(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper
+    ):
+        """This test case checks test number field should be integer"""
+        custom = CustomPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        custom.test_string.set_value("test_str")
+        custom.test_number.set_value("a")
+        self.assert_util(
+            custom.save,
+            r"Field Test Number is not a number",
+            left_args={"expect_error": True},
+        )
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.custom
+    def test_custom_valid_range_test_number(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper
+    ):
+        """This test case checks range of test number field should be between 1 to 10"""
+        custom = CustomPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        custom.test_string.set_value("test_str")
+        custom.test_number.set_value("50")
+        self.assert_util(
+            custom.save,
+            r"Field Test Number should be within the range of [1 and 10]",
+            left_args={"expect_error": True},
+        )
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.custom
+    def test_custom_valid_input_test_regex(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper
+    ):
+        """This test case checks regex of test regex field"""
+        custom = CustomPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        custom.test_string.set_value("test_str")
+        custom.test_number.set_value("5")
+        custom.test_regex.set_value("$$")
+        self.assert_util(
+            custom.save,
+            r"Characters of Name should match regex ^\w+$ .",
+            left_args={"expect_error": True},
+        )
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.custom
+    def test_custom_valid_input_test_email(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper
+    ):
+        """This test case checks test email field should be email"""
+        custom = CustomPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        custom.test_string.set_value("test_str")
+        custom.test_number.set_value("5")
+        custom.test_regex.set_value("test_rex")
+        custom.test_email.set_value("abc")
+        self.assert_util(
+            custom.save,
+            r"Field Test Email is not a valid email address",
+            left_args={"expect_error": True},
+        )
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.custom
+    def test_custom_valid_input_test_ipv4(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper
+    ):
+        """This test case checks test ipv4 field should be valid ipv4"""
+        custom = CustomPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        custom.test_string.set_value("test_str")
+        custom.test_number.set_value("5")
+        custom.test_regex.set_value("test_rex")
+        custom.test_email.set_value("test@a.b")
+        custom.test_ipv4.set_value("10.1.11")
+        self.assert_util(
+            custom.save,
+            r"Field Test Ipv4 is not a valid IPV4 address",
+            left_args={"expect_error": True},
+        )
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.custom
+    def test_custom_valid_input_test_date(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper
+    ):
+        """This test case checks test date field should be in ISO 8601 format"""
+        custom = CustomPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        custom.test_string.set_value("test_str")
+        custom.test_number.set_value("5")
+        custom.test_regex.set_value("test_rex")
+        custom.test_email.set_value("test@a.b")
+        custom.test_ipv4.set_value("10.1.11.1")
+        custom.test_date.set_value("20-10-2020")
+        self.assert_util(
+            custom.save,
+            r"Field Test Date is not a valid date in ISO 8601 format",
+            left_args={"expect_error": True},
+        )
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.custom
+    def test_custom_valid_input_test_url(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper
+    ):
+        """This test case checks test url field should be valid url"""
+        custom = CustomPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        custom.test_string.set_value("test_str")
+        custom.test_number.set_value("5")
+        custom.test_regex.set_value("test_rex")
+        custom.test_email.set_value("test@a.b")
+        custom.test_ipv4.set_value("10.1.11.1")
+        custom.test_date.set_value("2020-09-18")
+        custom.test_url.set_value("\\\\")
+        self.assert_util(
+            custom.save,
+            r"Field Test Url is not a valid URL",
+            left_args={"expect_error": True},
+        )
diff --git a/tests/ui/test_input_page.py b/tests/ui/test_input_page.py
new file mode 100644
index 000000000..65d142b7f
--- /dev/null
+++ b/tests/ui/test_input_page.py
@@ -0,0 +1,2193 @@
+from pytest_splunk_addon_ui_smartx.base_test import UccTester
+from tests.ui.pages.account_page import AccountPage
+from tests.ui.pages.input_page import InputPage
+import pytest
+
+
+@pytest.fixture(scope="module", autouse=True)
+def add_account(ucc_smartx_rest_helper):
+    account = AccountPage(
+        ucc_smartx_rest_helper=ucc_smartx_rest_helper, open_page=False
+    )
+    url = account._get_account_endpoint()
+    kwargs = {
+        "name": "test_input",
+        "account_checkbox": 1,
+        "account_multiple_select": "one",
+        "account_radio": "yes",
+        "auth_type": "basic",
+        "custom_endpoint": "login.example.com",
+        "username": "TestUser",
+        "password": "TestPassword",
+        "token": "TestToken",
+        "client_id": "",
+        "client_secret": "",
+        "redirect_url": "",
+        "endpoint": "",
+        "example_help_link": "",
+    }
+    yield account.backend_conf.post_stanza(url, kwargs)
+    account.backend_conf.delete_all_stanzas()
+
+
+@pytest.fixture
+def add_multiple_inputs(ucc_smartx_rest_helper):
+    input_page = InputPage(
+        ucc_smartx_rest_helper=ucc_smartx_rest_helper, open_page=False
+    )
+    url = input_page._get_input_endpoint()
+    for i in range(50):
+        kwargs = {
+            "name": "example_input_one://dummy_input_one" + str(i),
+            "account": "test_input",
+            "input_one_checkbox": "1",
+            "input_one_radio": "yes",
+            "interval": "90",
+            "limit": "1000",
+            "multipleSelectTest": "a|b",
+            "object": "test_object",
+            "object_fields": "test_field",
+            "order_by": "LastModifiedDate",
+            "singleSelectTest": "two",
+            "start_date": "2020-12-11T20:00:32.000z",
+            "disabled": 0,
+        }
+        input_page.backend_conf.post_stanza(url, kwargs)
+        kwargs = {
+            "name": "example_input_two://dummy_input_two" + str(i),
+            "account": "test_input",
+            "input_two_checkbox": "1",
+            "input_two_radio": "no",
+            "interval": "100",
+            "input_two_multiple_select": "one,two",
+            "index": "main",
+            "start_date": "2016-10-10T12:10:15.000z",
+            "disabled": 0,
+        }
+        input_page.backend_conf.post_stanza(url, kwargs)
+
+
+@pytest.fixture
+def add_input_one(ucc_smartx_rest_helper):
+    input_page = InputPage(
+        ucc_smartx_rest_helper=ucc_smartx_rest_helper, open_page=False
+    )
+    url = input_page._get_input_endpoint()
+    kwargs = {
+        "name": "example_input_one://dummy_input_one",
+        "account": "test_input",
+        "input_one_checkbox": "1",
+        "input_one_radio": "yes",
+        "interval": "90",
+        "limit": "1000",
+        "multipleSelectTest": "a|b",
+        "object": "test_object",
+        "object_fields": "test_field",
+        "order_by": "LastModifiedDate",
+        "singleSelectTest": "two",
+        "start_date": "2020-12-11T20:00:32.000z",
+        "disabled": 0,
+    }
+    yield input_page.backend_conf.post_stanza(url, kwargs)
+
+
+@pytest.fixture
+def add_input_two(ucc_smartx_rest_helper):
+    input_page = InputPage(
+        ucc_smartx_rest_helper=ucc_smartx_rest_helper, open_page=False
+    )
+    url = input_page._get_input_endpoint()
+    kwargs = {
+        "name": "example_input_two://dummy_input_two",
+        "account": "test_input",
+        "input_two_checkbox": "1",
+        "input_two_radio": "no",
+        "interval": "100",
+        "input_two_multiple_select": "one,two",
+        "index": "main",
+        "start_date": "2016-10-10T12:10:15.000z",
+        "disabled": 0,
+    }
+    yield input_page.backend_conf.post_stanza(url, kwargs)
+
+
+@pytest.fixture(autouse=True)
+# All the inputs created should start with dummy_input as prefix
+def delete_inputs(ucc_smartx_rest_helper):
+    yield
+    input_page = InputPage(
+        ucc_smartx_rest_helper=ucc_smartx_rest_helper, open_page=False
+    )
+    input_page.backend_conf.delete_all_stanzas("search=dummy_input")
+
+
+class TestInputPage(UccTester):
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.input
+    def test_inputs_displayed_columns(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper
+    ):
+        """Verifies headers of input table"""
+        input_page = InputPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        header_list = ["Name", "Account", "Interval", "Index", "Status", "Actions"]
+        self.assert_util(input_page.table.get_headers, header_list)
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.input
+    def test_inputs_pagination_list(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper
+    ):
+        """Verifies pagination list"""
+        input_page = InputPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        self.assert_util(
+            input_page.pagination.get_pagination_list,
+            ["10 Per Page", "25 Per Page", "50 Per Page"],
+        )
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.input
+    def test_inputs_pagination(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper, add_multiple_inputs
+    ):
+        """Verifies pagination functionality by creating 100 accounts"""
+        input_page = InputPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        input_page.open()
+        self.assert_util(
+            input_page.pagination.select_page_option,
+            True,
+            left_args={"value": "50 Per Page"},
+        )
+        self.assert_util(input_page.table.switch_to_page, True, left_args={"value": 2})
+        self.assert_util(input_page.table.switch_to_prev, True)
+        self.assert_util(input_page.table.switch_to_next, True)
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.input
+    def test_inputs_sort_functionality(
+        self,
+        ucc_smartx_selenium_helper,
+        ucc_smartx_rest_helper,
+        add_input_one,
+        add_input_two,
+    ):
+        """Verifies sorting functionality for name column"""
+        input_page = InputPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        input_page.pagination.select_page_option("50 Per Page")
+        input_page.table.sort_column("Name")
+        sort_order = input_page.table.get_sort_order()
+        column_values = list(input_page.table.get_column_values("Name"))
+        column_values = list(str(item) for item in column_values)
+        sorted_values = sorted(column_values, key=str.lower)
+        self.assert_util(sort_order["header"].lower(), "name")
+        self.assert_util(column_values, sorted_values)
+        self.assert_util(sort_order["ascending"], True)
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.input
+    def test_inputs_filter_functionality_negative(
+        self,
+        ucc_smartx_selenium_helper,
+        ucc_smartx_rest_helper,
+        add_input_one,
+        add_input_two,
+    ):
+        """Verifies the filter functionality (Negative)"""
+        input_page = InputPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        input_page.table.set_filter("hello")
+        self.assert_util(input_page.table.get_row_count, 0)
+        self.assert_util(
+            input_page.table.get_count_title,
+            f"{input_page.table.get_row_count()} Input",
+        )
+        input_page.table.clean_filter()
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.input
+    def test_inputs_filter_functionality_positive(
+        self,
+        ucc_smartx_selenium_helper,
+        ucc_smartx_rest_helper,
+        add_input_one,
+        add_input_two,
+    ):
+        """Verifies the filter functionality (Positive)"""
+        input_page = InputPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        input_page.table.set_filter("dummy")
+        self.assert_util(input_page.table.get_row_count, 2)
+        self.assert_util(
+            input_page.table.get_count_title,
+            f"{input_page.table.get_row_count()} Inputs",
+        )
+        input_page.table.clean_filter()
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.input
+    def test_inputs_default_rows_in_table(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper
+    ):
+        """Verifies the default number of rows in the table"""
+        input_page = InputPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        self.assert_util(input_page.table.get_row_count, 0)
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.input
+    def test_inputs_create_new_input_list_values(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper
+    ):
+        """Verifies input list dropdown"""
+        input_page = InputPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        create_new_input_list = [
+            "Example Input One",
+            "Example Input Two",
+            "Example Input Three",
+            "Example Input Four",
+        ]
+        self.assert_util(
+            input_page.create_new_input.get_inputs_list, create_new_input_list
+        )
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.input
+    def test_inputs_input_type_list_values(
+        self,
+        ucc_smartx_selenium_helper,
+        ucc_smartx_rest_helper,
+        add_input_one,
+        add_input_two,
+    ):
+        """Verifies input type filter list"""
+        input_page = InputPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        type_filter_list = [
+            "All",
+            "Example Input One",
+            "Example Input Two",
+            "Example Input Three",
+            "Example Input Four",
+        ]
+        self.assert_util(input_page.type_filter.get_input_type_list, type_filter_list)
+        input_page.type_filter.select_input_type(
+            "Example Input One", open_dropdown=False
+        )
+        self.assert_util(input_page.table.get_row_count, 1)
+        input_page.type_filter.select_input_type("Example Input Two")
+        self.assert_util(input_page.table.get_row_count, 1)
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.input
+    @pytest.mark.xfail(
+        reason="It seems that we can delete an account in use. "
+        "Needs more investigation and clean up in the individual repositories."
+    )
+    def test_inputs_delete_enabled_input(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper, add_input_one
+    ):
+        """Verifies enabled input should not delete"""
+        input_page = InputPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        self.assert_util(
+            input_page.table.delete_row,
+            r"Can't delete enabled input",
+            left_args={"name": "dummy_input_one"},
+        )
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.input
+    def test_inputs_more_info(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper, add_input_one
+    ):
+        """Verifies the expand functionality of the inputs table"""
+        input_page = InputPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        self.assert_util(
+            input_page.table.get_more_info,
+            {
+                "Name": "dummy_input_one",
+                "Interval": "90",
+                "Index": "default",
+                "Status": "Enabled",
+                "Example Account": "test_input",
+                "Object": "test_object",
+                "Object Fields": "test_field",
+                "Order By": "LastModifiedDate",
+                "Query Start Date": "2020-12-11T20:00:32.000z",
+                "Limit": "1000",
+            },
+            left_args={"name": "dummy_input_one"},
+        )
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.input
+    def test_inputs_enable_disable(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper, add_input_one
+    ):
+        """Verifies enable and disable functionality of the input"""
+        input_page = InputPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        self.assert_util(
+            input_page.table.input_status_toggle,
+            True,
+            left_args={"name": "dummy_input_one", "enable": False},
+        )
+        self.assert_util(
+            input_page.table.input_status_toggle,
+            True,
+            left_args={"name": "dummy_input_one", "enable": True},
+        )
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.input
+    def test_inputs_count(
+        self,
+        ucc_smartx_selenium_helper,
+        ucc_smartx_rest_helper,
+        add_input_one,
+        add_input_two,
+    ):
+        """Verifies count on table"""
+        input_page = InputPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        self.assert_util(
+            input_page.table.get_count_title,
+            f"{input_page.table.get_row_count()} Inputs",
+        )
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.input
+    def test_inputs_title_and_description(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper
+    ):
+        """Verifies the title and description of the page"""
+        input_page = InputPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        self.assert_util(input_page.title.wait_to_display, "Inputs")
+        self.assert_util(
+            input_page.description.wait_to_display, "Manage your data inputs"
+        )
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.input
+    def test_example_input_one_required_field_name(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper
+    ):
+        """Verifies required field name in example input one"""
+        input_page = InputPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        input_page.create_new_input.select("Example Input One")
+        input_page.entity1.example_account.wait_for_values()
+        input_page.entity1.example_radio.select("Yes")
+        input_page.entity1.single_select_group_test.select("two")
+        input_page.entity1.interval.set_value("90")
+        input_page.entity1.example_account.select("test_input")
+        input_page.entity1.object.set_value("test_object")
+        input_page.entity1.object_fields.set_value("test_field")
+        input_page.entity1.query_start_date.set_value("2020-12-11T20:00:32.000z")
+        self.assert_util(
+            input_page.entity1.save,
+            r"Field Name is required",
+            left_args={"expect_error": True},
+        )
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.input
+    def test_example_input_one_valid_length_name(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper
+    ):
+        """Verifies the name field should not be more than 100 characters"""
+        input_page = InputPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        input_page.create_new_input.select("Example Input One")
+        input_page.entity1.example_account.wait_for_values()
+        name_value = "a" * 101
+        input_page.entity1.name.set_value(name_value)
+        self.assert_util(
+            input_page.entity1.save,
+            r"Length of input name should be between 1 and 100",
+            left_args={"expect_error": True},
+        )
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.input
+    def test_example_input_one_valid_input_name(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper
+    ):
+        """Verifies whether adding special characters, name field displays validation error"""
+        input_page = InputPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        input_page.create_new_input.select("Example Input One")
+        input_page.entity1.example_account.wait_for_values()
+        input_page.entity1.name.set_value("$$test_name")
+        self.assert_util(
+            input_page.entity1.save,
+            r"Input Name must begin with a letter and consist exclusively of alphanumeric characters and underscores.",
+            left_args={"expect_error": True},
+        )
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.input
+    def test_example_input_one_list_single_select_group_test(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper
+    ):
+        """Verifies values Single Select Group Test dropdown in example input one"""
+        input_page = InputPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        single_select_group_test_list = ["One", "Two", "Three", "Four"]
+        input_page.create_new_input.select("Example Input One")
+        input_page.entity1.example_account.wait_for_values()
+        self.assert_util(
+            input_page.entity1.single_select_group_test.list_of_values(),
+            single_select_group_test_list,
+        )
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.input
+    def test_example_input_one_select_value_single_select_group_test(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper
+    ):
+        """Verifies selected value of Single Select Group Test dropdown in example input one"""
+        input_page = InputPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        selected_value = "Two"
+        input_page.create_new_input.select("Example Input One")
+        input_page.entity1.example_account.wait_for_values()
+        input_page.entity1.single_select_group_test.select(selected_value)
+        self.assert_util(
+            input_page.entity1.single_select_group_test.get_value, selected_value
+        )
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.input
+    def test_example_input_one_search_value_single_select_group_test(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper
+    ):
+        """Verifies singleSelect search functionality"""
+        input_page = InputPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        input_page.create_new_input.select("Example Input One")
+        input_page.entity1.example_account.wait_for_values()
+        self.assert_util(
+            input_page.entity1.single_select_group_test.search_get_list,
+            ["one", "One"],
+            left_args={"value": "one"},
+        )
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.input
+    def test_example_input_one_default_value_multiple_select_test(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper
+    ):
+        """Verifies default values of Multiple Select Test dropdown in example input one"""
+        input_page = InputPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        input_page.create_new_input.select("Example Input One")
+        input_page.entity1.example_account.wait_for_values()
+        default_values = ["A", "B"]
+        self.assert_util(
+            input_page.entity1.multiple_select_test.get_values, default_values
+        )
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.input
+    def test_example_input_one_list_multiple_select_test(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper
+    ):
+        """Verifies values of Multiple Select Test dropdown in example input one"""
+        input_page = InputPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        input_page.create_new_input.select("Example Input One")
+        input_page.entity1.example_account.wait_for_values()
+        input_page.entity1.multiple_select_test.deselect_all()
+        multiple_select_test = ["A", "B"]
+        self.assert_util(
+            input_page.entity1.multiple_select_test.list_of_values(),
+            multiple_select_test,
+        )
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.input
+    def test_example_input_one_select_value_multiple_select_test(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper
+    ):
+        """Verifies selected single value of Multiple Select Test dropdown in example input one"""
+        input_page = InputPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        selected_value = ["A"]
+        input_page.create_new_input.select("Example Input One")
+        input_page.entity1.example_account.wait_for_values()
+        input_page.entity1.multiple_select_test.deselect_all()
+        for each in selected_value:
+            input_page.entity1.multiple_select_test.select(each)
+        self.assert_util(
+            input_page.entity1.multiple_select_test.get_values, selected_value
+        )
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.input
+    def test_example_input_one_select_multiple_values_multiple_select_test(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper
+    ):
+        """Verifies selected multiple values of Multiple Select Test dropdown in example input one"""
+        input_page = InputPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        selected_values = ["A", "B"]
+        input_page.create_new_input.select("Example Input One")
+        input_page.entity1.example_account.wait_for_values()
+        input_page.entity1.multiple_select_test.deselect_all()
+        for each in selected_values:
+            input_page.entity1.multiple_select_test.select(each)
+        self.assert_util(
+            input_page.entity1.multiple_select_test.get_values, selected_values
+        )
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.input
+    def test_example_input_one_deselect_multiple_select_test(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper
+    ):
+        """Verifies deselect in Multiple Select Test dropdown in example input one"""
+        input_page = InputPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        selected_values = ["A", "B"]
+        input_page.create_new_input.select("Example Input One")
+        input_page.entity1.example_account.wait_for_values()
+        input_page.entity1.multiple_select_test.deselect_all()
+        for each in selected_values:
+            input_page.entity1.multiple_select_test.select(each)
+        input_page.entity1.multiple_select_test.deselect("A")
+        self.assert_util(input_page.entity1.multiple_select_test.get_values, ["B"])
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.input
+    def test_example_input_one_search_value_multiple_select_test(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper
+    ):
+        """Verifies multiple select seach funtionality properly"""
+        input_page = InputPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        input_page.create_new_input.select("Example Input One")
+        input_page.entity1.example_account.wait_for_values()
+        input_page.entity1.multiple_select_test.deselect_all()
+        self.assert_util(
+            input_page.entity1.multiple_select_test.search_get_list,
+            ["A"],
+            left_args={"value": "A"},
+        )
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.input
+    def test_example_input_one_default_value_example_checkbox(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper
+    ):
+        """Verifies default value of example checkbox in example input one"""
+        input_page = InputPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        input_page.create_new_input.select("Example Input One")
+        input_page.entity1.example_account.wait_for_values()
+        self.assert_util(input_page.entity1.example_checkbox.is_checked, True)
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.input
+    def test_example_input_one_unchecked_example_checkbox(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper
+    ):
+        """Verifies Uncheck in example checkbox in example input one"""
+        input_page = InputPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        input_page.create_new_input.select("Example Input One")
+        input_page.entity1.example_account.wait_for_values()
+        input_page.entity1.example_checkbox.check()
+        self.assert_util(input_page.entity1.example_checkbox.uncheck, True)
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.input
+    def test_example_input_one_checked_example_checkbox(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper
+    ):
+        """Verifies checked in example checkbox in example input one"""
+        input_page = InputPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        input_page.create_new_input.select("Example Input One")
+        input_page.entity1.example_account.wait_for_values()
+        input_page.entity1.example_checkbox.uncheck()
+        self.assert_util(input_page.entity1.example_checkbox.check, True)
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.input
+    def test_example_input_one_default_value_example_radio(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper
+    ):
+        """Verifies default value of example radio in example input one"""
+        input_page = InputPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        input_page.create_new_input.select("Example Input One")
+        input_page.entity1.example_account.wait_for_values()
+        self.assert_util(input_page.entity1.example_radio.get_value, "Yes")
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.input
+    def test_example_input_one_select_value_example_radio(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper
+    ):
+        """Verifies selected value of example radio in example input one"""
+        input_page = InputPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        input_page.create_new_input.select("Example Input One")
+        input_page.entity1.example_account.wait_for_values()
+        input_page.entity1.example_radio.select("No")
+        self.assert_util(input_page.entity1.example_radio.get_value, "No")
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.input
+    def test_example_input_one_required_field_interval(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper
+    ):
+        """Verifies required field interval in example input one"""
+        input_page = InputPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        input_page.create_new_input.select("Example Input One")
+        input_page.entity1.example_account.wait_for_values()
+        input_page.entity1.name.set_value("dummy_input")
+        input_page.entity1.example_radio.select("Yes")
+        input_page.entity1.single_select_group_test.select("Two")
+        input_page.entity1.example_account.select("test_input")
+        input_page.entity1.object.set_value("test_object")
+        input_page.entity1.object_fields.set_value("test_field")
+        input_page.entity1.query_start_date.set_value("2020-12-11T20:00:32.000z")
+        self.assert_util(
+            input_page.entity1.save,
+            r"Field Interval is required",
+            left_args={"expect_error": True},
+        )
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.input
+    def test_example_input_one_valid_input_interval(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper
+    ):
+        """Verifies whether adding non numeric values, intreval field displays validation error"""
+        input_page = InputPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        input_page.create_new_input.select("Example Input One")
+        input_page.entity1.example_account.wait_for_values()
+        input_page.entity1.example_account.select("test_input")
+        input_page.entity1.object.set_value("test_object")
+        input_page.entity1.name.set_value("test_name")
+        input_page.entity1.object_fields.set_value("test_field")
+        input_page.entity1.interval.set_value("abc")
+        self.assert_util(
+            input_page.entity1.save,
+            r"Interval must be an integer.",
+            left_args={"expect_error": True},
+        )
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.input
+    def test_example_input_one_required_field_index(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper
+    ):
+        """Verifies required field index in example input one"""
+        input_page = InputPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        input_page.create_new_input.select("Example Input One")
+        input_page.entity1.example_account.wait_for_values()
+        input_page.entity1.name.set_value("dummy_input")
+        input_page.entity1.example_radio.select("Yes")
+        input_page.entity1.single_select_group_test.select("Two")
+        input_page.entity1.interval.set_value("90")
+        input_page.entity1.example_account.select("test_input")
+        input_page.entity1.object.set_value("test_object")
+        input_page.entity1.object_fields.set_value("test_field")
+        input_page.entity1.query_start_date.set_value("2020-12-11T20:00:32.000z")
+        input_page.entity1.index.cancel_selected_value()
+        self.assert_util(
+            input_page.entity1.save,
+            r"Field Index is required",
+            left_args={"expect_error": True},
+        )
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.input
+    def test_example_input_one_default_value_index(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper
+    ):
+        """Verifies default value of field index in example input one"""
+        input_page = InputPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        default_index = "default"
+        input_page.create_new_input.select("Example Input One")
+        input_page.entity1.example_account.wait_for_values()
+        self.assert_util(input_page.entity1.index.get_value, default_index)
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.input
+    def test_example_input_one_required_field_example_account(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper
+    ):
+        """Verifies required field Salesforce Account in example input one"""
+        input_page = InputPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        input_page.create_new_input.select("Example Input One")
+        input_page.entity1.example_account.wait_for_values()
+        input_page.entity1.name.set_value("dummy_input")
+        input_page.entity1.example_radio.select("Yes")
+        input_page.entity1.single_select_group_test.select("Two")
+        input_page.entity1.interval.set_value("90")
+        input_page.entity1.object.set_value("test_object")
+        input_page.entity1.object_fields.set_value("test_field")
+        input_page.entity1.query_start_date.set_value("2020-12-11T20:00:32.000z")
+        self.assert_util(
+            input_page.entity1.save,
+            r"Field Example Account is required",
+            left_args={"expect_error": True},
+        )
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.input
+    def test_example_input_one_required_field_object(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper
+    ):
+        """Verifies required field Object in example input one"""
+        input_page = InputPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        input_page.create_new_input.select("Example Input One")
+        input_page.entity1.example_account.wait_for_values()
+        input_page.entity1.name.set_value("dummy_input")
+        input_page.entity1.example_radio.select("Yes")
+        input_page.entity1.single_select_group_test.select("Two")
+        input_page.entity1.interval.set_value("90")
+        input_page.entity1.example_account.select("test_input")
+        input_page.entity1.object_fields.set_value("test_field")
+        input_page.entity1.query_start_date.set_value("2020-12-11T20:00:32.000z")
+        self.assert_util(
+            input_page.entity1.save,
+            r"Field Object is required",
+            left_args={"expect_error": True},
+        )
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.input
+    def test_example_input_one_required_field_object_fields(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper
+    ):
+        """Verifies required field Object Fields in example input one"""
+        input_page = InputPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        input_page.create_new_input.select("Example Input One")
+        input_page.entity1.example_account.wait_for_values()
+        input_page.entity1.name.set_value("dummy_input")
+        input_page.entity1.example_radio.select("Yes")
+        input_page.entity1.single_select_group_test.select("Two")
+        input_page.entity1.interval.set_value("90")
+        input_page.entity1.example_account.select("test_input")
+        input_page.entity1.object.set_value("test_object")
+        input_page.entity1.query_start_date.set_value("2020-12-11T20:00:32.000z")
+        self.assert_util(
+            input_page.entity1.save,
+            r"Field Object Fields is required",
+            left_args={"expect_error": True},
+        )
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.input
+    def test_example_input_one_required_field_order_by(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper
+    ):
+        """Verifies required field Order By in example input one"""
+        input_page = InputPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        input_page.create_new_input.select("Example Input One")
+        input_page.entity1.example_account.wait_for_values()
+        input_page.entity1.name.set_value("dummy_input")
+        input_page.entity1.example_radio.select("Yes")
+        input_page.entity1.interval.set_value("90")
+        input_page.entity1.example_account.select("test_input")
+        input_page.entity1.single_select_group_test.select("Two")
+        input_page.entity1.object.set_value("test_object")
+        input_page.entity1.object_fields.set_value("test_field")
+        input_page.entity1.query_start_date.set_value("2020-12-11T20:00:32.000z")
+        input_page.entity1.order_by.set_value("")
+        self.assert_util(
+            input_page.entity1.save,
+            r"Field Order By is required",
+            left_args={"expect_error": True},
+        )
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.input
+    def test_example_input_one_default_value_order_by(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper
+    ):
+        """Verifies default value of field Order By in example input one"""
+        input_page = InputPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        default_order_by = "LastModifiedDate"
+        input_page.create_new_input.select("Example Input One")
+        input_page.entity1.example_account.wait_for_values()
+        self.assert_util(input_page.entity1.order_by.get_value, default_order_by)
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.input
+    def test_example_input_one_fields_label_entity(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper
+    ):
+        """Verifies example input one field label"""
+        input_page = InputPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        input_page.create_new_input.select("Example Input One")
+        self.assert_util(input_page.entity1.name.get_input_label, "Name")
+        self.assert_util(
+            input_page.entity1.example_checkbox.get_input_label, "Example Checkbox"
+        )
+        self.assert_util(
+            input_page.entity1.example_radio.get_input_label, "Example Radio"
+        )
+        self.assert_util(
+            input_page.entity1.single_select_group_test.get_input_label,
+            "Single Select Group Test",
+        )
+        self.assert_util(
+            input_page.entity1.multiple_select_test.get_input_label,
+            "Multiple Select Test",
+        )
+        self.assert_util(input_page.entity1.interval.get_input_label, "Interval")
+        self.assert_util(input_page.entity1.index.get_input_label, "Index")
+        self.assert_util(
+            input_page.entity1.example_account.get_input_label, "Example Account"
+        )
+        self.assert_util(input_page.entity1.object.get_input_label, "Object")
+        self.assert_util(
+            input_page.entity1.object_fields.get_input_label, "Object Fields"
+        )
+        self.assert_util(input_page.entity1.order_by.get_input_label, "Order By")
+        self.assert_util(
+            input_page.entity1.query_start_date.get_input_label, "Query Start Date"
+        )
+        self.assert_util(input_page.entity1.limit.get_input_label, "Limit")
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.input
+    def test_example_input_two_fields_label_entity(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper
+    ):
+        """Verifies example input two field label"""
+        input_page = InputPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        input_page.create_new_input.select("Example Input Two")
+        self.assert_util(input_page.entity2.name.get_input_label, "Name")
+        self.assert_util(input_page.entity2.interval.get_input_label, "Interval")
+        self.assert_util(input_page.entity2.index.get_input_label, "Index")
+        self.assert_util(
+            input_page.entity2.example_account.get_input_label, "Example Account"
+        )
+        self.assert_util(
+            input_page.entity2.example_multiple_select.get_input_label,
+            "Example Multiple Select",
+        )
+        self.assert_util(
+            input_page.entity2.example_checkbox.get_input_label, "Example Checkbox"
+        )
+        self.assert_util(
+            input_page.entity2.example_radio.get_input_label, "Example Radio"
+        )
+        self.assert_util(
+            input_page.entity2.query_start_date.get_input_label, "Query Start Date"
+        )
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.input
+    def test_example_input_one_fields_placeholder_value(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper
+    ):
+        """Verifies example input one field placeholder value"""
+        input_page = InputPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        input_page.create_new_input.select("Example Input One")
+        self.assert_util(
+            input_page.entity1.query_start_date.get_placeholder_value, "optional"
+        )
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.input
+    def test_example_input_two_fields_placeholder_value(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper
+    ):
+        """Verifies example input two field placeholder value"""
+        input_page = InputPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        input_page.create_new_input.select("Example Input Two")
+        self.assert_util(
+            input_page.entity1.query_start_date.get_placeholder_value, "optional"
+        )
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.input
+    def test_example_input_one_help_text_entity(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper
+    ):
+        """Verifies help text for the field name"""
+        input_page = InputPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        input_page.create_new_input.select("Example Input One")
+        input_page.entity1.example_account.wait_for_values()
+        self.assert_util(
+            input_page.entity1.name.get_help_text, "A unique name for the data input."
+        )
+        self.assert_util(
+            input_page.entity1.example_checkbox.get_help_text,
+            "This is an example checkbox for the input one entity",
+        )
+        self.assert_util(
+            input_page.entity1.example_radio.get_help_text,
+            "This is an example radio button for the input one entity",
+        )
+        self.assert_util(
+            input_page.entity1.interval.get_help_text,
+            "Time interval of the data input, in seconds.",
+        )
+        self.assert_util(
+            input_page.entity1.object.get_help_text,
+            "The name of the object to query for.",
+        )
+        self.assert_util(
+            input_page.entity1.object_fields.get_help_text,
+            "Object fields from which to collect data. Delimit multiple fields using a comma.",
+        )
+        self.assert_util(
+            input_page.entity1.query_start_date.get_help_text,
+            "The datetime after which to query and index records, "
+            'in this format: "YYYY-MM-DDThh:mm:ss.000z". Defaults to 90 days '
+            "earlier from now.",
+        )
+        self.assert_util(
+            input_page.entity1.limit.get_help_text,
+            "The maximum number of results returned by the query.",
+        )
+        self.assert_util(
+            input_page.entity1.order_by.get_help_text,
+            "The datetime field by which to query results in ascending order for indexing.",
+        )
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.input
+    def test_example_input_one_valid_input_query_start_date(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper
+    ):
+        """Verifies whether adding wrong format, Query Start Date field displays validation error"""
+        input_page = InputPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        input_page.create_new_input.select("Example Input One")
+        input_page.entity1.example_account.wait_for_values()
+        input_page.entity1.name.set_value("test_name")
+        input_page.entity1.interval.set_value("120")
+        input_page.entity1.example_account.select("test_input")
+        input_page.entity1.object.set_value("test_object")
+        input_page.entity1.object_fields.set_value("test_object_field")
+        input_page.entity1.query_start_date.set_value("2020/01/01")
+        self.assert_util(
+            input_page.entity1.save,
+            r"Invalid date and time format",
+            left_args={"expect_error": True},
+        )
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.input
+    def test_example_input_one_default_value_limit(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper
+    ):
+        """Verifies default value of field limit in example input one"""
+        input_page = InputPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        default_limit = "1000"
+        input_page.create_new_input.select("Example Input One")
+        input_page.entity1.example_account.wait_for_values()
+        self.assert_util(input_page.entity1.limit.get_value, default_limit)
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.input
+    def test_example_input_one_help_link(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper
+    ):
+        """Verifies whether the help link redirects to the correct URL"""
+        input_page = InputPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        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)
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.input
+    @pytest.mark.sanity_test
+    def test_example_input_one_add_frontend_backend_validation(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper
+    ):
+        """Verifies the frontend and backend after adding an Example Input One"""
+        input_page = InputPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        input_page.create_new_input.select("Example Input One")
+        input_page.entity1.example_account.wait_for_values()
+        input_page.entity1.name.set_value("dummy_input")
+        input_page.entity1.example_radio.select("Yes")
+        input_page.entity1.single_select_group_test.select("Two")
+        input_page.entity1.interval.set_value("90")
+        input_page.entity1.example_account.select("test_input")
+        input_page.entity1.object.set_value("test_object")
+        input_page.entity1.object_fields.set_value("test_field")
+        input_page.entity1.query_start_date.set_value("2020-12-11T20:00:32.000z")
+        self.assert_util(input_page.entity1.save, True)
+        input_page.table.wait_for_rows_to_appear(1)
+        self.assert_util(
+            input_page.table.get_table()["dummy_input"],
+            {
+                "name": "dummy_input",
+                "account": "test_input",
+                "interval": "90",
+                "index": "default",
+                "status": "Enabled",
+                "actions": "Edit | Clone | Delete",
+            },
+        )
+        value_to_test = {
+            "account": "test_input",
+            "input_one_checkbox": "1",
+            "input_one_radio": "1",
+            "interval": "90",
+            "limit": "1000",
+            "multipleSelectTest": "a|b",
+            "object": "test_object",
+            "object_fields": "test_field",
+            "order_by": "LastModifiedDate",
+            "singleSelectTest": "two",
+            "start_date": "2020-12-11T20:00:32.000z",
+            "disabled": 0,
+        }
+        backend_stanza = input_page.backend_conf.get_stanza(
+            "example_input_one://dummy_input"
+        )
+        for each_key, each_value in value_to_test.items():
+            assert each_key in backend_stanza
+            self.assert_util(
+                each_value,
+                backend_stanza[each_key],
+            )
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.input
+    def test_example_input_one_edit_uneditable_field_name(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper, add_input_one
+    ):
+        """Verifies the frontend uneditable fields at time of edit of the example input one entity"""
+        input_page = InputPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        input_page.table.edit_row("dummy_input_one")
+        self.assert_util(input_page.entity1.name.is_editable, False)
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.input
+    @pytest.mark.sanity_test
+    def test_example_input_one_edit_frontend_backend_validation(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper, add_input_one
+    ):
+        """Verifies the frontend and backend edit functionality of the example input one entity"""
+        input_page = InputPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        input_page.table.edit_row("dummy_input_one")
+        input_page.entity1.example_account.wait_for_values()
+        input_page.entity1.example_checkbox.uncheck()
+        input_page.entity1.example_radio.select("No")
+        input_page.entity1.single_select_group_test.select("four")
+        input_page.entity1.multiple_select_test.deselect("b")
+        input_page.entity1.interval.set_value("3600")
+        input_page.entity1.index.select("main")
+        input_page.entity1.example_account.select("test_input")
+        input_page.entity1.object.set_value("edit_object")
+        input_page.entity1.object_fields.set_value("edit_field")
+        input_page.entity1.order_by.set_value("LastDate")
+        input_page.entity1.limit.set_value("2000")
+        input_page.entity1.query_start_date.set_value("2020-20-20T20:20:20.000z")
+        self.assert_util(input_page.entity1.save, True)
+        input_page.table.wait_for_rows_to_appear(1)
+        self.assert_util(
+            input_page.table.get_table()["dummy_input_one"],
+            {
+                "name": "dummy_input_one",
+                "account": "test_input",
+                "interval": "3600",
+                "index": "main",
+                "status": "Enabled",
+                "actions": "Edit | Clone | Delete",
+            },
+        )
+        value_to_test = {
+            "account": "test_input",
+            "input_one_checkbox": "0",
+            "input_one_radio": "0",
+            "interval": "3600",
+            "index": "main",
+            "limit": "2000",
+            "multipleSelectTest": "a",
+            "object": "edit_object",
+            "object_fields": "edit_field",
+            "order_by": "LastDate",
+            "singleSelectTest": "four",
+            "start_date": "2020-20-20T20:20:20.000z",
+            "disabled": 0,
+        }
+        backend_stanza = input_page.backend_conf.get_stanza(
+            "example_input_one://dummy_input_one"
+        )
+        for each_key, each_value in value_to_test.items():
+            self.assert_util(each_value, backend_stanza[each_key])
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.input
+    def test_example_input_one_clone_default_values(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper, add_input_one
+    ):
+        """Verifies the frontend default fields at time of clone for example input one entity"""
+        input_page = InputPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        input_page.table.clone_row("dummy_input_one")
+        input_page.entity1.example_account.wait_for_values()
+        self.assert_util(input_page.entity1.name.get_value, "")
+        self.assert_util(input_page.entity1.example_checkbox.is_checked, True)
+        self.assert_util(input_page.entity1.example_radio.get_value, "Yes")
+        self.assert_util(input_page.entity1.single_select_group_test.get_value, "Two")
+        self.assert_util(input_page.entity1.multiple_select_test.get_values, ["A", "B"])
+        self.assert_util(input_page.entity1.interval.get_value, "90")
+        self.assert_util(input_page.entity1.index.get_value, "default")
+        self.assert_util(input_page.entity1.example_account.get_value, "test_input")
+        self.assert_util(input_page.entity1.object.get_value, "test_object")
+        self.assert_util(input_page.entity1.object_fields.get_value, "test_field")
+        self.assert_util(input_page.entity1.order_by.get_value, "LastModifiedDate")
+        self.assert_util(
+            input_page.entity1.query_start_date.get_value, "2020-12-11T20:00:32.000z"
+        )
+        self.assert_util(input_page.entity1.limit.get_value, "1000")
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.input
+    @pytest.mark.sanity_test
+    def test_example_input_one_clone_frontend_backend_validation(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper, add_input_one
+    ):
+        """Verifies the frontend and backend clone functionality of the example input one entity"""
+        input_page = InputPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        input_page.table.wait_for_rows_to_appear(1)
+        input_page.table.clone_row("dummy_input_one")
+        input_page.entity1.example_account.wait_for_values()
+        input_page.entity1.name.set_value("dummy_input_one_Clone_Test")
+        input_page.entity1.interval.set_value("180")
+        input_page.entity1.limit.set_value("500")
+        self.assert_util(input_page.entity1.save, True)
+        input_page.table.wait_for_rows_to_appear(2)
+        self.assert_util(
+            input_page.table.get_table()["dummy_input_one_Clone_Test"],
+            {
+                "name": "dummy_input_one_Clone_Test",
+                "account": "test_input",
+                "interval": "180",
+                "index": "default",
+                "status": "Enabled",
+                "actions": "Edit | Clone | Delete",
+            },
+        )
+        value_to_test = {
+            "account": "test_input",
+            "input_one_checkbox": "1",
+            "input_one_radio": "1",
+            "interval": "180",
+            "index": "default",
+            "limit": "500",
+            "multipleSelectTest": "a|b",
+            "object": "test_object",
+            "object_fields": "test_field",
+            "order_by": "LastModifiedDate",
+            "singleSelectTest": "two",
+            "start_date": "2020-12-11T20:00:32.000z",
+            "disabled": 0,
+        }
+        backend_stanza = input_page.backend_conf.get_stanza(
+            "example_input_one://dummy_input_one_Clone_Test"
+        )
+        for each_key, each_value in value_to_test.items():
+            self.assert_util(each_value, backend_stanza[each_key])
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.input
+    @pytest.mark.sanity_test
+    def test_example_input_one_delete_row_frontend_validation(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper, add_input_one
+    ):
+        """Verifies the frontend delete functionality"""
+        input_page = InputPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        input_page.table.input_status_toggle("dummy_input_one", enable=False)
+        input_page.table.delete_row("dummy_input_one")
+        input_page.table.wait_for_rows_to_appear(0)
+        self.assert_util("dummy_input_one", input_page.table.get_table, "not in")
+        self.assert_util(
+            "example_input_one://dummy_input_one",
+            input_page.backend_conf.get_all_stanzas().keys(),
+            "not in",
+        )
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.input
+    def test_example_input_one_add_close_entity(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper
+    ):
+        """Verifies close functionality at time of add"""
+        input_page = InputPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        input_page.create_new_input.select("Example Input One")
+        input_page.entity1.example_account.wait_for_values()
+        self.assert_util(input_page.entity1.close, True)
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.input
+    def test_example_input_one_edit_close_entity(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper, add_input_one
+    ):
+        """Verifies close functionality at time of edit"""
+        input_page = InputPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        input_page.table.edit_row("dummy_input_one")
+        self.assert_util(input_page.entity1.close, True)
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.input
+    def test_example_input_one_clone_close_entity(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper, add_input_one
+    ):
+        """Verifies close functionality at time of clone"""
+        input_page = InputPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        input_page.table.clone_row("dummy_input_one")
+        self.assert_util(input_page.entity1.close, True)
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.input
+    def test_example_input_one_delete_close_entity(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper, add_input_one
+    ):
+        """Verifies close functionality at time of delete"""
+        input_page = InputPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        self.assert_util(
+            input_page.table.delete_row,
+            True,
+            left_args={"name": "dummy_input_one", "close": True},
+        )
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.input
+    def test_example_input_one_add_cancel_entity(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper
+    ):
+        """Verifies cancel functionality at time of add"""
+        input_page = InputPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        input_page.create_new_input.select("Example Input One")
+        input_page.entity1.example_account.wait_for_values()
+        self.assert_util(input_page.entity1.cancel, True)
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.input
+    def test_example_input_one_edit_cancel_entity(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper, add_input_one
+    ):
+        """Verifies cancel functionality at time of edit"""
+        input_page = InputPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        input_page.table.edit_row("dummy_input_one")
+        self.assert_util(input_page.entity1.cancel, True)
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.input
+    def test_example_input_one_clone_cancel_entity(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper, add_input_one
+    ):
+        """Verifies cancel functionality at time of clone"""
+        input_page = InputPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        input_page.table.clone_row("dummy_input_one")
+        self.assert_util(input_page.entity1.cancel, True)
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.input
+    def test_example_input_one_delete_cancel_entity(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper, add_input_one
+    ):
+        """Verifies cancel functionality at time of delete"""
+        input_page = InputPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        self.assert_util(
+            input_page.table.delete_row,
+            True,
+            left_args={"name": "dummy_input_one", "cancel": True},
+        )
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.input
+    def test_example_input_one_add_duplicate_names(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper, add_input_one
+    ):
+        """Verifies by saving an entity with duplicate name it displays and error"""
+        input_page = InputPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        input_page.create_new_input.select("Example Input One")
+        input_page.entity1.example_account.wait_for_values()
+        input_name = "dummy_input_one"
+        input_page.entity1.name.set_value(input_name)
+        self.assert_util(
+            input_page.entity1.save,
+            f"Name {input_name} is already in use",
+            left_args={"expect_error": True},
+        )
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.input
+    def test_example_input_one_clone_duplicate_names(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper, add_input_one
+    ):
+        """Verifies by saving an entity with duplicate name at time of clone it displays and error"""
+        input_page = InputPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        input_page.table.clone_row("dummy_input_one")
+        input_page.entity1.example_account.wait_for_values()
+        input_name = "dummy_input_one"
+        input_page.entity1.name.set_value(input_name)
+        self.assert_util(
+            input_page.entity1.save,
+            f"Name {input_name} is already in use",
+            left_args={"expect_error": True},
+        )
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.input
+    def test_example_input_one_add_valid_title(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper
+    ):
+        """Verifies the title of the 'Add Entity'"""
+        input_page = InputPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        input_page.create_new_input.select("Example Input One")
+        input_page.entity1.example_account.wait_for_values()
+        self.assert_util(
+            input_page.entity1.title.container.get_attribute("textContent").strip(),
+            "Add Example Input One",
+        )
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.input
+    def test_example_input_one_edit_valid_title(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper, add_input_one
+    ):
+        """Verifies the title of the 'Edit Entity'"""
+        input_page = InputPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        input_page.table.edit_row("dummy_input_one")
+        self.assert_util(
+            input_page.entity1.title.container.get_attribute("textContent").strip(),
+            "Update Example Input One",
+        )
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.input
+    def test_example_input_one_clone_valid_title(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper, add_input_one
+    ):
+        """Verifies the title of the 'Clone Entity'"""
+        input_page = InputPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        input_page.table.clone_row("dummy_input_one")
+        self.assert_util(
+            input_page.entity1.title.container.get_attribute("textContent").strip(),
+            "Clone Example Input One",
+        )
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.input
+    def test_example_input_one_delete_valid_title(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper, add_input_one
+    ):
+        """Verifies the title of the 'Delete Entity'"""
+        input_page = InputPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        input_page.table.delete_row("dummy_input_one", prompt_msg=True)
+        self.assert_util(
+            input_page.entity1.title.container.get_attribute("textContent").strip(),
+            "Delete Confirmation",
+        )
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.input
+    def test_example_input_one_delete_valid_prompt_message(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper, add_input_one
+    ):
+        """Verifies the prompt message of the 'Delete Entity'"""
+        input_page = InputPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        input_name = "dummy_input_one"
+        prompt_message = input_page.table.delete_row("dummy_input_one", prompt_msg=True)
+        self.assert_util(
+            prompt_message, f'Are you sure you want to delete "{input_name}" ?'
+        )
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.input
+    def test_example_input_two_required_field_name(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper
+    ):
+        """Verifies required field name in Example Input Two"""
+        input_page = InputPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        input_page.create_new_input.select("Example Input Two")
+        input_page.entity2.example_account.wait_for_values()
+        input_page.entity2.example_checkbox.check()
+        input_page.entity2.example_radio.select("No")
+        input_page.entity2.example_multiple_select.select("Option One")
+        input_page.entity2.index.select("main")
+        input_page.entity2.interval.set_value("90")
+        input_page.entity2.example_account.select("test_input")
+        input_page.entity2.query_start_date.set_value("2020-12-11T20:00:32.000z")
+        self.assert_util(
+            input_page.entity2.save,
+            r"Field Name is required",
+            left_args={"expect_error": True},
+        )
+        input_page.entity2.name.set_value("test_name_two")
+        self.assert_util(input_page.entity2.is_error_closed, True)
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.input
+    def test_example_input_two_valid_length_name(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper
+    ):
+        """Verifies the name field should not be more than 100 characters"""
+        input_page = InputPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        input_page.create_new_input.select("Example Input Two")
+        input_page.entity2.example_account.wait_for_values()
+        name_value = "a" * 101
+        input_page.entity2.name.set_value(name_value)
+        self.assert_util(
+            input_page.entity2.save,
+            r"Length of input name should be between 1 and 100",
+            left_args={"expect_error": True},
+        )
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.input
+    def test_example_input_two_valid_input_name(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper
+    ):
+        """Verifies whether adding special characters, name field displays validation error"""
+        input_page = InputPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        input_page.create_new_input.select("Example Input Two")
+        input_page.entity2.example_account.wait_for_values()
+        input_page.entity2.name.set_value("$$test_name_two")
+        self.assert_util(
+            input_page.entity2.save,
+            r"Input Name must begin with a letter and consist exclusively of alphanumeric characters and underscores.",
+            left_args={"expect_error": True},
+        )
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.input
+    def test_example_input_two_required_field_interval(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper
+    ):
+        """Verifies required field interval in Example Input Two"""
+        input_page = InputPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        input_page.create_new_input.select("Example Input Two")
+        input_page.entity2.example_account.wait_for_values()
+        input_page.entity2.name.set_value("dummy_input")
+        input_page.entity2.example_checkbox.check()
+        input_page.entity2.example_radio.select("No")
+        input_page.entity2.example_multiple_select.select("Option One")
+        input_page.entity2.index.select("main")
+        input_page.entity2.example_account.select("test_input")
+        input_page.entity2.query_start_date.set_value("2020-12-11T20:00:32.000z")
+        self.assert_util(
+            input_page.entity2.save,
+            r"Field Interval is required",
+            left_args={"expect_error": True},
+        )
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.input
+    def test_example_input_two_valid_input_interval(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper
+    ):
+        """Verifies whether adding non numeric values, intreval field displays validation error"""
+        input_page = InputPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        input_page.create_new_input.select("Example Input Two")
+        input_page.entity2.example_account.wait_for_values()
+        input_page.entity2.name.set_value("test_name_two")
+        input_page.entity2.interval.set_value("abc")
+        self.assert_util(
+            input_page.entity2.save,
+            r"Interval must be an integer.",
+            left_args={"expect_error": True},
+        )
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.input
+    def test_example_input_two_required_field_index(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper
+    ):
+        """Verifies required field index in Example Input Two"""
+        input_page = InputPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        input_page.create_new_input.select("Example Input Two")
+        input_page.entity2.example_account.wait_for_values()
+        input_page.entity2.name.set_value("dummy_input")
+        input_page.entity2.example_checkbox.check()
+        input_page.entity2.example_account.select("test_input")
+        input_page.entity2.example_radio.select("No")
+        input_page.entity2.example_multiple_select.select("Option One")
+        input_page.entity2.interval.set_value("90")
+        input_page.entity2.query_start_date.set_value("2020-12-11T20:00:32.000z")
+        input_page.entity2.index.cancel_selected_value()
+        self.assert_util(
+            input_page.entity2.save,
+            r"Field Index is required",
+            left_args={"expect_error": True},
+        )
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.input
+    def test_example_input_two_default_value_index(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper
+    ):
+        """Verifies default value of field index in Example Input Two"""
+        input_page = InputPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        default_index = "default"
+        input_page.create_new_input.select("Example Input Two")
+        input_page.entity2.example_account.wait_for_values()
+        self.assert_util(input_page.entity2.index.get_value, default_index)
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.input
+    def test_example_input_two_required_field_example_example_account(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper
+    ):
+        """Verifies required field Account in Example Input Two"""
+        input_page = InputPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        input_page.create_new_input.select("Example Input Two")
+        input_page.entity2.example_account.wait_for_values()
+        input_page.entity2.name.set_value("dummy_input")
+        input_page.entity2.example_checkbox.check()
+        input_page.entity2.example_radio.select("No")
+        input_page.entity2.example_multiple_select.select("Option One")
+        input_page.entity2.index.select("main")
+        input_page.entity2.interval.set_value("90")
+        input_page.entity2.query_start_date.set_value("2020-12-11T20:00:32.000z")
+        self.assert_util(
+            input_page.entity2.save,
+            r"Field Example Account is required",
+            left_args={"expect_error": True},
+        )
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.input
+    def test_example_input_two_required_field_example_multiple_select(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper
+    ):
+        """Verifies required field Example Multiple Select in Example Input Two"""
+        input_page = InputPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        input_page.create_new_input.select("Example Input Two")
+        input_page.entity2.example_account.wait_for_values()
+        input_page.entity2.name.set_value("dummy_input")
+        input_page.entity2.example_checkbox.check()
+        input_page.entity2.example_radio.select("No")
+        input_page.entity2.index.select("main")
+        input_page.entity2.interval.set_value("90")
+        input_page.entity2.example_account.select("test_input")
+        input_page.entity2.query_start_date.set_value("2020-12-11T20:00:32.000z")
+        self.assert_util(
+            input_page.entity2.save,
+            r"Field Example Multiple Select is required",
+            left_args={"expect_error": True},
+        )
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.input
+    def test_example_input_two_list_example_multiple_select(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper
+    ):
+        """Verifies values of Multiple Select Test dropdown in Example Input Two"""
+        input_page = InputPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        input_page.create_new_input.select("Example Input Two")
+        input_page.entity2.example_account.wait_for_values()
+        example_multiple_select_list = ["Option One", "Option Two"]
+        self.assert_util(
+            input_page.entity2.example_multiple_select.list_of_values(),
+            example_multiple_select_list,
+        )
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.input
+    def test_example_input_two_select_select_value_example_multiple_select(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper
+    ):
+        """Verifies selected single value of Multiple Select Test dropdown in Example Input Two"""
+        input_page = InputPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        selected_value = ["Option One"]
+        input_page.create_new_input.select("Example Input Two")
+        input_page.entity2.example_account.wait_for_values()
+        input_page.entity2.index.select("main")
+        for each in selected_value:
+            input_page.entity2.example_multiple_select.select(each)
+        self.assert_util(
+            input_page.entity2.example_multiple_select.get_values, selected_value
+        )
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.input
+    def test_example_input_two_select_multiple_values_example_multiple_select(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper
+    ):
+        """Verifies selected multiple values of Multiple Select Test dropdown in Example Input Two"""
+        input_page = InputPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        selected_values = ["Option One", "Option Two"]
+        input_page.create_new_input.select("Example Input Two")
+        input_page.entity2.example_account.wait_for_values()
+        input_page.entity2.index.select("main")
+        for each in selected_values:
+            input_page.entity2.example_multiple_select.select(each)
+        self.assert_util(
+            input_page.entity2.example_multiple_select.get_values, selected_values
+        )
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.input
+    def test_example_input_two_help_text_entity(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper
+    ):
+        """Verifies help text for the field name"""
+        input_page = InputPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        input_page.create_new_input.select("Example Input Two")
+        input_page.entity2.example_account.wait_for_values()
+        self.assert_util(
+            input_page.entity2.example_multiple_select.get_help_text,
+            "This is an example multipleSelect for input two entity",
+        )
+        self.assert_util(
+            input_page.entity2.name.get_help_text, "A unique name for the data input."
+        )
+        self.assert_util(
+            input_page.entity2.interval.get_help_text,
+            "Time interval of the data input, in seconds .",
+        )
+        self.assert_util(
+            input_page.entity2.example_checkbox.get_help_text,
+            "This is an example checkbox for the input two entity",
+        )
+        self.assert_util(
+            input_page.entity2.example_radio.get_help_text,
+            "This is an example radio button for the input two entity",
+        )
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.input
+    def test_example_input_two_checked_example_checkbox(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper
+    ):
+        """Verifies Check in example checkbox in Example Input Two"""
+        input_page = InputPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        input_page.create_new_input.select("Example Input Two")
+        input_page.entity2.example_account.wait_for_values()
+        self.assert_util(input_page.entity2.example_checkbox.check, True)
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.input
+    def test_example_input_two_unchecked_example_checkbox(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper
+    ):
+        """Verifies Uncheck in example checkbox in Example Input Two"""
+        input_page = InputPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        input_page.create_new_input.select("Example Input Two")
+        input_page.entity2.example_account.wait_for_values()
+        input_page.entity2.example_checkbox.check()
+        self.assert_util(input_page.entity2.example_checkbox.uncheck, True)
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.input
+    def test_example_input_two_required_field_example_radio(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper
+    ):
+        """Verifies default value of example radio in Example Input Two"""
+        input_page = InputPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        input_page.create_new_input.select("Example Input Two")
+        input_page.entity2.example_account.wait_for_values()
+        input_page.entity2.name.set_value("dummy_input")
+        input_page.entity2.example_checkbox.check()
+        input_page.entity2.example_multiple_select.select("Option One")
+        input_page.entity2.index.select("main")
+        input_page.entity2.interval.set_value("90")
+        input_page.entity2.example_account.select("test_input")
+        input_page.entity2.query_start_date.set_value("2020-12-11T20:00:32.000z")
+        self.assert_util(
+            input_page.entity2.save,
+            r"Field Example Radio is required",
+            left_args={"expect_error": True},
+        )
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.input
+    def test_example_input_two_select_value_example_radio(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper
+    ):
+        """Verifies default value of example radio in Example Input Two"""
+        input_page = InputPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        input_page.create_new_input.select("Example Input Two")
+        input_page.entity2.example_account.wait_for_values()
+        input_page.entity2.example_radio.select("No")
+        self.assert_util(input_page.entity2.example_radio.get_value, "No")
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.input
+    def test_example_input_two_valid_input_query_start_date(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper
+    ):
+        """Verifies whether adding wrong format, Query Start Date field displays validation error"""
+        input_page = InputPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        input_page.create_new_input.select("Example Input Two")
+        input_page.entity2.example_account.wait_for_values()
+        input_page.entity2.name.set_value("test_name_two")
+        input_page.entity2.interval.set_value("120")
+        input_page.entity2.example_account.select("test_input")
+        input_page.entity2.example_multiple_select.select("Option One")
+        input_page.entity2.example_radio.select("Yes")
+        input_page.entity2.query_start_date.set_value("2020/01/01")
+        self.assert_util(
+            input_page.entity2.save,
+            r"Invalid date and time format",
+            left_args={"expect_error": True},
+        )
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.input
+    @pytest.mark.sanity_test
+    def test_example_input_two_add_frontend_backend_validation(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper
+    ):
+        """Verifies the frontend and backend after adding an Example Input Two"""
+        input_page = InputPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        input_page.create_new_input.select("Example Input Two")
+        input_page.entity2.example_account.wait_for_values()
+        input_page.entity2.name.set_value("dummy_input")
+        input_page.entity2.example_checkbox.check()
+        input_page.entity2.example_radio.select("No")
+        input_page.entity2.example_multiple_select.select("Option One")
+        input_page.entity2.example_multiple_select.select("Option Two")
+        input_page.entity2.index.select("main")
+        input_page.entity2.interval.set_value("90")
+        input_page.entity2.example_account.select("test_input")
+        input_page.entity2.query_start_date.set_value("2020-12-11T20:00:32.000z")
+        self.assert_util(input_page.entity2.save, True)
+        input_page.table.wait_for_rows_to_appear(1)
+        self.assert_util(
+            input_page.table.get_table()["dummy_input"],
+            {
+                "name": "dummy_input",
+                "account": "test_input",
+                "interval": "90",
+                "index": "main",
+                "status": "Enabled",
+                "actions": "Edit | Clone | Delete",
+            },
+        )
+        value_to_test = {
+            "account": "test_input",
+            "index": "main",
+            "input_two_checkbox": "1",
+            "input_two_radio": "0",
+            "interval": "90",
+            "input_two_multiple_select": "one,two",
+            "start_date": "2020-12-11T20:00:32.000z",
+            "disabled": 0,
+        }
+        backend_stanza = input_page.backend_conf.get_stanza(
+            "example_input_two://dummy_input"
+        )
+        for each_key, each_value in value_to_test.items():
+            self.assert_util(each_value, backend_stanza[each_key])
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.input
+    def test_example_input_two_edit_uneditable_field_name(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper, add_input_two
+    ):
+        """Verifies the frontend uneditable fields at time of edit of the Example Input Two entity"""
+        input_page = InputPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        input_page.table.edit_row("dummy_input_two")
+        input_page.entity2.example_account.wait_for_values()
+        self.assert_util(input_page.entity2.name.is_editable, False)
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.input
+    @pytest.mark.sanity_test
+    def test_example_input_two_edit_frontend_backend_validation(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper, add_input_two
+    ):
+        """Verifies the frontend and backend edit functionality of the Example Input Two entity"""
+        input_page = InputPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        input_page.table.edit_row("dummy_input_two")
+        input_page.entity2.example_account.wait_for_values()
+        input_page.entity2.example_checkbox.uncheck()
+        input_page.entity2.example_radio.select("Yes")
+        input_page.entity2.example_account.select("test_input")
+        input_page.entity2.example_multiple_select.deselect("Option One")
+        input_page.entity2.interval.set_value("3600")
+        input_page.entity2.query_start_date.set_value("2020-20-20T20:20:20.000z")
+        self.assert_util(input_page.entity2.save, True)
+        input_page.table.wait_for_rows_to_appear(1)
+        self.assert_util(
+            input_page.table.get_table()["dummy_input_two"],
+            {
+                "name": "dummy_input_two",
+                "account": "test_input",
+                "interval": "3600",
+                "index": "main",
+                "status": "Enabled",
+                "actions": "Edit | Clone | Delete",
+            },
+        )
+        value_to_test = {
+            "account": "test_input",
+            "input_two_checkbox": "0",
+            "input_two_radio": "1",
+            "interval": "3600",
+            "index": "main",
+            "input_two_multiple_select": "two",
+            "start_date": "2020-20-20T20:20:20.000z",
+            "disabled": 0,
+        }
+        backend_stanza = input_page.backend_conf.get_stanza(
+            "example_input_two://dummy_input_two"
+        )
+        for each_key, each_value in value_to_test.items():
+            self.assert_util(each_value, backend_stanza[each_key])
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.input
+    def test_example_input_two_clone_default_values(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper, add_input_two
+    ):
+        """Verifies the frontend default fields at time of clone for Example Input Two entity"""
+        input_page = InputPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        input_page.table.clone_row("dummy_input_two")
+        input_page.entity2.example_account.wait_for_values()
+        self.assert_util(input_page.entity2.name.get_value, "")
+        self.assert_util(input_page.entity2.example_checkbox.is_checked, True)
+        self.assert_util(input_page.entity2.example_radio.get_value, "No")
+        self.assert_util(
+            input_page.entity2.example_multiple_select.get_values,
+            ["Option One", "Option Two"],
+        )
+        self.assert_util(input_page.entity2.interval.get_value, "100")
+        self.assert_util(input_page.entity2.index.get_value, "main")
+        self.assert_util(input_page.entity2.example_account.get_value, "test_input")
+        self.assert_util(
+            input_page.entity2.query_start_date.get_value, "2016-10-10T12:10:15.000z"
+        )
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.input
+    @pytest.mark.sanity_test
+    def test_example_input_two_clone_frontend_backend_validation(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper, add_input_two
+    ):
+        """Verifies the frontend and backend clone functionality of the Example Input Two entity"""
+        input_page = InputPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        input_page.table.wait_for_rows_to_appear(1)
+        input_page.table.clone_row("dummy_input_two")
+        input_page.entity2.example_account.wait_for_values()
+        input_page.entity2.name.set_value("dummy_input_two_Clone_Test")
+        input_page.entity2.interval.set_value("180")
+        self.assert_util(input_page.entity2.save, True)
+        input_page.table.wait_for_rows_to_appear(2)
+        self.assert_util(
+            input_page.table.get_table()["dummy_input_two_Clone_Test"],
+            {
+                "name": "dummy_input_two_Clone_Test",
+                "account": "test_input",
+                "interval": "180",
+                "index": "main",
+                "status": "Enabled",
+                "actions": "Edit | Clone | Delete",
+            },
+        )
+        value_to_test = {
+            "account": "test_input",
+            "input_two_checkbox": "1",
+            "input_two_radio": "0",
+            "interval": "180",
+            "index": "main",
+            "input_two_multiple_select": "one,two",
+            "start_date": "2016-10-10T12:10:15.000z",
+            "disabled": 0,
+        }
+        backend_stanza = input_page.backend_conf.get_stanza(
+            "example_input_two://dummy_input_two_Clone_Test"
+        )
+        for each_key, each_value in value_to_test.items():
+            self.assert_util(each_value, backend_stanza[each_key])
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.input
+    @pytest.mark.sanity_test
+    def test_example_input_two_delete_row_frontend_backend_validation(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper, add_input_two
+    ):
+        """Verifies the frontend and backend delete functionality"""
+        input_page = InputPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        input_page.table.input_status_toggle("dummy_input_two", enable=False)
+        input_page.table.delete_row("dummy_input_two")
+        input_page.table.wait_for_rows_to_appear(0)
+        self.assert_util("dummy_input_two", input_page.table.get_table, "not in")
+        self.assert_util(
+            "example_input_two://dummy_input_two",
+            input_page.backend_conf.get_all_stanzas().keys(),
+            "not in",
+        )
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.input
+    def test_example_input_two_add_close_entity(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper
+    ):
+        """Verifies close functionality at time of add"""
+        input_page = InputPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        input_page.create_new_input.select("Example Input Two")
+        input_page.entity2.example_account.wait_for_values()
+        self.assert_util(input_page.entity2.close, True)
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.input
+    def test_example_input_two_edit_close_entity(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper, add_input_two
+    ):
+        """Verifies close functionality at time of edit"""
+        input_page = InputPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        input_page.table.edit_row("dummy_input_two")
+        self.assert_util(input_page.entity2.close, True)
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.input
+    def test_example_input_two_clone_close_entity(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper, add_input_two
+    ):
+        """Verifies close functionality at time of clone"""
+        input_page = InputPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        input_page.table.clone_row("dummy_input_two")
+        self.assert_util(input_page.entity2.close, True)
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.input
+    def test_example_input_two_delete_close_entity(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper, add_input_two
+    ):
+        """Verifies close functionality at time of delete"""
+        input_page = InputPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        self.assert_util(
+            input_page.table.delete_row,
+            True,
+            left_args={"name": "dummy_input_two", "close": True},
+        )
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.input
+    def test_example_input_two_add_cancel_entity(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper
+    ):
+        """Verifies cancel functionality at time of add"""
+        input_page = InputPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        input_page.create_new_input.select("Example Input Two")
+        input_page.entity2.example_account.wait_for_values()
+        self.assert_util(input_page.entity2.cancel, True)
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.input
+    def test_example_input_two_edit_cancel_entity(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper, add_input_two
+    ):
+        """Verifies cancel functionality at time of edit"""
+        input_page = InputPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        input_page.table.edit_row("dummy_input_two")
+        self.assert_util(input_page.entity2.cancel, True)
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.input
+    def test_example_input_two_clone_cancel_entity(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper, add_input_two
+    ):
+        """Verifies cancel functionality at time of clone"""
+        input_page = InputPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        input_page.table.clone_row("dummy_input_two")
+        self.assert_util(input_page.entity2.cancel, True)
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.input
+    def test_example_input_two_delete_cancel_entity(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper, add_input_two
+    ):
+        """Verifies cancel functionality at time of delete"""
+        input_page = InputPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        self.assert_util(
+            input_page.table.delete_row,
+            True,
+            left_args={"name": "dummy_input_two", "cancel": True},
+        )
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.input
+    def test_example_input_two_add_duplicate_names(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper, add_input_two
+    ):
+        """Verifies by saving an entity with duplicate name it displays and error"""
+        input_page = InputPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        input_page.create_new_input.select("Example Input Two")
+        input_page.entity2.example_account.wait_for_values()
+        input_name = "dummy_input_two"
+        input_page.entity2.name.set_value(input_name)
+        self.assert_util(
+            input_page.entity2.save,
+            f"Name {input_name} is already in use",
+            left_args={"expect_error": True},
+        )
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.input
+    def test_example_input_two_clone_duplicate_names(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper, add_input_two
+    ):
+        """Verifies by saving an entity with duplicate name at time of clone it displays and error"""
+        input_page = InputPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        input_page.table.clone_row("dummy_input_two")
+        input_page.entity2.example_account.wait_for_values()
+        input_name = "dummy_input_two"
+        input_page.entity2.name.set_value(input_name)
+        self.assert_util(
+            input_page.entity2.save,
+            f"Name {input_name} is already in use",
+            left_args={"expect_error": True},
+        )
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.input
+    def test_example_input_two_add_valid_title(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper
+    ):
+        """Verifies the title of the 'Add Entity'"""
+        input_page = InputPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        input_page.create_new_input.select("Example Input Two")
+        input_page.entity2.example_account.wait_for_values()
+        self.assert_util(
+            input_page.entity2.title.container.get_attribute("textContent").strip(),
+            "Add Example Input Two",
+        )
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.input
+    def test_example_input_two_edit_valid_title(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper, add_input_two
+    ):
+        """Verifies the title of the 'Edit Entity'"""
+        input_page = InputPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        input_page.table.edit_row("dummy_input_two")
+        input_page.entity2.example_account.wait_for_values()
+        self.assert_util(
+            input_page.entity2.title.container.get_attribute("textContent").strip(),
+            "Update Example Input Two",
+        )
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.input
+    def test_example_input_two_clone_valid_title(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper, add_input_two
+    ):
+        """Verifies the title of the 'Clone Entity'"""
+        input_page = InputPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        input_page.table.clone_row("dummy_input_two")
+        input_page.entity2.example_account.wait_for_values()
+        self.assert_util(
+            input_page.entity2.title.container.get_attribute("textContent").strip(),
+            "Clone Example Input Two",
+        )
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.input
+    def test_example_input_two_delete_valid_title(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper, add_input_two
+    ):
+        """Verifies the title of the 'Delete Entity'"""
+        input_page = InputPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        input_page.table.delete_row("dummy_input_two", prompt_msg=True)
+        self.assert_util(
+            input_page.entity2.title.container.get_attribute("textContent").strip(),
+            "Delete Confirmation",
+        )
+
+    @pytest.mark.execute_enterprise_cloud_true
+    @pytest.mark.forwarder
+    @pytest.mark.input
+    def test_example_input_two_delete_valid_prompt_message(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper, add_input_two
+    ):
+        """Verifies the prompt message of the 'Delete Entity'"""
+        input_page = InputPage(ucc_smartx_selenium_helper, ucc_smartx_rest_helper)
+        input_name = "dummy_input_two"
+        prompt_message = input_page.table.delete_row("dummy_input_two", prompt_msg=True)
+        self.assert_util(
+            prompt_message, f'Are you sure you want to delete "{input_name}" ?'
+        )
diff --git a/tests/ui/test_logging_page.py b/tests/ui/test_logging_page.py
index 3c1a1bfc3..210cc1905 100644
--- a/tests/ui/test_logging_page.py
+++ b/tests/ui/test_logging_page.py
@@ -1,67 +1,51 @@
-#
-# Copyright 2021 Splunk Inc.
-#
-# 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.
-#
-
 import pytest
 from pytest_splunk_addon_ui_smartx.base_test import UccTester
 from pytest_splunk_addon_ui_smartx.pages.logging import Logging
 
+from tests.ui import constants as C
+
+DEFAULT_LOG_LEVEL = "INFO"
+
 
-@pytest.fixture(autouse=True)
-def reset_configuration(ucc_smartx_rest_helper, example_ta):
+@pytest.fixture
+def reset_configuration(ucc_smartx_rest_helper):
     yield
-    logging = Logging(example_ta["name"], ucc_smartx_rest_helper=ucc_smartx_rest_helper)
-    logging.backend_conf.update_parameters(
-        {"loglevel": example_ta["default_log_level"]}
-    )
+    logging = Logging(C.ADDON_NAME, ucc_smartx_rest_helper=ucc_smartx_rest_helper)
+    logging.backend_conf.update_parameters({"loglevel": DEFAULT_LOG_LEVEL})
 
 
-class TestLogging(UccTester):
-    @pytest.mark.default
-    @pytest.mark.logging_page
+class TestLoggingPage(UccTester):
+    @pytest.mark.logging
     def test_logging_default_log_level(
-        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper, example_ta
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper
     ):
         logging = Logging(
-            example_ta["name"],
+            C.ADDON_NAME,
             ucc_smartx_selenium_helper=ucc_smartx_selenium_helper,
             ucc_smartx_rest_helper=ucc_smartx_rest_helper,
         )
         self.assert_util(logging.backend_conf.get_parameter("disabled"), False)
-        self.assert_util(logging.log_level.get_value, example_ta["default_log_level"])
+        self.assert_util(logging.log_level.get_value, DEFAULT_LOG_LEVEL)
 
-    @pytest.mark.default
-    @pytest.mark.logging_page
+    @pytest.mark.logging
     def test_logging_list_log_levels(
-        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper, example_ta
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper
     ):
         logging = Logging(
-            example_ta["name"],
+            C.ADDON_NAME,
             ucc_smartx_selenium_helper=ucc_smartx_selenium_helper,
             ucc_smartx_rest_helper=ucc_smartx_rest_helper,
         )
         expected_list = ["DEBUG", "INFO", "WARNING", "ERROR", "CRITICAL"]
         self.assert_util(list(logging.log_level.list_of_values()), expected_list)
 
-    @pytest.mark.logging_page
+    @pytest.mark.logging
     @pytest.mark.xfail
     def test_logging_required_field_log_level(
-        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper, example_ta
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper, reset_configuration
     ):
         logging = Logging(
-            example_ta["name"],
+            C.ADDON_NAME,
             ucc_smartx_selenium_helper=ucc_smartx_selenium_helper,
             ucc_smartx_rest_helper=ucc_smartx_rest_helper,
         )
@@ -72,12 +56,12 @@ def test_logging_required_field_log_level(
             left_args={"expect_error": True},
         )
 
-    @pytest.mark.logging_page
+    @pytest.mark.logging
     def test_logging_select_random_log_level(
-        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper, example_ta
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper, reset_configuration
     ):
         logging = Logging(
-            example_ta["name"],
+            C.ADDON_NAME,
             ucc_smartx_selenium_helper=ucc_smartx_selenium_helper,
             ucc_smartx_rest_helper=ucc_smartx_rest_helper,
         )
@@ -87,31 +71,18 @@ def test_logging_select_random_log_level(
             logging.save()
             self.assert_util(logging.log_level.get_value, log_level)
 
-    @pytest.mark.logging_page
-    def test_logging_selected_log_level_frontend(
-        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper, example_ta
+    @pytest.mark.logging
+    def test_logging_selected_log_level_frontend_backend(
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper, reset_configuration
     ):
         selection_log = "DEBUG"
         logging = Logging(
-            example_ta["name"],
+            C.ADDON_NAME,
             ucc_smartx_selenium_helper=ucc_smartx_selenium_helper,
             ucc_smartx_rest_helper=ucc_smartx_rest_helper,
         )
         logging.log_level.select(selection_log)
         logging.save()
         self.assert_util(logging.log_level.get_value().lower(), selection_log.lower())
-
-    @pytest.mark.logging_page
-    def test_logging_selected_log_level_backend(
-        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper, example_ta
-    ):
-        selection_log = "ERROR"
-        logging = Logging(
-            example_ta["name"],
-            ucc_smartx_selenium_helper=ucc_smartx_selenium_helper,
-            ucc_smartx_rest_helper=ucc_smartx_rest_helper,
-        )
-        logging.log_level.select(selection_log)
-        logging.save()
         log_level = logging.backend_conf.get_parameter("loglevel")
         self.assert_util(log_level, selection_log)
diff --git a/tests/ui/test_proxy_page.py b/tests/ui/test_proxy_page.py
index 06f9ba7c6..9aa996675 100644
--- a/tests/ui/test_proxy_page.py
+++ b/tests/ui/test_proxy_page.py
@@ -1,31 +1,20 @@
-#
-# Copyright 2021 Splunk Inc.
-#
-# 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.
-#
 import pytest
 from pytest_splunk_addon_ui_smartx.base_test import UccTester
 from pytest_splunk_addon_ui_smartx.pages.proxy import Proxy
 
+from tests.ui import constants as C
 
-class TestProxy(UccTester):
-    @pytest.mark.default
+PROXY_URL = (f"servicesNS/nobody/{C.ADDON_NAME}/{C.ADDON_NAME}_settings/proxy",)
+
+
+class TestProxyPage(UccTester):
+    @pytest.mark.proxy
     def test_proxy_default_configs(
-        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper, example_ta
+        self, ucc_smartx_selenium_helper, ucc_smartx_rest_helper
     ):
         proxy = Proxy(
-            example_ta["name"],
-            example_ta["proxy_url"],
+            C.ADDON_NAME,
+            PROXY_URL,
             ucc_smartx_selenium_helper=ucc_smartx_selenium_helper,
             ucc_smartx_rest_helper=ucc_smartx_rest_helper,
         )
diff --git a/tests/unit/test_alert_actions_conf_gen.py b/tests/unit/test_alert_actions_conf_gen.py
index fdb5400f2..3f3b2d45d 100644
--- a/tests/unit/test_alert_actions_conf_gen.py
+++ b/tests/unit/test_alert_actions_conf_gen.py
@@ -13,7 +13,7 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 #
-from splunk_add_on_ucc_framework.modular_alert_builder.build_core import (
+from splunk_add_on_ucc_framework.commands.modular_alert_builder import (
     alert_actions_conf_gen,
 )
 from tests.unit.helpers import get_testdata_file
@@ -97,7 +97,7 @@ def test_generate_alert_action(tmp_path):
                             "ctrl_props": {
                                 "value-field": "title",
                                 "label-field": "title",
-                                "search": "| rest /servicesNS/nobody/TA-SNOW/admin/TA_SNOW_account | dedup title",  # noqa: E501
+                                "search": "| rest /servicesNS/nobody/Splunk_TA_UCCExample/splunk_ta_uccexample_account | dedup title",  # noqa: E501
                             },
                         },
                     ],
diff --git a/tests/unit/test_alert_actions_html_gen.py b/tests/unit/test_alert_actions_html_gen.py
index 24695bffd..2dde46834 100644
--- a/tests/unit/test_alert_actions_html_gen.py
+++ b/tests/unit/test_alert_actions_html_gen.py
@@ -13,7 +13,7 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 #
-from splunk_add_on_ucc_framework.modular_alert_builder.build_core import (
+from splunk_add_on_ucc_framework.commands.modular_alert_builder import (
     alert_actions_html_gen,
 )
 from tests.unit.helpers import get_testdata_file
@@ -104,7 +104,7 @@ def test_generate_alert_action(tmp_path):
                             "ctrl_props": {
                                 "value-field": "title",
                                 "label-field": "title",
-                                "search": "| rest /servicesNS/nobody/TA-SNOW/admin/TA_SNOW_account | dedup title",  # noqa: E501
+                                "search": "| rest /servicesNS/nobody/Splunk_TA_UCCExample/splunk_ta_uccexample_account | dedup title",  # noqa: E501
                             },
                         },
                     ],
diff --git a/tests/unit/test_alert_actions_py_gen.py b/tests/unit/test_alert_actions_py_gen.py
index 9be07aa64..d82822098 100644
--- a/tests/unit/test_alert_actions_py_gen.py
+++ b/tests/unit/test_alert_actions_py_gen.py
@@ -13,7 +13,7 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 #
-from splunk_add_on_ucc_framework.modular_alert_builder.build_core import (
+from splunk_add_on_ucc_framework.commands.modular_alert_builder import (
     alert_actions_py_gen,
 )
 from tests.unit.helpers import get_testdata_file
@@ -97,7 +97,7 @@ def test_generate_alert_action(tmp_path):
                             "ctrl_props": {
                                 "value-field": "title",
                                 "label-field": "title",
-                                "search": "| rest /servicesNS/nobody/TA-SNOW/admin/TA_SNOW_account | dedup title",  # noqa: E501
+                                "search": "| rest /servicesNS/nobody/Splunk_TA_UCCExample/splunk_ta_uccexample_account | dedup title",  # noqa: E501
                             },
                         },
                     ],
diff --git a/tests/unit/test_app_conf.py b/tests/unit/test_app_conf.py
index 7ddc73fc2..057b97e9d 100644
--- a/tests/unit/test_app_conf.py
+++ b/tests/unit/test_app_conf.py
@@ -13,40 +13,72 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 #
-import io
+import os
+import tempfile
 from unittest import mock
 
-from splunk_add_on_ucc_framework import app_conf
+from splunk_add_on_ucc_framework import app_conf as app_conf_lib
 from tests.unit.helpers import get_testdata_file, get_testdata_file_path
 
 
 @mock.patch("time.time", mock.MagicMock(return_value=12345))
 def test_update():
-    app_config = app_conf.AppConf()
-    app_config.read(get_testdata_file_path("app.conf"))
-    app_config.update(
+    app_conf = app_conf_lib.AppConf()
+    app_conf.read(get_testdata_file_path("app.conf"))
+    app_manifest_mock = mock.MagicMock()
+    app_manifest_mock.get_description.return_value = (
+        "Description for Splunk_TA_UCCExample"
+    )
+    app_manifest_mock.get_addon_name.return_value = "Splunk_TA_UCCExample"
+    app_manifest_mock.get_title.return_value = "Title for Splunk_TA_UCCExample"
+    app_manifest_mock.get_authors.return_value = [
+        {
+            "name": "Company name",
+            "email": "email@example.com",
+            "company": "Company name",
+        },
+    ]
+    app_conf.update(
         "1.0.0",
-        "Splunk_TA_UCCExample",
-        "Description for Splunk_TA_UCCExample",
-        "Title for Splunk_TA_UCCExample",
+        app_manifest_mock,
+        [
+            "splunk_ta_uccexample_settings",
+            "splunk_ta_uccexample_accounts",
+        ],
     )
-    app_conf_output = io.StringIO()
-    app_config.write(app_conf_output)
-    app_conf_expected = get_testdata_file("app.conf.updated")
-    assert app_conf_expected == app_conf_output.getvalue()
+    with tempfile.TemporaryDirectory() as temp_dir:
+        output_app_conf_path = os.path.join(temp_dir, app_conf_lib.APP_CONF_FILE_NAME)
+        app_conf.write(output_app_conf_path)
+        app_conf_expected = get_testdata_file("app.conf.updated")
+        with open(output_app_conf_path) as output_app_conf_fd:
+            assert app_conf_expected == output_app_conf_fd.read()
 
 
 @mock.patch("time.time", mock.MagicMock(return_value=12345))
 def test_update_when_minimal_app_conf():
-    app_config = app_conf.AppConf()
-    app_config.read(get_testdata_file_path("app.conf.minimal"))
-    app_config.update(
+    app_conf = app_conf_lib.AppConf()
+    app_conf.read(get_testdata_file_path("app.conf.minimal"))
+    app_manifest_mock = mock.MagicMock()
+    app_manifest_mock.get_description.return_value = (
+        "Description for Splunk_TA_UCCExample"
+    )
+    app_manifest_mock.get_addon_name.return_value = "Splunk_TA_UCCExample"
+    app_manifest_mock.get_title.return_value = "Title for Splunk_TA_UCCExample"
+    app_manifest_mock.get_authors.return_value = [
+        {
+            "name": "Company name",
+            "email": "email@example.com",
+            "company": "Company name",
+        },
+    ]
+    app_conf.update(
         "1.0.0",
-        "Splunk_TA_UCCExample",
-        "Description for Splunk_TA_UCCExample",
-        "Title for Splunk_TA_UCCExample",
+        app_manifest_mock,
+        [],
     )
-    app_conf_output = io.StringIO()
-    app_config.write(app_conf_output)
-    app_conf_expected = get_testdata_file("app.conf.minimal.updated")
-    assert app_conf_expected == app_conf_output.getvalue()
+    with tempfile.TemporaryDirectory() as temp_dir:
+        output_app_conf_path = os.path.join(temp_dir, app_conf_lib.APP_CONF_FILE_NAME)
+        app_conf.write(output_app_conf_path)
+        app_conf_expected = get_testdata_file("app.conf.minimal.updated")
+        with open(output_app_conf_path) as output_app_conf_fd:
+            assert app_conf_expected == output_app_conf_fd.read()
diff --git a/tests/unit/test_global_config.py b/tests/unit/test_global_config.py
index 6a0ffbc10..56187e9c1 100644
--- a/tests/unit/test_global_config.py
+++ b/tests/unit/test_global_config.py
@@ -35,5 +35,5 @@ def test_global_config_parse(filename, is_yaml):
     assert global_config.namespace == "splunk_ta_uccexample"
     assert global_config.product == "Splunk_TA_UCCExample"
     assert global_config.original_path == global_config_path
-    assert global_config.schema_version is None
+    assert global_config.schema_version == "0.0.3"
     assert global_config.has_inputs() is True
diff --git a/tests/unit/test_global_config_validator.py b/tests/unit/test_global_config_validator.py
index 6381b16c6..e7fe40504 100644
--- a/tests/unit/test_global_config_validator.py
+++ b/tests/unit/test_global_config_validator.py
@@ -111,28 +111,21 @@ def test_config_validation_when_valid(filename, is_yaml):
             ),
         ),
         (
-            "invalid_config_validators_missing_for_file_input.json",
-            False,
-            pytest.raises(GlobalConfigValidatorException),
-            ("File validator should be present for " "'service_account' field."),
-        ),
-        (
-            "invalid_config_supported_file_types_field_is_missing.json",
+            "invalid_config_options_missing_for_file_input.json",
             False,
             pytest.raises(GlobalConfigValidatorException),
             (
-                "`json` should be present in the "
-                "'supportedFileTypes' for "
-                "'service_account' field."
+                "Options field for the file type should be present for 'service_account' field."
             ),
         ),
         (
-            "invalid_config_json_is_missing_in_supported_file_types.json",
+            "invalid_config_supported_file_types_field_is_missing.json",
             False,
             pytest.raises(GlobalConfigValidatorException),
             (
-                "`json` is only currently supported for "
-                "file input for 'service_account' field."
+                "You should define your supported file types in "
+                "the `supportedFileTypes` field for the "
+                "'service_account' field."
             ),
         ),
         (
diff --git a/tests/unit/test_main.py b/tests/unit/test_main.py
index 09d5ae68b..3d7855a92 100644
--- a/tests/unit/test_main.py
+++ b/tests/unit/test_main.py
@@ -27,50 +27,45 @@
             [],
             {
                 "source": "package",
-                "config": None,
-                "ta_version": None,
+                "config_path": None,
+                "addon_version": None,
                 "python_binary_name": "python3",
-                "openapi": True,
             },
         ),
         (
             ["build"],
             {
                 "source": "package",
-                "config": None,
-                "ta_version": None,
+                "config_path": None,
+                "addon_version": None,
                 "python_binary_name": "python3",
-                "openapi": True,
             },
         ),
         (
             ["--source", "package"],
             {
                 "source": "package",
-                "config": None,
-                "ta_version": None,
+                "config_path": None,
+                "addon_version": None,
                 "python_binary_name": "python3",
-                "openapi": True,
             },
         ),
         (
             ["build", "--source", "package"],
             {
                 "source": "package",
-                "config": None,
-                "ta_version": None,
+                "config_path": None,
+                "addon_version": None,
                 "python_binary_name": "python3",
-                "openapi": True,
             },
         ),
         (
             ["--source", "package", "--ta-version", "2.1.0"],
             {
                 "source": "package",
-                "config": None,
-                "ta_version": "2.1.0",
+                "config_path": None,
+                "addon_version": "2.1.0",
                 "python_binary_name": "python3",
-                "openapi": True,
             },
         ),
         (
@@ -84,10 +79,9 @@
             ],
             {
                 "source": "package",
-                "config": None,
-                "ta_version": "2.2.0",
+                "config_path": None,
+                "addon_version": "2.2.0",
                 "python_binary_name": "python.exe",
-                "openapi": True,
             },
         ),
         (
@@ -103,10 +97,9 @@
             ],
             {
                 "source": "package",
-                "config": "/path/to/globalConfig.json",
-                "ta_version": "2.2.0",
+                "config_path": "/path/to/globalConfig.json",
+                "addon_version": "2.2.0",
                 "python_binary_name": "python.exe",
-                "openapi": True,
             },
         ),
         (
@@ -122,10 +115,9 @@
             ],
             {
                 "source": "package",
-                "config": "/path/to/globalConfig.yaml",
-                "ta_version": "2.2.0",
+                "config_path": "/path/to/globalConfig.yaml",
+                "addon_version": "2.2.0",
                 "python_binary_name": "python.exe",
-                "openapi": True,
             },
         ),
         (
@@ -142,15 +134,14 @@
             ],
             {
                 "source": "package",
-                "config": "/path/to/globalConfig.yaml",
-                "ta_version": "2.2.0",
+                "config_path": "/path/to/globalConfig.yaml",
+                "addon_version": "2.2.0",
                 "python_binary_name": "python.exe",
-                "openapi": True,
             },
         ),
     ],
 )
-@mock.patch("splunk_add_on_ucc_framework.main.generate")
+@mock.patch("splunk_add_on_ucc_framework.commands.build.generate")
 def test_build_command(mock_ucc_gen_generate, args, expected_parameters):
     main.main(args)
 
diff --git a/tests/unit/test_meta_conf.py b/tests/unit/test_meta_conf.py
index 8acf5f9e9..8f630c487 100644
--- a/tests/unit/test_meta_conf.py
+++ b/tests/unit/test_meta_conf.py
@@ -13,14 +13,20 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 #
-import io
+import os
+import tempfile
 
-from splunk_add_on_ucc_framework import meta_conf
+from splunk_add_on_ucc_framework import meta_conf as meta_conf_lib
 
 
-def test_update():
-    meta_config = meta_conf.MetaConf()
-    actual_output = io.StringIO()
-    meta_config.create_default(actual_output)
-    expected_output = meta_conf.DEFAULT
-    assert expected_output == actual_output.getvalue()
+def test_create_default():
+    meta_conf = meta_conf_lib.MetaConf()
+    with tempfile.TemporaryDirectory() as temp_dir:
+        meta_conf.create_default()
+        output_default_meta_path = os.path.join(
+            temp_dir, meta_conf_lib.DEFAULT_META_FILE_NAME
+        )
+        meta_conf.write(output_default_meta_path)
+        expected_output = meta_conf_lib.DEFAULT
+        with open(output_default_meta_path) as output_app_conf_fd:
+            assert expected_output == output_app_conf_fd.read()
diff --git a/tests/unit/test_server_conf.py b/tests/unit/test_server_conf.py
new file mode 100644
index 000000000..3976ff069
--- /dev/null
+++ b/tests/unit/test_server_conf.py
@@ -0,0 +1,39 @@
+#
+# Copyright 2021 Splunk Inc.
+#
+# 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.
+#
+import os
+import tempfile
+
+from splunk_add_on_ucc_framework import server_conf as server_conf_lib
+from tests.unit import helpers
+
+
+def test_create_default():
+    server_conf = server_conf_lib.ServerConf()
+    with tempfile.TemporaryDirectory() as temp_dir:
+        server_conf.create_default(
+            [
+                "splunk_ta_ucc_example_settings",
+                "splunk_ta_ucc_example_account",
+                "splunk_ta_ucc_example_oauth",
+            ]
+        )
+        output_default_server_conf_path = os.path.join(
+            temp_dir, server_conf_lib.SERVER_CONF_FILE_NAME
+        )
+        server_conf.write(output_default_server_conf_path)
+        server_conf_expected = helpers.get_testdata_file("server.conf.generated")
+        with open(output_default_server_conf_path) as output_server_conf_fd:
+            assert server_conf_expected == output_server_conf_fd.read()
diff --git a/tests/unit/testdata/alert.html.generated b/tests/unit/testdata/alert.html.generated
index a5a101d95..f43924ae7 100644
--- a/tests/unit/testdata/alert.html.generated
+++ b/tests/unit/testdata/alert.html.generated
@@ -67,7 +67,7 @@
     <div class="controls">
 		<splunk-search-dropdown name="action.test_alert.param.account" id="test_alert_account"                 value-field="title"
                 label-field="title"
-                search="| rest /servicesNS/nobody/TA-SNOW/admin/TA_SNOW_account | dedup title"
+                search="| rest /servicesNS/nobody/Splunk_TA_UCCExample/splunk_ta_uccexample_account | dedup title"
  />
             <span class="help-block">
         Select the account from the dropdown
diff --git a/tests/unit/testdata/alert_actions.conf.generated b/tests/unit/testdata/alert_actions.conf.generated
index 49c91c119..131690a06 100644
--- a/tests/unit/testdata/alert_actions.conf.generated
+++ b/tests/unit/testdata/alert_actions.conf.generated
@@ -7,7 +7,7 @@ is_custom = 1
 payload_format = json
 icon_path = alerticon.png
 param.name = xyz
-param.all_incidents =
+param.all_incidents = 0
 param.table_list = problem
 param.action = two
 param.account =
diff --git a/tests/unit/testdata/app.conf b/tests/unit/testdata/app.conf
index af80bbf04..5c84be61f 100644
--- a/tests/unit/testdata/app.conf
+++ b/tests/unit/testdata/app.conf
@@ -1,11 +1,3 @@
-######################################################
-#
-# ${package.name}
-#
-# ${copyright}
-#
-######################################################
-
 [install]
 build = 0
 
diff --git a/tests/unit/testdata/app.conf.minimal.updated b/tests/unit/testdata/app.conf.minimal.updated
index 12ff67d5e..1f153b7a0 100644
--- a/tests/unit/testdata/app.conf.minimal.updated
+++ b/tests/unit/testdata/app.conf.minimal.updated
@@ -1,16 +1,21 @@
 [id]
 version = 1.0.0
+name = Splunk_TA_UCCExample
 
 [launcher]
 version = 1.0.0
 description = Description for Splunk_TA_UCCExample
+author = Company name
 
 [install]
 build = 12345
+is_configured = true
+state = enabled
 
 [package]
 id = Splunk_TA_UCCExample
 
 [ui]
 label = Title for Splunk_TA_UCCExample
+is_visible = true
 
diff --git a/tests/unit/testdata/app.conf.updated b/tests/unit/testdata/app.conf.updated
index fe6788d3f..22b8ad695 100644
--- a/tests/unit/testdata/app.conf.updated
+++ b/tests/unit/testdata/app.conf.updated
@@ -1,16 +1,10 @@
-######################################################
-#
-# ${package.name}
-#
-# ${copyright}
-#
-######################################################
-
 [install]
 build = 12345
+is_configured = true
+state = enabled
 
 [launcher]
-author = Splunk Inc.
+author = Company name
 version = 1.0.0
 description = Description for Splunk_TA_UCCExample
 
@@ -24,4 +18,9 @@ id = Splunk_TA_UCCExample
 
 [id]
 version = 1.0.0
+name = Splunk_TA_UCCExample
+
+[triggers]
+reload.splunk_ta_uccexample_settings = simple
+reload.splunk_ta_uccexample_accounts = simple
 
diff --git a/tests/unit/testdata/invalid_config_both_rest_handler_name_class_are_present.json b/tests/unit/testdata/invalid_config_both_rest_handler_name_class_are_present.json
index 042616d6b..3457546d9 100644
--- a/tests/unit/testdata/invalid_config_both_rest_handler_name_class_are_present.json
+++ b/tests/unit/testdata/invalid_config_both_rest_handler_name_class_are_present.json
@@ -3,204 +3,41 @@
         "configuration": {
             "tabs": [
                 {
-                    "name": "account",
-                    "table": {
-                        "actions": [
-                            "edit",
-                            "delete",
-                            "clone"
-                        ],
-                        "header": [
-                            {
-                                "label": "Name",
-                                "field": "name"
-                            },
-                            {
-                                "label": "Auth Type",
-                                "field": "auth_type"
-                            }
-                        ]
-                    },
+                    "name": "logging",
                     "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*$"
-                                }
-                            ],
-                            "options": {
-                                "placeholder": "Required"
-                            },
-                            "field": "name",
-                            "help": "Enter a unique name for this account.",
-                            "required": true
-                        },
                         {
                             "type": "singleSelect",
-                            "label": "Example Environment",
+                            "label": "Log level",
                             "options": {
                                 "disableSearch": true,
                                 "autoCompleteFields": [
                                     {
-                                        "value": "login.example.com",
-                                        "label": "Value1"
+                                        "value": "DEBUG",
+                                        "label": "DEBUG"
                                     },
                                     {
-                                        "value": "test.example.com",
-                                        "label": "Value2"
+                                        "value": "INFO",
+                                        "label": "INFO"
                                     },
                                     {
-                                        "value": "other",
-                                        "label": "Other"
-                                    }
-                                ],
-                                "display": true
-                            },
-                            "help": "",
-                            "field": "custom_endpoint",
-                            "defaultValue": "login.example.com",
-                            "required": true
-                        },
-                        {
-                            "type": "text",
-                            "label": "Endpoint URL",
-                            "help": "Enter the endpoint URL.",
-                            "field": "endpoint",
-                            "options": {
-                                "display": false
-                            }
-                        },
-                        {
-                            "type": "checkbox",
-                            "label": "Example Checkbox",
-                            "field": "account_checkbox",
-                            "help": "This is an example checkbox for the account entity"
-                        },
-                        {
-                            "type": "radio",
-                            "label": "Example Radio",
-                            "field": "account_radio",
-                            "defaultValue": "yes",
-                            "help": "This is an example radio button for the account entity",
-                            "required": true,
-                            "options": {
-                                "items": [{
-                                        "value": "yes",
-                                        "label": "Yes"
+                                        "value": "WARNING",
+                                        "label": "WARNING"
                                     },
                                     {
-                                        "value": "no",
-                                        "label": "No"
-                                    }
-                                ],
-                                "display": true
-                            }
-                        },
-                        {
-                            "type": "multipleSelect",
-                            "label": "Example Multiple Select",
-                            "field": "account_multiple_select",
-                            "help": "This is an example multipleSelect for account entity",
-                            "required": true,
-                            "options": {
-                                "items": [{
-                                        "value": "one",
-                                        "label": "Option One"
+                                        "value": "ERROR",
+                                        "label": "ERROR"
                                     },
                                     {
-                                        "value": "two",
-                                        "label": "Option Two"
+                                        "value": "CRITICAL",
+                                        "label": "CRITICAL"
                                     }
                                 ]
-                            }
-                        },
-                        {
-                            "type": "text",
-                            "label": "State",
-                            "help": "This is a boolean field for developers to decide whether state parameter will be passed in the OAuth flow. Value: true|false",
-                            "field": "oauth_state_enabled",
-                            "options": {
-                                "display": false
-                            }
-                        },
-                        {
-                            "type": "oauth",
-                            "field": "oauth",
-                            "label": "Not used",
-                            "options": {
-                                "auth_type": [
-                                    "basic",
-                                    "oauth"
-                                ],
-                                "basic": [
-                                    {
-                                        "oauth_field": "username",
-                                        "label": "Username",
-                                        "help": "Enter the username for this account.",
-                                        "field": "username"
-                                    },
-                                    {
-                                        "oauth_field": "password",
-                                        "label": "Password",
-                                        "encrypted": true,
-                                        "help": "Enter the password for this account.",
-                                        "field": "password"
-                                    },
-                                    {
-                                        "oauth_field": "security_token",
-                                        "label": "Security Token",
-                                        "encrypted": true,
-                                        "help": "Enter the security token.",
-                                        "field": "token"
-                                    }
-                                ],
-                                "oauth": [
-                                    {
-                                        "oauth_field": "client_id",
-                                        "label": "Client Id",
-                                        "field": "client_id",
-                                        "help": "Enter the Client Id for this account."
-                                    },
-                                    {
-                                        "oauth_field": "client_secret",
-                                        "label": "Client Secret",
-                                        "field": "client_secret",
-                                        "encrypted": true,
-                                        "help": "Enter the Client Secret key for this account."
-                                    },
-                                    {
-                                        "oauth_field": "redirect_url",
-                                        "label": "Redirect url",
-                                        "field": "redirect_url",
-                                        "help": "Copy and paste this URL into your app."
-                                    }
-                                ],
-                                "auth_code_endpoint": "/services/oauth2/authorize",
-                                "access_token_endpoint": "/services/oauth2/token",
-                                "oauth_timeout": 30
-                            }
-                        },
-                        {
-                            "field": "example_help_link",
-                            "label": "",
-                            "type": "helpLink",
-                            "options": {
-                                "text": "Help Link",
-                                "link": "https://docs.splunk.com/Documentation"
-                            }
+                            },
+                            "defaultValue": "INFO",
+                            "field": "loglevel"
                         }
                     ],
-                    "title": "Account"
+                    "title": "Logging"
                 }
             ],
             "title": "Configuration",
@@ -235,237 +72,6 @@
                             "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"
-                        },
-                        {
-                            "type": "radio",
-                            "label": "Example Radio",
-                            "field": "input_one_radio",
-                            "defaultValue": "yes",
-                            "help": "This is an example radio button for the input one entity",
-                            "required": false,
-                            "options": {
-                                "items": [{
-                                        "value": "yes",
-                                        "label": "Yes"
-                                    },
-                                    {
-                                        "value": "no",
-                                        "label": "No"
-                                    }
-                                ],
-                                "display": true
-                            }
-                        },
-                        {
-                            "field": "singleSelectTest",
-                            "label": "Single Select Group Test",
-                            "type": "singleSelect",
-                            "options": {
-                                "createSearchChoice": true,
-                                "autoCompleteFields": [
-                                    {
-                                        "label": "Group1",
-                                        "children": [
-                                            {
-                                                "value": "one",
-                                                "label": "One"
-                                            },
-                                            {
-                                                "value": "two",
-                                                "label": "Two"
-                                            }
-                                        ]
-                                    },
-                                    {
-                                        "label": "Group2",
-                                        "children": [
-                                            {
-                                                "value": "three",
-                                                "label": "Three"
-                                            },
-                                            {
-                                                "value": "four",
-                                                "label": "Four"
-                                            }
-                                        ]
-                                    }
-                                ]
-                            }
-                        },
-                        {
-                            "field": "multipleSelectTest",
-                            "label": "Multiple Select Test",
-                            "type": "multipleSelect",
-                            "options": {
-                                "delimiter": "|",
-                                "items": [
-                                    {
-                                        "value": "a",
-                                        "label": "A"
-                                    },
-                                    {
-                                        "value": "b",
-                                        "label": "B"
-                                    }
-                                ]
-                            }
-                        },
-                        {
-                            "type": "text",
-                            "label": "Interval",
-                            "validators": [
-                                {
-                                    "type": "regex",
-                                    "errorMsg": "Interval must be an integer.",
-                                    "pattern": "^\\-[1-9]\\d*$|^\\d*$"
-                                }
-                            ],
-                            "field": "interval",
-                            "help": "Time interval of the data input, in seconds.",
-                            "required": true
-                        },
-                        {
-                            "type": "singleSelect",
-                            "label": "Index",
-                            "validators": [
-                                {
-                                    "type": "string",
-                                    "errorMsg": "Length of index name should be between 1 and 80.",
-                                    "minLength": 1,
-                                    "maxLength": 80
-                                }
-                            ],
-                            "defaultValue": "default",
-                            "options": {
-                                "endpointUrl": "data/indexes",
-                                "denyList": "^_.*$",
-                                "createSearchChoice": true
-                            },
-                            "field": "index",
-                            "required": true
-                        },
-                        {
-                            "type": "singleSelect",
-                            "label": "Example Account",
-                            "options": {
-                                "referenceName": "account"
-                            },
-                            "help": "",
-                            "field": "account",
-                            "required": true
-                        },
-                        {
-                            "type": "text",
-                            "label": "Object",
-                            "validators": [
-                                {
-                                    "type": "string",
-                                    "errorMsg": "Max length of text input is 8192",
-                                    "minLength": 0,
-                                    "maxLength": 8192
-                                }
-                            ],
-                            "field": "object",
-                            "help": "The name of the object to query for.",
-                            "required": true
-                        },
-                        {
-                            "type": "text",
-                            "label": "Object Fields",
-                            "validators": [
-                                {
-                                    "type": "string",
-                                    "errorMsg": "Max length of text input is 8192",
-                                    "minLength": 0,
-                                    "maxLength": 8192
-                                }
-                            ],
-                            "field": "object_fields",
-                            "help": "Object fields from which to collect data. Delimit multiple fields using a comma.",
-                            "required": true
-                        },
-                        {
-                            "type": "text",
-                            "label": "Order By",
-                            "validators": [
-                                {
-                                    "type": "string",
-                                    "errorMsg": "Max length of text input is 8192",
-                                    "minLength": 0,
-                                    "maxLength": 8192
-                                }
-                            ],
-                            "defaultValue": "LastModifiedDate",
-                            "field": "order_by",
-                            "help": "The datetime field by which to query results in ascending order for indexing.",
-                            "required": true
-                        },
-                        {
-                            "type": "radio",
-                            "label": "Use existing data input?",
-                            "field": "use_existing_checkpoint",
-                            "defaultValue": "yes",
-                            "help": "Data input already exists. Select `No` if you want to reset the data collection.",
-                            "required": false,
-                            "options": {
-                                "items": [
-                                    {
-                                        "value": "yes",
-                                        "label": "Yes"
-                                    },
-                                    {
-                                        "value": "no",
-                                        "label": "No"
-                                    }
-                                ],
-                                "display": false
-                            }
-                        },
-                        {
-                            "type": "text",
-                            "label": "Query Start Date",
-                            "validators": [
-                                {
-                                    "type": "regex",
-                                    "errorMsg": "Invalid date and time format",
-                                    "pattern": "^(\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}.\\d{3}z)?$"
-                                }
-                            ],
-                            "field": "start_date",
-                            "help": "The datetime after which to query and index records, in this format: \"YYYY-MM-DDThh:mm:ss.000z\".\nDefaults to 90 days earlier from now.",
-                            "tooltip": "Changing this parameter may result in gaps or duplication in data collection.",
-                            "required": false
-                        },
-                        {
-                            "type": "text",
-                            "label": "Limit",
-                            "validators": [
-                                {
-                                    "type": "string",
-                                    "errorMsg": "Max length of text input is 8192",
-                                    "minLength": 0,
-                                    "maxLength": 8192
-                                }
-                            ],
-                            "defaultValue": "1000",
-                            "field": "limit",
-                            "help": "The maximum number of results returned by the query.",
-                            "required": false
-                        },
-                        {
-                            "field": "example_help_link",
-                            "label": "",
-                            "type": "helpLink",
-                            "options": {
-                                "text": "Help Link",
-                                "link": "https://docs.splunk.com/Documentation"
-                            }
                         }
                     ],
                     "title": "Example Input One"
@@ -484,78 +90,22 @@
                     {
                         "label": "Name",
                         "field": "name"
-                    },
-                    {
-                        "label": "Account Name",
-                        "field": "account"
-                    },
-                    {
-                        "label": "Interval",
-                        "field": "interval"
-                    },
-                    {
-                        "label": "Index",
-                        "field": "index"
-                    },
-                    {
-                        "label": "Status",
-                        "field": "disabled"
                     }
                 ],
                 "moreInfo": [
                     {
                         "label": "Name",
                         "field": "name"
-                    },
-                    {
-                        "label": "Interval",
-                        "field": "interval"
-                    },
-                    {
-                        "label": "Index",
-                        "field": "index"
-                    },
-                    {
-                        "label": "Status",
-                        "field": "disabled",
-                        "mapping": {
-                            "true": "Disabled",
-                            "false": "Enabled"
-                        }
-                    },
-                    {
-                        "label": "Example Account",
-                        "field": "account"
-                    },
-                    {
-                        "label": "Object",
-                        "field": "object"
-                    },
-                    {
-                        "label": "Object Fields",
-                        "field": "object_fields"
-                    },
-                    {
-                        "label": "Order By",
-                        "field": "order_by"
-                    },
-                    {
-                        "label": "Query Start Date",
-                        "field": "start_date"
-                    },
-                    {
-                        "label": "Limit",
-                        "field": "limit"
                     }
                 ]
             }
         }
     },
     "meta": {
-        "apiVersion": "3.2.0",
         "name": "Splunk_TA_UCCExample",
         "restRoot": "splunk_ta_uccexample",
         "version": "1.0.0",
-        "displayName": "Splunk UCC test Add-on"
+        "displayName": "Splunk UCC test Add-on",
+        "schemaVersion": "0.0.3"
     }
 }
diff --git a/tests/unit/testdata/invalid_config_both_rest_handler_name_module_are_present.json b/tests/unit/testdata/invalid_config_both_rest_handler_name_module_are_present.json
index d4e7ca50a..88edca8c2 100644
--- a/tests/unit/testdata/invalid_config_both_rest_handler_name_module_are_present.json
+++ b/tests/unit/testdata/invalid_config_both_rest_handler_name_module_are_present.json
@@ -3,204 +3,41 @@
         "configuration": {
             "tabs": [
                 {
-                    "name": "account",
-                    "table": {
-                        "actions": [
-                            "edit",
-                            "delete",
-                            "clone"
-                        ],
-                        "header": [
-                            {
-                                "label": "Name",
-                                "field": "name"
-                            },
-                            {
-                                "label": "Auth Type",
-                                "field": "auth_type"
-                            }
-                        ]
-                    },
+                    "name": "logging",
                     "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*$"
-                                }
-                            ],
-                            "options": {
-                                "placeholder": "Required"
-                            },
-                            "field": "name",
-                            "help": "Enter a unique name for this account.",
-                            "required": true
-                        },
                         {
                             "type": "singleSelect",
-                            "label": "Example Environment",
+                            "label": "Log level",
                             "options": {
                                 "disableSearch": true,
                                 "autoCompleteFields": [
                                     {
-                                        "value": "login.example.com",
-                                        "label": "Value1"
+                                        "value": "DEBUG",
+                                        "label": "DEBUG"
                                     },
                                     {
-                                        "value": "test.example.com",
-                                        "label": "Value2"
+                                        "value": "INFO",
+                                        "label": "INFO"
                                     },
                                     {
-                                        "value": "other",
-                                        "label": "Other"
-                                    }
-                                ],
-                                "display": true
-                            },
-                            "help": "",
-                            "field": "custom_endpoint",
-                            "defaultValue": "login.example.com",
-                            "required": true
-                        },
-                        {
-                            "type": "text",
-                            "label": "Endpoint URL",
-                            "help": "Enter the endpoint URL.",
-                            "field": "endpoint",
-                            "options": {
-                                "display": false
-                            }
-                        },
-                        {
-                            "type": "checkbox",
-                            "label": "Example Checkbox",
-                            "field": "account_checkbox",
-                            "help": "This is an example checkbox for the account entity"
-                        },
-                        {
-                            "type": "radio",
-                            "label": "Example Radio",
-                            "field": "account_radio",
-                            "defaultValue": "yes",
-                            "help": "This is an example radio button for the account entity",
-                            "required": true,
-                            "options": {
-                                "items": [{
-                                        "value": "yes",
-                                        "label": "Yes"
+                                        "value": "WARNING",
+                                        "label": "WARNING"
                                     },
                                     {
-                                        "value": "no",
-                                        "label": "No"
-                                    }
-                                ],
-                                "display": true
-                            }
-                        },
-                        {
-                            "type": "multipleSelect",
-                            "label": "Example Multiple Select",
-                            "field": "account_multiple_select",
-                            "help": "This is an example multipleSelect for account entity",
-                            "required": true,
-                            "options": {
-                                "items": [{
-                                        "value": "one",
-                                        "label": "Option One"
+                                        "value": "ERROR",
+                                        "label": "ERROR"
                                     },
                                     {
-                                        "value": "two",
-                                        "label": "Option Two"
+                                        "value": "CRITICAL",
+                                        "label": "CRITICAL"
                                     }
                                 ]
-                            }
-                        },
-                        {
-                            "type": "text",
-                            "label": "State",
-                            "help": "This is a boolean field for developers to decide whether state parameter will be passed in the OAuth flow. Value: true|false",
-                            "field": "oauth_state_enabled",
-                            "options": {
-                                "display": false
-                            }
-                        },
-                        {
-                            "type": "oauth",
-                            "field": "oauth",
-                            "label": "Not used",
-                            "options": {
-                                "auth_type": [
-                                    "basic",
-                                    "oauth"
-                                ],
-                                "basic": [
-                                    {
-                                        "oauth_field": "username",
-                                        "label": "Username",
-                                        "help": "Enter the username for this account.",
-                                        "field": "username"
-                                    },
-                                    {
-                                        "oauth_field": "password",
-                                        "label": "Password",
-                                        "encrypted": true,
-                                        "help": "Enter the password for this account.",
-                                        "field": "password"
-                                    },
-                                    {
-                                        "oauth_field": "security_token",
-                                        "label": "Security Token",
-                                        "encrypted": true,
-                                        "help": "Enter the security token.",
-                                        "field": "token"
-                                    }
-                                ],
-                                "oauth": [
-                                    {
-                                        "oauth_field": "client_id",
-                                        "label": "Client Id",
-                                        "field": "client_id",
-                                        "help": "Enter the Client Id for this account."
-                                    },
-                                    {
-                                        "oauth_field": "client_secret",
-                                        "label": "Client Secret",
-                                        "field": "client_secret",
-                                        "encrypted": true,
-                                        "help": "Enter the Client Secret key for this account."
-                                    },
-                                    {
-                                        "oauth_field": "redirect_url",
-                                        "label": "Redirect url",
-                                        "field": "redirect_url",
-                                        "help": "Copy and paste this URL into your app."
-                                    }
-                                ],
-                                "auth_code_endpoint": "/services/oauth2/authorize",
-                                "access_token_endpoint": "/services/oauth2/token",
-                                "oauth_timeout": 30
-                            }
-                        },
-                        {
-                            "field": "example_help_link",
-                            "label": "",
-                            "type": "helpLink",
-                            "options": {
-                                "text": "Help Link",
-                                "link": "https://docs.splunk.com/Documentation"
-                            }
+                            },
+                            "defaultValue": "INFO",
+                            "field": "loglevel"
                         }
                     ],
-                    "title": "Account"
+                    "title": "Logging"
                 }
             ],
             "title": "Configuration",
@@ -235,237 +72,6 @@
                             "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"
-                        },
-                        {
-                            "type": "radio",
-                            "label": "Example Radio",
-                            "field": "input_one_radio",
-                            "defaultValue": "yes",
-                            "help": "This is an example radio button for the input one entity",
-                            "required": false,
-                            "options": {
-                                "items": [{
-                                        "value": "yes",
-                                        "label": "Yes"
-                                    },
-                                    {
-                                        "value": "no",
-                                        "label": "No"
-                                    }
-                                ],
-                                "display": true
-                            }
-                        },
-                        {
-                            "field": "singleSelectTest",
-                            "label": "Single Select Group Test",
-                            "type": "singleSelect",
-                            "options": {
-                                "createSearchChoice": true,
-                                "autoCompleteFields": [
-                                    {
-                                        "label": "Group1",
-                                        "children": [
-                                            {
-                                                "value": "one",
-                                                "label": "One"
-                                            },
-                                            {
-                                                "value": "two",
-                                                "label": "Two"
-                                            }
-                                        ]
-                                    },
-                                    {
-                                        "label": "Group2",
-                                        "children": [
-                                            {
-                                                "value": "three",
-                                                "label": "Three"
-                                            },
-                                            {
-                                                "value": "four",
-                                                "label": "Four"
-                                            }
-                                        ]
-                                    }
-                                ]
-                            }
-                        },
-                        {
-                            "field": "multipleSelectTest",
-                            "label": "Multiple Select Test",
-                            "type": "multipleSelect",
-                            "options": {
-                                "delimiter": "|",
-                                "items": [
-                                    {
-                                        "value": "a",
-                                        "label": "A"
-                                    },
-                                    {
-                                        "value": "b",
-                                        "label": "B"
-                                    }
-                                ]
-                            }
-                        },
-                        {
-                            "type": "text",
-                            "label": "Interval",
-                            "validators": [
-                                {
-                                    "type": "regex",
-                                    "errorMsg": "Interval must be an integer.",
-                                    "pattern": "^\\-[1-9]\\d*$|^\\d*$"
-                                }
-                            ],
-                            "field": "interval",
-                            "help": "Time interval of the data input, in seconds.",
-                            "required": true
-                        },
-                        {
-                            "type": "singleSelect",
-                            "label": "Index",
-                            "validators": [
-                                {
-                                    "type": "string",
-                                    "errorMsg": "Length of index name should be between 1 and 80.",
-                                    "minLength": 1,
-                                    "maxLength": 80
-                                }
-                            ],
-                            "defaultValue": "default",
-                            "options": {
-                                "endpointUrl": "data/indexes",
-                                "denyList": "^_.*$",
-                                "createSearchChoice": true
-                            },
-                            "field": "index",
-                            "required": true
-                        },
-                        {
-                            "type": "singleSelect",
-                            "label": "Example Account",
-                            "options": {
-                                "referenceName": "account"
-                            },
-                            "help": "",
-                            "field": "account",
-                            "required": true
-                        },
-                        {
-                            "type": "text",
-                            "label": "Object",
-                            "validators": [
-                                {
-                                    "type": "string",
-                                    "errorMsg": "Max length of text input is 8192",
-                                    "minLength": 0,
-                                    "maxLength": 8192
-                                }
-                            ],
-                            "field": "object",
-                            "help": "The name of the object to query for.",
-                            "required": true
-                        },
-                        {
-                            "type": "text",
-                            "label": "Object Fields",
-                            "validators": [
-                                {
-                                    "type": "string",
-                                    "errorMsg": "Max length of text input is 8192",
-                                    "minLength": 0,
-                                    "maxLength": 8192
-                                }
-                            ],
-                            "field": "object_fields",
-                            "help": "Object fields from which to collect data. Delimit multiple fields using a comma.",
-                            "required": true
-                        },
-                        {
-                            "type": "text",
-                            "label": "Order By",
-                            "validators": [
-                                {
-                                    "type": "string",
-                                    "errorMsg": "Max length of text input is 8192",
-                                    "minLength": 0,
-                                    "maxLength": 8192
-                                }
-                            ],
-                            "defaultValue": "LastModifiedDate",
-                            "field": "order_by",
-                            "help": "The datetime field by which to query results in ascending order for indexing.",
-                            "required": true
-                        },
-                        {
-                            "type": "radio",
-                            "label": "Use existing data input?",
-                            "field": "use_existing_checkpoint",
-                            "defaultValue": "yes",
-                            "help": "Data input already exists. Select `No` if you want to reset the data collection.",
-                            "required": false,
-                            "options": {
-                                "items": [
-                                    {
-                                        "value": "yes",
-                                        "label": "Yes"
-                                    },
-                                    {
-                                        "value": "no",
-                                        "label": "No"
-                                    }
-                                ],
-                                "display": false
-                            }
-                        },
-                        {
-                            "type": "text",
-                            "label": "Query Start Date",
-                            "validators": [
-                                {
-                                    "type": "regex",
-                                    "errorMsg": "Invalid date and time format",
-                                    "pattern": "^(\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}.\\d{3}z)?$"
-                                }
-                            ],
-                            "field": "start_date",
-                            "help": "The datetime after which to query and index records, in this format: \"YYYY-MM-DDThh:mm:ss.000z\".\nDefaults to 90 days earlier from now.",
-                            "tooltip": "Changing this parameter may result in gaps or duplication in data collection.",
-                            "required": false
-                        },
-                        {
-                            "type": "text",
-                            "label": "Limit",
-                            "validators": [
-                                {
-                                    "type": "string",
-                                    "errorMsg": "Max length of text input is 8192",
-                                    "minLength": 0,
-                                    "maxLength": 8192
-                                }
-                            ],
-                            "defaultValue": "1000",
-                            "field": "limit",
-                            "help": "The maximum number of results returned by the query.",
-                            "required": false
-                        },
-                        {
-                            "field": "example_help_link",
-                            "label": "",
-                            "type": "helpLink",
-                            "options": {
-                                "text": "Help Link",
-                                "link": "https://docs.splunk.com/Documentation"
-                            }
                         }
                     ],
                     "title": "Example Input One"
@@ -484,78 +90,22 @@
                     {
                         "label": "Name",
                         "field": "name"
-                    },
-                    {
-                        "label": "Account Name",
-                        "field": "account"
-                    },
-                    {
-                        "label": "Interval",
-                        "field": "interval"
-                    },
-                    {
-                        "label": "Index",
-                        "field": "index"
-                    },
-                    {
-                        "label": "Status",
-                        "field": "disabled"
                     }
                 ],
                 "moreInfo": [
                     {
                         "label": "Name",
                         "field": "name"
-                    },
-                    {
-                        "label": "Interval",
-                        "field": "interval"
-                    },
-                    {
-                        "label": "Index",
-                        "field": "index"
-                    },
-                    {
-                        "label": "Status",
-                        "field": "disabled",
-                        "mapping": {
-                            "true": "Disabled",
-                            "false": "Enabled"
-                        }
-                    },
-                    {
-                        "label": "Example Account",
-                        "field": "account"
-                    },
-                    {
-                        "label": "Object",
-                        "field": "object"
-                    },
-                    {
-                        "label": "Object Fields",
-                        "field": "object_fields"
-                    },
-                    {
-                        "label": "Order By",
-                        "field": "order_by"
-                    },
-                    {
-                        "label": "Query Start Date",
-                        "field": "start_date"
-                    },
-                    {
-                        "label": "Limit",
-                        "field": "limit"
                     }
                 ]
             }
         }
     },
     "meta": {
-        "apiVersion": "3.2.0",
         "name": "Splunk_TA_UCCExample",
         "restRoot": "splunk_ta_uccexample",
         "version": "1.0.0",
-        "displayName": "Splunk UCC test Add-on"
+        "displayName": "Splunk UCC test Add-on",
+        "schemaVersion": "0.0.3"
     }
 }
diff --git a/tests/unit/testdata/invalid_config_configuration_autoCompleteFields_duplicates.json b/tests/unit/testdata/invalid_config_configuration_autoCompleteFields_duplicates.json
index dbb0dbd00..fd954eda3 100644
--- a/tests/unit/testdata/invalid_config_configuration_autoCompleteFields_duplicates.json
+++ b/tests/unit/testdata/invalid_config_configuration_autoCompleteFields_duplicates.json
@@ -33,10 +33,10 @@
         }
     },
     "meta": {
-        "apiVersion": "3.2.0",
         "name": "Splunk_TA_UCCExample",
         "restRoot": "splunk_ta_uccexample",
         "version": "1.0.0",
-        "displayName": "Splunk UCC test Add-on"
+        "displayName": "Splunk UCC test Add-on",
+        "schemaVersion": "0.0.3"
     }
 }
diff --git a/tests/unit/testdata/invalid_config_configuration_children_duplicates.json b/tests/unit/testdata/invalid_config_configuration_children_duplicates.json
index c27ad295d..a360f02e9 100644
--- a/tests/unit/testdata/invalid_config_configuration_children_duplicates.json
+++ b/tests/unit/testdata/invalid_config_configuration_children_duplicates.json
@@ -38,10 +38,10 @@
         }
     },
     "meta": {
-        "apiVersion": "3.2.0",
         "name": "Splunk_TA_UCCExample",
         "restRoot": "splunk_ta_uccexample",
         "version": "1.0.0",
-        "displayName": "Splunk UCC test Add-on"
+        "displayName": "Splunk UCC test Add-on",
+        "schemaVersion": "0.0.3"
     }
 }
diff --git a/tests/unit/testdata/invalid_config_configuration_entity_duplicates.json b/tests/unit/testdata/invalid_config_configuration_entity_duplicates.json
index cac2903d0..8557ef4c9 100644
--- a/tests/unit/testdata/invalid_config_configuration_entity_duplicates.json
+++ b/tests/unit/testdata/invalid_config_configuration_entity_duplicates.json
@@ -56,10 +56,10 @@
         }
     },
     "meta": {
-        "apiVersion": "3.2.0",
         "name": "Splunk_TA_UCCExample",
         "restRoot": "splunk_ta_uccexample",
         "version": "1.0.0",
-        "displayName": "Splunk UCC test Add-on"
+        "displayName": "Splunk UCC test Add-on",
+        "schemaVersion": "0.0.3"
     }
 }
diff --git a/tests/unit/testdata/invalid_config_configuration_number_validator_range_second_element_smaller_than_first.json b/tests/unit/testdata/invalid_config_configuration_number_validator_range_second_element_smaller_than_first.json
index 6fc33416b..909f322ab 100644
--- a/tests/unit/testdata/invalid_config_configuration_number_validator_range_second_element_smaller_than_first.json
+++ b/tests/unit/testdata/invalid_config_configuration_number_validator_range_second_element_smaller_than_first.json
@@ -14,10 +14,6 @@
                             {
                                 "label": "Name",
                                 "field": "name"
-                            },
-                            {
-                                "label": "Auth Type",
-                                "field": "auth_type"
                             }
                         ]
                     },
@@ -77,10 +73,10 @@
         }
     },
     "meta": {
-        "apiVersion": "3.2.0",
         "name": "Splunk_TA_UCCExample",
         "restRoot": "splunk_ta_uccexample",
         "version": "1.0.0",
-        "displayName": "Splunk UCC test Add-on"
+        "displayName": "Splunk UCC test Add-on",
+        "schemaVersion": "0.0.3"
     }
 }
diff --git a/tests/unit/testdata/invalid_config_configuration_number_validator_range_should_have_2_elements.json b/tests/unit/testdata/invalid_config_configuration_number_validator_range_should_have_2_elements.json
index 2f6395685..0f425483a 100644
--- a/tests/unit/testdata/invalid_config_configuration_number_validator_range_should_have_2_elements.json
+++ b/tests/unit/testdata/invalid_config_configuration_number_validator_range_should_have_2_elements.json
@@ -14,10 +14,6 @@
                             {
                                 "label": "Name",
                                 "field": "name"
-                            },
-                            {
-                                "label": "Auth Type",
-                                "field": "auth_type"
                             }
                         ]
                     },
@@ -78,10 +74,10 @@
         }
     },
     "meta": {
-        "apiVersion": "3.2.0",
         "name": "Splunk_TA_UCCExample",
         "restRoot": "splunk_ta_uccexample",
         "version": "1.0.0",
-        "displayName": "Splunk UCC test Add-on"
+        "displayName": "Splunk UCC test Add-on",
+        "schemaVersion": "0.0.3"
     }
 }
diff --git a/tests/unit/testdata/invalid_config_configuration_regex_validator_non_compilable_pattern.json b/tests/unit/testdata/invalid_config_configuration_regex_validator_non_compilable_pattern.json
index 972a2feae..c5193e366 100644
--- a/tests/unit/testdata/invalid_config_configuration_regex_validator_non_compilable_pattern.json
+++ b/tests/unit/testdata/invalid_config_configuration_regex_validator_non_compilable_pattern.json
@@ -14,10 +14,6 @@
                             {
                                 "label": "Name",
                                 "field": "name"
-                            },
-                            {
-                                "label": "Auth Type",
-                                "field": "auth_type"
                             }
                         ]
                     },
@@ -54,10 +50,10 @@
         }
     },
     "meta": {
-        "apiVersion": "3.2.0",
         "name": "Splunk_TA_UCCExample",
         "restRoot": "splunk_ta_uccexample",
         "version": "1.0.0",
-        "displayName": "Splunk UCC test Add-on"
+        "displayName": "Splunk UCC test Add-on",
+        "schemaVersion": "0.0.3"
     }
 }
diff --git a/tests/unit/testdata/invalid_config_configuration_string_validator_maxLength_less_than_minLength.json b/tests/unit/testdata/invalid_config_configuration_string_validator_maxLength_less_than_minLength.json
index 1ff451307..b8eb70d05 100644
--- a/tests/unit/testdata/invalid_config_configuration_string_validator_maxLength_less_than_minLength.json
+++ b/tests/unit/testdata/invalid_config_configuration_string_validator_maxLength_less_than_minLength.json
@@ -14,10 +14,6 @@
                             {
                                 "label": "Name",
                                 "field": "name"
-                            },
-                            {
-                                "label": "Auth Type",
-                                "field": "auth_type"
                             }
                         ]
                     },
@@ -54,10 +50,10 @@
         }
     },
     "meta": {
-        "apiVersion": "3.2.0",
         "name": "Splunk_TA_UCCExample",
         "restRoot": "splunk_ta_uccexample",
         "version": "1.0.0",
-        "displayName": "Splunk UCC test Add-on"
+        "displayName": "Splunk UCC test Add-on",
+        "schemaVersion": "0.0.3"
     }
 }
diff --git a/tests/unit/testdata/invalid_config_configuration_tabs_duplicates.json b/tests/unit/testdata/invalid_config_configuration_tabs_duplicates.json
index 38ca0127b..e8ad1d57a 100644
--- a/tests/unit/testdata/invalid_config_configuration_tabs_duplicates.json
+++ b/tests/unit/testdata/invalid_config_configuration_tabs_duplicates.json
@@ -82,10 +82,10 @@
         }
     },
     "meta": {
-        "apiVersion": "3.2.0",
         "name": "Splunk_TA_UCCExample",
         "restRoot": "splunk_ta_uccexample",
         "version": "1.0.0",
-        "displayName": "Splunk UCC test Add-on"
+        "displayName": "Splunk UCC test Add-on",
+        "schemaVersion": "0.0.3"
     }
 }
diff --git a/tests/unit/testdata/invalid_config_inputs_autoCompleteFields_duplicates.json b/tests/unit/testdata/invalid_config_inputs_autoCompleteFields_duplicates.json
index 4a0644e01..c08b81a83 100644
--- a/tests/unit/testdata/invalid_config_inputs_autoCompleteFields_duplicates.json
+++ b/tests/unit/testdata/invalid_config_inputs_autoCompleteFields_duplicates.json
@@ -154,10 +154,10 @@
         }
     },
     "meta": {
-        "apiVersion": "3.2.0",
         "name": "Splunk_TA_UCCExample",
         "restRoot": "splunk_ta_uccexample",
         "version": "1.0.0",
-        "displayName": "Splunk UCC test Add-on"
+        "displayName": "Splunk UCC test Add-on",
+        "schemaVersion": "0.0.3"
     }
 }
diff --git a/tests/unit/testdata/invalid_config_inputs_children_duplicates.json b/tests/unit/testdata/invalid_config_inputs_children_duplicates.json
index e81ac0609..ced45acd8 100644
--- a/tests/unit/testdata/invalid_config_inputs_children_duplicates.json
+++ b/tests/unit/testdata/invalid_config_inputs_children_duplicates.json
@@ -104,78 +104,22 @@
                     {
                         "label": "Name",
                         "field": "name"
-                    },
-                    {
-                        "label": "Account Name",
-                        "field": "account"
-                    },
-                    {
-                        "label": "Interval",
-                        "field": "interval"
-                    },
-                    {
-                        "label": "Index",
-                        "field": "index"
-                    },
-                    {
-                        "label": "Status",
-                        "field": "disabled"
                     }
                 ],
                 "moreInfo": [
                     {
                         "label": "Name",
                         "field": "name"
-                    },
-                    {
-                        "label": "Interval",
-                        "field": "interval"
-                    },
-                    {
-                        "label": "Index",
-                        "field": "index"
-                    },
-                    {
-                        "label": "Status",
-                        "field": "disabled",
-                        "mapping": {
-                            "true": "Disabled",
-                            "false": "Enabled"
-                        }
-                    },
-                    {
-                        "label": "Example Account",
-                        "field": "account"
-                    },
-                    {
-                        "label": "Object",
-                        "field": "object"
-                    },
-                    {
-                        "label": "Object Fields",
-                        "field": "object_fields"
-                    },
-                    {
-                        "label": "Order By",
-                        "field": "order_by"
-                    },
-                    {
-                        "label": "Query Start Date",
-                        "field": "start_date"
-                    },
-                    {
-                        "label": "Limit",
-                        "field": "limit"
                     }
                 ]
             }
         }
     },
     "meta": {
-        "apiVersion": "3.2.0",
         "name": "Splunk_TA_UCCExample",
         "restRoot": "splunk_ta_uccexample",
         "version": "1.0.0",
-        "displayName": "Splunk UCC test Add-on"
+        "displayName": "Splunk UCC test Add-on",
+        "schemaVersion": "0.0.3"
     }
 }
diff --git a/tests/unit/testdata/invalid_config_inputs_entity_duplicates.json b/tests/unit/testdata/invalid_config_inputs_entity_duplicates.json
index 4b406710d..446bca8a4 100644
--- a/tests/unit/testdata/invalid_config_inputs_entity_duplicates.json
+++ b/tests/unit/testdata/invalid_config_inputs_entity_duplicates.json
@@ -94,178 +94,22 @@
                     {
                         "label": "Name",
                         "field": "name"
-                    },
-                    {
-                        "label": "Account Name",
-                        "field": "account"
-                    },
-                    {
-                        "label": "Interval",
-                        "field": "interval"
-                    },
-                    {
-                        "label": "Index",
-                        "field": "index"
-                    },
-                    {
-                        "label": "Status",
-                        "field": "disabled"
                     }
                 ],
                 "moreInfo": [
                     {
                         "label": "Name",
                         "field": "name"
-                    },
-                    {
-                        "label": "Interval",
-                        "field": "interval"
-                    },
-                    {
-                        "label": "Index",
-                        "field": "index"
-                    },
-                    {
-                        "label": "Status",
-                        "field": "disabled",
-                        "mapping": {
-                            "true": "Disabled",
-                            "false": "Enabled"
-                        }
-                    },
-                    {
-                        "label": "Example Account",
-                        "field": "account"
-                    },
-                    {
-                        "label": "Object",
-                        "field": "object"
-                    },
-                    {
-                        "label": "Object Fields",
-                        "field": "object_fields"
-                    },
-                    {
-                        "label": "Order By",
-                        "field": "order_by"
-                    },
-                    {
-                        "label": "Query Start Date",
-                        "field": "start_date"
-                    },
-                    {
-                        "label": "Limit",
-                        "field": "limit"
                     }
                 ]
             }
         }
     },
-    "alerts": [
-        {
-            "name": "test_alert",
-            "label": "Test Alert",
-            "description": "Description for test Alert Action",
-            "activeResponse": {
-                "task": [
-                    "Create",
-                    "Update"
-                ],
-                "supportsAdhoc": true,
-                "subject": [
-                    "endpoint"
-                ],
-                "category": [
-                    "Information Conveyance",
-                    "Information Portrayal"
-                ],
-                "technology": [
-                    {
-                        "version": [
-                            "1.0.0"
-                        ],
-                        "product": "Test Incident Update",
-                        "vendor": "Splunk"
-                    }
-                ],
-                "drilldownUri": "search?q=search%20index%3D\"_internal\"&earliest=0&latest=",
-                "sourcetype": "test:incident"
-            },
-            "entity": [
-                {
-                    "type": "text",
-                    "label": "Name",
-                    "field": "name",
-                    "defaultValue": "xyz",
-                    "required": true,
-                    "help": "Please enter your name"
-                },
-                {
-                    "type": "checkbox",
-                    "label": "All Incidents",
-                    "field": "all_incidents",
-                    "defaultValue": 0,
-                    "required": false,
-                    "help": "Tick if you want to update all incidents/problems"
-                },
-                {
-                    "type": "singleSelect",
-                    "label": "Table List",
-                    "field": "table_list",
-                    "options": {
-                        "items": [
-                            {
-                                "value": "Incident",
-                                "label": "incident"
-                            },
-                            {
-                                "value": "Problem",
-                                "label": "problem"
-                            }
-                        ]
-                    },
-                    "help": "Please select the table",
-                    "required": false,
-                    "defaultValue": "problem"
-                },
-                {
-                    "type": "radio",
-                    "label": "Action:",
-                    "field": "action",
-                    "options": {
-                        "items": [
-                            {
-                                "value": "Update",
-                                "label": "update"
-                            },
-                            {
-                                "value": "Delete",
-                                "label": "delete"
-                            }
-                        ]
-                    },
-                    "help": "Select the action you want to perform",
-                    "required": true,
-                    "defaultValue": "two"
-                },
-                {
-                    "type": "singleSelectSplunkSearch",
-                    "label": "Select Account",
-                    "field": "account",
-                    "search": "| rest /servicesNS/nobody/TA-SNOW/admin/TA_SNOW_account | dedup title",
-                    "valueField": "title",
-                    "labelField": "title",
-                    "help": "Select the account from the dropdown",
-                    "required": true
-                }
-            ]
-        }
-    ],
     "meta": {
-        "apiVersion": "3.2.0",
         "name": "Splunk_TA_UCCExample",
         "restRoot": "splunk_ta_uccexample",
         "version": "1.0.0",
-        "displayName": "Splunk UCC test Add-on"
+        "displayName": "Splunk UCC test Add-on",
+        "schemaVersion": "0.0.3"
     }
 }
diff --git a/tests/unit/testdata/invalid_config_inputs_multilevel_menu_duplicate_groups.json b/tests/unit/testdata/invalid_config_inputs_multilevel_menu_duplicate_groups.json
index 6e8ecf2aa..fdd2e1028 100644
--- a/tests/unit/testdata/invalid_config_inputs_multilevel_menu_duplicate_groups.json
+++ b/tests/unit/testdata/invalid_config_inputs_multilevel_menu_duplicate_groups.json
@@ -114,68 +114,12 @@
                     {
                         "label": "Name",
                         "field": "name"
-                    },
-                    {
-                        "label": "Account Name",
-                        "field": "account"
-                    },
-                    {
-                        "label": "Interval",
-                        "field": "interval"
-                    },
-                    {
-                        "label": "Index",
-                        "field": "index"
-                    },
-                    {
-                        "label": "Status",
-                        "field": "disabled"
                     }
                 ],
                 "moreInfo": [
                     {
                         "label": "Name",
                         "field": "name"
-                    },
-                    {
-                        "label": "Interval",
-                        "field": "interval"
-                    },
-                    {
-                        "label": "Index",
-                        "field": "index"
-                    },
-                    {
-                        "label": "Status",
-                        "field": "disabled",
-                        "mapping": {
-                            "true": "Disabled",
-                            "false": "Enabled"
-                        }
-                    },
-                    {
-                        "label": "Example Account",
-                        "field": "account"
-                    },
-                    {
-                        "label": "Object",
-                        "field": "object"
-                    },
-                    {
-                        "label": "Object Fields",
-                        "field": "object_fields"
-                    },
-                    {
-                        "label": "Order By",
-                        "field": "order_by"
-                    },
-                    {
-                        "label": "Query Start Date",
-                        "field": "start_date"
-                    },
-                    {
-                        "label": "Limit",
-                        "field": "limit"
                     }
                 ]
             },
@@ -195,10 +139,10 @@
         }
     },
     "meta": {
-        "apiVersion": "3.2.0",
         "name": "Splunk_TA_UCCExample",
         "restRoot": "splunk_ta_uccexample",
         "version": "1.0.0",
-        "displayName": "Splunk UCC test Add-on"
+        "displayName": "Splunk UCC test Add-on",
+        "schemaVersion": "0.0.3"
     }
 }
diff --git a/tests/unit/testdata/invalid_config_inputs_multilevel_menu_invalid_groupname_or_grouptitle.json b/tests/unit/testdata/invalid_config_inputs_multilevel_menu_invalid_groupname_or_grouptitle.json
index ab324c6c5..c90534bcf 100644
--- a/tests/unit/testdata/invalid_config_inputs_multilevel_menu_invalid_groupname_or_grouptitle.json
+++ b/tests/unit/testdata/invalid_config_inputs_multilevel_menu_invalid_groupname_or_grouptitle.json
@@ -114,68 +114,12 @@
                     {
                         "label": "Name",
                         "field": "name"
-                    },
-                    {
-                        "label": "Account Name",
-                        "field": "account"
-                    },
-                    {
-                        "label": "Interval",
-                        "field": "interval"
-                    },
-                    {
-                        "label": "Index",
-                        "field": "index"
-                    },
-                    {
-                        "label": "Status",
-                        "field": "disabled"
                     }
                 ],
                 "moreInfo": [
                     {
                         "label": "Name",
                         "field": "name"
-                    },
-                    {
-                        "label": "Interval",
-                        "field": "interval"
-                    },
-                    {
-                        "label": "Index",
-                        "field": "index"
-                    },
-                    {
-                        "label": "Status",
-                        "field": "disabled",
-                        "mapping": {
-                            "true": "Disabled",
-                            "false": "Enabled"
-                        }
-                    },
-                    {
-                        "label": "Example Account",
-                        "field": "account"
-                    },
-                    {
-                        "label": "Object",
-                        "field": "object"
-                    },
-                    {
-                        "label": "Object Fields",
-                        "field": "object_fields"
-                    },
-                    {
-                        "label": "Order By",
-                        "field": "order_by"
-                    },
-                    {
-                        "label": "Query Start Date",
-                        "field": "start_date"
-                    },
-                    {
-                        "label": "Limit",
-                        "field": "limit"
                     }
                 ]
             },
@@ -194,10 +138,10 @@
         }
     },
     "meta": {
-        "apiVersion": "3.2.0",
         "name": "Splunk_TA_UCCExample",
         "restRoot": "splunk_ta_uccexample",
         "version": "1.0.0",
-        "displayName": "Splunk UCC test Add-on"
+        "displayName": "Splunk UCC test Add-on",
+        "schemaVersion": "0.0.3"
     }
 }
diff --git a/tests/unit/testdata/invalid_config_inputs_multilevel_menu_invalid_groupservices.json b/tests/unit/testdata/invalid_config_inputs_multilevel_menu_invalid_groupservices.json
index d0a662902..3d5cbe13e 100644
--- a/tests/unit/testdata/invalid_config_inputs_multilevel_menu_invalid_groupservices.json
+++ b/tests/unit/testdata/invalid_config_inputs_multilevel_menu_invalid_groupservices.json
@@ -114,68 +114,12 @@
                     {
                         "label": "Name",
                         "field": "name"
-                    },
-                    {
-                        "label": "Account Name",
-                        "field": "account"
-                    },
-                    {
-                        "label": "Interval",
-                        "field": "interval"
-                    },
-                    {
-                        "label": "Index",
-                        "field": "index"
-                    },
-                    {
-                        "label": "Status",
-                        "field": "disabled"
                     }
                 ],
                 "moreInfo": [
                     {
                         "label": "Name",
                         "field": "name"
-                    },
-                    {
-                        "label": "Interval",
-                        "field": "interval"
-                    },
-                    {
-                        "label": "Index",
-                        "field": "index"
-                    },
-                    {
-                        "label": "Status",
-                        "field": "disabled",
-                        "mapping": {
-                            "true": "Disabled",
-                            "false": "Enabled"
-                        }
-                    },
-                    {
-                        "label": "Example Account",
-                        "field": "account"
-                    },
-                    {
-                        "label": "Object",
-                        "field": "object"
-                    },
-                    {
-                        "label": "Object Fields",
-                        "field": "object_fields"
-                    },
-                    {
-                        "label": "Order By",
-                        "field": "order_by"
-                    },
-                    {
-                        "label": "Query Start Date",
-                        "field": "start_date"
-                    },
-                    {
-                        "label": "Limit",
-                        "field": "limit"
                     }
                 ]
             },
@@ -190,10 +134,10 @@
         }
     },
     "meta": {
-        "apiVersion": "3.2.0",
         "name": "Splunk_TA_UCCExample",
         "restRoot": "splunk_ta_uccexample",
         "version": "1.0.0",
-        "displayName": "Splunk UCC test Add-on"
+        "displayName": "Splunk UCC test Add-on",
+        "schemaVersion": "0.0.3"
     }
 }
diff --git a/tests/unit/testdata/invalid_config_inputs_number_validator_range_second_element_smaller_than_first.json b/tests/unit/testdata/invalid_config_inputs_number_validator_range_second_element_smaller_than_first.json
index de6535fc0..13c99020f 100644
--- a/tests/unit/testdata/invalid_config_inputs_number_validator_range_second_element_smaller_than_first.json
+++ b/tests/unit/testdata/invalid_config_inputs_number_validator_range_second_element_smaller_than_first.json
@@ -123,10 +123,10 @@
         }
     },
     "meta": {
-        "apiVersion": "3.2.0",
         "name": "Splunk_TA_UCCExample",
         "restRoot": "splunk_ta_uccexample",
         "version": "1.0.0",
-        "displayName": "Splunk UCC test Add-on"
+        "displayName": "Splunk UCC test Add-on",
+        "schemaVersion": "0.0.3"
     }
 }
diff --git a/tests/unit/testdata/invalid_config_inputs_number_validator_range_should_have_2_elements.json b/tests/unit/testdata/invalid_config_inputs_number_validator_range_should_have_2_elements.json
index d8f3279f1..d66e20fdb 100644
--- a/tests/unit/testdata/invalid_config_inputs_number_validator_range_should_have_2_elements.json
+++ b/tests/unit/testdata/invalid_config_inputs_number_validator_range_should_have_2_elements.json
@@ -124,10 +124,10 @@
         }
     },
     "meta": {
-        "apiVersion": "3.2.0",
         "name": "Splunk_TA_UCCExample",
         "restRoot": "splunk_ta_uccexample",
         "version": "1.0.0",
-        "displayName": "Splunk UCC test Add-on"
+        "displayName": "Splunk UCC test Add-on",
+        "schemaVersion": "0.0.3"
     }
 }
diff --git a/tests/unit/testdata/invalid_config_inputs_regex_validator_non_compilable_pattern.json b/tests/unit/testdata/invalid_config_inputs_regex_validator_non_compilable_pattern.json
index 243b2ce00..638c2ffe5 100644
--- a/tests/unit/testdata/invalid_config_inputs_regex_validator_non_compilable_pattern.json
+++ b/tests/unit/testdata/invalid_config_inputs_regex_validator_non_compilable_pattern.json
@@ -14,10 +14,6 @@
                             {
                                 "label": "Name",
                                 "field": "name"
-                            },
-                            {
-                                "label": "Auth Type",
-                                "field": "auth_type"
                             }
                         ]
                     },
@@ -106,10 +102,10 @@
         }
     },
     "meta": {
-        "apiVersion": "3.2.0",
         "name": "Splunk_TA_UCCExample",
         "restRoot": "splunk_ta_uccexample",
         "version": "1.0.0",
-        "displayName": "Splunk UCC test Add-on"
+        "displayName": "Splunk UCC test Add-on",
+        "schemaVersion": "0.0.3"
     }
 }
diff --git a/tests/unit/testdata/invalid_config_inputs_services_duplicates.json b/tests/unit/testdata/invalid_config_inputs_services_duplicates.json
index ab5bff5ef..46686d023 100644
--- a/tests/unit/testdata/invalid_config_inputs_services_duplicates.json
+++ b/tests/unit/testdata/invalid_config_inputs_services_duplicates.json
@@ -70,237 +70,6 @@
                             "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"
-                        },
-                        {
-                            "type": "radio",
-                            "label": "Example Radio",
-                            "field": "input_one_radio",
-                            "defaultValue": "yes",
-                            "help": "This is an example radio button for the input one entity",
-                            "required": false,
-                            "options": {
-                                "items": [{
-                                        "value": "yes",
-                                        "label": "Yes"
-                                    },
-                                    {
-                                        "value": "no",
-                                        "label": "No"
-                                    }
-                                ],
-                                "display": true
-                            }
-                        },
-                        {
-                            "field": "singleSelectTest",
-                            "label": "Single Select Group Test",
-                            "type": "singleSelect",
-                            "options": {
-                                "createSearchChoice": true,
-                                "autoCompleteFields": [
-                                    {
-                                        "label": "Group1",
-                                        "children": [
-                                            {
-                                                "value": "one",
-                                                "label": "One"
-                                            },
-                                            {
-                                                "value": "two",
-                                                "label": "Two"
-                                            }
-                                        ]
-                                    },
-                                    {
-                                        "label": "Group2",
-                                        "children": [
-                                            {
-                                                "value": "three",
-                                                "label": "Three"
-                                            },
-                                            {
-                                                "value": "four",
-                                                "label": "Four"
-                                            }
-                                        ]
-                                    }
-                                ]
-                            }
-                        },
-                        {
-                            "field": "multipleSelectTest",
-                            "label": "Multiple Select Test",
-                            "type": "multipleSelect",
-                            "options": {
-                                "delimiter": "|",
-                                "items": [
-                                    {
-                                        "value": "a",
-                                        "label": "A"
-                                    },
-                                    {
-                                        "value": "b",
-                                        "label": "B"
-                                    }
-                                ]
-                            }
-                        },
-                        {
-                            "type": "text",
-                            "label": "Interval",
-                            "validators": [
-                                {
-                                    "type": "regex",
-                                    "errorMsg": "Interval must be an integer.",
-                                    "pattern": "^\\-[1-9]\\d*$|^\\d*$"
-                                }
-                            ],
-                            "field": "interval",
-                            "help": "Time interval of the data input, in seconds.",
-                            "required": true
-                        },
-                        {
-                            "type": "singleSelect",
-                            "label": "Index",
-                            "validators": [
-                                {
-                                    "type": "string",
-                                    "errorMsg": "Length of index name should be between 1 and 80.",
-                                    "minLength": 1,
-                                    "maxLength": 80
-                                }
-                            ],
-                            "defaultValue": "default",
-                            "options": {
-                                "endpointUrl": "data/indexes",
-                                "denyList": "^_.*$",
-                                "createSearchChoice": true
-                            },
-                            "field": "index",
-                            "required": true
-                        },
-                        {
-                            "type": "singleSelect",
-                            "label": "Example Account",
-                            "options": {
-                                "referenceName": "account"
-                            },
-                            "help": "",
-                            "field": "account",
-                            "required": true
-                        },
-                        {
-                            "type": "text",
-                            "label": "Object",
-                            "validators": [
-                                {
-                                    "type": "string",
-                                    "errorMsg": "Max length of text input is 8192",
-                                    "minLength": 0,
-                                    "maxLength": 8192
-                                }
-                            ],
-                            "field": "object",
-                            "help": "The name of the object to query for.",
-                            "required": true
-                        },
-                        {
-                            "type": "text",
-                            "label": "Object Fields",
-                            "validators": [
-                                {
-                                    "type": "string",
-                                    "errorMsg": "Max length of text input is 8192",
-                                    "minLength": 0,
-                                    "maxLength": 8192
-                                }
-                            ],
-                            "field": "object_fields",
-                            "help": "Object fields from which to collect data. Delimit multiple fields using a comma.",
-                            "required": true
-                        },
-                        {
-                            "type": "text",
-                            "label": "Order By",
-                            "validators": [
-                                {
-                                    "type": "string",
-                                    "errorMsg": "Max length of text input is 8192",
-                                    "minLength": 0,
-                                    "maxLength": 8192
-                                }
-                            ],
-                            "defaultValue": "LastModifiedDate",
-                            "field": "order_by",
-                            "help": "The datetime field by which to query results in ascending order for indexing.",
-                            "required": true
-                        },
-                        {
-                            "type": "radio",
-                            "label": "Use existing data input?",
-                            "field": "use_existing_checkpoint",
-                            "defaultValue": "yes",
-                            "help": "Data input already exists. Select `No` if you want to reset the data collection.",
-                            "required": false,
-                            "options": {
-                                "items": [
-                                    {
-                                        "value": "yes",
-                                        "label": "Yes"
-                                    },
-                                    {
-                                        "value": "no",
-                                        "label": "No"
-                                    }
-                                ],
-                                "display": false
-                            }
-                        },
-                        {
-                            "type": "text",
-                            "label": "Query Start Date",
-                            "validators": [
-                                {
-                                    "type": "regex",
-                                    "errorMsg": "Invalid date and time format",
-                                    "pattern": "^(\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}.\\d{3}z)?$"
-                                }
-                            ],
-                            "field": "start_date",
-                            "help": "The datetime after which to query and index records, in this format: \"YYYY-MM-DDThh:mm:ss.000z\".\nDefaults to 90 days earlier from now.",
-                            "tooltip": "Changing this parameter may result in gaps or duplication in data collection.",
-                            "required": false
-                        },
-                        {
-                            "type": "text",
-                            "label": "Limit",
-                            "validators": [
-                                {
-                                    "type": "string",
-                                    "errorMsg": "Max length of text input is 8192",
-                                    "minLength": 0,
-                                    "maxLength": 8192
-                                }
-                            ],
-                            "defaultValue": "1000",
-                            "field": "limit",
-                            "help": "The maximum number of results returned by the query.",
-                            "required": false
-                        },
-                        {
-                            "field": "example_help_link",
-                            "label": "",
-                            "type": "helpLink",
-                            "options": {
-                                "text": "Help Link",
-                                "link": "https://docs.splunk.com/Documentation"
-                            }
                         }
                     ],
                     "title": "Example Input One"
@@ -327,139 +96,6 @@
                             "field": "name",
                             "help": "A unique name for the data input.",
                             "required": true
-                        },
-                        {
-                            "type": "text",
-                            "label": "Interval",
-                            "validators": [
-                                {
-                                    "type": "regex",
-                                    "errorMsg": "Interval must be an integer.",
-                                    "pattern": "^\\-[1-9]\\d*$|^\\d*$"
-                                }
-                            ],
-                            "field": "interval",
-                            "help": "Time interval of the data input, in seconds .",
-                            "required": true
-                        },
-                        {
-                            "type": "singleSelect",
-                            "label": "Index",
-                            "validators": [
-                                {
-                                    "type": "string",
-                                    "errorMsg": "Length of index name should be between 1 and 80.",
-                                    "minLength": 1,
-                                    "maxLength": 80
-                                }
-                            ],
-                            "defaultValue": "default",
-                            "options": {
-                                "endpointUrl": "data/indexes",
-                                "denyList": "^_.*$",
-                                "createSearchChoice": true
-                            },
-                            "field": "index",
-                            "required": true
-                        },
-                        {
-                            "type": "singleSelect",
-                            "label": "Example Account",
-                            "options": {
-                                "referenceName": "account"
-                            },
-                            "help": "",
-                            "field": "account",
-                            "required": true
-                        },
-                        {
-                            "type": "multipleSelect",
-                            "label": "Example Multiple Select",
-                            "field": "input_two_multiple_select",
-                            "help": "This is an example multipleSelect for input two entity",
-                            "required": true,
-                            "options": {
-                                "items": [{
-                                        "value": "one",
-                                        "label": "Option One"
-                                    },
-                                    {
-                                        "value": "two",
-                                        "label": "Option Two"
-                                    }
-                                ]
-                            }
-                        },
-                        {
-                            "type": "checkbox",
-                            "label": "Example Checkbox",
-                            "field": "input_two_checkbox",
-                            "help": "This is an example checkbox for the input two entity"
-                        },
-                        {
-                            "type": "radio",
-                            "label": "Example Radio",
-                            "field": "input_two_radio",
-                            "defaultValue": "yes",
-                            "help": "This is an example radio button for the input two entity",
-                            "required": false,
-                            "options": {
-                                "items": [{
-                                        "value": "yes",
-                                        "label": "Yes"
-                                    },
-                                    {
-                                        "value": "no",
-                                        "label": "No"
-                                    }
-                                ],
-                                "display": true
-                            }
-                        },
-                        {
-                            "type": "radio",
-                            "label": "Use existing data input?",
-                            "field": "use_existing_checkpoint",
-                            "defaultValue": "yes",
-                            "help": "Data input already exists. Select `No` if you want to reset the data collection.",
-                            "required": false,
-                            "options": {
-                                "items": [
-                                    {
-                                        "value": "yes",
-                                        "label": "Yes"
-                                    },
-                                    {
-                                        "value": "no",
-                                        "label": "No"
-                                    }
-                                ],
-                                "display": false
-                            }
-                        },
-                        {
-                            "type": "text",
-                            "label": "Query Start Date",
-                            "validators": [
-                                {
-                                    "type": "regex",
-                                    "errorMsg": "Invalid date and time format",
-                                    "pattern": "^(\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}.\\d{3}z)?$"
-                                }
-                            ],
-                            "field": "start_date",
-                            "help": "The date and time, in \"YYYY-MM-DDThh:mm:ss.000z\" format, after which to query and index records. \nThe default is 90 days before today.",
-                            "tooltip": "Changing this parameter may result in gaps or duplication in data collection.",
-                            "required": false
-                        },
-                        {
-                            "field": "example_help_link",
-                            "label": "",
-                            "type": "helpLink",
-                            "options": {
-                                "text": "Help Link",
-                                "link": "https://docs.splunk.com/Documentation"
-                            }
                         }
                     ],
                     "title": "Example Input Two"
@@ -478,178 +114,22 @@
                     {
                         "label": "Name",
                         "field": "name"
-                    },
-                    {
-                        "label": "Account Name",
-                        "field": "account"
-                    },
-                    {
-                        "label": "Interval",
-                        "field": "interval"
-                    },
-                    {
-                        "label": "Index",
-                        "field": "index"
-                    },
-                    {
-                        "label": "Status",
-                        "field": "disabled"
                     }
                 ],
                 "moreInfo": [
                     {
                         "label": "Name",
                         "field": "name"
-                    },
-                    {
-                        "label": "Interval",
-                        "field": "interval"
-                    },
-                    {
-                        "label": "Index",
-                        "field": "index"
-                    },
-                    {
-                        "label": "Status",
-                        "field": "disabled",
-                        "mapping": {
-                            "true": "Disabled",
-                            "false": "Enabled"
-                        }
-                    },
-                    {
-                        "label": "Example Account",
-                        "field": "account"
-                    },
-                    {
-                        "label": "Object",
-                        "field": "object"
-                    },
-                    {
-                        "label": "Object Fields",
-                        "field": "object_fields"
-                    },
-                    {
-                        "label": "Order By",
-                        "field": "order_by"
-                    },
-                    {
-                        "label": "Query Start Date",
-                        "field": "start_date"
-                    },
-                    {
-                        "label": "Limit",
-                        "field": "limit"
                     }
                 ]
             }
         }
     },
-    "alerts": [
-        {
-            "name": "test_alert",
-            "label": "Test Alert",
-            "description": "Description for test Alert Action",
-            "activeResponse": {
-                "task": [
-                    "Create",
-                    "Update"
-                ],
-                "supportsAdhoc": true,
-                "subject": [
-                    "endpoint"
-                ],
-                "category": [
-                    "Information Conveyance",
-                    "Information Portrayal"
-                ],
-                "technology": [
-                    {
-                        "version": [
-                            "1.0.0"
-                        ],
-                        "product": "Test Incident Update",
-                        "vendor": "Splunk"
-                    }
-                ],
-                "drilldownUri": "search?q=search%20index%3D\"_internal\"&earliest=0&latest=",
-                "sourcetype": "test:incident"
-            },
-            "entity": [
-                {
-                    "type": "text",
-                    "label": "Name",
-                    "field": "name",
-                    "defaultValue": "xyz",
-                    "required": true,
-                    "help": "Please enter your name"
-                },
-                {
-                    "type": "checkbox",
-                    "label": "All Incidents",
-                    "field": "all_incidents",
-                    "defaultValue": 0,
-                    "required": false,
-                    "help": "Tick if you want to update all incidents/problems"
-                },
-                {
-                    "type": "singleSelect",
-                    "label": "Table List",
-                    "field": "table_list",
-                    "options": {
-                        "items": [
-                            {
-                                "value": "Incident",
-                                "label": "incident"
-                            },
-                            {
-                                "value": "Problem",
-                                "label": "problem"
-                            }
-                        ]
-                    },
-                    "help": "Please select the table",
-                    "required": false,
-                    "defaultValue": "problem"
-                },
-                {
-                    "type": "radio",
-                    "label": "Action:",
-                    "field": "action",
-                    "options": {
-                        "items": [
-                            {
-                                "value": "Update",
-                                "label": "update"
-                            },
-                            {
-                                "value": "Delete",
-                                "label": "delete"
-                            }
-                        ]
-                    },
-                    "help": "Select the action you want to perform",
-                    "required": true,
-                    "defaultValue": "two"
-                },
-                {
-                    "type": "singleSelectSplunkSearch",
-                    "label": "Select Account",
-                    "field": "account",
-                    "search": "| rest /servicesNS/nobody/TA-SNOW/admin/TA_SNOW_account | dedup title",
-                    "valueField": "title",
-                    "labelField": "title",
-                    "help": "Select the account from the dropdown",
-                    "required": true
-                }
-            ]
-        }
-    ],
     "meta": {
-        "apiVersion": "3.2.0",
         "name": "Splunk_TA_UCCExample",
         "restRoot": "splunk_ta_uccexample",
         "version": "1.0.0",
-        "displayName": "Splunk UCC test Add-on"
+        "displayName": "Splunk UCC test Add-on",
+        "schemaVersion": "0.0.3"
     }
 }
diff --git a/tests/unit/testdata/invalid_config_inputs_string_validator_maxLength_less_than_minLength.json b/tests/unit/testdata/invalid_config_inputs_string_validator_maxLength_less_than_minLength.json
index add81da9c..94673fb34 100644
--- a/tests/unit/testdata/invalid_config_inputs_string_validator_maxLength_less_than_minLength.json
+++ b/tests/unit/testdata/invalid_config_inputs_string_validator_maxLength_less_than_minLength.json
@@ -14,10 +14,6 @@
                             {
                                 "label": "Name",
                                 "field": "name"
-                            },
-                            {
-                                "label": "Auth Type",
-                                "field": "auth_type"
                             }
                         ]
                     },
@@ -106,10 +102,10 @@
         }
     },
     "meta": {
-        "apiVersion": "3.2.0",
         "name": "Splunk_TA_UCCExample",
         "restRoot": "splunk_ta_uccexample",
         "version": "1.0.0",
-        "displayName": "Splunk UCC test Add-on"
+        "displayName": "Splunk UCC test Add-on",
+        "schemaVersion": "0.0.3"
     }
 }
diff --git a/tests/unit/testdata/invalid_config_json_is_missing_in_supported_file_types.json b/tests/unit/testdata/invalid_config_json_is_missing_in_supported_file_types.json
deleted file mode 100644
index 7c41f5969..000000000
--- a/tests/unit/testdata/invalid_config_json_is_missing_in_supported_file_types.json
+++ /dev/null
@@ -1,236 +0,0 @@
-{
-    "pages": {
-        "configuration": {
-            "tabs": [
-                {
-                    "name": "account",
-                    "table": {
-                        "actions": [
-                            "edit",
-                            "delete",
-                            "clone"
-                        ],
-                        "header": [
-                            {
-                                "label": "Name",
-                                "field": "name"
-                            },
-                            {
-                                "label": "Auth Type",
-                                "field": "auth_type"
-                            }
-                        ]
-                    },
-                    "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*$"
-                                }
-                            ],
-                            "options": {
-                                "placeholder": "Required"
-                            },
-                            "field": "name",
-                            "help": "Enter a unique name for this account.",
-                            "required": true
-                        },
-                        {
-                            "type": "singleSelect",
-                            "label": "Example Environment",
-                            "options": {
-                                "disableSearch": true,
-                                "autoCompleteFields": [
-                                    {
-                                        "value": "login.example.com",
-                                        "label": "Value1"
-                                    },
-                                    {
-                                        "value": "test.example.com",
-                                        "label": "Value2"
-                                    },
-                                    {
-                                        "value": "other",
-                                        "label": "Other"
-                                    }
-                                ],
-                                "display": true
-                            },
-                            "help": "",
-                            "field": "custom_endpoint",
-                            "defaultValue": "login.example.com",
-                            "required": true
-                        },
-                        {
-                            "type": "text",
-                            "label": "Endpoint URL",
-                            "help": "Enter the endpoint URL.",
-                            "field": "endpoint",
-                            "options": {
-                                "display": false
-                            }
-                        },
-                        {
-                            "type": "checkbox",
-                            "label": "Example Checkbox",
-                            "field": "account_checkbox",
-                            "help": "This is an example checkbox for the account entity"
-                        },
-                        {
-                            "type": "radio",
-                            "label": "Example Radio",
-                            "field": "account_radio",
-                            "defaultValue": "yes",
-                            "help": "This is an example radio button for the account entity",
-                            "required": true,
-                            "options": {
-                                "items": [{
-                                        "value": "yes",
-                                        "label": "Yes"
-                                    },
-                                    {
-                                        "value": "no",
-                                        "label": "No"
-                                    }
-                                ],
-                                "display": true
-                            }
-                        },
-                        {
-                            "type": "multipleSelect",
-                            "label": "Example Multiple Select",
-                            "field": "account_multiple_select",
-                            "help": "This is an example multipleSelect for account entity",
-                            "required": true,
-                            "options": {
-                                "items": [{
-                                        "value": "one",
-                                        "label": "Option One"
-                                    },
-                                    {
-                                        "value": "two",
-                                        "label": "Option Two"
-                                    }
-                                ]
-                            }
-                        },
-                        {
-                            "type": "text",
-                            "label": "State",
-                            "help": "This is a boolean field for developers to decide whether state parameter will be passed in the OAuth flow. Value: true|false",
-                            "field": "oauth_state_enabled",
-                            "options": {
-                                "display": false
-                            }
-                        },
-                        {
-                            "type": "oauth",
-                            "field": "oauth",
-                            "label": "Not used",
-                            "options": {
-                                "auth_type": [
-                                    "basic",
-                                    "oauth"
-                                ],
-                                "basic": [
-                                    {
-                                        "oauth_field": "username",
-                                        "label": "Username",
-                                        "help": "Enter the username for this account.",
-                                        "field": "username"
-                                    },
-                                    {
-                                        "oauth_field": "password",
-                                        "label": "Password",
-                                        "encrypted": true,
-                                        "help": "Enter the password for this account.",
-                                        "field": "password"
-                                    },
-                                    {
-                                        "oauth_field": "security_token",
-                                        "label": "Security Token",
-                                        "encrypted": true,
-                                        "help": "Enter the security token.",
-                                        "field": "token"
-                                    }
-                                ],
-                                "oauth": [
-                                    {
-                                        "oauth_field": "client_id",
-                                        "label": "Client Id",
-                                        "field": "client_id",
-                                        "help": "Enter the Client Id for this account."
-                                    },
-                                    {
-                                        "oauth_field": "client_secret",
-                                        "label": "Client Secret",
-                                        "field": "client_secret",
-                                        "encrypted": true,
-                                        "help": "Enter the Client Secret key for this account."
-                                    },
-                                    {
-                                        "oauth_field": "redirect_url",
-                                        "label": "Redirect url",
-                                        "field": "redirect_url",
-                                        "help": "Copy and paste this URL into your app."
-                                    }
-                                ],
-                                "auth_code_endpoint": "/services/oauth2/authorize",
-                                "access_token_endpoint": "/services/oauth2/token",
-                                "oauth_timeout": 30
-                            }
-                        },
-                        {
-                            "field": "example_help_link",
-                            "label": "",
-                            "type": "helpLink",
-                            "options": {
-                                "text": "Help Link",
-                                "link": "https://docs.splunk.com/Documentation"
-                            }
-                        },
-                        {
-                            "type": "file",
-                            "label": "Upload File",
-                            "help": "Upload service account's certificate",
-                            "field": "service_account",
-                            "options": {
-                                "fileSupportMessage": "Here is the support message"
-                            },
-                            "validators": [
-                                {
-                                    "type": "file",
-                                    "supportedFileTypes": [
-                                        "yaml"
-                                    ]
-                                }
-                            ],
-                            "encrypted": true,
-                            "required": true
-                        }
-                    ],
-                    "title": "Account"
-                }
-            ],
-            "title": "Configuration",
-            "description": "Set up your add-on"
-        }
-    },
-    "meta": {
-        "apiVersion": "3.2.0",
-        "name": "Splunk_TA_UCCExample",
-        "restRoot": "splunk_ta_uccexample",
-        "version": "1.0.0",
-        "displayName": "Splunk UCC test Add-on"
-    }
-}
diff --git a/tests/unit/testdata/invalid_config_no_configuration_tabs.json b/tests/unit/testdata/invalid_config_no_configuration_tabs.json
index 7ce1645ac..9245a6da8 100644
--- a/tests/unit/testdata/invalid_config_no_configuration_tabs.json
+++ b/tests/unit/testdata/invalid_config_no_configuration_tabs.json
@@ -32,399 +32,9 @@
                             "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"
-                        },
-                        {
-                            "type": "radio",
-                            "label": "Example Radio",
-                            "field": "input_one_radio",
-                            "defaultValue": "yes",
-                            "help": "This is an example radio button for the input one entity",
-                            "required": false,
-                            "options": {
-                                "items": [{
-                                        "value": "yes",
-                                        "label": "Yes"
-                                    },
-                                    {
-                                        "value": "no",
-                                        "label": "No"
-                                    }
-                                ],
-                                "display": true
-                            }
-                        },
-                        {
-                            "field": "singleSelectTest",
-                            "label": "Single Select Group Test",
-                            "type": "singleSelect",
-                            "options": {
-                                "createSearchChoice": true,
-                                "autoCompleteFields": [
-                                    {
-                                        "label": "Group1",
-                                        "children": [
-                                            {
-                                                "value": "one",
-                                                "label": "One"
-                                            },
-                                            {
-                                                "value": "two",
-                                                "label": "Two"
-                                            }
-                                        ]
-                                    },
-                                    {
-                                        "label": "Group2",
-                                        "children": [
-                                            {
-                                                "value": "three",
-                                                "label": "Three"
-                                            },
-                                            {
-                                                "value": "four",
-                                                "label": "Four"
-                                            }
-                                        ]
-                                    }
-                                ]
-                            }
-                        },
-                        {
-                            "field": "multipleSelectTest",
-                            "label": "Multiple Select Test",
-                            "type": "multipleSelect",
-                            "options": {
-                                "delimiter": "|",
-                                "items": [
-                                    {
-                                        "value": "a",
-                                        "label": "A"
-                                    },
-                                    {
-                                        "value": "b",
-                                        "label": "B"
-                                    }
-                                ]
-                            }
-                        },
-                        {
-                            "type": "text",
-                            "label": "Interval",
-                            "validators": [
-                                {
-                                    "type": "regex",
-                                    "errorMsg": "Interval must be an integer.",
-                                    "pattern": "^\\-[1-9]\\d*$|^\\d*$"
-                                }
-                            ],
-                            "field": "interval",
-                            "help": "Time interval of the data input, in seconds.",
-                            "required": true
-                        },
-                        {
-                            "type": "singleSelect",
-                            "label": "Index",
-                            "validators": [
-                                {
-                                    "type": "string",
-                                    "errorMsg": "Length of index name should be between 1 and 80.",
-                                    "minLength": 1,
-                                    "maxLength": 80
-                                }
-                            ],
-                            "defaultValue": "default",
-                            "options": {
-                                "endpointUrl": "data/indexes",
-                                "denyList": "^_.*$",
-                                "createSearchChoice": true
-                            },
-                            "field": "index",
-                            "required": true
-                        },
-                        {
-                            "type": "singleSelect",
-                            "label": "Example Account",
-                            "options": {
-                                "referenceName": "account"
-                            },
-                            "help": "",
-                            "field": "account",
-                            "required": true
-                        },
-                        {
-                            "type": "text",
-                            "label": "Object",
-                            "validators": [
-                                {
-                                    "type": "string",
-                                    "errorMsg": "Max length of text input is 8192",
-                                    "minLength": 0,
-                                    "maxLength": 8192
-                                }
-                            ],
-                            "field": "object",
-                            "help": "The name of the object to query for.",
-                            "required": true
-                        },
-                        {
-                            "type": "text",
-                            "label": "Object Fields",
-                            "validators": [
-                                {
-                                    "type": "string",
-                                    "errorMsg": "Max length of text input is 8192",
-                                    "minLength": 0,
-                                    "maxLength": 8192
-                                }
-                            ],
-                            "field": "object_fields",
-                            "help": "Object fields from which to collect data. Delimit multiple fields using a comma.",
-                            "required": true
-                        },
-                        {
-                            "type": "text",
-                            "label": "Order By",
-                            "validators": [
-                                {
-                                    "type": "string",
-                                    "errorMsg": "Max length of text input is 8192",
-                                    "minLength": 0,
-                                    "maxLength": 8192
-                                }
-                            ],
-                            "defaultValue": "LastModifiedDate",
-                            "field": "order_by",
-                            "help": "The datetime field by which to query results in ascending order for indexing.",
-                            "required": true
-                        },
-                        {
-                            "type": "radio",
-                            "label": "Use existing data input?",
-                            "field": "use_existing_checkpoint",
-                            "defaultValue": "yes",
-                            "help": "Data input already exists. Select `No` if you want to reset the data collection.",
-                            "required": false,
-                            "options": {
-                                "items": [
-                                    {
-                                        "value": "yes",
-                                        "label": "Yes"
-                                    },
-                                    {
-                                        "value": "no",
-                                        "label": "No"
-                                    }
-                                ],
-                                "display": false
-                            }
-                        },
-                        {
-                            "type": "text",
-                            "label": "Query Start Date",
-                            "validators": [
-                                {
-                                    "type": "regex",
-                                    "errorMsg": "Invalid date and time format",
-                                    "pattern": "^(\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}.\\d{3}z)?$"
-                                }
-                            ],
-                            "field": "start_date",
-                            "help": "The datetime after which to query and index records, in this format: \"YYYY-MM-DDThh:mm:ss.000z\".\nDefaults to 90 days earlier from now.",
-                            "tooltip": "Changing this parameter may result in gaps or duplication in data collection.",
-                            "required": false
-                        },
-                        {
-                            "type": "text",
-                            "label": "Limit",
-                            "validators": [
-                                {
-                                    "type": "string",
-                                    "errorMsg": "Max length of text input is 8192",
-                                    "minLength": 0,
-                                    "maxLength": 8192
-                                }
-                            ],
-                            "defaultValue": "1000",
-                            "field": "limit",
-                            "help": "The maximum number of results returned by the query.",
-                            "required": false
-                        },
-                        {
-                            "field": "example_help_link",
-                            "label": "",
-                            "type": "helpLink",
-                            "options": {
-                                "text": "Help Link",
-                                "link": "https://docs.splunk.com/Documentation"
-                            }
                         }
                     ],
                     "title": "Example Input One"
-                },
-                {
-                    "name": "example_input_two",
-                    "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": "text",
-                            "label": "Interval",
-                            "validators": [
-                                {
-                                    "type": "regex",
-                                    "errorMsg": "Interval must be an integer.",
-                                    "pattern": "^\\-[1-9]\\d*$|^\\d*$"
-                                }
-                            ],
-                            "field": "interval",
-                            "help": "Time interval of the data input, in seconds .",
-                            "required": true
-                        },
-                        {
-                            "type": "singleSelect",
-                            "label": "Index",
-                            "validators": [
-                                {
-                                    "type": "string",
-                                    "errorMsg": "Length of index name should be between 1 and 80.",
-                                    "minLength": 1,
-                                    "maxLength": 80
-                                }
-                            ],
-                            "defaultValue": "default",
-                            "options": {
-                                "endpointUrl": "data/indexes",
-                                "denyList": "^_.*$",
-                                "createSearchChoice": true
-                            },
-                            "field": "index",
-                            "required": true
-                        },
-                        {
-                            "type": "singleSelect",
-                            "label": "Example Account",
-                            "options": {
-                                "referenceName": "account"
-                            },
-                            "help": "",
-                            "field": "account",
-                            "required": true
-                        },
-                        {
-                            "type": "multipleSelect",
-                            "label": "Example Multiple Select",
-                            "field": "input_two_multiple_select",
-                            "help": "This is an example multipleSelect for input two entity",
-                            "required": true,
-                            "options": {
-                                "items": [{
-                                        "value": "one",
-                                        "label": "Option One"
-                                    },
-                                    {
-                                        "value": "two",
-                                        "label": "Option Two"
-                                    }
-                                ]
-                            }
-                        },
-                        {
-                            "type": "checkbox",
-                            "label": "Example Checkbox",
-                            "field": "input_two_checkbox",
-                            "help": "This is an example checkbox for the input two entity"
-                        },
-                        {
-                            "type": "radio",
-                            "label": "Example Radio",
-                            "field": "input_two_radio",
-                            "defaultValue": "yes",
-                            "help": "This is an example radio button for the input two entity",
-                            "required": false,
-                            "options": {
-                                "items": [{
-                                        "value": "yes",
-                                        "label": "Yes"
-                                    },
-                                    {
-                                        "value": "no",
-                                        "label": "No"
-                                    }
-                                ],
-                                "display": true
-                            }
-                        },
-                        {
-                            "type": "radio",
-                            "label": "Use existing data input?",
-                            "field": "use_existing_checkpoint",
-                            "defaultValue": "yes",
-                            "help": "Data input already exists. Select `No` if you want to reset the data collection.",
-                            "required": false,
-                            "options": {
-                                "items": [
-                                    {
-                                        "value": "yes",
-                                        "label": "Yes"
-                                    },
-                                    {
-                                        "value": "no",
-                                        "label": "No"
-                                    }
-                                ],
-                                "display": false
-                            }
-                        },
-                        {
-                            "type": "text",
-                            "label": "Query Start Date",
-                            "validators": [
-                                {
-                                    "type": "regex",
-                                    "errorMsg": "Invalid date and time format",
-                                    "pattern": "^(\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}.\\d{3}z)?$"
-                                }
-                            ],
-                            "field": "start_date",
-                            "help": "The date and time, in \"YYYY-MM-DDThh:mm:ss.000z\" format, after which to query and index records. \nThe default is 90 days before today.",
-                            "tooltip": "Changing this parameter may result in gaps or duplication in data collection.",
-                            "required": false
-                        },
-                        {
-                            "field": "example_help_link",
-                            "label": "",
-                            "type": "helpLink",
-                            "options": {
-                                "text": "Help Link",
-                                "link": "https://docs.splunk.com/Documentation"
-                            }
-                        }
-                    ],
-                    "title": "Example Input Two"
                 }
             ],
             "title": "Inputs",
@@ -440,178 +50,22 @@
                     {
                         "label": "Name",
                         "field": "name"
-                    },
-                    {
-                        "label": "Account Name",
-                        "field": "account"
-                    },
-                    {
-                        "label": "Interval",
-                        "field": "interval"
-                    },
-                    {
-                        "label": "Index",
-                        "field": "index"
-                    },
-                    {
-                        "label": "Status",
-                        "field": "disabled"
                     }
                 ],
                 "moreInfo": [
                     {
                         "label": "Name",
                         "field": "name"
-                    },
-                    {
-                        "label": "Interval",
-                        "field": "interval"
-                    },
-                    {
-                        "label": "Index",
-                        "field": "index"
-                    },
-                    {
-                        "label": "Status",
-                        "field": "disabled",
-                        "mapping": {
-                            "true": "Disabled",
-                            "false": "Enabled"
-                        }
-                    },
-                    {
-                        "label": "Example Account",
-                        "field": "account"
-                    },
-                    {
-                        "label": "Object",
-                        "field": "object"
-                    },
-                    {
-                        "label": "Object Fields",
-                        "field": "object_fields"
-                    },
-                    {
-                        "label": "Order By",
-                        "field": "order_by"
-                    },
-                    {
-                        "label": "Query Start Date",
-                        "field": "start_date"
-                    },
-                    {
-                        "label": "Limit",
-                        "field": "limit"
                     }
                 ]
             }
         }
     },
-    "alerts": [
-        {
-            "name": "test_alert",
-            "label": "Test Alert",
-            "description": "Description for test Alert Action",
-            "activeResponse": {
-                "task": [
-                    "Create",
-                    "Update"
-                ],
-                "supportsAdhoc": true,
-                "subject": [
-                    "endpoint"
-                ],
-                "category": [
-                    "Information Conveyance",
-                    "Information Portrayal"
-                ],
-                "technology": [
-                    {
-                        "version": [
-                            "1.0.0"
-                        ],
-                        "product": "Test Incident Update",
-                        "vendor": "Splunk"
-                    }
-                ],
-                "drilldownUri": "search?q=search%20index%3D\"_internal\"&earliest=0&latest=",
-                "sourcetype": "test:incident"
-            },
-            "entity": [
-                {
-                    "type": "text",
-                    "label": "Name",
-                    "field": "name",
-                    "defaultValue": "xyz",
-                    "required": true,
-                    "help": "Please enter your name"
-                },
-                {
-                    "type": "checkbox",
-                    "label": "All Incidents",
-                    "field": "all_incidents",
-                    "defaultValue": 0,
-                    "required": false,
-                    "help": "Tick if you want to update all incidents/problems"
-                },
-                {
-                    "type": "singleSelect",
-                    "label": "Table List",
-                    "field": "table_list",
-                    "options": {
-                        "items": [
-                            {
-                                "value": "Incident",
-                                "label": "incident"
-                            },
-                            {
-                                "value": "Problem",
-                                "label": "problem"
-                            }
-                        ]
-                    },
-                    "help": "Please select the table",
-                    "required": false,
-                    "defaultValue": "problem"
-                },
-                {
-                    "type": "radio",
-                    "label": "Action:",
-                    "field": "action",
-                    "options": {
-                        "items": [
-                            {
-                                "value": "Update",
-                                "label": "update"
-                            },
-                            {
-                                "value": "Delete",
-                                "label": "delete"
-                            }
-                        ]
-                    },
-                    "help": "Select the action you want to perform",
-                    "required": true,
-                    "defaultValue": "two"
-                },
-                {
-                    "type": "singleSelectSplunkSearch",
-                    "label": "Select Account",
-                    "field": "account",
-                    "search": "| rest /servicesNS/nobody/TA-SNOW/admin/TA_SNOW_account | dedup title",
-                    "valueField": "title",
-                    "labelField": "title",
-                    "help": "Select the account from the dropdown",
-                    "required": true
-                }
-            ]
-        }
-    ],
     "meta": {
-        "apiVersion": "3.2.0",
         "name": "Splunk_TA_UCCExample",
         "restRoot": "splunk_ta_uccexample",
         "version": "1.0.0",
-        "displayName": "Splunk UCC test Add-on"
+        "displayName": "Splunk UCC test Add-on",
+        "schemaVersion": "0.0.3"
     }
 }
diff --git a/tests/unit/testdata/invalid_config_no_configuration_tabs.yaml b/tests/unit/testdata/invalid_config_no_configuration_tabs.yaml
index c09d2900d..e228792e2 100644
--- a/tests/unit/testdata/invalid_config_no_configuration_tabs.yaml
+++ b/tests/unit/testdata/invalid_config_no_configuration_tabs.yaml
@@ -24,266 +24,7 @@ pages:
         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
-      - type: radio
-        label: Example Radio
-        field: input_one_radio
-        defaultValue: 'yes'
-        help: This is an example radio button for the input one entity
-        required: false
-        options:
-          items:
-          - value: 'yes'
-            label: 'Yes'
-          - value: 'no'
-            label: 'No'
-          display: true
-      - field: singleSelectTest
-        label: Single Select Group Test
-        type: singleSelect
-        options:
-          createSearchChoice: true
-          autoCompleteFields:
-          - label: Group1
-            children:
-            - value: one
-              label: One
-            - value: two
-              label: Two
-          - label: Group2
-            children:
-            - value: three
-              label: Three
-            - value: four
-              label: Four
-      - field: multipleSelectTest
-        label: Multiple Select Test
-        type: multipleSelect
-        options:
-          delimiter: "|"
-          items:
-          - value: a
-            label: A
-          - value: b
-            label: B
-      - type: text
-        label: Interval
-        validators:
-        - type: regex
-          errorMsg: Interval must be an integer.
-          pattern: "^\\-[1-9]\\d*$|^\\d*$"
-        field: interval
-        help: Time interval of the data input, in seconds.
-        required: true
-      - type: singleSelect
-        label: Index
-        validators:
-        - type: string
-          errorMsg: Length of index name should be between 1 and 80.
-          minLength: 1
-          maxLength: 80
-        defaultValue: default
-        options:
-          endpointUrl: data/indexes
-          denyList: "^_.*$"
-          createSearchChoice: true
-        field: index
-        required: true
-      - type: singleSelect
-        label: Example Account
-        options:
-          referenceName: account
-        help: ''
-        field: account
-        required: true
-      - type: text
-        label: Object
-        validators:
-        - type: string
-          errorMsg: Max length of text input is 8192
-          minLength: 0
-          maxLength: 8192
-        field: object
-        help: The name of the object to query for.
-        required: true
-      - type: text
-        label: Object Fields
-        validators:
-        - type: string
-          errorMsg: Max length of text input is 8192
-          minLength: 0
-          maxLength: 8192
-        field: object_fields
-        help: Object fields from which to collect data. Delimit multiple fields using
-          a comma.
-        required: true
-      - type: text
-        label: Order By
-        validators:
-        - type: string
-          errorMsg: Max length of text input is 8192
-          minLength: 0
-          maxLength: 8192
-        defaultValue: LastModifiedDate
-        field: order_by
-        help: The datetime field by which to query results in ascending order for
-          indexing.
-        required: true
-      - type: radio
-        label: Use existing data input?
-        field: use_existing_checkpoint
-        defaultValue: 'yes'
-        help: Data input already exists. Select `No` if you want to reset the data
-          collection.
-        required: false
-        options:
-          items:
-          - value: 'yes'
-            label: 'Yes'
-          - value: 'no'
-            label: 'No'
-          display: false
-      - type: text
-        label: Query Start Date
-        validators:
-        - type: regex
-          errorMsg: Invalid date and time format
-          pattern: "^(\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}.\\d{3}z)?$"
-        field: start_date
-        help: |-
-          The datetime after which to query and index records, in this format: "YYYY-MM-DDThh:mm:ss.000z".
-          Defaults to 90 days earlier from now.
-        tooltip: Changing this parameter may result in gaps or duplication in data
-          collection.
-        required: false
-      - type: text
-        label: Limit
-        validators:
-        - type: string
-          errorMsg: Max length of text input is 8192
-          minLength: 0
-          maxLength: 8192
-        defaultValue: '1000'
-        field: limit
-        help: The maximum number of results returned by the query.
-        required: false
-      - field: example_help_link
-        label: ''
-        type: helpLink
-        options:
-          text: Help Link
-          link: https://docs.splunk.com/Documentation
       title: Example Input One
-    - name: example_input_two
-      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: text
-        label: Interval
-        validators:
-        - type: regex
-          errorMsg: Interval must be an integer.
-          pattern: "^\\-[1-9]\\d*$|^\\d*$"
-        field: interval
-        help: Time interval of the data input, in seconds .
-        required: true
-      - type: singleSelect
-        label: Index
-        validators:
-        - type: string
-          errorMsg: Length of index name should be between 1 and 80.
-          minLength: 1
-          maxLength: 80
-        defaultValue: default
-        options:
-          endpointUrl: data/indexes
-          denyList: "^_.*$"
-          createSearchChoice: true
-        field: index
-        required: true
-      - type: singleSelect
-        label: Example Account
-        options:
-          referenceName: account
-        help: ''
-        field: account
-        required: true
-      - type: multipleSelect
-        label: Example Multiple Select
-        field: input_two_multiple_select
-        help: This is an example multipleSelect for input two entity
-        required: true
-        options:
-          items:
-          - value: one
-            label: Option One
-          - value: two
-            label: Option Two
-      - type: checkbox
-        label: Example Checkbox
-        field: input_two_checkbox
-        help: This is an example checkbox for the input two entity
-      - type: radio
-        label: Example Radio
-        field: input_two_radio
-        defaultValue: 'yes'
-        help: This is an example radio button for the input two entity
-        required: false
-        options:
-          items:
-          - value: 'yes'
-            label: 'Yes'
-          - value: 'no'
-            label: 'No'
-          display: true
-      - type: radio
-        label: Use existing data input?
-        field: use_existing_checkpoint
-        defaultValue: 'yes'
-        help: Data input already exists. Select `No` if you want to reset the data
-          collection.
-        required: false
-        options:
-          items:
-          - value: 'yes'
-            label: 'Yes'
-          - value: 'no'
-            label: 'No'
-          display: false
-      - type: text
-        label: Query Start Date
-        validators:
-        - type: regex
-          errorMsg: Invalid date and time format
-          pattern: "^(\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}.\\d{3}z)?$"
-        field: start_date
-        help: "The date and time, in \"YYYY-MM-DDThh:mm:ss.000z\" format, after which
-          to query and index records. \nThe default is 90 days before today."
-        tooltip: Changing this parameter may result in gaps or duplication in data
-          collection.
-        required: false
-      - field: example_help_link
-        label: ''
-        type: helpLink
-        options:
-          text: Help Link
-          link: https://docs.splunk.com/Documentation
-      title: Example Input Two
     title: Inputs
     description: Manage your data inputs
     table:
@@ -295,107 +36,12 @@ pages:
       header:
       - label: Name
         field: name
-      - label: Account Name
-        field: account
-      - label: Interval
-        field: interval
-      - label: Index
-        field: index
-      - label: Status
-        field: disabled
       moreInfo:
       - label: Name
         field: name
-      - label: Interval
-        field: interval
-      - label: Index
-        field: index
-      - label: Status
-        field: disabled
-        mapping:
-          'true': Disabled
-          'false': Enabled
-      - label: Example Account
-        field: account
-      - label: Object
-        field: object
-      - label: Object Fields
-        field: object_fields
-      - label: Order By
-        field: order_by
-      - label: Query Start Date
-        field: start_date
-      - label: Limit
-        field: limit
-alerts:
-- name: test_alert
-  label: Test Alert
-  description: Description for test Alert Action
-  activeResponse:
-    task:
-    - Create
-    - Update
-    supportsAdhoc: true
-    subject:
-    - endpoint
-    category:
-    - Information Conveyance
-    - Information Portrayal
-    technology:
-    - version:
-      - 1.0.0
-      product: Test Incident Update
-      vendor: Splunk
-    drilldownUri: search?q=search%20index%3D"_internal"&earliest=0&latest=
-    sourcetype: test:incident
-  entity:
-  - type: text
-    label: Name
-    field: name
-    defaultValue: xyz
-    required: true
-    help: Please enter your name
-  - type: checkbox
-    label: All Incidents
-    field: all_incidents
-    defaultValue: 0
-    required: false
-    help: Tick if you want to update all incidents/problems
-  - type: singleSelect
-    label: Table List
-    field: table_list
-    options:
-      items:
-      - value: Incident
-        label: incident
-      - value: Problem
-        label: problem
-    help: Please select the table
-    required: false
-    defaultValue: problem
-  - type: radio
-    label: 'Action:'
-    field: action
-    options:
-      items:
-      - value: Update
-        label: update
-      - value: Delete
-        label: delete
-    help: Select the action you want to perform
-    required: true
-    defaultValue: two
-  - type: singleSelectSplunkSearch
-    label: Select Account
-    field: account
-    search: "| rest /servicesNS/nobody/TA-SNOW/admin/TA_SNOW_account | dedup title"
-    valueField: title
-    labelField: title
-    help: Select the account from the dropdown
-    required: true
 meta:
-  apiVersion: 3.2.0
   name: Splunk_TA_UCCExample
   restRoot: splunk_ta_uccexample
   version: 1.0.0
   displayName: Splunk UCC test Add-on
+  schemaVersion: 0.0.3
diff --git a/tests/unit/testdata/invalid_config_no_name_field_in_configuration_tab_table.json b/tests/unit/testdata/invalid_config_no_name_field_in_configuration_tab_table.json
index 3ca64517f..bfbc19de6 100644
--- a/tests/unit/testdata/invalid_config_no_name_field_in_configuration_tab_table.json
+++ b/tests/unit/testdata/invalid_config_no_name_field_in_configuration_tab_table.json
@@ -14,10 +14,6 @@
                             {
                                 "label": "Name",
                                 "field": "name"
-                            },
-                            {
-                                "label": "Auth Type",
-                                "field": "auth_type"
                             }
                         ]
                     },
@@ -44,262 +40,10 @@
                             "field": "not_a_name",
                             "help": "Enter a unique name for this account.",
                             "required": true
-                        },
-                        {
-                            "type": "singleSelect",
-                            "label": "Example Environment",
-                            "options": {
-                                "disableSearch": true,
-                                "autoCompleteFields": [
-                                    {
-                                        "value": "login.example.com",
-                                        "label": "Value1"
-                                    },
-                                    {
-                                        "value": "test.example.com",
-                                        "label": "Value2"
-                                    },
-                                    {
-                                        "value": "other",
-                                        "label": "Other"
-                                    }
-                                ],
-                                "display": true
-                            },
-                            "help": "",
-                            "field": "custom_endpoint",
-                            "defaultValue": "login.example.com",
-                            "required": true
-                        },
-                        {
-                            "type": "text",
-                            "label": "Endpoint URL",
-                            "help": "Enter the endpoint URL.",
-                            "field": "endpoint",
-                            "options": {
-                                "display": false
-                            }
-                        },
-                        {
-                            "type": "checkbox",
-                            "label": "Example Checkbox",
-                            "field": "account_checkbox",
-                            "help": "This is an example checkbox for the account entity"
-                        },
-                        {
-                            "type": "radio",
-                            "label": "Example Radio",
-                            "field": "account_radio",
-                            "defaultValue": "yes",
-                            "help": "This is an example radio button for the account entity",
-                            "required": true,
-                            "options": {
-                                "items": [
-                                    {
-                                        "value": "yes",
-                                        "label": "Yes"
-                                    },
-                                    {
-                                        "value": "no",
-                                        "label": "No"
-                                    }
-                                ],
-                                "display": true
-                            }
-                        },
-                        {
-                            "type": "multipleSelect",
-                            "label": "Example Multiple Select",
-                            "field": "account_multiple_select",
-                            "help": "This is an example multipleSelect for account entity",
-                            "required": true,
-                            "options": {
-                                "items": [
-                                    {
-                                        "value": "one",
-                                        "label": "Option One"
-                                    },
-                                    {
-                                        "value": "two",
-                                        "label": "Option Two"
-                                    }
-                                ]
-                            }
-                        },
-                        {
-                            "type": "text",
-                            "label": "State",
-                            "help": "This is a boolean field for developers to decide whether state parameter will be passed in the OAuth flow. Value: true|false",
-                            "field": "oauth_state_enabled",
-                            "options": {
-                                "display": false
-                            }
-                        },
-                        {
-                            "type": "oauth",
-                            "field": "oauth",
-                            "label": "Not used",
-                            "options": {
-                                "auth_type": [
-                                    "basic",
-                                    "oauth"
-                                ],
-                                "basic": [
-                                    {
-                                        "oauth_field": "username",
-                                        "label": "Username",
-                                        "help": "Enter the username for this account.",
-                                        "field": "username"
-                                    },
-                                    {
-                                        "oauth_field": "password",
-                                        "label": "Password",
-                                        "encrypted": true,
-                                        "help": "Enter the password for this account.",
-                                        "field": "password"
-                                    },
-                                    {
-                                        "oauth_field": "security_token",
-                                        "label": "Security Token",
-                                        "encrypted": true,
-                                        "help": "Enter the security token.",
-                                        "field": "token"
-                                    }
-                                ],
-                                "oauth": [
-                                    {
-                                        "oauth_field": "client_id",
-                                        "label": "Client Id",
-                                        "field": "client_id",
-                                        "help": "Enter the Client Id for this account."
-                                    },
-                                    {
-                                        "oauth_field": "client_secret",
-                                        "label": "Client Secret",
-                                        "field": "client_secret",
-                                        "encrypted": true,
-                                        "help": "Enter the Client Secret key for this account."
-                                    },
-                                    {
-                                        "oauth_field": "redirect_url",
-                                        "label": "Redirect url",
-                                        "field": "redirect_url",
-                                        "help": "Copy and paste this URL into your app."
-                                    }
-                                ],
-                                "auth_code_endpoint": "/services/oauth2/authorize",
-                                "access_token_endpoint": "/services/oauth2/token",
-                                "oauth_timeout": 30
-                            }
-                        },
-                        {
-                            "field": "example_help_link",
-                            "label": "",
-                            "type": "helpLink",
-                            "options": {
-                                "text": "Help Link",
-                                "link": "https://docs.splunk.com/Documentation"
-                            }
                         }
                     ],
                     "title": "Account"
                 },
-                {
-                    "name": "proxy",
-                    "entity": [
-                        {
-                            "type": "checkbox",
-                            "label": "Enable",
-                            "field": "proxy_enabled"
-                        },
-                        {
-                            "type": "singleSelect",
-                            "label": "Proxy Type",
-                            "options": {
-                                "disableSearch": true,
-                                "autoCompleteFields": [
-                                    {
-                                        "value": "http",
-                                        "label": "http"
-                                    },
-                                    {
-                                        "value": "socks4",
-                                        "label": "socks4"
-                                    },
-                                    {
-                                        "value": "socks5",
-                                        "label": "socks5"
-                                    }
-                                ]
-                            },
-                            "defaultValue": "http",
-                            "field": "proxy_type"
-                        },
-                        {
-                            "type": "text",
-                            "label": "Host",
-                            "validators": [
-                                {
-                                    "type": "string",
-                                    "errorMsg": "Max host length is 4096",
-                                    "minLength": 0,
-                                    "maxLength": 4096
-                                }
-                            ],
-                            "field": "proxy_url"
-                        },
-                        {
-                            "type": "text",
-                            "label": "Port",
-                            "validators": [
-                                {
-                                    "type": "number",
-                                    "range": [
-                                        1,
-                                        65535
-                                    ]
-                                }
-                            ],
-                            "field": "proxy_port"
-                        },
-                        {
-                            "type": "text",
-                            "label": "Username",
-                            "validators": [
-                                {
-                                    "type": "string",
-                                    "errorMsg": "Max length of username is 50",
-                                    "minLength": 0,
-                                    "maxLength": 50
-                                }
-                            ],
-                            "field": "proxy_username"
-                        },
-                        {
-                            "type": "text",
-                            "label": "Password",
-                            "validators": [
-                                {
-                                    "type": "string",
-                                    "errorMsg": "Max length of password is 8192",
-                                    "minLength": 0,
-                                    "maxLength": 8192
-                                }
-                            ],
-                            "encrypted": true,
-                            "field": "proxy_password"
-                        },
-                        {
-                            "type": "checkbox",
-                            "label": "Reverse DNS resolution",
-                            "field": "proxy_rdns"
-                        }
-                    ],
-                    "options": {
-                        "saveValidator": "function(formData) { if(!formData.proxy_enabled || formData.proxy_enabled === '0') {return true; } if(!formData.proxy_url) { return 'Proxy Host can not be empty'; } if(!formData.proxy_port) { return 'Proxy Port can not be empty'; } return true; }"
-                    },
-                    "title": "Proxy"
-                },
                 {
                     "name": "logging",
                     "entity": [
@@ -336,90 +80,6 @@
                         }
                     ],
                     "title": "Logging"
-                },
-                {
-                    "name": "custom_abc",
-                    "title": "Customized tab",
-                    "entity": [
-                        {
-                            "field": "testString",
-                            "label": "Test String",
-                            "type": "text",
-                            "validators": [
-                                {
-                                    "type": "string",
-                                    "maxLength": 10,
-                                    "minLength": 5
-                                }
-                            ]
-                        },
-                        {
-                            "field": "testNumber",
-                            "label": "Test number",
-                            "type": "text",
-                            "validators": [
-                                {
-                                    "type": "number",
-                                    "range": [
-                                        1,
-                                        10
-                                    ]
-                                }
-                            ]
-                        },
-                        {
-                            "field": "testRegex",
-                            "label": "Test regex",
-                            "type": "text",
-                            "validators": [
-                                {
-                                    "type": "regex",
-                                    "pattern": "^\\w+$",
-                                    "errorMsg": "Characters of Name should match regex ^\\w+$ ."
-                                }
-                            ]
-                        },
-                        {
-                            "field": "testEmail",
-                            "label": "Test Email",
-                            "type": "text",
-                            "validators": [
-                                {
-                                    "type": "email"
-                                }
-                            ]
-                        },
-                        {
-                            "field": "testIpv4",
-                            "label": "Test ipv4",
-                            "type": "text",
-                            "validators": [
-                                {
-                                    "type": "ipv4"
-                                }
-                            ]
-                        },
-                        {
-                            "field": "testDate",
-                            "label": "Test date",
-                            "type": "text",
-                            "validators": [
-                                {
-                                    "type": "date"
-                                }
-                            ]
-                        },
-                        {
-                            "field": "testUrl",
-                            "label": "Test url",
-                            "type": "text",
-                            "validators": [
-                                {
-                                    "type": "url"
-                                }
-                            ]
-                        }
-                    ]
                 }
             ],
             "title": "Configuration",
@@ -427,10 +87,10 @@
         }
     },
     "meta": {
-        "apiVersion": "3.2.0",
         "name": "Splunk_TA_UCCExample",
         "restRoot": "splunk_ta_uccexample",
         "version": "1.0.0",
-        "displayName": "Splunk UCC test Add-on"
+        "displayName": "Splunk UCC test Add-on",
+        "schemaVersion": "0.0.3"
     }
 }
diff --git a/tests/unit/testdata/invalid_config_no_name_field_in_configuration_tab_table.yaml b/tests/unit/testdata/invalid_config_no_name_field_in_configuration_tab_table.yaml
index 2d24f844f..a5bdf73ee 100644
--- a/tests/unit/testdata/invalid_config_no_name_field_in_configuration_tab_table.yaml
+++ b/tests/unit/testdata/invalid_config_no_name_field_in_configuration_tab_table.yaml
@@ -11,8 +11,6 @@ pages:
         header:
         - label: Name
           field: name
-        - label: Auth Type
-          field: auth_type
       entity:
       - type: text
         label: Name
@@ -30,169 +28,7 @@ pages:
         field: not_a_name
         help: Enter a unique name for this account.
         required: true
-      - type: singleSelect
-        label: Example Environment
-        options:
-          disableSearch: true
-          autoCompleteFields:
-          - value: login.example.com
-            label: Value1
-          - value: test.example.com
-            label: Value2
-          - value: other
-            label: Other
-          display: true
-        help: ''
-        field: custom_endpoint
-        defaultValue: login.example.com
-        required: true
-      - type: text
-        label: Endpoint URL
-        help: Enter the endpoint URL.
-        field: endpoint
-        options:
-          display: false
-      - type: checkbox
-        label: Example Checkbox
-        field: account_checkbox
-        help: This is an example checkbox for the account entity
-      - type: radio
-        label: Example Radio
-        field: account_radio
-        defaultValue: 'yes'
-        help: This is an example radio button for the account entity
-        required: true
-        options:
-          items:
-          - value: 'yes'
-            label: 'Yes'
-          - value: 'no'
-            label: 'No'
-          display: true
-      - type: multipleSelect
-        label: Example Multiple Select
-        field: account_multiple_select
-        help: This is an example multipleSelect for account entity
-        required: true
-        options:
-          items:
-          - value: one
-            label: Option One
-          - value: two
-            label: Option Two
-      - type: text
-        label: State
-        help: 'This is a boolean field for developers to decide whether state parameter
-          will be passed in the OAuth flow. Value: true|false'
-        field: oauth_state_enabled
-        options:
-          display: false
-      - type: oauth
-        field: oauth
-        label: Not used
-        options:
-          auth_type:
-          - basic
-          - oauth
-          basic:
-          - oauth_field: username
-            label: Username
-            help: Enter the username for this account.
-            field: username
-          - oauth_field: password
-            label: Password
-            encrypted: true
-            help: Enter the password for this account.
-            field: password
-          - oauth_field: security_token
-            label: Security Token
-            encrypted: true
-            help: Enter the security token.
-            field: token
-          oauth:
-          - oauth_field: client_id
-            label: Client Id
-            field: client_id
-            help: Enter the Client Id for this account.
-          - oauth_field: client_secret
-            label: Client Secret
-            field: client_secret
-            encrypted: true
-            help: Enter the Client Secret key for this account.
-          - oauth_field: redirect_url
-            label: Redirect url
-            field: redirect_url
-            help: Copy and paste this URL into your app.
-          auth_code_endpoint: "/services/oauth2/authorize"
-          access_token_endpoint: "/services/oauth2/token"
-          oauth_timeout: 30
-      - field: example_help_link
-        label: ''
-        type: helpLink
-        options:
-          text: Help Link
-          link: https://docs.splunk.com/Documentation
       title: Account
-    - name: proxy
-      entity:
-      - type: checkbox
-        label: Enable
-        field: proxy_enabled
-      - type: singleSelect
-        label: Proxy Type
-        options:
-          disableSearch: true
-          autoCompleteFields:
-          - value: http
-            label: http
-          - value: socks4
-            label: socks4
-          - value: socks5
-            label: socks5
-        defaultValue: http
-        field: proxy_type
-      - type: text
-        label: Host
-        validators:
-        - type: string
-          errorMsg: Max host length is 4096
-          minLength: 0
-          maxLength: 4096
-        field: proxy_url
-      - type: text
-        label: Port
-        validators:
-        - type: number
-          range:
-          - 1
-          - 65535
-        field: proxy_port
-      - type: text
-        label: Username
-        validators:
-        - type: string
-          errorMsg: Max length of username is 50
-          minLength: 0
-          maxLength: 50
-        field: proxy_username
-      - type: text
-        label: Password
-        validators:
-        - type: string
-          errorMsg: Max length of password is 8192
-          minLength: 0
-          maxLength: 8192
-        encrypted: true
-        field: proxy_password
-      - type: checkbox
-        label: Reverse DNS resolution
-        field: proxy_rdns
-      options:
-        saveValidator: function(formData) { if(!formData.proxy_enabled || formData.proxy_enabled
-          === '0') {return true; } if(!formData.proxy_url) { return 'Proxy Host can
-          not be empty'; } if(!formData.proxy_port) { return 'Proxy Port can not be
-          empty'; } return true; }
-      title: Proxy
     - name: logging
       entity:
       - type: singleSelect
@@ -213,56 +49,11 @@ pages:
         defaultValue: INFO
         field: loglevel
       title: Logging
-    - name: custom_abc
-      title: Customized tab
-      entity:
-      - field: testString
-        label: Test String
-        type: text
-        validators:
-        - type: string
-          maxLength: 10
-          minLength: 5
-      - field: testNumber
-        label: Test number
-        type: text
-        validators:
-        - type: number
-          range:
-          - 1
-          - 10
-      - field: testRegex
-        label: Test regex
-        type: text
-        validators:
-        - type: regex
-          pattern: "^\\w+$"
-          errorMsg: Characters of Name should match regex ^\w+$ .
-      - field: testEmail
-        label: Test Email
-        type: text
-        validators:
-        - type: email
-      - field: testIpv4
-        label: Test ipv4
-        type: text
-        validators:
-        - type: ipv4
-      - field: testDate
-        label: Test date
-        type: text
-        validators:
-        - type: date
-      - field: testUrl
-        label: Test url
-        type: text
-        validators:
-        - type: url
     title: Configuration
     description: Set up your add-on
 meta:
-  apiVersion: 3.2.0
   name: Splunk_TA_UCCExample
   restRoot: splunk_ta_uccexample
   version: 1.0.0
   displayName: Splunk UCC test Add-on
+  schemaVersion: 0.0.3
diff --git a/tests/unit/testdata/invalid_config_only_rest_handler_class_is_present.json b/tests/unit/testdata/invalid_config_only_rest_handler_class_is_present.json
index b148fb770..189567b3f 100644
--- a/tests/unit/testdata/invalid_config_only_rest_handler_class_is_present.json
+++ b/tests/unit/testdata/invalid_config_only_rest_handler_class_is_present.json
@@ -14,10 +14,6 @@
                             {
                                 "label": "Name",
                                 "field": "name"
-                            },
-                            {
-                                "label": "Auth Type",
-                                "field": "auth_type"
                             }
                         ]
                     },
@@ -44,160 +40,6 @@
                             "field": "name",
                             "help": "Enter a unique name for this account.",
                             "required": true
-                        },
-                        {
-                            "type": "singleSelect",
-                            "label": "Example Environment",
-                            "options": {
-                                "disableSearch": true,
-                                "autoCompleteFields": [
-                                    {
-                                        "value": "login.example.com",
-                                        "label": "Value1"
-                                    },
-                                    {
-                                        "value": "test.example.com",
-                                        "label": "Value2"
-                                    },
-                                    {
-                                        "value": "other",
-                                        "label": "Other"
-                                    }
-                                ],
-                                "display": true
-                            },
-                            "help": "",
-                            "field": "custom_endpoint",
-                            "defaultValue": "login.example.com",
-                            "required": true
-                        },
-                        {
-                            "type": "text",
-                            "label": "Endpoint URL",
-                            "help": "Enter the endpoint URL.",
-                            "field": "endpoint",
-                            "options": {
-                                "display": false
-                            }
-                        },
-                        {
-                            "type": "checkbox",
-                            "label": "Example Checkbox",
-                            "field": "account_checkbox",
-                            "help": "This is an example checkbox for the account entity"
-                        },
-                        {
-                            "type": "radio",
-                            "label": "Example Radio",
-                            "field": "account_radio",
-                            "defaultValue": "yes",
-                            "help": "This is an example radio button for the account entity",
-                            "required": true,
-                            "options": {
-                                "items": [{
-                                        "value": "yes",
-                                        "label": "Yes"
-                                    },
-                                    {
-                                        "value": "no",
-                                        "label": "No"
-                                    }
-                                ],
-                                "display": true
-                            }
-                        },
-                        {
-                            "type": "multipleSelect",
-                            "label": "Example Multiple Select",
-                            "field": "account_multiple_select",
-                            "help": "This is an example multipleSelect for account entity",
-                            "required": true,
-                            "options": {
-                                "items": [{
-                                        "value": "one",
-                                        "label": "Option One"
-                                    },
-                                    {
-                                        "value": "two",
-                                        "label": "Option Two"
-                                    }
-                                ]
-                            }
-                        },
-                        {
-                            "type": "text",
-                            "label": "State",
-                            "help": "This is a boolean field for developers to decide whether state parameter will be passed in the OAuth flow. Value: true|false",
-                            "field": "oauth_state_enabled",
-                            "options": {
-                                "display": false
-                            }
-                        },
-                        {
-                            "type": "oauth",
-                            "field": "oauth",
-                            "label": "Not used",
-                            "options": {
-                                "auth_type": [
-                                    "basic",
-                                    "oauth"
-                                ],
-                                "basic": [
-                                    {
-                                        "oauth_field": "username",
-                                        "label": "Username",
-                                        "help": "Enter the username for this account.",
-                                        "field": "username"
-                                    },
-                                    {
-                                        "oauth_field": "password",
-                                        "label": "Password",
-                                        "encrypted": true,
-                                        "help": "Enter the password for this account.",
-                                        "field": "password"
-                                    },
-                                    {
-                                        "oauth_field": "security_token",
-                                        "label": "Security Token",
-                                        "encrypted": true,
-                                        "help": "Enter the security token.",
-                                        "field": "token"
-                                    }
-                                ],
-                                "oauth": [
-                                    {
-                                        "oauth_field": "client_id",
-                                        "label": "Client Id",
-                                        "field": "client_id",
-                                        "help": "Enter the Client Id for this account."
-                                    },
-                                    {
-                                        "oauth_field": "client_secret",
-                                        "label": "Client Secret",
-                                        "field": "client_secret",
-                                        "encrypted": true,
-                                        "help": "Enter the Client Secret key for this account."
-                                    },
-                                    {
-                                        "oauth_field": "redirect_url",
-                                        "label": "Redirect url",
-                                        "field": "redirect_url",
-                                        "help": "Copy and paste this URL into your app."
-                                    }
-                                ],
-                                "auth_code_endpoint": "/services/oauth2/authorize",
-                                "access_token_endpoint": "/services/oauth2/token",
-                                "oauth_timeout": 30
-                            }
-                        },
-                        {
-                            "field": "example_help_link",
-                            "label": "",
-                            "type": "helpLink",
-                            "options": {
-                                "text": "Help Link",
-                                "link": "https://docs.splunk.com/Documentation"
-                            }
                         }
                     ],
                     "title": "Account"
@@ -234,237 +76,6 @@
                             "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"
-                        },
-                        {
-                            "type": "radio",
-                            "label": "Example Radio",
-                            "field": "input_one_radio",
-                            "defaultValue": "yes",
-                            "help": "This is an example radio button for the input one entity",
-                            "required": false,
-                            "options": {
-                                "items": [{
-                                        "value": "yes",
-                                        "label": "Yes"
-                                    },
-                                    {
-                                        "value": "no",
-                                        "label": "No"
-                                    }
-                                ],
-                                "display": true
-                            }
-                        },
-                        {
-                            "field": "singleSelectTest",
-                            "label": "Single Select Group Test",
-                            "type": "singleSelect",
-                            "options": {
-                                "createSearchChoice": true,
-                                "autoCompleteFields": [
-                                    {
-                                        "label": "Group1",
-                                        "children": [
-                                            {
-                                                "value": "one",
-                                                "label": "One"
-                                            },
-                                            {
-                                                "value": "two",
-                                                "label": "Two"
-                                            }
-                                        ]
-                                    },
-                                    {
-                                        "label": "Group2",
-                                        "children": [
-                                            {
-                                                "value": "three",
-                                                "label": "Three"
-                                            },
-                                            {
-                                                "value": "four",
-                                                "label": "Four"
-                                            }
-                                        ]
-                                    }
-                                ]
-                            }
-                        },
-                        {
-                            "field": "multipleSelectTest",
-                            "label": "Multiple Select Test",
-                            "type": "multipleSelect",
-                            "options": {
-                                "delimiter": "|",
-                                "items": [
-                                    {
-                                        "value": "a",
-                                        "label": "A"
-                                    },
-                                    {
-                                        "value": "b",
-                                        "label": "B"
-                                    }
-                                ]
-                            }
-                        },
-                        {
-                            "type": "text",
-                            "label": "Interval",
-                            "validators": [
-                                {
-                                    "type": "regex",
-                                    "errorMsg": "Interval must be an integer.",
-                                    "pattern": "^\\-[1-9]\\d*$|^\\d*$"
-                                }
-                            ],
-                            "field": "interval",
-                            "help": "Time interval of the data input, in seconds.",
-                            "required": true
-                        },
-                        {
-                            "type": "singleSelect",
-                            "label": "Index",
-                            "validators": [
-                                {
-                                    "type": "string",
-                                    "errorMsg": "Length of index name should be between 1 and 80.",
-                                    "minLength": 1,
-                                    "maxLength": 80
-                                }
-                            ],
-                            "defaultValue": "default",
-                            "options": {
-                                "endpointUrl": "data/indexes",
-                                "denyList": "^_.*$",
-                                "createSearchChoice": true
-                            },
-                            "field": "index",
-                            "required": true
-                        },
-                        {
-                            "type": "singleSelect",
-                            "label": "Example Account",
-                            "options": {
-                                "referenceName": "account"
-                            },
-                            "help": "",
-                            "field": "account",
-                            "required": true
-                        },
-                        {
-                            "type": "text",
-                            "label": "Object",
-                            "validators": [
-                                {
-                                    "type": "string",
-                                    "errorMsg": "Max length of text input is 8192",
-                                    "minLength": 0,
-                                    "maxLength": 8192
-                                }
-                            ],
-                            "field": "object",
-                            "help": "The name of the object to query for.",
-                            "required": true
-                        },
-                        {
-                            "type": "text",
-                            "label": "Object Fields",
-                            "validators": [
-                                {
-                                    "type": "string",
-                                    "errorMsg": "Max length of text input is 8192",
-                                    "minLength": 0,
-                                    "maxLength": 8192
-                                }
-                            ],
-                            "field": "object_fields",
-                            "help": "Object fields from which to collect data. Delimit multiple fields using a comma.",
-                            "required": true
-                        },
-                        {
-                            "type": "text",
-                            "label": "Order By",
-                            "validators": [
-                                {
-                                    "type": "string",
-                                    "errorMsg": "Max length of text input is 8192",
-                                    "minLength": 0,
-                                    "maxLength": 8192
-                                }
-                            ],
-                            "defaultValue": "LastModifiedDate",
-                            "field": "order_by",
-                            "help": "The datetime field by which to query results in ascending order for indexing.",
-                            "required": true
-                        },
-                        {
-                            "type": "radio",
-                            "label": "Use existing data input?",
-                            "field": "use_existing_checkpoint",
-                            "defaultValue": "yes",
-                            "help": "Data input already exists. Select `No` if you want to reset the data collection.",
-                            "required": false,
-                            "options": {
-                                "items": [
-                                    {
-                                        "value": "yes",
-                                        "label": "Yes"
-                                    },
-                                    {
-                                        "value": "no",
-                                        "label": "No"
-                                    }
-                                ],
-                                "display": false
-                            }
-                        },
-                        {
-                            "type": "text",
-                            "label": "Query Start Date",
-                            "validators": [
-                                {
-                                    "type": "regex",
-                                    "errorMsg": "Invalid date and time format",
-                                    "pattern": "^(\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}.\\d{3}z)?$"
-                                }
-                            ],
-                            "field": "start_date",
-                            "help": "The datetime after which to query and index records, in this format: \"YYYY-MM-DDThh:mm:ss.000z\".\nDefaults to 90 days earlier from now.",
-                            "tooltip": "Changing this parameter may result in gaps or duplication in data collection.",
-                            "required": false
-                        },
-                        {
-                            "type": "text",
-                            "label": "Limit",
-                            "validators": [
-                                {
-                                    "type": "string",
-                                    "errorMsg": "Max length of text input is 8192",
-                                    "minLength": 0,
-                                    "maxLength": 8192
-                                }
-                            ],
-                            "defaultValue": "1000",
-                            "field": "limit",
-                            "help": "The maximum number of results returned by the query.",
-                            "required": false
-                        },
-                        {
-                            "field": "example_help_link",
-                            "label": "",
-                            "type": "helpLink",
-                            "options": {
-                                "text": "Help Link",
-                                "link": "https://docs.splunk.com/Documentation"
-                            }
                         }
                     ],
                     "title": "Example Input One"
@@ -483,78 +94,22 @@
                     {
                         "label": "Name",
                         "field": "name"
-                    },
-                    {
-                        "label": "Account Name",
-                        "field": "account"
-                    },
-                    {
-                        "label": "Interval",
-                        "field": "interval"
-                    },
-                    {
-                        "label": "Index",
-                        "field": "index"
-                    },
-                    {
-                        "label": "Status",
-                        "field": "disabled"
                     }
                 ],
                 "moreInfo": [
                     {
                         "label": "Name",
                         "field": "name"
-                    },
-                    {
-                        "label": "Interval",
-                        "field": "interval"
-                    },
-                    {
-                        "label": "Index",
-                        "field": "index"
-                    },
-                    {
-                        "label": "Status",
-                        "field": "disabled",
-                        "mapping": {
-                            "true": "Disabled",
-                            "false": "Enabled"
-                        }
-                    },
-                    {
-                        "label": "Example Account",
-                        "field": "account"
-                    },
-                    {
-                        "label": "Object",
-                        "field": "object"
-                    },
-                    {
-                        "label": "Object Fields",
-                        "field": "object_fields"
-                    },
-                    {
-                        "label": "Order By",
-                        "field": "order_by"
-                    },
-                    {
-                        "label": "Query Start Date",
-                        "field": "start_date"
-                    },
-                    {
-                        "label": "Limit",
-                        "field": "limit"
                     }
                 ]
             }
         }
     },
     "meta": {
-        "apiVersion": "3.2.0",
         "name": "Splunk_TA_UCCExample",
         "restRoot": "splunk_ta_uccexample",
         "version": "1.0.0",
-        "displayName": "Splunk UCC test Add-on"
+        "displayName": "Splunk UCC test Add-on",
+        "schemaVersion": "0.0.3"
     }
 }
diff --git a/tests/unit/testdata/invalid_config_only_rest_handler_module_is_present.json b/tests/unit/testdata/invalid_config_only_rest_handler_module_is_present.json
index 17acae161..9c5a65d23 100644
--- a/tests/unit/testdata/invalid_config_only_rest_handler_module_is_present.json
+++ b/tests/unit/testdata/invalid_config_only_rest_handler_module_is_present.json
@@ -14,10 +14,6 @@
                             {
                                 "label": "Name",
                                 "field": "name"
-                            },
-                            {
-                                "label": "Auth Type",
-                                "field": "auth_type"
                             }
                         ]
                     },
@@ -44,160 +40,6 @@
                             "field": "name",
                             "help": "Enter a unique name for this account.",
                             "required": true
-                        },
-                        {
-                            "type": "singleSelect",
-                            "label": "Example Environment",
-                            "options": {
-                                "disableSearch": true,
-                                "autoCompleteFields": [
-                                    {
-                                        "value": "login.example.com",
-                                        "label": "Value1"
-                                    },
-                                    {
-                                        "value": "test.example.com",
-                                        "label": "Value2"
-                                    },
-                                    {
-                                        "value": "other",
-                                        "label": "Other"
-                                    }
-                                ],
-                                "display": true
-                            },
-                            "help": "",
-                            "field": "custom_endpoint",
-                            "defaultValue": "login.example.com",
-                            "required": true
-                        },
-                        {
-                            "type": "text",
-                            "label": "Endpoint URL",
-                            "help": "Enter the endpoint URL.",
-                            "field": "endpoint",
-                            "options": {
-                                "display": false
-                            }
-                        },
-                        {
-                            "type": "checkbox",
-                            "label": "Example Checkbox",
-                            "field": "account_checkbox",
-                            "help": "This is an example checkbox for the account entity"
-                        },
-                        {
-                            "type": "radio",
-                            "label": "Example Radio",
-                            "field": "account_radio",
-                            "defaultValue": "yes",
-                            "help": "This is an example radio button for the account entity",
-                            "required": true,
-                            "options": {
-                                "items": [{
-                                        "value": "yes",
-                                        "label": "Yes"
-                                    },
-                                    {
-                                        "value": "no",
-                                        "label": "No"
-                                    }
-                                ],
-                                "display": true
-                            }
-                        },
-                        {
-                            "type": "multipleSelect",
-                            "label": "Example Multiple Select",
-                            "field": "account_multiple_select",
-                            "help": "This is an example multipleSelect for account entity",
-                            "required": true,
-                            "options": {
-                                "items": [{
-                                        "value": "one",
-                                        "label": "Option One"
-                                    },
-                                    {
-                                        "value": "two",
-                                        "label": "Option Two"
-                                    }
-                                ]
-                            }
-                        },
-                        {
-                            "type": "text",
-                            "label": "State",
-                            "help": "This is a boolean field for developers to decide whether state parameter will be passed in the OAuth flow. Value: true|false",
-                            "field": "oauth_state_enabled",
-                            "options": {
-                                "display": false
-                            }
-                        },
-                        {
-                            "type": "oauth",
-                            "field": "oauth",
-                            "label": "Not used",
-                            "options": {
-                                "auth_type": [
-                                    "basic",
-                                    "oauth"
-                                ],
-                                "basic": [
-                                    {
-                                        "oauth_field": "username",
-                                        "label": "Username",
-                                        "help": "Enter the username for this account.",
-                                        "field": "username"
-                                    },
-                                    {
-                                        "oauth_field": "password",
-                                        "label": "Password",
-                                        "encrypted": true,
-                                        "help": "Enter the password for this account.",
-                                        "field": "password"
-                                    },
-                                    {
-                                        "oauth_field": "security_token",
-                                        "label": "Security Token",
-                                        "encrypted": true,
-                                        "help": "Enter the security token.",
-                                        "field": "token"
-                                    }
-                                ],
-                                "oauth": [
-                                    {
-                                        "oauth_field": "client_id",
-                                        "label": "Client Id",
-                                        "field": "client_id",
-                                        "help": "Enter the Client Id for this account."
-                                    },
-                                    {
-                                        "oauth_field": "client_secret",
-                                        "label": "Client Secret",
-                                        "field": "client_secret",
-                                        "encrypted": true,
-                                        "help": "Enter the Client Secret key for this account."
-                                    },
-                                    {
-                                        "oauth_field": "redirect_url",
-                                        "label": "Redirect url",
-                                        "field": "redirect_url",
-                                        "help": "Copy and paste this URL into your app."
-                                    }
-                                ],
-                                "auth_code_endpoint": "/services/oauth2/authorize",
-                                "access_token_endpoint": "/services/oauth2/token",
-                                "oauth_timeout": 30
-                            }
-                        },
-                        {
-                            "field": "example_help_link",
-                            "label": "",
-                            "type": "helpLink",
-                            "options": {
-                                "text": "Help Link",
-                                "link": "https://docs.splunk.com/Documentation"
-                            }
                         }
                     ],
                     "title": "Account"
@@ -234,237 +76,6 @@
                             "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"
-                        },
-                        {
-                            "type": "radio",
-                            "label": "Example Radio",
-                            "field": "input_one_radio",
-                            "defaultValue": "yes",
-                            "help": "This is an example radio button for the input one entity",
-                            "required": false,
-                            "options": {
-                                "items": [{
-                                        "value": "yes",
-                                        "label": "Yes"
-                                    },
-                                    {
-                                        "value": "no",
-                                        "label": "No"
-                                    }
-                                ],
-                                "display": true
-                            }
-                        },
-                        {
-                            "field": "singleSelectTest",
-                            "label": "Single Select Group Test",
-                            "type": "singleSelect",
-                            "options": {
-                                "createSearchChoice": true,
-                                "autoCompleteFields": [
-                                    {
-                                        "label": "Group1",
-                                        "children": [
-                                            {
-                                                "value": "one",
-                                                "label": "One"
-                                            },
-                                            {
-                                                "value": "two",
-                                                "label": "Two"
-                                            }
-                                        ]
-                                    },
-                                    {
-                                        "label": "Group2",
-                                        "children": [
-                                            {
-                                                "value": "three",
-                                                "label": "Three"
-                                            },
-                                            {
-                                                "value": "four",
-                                                "label": "Four"
-                                            }
-                                        ]
-                                    }
-                                ]
-                            }
-                        },
-                        {
-                            "field": "multipleSelectTest",
-                            "label": "Multiple Select Test",
-                            "type": "multipleSelect",
-                            "options": {
-                                "delimiter": "|",
-                                "items": [
-                                    {
-                                        "value": "a",
-                                        "label": "A"
-                                    },
-                                    {
-                                        "value": "b",
-                                        "label": "B"
-                                    }
-                                ]
-                            }
-                        },
-                        {
-                            "type": "text",
-                            "label": "Interval",
-                            "validators": [
-                                {
-                                    "type": "regex",
-                                    "errorMsg": "Interval must be an integer.",
-                                    "pattern": "^\\-[1-9]\\d*$|^\\d*$"
-                                }
-                            ],
-                            "field": "interval",
-                            "help": "Time interval of the data input, in seconds.",
-                            "required": true
-                        },
-                        {
-                            "type": "singleSelect",
-                            "label": "Index",
-                            "validators": [
-                                {
-                                    "type": "string",
-                                    "errorMsg": "Length of index name should be between 1 and 80.",
-                                    "minLength": 1,
-                                    "maxLength": 80
-                                }
-                            ],
-                            "defaultValue": "default",
-                            "options": {
-                                "endpointUrl": "data/indexes",
-                                "denyList": "^_.*$",
-                                "createSearchChoice": true
-                            },
-                            "field": "index",
-                            "required": true
-                        },
-                        {
-                            "type": "singleSelect",
-                            "label": "Example Account",
-                            "options": {
-                                "referenceName": "account"
-                            },
-                            "help": "",
-                            "field": "account",
-                            "required": true
-                        },
-                        {
-                            "type": "text",
-                            "label": "Object",
-                            "validators": [
-                                {
-                                    "type": "string",
-                                    "errorMsg": "Max length of text input is 8192",
-                                    "minLength": 0,
-                                    "maxLength": 8192
-                                }
-                            ],
-                            "field": "object",
-                            "help": "The name of the object to query for.",
-                            "required": true
-                        },
-                        {
-                            "type": "text",
-                            "label": "Object Fields",
-                            "validators": [
-                                {
-                                    "type": "string",
-                                    "errorMsg": "Max length of text input is 8192",
-                                    "minLength": 0,
-                                    "maxLength": 8192
-                                }
-                            ],
-                            "field": "object_fields",
-                            "help": "Object fields from which to collect data. Delimit multiple fields using a comma.",
-                            "required": true
-                        },
-                        {
-                            "type": "text",
-                            "label": "Order By",
-                            "validators": [
-                                {
-                                    "type": "string",
-                                    "errorMsg": "Max length of text input is 8192",
-                                    "minLength": 0,
-                                    "maxLength": 8192
-                                }
-                            ],
-                            "defaultValue": "LastModifiedDate",
-                            "field": "order_by",
-                            "help": "The datetime field by which to query results in ascending order for indexing.",
-                            "required": true
-                        },
-                        {
-                            "type": "radio",
-                            "label": "Use existing data input?",
-                            "field": "use_existing_checkpoint",
-                            "defaultValue": "yes",
-                            "help": "Data input already exists. Select `No` if you want to reset the data collection.",
-                            "required": false,
-                            "options": {
-                                "items": [
-                                    {
-                                        "value": "yes",
-                                        "label": "Yes"
-                                    },
-                                    {
-                                        "value": "no",
-                                        "label": "No"
-                                    }
-                                ],
-                                "display": false
-                            }
-                        },
-                        {
-                            "type": "text",
-                            "label": "Query Start Date",
-                            "validators": [
-                                {
-                                    "type": "regex",
-                                    "errorMsg": "Invalid date and time format",
-                                    "pattern": "^(\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}.\\d{3}z)?$"
-                                }
-                            ],
-                            "field": "start_date",
-                            "help": "The datetime after which to query and index records, in this format: \"YYYY-MM-DDThh:mm:ss.000z\".\nDefaults to 90 days earlier from now.",
-                            "tooltip": "Changing this parameter may result in gaps or duplication in data collection.",
-                            "required": false
-                        },
-                        {
-                            "type": "text",
-                            "label": "Limit",
-                            "validators": [
-                                {
-                                    "type": "string",
-                                    "errorMsg": "Max length of text input is 8192",
-                                    "minLength": 0,
-                                    "maxLength": 8192
-                                }
-                            ],
-                            "defaultValue": "1000",
-                            "field": "limit",
-                            "help": "The maximum number of results returned by the query.",
-                            "required": false
-                        },
-                        {
-                            "field": "example_help_link",
-                            "label": "",
-                            "type": "helpLink",
-                            "options": {
-                                "text": "Help Link",
-                                "link": "https://docs.splunk.com/Documentation"
-                            }
                         }
                     ],
                     "title": "Example Input One"
@@ -483,78 +94,22 @@
                     {
                         "label": "Name",
                         "field": "name"
-                    },
-                    {
-                        "label": "Account Name",
-                        "field": "account"
-                    },
-                    {
-                        "label": "Interval",
-                        "field": "interval"
-                    },
-                    {
-                        "label": "Index",
-                        "field": "index"
-                    },
-                    {
-                        "label": "Status",
-                        "field": "disabled"
                     }
                 ],
                 "moreInfo": [
                     {
                         "label": "Name",
                         "field": "name"
-                    },
-                    {
-                        "label": "Interval",
-                        "field": "interval"
-                    },
-                    {
-                        "label": "Index",
-                        "field": "index"
-                    },
-                    {
-                        "label": "Status",
-                        "field": "disabled",
-                        "mapping": {
-                            "true": "Disabled",
-                            "false": "Enabled"
-                        }
-                    },
-                    {
-                        "label": "Example Account",
-                        "field": "account"
-                    },
-                    {
-                        "label": "Object",
-                        "field": "object"
-                    },
-                    {
-                        "label": "Object Fields",
-                        "field": "object_fields"
-                    },
-                    {
-                        "label": "Order By",
-                        "field": "order_by"
-                    },
-                    {
-                        "label": "Query Start Date",
-                        "field": "start_date"
-                    },
-                    {
-                        "label": "Limit",
-                        "field": "limit"
                     }
                 ]
             }
         }
     },
     "meta": {
-        "apiVersion": "3.2.0",
         "name": "Splunk_TA_UCCExample",
         "restRoot": "splunk_ta_uccexample",
         "version": "1.0.0",
-        "displayName": "Splunk UCC test Add-on"
+        "displayName": "Splunk UCC test Add-on",
+        "schemaVersion": "0.0.3"
     }
 }
diff --git a/tests/unit/testdata/invalid_config_options_missing_for_file_input.json b/tests/unit/testdata/invalid_config_options_missing_for_file_input.json
new file mode 100644
index 000000000..d82ecf25e
--- /dev/null
+++ b/tests/unit/testdata/invalid_config_options_missing_for_file_input.json
@@ -0,0 +1,67 @@
+{
+    "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*$"
+                                }
+                            ],
+                            "options": {
+                                "placeholder": "Required"
+                            },
+                            "field": "name",
+                            "help": "Enter a unique name for this account.",
+                            "required": true
+                        },
+                        {
+                            "type": "file",
+                            "label": "Upload File",
+                            "help": "Upload service account's certificate",
+                            "field": "service_account",
+                            "encrypted": true,
+                            "required": true
+                        }
+                    ],
+                    "title": "Account"
+                }
+            ],
+            "title": "Configuration",
+            "description": "Set up your add-on"
+        }
+    },
+    "meta": {
+        "name": "Splunk_TA_UCCExample",
+        "restRoot": "splunk_ta_uccexample",
+        "version": "1.0.0",
+        "displayName": "Splunk UCC test Add-on",
+        "schemaVersion": "0.0.3"
+    }
+}
diff --git a/tests/unit/testdata/invalid_config_supported_file_types_field_is_missing.json b/tests/unit/testdata/invalid_config_supported_file_types_field_is_missing.json
index 4eb5b94cf..af42cf6de 100644
--- a/tests/unit/testdata/invalid_config_supported_file_types_field_is_missing.json
+++ b/tests/unit/testdata/invalid_config_supported_file_types_field_is_missing.json
@@ -14,10 +14,6 @@
                             {
                                 "label": "Name",
                                 "field": "name"
-                            },
-                            {
-                                "label": "Auth Type",
-                                "field": "auth_type"
                             }
                         ]
                     },
@@ -45,160 +41,6 @@
                             "help": "Enter a unique name for this account.",
                             "required": true
                         },
-                        {
-                            "type": "singleSelect",
-                            "label": "Example Environment",
-                            "options": {
-                                "disableSearch": true,
-                                "autoCompleteFields": [
-                                    {
-                                        "value": "login.example.com",
-                                        "label": "Value1"
-                                    },
-                                    {
-                                        "value": "test.example.com",
-                                        "label": "Value2"
-                                    },
-                                    {
-                                        "value": "other",
-                                        "label": "Other"
-                                    }
-                                ],
-                                "display": true
-                            },
-                            "help": "",
-                            "field": "custom_endpoint",
-                            "defaultValue": "login.example.com",
-                            "required": true
-                        },
-                        {
-                            "type": "text",
-                            "label": "Endpoint URL",
-                            "help": "Enter the endpoint URL.",
-                            "field": "endpoint",
-                            "options": {
-                                "display": false
-                            }
-                        },
-                        {
-                            "type": "checkbox",
-                            "label": "Example Checkbox",
-                            "field": "account_checkbox",
-                            "help": "This is an example checkbox for the account entity"
-                        },
-                        {
-                            "type": "radio",
-                            "label": "Example Radio",
-                            "field": "account_radio",
-                            "defaultValue": "yes",
-                            "help": "This is an example radio button for the account entity",
-                            "required": true,
-                            "options": {
-                                "items": [{
-                                        "value": "yes",
-                                        "label": "Yes"
-                                    },
-                                    {
-                                        "value": "no",
-                                        "label": "No"
-                                    }
-                                ],
-                                "display": true
-                            }
-                        },
-                        {
-                            "type": "multipleSelect",
-                            "label": "Example Multiple Select",
-                            "field": "account_multiple_select",
-                            "help": "This is an example multipleSelect for account entity",
-                            "required": true,
-                            "options": {
-                                "items": [{
-                                        "value": "one",
-                                        "label": "Option One"
-                                    },
-                                    {
-                                        "value": "two",
-                                        "label": "Option Two"
-                                    }
-                                ]
-                            }
-                        },
-                        {
-                            "type": "text",
-                            "label": "State",
-                            "help": "This is a boolean field for developers to decide whether state parameter will be passed in the OAuth flow. Value: true|false",
-                            "field": "oauth_state_enabled",
-                            "options": {
-                                "display": false
-                            }
-                        },
-                        {
-                            "type": "oauth",
-                            "field": "oauth",
-                            "label": "Not used",
-                            "options": {
-                                "auth_type": [
-                                    "basic",
-                                    "oauth"
-                                ],
-                                "basic": [
-                                    {
-                                        "oauth_field": "username",
-                                        "label": "Username",
-                                        "help": "Enter the username for this account.",
-                                        "field": "username"
-                                    },
-                                    {
-                                        "oauth_field": "password",
-                                        "label": "Password",
-                                        "encrypted": true,
-                                        "help": "Enter the password for this account.",
-                                        "field": "password"
-                                    },
-                                    {
-                                        "oauth_field": "security_token",
-                                        "label": "Security Token",
-                                        "encrypted": true,
-                                        "help": "Enter the security token.",
-                                        "field": "token"
-                                    }
-                                ],
-                                "oauth": [
-                                    {
-                                        "oauth_field": "client_id",
-                                        "label": "Client Id",
-                                        "field": "client_id",
-                                        "help": "Enter the Client Id for this account."
-                                    },
-                                    {
-                                        "oauth_field": "client_secret",
-                                        "label": "Client Secret",
-                                        "field": "client_secret",
-                                        "encrypted": true,
-                                        "help": "Enter the Client Secret key for this account."
-                                    },
-                                    {
-                                        "oauth_field": "redirect_url",
-                                        "label": "Redirect url",
-                                        "field": "redirect_url",
-                                        "help": "Copy and paste this URL into your app."
-                                    }
-                                ],
-                                "auth_code_endpoint": "/services/oauth2/authorize",
-                                "access_token_endpoint": "/services/oauth2/token",
-                                "oauth_timeout": 30
-                            }
-                        },
-                        {
-                            "field": "example_help_link",
-                            "label": "",
-                            "type": "helpLink",
-                            "options": {
-                                "text": "Help Link",
-                                "link": "https://docs.splunk.com/Documentation"
-                            }
-                        },
                         {
                             "type": "file",
                             "label": "Upload File",
@@ -207,11 +49,6 @@
                             "options": {
                                 "fileSupportMessage": "Here is the support message"
                             },
-                            "validators": [
-                                {
-                                    "type": "file"
-                                }
-                            ],
                             "encrypted": true,
                             "required": true
                         }
@@ -224,10 +61,10 @@
         }
     },
     "meta": {
-        "apiVersion": "3.2.0",
         "name": "Splunk_TA_UCCExample",
         "restRoot": "splunk_ta_uccexample",
         "version": "1.0.0",
-        "displayName": "Splunk UCC test Add-on"
+        "displayName": "Splunk UCC test Add-on",
+        "schemaVersion": "0.0.3"
     }
 }
diff --git a/tests/unit/testdata/invalid_config_validators_missing_for_file_input.json b/tests/unit/testdata/invalid_config_validators_missing_for_file_input.json
deleted file mode 100644
index 728872cad..000000000
--- a/tests/unit/testdata/invalid_config_validators_missing_for_file_input.json
+++ /dev/null
@@ -1,228 +0,0 @@
-{
-    "pages": {
-        "configuration": {
-            "tabs": [
-                {
-                    "name": "account",
-                    "table": {
-                        "actions": [
-                            "edit",
-                            "delete",
-                            "clone"
-                        ],
-                        "header": [
-                            {
-                                "label": "Name",
-                                "field": "name"
-                            },
-                            {
-                                "label": "Auth Type",
-                                "field": "auth_type"
-                            }
-                        ]
-                    },
-                    "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*$"
-                                }
-                            ],
-                            "options": {
-                                "placeholder": "Required"
-                            },
-                            "field": "name",
-                            "help": "Enter a unique name for this account.",
-                            "required": true
-                        },
-                        {
-                            "type": "singleSelect",
-                            "label": "Example Environment",
-                            "options": {
-                                "disableSearch": true,
-                                "autoCompleteFields": [
-                                    {
-                                        "value": "login.example.com",
-                                        "label": "Value1"
-                                    },
-                                    {
-                                        "value": "test.example.com",
-                                        "label": "Value2"
-                                    },
-                                    {
-                                        "value": "other",
-                                        "label": "Other"
-                                    }
-                                ],
-                                "display": true
-                            },
-                            "help": "",
-                            "field": "custom_endpoint",
-                            "defaultValue": "login.example.com",
-                            "required": true
-                        },
-                        {
-                            "type": "text",
-                            "label": "Endpoint URL",
-                            "help": "Enter the endpoint URL.",
-                            "field": "endpoint",
-                            "options": {
-                                "display": false
-                            }
-                        },
-                        {
-                            "type": "checkbox",
-                            "label": "Example Checkbox",
-                            "field": "account_checkbox",
-                            "help": "This is an example checkbox for the account entity"
-                        },
-                        {
-                            "type": "radio",
-                            "label": "Example Radio",
-                            "field": "account_radio",
-                            "defaultValue": "yes",
-                            "help": "This is an example radio button for the account entity",
-                            "required": true,
-                            "options": {
-                                "items": [{
-                                        "value": "yes",
-                                        "label": "Yes"
-                                    },
-                                    {
-                                        "value": "no",
-                                        "label": "No"
-                                    }
-                                ],
-                                "display": true
-                            }
-                        },
-                        {
-                            "type": "multipleSelect",
-                            "label": "Example Multiple Select",
-                            "field": "account_multiple_select",
-                            "help": "This is an example multipleSelect for account entity",
-                            "required": true,
-                            "options": {
-                                "items": [{
-                                        "value": "one",
-                                        "label": "Option One"
-                                    },
-                                    {
-                                        "value": "two",
-                                        "label": "Option Two"
-                                    }
-                                ]
-                            }
-                        },
-                        {
-                            "type": "text",
-                            "label": "State",
-                            "help": "This is a boolean field for developers to decide whether state parameter will be passed in the OAuth flow. Value: true|false",
-                            "field": "oauth_state_enabled",
-                            "options": {
-                                "display": false
-                            }
-                        },
-                        {
-                            "type": "oauth",
-                            "field": "oauth",
-                            "label": "Not used",
-                            "options": {
-                                "auth_type": [
-                                    "basic",
-                                    "oauth"
-                                ],
-                                "basic": [
-                                    {
-                                        "oauth_field": "username",
-                                        "label": "Username",
-                                        "help": "Enter the username for this account.",
-                                        "field": "username"
-                                    },
-                                    {
-                                        "oauth_field": "password",
-                                        "label": "Password",
-                                        "encrypted": true,
-                                        "help": "Enter the password for this account.",
-                                        "field": "password"
-                                    },
-                                    {
-                                        "oauth_field": "security_token",
-                                        "label": "Security Token",
-                                        "encrypted": true,
-                                        "help": "Enter the security token.",
-                                        "field": "token"
-                                    }
-                                ],
-                                "oauth": [
-                                    {
-                                        "oauth_field": "client_id",
-                                        "label": "Client Id",
-                                        "field": "client_id",
-                                        "help": "Enter the Client Id for this account."
-                                    },
-                                    {
-                                        "oauth_field": "client_secret",
-                                        "label": "Client Secret",
-                                        "field": "client_secret",
-                                        "encrypted": true,
-                                        "help": "Enter the Client Secret key for this account."
-                                    },
-                                    {
-                                        "oauth_field": "redirect_url",
-                                        "label": "Redirect url",
-                                        "field": "redirect_url",
-                                        "help": "Copy and paste this URL into your app."
-                                    }
-                                ],
-                                "auth_code_endpoint": "/services/oauth2/authorize",
-                                "access_token_endpoint": "/services/oauth2/token",
-                                "oauth_timeout": 30
-                            }
-                        },
-                        {
-                            "field": "example_help_link",
-                            "label": "",
-                            "type": "helpLink",
-                            "options": {
-                                "text": "Help Link",
-                                "link": "https://docs.splunk.com/Documentation"
-                            }
-                        },
-                        {
-                            "type": "file",
-                            "label": "Upload File",
-                            "help": "Upload service account's certificate",
-                            "field": "service_account",
-                            "options": {
-                                "fileSupportMessage": "Here is the support message"
-                            },
-                            "encrypted": true,
-                            "required": true
-                        }
-                    ],
-                    "title": "Account"
-                }
-            ],
-            "title": "Configuration",
-            "description": "Set up your add-on"
-        }
-    },
-    "meta": {
-        "apiVersion": "3.2.0",
-        "name": "Splunk_TA_UCCExample",
-        "restRoot": "splunk_ta_uccexample",
-        "version": "1.0.0",
-        "displayName": "Splunk UCC test Add-on"
-    }
-}
diff --git a/tests/unit/testdata/server.conf.generated b/tests/unit/testdata/server.conf.generated
new file mode 100644
index 000000000..f0fd09c58
--- /dev/null
+++ b/tests/unit/testdata/server.conf.generated
@@ -0,0 +1,5 @@
+[shclustering]
+conf_replication_include.splunk_ta_ucc_example_settings = true
+conf_replication_include.splunk_ta_ucc_example_account = true
+conf_replication_include.splunk_ta_ucc_example_oauth = true
+
diff --git a/tests/unit/testdata/valid_config.json b/tests/unit/testdata/valid_config.json
index cc5a93777..601800458 100644
--- a/tests/unit/testdata/valid_config.json
+++ b/tests/unit/testdata/valid_config.json
@@ -216,14 +216,9 @@
                             "help": "Upload service account's certificate",
                             "field": "service_account",
                             "options": {
-                                "fileSupportMessage": "Here is the support message"
+                                "fileSupportMessage": "Here is the support message",
+                                "supportedFileTypes": ["json", "pem"]
                             },
-                            "validators": [
-                                {
-                                    "type": "file",
-                                    "supportedFileTypes": ["json"]
-                                }
-                            ],
                             "encrypted": true,
                             "required": true
                         }
@@ -1044,7 +1039,7 @@
                     "type": "singleSelectSplunkSearch",
                     "label": "Select Account",
                     "field": "account",
-                    "search": "| rest /servicesNS/nobody/TA-SNOW/admin/TA_SNOW_account | dedup title",
+                    "search": "| rest /servicesNS/nobody/Splunk_TA_UCCExample/splunk_ta_uccexample_account | dedup title",
                     "valueField": "title",
                     "labelField": "title",
                     "help": "Select the account from the dropdown",
@@ -1054,10 +1049,10 @@
         }
     ],
     "meta": {
-        "apiVersion": "3.2.0",
         "name": "Splunk_TA_UCCExample",
         "restRoot": "splunk_ta_uccexample",
         "version": "1.0.0",
-        "displayName": "Splunk UCC test Add-on"
+        "displayName": "Splunk UCC test Add-on",
+        "schemaVersion": "0.0.3"
     }
 }
diff --git a/tests/unit/testdata/valid_config.yaml b/tests/unit/testdata/valid_config.yaml
index 74d0fcd6a..fd84695f7 100644
--- a/tests/unit/testdata/valid_config.yaml
+++ b/tests/unit/testdata/valid_config.yaml
@@ -147,10 +147,9 @@ pages:
         label: Upload file
         options:
           fileSupportMessage: Here is the support message
-        validators:
-        - type: file
           supportedFileTypes:
-          - json
+            - json
+            - pem
       title: Account
     - name: proxy
       entity:
@@ -663,14 +662,14 @@ alerts:
   - type: singleSelectSplunkSearch
     label: Select Account
     field: account
-    search: "| rest /servicesNS/nobody/TA-SNOW/admin/TA_SNOW_account | dedup title"
+    search: "| rest /servicesNS/nobody/Splunk_TA_UCCExample/splunk_ta_uccexample_account | dedup title"
     valueField: title
     labelField: title
     help: Select the account from the dropdown
     required: true
 meta:
-  apiVersion: 3.2.0
   name: Splunk_TA_UCCExample
   restRoot: splunk_ta_uccexample
   version: 1.0.0
   displayName: Splunk UCC test Add-on
+  schemaVersion: 0.0.3