diff --git a/Trigger/TrigConfiguration/TrigConfData/TrigConfData/L1TopoAlgorithm.h b/Trigger/TrigConfiguration/TrigConfData/TrigConfData/L1TopoAlgorithm.h
index de316d6b40d13911892ba9430949783d564465c1..58e525e42409586c154da14b45e4e378f1d9f5bb 100644
--- a/Trigger/TrigConfiguration/TrigConfData/TrigConfData/L1TopoAlgorithm.h
+++ b/Trigger/TrigConfiguration/TrigConfData/TrigConfData/L1TopoAlgorithm.h
@@ -124,7 +124,9 @@ namespace TrigConf {
           gXE     = 7, 
           gXERHO  = 8, 
           gXEPUFIT = 9, 
-          gTE     = 10 };
+          gTE     = 10,
+          jXEPerf = 11, // Only for simulation studies!
+      };
 
       static std::string flavourIntToStr(const unsigned int flavInt){
           if(flavInt==int(FLAV::jXE))     return "jXE";
@@ -138,6 +140,7 @@ namespace TrigConf {
           if(flavInt==int(FLAV::gXERHO))  return "gXERHO";
           if(flavInt==int(FLAV::gXEPUFIT)) return "gXEPUFIT";
           if(flavInt==int(FLAV::gTE))     return "gTE";
+          if(flavInt==int(FLAV::jXEPerf))     return "jXEPerf";
           throw std::runtime_error("Flavour " + std::to_string(flavInt) + " for EnergyThreshold algorithm not recongnised!");
       };
       static unsigned int flavourStrToInt(const std::string & flavStr){
@@ -152,6 +155,7 @@ namespace TrigConf {
           if(flavStr=="gXERHO")  return int(FLAV::gXERHO);
           if(flavStr=="gXEPUFIT") return int(FLAV::gXEPUFIT);
           if(flavStr=="gTE")     return int(FLAV::gTE);
+          if(flavStr=="jXEPerf")     return int(FLAV::jXEPerf);
           throw std::runtime_error("Flavour " + flavStr + " for EnergyThreshold algorithm not recongnised!");
       };
 
diff --git a/Trigger/TrigValidation/TrigAnalysisTest/share/ref_RDOtoRDOTrig_v1Dev_build.ref b/Trigger/TrigValidation/TrigAnalysisTest/share/ref_RDOtoRDOTrig_v1Dev_build.ref
index 0e88d27d3698bf9d61ed5ced0a544275505ad1fb..a1e298695f04237e8e031d90d63c8b0291fe325f 100644
--- a/Trigger/TrigValidation/TrigAnalysisTest/share/ref_RDOtoRDOTrig_v1Dev_build.ref
+++ b/Trigger/TrigValidation/TrigAnalysisTest/share/ref_RDOtoRDOTrig_v1Dev_build.ref
@@ -9861,6 +9861,8 @@ HLT_noalg_L1jXE55:
   eventCount: 0
 HLT_noalg_L1jXEC50:
   eventCount: 0
+HLT_noalg_L1jXEPerf50:
+  eventCount: 0
 HLT_noalg_LArPEBCalib_L1LAR-ZEE:
   eventCount: 1
   stepCounts:
diff --git a/Trigger/TrigValidation/TrigP1Test/share/ref_v1Dev_decodeBS_build.ref b/Trigger/TrigValidation/TrigP1Test/share/ref_v1Dev_decodeBS_build.ref
index 4b4286137886385d02b5f781f5439d61834ff9ec..3a210656b56d2258c7ece1c1680a8e993816b7d5 100644
--- a/Trigger/TrigValidation/TrigP1Test/share/ref_v1Dev_decodeBS_build.ref
+++ b/Trigger/TrigValidation/TrigP1Test/share/ref_v1Dev_decodeBS_build.ref
@@ -4025,6 +4025,8 @@ HLT_noalg_L1jXE55:
   eventCount: 0
 HLT_noalg_L1jXEC50:
   eventCount: 0
+HLT_noalg_L1jXEPerf50:
+  eventCount: 0
 HLT_noalg_LArPEBCalib_L1LAR-ZEE:
   eventCount: 0
 HLT_noalg_LArPEBCalib_L1RD0_BGRP11:
diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/LS2_v1.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/LS2_v1.py
index 24fa7bfbc0f580e284facc3083fab88ccdfeee4c..ad3aaa7ab165e3919b9c308ab45ba3582fe08f82 100644
--- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/LS2_v1.py
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/LS2_v1.py
@@ -1378,6 +1378,9 @@ def setupMenu():
         ChainProp(name='HLT_noalg_L1jTEFWDA100',    l1SeedThresholds=['FSNOSEED'], stream=[PhysicsStream], groups=METPhaseIStreamersGroup),
         ChainProp(name='HLT_noalg_L1jTEFWDC100',    l1SeedThresholds=['FSNOSEED'], stream=[PhysicsStream], groups=METPhaseIStreamersGroup),
 
+        # ATR-24037
+        ChainProp(name='HLT_noalg_L1jXEPerf50',     l1SeedThresholds=['FSNOSEED'], stream=[PhysicsStream], groups=METPhaseIStreamersGroup),
+
     ]
 
     TriggerFlags.MonitorSlice.signatures   = TriggerFlags.MonitorSlice.signatures() + [
diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/L1/Base/L1MenuFlags.py b/Trigger/TriggerCommon/TriggerMenuMT/python/L1/Base/L1MenuFlags.py
index 8d50cb2ac757dcaaa940d94a6339761f4f6b848c..981ed530f425013ac5362702410771ccd1b62246 100644
--- a/Trigger/TriggerCommon/TriggerMenuMT/python/L1/Base/L1MenuFlags.py
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/L1/Base/L1MenuFlags.py
@@ -47,6 +47,8 @@ class L1MenuFlagsCont(object):
         "prescales"               :  FlagArgs( dict, dict() ),
         "RemapThresholdsAsListed" :  FlagArgs( bool, False ),
         "CtpIdMap"                :  FlagArgs( dict, dict() ),
+        "ThresholdMap"            :  FlagArgs( dict, dict() ),
+        "ItemMap"                 :  FlagArgs( dict, dict() ),
     }
 
     def __setattr__(self, attr, value):
diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/L1/Config/ItemDef.py b/Trigger/TriggerCommon/TriggerMenuMT/python/L1/Config/ItemDef.py
index ada283f892664bf096bf5f44ebb11dbc2c191b7d..e3d70ab815a661263d514e150676c28d63c0e78a 100644
--- a/Trigger/TriggerCommon/TriggerMenuMT/python/L1/Config/ItemDef.py
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/L1/Config/ItemDef.py
@@ -701,6 +701,7 @@ class ItemDef:
         MenuItem('L1_jXE300').setLogic( d.jXE300 & physcond).setTriggerType(TT.calo)
 
         MenuItem('L1_jXEC50' ).setLogic( d.jXEC50 & physcond).setTriggerType(TT.calo)
+        MenuItem('L1_jXEPerf50' ).setLogic( d.jXEPerf50 & physcond).setTriggerType(TT.calo)
 
         # phase1 TE
         MenuItem('L1_gTE50'      ).setLogic( d.gTE50 & physcond).setTriggerType(TT.calo)
diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/L1/Config/ThresholdDef.py b/Trigger/TriggerCommon/TriggerMenuMT/python/L1/Config/ThresholdDef.py
index 22ba33e3a492f8ef18680f236dc6d1f1596496a5..b131de63e1d07bd9e0440d1556a0c81db3652256 100644
--- a/Trigger/TriggerCommon/TriggerMenuMT/python/L1/Config/ThresholdDef.py
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/L1/Config/ThresholdDef.py
@@ -108,23 +108,19 @@ class ThresholdDef:
         # eEM 
         for thrV in [3, 5, 8, 15, 20, 22]:
             #eEMThreshold('eEM%i' % thrV, 'eEM').addThrValue(thrV)
-            ThresholdDef.addVaryingThrValues( eEMThreshold(  'eEM%i'% thrV,  'eEM'), pt=thrV,  shift_set = 1 )
+            ThresholdDef.addVaryingThrValues( eEMThreshold( 'eEM%i'% thrV, 'eEM'), pt = thrV, shift_set = 1 )
 
         # L section (used to be VH in Run2)
-        ThresholdDef.addVaryingThrValues( eEMThreshold(  'eEM8L',  'eEM').setIsolation( reta = "Loose", wstot = "Loose", rhad = "Loose" ),    pt=8,  shift_set = 1 ) 
-        ThresholdDef.addVaryingThrValues( eEMThreshold( 'eEM10L',  'eEM').setIsolation( reta = "Loose", wstot = "Loose", rhad = "Loose" ),    pt=10, shift_set = 1 )
-        ThresholdDef.addVaryingThrValues( eEMThreshold( 'eEM15L',  'eEM').setIsolation( reta = "Loose", wstot = "Loose", rhad = "Loose" ),    pt=15, shift_set = 1 )
-        ThresholdDef.addVaryingThrValues( eEMThreshold( 'eEM20L',  'eEM').setIsolation( reta = "Loose", wstot = "Loose", rhad = "Loose" ),    pt=20, shift_set = 1 )
-        ThresholdDef.addVaryingThrValues( eEMThreshold( 'eEM22L',  'eEM').setIsolation( reta = "Loose", wstot = "Loose", rhad = "Loose" ),    pt=22, shift_set = 1 )
+        for thrV in [8,10,15,20,22]:
+            ThresholdDef.addVaryingThrValues( eEMThreshold( 'eEM%iL' % thrV, 'eEM').setIsolation( reta = "Loose", wstot = "Loose", rhad = "Loose" ), pt = thrV, shift_set = 1 )
 
         # M section (used to be VHI in Run2)
-        ThresholdDef.addVaryingThrValues( eEMThreshold(  'eEM8M',  'eEM').setIsolation( reta = "Medium", wstot = "Medium", rhad = "Medium" ), pt=8,  shift_set = 1 )
-        ThresholdDef.addVaryingThrValues( eEMThreshold( 'eEM15M',  'eEM').setIsolation( reta = "Medium", wstot = "Medium", rhad = "Medium" ), pt=15, shift_set = 1 )
-        ThresholdDef.addVaryingThrValues( eEMThreshold( 'eEM20M',  'eEM').setIsolation( reta = "Medium", wstot = "Medium", rhad = "Medium" ), pt=20, shift_set = 1 )
-        ThresholdDef.addVaryingThrValues( eEMThreshold( 'eEM22M',  'eEM').setIsolation( reta = "Medium", wstot = "Medium", rhad = "Medium" ), pt=22, shift_set = 1 )
+        for thrV in [8,15,20,22]:
+            ThresholdDef.addVaryingThrValues( eEMThreshold( 'eEM%iM' % thrV, 'eEM').setIsolation( reta = "Medium", wstot = "Medium", rhad = "Medium" ), pt = thrV, shift_set = 1 )
 
         # T section (used to be VHIM in Run2)
-        ThresholdDef.addVaryingThrValues( eEMThreshold( 'eEM22T',  'eEM').setIsolation( reta = "Tight", wstot = "Tight", rhad = "Tight" ),    pt=22, shift_set = 1 )
+        for thrV in [22]:
+            ThresholdDef.addVaryingThrValues( eEMThreshold( 'eEM%iT' % thrV, 'eEM').setIsolation( reta = "Tight", wstot = "Tight", rhad = "Tight" ), pt= thrV, shift_set = 1 )
 
         # jEM
         for thrV in [15]:
@@ -194,6 +190,10 @@ class ThresholdDef:
         for thrV in [50]:
             XEThreshold('jXEC%i' % thrV, 'jXE').setXE(thrV)
 
+        # ATR-24037
+        for thrV in [50]:
+            XEThreshold('jXEPerf%i' % thrV, 'jXE').setXE(thrV)
+
         # jTE
         for thrV in [100,]:
             TEThreshold('jTE%i' % thrV, 'jTE').setTE(thrV)
diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/L1/Config/TopoAlgoDefMultiplicity.py b/Trigger/TriggerCommon/TriggerMenuMT/python/L1/Config/TopoAlgoDefMultiplicity.py
index cd7875459e21db19ad9e17bfa2c3410122abc60a..3c442317de5761eb4804104e2bb3a317578efe9d 100644
--- a/Trigger/TriggerCommon/TriggerMenuMT/python/L1/Config/TopoAlgoDefMultiplicity.py
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/L1/Config/TopoAlgoDefMultiplicity.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+# Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration
 
 from AthenaCommon.Logging import logging
 log = logging.getLogger(__name__)
@@ -143,6 +143,8 @@ class TopoAlgoDefMultiplicity(object):
 
             'jXEC50', 'jTE100', 'jTEC100', 'jTEFWD100', 'jTEFWDA100', 'jTEFWDC100', 
             'gTE50',
+
+            'jXEPerf50',
         ]
 
         for XE in XEThresholds:
diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/L1/Menu/MenuMapping.py b/Trigger/TriggerCommon/TriggerMenuMT/python/L1/Menu/MenuMapping.py
index 739f7a2e4b0255d28653a37f535335c1ad0aa2ed..163616bbdc9dcfaf2e5dc3d924b29199db97cd11 100644
--- a/Trigger/TriggerCommon/TriggerMenuMT/python/L1/Menu/MenuMapping.py
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/L1/Menu/MenuMapping.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
+# Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration
 
 """
 This map specifies with menu to load from TriggerMenuMT/python/L1/Menu
@@ -8,18 +8,17 @@ The resolved name is also being used in the L1/Config/ItemDef.py and L1/Config/T
 """
 
 menuMap = {
-    "Physics_pp_v7"        : ["MC_pp_v8","MC_pp_v8_inputs","MC_pp_v8_inputs_legacy"],
-    "LS2_v1"               : ["MC_pp_v8","MC_pp_v8_inputs","MC_pp_v8_inputs_legacy"],
-    "Physics_pp_run3_v1"   : ["MC_pp_v8","MC_pp_v8_inputs","MC_pp_v8_inputs_legacy"],
+    "Physics_pp_run3_v1"   : ["Physics_pp_v8","MC_pp_v8_inputs","MC_pp_v8_inputs_legacy"],
+    "PhysicsP1_pp_run3_v1" : ["Physics_pp_v8","MC_pp_v8_inputs","MC_pp_v8_inputs_legacy"],
+    "Physics_pp_v8"        : ["Physics_pp_v8","MC_pp_v8_inputs","MC_pp_v8_inputs_legacy"],
     "MC_pp_run3_v1"        : ["MC_pp_v8","MC_pp_v8_inputs","MC_pp_v8_inputs_legacy"],
     "MC_pp_v8"             : ["MC_pp_v8","MC_pp_v8_inputs","MC_pp_v8_inputs_legacy"],
-    "Physics_pp_v8"        : ["MC_pp_v8","MC_pp_v8_inputs","MC_pp_v8_inputs_legacy"],
     "Cosmic_run3_v1"       : ["MC_pp_v8","MC_pp_v8_inputs","MC_pp_v8_inputs_legacy"],
     "Physics_HI_v4"        : ["MC_HI_v1","MC_pp_v8_inputs","MC_pp_v8_inputs_legacy"],
     "MC_HI_v4"             : ["MC_HI_v1","MC_pp_v8_inputs","MC_pp_v8_inputs_legacy"],
-    "PhysicsP1_pp_run3_v1" : ["MC_pp_v8","MC_pp_v8_inputs","MC_pp_v8_inputs_legacy"],
     "PhysicsP1_HI_run3_v1" : ["MC_HI_v1","MC_pp_v8_inputs","MC_pp_v8_inputs_legacy"],
     "Dev_HI_run3_v1"       : ["MC_HI_v1","MC_pp_v8_inputs","MC_pp_v8_inputs_legacy"],
+    "LS2_v1"               : ["MC_pp_v8","MC_pp_v8_inputs","MC_pp_v8_inputs_legacy"],
     "LS2_v1_Primary_prescale"           : ["MC_pp_v8","MC_pp_v8_inputs","MC_pp_v8_inputs_legacy"],
     "LS2_v1_TriggerValidation_prescale" : ["MC_pp_v8","MC_pp_v8_inputs","MC_pp_v8_inputs_legacy"],
     "LS2_v1_BulkMCProd_prescale"        : ["MC_pp_v8","MC_pp_v8_inputs","MC_pp_v8_inputs_legacy"],
diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/L1/Menu/Menu_MC_pp_v8.py b/Trigger/TriggerCommon/TriggerMenuMT/python/L1/Menu/Menu_MC_pp_v8.py
index 34ba3365448e57e4d05d65ca6f4f584ffd61cedd..e0676e0d4e23c1b628da5adf3c6fefc23ca583cb 100644
--- a/Trigger/TriggerCommon/TriggerMenuMT/python/L1/Menu/Menu_MC_pp_v8.py
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/L1/Menu/Menu_MC_pp_v8.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
+# Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration
 #
 # Run this file in order to print out the empty slots
 
@@ -175,7 +175,10 @@ def defineMenu():
 
         'L1_jXE30', 'L1_jXE35', 'L1_jXE40', 'L1_jXE50', 'L1_jXE55', 'L1_jXE300', 
         'L1_jXEC50', 'L1_jTE100', 'L1_jTEC100', 'L1_jTEFWD100', 'L1_jTEFWDA100', 'L1_jTEFWDC100',
-                
+           
+        # ATR-24037 
+        'L1_jXEPerf50', 
+    
         # RNDM
         'L1_RD0_FILLED', 'L1_RD0_UNPAIRED_ISO',  'L1_RD0_EMPTY', 'L1_RD0_ABORTGAPNOTCALIB',
         'L1_RD0_FIRSTEMPTY', 'L1_RD0_BGRP11',
diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/L1/Menu/Menu_MC_pp_v8_inputs.py b/Trigger/TriggerCommon/TriggerMenuMT/python/L1/Menu/Menu_MC_pp_v8_inputs.py
index edb8177f42f8137060f32e92089951003985d743..ddbaf009346160c5edb37f0ddf02c8aa87297453 100644
--- a/Trigger/TriggerCommon/TriggerMenuMT/python/L1/Menu/Menu_MC_pp_v8_inputs.py
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/L1/Menu/Menu_MC_pp_v8_inputs.py
@@ -139,7 +139,7 @@ def defineInputsMenu():
 
             ('jXE30',1), ('jXE35',1), ('jXE40',1), ('jXE50',1), ('jXE55',1), ('jXE300',1),
             # test thresholds
-            ('jXEC50',1),
+            ('jXEC50',1), ('jXEPerf50',1),
             ('jTE100',1), ('jTEC100',1), ('jTEFWD100',1), ('jTEFWDA100',1), ('jTEFWDC100',1)
         ]
     })
@@ -385,3 +385,31 @@ def defineInputsMenu():
     L1MenuFlags.boards().update( ctpinBoards )  # CTPIN/Slot9 NIM1, NIM2, CALREQ
 
     L1MenuFlags.boards().update( alfaBoard )  # ALFA
+
+    #----------------------------------------------
+
+    def remapThresholds():
+        # remap thresholds. TODO: add checks in case the remap does not fulfill HW constraints?
+        for boardName, boardDef in L1MenuFlags.boards().items():
+            if "connectors" in boardDef:
+                for c in boardDef["connectors"]:
+                    if "thresholds" in c:
+                        thresholdsToRemove = []
+                        for thrIndex, thrName in enumerate(c["thresholds"]):
+                            nBits = 0
+                            if type(thrName)==tuple:
+                                (thrName,nBits) = thrName
+                            if thrName in L1MenuFlags.ThresholdMap():
+                                if (L1MenuFlags.ThresholdMap()[thrName] != ''):
+                                    if nBits > 0:
+                                        c["thresholds"][thrIndex] = (L1MenuFlags.ThresholdMap()[thrName],nBits)
+                                    else:
+                                        c["thresholds"][thrIndex] = L1MenuFlags.ThresholdMap()[thrName]
+                                else:
+                                    thresholdsToRemove.append(thrIndex) 
+                        for i in reversed(thresholdsToRemove):
+                            del c["thresholds"][i]
+          
+    #----------------------------------------------
+
+    remapThresholds()
diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/L1/Menu/Menu_Physics_pp_v8.py b/Trigger/TriggerCommon/TriggerMenuMT/python/L1/Menu/Menu_Physics_pp_v8.py
new file mode 100644
index 0000000000000000000000000000000000000000..ca4a61a0d64daca7a5340f079be238760a2627ca
--- /dev/null
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/L1/Menu/Menu_Physics_pp_v8.py
@@ -0,0 +1,34 @@
+# Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration
+
+def defineMenu():
+
+    import TriggerMenuMT.L1.Menu.Menu_MC_pp_v8 as mc_menu
+    from TriggerMenuMT.L1.Base.L1MenuFlags import L1MenuFlags
+
+    mc_menu.defineMenu()
+
+    L1MenuFlags.ThresholdMap = {
+        # Do not use for L1Topo decision threshold!
+        'jXEPerf50' :'',
+    }
+
+    L1MenuFlags.ItemMap = {
+        'L1_jXEPerf50':'', 
+    } 
+
+    #----------------------------------------------
+    def remapItems():  
+        itemsToRemove = []
+        for itemIndex, itemName in enumerate(L1MenuFlags.items()):
+            if (itemName in L1MenuFlags.ItemMap()):
+                if (L1MenuFlags.ItemMap()[itemName] != ''):
+                    L1MenuFlags.items()[itemIndex] = L1MenuFlags.ItemMap()[itemName]                                                
+                else: 
+                    itemsToRemove.append(itemIndex)
+
+        for i in reversed(itemsToRemove):
+            del L1MenuFlags.items()[i]
+    #----------------------------------------------
+                                           
+    remapItems()
+