diff --git a/build_helper/build_helper.py b/build_helper/build_helper.py
new file mode 100755
index 0000000..ea8e8f3
--- /dev/null
+++ b/build_helper/build_helper.py
@@ -0,0 +1,119 @@
+#!/usr/bin/env python3
+
+""" build_helper.py:
+
+    Build helper instantiates a build manager with user provided arguments,
+    or default ones.
+     """
+
+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 time
+import argparse
+import datetime
+from build_helper_configs import config_AN521
+
+try:
+    from tfm_ci_pylib.utils import get_cmd_args, load_json
+    from tfm_ci_pylib.tfm_build_manager import TFM_Build_Manager
+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 get_cmd_args, load_json
+    from tfm_ci_pylib.tfm_build_manager import TFM_Build_Manager
+
+
+def build(tfm_dir, build_dir, buid_report_f, build_config):
+    """ Instantiate a build manager class and build all configurations """
+
+    start_time = time.time()
+
+    bm = TFM_Build_Manager(tfm_dir=tfm_dir,
+                           work_dir=build_dir,
+                           cfg_dict=build_config,
+                           report=buid_report_f,
+                           install=True)
+    bm.start()
+    bm.join()
+    build_report = bm.get_report()
+    elapsed = time.time() - start_time
+    elapsed = str(datetime.timedelta(seconds=elapsed))
+    print("=============== Time Elapsed: %s ===================" % elapsed)
+    return bm.get_status(), build_report
+
+
+def main(user_args):
+    """ Main logic """
+
+    if user_args.config_f:
+        try:
+            build_config = load_json(user_args.config_f)
+        except Exception as e:
+            print("Failed to load config %s. Exception: %s" % (build_config,
+                                                               e.msg))
+            sys.exit(1)
+    else:
+        build_config = config_AN521
+    # Build everything
+    build_status, build_report = build(user_args.tfm_dir,
+                                       user_args.build_dir,
+                                       user_args.report,
+                                       build_config)
+
+    if not build_report:
+        print("Build Report Empty, check build status")
+        sys.exit(1)
+
+    if build_status:
+        print("Build Failed")
+        sys.exit(1)
+    # pprint(build_report)
+    print("Build Complete!")
+    sys.exit(0)
+
+
+if __name__ == "__main__":
+
+    # Calcuate the workspace root directory relative to the script location
+    # Equivalent to realpath $(dirname ./build_helper/build_helper.py)/../../
+    root_path = os.path.dirname(os.path.realpath(__file__))
+    for i in range(2):
+        root_path = os.path.split(root_path)[0]
+
+    parser = argparse.ArgumentParser(description="")
+    parser.add_argument("-b", "--build_dir",
+                        dest="build_dir",
+                        action="store",
+                        default="./builds",
+                        help="Where to generate the artifacts")
+    parser.add_argument("-c", "--config_file",
+                        dest="config_f",
+                        action="store",
+                        help="Manual configuration override file (JSON)")
+    parser.add_argument("-r", "--report",
+                        dest="report",
+                        action="store",
+                        help="JSON file containing build report")
+    parser.add_argument("-t", "--tfm_dir",
+                        dest="tfm_dir",
+                        action="store",
+                        default=os.path.join(root_path, "tf-m"),
+                        help="TFM directory")
+
+    main(get_cmd_args(parser=parser))
