diff --git a/Trigger/TrigValidation/TrigValTools/python/TrigValSteering/Common.py b/Trigger/TrigValidation/TrigValTools/python/TrigValSteering/Common.py
index 6f1e810a724b9b7f072af77b219c6a2fc02e33d5..0fe433fef1191ef7e85c280d05e25cf3017ec943 100644
--- a/Trigger/TrigValidation/TrigValTools/python/TrigValSteering/Common.py
+++ b/Trigger/TrigValidation/TrigValTools/python/TrigValSteering/Common.py
@@ -9,6 +9,8 @@ Common variables and functions used in Trigger ART test steering
 import logging
 import sys
 import os
+import subprocess
+from PyUtils.Decorators import memoize
 
 
 # Logging level used across the package
@@ -32,7 +34,7 @@ def get_logger():
     '''Default TrigValSteering logger'''
     logging.basicConfig(stream=sys.stdout,
                         format='%(asctime)s %(name)s %(levelname)-8s %(message)s',
-                        datefmt='%Y-%m-%dT%H%M %Z',
+                        datefmt='%Y-%m-%dT%H%M%S %Z',
                         level=trigvalsteering_logging_level)
     return logging.getLogger('TrigValSteering')
 
@@ -51,3 +53,18 @@ def clear_art_summary():
 
     if os.path.isfile(art_result_summary):
         os.remove(art_result_summary)
+
+
+@memoize
+def check_job_options(jo_path):
+    '''Check if the job options file exists locally or in PATH'''
+    # Check if job options existi locally
+    if os.path.isfile(jo_path):
+        return True
+    # Try to find the file in PATH
+    get_files_output = subprocess.check_output(
+        'get_files -jo -list {}'.format(jo_path), shell=True)
+    if 'nothing found' in get_files_output.decode():
+        return False
+    else:
+        return True
diff --git a/Trigger/TrigValidation/TrigValTools/python/TrigValSteering/ExecStep.py b/Trigger/TrigValidation/TrigValTools/python/TrigValSteering/ExecStep.py
index 170e189fcf4e89e7f75db5a2a007b1d9dcce042a..9b30191bff1103a421cb900b10541d5bd01a2aaf 100644
--- a/Trigger/TrigValidation/TrigValTools/python/TrigValSteering/ExecStep.py
+++ b/Trigger/TrigValidation/TrigValTools/python/TrigValSteering/ExecStep.py
@@ -8,10 +8,10 @@ Definitions of exec steps (main job) in Trigger ART tests
 
 import sys
 import os
-import subprocess
 
 from TrigValTools.TrigValSteering.Step import Step
 from TrigValTools.TrigValSteering.Input import is_input_defined, get_input
+from TrigValTools.TrigValSteering.Common import check_job_options
 
 
 class ExecStep(Step):
@@ -67,6 +67,7 @@ class ExecStep(Step):
         super(ExecStep, self).configure(test)
 
     def configure_type(self):
+        self.log.debug('Configuring type for step %s', self.name)
         # Check if type or executable is specified
         if self.type is None and self.executable is None:
             self.log.error('Cannot configure a step without specified type '
@@ -90,6 +91,7 @@ class ExecStep(Step):
             sys.exit(1)
 
     def configure_input(self):
+        self.log.debug('Configuring input for step %s', self.name)
         if self.input is None:
             self.log.error(
                 'Input not provided for step %s. To configure '
@@ -122,6 +124,7 @@ class ExecStep(Step):
 
     def configure_job_options(self):
         '''Check job options configuration'''
+        self.log.debug('Configuring job options for step %s', self.name)
         if self.type == 'other':
             self.log.debug('Skipping job options check for step.type=other')
             return
@@ -139,19 +142,15 @@ class ExecStep(Step):
             self.report_result(1, 'TestConfig')
             sys.exit(1)
         # Check if job options exist
-        if os.path.isfile(self.job_options):
+        if check_job_options(self.job_options):
             self.log.debug('Job options file exists: %s', self.job_options)
-            return
-        # Try to find the file in PATH
-        get_files_output = subprocess.check_output(
-            'get_files -jo -list {}'.format(self.job_options), shell=True)
-        if 'nothing found' in get_files_output.decode():
+        else:
             self.log.error('Failed to find job options file %s', self.name)
             self.report_result(1, 'TestConfig')
             sys.exit(1)
-        self.log.debug('Job options file exists: %s', self.job_options)
 
     def configure_args(self, test):
+        self.log.debug('Configuring args for step %s', self.name)
         if self.args is None:
             self.args = ''
         athenaopts = ''
diff --git a/Trigger/TrigValidation/TrigValTools/python/TrigValSteering/Input.py b/Trigger/TrigValidation/TrigValTools/python/TrigValSteering/Input.py
index d34b371340e2f7a8e3242c8e80dc3c99b7af1657..64b5a937c9934542caaeab9d21ee55b1fb20d236 100644
--- a/Trigger/TrigValidation/TrigValTools/python/TrigValSteering/Input.py
+++ b/Trigger/TrigValidation/TrigValTools/python/TrigValSteering/Input.py
@@ -12,6 +12,7 @@ import os
 import json
 
 from TrigValTools.TrigValSteering.Common import get_logger
+from PyUtils.Decorators import memoize
 
 
 input_json = 'TrigValTools/TrigValInputs.json'
@@ -71,6 +72,7 @@ class TrigValInput(object):
         return True
 
 
+@memoize
 def load_input_json():
     '''Reads the json file with input definitions and returns the data as dictionary'''
 
diff --git a/Trigger/TrigValidation/TrigValTools/python/TrigValSteering/Test.py b/Trigger/TrigValidation/TrigValTools/python/TrigValSteering/Test.py
index 006138d48a61a44aceadd108d0f7230ffe6dd86e..99127722069aaa181af6a0eb550710201482761f 100644
--- a/Trigger/TrigValidation/TrigValTools/python/TrigValSteering/Test.py
+++ b/Trigger/TrigValidation/TrigValTools/python/TrigValSteering/Test.py
@@ -40,6 +40,7 @@ class Test(object):
         for step in self.exec_steps:
             step.configure(self)
         for step in self.check_steps:
+            self.log.debug('Configuring check step %s', step.name)
             step.configure(self)
 
         duplicate_names = self.duplicate_step_names()