diff --git a/Trigger/TriggerCommon/TriggerJobOpts/CMakeLists.txt b/Trigger/TriggerCommon/TriggerJobOpts/CMakeLists.txt
index a29d3c9b4be7a71c5eaeabe52d76e4163bc80737..83b7754a54917f67aa866998a7332b4ef0cf81b8 100644
--- a/Trigger/TriggerCommon/TriggerJobOpts/CMakeLists.txt
+++ b/Trigger/TriggerCommon/TriggerJobOpts/CMakeLists.txt
@@ -12,6 +12,7 @@ atlas_depends_on_subdirs( PUBLIC
 
 # Install files from the package:
 atlas_install_python_modules( python/*.py )
+atlas_install_scripts( test/*.py )
 atlas_install_joboptions( share/*.py )
 
 atlas_add_test( TriggerConfigFlagsTest
diff --git a/Trigger/TriggerCommon/TriggerJobOpts/python/TriggerConfigFlags.py b/Trigger/TriggerCommon/TriggerJobOpts/python/TriggerConfigFlags.py
index 989f216b4f6e04d23a1c4433d3f883b2eff9c65d..ce120c44cc7bbf65c5b031af4ba5c991d406c199 100644
--- a/Trigger/TriggerCommon/TriggerJobOpts/python/TriggerConfigFlags.py
+++ b/Trigger/TriggerCommon/TriggerJobOpts/python/TriggerConfigFlags.py
@@ -1,10 +1,12 @@
 # Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 
 from AthenaConfiguration.AthConfigFlags import AthConfigFlags
+from AthenaCommon.Logging import logging
+log=logging.getLogger('TriggerConfigFlags')
 
 def createTriggerFlags():
+    flags = AthConfigFlags()    
 
-    flags = AthConfigFlags()
     # enables L1 simulation
     flags.addFlag('Trigger.doLVL1', lambda prevFlags: prevFlags.Input.isMC)
 
@@ -31,8 +33,70 @@ def createTriggerFlags():
     flags.addFlag('Trigger.decodePhaseIL1', False)
     
     # if 1, Run1 decoding version is set; if 2, Run2; if 3, Run 3 
-    flags.addFlag('Trigger.EDMDecodingVersion', 3)
-
+    def EDMDecodingVersion(flags):
+        log.debug("Attempting to determine EDMDecodingVersion.")
+        version = 3
+        if flags.Input.Format=="BS":
+            log.debug("EDMDecodingVersion: 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.debug("EDMDecodingVersion: 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
+            runNumber = flags.Input.RunNumber[0]
+            log.debug("EDMDecodingVersion: Read run number {}.".format(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))
+            elif runNumber < boundary_run12:
+                # Run-1 data
+                version = 1
+            elif runNumber < boundary_run23:
+                # Run-2 data
+                version = 2
+            else:
+                # Run-3 data
+                version = 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
+            if "HLTResult_EF" in flags.Input.Collections:
+                version = 1
+            elif "TrigNavigation" in flags.Input.Collections:
+                version = 2
+            elif "HLTNav_Summary" in flags.Input.Collections:
+                version = 3
+            elif flags.Input.Format == "RDO":
+                # 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
+    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?)
     flags.addFlag('Trigger.doTruth', False)
 
diff --git a/Trigger/TriggerCommon/TriggerJobOpts/test/test_TriggerFlags_autoconf.py b/Trigger/TriggerCommon/TriggerJobOpts/test/test_TriggerFlags_autoconf.py
new file mode 100755
index 0000000000000000000000000000000000000000..3e422d56011b602ad80d8f7d1dec13fcde127855
--- /dev/null
+++ b/Trigger/TriggerCommon/TriggerJobOpts/test/test_TriggerFlags_autoconf.py
@@ -0,0 +1,70 @@
+#!/usr/bin/env python
+
+# Test of Trigger config flags autoconfiguration
+# Exercised on BS data and MC POOL file formats
+
+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
+
+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",
+    #
+    "Run2_MC_r21": nightlydir+"TrigAnalysisTest/test_trigAna_RDOtoAOD_build/AOD.pool.root",
+    "Run2_MC_r21": getRun2MCFile(),
+    #
+    "Run3_MC": nightlydir+"TrigAnalysisTest/test_trigAna_RDOtoAOD_mt1_build/AOD.pool.root",
+}
+
+from TriggerJobOpts.TriggerConfigFlags import createTriggerFlags
+
+from AthenaCommon.Constants import DEBUG
+from TriggerJobOpts.TriggerConfigFlags import log as tcf_log
+tcf_log.setLevel(DEBUG)
+
+def test_TriggerFlags(sample):
+
+    from AthenaConfiguration.AllConfigFlags import ConfigFlags
+    acf = ConfigFlags.clone()
+    acf.Input.Files = [inputfiles[sample]]
+    acf.addFlagsCategory("Trigger", createTriggerFlags)
+    
+    # Test EDMDecodingVersion
+    EDMDecode_ref = {
+        "Run1": 1,
+        "Run2": 2,
+        "Run3": 3
+    }[sample[:4]]
+    log.info("EDMDecodingVersion: expected {}, configured {}".format(EDMDecode_ref, acf.Trigger.EDMDecodingVersion))
+    assert( acf.Trigger.EDMDecodingVersion == EDMDecode_ref )
+
+    return
+    
+if __name__=="__main__":
+    log.info("Testing TriggerConfigFlags autoconfiguration")
+    import sys
+    for sample in sorted(inputfiles.keys()):
+        run, source = sample.split('_',1)
+        log.info("{} {} input file: {}".format(run, source, inputfiles[sample]))
+        try:
+            test_TriggerFlags(sample)
+        except AssertionError as e:
+            sys.exit(1)
+            
+    log.info("Done with test")
+    sys.exit(0)