diff --git a/lava_helper/jinja2_templates/template_tfm_mps2_sse_200.jinja2 b/lava_helper/jinja2_templates/template_tfm_mps2_sse_200.jinja2
new file mode 100644
index 0000000..858e71f
--- /dev/null
+++ b/lava_helper/jinja2_templates/template_tfm_mps2_sse_200.jinja2
@@ -0,0 +1,73 @@
+{#------------------------------------------------------------------------------
+# Copyright (c) 2018-2019, Arm Limited and Contributors. All rights reserved.
+#
+# SPDX-License-Identifier: BSD-3-Clause
+#
+#-----------------------------------------------------------------------------#}
+device_type: {{ device_type }}
+job_name: {{ job_name }}
+
+timeouts:
+  job:
+    minutes: {{ job_timeout }}
+  action:
+    minutes: {{ action_timeout }}
+  connections:
+    lava-test-monitor:
+      minutes: {{ monitor_timeout }}
+
+priority: medium
+visibility: public
+
+actions:
+{%- for platform, recovery in platforms.items() -%}
+  {%- for compiler in compilers %}
+    {%- for build_type in build_types %}
+      {%- for boot_type in boot_types %}
+        {%- for name, test in tests.items() -%}
+    - deploy:
+        to: mps
+        images:
+          recovery_image:
+            url: {{ recovery_store_url }}/lastSuccessfulBuild/artifact/{{ recovery }}
+            compression: gz
+        namespace: target
+
+    - deploy:
+        to: mps
+        images:
+          test_binary:
+            url: {{artifact_store_url}}/{{ build_no}}/artifact/build-ci-all/{{ platform }}_{{ compiler }}_Config{{ name }}_{{ build_type }}_{{ boot_type }}/{{ test.binaries.firmware }}
+        namespace: target
+
+    - deploy:
+        to: mps
+        images:
+          test_binary:
+            url: {{artifact_store_url}}/{{ build_no}}/artifact/build-ci-all/{{ platform }}_{{ compiler }}_Config{{ name }}_{{ build_type }}_{{ boot_type }}/{{ test.binaries.bootloader }}
+        namespace: target
+
+    - boot:
+        method: minimal
+        timeout:
+          minutes: 10
+        namespace: target
+
+    - test:
+        namespace: target
+        delay: 5
+        monitors:
+        {%- for monitor in test.monitors %}
+        - name: "{{monitor.name}}_{{ platform }}_{{ compiler }}_{{ name }}_{{ build_type }}_{{ boot_type }}"
+          start: "{{monitor.start}}"
+          end: "{{monitor.end}}"
+          pattern: "{{monitor.pattern}}"
+          fixupdict:
+             '{{monitor.fixup.pass}}': pass
+             '{{monitor.fixup.fail}}': fail
+        {%- endfor %}
+        {%- endfor %}
+      {%- endfor %}
+    {%- endfor %}
+  {%- endfor %}
+{%- endfor %}
diff --git a/lava_helper/lava_helper.py b/lava_helper/lava_helper.py
new file mode 100755
index 0000000..4e8ed88
--- /dev/null
+++ b/lava_helper/lava_helper.py
@@ -0,0 +1,445 @@
+#!/usr/bin/env python3 -u
+
+""" lava_helper.py:
+
+    Generate custom defined LAVA definitions redered from Jinja2 templates.
+    It can also parse the yaml output of LAVA and verify the test outcome """
+
+from __future__ import print_function
+
+__copyright__ = """
+/*
+ * Copyright (c) 2018-2019, Arm Limited. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ *
+ */
+ """
+__author__ = "Minos Galanakis"
+__email__ = "minos.galanakis@linaro.org"
+__project__ = "Trusted Firmware-M Open CI"
+__status__ = "stable"
+__version__ = "1.0"
+
+import os
+import sys
+import argparse
+from copy import deepcopy
+from collections import OrderedDict
+from jinja2 import Environment, FileSystemLoader
+from lava_helper_configs import *
+
+try:
+    from tfm_ci_pylib.utils import save_json, load_json, sort_dict,\
+        load_yaml, test
+    from tfm_ci_pylib.lava_rpc_connector import LAVA_RPC_connector
+except ImportError:
+    dir_path = os.path.dirname(os.path.realpath(__file__))
+    sys.path.append(os.path.join(dir_path, "../"))
+    from tfm_ci_pylib.utils import save_json, load_json, sort_dict,\
+        load_yaml, test
+    from tfm_ci_pylib.lava_rpc_connector import LAVA_RPC_connector
+
+
+def sort_lavagen_config(cfg):
+    """ Create a constact dictionary object. This method is tailored for
+    the complicated configuration structure of this module """
+
+    res = OrderedDict()
+    if sorted(lavagen_config_sort_order) == sorted(cfg.keys()):
+        item_list = sorted(cfg.keys(),
+                           key=lambda x: lavagen_config_sort_order.index(x))
+    else:
+        item_list = sorted(cfg.keys(), key=len)
+    for k in item_list:
+        v = cfg[k]
+        if isinstance(v, dict):
+            res[k] = sort_lavagen_config(v)
+        elif isinstance(v, list) and isinstance(v[0], dict):
+            res[k] = [sort_dict(e, lava_gen_monitor_sort_order) for e in v]
+        else:
+            res[k] = v
+    return res
+
+
+def save_config(cfg_f, cfg_obj):
+    """ Export configuration to json file """
+    save_json(cfg_f, sort_lavagen_config(cfg_obj))
+
+
+def print_configs():
+    """ Print supported configurations """
+
+    print("%(pad)s Built-in configurations: %(pad)s" % {"pad": "*" * 10})
+    for k in lava_gen_config_map.keys():
+        print("\t * %s" % k)
+
+
+def generate_test_definitions(config, work_dir):
+    """ Get a dictionary configuration, and an existing jinja2 template
+    and generate a LAVA compatbile yaml definition """
+
+    template_loader = FileSystemLoader(searchpath=work_dir)
+    template_env = Environment(loader=template_loader)
+
+    # Ensure that the jinja2 template is always rendered the same way
+    config = sort_lavagen_config(config)
+
+    template_file = config.pop("templ")
+
+    definition = template_env.get_template(template_file).render(**config)
+    return definition
+
+
+def generate_lava_job_defs(user_args, config):
+    """ Create a LAVA test job definition file """
+
+    # Evaluate current directory
+    if user_args.work_dir:
+        work_dir = os.path.abspath(user_args.work_dir)
+    else:
+        work_dir = os.path.abspath(os.path.dirname(__file__))
+
+    # If a single platform is requested and it exists in the platform
+    if user_args.platform and user_args.platform in config["platforms"]:
+        # Only test this platform
+        platform = user_args.platform
+        config["platforms"] = {platform: config["platforms"][platform]}
+
+    # Generate the ouptut definition
+    definition = generate_test_definitions(config, work_dir)
+
+    # Write it into a file
+    out_file = os.path.abspath(user_args.lava_def_output)
+    with open(out_file, "w") as F:
+        F.write(definition)
+
+    print("Definition created at %s" % out_file)
+
+
+def test_map_from_config(lvg_cfg=tfm_mps2_sse_200):
+    """ Extract all required information from a lavagen config map
+    and generate a map of required tests, indexed by test name """
+
+    test_map = {}
+    suffix_l = []
+    for p in lvg_cfg["platforms"]:
+        for c in lvg_cfg["compilers"]:
+            for bd in lvg_cfg["build_types"]:
+                for bt in lvg_cfg["boot_types"]:
+                    suffix_l.append("%s_%s_%s_%s_%s" % (p, c, "%s", bd, bt))
+
+    for test_cfg_name, tst in lvg_cfg["tests"].items():
+        for monitor in tst["monitors"]:
+            for suffix in suffix_l:
+                key = (monitor["name"] + "_" + suffix % test_cfg_name).lower()
+                # print (monitor['required'])
+                test_map[key] = monitor['required']
+
+    return deepcopy(test_map)
+
+
+def test_lava_results(user_args, config):
+    """ Uses input of a test config dictionary and a LAVA summary Files
+    and determines if the test is a successful or not """
+
+    # Parse command line arguments to override config
+    result_raw = load_yaml(user_args.lava_results)
+
+    test_map = test_map_from_config(config)
+    t_dict = {k: {} for k in test_map}
+
+    # Return true if test is contained in test_groups
+    def test_filter(x):
+        return x["metadata"]['definition'] in test_map
+
+    # Create a dictionary with common keys as the test map and test results
+    # {test_suite: {test_name: pass/fail}}
+    def format_results(x):
+        t_dict[x["metadata"]["definition"]].update({x["metadata"]["case"]:
+                                                    x["metadata"]["result"]})
+
+    # Remove all irelevant entries from data
+    test_results = list(filter(test_filter, result_raw))
+
+    # Call the formatter
+    list(map(format_results, test_results))
+
+    #  We need to check that each of the tests contained in the test_map exist
+    #  AND that they have a passed status
+    t_sum = 0
+    for k, v in t_dict.items():
+        try:
+            t_sum += int(test(test_map[k],
+                         v,
+                         pass_text=["pass"],
+                         error_on_failed=False,
+                         test_name=k,
+                         summary=user_args.lava_summary)["success"])
+        # Status can be None if a test did't fully run/complete
+        except TypeError as E:
+            t_sum = 1
+
+    # Every single of the tests need to have passed for group to succeed
+    if t_sum != len(t_dict):
+        print("Group Testing FAILED!")
+        sys.exit(1)
+    print("Group Testing PASS!")
+
+
+def test_lava_dispatch_credentials(user_args):
+    """ Will validate if provided token/credentials are valid. It will return
+    a valid connection or exit program if not"""
+
+    # Collect the authentication tokens
+    try:
+        if user_args.token_from_env:
+            usr = os.environ['LAVA_USER']
+            secret = os.environ['LAVA_TOKEN']
+        elif user_args.token_usr and user_args.token_secret:
+            usr = user_args.token_usr
+            secret = user_args.token_secret
+
+        # Do not submit job without complete credentials
+        if not len(usr) or not len(secret):
+            raise Exception("Credentials not set")
+
+        lava = LAVA_RPC_connector(usr,
+                                  secret,
+                                  user_args.lava_url,
+                                  user_args.lava_rpc)
+
+        # Test the credentials againist the backend
+        if not lava.test_credentials():
+            raise Exception("Server rejected user authentication")
+    except Exception as e:
+        print("Credential validation failed with : %s" % e)
+        print("Did you set set --lava_token_usr, --lava_token_secret?")
+        sys.exit(1)
+    return lava
+
+
+def lava_dispatch(user_args):
+    """ Submit a job to LAVA backend, block untill it is completed, and
+    fetch the results files if successful. If not, calls sys exit with 1
+    return code """
+
+    lava = test_lava_dispatch_credentials(user_args)
+    job_id, job_url = lava.submit_job(user_args.dispatch)
+    print("Job submitted at: " + job_url)
+    with open("lava_job.id", "w") as F:
+        F.write(str(job_id))
+    print("Job id %s stored at lava_job.id file." % job_id)
+
+    # Wait for the job to complete
+    status = lava.block_wait_for_job(job_id, int(user_args.dispatch_timeout))
+    print("Job %s returned with status: %s" % (job_id, status))
+    if status == "Complete":
+        lava.get_job_results(job_id, user_args.lava_job_results)
+        print("Job results exported at: %s" % user_args.lava_job_results)
+        sys.exit(0)
+    sys.exit(1)
+
+
+def dispatch_cancel(user_args):
+    """ Sends a cancell request for user provided job id (dispatch_cancel)"""
+    lava = test_lava_dispatch_credentials(user_args)
+    id = user_args.dispatch_cancel
+    result = lava.cancel_job(id)
+    print("Request to cancell job: %s returned with status %s" % (id, result))
+
+
+def load_config_overrides(user_args):
+    """ Load a configuration from multiple locations and override it with
+    user provided arguemnts """
+
+    if user_args.config_file:
+        print("Loading config from file %s" % user_args.config_file)
+        try:
+            config = load_json(user_args.config_file)
+        except Exception:
+            print("Failed to load config from: %s ." % user_args.config_file)
+            sys.exit(1)
+    else:
+        print("Using built-in config: %s" % user_args.config_key)
+        try:
+            config = lava_gen_config_map[user_args.config_key]
+        except KeyError:
+            print("No template found for config: %s" % user_args.config_key)
+            sys.exit(1)
+
+    config["build_no"] = user_args.build_no
+
+    #  Add the template folder
+    config["templ"] = os.path.join(user_args.template_dir, config["templ"])
+    return config
+
+
+def main(user_args):
+    """ Main logic, forked according to task arguments """
+
+    # If a configuration listing is requested
+    if user_args.ls_config:
+        print_configs()
+        return
+    elif user_args.cconfig:
+        config_key = user_args.cconfig
+        if config_key in lava_gen_config_map.keys():
+            config_file = "lava_job_gen_cfg_%s.json" % config_key
+            save_config(config_file, lava_gen_config_map[config_key])
+            print("Configuration exported at %s" % config_file)
+        return
+    else:
+        config = load_config_overrides(user_args)
+
+    # Configuration is assumed fixed at this point
+    if user_args.lava_results:
+        print("Evaluating File", user_args.lava_results)
+        test_lava_results(user_args, config)
+    elif user_args.dispatch:
+        lava_dispatch(user_args)
+    elif user_args.dispatch_cancel:
+        dispatch_cancel(user_args)
+    elif user_args.create_definition:
+        print("Generating Lava")
+        generate_lava_job_defs(user_args, config)
+    else:
+        print("Nothing to do, please select a task")
+
+
+def get_cmd_args():
+    """ Parse command line arguments """
+
+    # Parse command line arguments to override config
+    parser = argparse.ArgumentParser(description="Lava Helper")
+
+    def_g = parser.add_argument_group('Create LAVA Definition')
+    disp_g = parser.add_argument_group('Dispatch LAVA job')
+    parse_g = parser.add_argument_group('Parse LAVA results')
+    config_g = parser.add_argument_group('Configuration handling')
+    over_g = parser.add_argument_group('Overrides')
+
+    # Configuration control
+    config_g.add_argument("-cn", "--config-name",
+                          dest="config_key",
+                          action="store",
+                          default="tfm_mps2_sse_200",
+                          help="Select built-in configuration by name")
+    config_g.add_argument("-cf", "--config-file",
+                          dest="config_file",
+                          action="store",
+                          help="Load config from external file in JSON format")
+    config_g.add_argument("-te", "--task-config-export",
+                          dest="cconfig",
+                          action="store",
+                          help="Export a json file with the current config "
+                               "parameters")
+    config_g.add_argument("-tl", "--task-config-list",
+                          dest="ls_config",
+                          action="store_true",
+                          default=False,
+                          help="List built-in configurations")
+
+    def_g.add_argument("-tc", "--task-create-definition",
+                       dest="create_definition",
+                       action="store_true",
+                       default=False,
+                       help="Used in conjunction with --config parameters. "
+                            "A LAVA compatible job definition will be created")
+    def_g.add_argument("-cb", "--create-definition-build-no",
+                       dest="build_no",
+                       action="store",
+                       default="lastSuccessfulBuild",
+                       help="JENKINGS Build number selector. "
+                            "Default: lastSuccessfulBuild")
+    def_g.add_argument("-co", "--create-definition-output-file",
+                       dest="lava_def_output",
+                       action="store",
+                       default="job_results.yaml",
+                       help="Set LAVA compatible .yaml output file")
+
+    # Parameter override commands
+    over_g.add_argument("-ow", "--override-work-path",
+                        dest="work_dir",
+                        action="store",
+                        help="Working Directory (absolute path)")
+    over_g.add_argument("-ot", "--override-template-dir",
+                        dest="template_dir",
+                        action="store",
+                        default="jinja2_templates",
+                        help="Set directory where Jinja2 templates are stored")
+    over_g.add_argument("-op", "--override-platform",
+                        dest="platform",
+                        action="store",
+                        help="Override platform.Only the provided one "
+                             "will be tested ")
+    parse_g.add_argument("-tp", "--task-lava-parse",
+                         dest="lava_results",
+                         action="store",
+                         help="Parse provided yaml file, using a configuration"
+                              " as reference to determine the outpcome"
+                              " of testing")
+    parse_g.add_argument("-ls", "--lava-parse-summary",
+                         dest="lava_summary",
+                         default=True,
+                         action="store_true",
+                         help="Print full test summary")
+
+    # Lava job control commands
+    disp_g.add_argument("-td", "--task-dispatch",
+                        dest="dispatch",
+                        action="store",
+                        help="Submit yaml file defined job to backend, and "
+                             "wait for it to complete. \nRequires:"
+                             " --lava_url --lava_token_usr/pass/--"
+                             "lava_token_from_environ arguments, with optional"
+                             "\n--lava_rpc_prefix\n--lava-job-results\n"
+                             "parameters. \nIf not set they get RPC2 and "
+                             "lava_job_results.yaml default values.\n"
+                             "The number job id will be stored at lava_job.id")
+    disp_g.add_argument("-dc", "--dispatch-cancel",
+                        dest="dispatch_cancel",
+                        action="store",
+                        help="Send a cancell request for job with provided id")
+    disp_g.add_argument("-dt", "--dispatch-timeout",
+                        dest="dispatch_timeout",
+                        default="3600",
+                        action="store",
+                        help="Maximum Time to block for job"
+                        " submission to complete")
+    disp_g.add_argument("-dl", "--dispatch-lava-url",
+                        dest="lava_url",
+                        action="store",
+                        help="Sets the lava hostname during job dispatch")
+    disp_g.add_argument("-dr", "--dispatch-lava-rpc-prefix",
+                        dest="lava_rpc",
+                        action="store",
+                        default="RPC2",
+                        help="Application prefix on Backend"
+                             "(i.e www.domain.com/APP)\n"
+                             "By default set to RPC2")
+    disp_g.add_argument("-du", "--dispatch-lava_token_usr",
+                        dest="token_usr",
+                        action="store",
+                        help="Lava user submitting the job")
+    disp_g.add_argument("-ds", "--dispatch-lava_token_secret",
+                        dest="token_secret",
+                        action="store",
+                        help="Hash token used to authenticate"
+                             "user during job submission")
+    disp_g.add_argument("-de", "--dispatch-lava_token_from_environ",
+                        dest="token_from_env",
+                        action="store_true",
+                        help="If set dispatcher will use the enviroment"
+                             "stored $LAVA_USER, $LAVA_TOKEN for credentials")
+    disp_g.add_argument("-df", "--dispatch-lava-job-results-file",
+                        dest="lava_job_results",
+                        action="store",
+                        default="lava_job_results.yaml",
+                        help="Name of the job results file after job is "
+                             "complete. Default: lava_job_results.yaml")
+    return parser.parse_args()
+
+
+if __name__ == "__main__":
+    main(get_cmd_args())
diff --git a/lava_helper/lava_helper_configs.py b/lava_helper/lava_helper_configs.py
new file mode 100644
index 0000000..1ac1479
--- /dev/null
+++ b/lava_helper/lava_helper_configs.py
@@ -0,0 +1,188 @@
+#!/usr/bin/env python3
+
+""" lava_job_generator_configs.py:
+
+    Default configurations for lava job generator """
+
+from __future__ import print_function
+
+__copyright__ = """
+/*
+ * Copyright (c) 2018-2019, Arm Limited. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ *
+ */
+ """
+__author__ = "Minos Galanakis"
+__email__ = "minos.galanakis@linaro.org"
+__project__ = "Trusted Firmware-M Open CI"
+__status__ = "stable"
+__version__ = "1.0"
+
+
+def lava_gen_get_config_subset(config,
+                               default=True,
+                               core=True,
+                               regression=True):
+    """ Allow dynamic generation of configuration combinations by subtracking
+    undesired ones """
+
+    from copy import deepcopy
+    cfg = deepcopy(config)
+    tests = deepcopy(config["tests"])
+
+    # Remove all configs not requests by the caller
+    if not default:
+        tests.pop("Default")
+    if not core:
+        tests.pop("CoreTest")
+    if not regression:
+        tests.pop("Regression")
+
+    cfg["tests"] = tests
+    return cfg
+
+
+tfm_mps2_sse_200 = {
+    "templ": "template_tfm_mps2_sse_200.jinja2",
+    "job_name": "mps2plus-arm-tfm",
+    "device_type": "mps",
+    "job_timeout": 60,
+    "action_timeout": 60,
+    "monitor_timeout": 60,
+    "recovery_store_url": "https://ci.trustedfirmware.org/"
+                          "job/tf-m-build-test-review",
+    "artifact_store_url": "https://ci.trustedfirmware.org/"
+                          "job/tf-m-build-test-review",
+    "platforms": {"AN521": "mps2_sse200_an512.tar.gz"},
+    "compilers": ["GNUARM"],
+    "build_types": ["Debug"],
+    "boot_types": ["BL2"],
+    "tests": {
+        'Default': {
+            "binaries": {
+                "firmware":
+                "install/outputs/AN521/tfm_sign.bin",
+                "bootloader":
+                "install/outputs/AN521/mcuboot.bin"
+            },
+            "monitors": [
+                {
+                    'name': 'Secure_Test_Suites_Summary',
+                    'start': 'Jumping to the first image slot',
+                    'end': '\\x1b\\\[0m',
+                    'pattern': r'\x1b\\[1;34m\\[Sec Thread\\] '
+                               r'(?P<test_case_id>Secure image '
+                               r'initializing)(?P<result>!)',
+                    'fixup': {"pass": "!", "fail": ""},
+                    'required': ["secure_image_initializing"]
+                }  # Monitors
+            ]
+        },  # Default
+        'CoreTest': {
+            "recovery": "mps2_sse200_an512.tar.gz",
+            "binaries": {
+                "firmware": "install/outputs/AN521/tfm_sign.bin",
+                "bootloader": "install/outputs/AN521/mcuboot.bin"
+            },
+            "monitors": [
+                {
+                    'name': 'Non_Secure_Test_Suites_Summary',
+                    'start': 'TFM level is: 3',
+                    'end': 'End of Non-secure test suites',
+                    'pattern': r"[\x1b]\\[37mTest suite '"
+                               r"(?P<test_case_id>.*)' has [\x1b]\\[32m"
+                               r" (?P<result>PASSED|FAILED)",
+                    'fixup': {"pass": "PASSED", "fail": "FAILED"},
+                    'required': [
+                        "core_non_secure_positive_tests_tfm_core_test_1xxx_"]
+                }  # Monitors
+            ]
+        },  # CoreTest
+        'Regression': {
+            "recovery": "mps2_sse200_an512.tar.gz",
+            "binaries": {
+                "firmware": "install/outputs/AN521/tfm_sign.bin",
+                "bootloader": "install/outputs/AN521/mcuboot.bin"
+            },
+            "monitors": [
+                {
+                    'name': 'Secure_Test_Suites_Summary',
+                    'start': 'Secure test suites summary',
+                    'end': 'End of Secure test suites',
+                    'pattern': r"[\x1b]\\[37mTest suite '(?P<"
+                               r"test_case_id>.*)' has [\x1b]\\[32m "
+                               r"(?P<result>PASSED|FAILED)",
+                    'fixup': {"pass": "PASSED", "fail": "FAILED"},
+                    'required': [
+                        "invert_secure_interface_tests_tfm_invert_test_1xxx_",
+                        "sst_reliability_tests_tfm_sst_test_3xxx_",
+                        "sst_secure_interface_tests_tfm_sst_test_2xxx_"
+                    ]
+                },
+                {
+                    'name': 'Non_Secure_Test_Suites_Summary',
+                    'start': 'Non-secure test suites summary',
+                    'end': r'End of Non-secure test suites',
+                    'pattern': r"[\x1b]\\[37mTest suite '(?P"
+                               r"<test_case_id>.*)' has [\x1b]\\[32m "
+                               r"(?P<result>PASSED|FAILED)",
+                    'fixup': {"pass": "PASSED", "fail": "FAILED"},
+                    'required': [
+                        "core_non_secure_positive_tests_tfm_core_test_1xxx_",
+                        ("invert_non_secure_interface_tests_"
+                         "tfm_invert_test_1xxx_"),
+                        "sst_policy_tests_tfm_sst_test_4xxx_",
+                        "sst_non_secure_interface_tests_tfm_sst_test_1xxx_",
+                        "sst_referenced_access_tests_tfm_sst_test_5xxx_"]
+                }
+            ]  # Monitors
+        },  # Regression
+    }  # Tests
+}
+
+# All configurations should be mapped here
+lava_gen_config_map = {"tfm_mps2_sse_200": tfm_mps2_sse_200}
+lavagen_config_sort_order = [
+    "templ",
+    "job_name",
+    "device_type",
+    "job_timeout",
+    "action_timeout",
+    "monitor_timeout",
+    "recovery_store_url",
+    "artifact_store_url",
+    "platforms",
+    "compilers",
+    "build_types",
+    "boot_types",
+    "tests"
+]
+
+lava_gen_monitor_sort_order = [
+    'name',
+    'start',
+    'end',
+    'pattern',
+    'fixup',
+]
+
+if __name__ == "__main__":
+    import os
+    import sys
+    from lava_helper import sort_lavagen_config
+    try:
+        from tfm_ci_pylib.utils import export_config_map
+    except ImportError:
+        dir_path = os.path.dirname(os.path.realpath(__file__))
+        sys.path.append(os.path.join(dir_path, "../"))
+        from tfm_ci_pylib.utils import export_config_map
+
+    if len(sys.argv) == 2:
+        if sys.argv[1] == "--export":
+            export_config_map(lava_gen_config_map)
+    if len(sys.argv) == 3:
+        if sys.argv[1] == "--export":
+            export_config_map(sort_lavagen_config(lava_gen_config_map),
+                              sys.argv[2])
