diff --git a/Trigger/TrigValidation/TrigValTools/share/TrigValInputs.json b/Trigger/TrigValidation/TrigValTools/share/TrigValInputs.json
index 9cd4528a0e8d1decc6d3c9ffef72843e5b6ac2ad..cfa375e08b886fea0a8c08ec969a8196b183ca52 100644
--- a/Trigger/TrigValidation/TrigValTools/share/TrigValInputs.json
+++ b/Trigger/TrigValidation/TrigValTools/share/TrigValInputs.json
@@ -20,6 +20,13 @@
             "/cvmfs/atlas-nightlies.cern.ch/repo/data/data-art/TrigAnalysisTest/data12_8TeV.00209109.physics_JetTauEtmiss.merge.RAW._lb0186._SFO-1._0001.1"
         ]
     },
+    "data_run3": {
+        "source": "data",
+        "format": "BS",
+        "paths": [
+            "/cvmfs/atlas-nightlies.cern.ch/repo/data/data-art/TrigP1Test/data20_test/data_test.00374861.physics_Main.daq.RAW._lb0004._SFO-1._0001.data"
+        ]
+    },
     "data_cos": {
         "source": "data",
         "format": "BS",
diff --git a/Trigger/TriggerCommon/TriggerJobOpts/CMakeLists.txt b/Trigger/TriggerCommon/TriggerJobOpts/CMakeLists.txt
index d4e9e276f07d8312b01eeea8ff0e8c79a394a7a1..398e23f4ecf798144988ac5ec869b45ffd79e121 100644
--- a/Trigger/TriggerCommon/TriggerJobOpts/CMakeLists.txt
+++ b/Trigger/TriggerCommon/TriggerJobOpts/CMakeLists.txt
@@ -15,3 +15,7 @@ atlas_add_test( TriggerConfigFlagsTest
 atlas_add_test( TriggerConfigTest
    SCRIPT python -m TriggerJobOpts.TriggerConfig
    POST_EXEC_SCRIPT nopost.sh )
+
+atlas_add_test( TriggerConfigFlags_AutoConfTest
+   SCRIPT test_TriggerFlags_autoconf.py
+   POST_EXEC_SCRIPT nopost.sh )
diff --git a/Trigger/TriggerCommon/TriggerJobOpts/python/TriggerConfigFlags.py b/Trigger/TriggerCommon/TriggerJobOpts/python/TriggerConfigFlags.py
index 0856c480cb1a8de29aaa60e89ae8c655f3181719..495b9234cb360cf9560262e10974046c2a131d2c 100644
--- a/Trigger/TriggerCommon/TriggerJobOpts/python/TriggerConfigFlags.py
+++ b/Trigger/TriggerCommon/TriggerJobOpts/python/TriggerConfigFlags.py
@@ -46,69 +46,90 @@ def createTriggerFlags():
     # Enable calorimeters
     flags.addFlag('Trigger.doCalo', True)
 
-    # if 1, Run1 decoding version is set; if 2, Run2; if 3, Run 3 
+    # if 1, Run1 decoding version is set; if 2, Run2; if 3, Run 3
     def EDMDecodingVersion(flags):
-        log.debug("Attempting to determine EDMDecodingVersion.")
-        version = 3
+        '''
+        Determine Trigger EDM version based on the input file. For ByteStream, Run-3 EDM is indicated
+        by HLT ROD version > 1.0, for both Runs 1 and 2 the HLT ROD version was 0.0 and the run number
+        is used to disambiguate between them. For POOL inputs, the EDM version is determined based on
+        finding a characteristic HLT navigation collection in the file.
+        '''
+        _log = logging.getLogger('TriggerConfigFlags.EDMDecodingVersion')
+        _log.debug("Attempting to determine EDMDecodingVersion")
+        default_version = 3
         if flags.Input.Format=="BS":
-            log.debug("EDMDecodingVersion: Input format is ByteStream")
+            _log.debug("Input format is ByteStream")
             inputFileName = flags.Input.Files[0]
             if not inputFileName and flags.Common.isOnline():
-                log.debug("EDMDecodingVersion: Online reconstruction, no input file. Return default version, i.e. AthenaMT.")
-                return version
+                _log.info("Online reconstruction, no input file. Return default EDMDecodingVersion=%d", default_version)
+                return default_version
 
-            log.debug("EDMDecodingVersion: Checking ROD version.")
+            _log.debug("Checking ROD version")
             import eformat
             from libpyeformat_helper import SubDetector
             bs = eformat.istream(inputFileName)
 
-            rodVersionM = -1                                                                                                
-            rodVersionL = -1                                                                                                
-            # Find the first HLT ROBFragment in the first event                                                             
-            for robf in bs[0]:                                                                                              
-                if robf.rob_source_id().subdetector_id()==SubDetector.TDAQ_HLT:                                             
-                    rodVersionM = robf.rod_minor_version() >> 8                                                             
-                    rodVersionL = robf.rod_minor_version() & 0xFF                                                           
-                    log.debug("EDMDecodingVersion: HLT ROD minor version from input file is {:d}.{:d}".format(rodVersionM, rodVersionL))
-                    break                                                                                                   
-
-            if rodVersionM >= 1:
-                version = 3
-                return version
-            log.info("EDMDecodingVersion: Could not determine ROD version -- falling back to run-number-based determination")
-
-            # Use run number to determine decoding version
+            rodVersionM = -1
+            rodVersionL = -1
+            # Find the first HLT ROBFragment in the first event
+            for robf in bs[0]:
+                if robf.rob_source_id().subdetector_id()==SubDetector.TDAQ_HLT:
+                    rodVersionM = robf.rod_minor_version() >> 8
+                    rodVersionL = robf.rod_minor_version() & 0xFF
+                    _log.debug("HLT ROD minor version from input file is %d.%d", rodVersionM, rodVersionL)
+                    break
+
+            # Case 1: failed to read ROD version
+            if rodVersionM < 0 or rodVersionL < 0:
+                _log.warning("Cannot determine HLT ROD version from input file, falling back to run-number-based decision")
+            # Case 2: ROD version indicating Run 3
+            elif rodVersionM >= 1:
+                _log.info("Determined EDMDecodingVersion to be 3, because running on BS file with HLT ROD version %d.%d",
+                          rodVersionM, rodVersionL)
+                return 3
+            # Case 3: ROD version indicating Run 1 or 2 - use run number to disambiguate
             runNumber = flags.Input.RunNumber[0]
-            log.debug("EDMDecodingVersion: Read run number {}.".format(runNumber))
+            _log.debug("Read run number %s", runNumber)
 
             boundary_run12 = 230000
             boundary_run23 = 368000
 
-            if runNumber <= 0:
-                log.warning("EDMDecodingVersion: Cannot determine decoding version because run number {} is invalid. Leaving the default version.".format(runNumber))
+            if not runNumber or runNumber <= 0:
+                _log.warning("Cannot determine EDM version because run number %s is invalid. "
+                             "Return default EDMDecodingVersion=%d", runNumber, default_version)
+                return default_version
             elif runNumber < boundary_run12:
                 # Run-1 data
-                version = 1
+                _log.info("Determined EDMDecodingVersion to be 1 based on BS file run number (runNumber < %d)",
+                          boundary_run12)
+                return 1
             elif runNumber < boundary_run23:
                 # Run-2 data
-                version = 2
+                _log.info("Determined EDMDecodingVersion to be 2 based on BS file run number (%d < runNumber < %d)",
+                          boundary_run12, boundary_run23)
+                return 2
             else:
                 # Run-3 data
-                version = 3
+                _log.info("Determined EDMDecodingVersion to be 3 based on BS file run number (runNumber > %d)",
+                          boundary_run23)
+                return 3
         else:
-            log.debug("EDMDecodingVersion: Input format is POOL -- determine from input file collections.")
-            # POOL files: decide based on HLT output type present in file
+            # POOL files: decide based on HLT output type present in the file
+            _log.debug("EDMDecodingVersion: Input format is POOL -- determine from input file collections")
             if "HLTResult_EF" in flags.Input.Collections:
-                version = 1
+                _log.info("Determined EDMDecodingVersion to be 1, because HLTResult_EF found in POOL file")
+                return 1
             elif "TrigNavigation" in flags.Input.Collections:
-                version = 2
+                _log.info("Determined EDMDecodingVersion to be 2, because TrigNavigation found in POOL file")
+                return 2
             elif "HLTNav_Summary" in flags.Input.Collections:
-                version = 3
-            elif flags.Input.Format == "POOL":
-                # If running Trigger on RDO input (without previous trigger result), choose Run-3
-                version = 3
-        log.info("Determined EDMDecodingVersion to be {}.".format({1:"Run 1", 2:"Run 2", 3:"AthenaMT"}[version]))
-        return version
+                _log.info("Determined EDMDecodingVersion to be 3, because HLTNav_Summary found in POOL file")
+                return 3
+
+        _log.warning("Could not determine EDM version from the input file. Return default EDMDecodingVersion=%d",
+                     default_version)
+        return default_version
+
     flags.addFlag('Trigger.EDMDecodingVersion', lambda prevFlags: EDMDecodingVersion(prevFlags))
                      
     # enables additional algorithms colecting MC truth infrmation  (this is only used by IDso maybe we need Trigger.ID.doTruth only?)
diff --git a/Trigger/TriggerCommon/TriggerJobOpts/test/test_TriggerFlags_autoconf.py b/Trigger/TriggerCommon/TriggerJobOpts/test/test_TriggerFlags_autoconf.py
index 0952c3564deda3f63654ffe1e47d1d3a03d262aa..791d3b8da770a79cfbfdb4e023f185621363ada3 100755
--- a/Trigger/TriggerCommon/TriggerJobOpts/test/test_TriggerFlags_autoconf.py
+++ b/Trigger/TriggerCommon/TriggerJobOpts/test/test_TriggerFlags_autoconf.py
@@ -7,29 +7,26 @@
 from AthenaCommon.Logging import logging
 log=logging.getLogger('test_TriggerFlags_autoconf')
 
-import os, glob
-artdir = "/eos/atlas/atlascerngroupdisk/data-art/build-output/master/Athena/x86_64-centos7-gcc8-opt/"
-nightly = os.listdir(artdir)[-2] # don't take the latest; this may still be running
-nightlydir = artdir+nightly+"/"
-
-def getRun2MCFile():
-    filen = "myAOD.pool.root"
-    artdir_21 = "/eos/atlas/atlascerngroupdisk/data-art/grid-output/21.0/Athena/x86_64-slc6-gcc62-opt/"
-    nightly_21 = os.listdir(artdir_21)[-2] # don't take the latest; this may still be running
-    if not os.path.isfile(filen):
-        tarball = glob.glob(artdir_21+nightly_21+"/Tier0ChainTests/test_q220/user.artprod.*.EXT1.*.tar")[0]
-        os.system("tar -xf {} {}".format(tarball,filen))
-    return filen
+import os
+def get_file_from_art(package, test):
+    artdir = "/eos/atlas/atlascerngroupdisk/data-art/build-output/master/Athena/x86_64-centos7-gcc8-opt/"
+    if not os.path.isdir(artdir):
+        log.warning('Cannot access %s', artdir)
+        return None
+    nightly = os.listdir(artdir)[-2] # don't take the latest; this may still be running
+    nightlydir = artdir + nightly + "/"
+    return nightlydir + package + "/" + test + "/AOD.pool.root"
 
+from TrigValTools.TrigValSteering import Input
 inputfiles = {
-    "Run1_Data": "/cvmfs/atlas-nightlies.cern.ch/repo/data/data-art/TrigAnalysisTest/data12_8TeV.00209109.physics_JetTauEtmiss.merge.RAW._lb0186._SFO-1._0001.1",
-    "Run2_Data": "/cvmfs/atlas-nightlies.cern.ch/repo/data/data-art/TrigP1Test/data18_13TeV.00360026.physics_EnhancedBias.merge.RAW._lb0151._SFO-1._0001.1",
-    "Run3_Data": nightlydir+"/TrigP1Test/test_trigP1_v1PhysP1_T0Mon_build/data18_13TeV.00360026.physics_Main.unknown.RAW._lb0151._athenaHLT._0001.data",
+    "Run1_Data": Input.get_input('data_run1').paths[0],
+    "Run2_Data": Input.get_input('data').paths[0],
+    "Run3_Data": Input.get_input('data_run3').paths[0],
     #
-    "Run2_MC_r22": nightlydir+"TrigAnalysisTest/test_trigAna_RDOtoAOD_build/AOD.pool.root",
-    "Run2_MC_r21": getRun2MCFile(),
+    "Run2_MC_r22": get_file_from_art("TrigAnalysisTest", "test_trigAna_RDOtoAOD_v7Primaries_build"),
+    "Run2_MC_r21": '/cvmfs/atlas-nightlies.cern.ch/repo/data/data-art/Tier0ChainTests/q221/21.0/v3/myAOD.pool.root',
     #
-    "Run3_MC": nightlydir+"TrigAnalysisTest/test_trigAna_RDOtoAOD_mt1_build/AOD.pool.root",
+    "Run3_MC": get_file_from_art("TrigAnalysisTest", "test_trigAna_RDOtoAOD_v1Dev_build")
 }
 
 from TriggerJobOpts.TriggerConfigFlags import createTriggerFlags
@@ -41,6 +38,11 @@ tcf_log.setLevel(DEBUG)
 def test_TriggerFlags(sample):
 
     from AthenaConfiguration.AllConfigFlags import ConfigFlags
+    input_file = inputfiles[sample]
+    if not input_file or not os.path.isfile(input_file):
+        log.warning('Skipping %s because cannot access the input file', sample)
+        return
+
     acf = ConfigFlags.clone()
     acf.Input.Files = [inputfiles[sample]]
     acf.addFlagsCategory("Trigger", createTriggerFlags)
@@ -59,7 +61,7 @@ def test_TriggerFlags(sample):
 if __name__=="__main__":
     log.info("Testing TriggerConfigFlags autoconfiguration")
     import sys
-    for sample in sorted(inputfiles.keys()):
+    for sample in inputfiles:
         run, source = sample.split('_',1)
         log.info("{} {} input file: {}".format(run, source, inputfiles[sample]))
         try: