diff --git a/Calorimeter/CaloG4Sim/src/EscapedEnergyRegistry.cc b/Calorimeter/CaloG4Sim/src/EscapedEnergyRegistry.cc
index 39457a4d9139719e7859c625730262fb6d9ff20c..06c097fae6ec448578276c7753bf2b148d8cda3b 100644
--- a/Calorimeter/CaloG4Sim/src/EscapedEnergyRegistry.cc
+++ b/Calorimeter/CaloG4Sim/src/EscapedEnergyRegistry.cc
@@ -10,6 +10,7 @@
 #include "CaloG4Sim/VEscapedEnergyProcessing.h"
 
 #include "G4ios.hh"
+#include "G4Version.hh"
 #include "globals.hh"
 
 #include <map>
@@ -106,7 +107,11 @@ EscapedEnergyRegistry* EscapedEnergyRegistry::GetInstance()
     // m_processingMap = consists of pair< G4String, VEscapedEnergyProcessing* >
 
     for (auto& [key, storedProcess] : m_processingMap) {
+#if G4VERSION_NUMBER < 1100
       if ( volumeName.contains(key) )
+#else
+      if ( G4StrUtil::contains(volumeName, key) )
+#endif
         return storedProcess.get();
     }
 
diff --git a/Control/AthenaConfiguration/python/AllConfigFlags.py b/Control/AthenaConfiguration/python/AllConfigFlags.py
index 956a50a8b0105da6b57f63bb042584de97db2a91..9b71ab42cd21c60b1d804cf044cc4b525f7e443d 100644
--- a/Control/AthenaConfiguration/python/AllConfigFlags.py
+++ b/Control/AthenaConfiguration/python/AllConfigFlags.py
@@ -231,6 +231,7 @@ def initConfigFlags():
     acf.addFlag('Output.AODFileName',  '')
     acf.addFlag('Output.HISTFileName', '')
 
+    acf.addFlag('Output.doWriteHITS', lambda prevFlags: bool(prevFlags.Output.HITSFileName)) # write out HITS file
     acf.addFlag('Output.doWriteRDO', lambda prevFlags: bool(prevFlags.Output.RDOFileName)) # write out RDO file
     acf.addFlag('Output.doWriteRDO_SGNL', lambda prevFlags: bool(prevFlags.Output.RDO_SGNLFileName)) # write out RDO_SGNL file
     acf.addFlag('Output.doWriteESD', lambda prevFlags: bool(prevFlags.Output.ESDFileName)) # write out ESD file
diff --git a/Control/CxxUtils/CxxUtils/features.h b/Control/CxxUtils/CxxUtils/features.h
index bfb24222a84df410666acadd982a8b4f4f1bdaca..cad1d49b09b939f399879b7e5d202c0fd28e6678 100644
--- a/Control/CxxUtils/CxxUtils/features.h
+++ b/Control/CxxUtils/CxxUtils/features.h
@@ -12,7 +12,7 @@
 #ifndef CXXUTILS_FEATURES_H
 #define CXXUTILS_FEATURES_H
 
-#if defined(__GLIBC__)
+#if !defined(__APPLE__)
 #include <features.h>
 #endif
 
diff --git a/Control/SGTools/CMakeLists.txt b/Control/SGTools/CMakeLists.txt
index a1a4b519c05c730c1f869cd5ca33814ba8a08a41..829aa281779c4b788f7c721117e7cf49519c5c32 100644
--- a/Control/SGTools/CMakeLists.txt
+++ b/Control/SGTools/CMakeLists.txt
@@ -10,8 +10,7 @@ find_package( Boost )
 atlas_add_library( SGTools
                    src/*.cxx
                    PUBLIC_HEADERS SGTools
-                   INCLUDE_DIRS ${Boost_INCLUDE_DIRS}
-                   LINK_LIBRARIES ${Boost_LIBRARIES} AthenaKernel CxxUtils GaudiKernel
+                   LINK_LIBRARIES AthenaKernel CxxUtils GaudiKernel
                    PRIVATE_LINK_LIBRARIES SGAudCore )
 
 atlas_add_dictionary( SGToolsDict
@@ -38,12 +37,14 @@ atlas_add_test( StringPool_test
 atlas_add_test( DataProxy_test
                 SOURCES
                 test/DataProxy_test.cxx
-                LINK_LIBRARIES SGTools )
+                INCLUDE_DIRS ${Boost_INCLUDE_DIRS}
+                LINK_LIBRARIES SGTools  ${Boost_LIBRARIES} )
 
 atlas_add_test( DataStore_test
                 SOURCES
                 test/DataStore_test.cxx
-                LINK_LIBRARIES SGTools TestTools )
+                INCLUDE_DIRS ${Boost_INCLUDE_DIRS}
+                LINK_LIBRARIES SGTools TestTools ${Boost_LIBRARIES} )
 
 atlas_add_test( TransientAddress_test
                 SOURCES
diff --git a/Control/SGTools/SGTools/DataStore.h b/Control/SGTools/SGTools/DataStore.h
index 014ea88c708bf9d4637f1ec2947bb1ac8df3197d..8e8b94b452a2ae1ccc5f995012405123fda48a38 100755
--- a/Control/SGTools/SGTools/DataStore.h
+++ b/Control/SGTools/SGTools/DataStore.h
@@ -19,8 +19,7 @@
 #include "CxxUtils/SimpleUpdater.h"
 #include "GaudiKernel/ClassID.h"
 #include "GaudiKernel/StatusCode.h"
-#include <boost/array.hpp>
-#include <boost/type_traits/transform_traits.hpp>
+
 #include <exception>
 #include <list>
 #include <vector>
diff --git a/Database/AthenaPOOL/OutputStreamAthenaPool/python/OutputStreamConfig.py b/Database/AthenaPOOL/OutputStreamAthenaPool/python/OutputStreamConfig.py
index 4c4bf10bbc8838fc9a0fc494736afec71523dd0c..cbfda836a81da18a356a6bdc545558caede70c48 100644
--- a/Database/AthenaPOOL/OutputStreamAthenaPool/python/OutputStreamConfig.py
+++ b/Database/AthenaPOOL/OutputStreamAthenaPool/python/OutputStreamConfig.py
@@ -2,12 +2,13 @@
 
 from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator, ConfigurationError
 from AthenaConfiguration.ComponentFactory import CompFactory
-from AthenaConfiguration.Enums import Format, ProductionStep
+from AthenaConfiguration.Enums import ProductionStep
 from AthenaCommon.Logging import logging
 
 
 def OutputStreamCfg(flags, streamName, ItemList=[], MetadataItemList=[],
-                    disableEventTag=False, trigNavThinningSvc=None, AcceptAlgs=[]):
+                    disableEventTag=False, trigNavThinningSvc=None,
+                    AcceptAlgs=[], HelperTools=[]):
    eventInfoKey = "EventInfo"
    if flags.Common.ProductionStep == ProductionStep.PileUpPresampling:
       eventInfoKey = f"{flags.Overlay.BkgPrefix}EventInfo"
@@ -62,6 +63,7 @@ def OutputStreamCfg(flags, streamName, ItemList=[], MetadataItemList=[],
       ItemList=finalItemList,
       MetadataItemList=MetadataItemList,
       OutputFile=fileName,
+      HelperTools=HelperTools,
    )
    outputStream.AcceptAlgs += AcceptAlgs
    outputStream.ExtraOutputs += [("DataHeader", f"StoreGateSvc+{outputStreamName}")]
@@ -90,55 +92,6 @@ def OutputStreamCfg(flags, streamName, ItemList=[], MetadataItemList=[],
                                stream=outputStream,
                                streamName=outputStreamName))
 
-   # Setup FileMetaData
-   from xAODMetaDataCnv.FileMetaDataConfig import FileMetaDataCfg
-   result.merge(FileMetaDataCfg(flags,
-                                stream=outputStream,
-                                streamName=outputStreamName))
-
-   # Setup additional MetaData
-
-   # ======================================================
-   # TODO:
-   # ======================================================
-   # For the time being we're adding common MetaData items
-   # and configure the necessary tools/services en masse.
-   # Ideally, we should introduce a self-sufficienct config
-   # for each item and merge them here.
-   # ======================================================
-   if any([ x in streamName for x in ['AOD','ESD'] ]):
-      # LumiBlockMetaDataTool seems to cause crashes in MP derivation jobs
-      # As done in RecExCommon_topOptions.py use the algorithm in MP jobs
-      # This needs to be checked and confirmed...
-      mdToolNames = []
-      # Propagate cutbookkeepers
-      if 'CutBookkeepers' in flags.Input.MetadataItems:
-         mdToolNames.append('BookkeeperTool')
-
-      if flags.Input.Format == Format.BS and not flags.Common.isOnline:
-         from LumiBlockComps.CreateLumiBlockCollectionFromFileConfig import CreateLumiBlockCollectionFromFileCfg
-         result.merge(CreateLumiBlockCollectionFromFileCfg(flags))
-      elif "LumiBlock" in flags.Input.MetadataItems:
-         mdToolNames.append('LumiBlockMetaDataTool')
-
-      outputStream.MetadataItemList += ['xAOD::TriggerMenuContainer#*'
-                                       ,'xAOD::TriggerMenuAuxContainer#*'
-                                       ,'xAOD::TriggerMenuJsonContainer#*'
-                                       ,'xAOD::TriggerMenuJsonAuxContainer#*'
-                                       ,'xAOD::LumiBlockRangeContainer#*'
-                                       ,'xAOD::LumiBlockRangeAuxContainer#*'
-                                       ,'ByteStreamMetadataContainer#*'
-                                       ,'xAOD::TruthMetaDataContainer#TruthMetaData'
-                                       ,'xAOD::TruthMetaDataAuxContainer#TruthMetaDataAux.']
-      # TODO: temporary   
-      from EventBookkeeperTools.EventBookkeeperToolsConfig import CutFlowOutputList
-      outputStream.MetadataItemList += CutFlowOutputList(flags)
-
-      from AthenaServices.MetaDataSvcConfig import MetaDataSvcCfg
-      result.merge(MetaDataSvcCfg(flags,
-                                  tools = [CompFactory.xAODMaker.TriggerMenuMetaDataTool('TriggerMenuMetaDataTool')],
-                                  toolNames = mdToolNames))
-
    # Support for MT thinning.
    thinningCacheTool = CompFactory.Athena.ThinningCacheTool(f"ThinningCacheTool_Stream{streamName}",
                                                             StreamName=outputStreamName)
@@ -197,3 +150,21 @@ def addToAOD(flags, itemOrList, **kwargs):
       return ComponentAccumulator()
    items = [itemOrList] if isinstance(itemOrList, str) else itemOrList
    return OutputStreamCfg(flags, "AOD", ItemList=items, **kwargs)
+
+def addToMetaData(flags, streamName, itemOrList, AcceptAlgs=[], HelperTools=[], **kwargs):
+   """
+   Adds Metadata items to the stream named streamName
+
+   Similar to addToESD/AOD, itemOrList can be either a list of items or just one time
+   The additional arguments, AcceptAlgs and HelperTools, are passed to the underlying stream
+   The former is needed when there are special kernels, e.g., simulation/derivation
+   The latter is needed primarily for the propagation of the FileMetaData tool
+
+   Returns CA to be merged
+   """
+   if not hasattr(flags.Output, f"doWrite{streamName}") or not getattr(flags.Output, f"doWrite{streamName}"):
+       return ComponentAccumulator()
+   items = [itemOrList] if isinstance(itemOrList, str) else itemOrList
+   acceptAlgs = [f"{streamName.strip('DAOD_')}Kernel"] if "DAOD" in streamName else AcceptAlgs
+   return OutputStreamCfg(flags, streamName, MetadataItemList=items,
+                          AcceptAlgs=acceptAlgs, HelperTools=HelperTools, **kwargs)
diff --git a/Database/AthenaPOOL/PoolSvc/src/PoolSvc.cxx b/Database/AthenaPOOL/PoolSvc/src/PoolSvc.cxx
index 3d4b2644fb26942b97db3bc1bef7d2076e529974..c0fdc9164c623446c78a6968fefef1e6ebe67d26 100644
--- a/Database/AthenaPOOL/PoolSvc/src/PoolSvc.cxx
+++ b/Database/AthenaPOOL/PoolSvc/src/PoolSvc.cxx
@@ -43,8 +43,6 @@
 
 #include "DBReplicaSvc/IDBReplicaSvc.h"
 
-#include <boost/algorithm/string.hpp> // for starts_with()
-
 #include <cstdlib> 	// for getenv()
 #include <cstring> 	// for strcmp()
 #include <sys/stat.h> 	// for struct stat
diff --git a/Event/xAOD/xAODMetaDataCnv/python/InfileMetaDataConfig.py b/Event/xAOD/xAODMetaDataCnv/python/InfileMetaDataConfig.py
new file mode 100644
index 0000000000000000000000000000000000000000..30d470bfd94d088f1740db08edeccc95882089b3
--- /dev/null
+++ b/Event/xAOD/xAODMetaDataCnv/python/InfileMetaDataConfig.py
@@ -0,0 +1,113 @@
+# Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
+
+from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
+from AthenaConfiguration.ComponentFactory import CompFactory
+from AthenaConfiguration.Enums import Format
+from OutputStreamAthenaPool.OutputStreamConfig import addToMetaData
+
+def InfileMetaDataCfg(flags, streamName="", AcceptAlgs=[]):
+    """
+    The main configuration for setting up Metadata for the stream named streamName
+
+    Currently this is a single method that is used in all workflows
+    However, it would be more maintainable/preferable to split it into custom ones
+    For example, one for simulation/digitization/overlay, another for reco etc.
+    The additional argument, AcceptAlgs, is needed for workflows with custom kernels
+
+    Returns CA to be merged
+    """
+
+    # Bare CA
+    result = ComponentAccumulator()
+    if not isinstance(streamName, str) or not streamName:
+        return result
+
+    # Internal caches of tools
+    helperTools = []
+    mdTools = []
+    mdToolNames = []
+
+    # FileMetaData items
+    MetadataItemList = ["xAOD::FileMetaData#FileMetaData"
+                       ,"xAOD::FileMetaDataAuxInfo#FileMetaDataAux."]
+
+    # FileMetaDataCreatorTool and FileMetaDataTool work together
+    # Therefore, we want both of them configured
+    helperTools.append(
+        CompFactory.xAODMaker.FileMetaDataCreatorTool(
+            f"Stream{streamName}_FileMetaDataCreatorTool",
+            OutputKey="FileMetaData",
+            StreamName=f"Stream{streamName}",
+        )
+    )
+
+    if "FileMetaData" in flags.Input.MetadataItems:
+        mdToolNames.append("xAODMaker::FileMetaDataTool")
+
+    # Add MetaData that are relevant to downstream formats: ESD, AOD, and DAOD
+    if not flags.Output.doWriteHITS and not flags.Output.doWriteRDO:
+
+        # Trigger MetaData items
+        mdTools.append(CompFactory.xAODMaker.TriggerMenuMetaDataTool("TriggerMenuMetaDataTool"))
+        MetadataItemList += ["xAOD::TriggerMenuContainer#*"
+                            ,"xAOD::TriggerMenuAuxContainer#*"
+                            ,"xAOD::TriggerMenuJsonContainer#*"
+                            ,"xAOD::TriggerMenuJsonAuxContainer#*"]
+
+        # Collision data specific MetaData items
+        if not flags.Input.isMC:
+            MetadataItemList += ["ByteStreamMetadataContainer#*"
+                                ,"xAOD::LumiBlockRangeContainer#*"
+                                ,"xAOD::LumiBlockRangeAuxContainer#*"]
+        # MC specific MetaData items
+        else:
+            MetadataItemList += ["xAOD::TruthMetaDataContainer#TruthMetaData"
+                                ,"xAOD::TruthMetaDataAuxContainer#TruthMetaDataAux."]
+
+        # CutFlow related MetaData items
+        # Now, I think this needs the CutFlowSvc to be set up
+        # For the time being this is done in the relevant skeleton, e.g. Derivations
+        # These should be reconciled, i.e. move that here and configure via flags
+        from EventBookkeeperTools.EventBookkeeperToolsConfig import CutFlowOutputList
+        MetadataItemList += CutFlowOutputList(flags)
+
+        # Data specific MetaData components
+        if not flags.Input.isMC:
+            # Here we're running RAWtoALL so we're in creation mode
+            if flags.Input.Format == Format.BS and not flags.Common.isOnline:
+                # Configure ByteStream related components
+                from ByteStreamCnvSvc.ByteStreamConfig import ByteStreamReadCfg
+                result.merge(ByteStreamReadCfg(flags))
+                # Configure LumiBlock Creation Algorithm
+                from LumiBlockComps.CreateLumiBlockCollectionFromFileConfig import CreateLumiBlockCollectionFromFileCfg
+                result.merge(CreateLumiBlockCollectionFromFileCfg(flags))
+            elif "LumiBlock" in flags.Input.MetadataItems:
+                # Propagate LumiBlock data if it exists in the input
+                # Do we always want this tool instead?
+                mdToolNames.append("LumiBlockMetaDataTool")
+        # MC specific MetaData components
+        else:
+            # Configure TruthMetaDataTool
+            mdTools.append(CompFactory.xAODMaker.TruthMetaDataTool("TruthMetaDataTool"))
+
+        # Propagate CutBookkeepers if it exists in the input
+        if "CutBookkeepers" in flags.Input.MetadataItems:
+           mdToolNames.append("BookkeeperTool")
+
+    # Configure the relevant output stream
+    result.merge(
+        addToMetaData(
+                      flags,
+                      streamName=streamName,
+                      itemOrList=MetadataItemList,
+                      AcceptAlgs=AcceptAlgs,
+                      HelperTools=helperTools,
+                     )
+    )
+
+    # Configure the MetaDataSvc and pass the relevant tools
+    from AthenaServices.MetaDataSvcConfig import MetaDataSvcCfg
+    result.merge(MetaDataSvcCfg(flags, tools = mdTools, toolNames = mdToolNames))
+
+    # Finally return the CA
+    return result
diff --git a/ForwardDetectors/AFP/AFP_G4_SD/src/AFP_SensitiveDetector.cxx b/ForwardDetectors/AFP/AFP_G4_SD/src/AFP_SensitiveDetector.cxx
index a94ca280f4b94a43c5cbc7226e55c33bf1d1a7b2..ab115b77e1ea0233c35e623b99d536d3566750e5 100644
--- a/ForwardDetectors/AFP/AFP_G4_SD/src/AFP_SensitiveDetector.cxx
+++ b/ForwardDetectors/AFP/AFP_G4_SD/src/AFP_SensitiveDetector.cxx
@@ -9,6 +9,7 @@
 #include "AFP_Geometry/AFP_constants.h"
 
 // Geant4 headers
+#include "G4Version.hh"
 #include "G4TouchableHistory.hh"
 #include "G4Step.hh"
 #include "G4Track.hh"
@@ -162,8 +163,11 @@ bool AFP_SensitiveDetector::ProcessHits(G4Step* pStep, G4TouchableHistory*)
 
   m_nHitID++;
 
-
+#if G4VERSION_NUMBER < 1100
   if (  (VolumeName.contains("TDSensor")) )
+#else
+  if (  (G4StrUtil::contains(VolumeName, "TDSensor")) )
+#endif
     {
       nQuarticID=szbuff[7]-0x30;
       if ( pStep->GetPostStepPoint()->GetProcessDefinedStep() == 0 ) return 1;
@@ -178,7 +182,11 @@ bool AFP_SensitiveDetector::ProcessHits(G4Step* pStep, G4TouchableHistory*)
     }
 
   //////////////// Fast Cherenkov ///////////////////
+#if G4VERSION_NUMBER < 1100
   if ( (bRes=VolumeName.contains("TDQuarticBar[")) )
+#else
+  if ( (bRes=G4StrUtil::contains(VolumeName, "TDQuarticBar[")) )
+#endif
     {
       nQuarticID=szbuff[7]-0x30;
 
@@ -229,9 +237,14 @@ bool AFP_SensitiveDetector::ProcessHits(G4Step* pStep, G4TouchableHistory*)
 
       //G4int Rsize   = Rind->Entries() - 1;
       //G4double Pmin = Rind->GetMinPhotonEnergy();     // 800 nm
+#if G4VERSION_NUMBER < 1100
       G4double Pmin = Rind->GetMinLowEdgeEnergy();
       //G4double Pmax = Rind->GetMaxPhotonEnergy();  // 200 nm
       G4double Pmax = Rind->GetMaxLowEdgeEnergy();
+#else
+      G4double Pmin = Rind->GetMinEnergy();
+      G4double Pmax = Rind->GetMaxEnergy();
+#endif
       G4double dp   = Pmax - Pmin;
       //G4double maxCosTheta  = BetaInverse / Rind->GetMinProperty();
       G4double maxCosTheta  = BetaInverse / Rind->GetMinValue();
@@ -384,9 +397,11 @@ bool AFP_SensitiveDetector::ProcessHits(G4Step* pStep, G4TouchableHistory*)
         }
     }
   /////////////////////////////////////////////////////
-
+#if G4VERSION_NUMBER < 1100
   else if (VolumeName.contains("SIDSensor") || (bIsSIDAuxVSID=VolumeName.contains("SIDVacuumSensor"))){
-
+#else
+  else if (G4StrUtil::contains(VolumeName, "SIDSensor") || (bIsSIDAuxVSID=G4StrUtil::contains(VolumeName, "SIDVacuumSensor"))){
+#endif
     if(!bIsSIDAuxVSID && !(fEnergyDeposit>0.0))
       {
         //hit in SID sensor but with zero deposited energy (transportation)
diff --git a/ForwardDetectors/AFP/AFP_G4_SD/src/AFP_SiDSensitiveDetector.cxx b/ForwardDetectors/AFP/AFP_G4_SD/src/AFP_SiDSensitiveDetector.cxx
index 4776bbb65ef204482b81760983ba2f177a925d62..894696d6b2e77e137b4b0d5d6884e3f7765799b6 100644
--- a/ForwardDetectors/AFP/AFP_G4_SD/src/AFP_SiDSensitiveDetector.cxx
+++ b/ForwardDetectors/AFP/AFP_G4_SD/src/AFP_SiDSensitiveDetector.cxx
@@ -9,6 +9,7 @@
 #include "AFP_Geometry/AFP_constants.h"
 
 // Geant4 headers
+#include "G4Version.hh"
 #include "G4TouchableHistory.hh"
 #include "G4Step.hh"
 #include "G4Track.hh"
@@ -147,8 +148,11 @@ bool AFP_SiDSensitiveDetector::ProcessHits(G4Step* pStep, G4TouchableHistory*)
   m_nHitID++;
 
   /////////////////////////////////////////////////////
-
+#if G4VERSION_NUMBER < 1100
   if (VolumeName.contains("SIDSensor") || (bIsSIDAuxVSID=VolumeName.contains("SIDVacuumSensor"))){
+#else
+  if (G4StrUtil::contains(VolumeName, "SIDSensor") || (bIsSIDAuxVSID=G4StrUtil::contains(VolumeName, "SIDVacuumSensor"))){
+#endif
 
     if(!bIsSIDAuxVSID && !(fEnergyDeposit>0.0))
       {
diff --git a/ForwardDetectors/AFP/AFP_G4_SD/src/AFP_TDSensitiveDetector.cxx b/ForwardDetectors/AFP/AFP_G4_SD/src/AFP_TDSensitiveDetector.cxx
index 4f841973e8cb3a14502d893de9201d3a081581fc..9e44b578d42c0b9cb9ae8bb5a87fc5e40dcccfb1 100644
--- a/ForwardDetectors/AFP/AFP_G4_SD/src/AFP_TDSensitiveDetector.cxx
+++ b/ForwardDetectors/AFP/AFP_G4_SD/src/AFP_TDSensitiveDetector.cxx
@@ -6,6 +6,7 @@
 #include "AFP_TDSensitiveDetector.h"
 
 // Geant4 headers
+#include "G4Version.hh"
 #include "G4TouchableHistory.hh"
 #include "G4Step.hh"
 #include "G4Track.hh"
@@ -182,7 +183,11 @@ bool AFP_TDSensitiveDetector::ProcessHits(G4Step* pStep, G4TouchableHistory*)
     }
   */
 
+#if G4VERSION_NUMBER < 1100
   if ( (VolumeName.contains("TDQuarticBarVacBorder")) && pParticleDefinition->GetPDGCharge() !=0 )
+#else
+  if ( (G4StrUtil::contains(VolumeName, "TDQuarticBarVacBorder")) && pParticleDefinition->GetPDGCharge() !=0 )
+#endif
     {
       nQuarticID=szbuff[7]-0x30;
       /*
@@ -197,7 +202,11 @@ bool AFP_TDSensitiveDetector::ProcessHits(G4Step* pStep, G4TouchableHistory*)
     }
 
   //////////////// Fast Cherenkov ///////////////////
+#if G4VERSION_NUMBER < 1100
   if ( (bRes=VolumeName.contains("TDQuarticBar[")) )
+#else
+  if ( (bRes=G4StrUtil::contains(VolumeName, "TDQuarticBar[")) )
+#endif
     {
       nQuarticID=szbuff[7]-0x30;
 
@@ -259,9 +268,14 @@ bool AFP_TDSensitiveDetector::ProcessHits(G4Step* pStep, G4TouchableHistory*)
 
       //G4int Rsize   = Rind->Entries() - 1;
       //G4double Pmin = Rind->GetMinPhotonEnergy();     // 800 nm
+#if G4VERSION_NUMBER < 1100
       G4double Pmin = Rind->GetMinLowEdgeEnergy();
       //G4double Pmax = Rind->GetMaxPhotonEnergy();  // 200 nm
       G4double Pmax = Rind->GetMaxLowEdgeEnergy();
+#else
+      G4double Pmin = Rind->GetMinEnergy();
+      G4double Pmax = Rind->GetMaxEnergy();
+#endif
       G4double dp   = Pmax - Pmin;
       //G4double maxCosTheta  = BetaInverse / Rind->GetMinProperty();
       G4double maxCosTheta  = BetaInverse / Rind->GetMinValue();
diff --git a/ForwardDetectors/ALFA/ALFA_BeamTransport/CMakeLists.txt b/ForwardDetectors/ALFA/ALFA_BeamTransport/CMakeLists.txt
index 832d178dc761443101d1b2a4ad5c37fa2cf7792e..84367134dbb448e9fee38d0e6fe5072ab309a0c3 100644
--- a/ForwardDetectors/ALFA/ALFA_BeamTransport/CMakeLists.txt
+++ b/ForwardDetectors/ALFA/ALFA_BeamTransport/CMakeLists.txt
@@ -4,15 +4,14 @@
 atlas_subdir( ALFA_BeamTransport )
 
 # External dependencies:
-find_package( Boost COMPONENTS filesystem thread system )
 find_package( ROOT COMPONENTS Core Tree MathCore Hist RIO pthread )
 
 # Component(s) in the package:
 atlas_add_component( ALFA_BeamTransport
                      src/*.cxx
                      src/components/*.cxx
-                     INCLUDE_DIRS ${Boost_INCLUDE_DIRS} ${ROOT_INCLUDE_DIRS} 
-                     LINK_LIBRARIES ${Boost_LIBRARIES} ${ROOT_LIBRARIES} AtlasHepMCLib AthenaBaseComps FPTracker GaudiKernel StoreGateLib xAODEventInfo GeneratorObjects FPTracker )
+                     INCLUDE_DIRS  ${ROOT_INCLUDE_DIRS} 
+                     LINK_LIBRARIES  ${ROOT_LIBRARIES} AtlasHepMCLib AthenaBaseComps FPTracker GaudiKernel StoreGateLib xAODEventInfo GeneratorObjects FPTracker )
 
 # Install files from the package:
 atlas_install_joboptions( share/*.py )
diff --git a/ForwardDetectors/ALFA/ALFA_BeamTransport/src/ALFA_BeamTrack.cxx b/ForwardDetectors/ALFA/ALFA_BeamTransport/src/ALFA_BeamTrack.cxx
index 1a1c437570080b5783e4c02aeb302cf026dc241d..816772e5e6e58a0c93f58a18111aafe1bfb2e722 100644
--- a/ForwardDetectors/ALFA/ALFA_BeamTransport/src/ALFA_BeamTrack.cxx
+++ b/ForwardDetectors/ALFA/ALFA_BeamTransport/src/ALFA_BeamTrack.cxx
@@ -16,17 +16,11 @@
 #include "FPTracker/getMagnetConfigFiles.h"
 #include "FPTracker/getAlfaMagnetConfigFiles.h"
 #include "FPTracker/ConfigData.h"
-//#include "FPTracker/readConfigData.h"
 #include "FPTracker/FPTrackerConstants.h"
 #include "FPTracker/Point.h"
-//Boost
-#include "boost/program_options/cmdline.hpp"
-#include "boost/program_options/options_description.hpp"
-#include "boost/program_options/parsers.hpp"
-#include "boost/program_options/variables_map.hpp"
-
 
 
+#include <memory>
 #include <iostream>
 #include <utility>
 
diff --git a/ForwardDetectors/ALFA/ALFA_BeamTransport/src/ALFA_BeamTrack.h b/ForwardDetectors/ALFA/ALFA_BeamTransport/src/ALFA_BeamTrack.h
index afbea6678f7b58b57a2a17ec65282afeec961d21..d6cf8f808a3bfb90ed9be3e63472818bf3b33526 100644
--- a/ForwardDetectors/ALFA/ALFA_BeamTransport/src/ALFA_BeamTrack.h
+++ b/ForwardDetectors/ALFA/ALFA_BeamTransport/src/ALFA_BeamTrack.h
@@ -23,11 +23,6 @@
 //#include "FPTracker/readConfigData.h"
 #include "FPTracker/FPTrackerConstants.h"
 #include "FPTracker/Point.h"
-//Boost
-#include "boost/program_options/cmdline.hpp"
-#include "boost/program_options/options_description.hpp"
-#include "boost/program_options/parsers.hpp"
-#include "boost/program_options/variables_map.hpp"
 #include <memory>
 
 class ALFA_BeamTrack
diff --git a/ForwardDetectors/LUCID/LUCID_SimUtils/LUCID_OpProcess/src/LucidPhysicsTool.cxx b/ForwardDetectors/LUCID/LUCID_SimUtils/LUCID_OpProcess/src/LucidPhysicsTool.cxx
index b8146c05f2cba60d3f74ed0bbd0bc2766b3e0a4a..cf010688e74a56ba581c8c0d0ed94bc0c3962966 100644
--- a/ForwardDetectors/LUCID/LUCID_SimUtils/LUCID_OpProcess/src/LucidPhysicsTool.cxx
+++ b/ForwardDetectors/LUCID/LUCID_SimUtils/LUCID_OpProcess/src/LucidPhysicsTool.cxx
@@ -92,8 +92,10 @@ void LucidPhysicsTool::ConstructProcess()
   theCerenkovProcess->SetMaxNumPhotonsPerStep(MaxNumPhotons);
 
   theScintillationProcess->SetTrackSecondariesFirst(true);
+#if G4VERSION_NUMBER < 1100
+  // This should be defaulted to 1. in 11.0 and newer
   theScintillationProcess->SetScintillationYieldFactor(1.);
-
+#endif
 
   PARTICLEITERATOR->reset();
 
diff --git a/Generators/Pythia8B_i/src/Pythia8B_i.cxx b/Generators/Pythia8B_i/src/Pythia8B_i.cxx
index 520ae6ebe2c2999b851bbd840c96da0c75416f3e..62818d85e6c9c13f0c71270b0b57dc19cfe0d59f 100644
--- a/Generators/Pythia8B_i/src/Pythia8B_i.cxx
+++ b/Generators/Pythia8B_i/src/Pythia8B_i.cxx
@@ -15,7 +15,6 @@
 #include "Pythia8B_i/UserSelections.h"
 #include "GeneratorObjects/McEventCollection.h"
 #include "AtlasHepMC/GenEvent.h"
-#include <boost/algorithm/string.hpp>
 
 // calls to fortran routines
 #include "AthenaKernel/RNGWrapper.h"
diff --git a/HLT/Event/ByteStreamEmonSvc/src/ByteStreamEmonInputSvc.cxx b/HLT/Event/ByteStreamEmonSvc/src/ByteStreamEmonInputSvc.cxx
index fd8ca3ea734c1c9afd5a1663b807e271a70e191f..312921180645de9a846c17c0257ba34b3cac195d 100644
--- a/HLT/Event/ByteStreamEmonSvc/src/ByteStreamEmonInputSvc.cxx
+++ b/HLT/Event/ByteStreamEmonSvc/src/ByteStreamEmonInputSvc.cxx
@@ -34,9 +34,6 @@
 #include <csignal>
 #include <sstream>
 
-#include <boost/algorithm/string.hpp>
-#include <boost/preprocessor/repetition.hpp>
-
 #include <memory>
 
 namespace {
diff --git a/HLT/Trigger/TrigControl/TrigServices/python/TrigServicesConfig.py b/HLT/Trigger/TrigControl/TrigServices/python/TrigServicesConfig.py
index 9eb3163825aa9e04a176ca368354c01d5284beb3..0b644e1578b6055cbb9a90b4106605a51b52d453 100644
--- a/HLT/Trigger/TrigControl/TrigServices/python/TrigServicesConfig.py
+++ b/HLT/Trigger/TrigControl/TrigServices/python/TrigServicesConfig.py
@@ -194,4 +194,6 @@ if __name__=="__main__":
    flags = defaultOnlineFlags()
    flags.lock()
 
-   TrigServicesCfg(flags)
+   cfg = ComponentAccumulator()
+   cfg.merge( TrigServicesCfg(flags) )
+   cfg.wasMerged()
diff --git a/InnerDetector/InDetConfig/python/ITkConfigFlags.py b/InnerDetector/InDetConfig/python/ITkConfigFlags.py
index 352b6b8d41be015cdab50d065f8d259938b68513..8bb00858e598edbc8e11f8ea6099073d4887ef4e 100644
--- a/InnerDetector/InDetConfig/python/ITkConfigFlags.py
+++ b/InnerDetector/InDetConfig/python/ITkConfigFlags.py
@@ -53,10 +53,6 @@ def createITkConfigFlags():
   itkcf.addFlag("ITk.Tracking.doDigitalClustering", False)
   itkcf.addFlag("ITk.Tracking.doFastTracking", False) # Turn running of ITk FastTracking on and off
   itkcf.addFlag("ITk.Tracking.doConversionFinding",True) # Turn running of ConversionFinding second pass on and off
-  itkcf.addFlag("ITk.Tracking.doPixelClusterSplitting", True) # Try to split pixel clusters
-  itkcf.addFlag("ITk.Tracking.pixelClusterSplittingType", "Truth") # choose splitter type: NeuralNet, AnalogClus or Truth
-  itkcf.addFlag("ITk.Tracking.pixelClusterSplitProb1", 0.55) # Cut value for splitting clusters into two parts
-  itkcf.addFlag("ITk.Tracking.pixelClusterSplitProb2", 0.45) # Cut value for splitting clusters into three parts
   itkcf.addFlag("ITk.Tracking.writeSeedValNtuple", False) # Turn writing of seed validation ntuple on and off
   itkcf.addFlag("ITk.Tracking.writeExtendedPRDInfo", False)
   # Turn running of doLowPt second pass on and off
diff --git a/InnerDetector/InDetConfig/python/ITkTrackRecoConfig.py b/InnerDetector/InDetConfig/python/ITkTrackRecoConfig.py
index 04aaad855f144aabdefedfd5d6ec0e371835bb1d..6828778ceea9c7381dba11571f59a57498a1a613 100644
--- a/InnerDetector/InDetConfig/python/ITkTrackRecoConfig.py
+++ b/InnerDetector/InDetConfig/python/ITkTrackRecoConfig.py
@@ -6,7 +6,8 @@ from AthenaConfiguration.Enums import Format
 
 from InDetConfig.TrackRecoConfig import FTAG_AUXDATA
 
-_flags_set = [] # For caching
+_flags_set = []  # For caching
+
 
 def CombinedTrackingPassFlagSets(flags):
 
@@ -49,10 +50,11 @@ def CombinedTrackingPassFlagSets(flags):
                                            "ITk.Tracking.LowPt")
         flags_set += [flagsLowPt]
 
-    _flags_set = flags_set # Put into cache 
+    _flags_set = flags_set  # Put into cache
 
     return flags_set
 
+
 def ITkClusterSplitProbabilityContainerName(flags):
     flags_set = CombinedTrackingPassFlagSets(flags)
     extension = flags_set[-1].ITk.Tracking.ActiveConfig.extension
@@ -82,7 +84,7 @@ def ITkTrackRecoCfg(flags):
     # Includes also tracks which end in standalone TrackParticle collections
     InputExtendedITkTracks = []
     ClusterSplitProbContainer = ""
-    StatTrackCollections = [] # To be passed to the InDetRecStatistics alg
+    StatTrackCollections = []  # To be passed to the InDetRecStatistics alg
     StatTrackTruthCollections = []
 
     from InDetConfig.ITkTrackingSiPatternConfig import ITkTrackingSiPatternCfg
@@ -97,10 +99,10 @@ def ITkTrackRecoCfg(flags):
 
         result.merge(ITkTrackingSiPatternCfg(
             current_flags,
-            InputCollections = InputExtendedITkTracks,
-            ResolvedTrackCollectionKey = TrackContainer,
-            SiSPSeededTrackCollectionKey = SiSPSeededTracks,
-            ClusterSplitProbContainer = ClusterSplitProbContainer))
+            InputCollections=InputExtendedITkTracks,
+            ResolvedTrackCollectionKey=TrackContainer,
+            SiSPSeededTrackCollectionKey=SiSPSeededTracks,
+            ClusterSplitProbContainer=ClusterSplitProbContainer))
         StatTrackCollections += [SiSPSeededTracks, TrackContainer]
         StatTrackTruthCollections += [SiSPSeededTracks+"TruthCollection",
                                       TrackContainer+"TruthCollection"]
@@ -109,22 +111,22 @@ def ITkTrackRecoCfg(flags):
             if flags.Tracking.doTruth:
                 result.merge(ITkTrackTruthCfg(
                     current_flags,
-                    Tracks = TrackContainer,
-                    DetailedTruth = TrackContainer+"DetailedTruth",
-                    TracksTruth = TrackContainer+"TruthCollection"))
-                                              
+                    Tracks=TrackContainer,
+                    DetailedTruth=TrackContainer+"DetailedTruth",
+                    TracksTruth=TrackContainer+"TruthCollection"))
+
             result.merge(ITkTrackParticleCnvAlgCfg(
                 current_flags,
-                name = extension + "TrackParticleCnvAlg",
-                TrackContainerName = TrackContainer,
-                xAODTrackParticlesFromTracksContainerName = \
-                "InDet" + extension + "TrackParticles",
-                ClusterSplitProbabilityName = ClusterSplitProbContainer,
-                AssociationMapName = ""))
+                name=extension + "TrackParticleCnvAlg",
+                TrackContainerName=TrackContainer,
+                xAODTrackParticlesFromTracksContainerName=(
+                    "InDet" + extension + "TrackParticles"),
+                ClusterSplitProbabilityName=ClusterSplitProbContainer,
+                AssociationMapName=""))
 
         else:
-            ClusterSplitProbContainer = "ITkAmbiguityProcessorSplitProb" + \
-                                        extension
+            ClusterSplitProbContainer = (
+                "ITkAmbiguityProcessorSplitProb" + extension)
             InputCombinedITkTracks += [TrackContainer]
 
         InputExtendedITkTracks += [TrackContainer]
@@ -133,18 +135,19 @@ def ITkTrackRecoCfg(flags):
         ITkTrackCollectionMergerAlgCfg)
     result.merge(ITkTrackCollectionMergerAlgCfg(
         flags,
-        InputCombinedTracks = InputCombinedITkTracks,
+        InputCombinedTracks=InputCombinedITkTracks,
         OutputCombinedTracks="CombinedITkTracks",
-        AssociationMapName = "PRDtoTrackMapCombinedITkTracks" \
-        if not flags.ITk.Tracking.doFastTracking else ""))
+        AssociationMapName=(
+            "PRDtoTrackMapCombinedITkTracks"
+            if not flags.ITk.Tracking.doFastTracking else "")))
 
     if flags.Tracking.doTruth:
         from InDetConfig.ITkTrackTruthConfig import ITkTrackTruthCfg
         result.merge(ITkTrackTruthCfg(
             flags,
-            Tracks = "CombinedITkTracks",
-            DetailedTruth = "CombinedITkTracksDetailedTruth",
-            TracksTruth = "CombinedITkTracksTruthCollection"))
+            Tracks="CombinedITkTracks",
+            DetailedTruth="CombinedITkTracksDetailedTruth",
+            TracksTruth="CombinedITkTracksTruthCollection"))
 
     StatTrackCollections += ["CombinedITkTracks"]
     StatTrackTruthCollections += ["CombinedITkTracksTruthCollection"]
@@ -153,18 +156,19 @@ def ITkTrackRecoCfg(flags):
         from TrkConfig.TrkTrackSlimmerConfig import TrackSlimmerCfg
         result.merge(TrackSlimmerCfg(
             flags,
-            TrackLocation = ["CombinedITkTracks"]))
+            TrackLocation=["CombinedITkTracks"]))
 
     if flags.Tracking.doTruth:
         result.merge(ITkTrackTruthCfg(flags))
 
     result.merge(ITkTrackParticleCnvAlgCfg(
         flags,
-        ClusterSplitProbabilityName = \
-        ITkClusterSplitProbabilityContainerName(flags) \
-        if not flags.ITk.Tracking.doFastTracking else "",
-        AssociationMapName = "PRDtoTrackMapCombinedITkTracks" \
-        if not flags.ITk.Tracking.doFastTracking else ""))
+        ClusterSplitProbabilityName=(
+            ITkClusterSplitProbabilityContainerName(flags)
+            if not flags.ITk.Tracking.doFastTracking else ""),
+        AssociationMapName=(
+            "PRDtoTrackMapCombinedITkTracks"
+            if not flags.ITk.Tracking.doFastTracking else "")))
 
     if flags.Tracking.doVertexFinding:
         from InDetConfig.InDetPriVxFinderConfig import primaryVertexFindingCfg
@@ -175,24 +179,24 @@ def ITkTrackRecoCfg(flags):
             ITkRecStatisticsAlgCfg)
         result.merge(ITkRecStatisticsAlgCfg(
             flags,
-            TrackCollectionKeys = StatTrackCollections,
-            TrackTruthCollectionKeys = \
-            StatTrackTruthCollections if flags.Tracking.doTruth else []))
+            TrackCollectionKeys=StatTrackCollections,
+            TrackTruthCollectionKeys=(
+                StatTrackTruthCollections if flags.Tracking.doTruth else [])))
 
         if flags.Tracking.doTruth:
             from InDetConfig.InDetTrackClusterAssValidationConfig import (
                 ITkTrackClusterAssValidationCfg)
             result.merge(ITkTrackClusterAssValidationCfg(
-                flags_set[0], # Use cuts from primary pass
-                TracksLocation = StatTrackCollections))
+                flags_set[0],  # Use cuts from primary pass
+                TracksLocation=StatTrackCollections))
 
     if flags.ITk.Tracking.writeExtendedPRDInfo:
         from InDetConfig.InDetPrepRawDataToxAODConfig import (
             ITkPixelPrepDataToxAODCfg, ITkStripPrepDataToxAODCfg)
         result.merge(ITkPixelPrepDataToxAODCfg(
             flags,
-            ClusterSplitProbabilityName = \
-            ITkClusterSplitProbabilityContainerName(flags)))
+            ClusterSplitProbabilityName=(
+                ITkClusterSplitProbabilityContainerName(flags))))
         result.merge(ITkStripPrepDataToxAODCfg(flags))
 
         from DerivationFrameworkInDet.InDetToolsConfig import (
@@ -205,35 +209,36 @@ def ITkTrackRecoCfg(flags):
         result.addEventAlgo(
             CompFactory.DerivationFramework.CommonAugmentation(
                 "ITkCommonKernel",
-                AugmentationTools = [TrackStateOnSurfaceDecorator]))
+                AugmentationTools=[TrackStateOnSurfaceDecorator]))
 
         if flags.Input.isMC:
             from InDetPhysValMonitoring.InDetPhysValDecorationConfig import (
                 InDetPhysHitDecoratorAlgCfg)
             result.merge(InDetPhysHitDecoratorAlgCfg(flags))
-    
+
     if flags.Tracking.doStoreTrackSeeds:
         TrackContainer = "SiSPSeedSegments"
         result.merge(ITkTrackTruthCfg(
             flags,
-            Tracks = TrackContainer,
-            DetailedTruth = f"{TrackContainer}DetailedTruth",
-            TracksTruth = f"{TrackContainer}TruthCollection"))
+            Tracks=TrackContainer,
+            DetailedTruth=f"{TrackContainer}DetailedTruth",
+            TracksTruth=f"{TrackContainer}TruthCollection"))
 
         result.merge(ITkTrackParticleCnvAlgCfg(
             flags,
-            name = f"{TrackContainer}TrackParticleCnvAlg",
-            TrackContainerName = TrackContainer,
-            xAODTrackParticlesFromTracksContainerName = \
-            f"{TrackContainer}TrackParticles"))
+            name=f"{TrackContainer}TrackParticleCnvAlg",
+            TrackContainerName=TrackContainer,
+            xAODTrackParticlesFromTracksContainerName=(
+                f"{TrackContainer}TrackParticles")))
 
     # output
     result.merge(ITkTrackRecoOutputCfg(flags))
 
     return result
 
+
 def ITkTrackRecoOutputCfg(flags):
-    from OutputStreamAthenaPool.OutputStreamConfig import addToESD,addToAOD
+    from OutputStreamAthenaPool.OutputStreamConfig import addToESD, addToAOD
     toAOD = []
     toESD = []
 
@@ -255,9 +260,10 @@ def ITkTrackRecoOutputCfg(flags):
         "InDet::SCT_ClusterContainer#ITkStripClusters",
         "InDet::PixelClusterContainer#ITkPixelClusters",
         "InDet::PixelGangedClusterAmbiguities#ITkPixelClusterAmbiguitiesMap",
-        "InDet::PixelGangedClusterAmbiguities#ITkSplitClusterAmbiguityMap"
     ]
-    toESD += ["Trk::ClusterSplitProbabilityContainer#" + \
+    if flags.Tracking.doPixelClusterSplitting:
+        toESD += ["InDet::PixelGangedClusterAmbiguities#ITkSplitClusterAmbiguityMap"]
+    toESD += ["Trk::ClusterSplitProbabilityContainer#" +
               ITkClusterSplitProbabilityContainerName(flags)]
 
     # Save (Detailed) Track Truth
@@ -273,7 +279,8 @@ def ITkTrackRecoOutputCfg(flags):
 
     ##### AOD #####
     toAOD += ["xAOD::TrackParticleContainer#InDetTrackParticles"]
-    toAOD += [f"xAOD::TrackParticleAuxContainer#InDetTrackParticlesAux.{excludedAuxData}"]
+    toAOD += [
+        f"xAOD::TrackParticleAuxContainer#InDetTrackParticlesAux.{excludedAuxData}"]
 
     if flags.ITk.Tracking.writeExtendedPRDInfo:
         toAOD += [
@@ -287,8 +294,8 @@ def ITkTrackRecoOutputCfg(flags):
             "xAOD::TrackStateValidationAuxContainer#ITkStripMSOSsAux."
         ]
 
-    if flags.Tracking.doLargeD0 and \
-       flags.Tracking.storeSeparateLargeD0Container:
+    if (flags.Tracking.doLargeD0 and
+            flags.Tracking.storeSeparateLargeD0Container):
         toAOD += [
             'xAOD::TrackParticleContainer#InDet{}TrackParticles'.format(
                 flags.ITk.Tracking.LargeD0Pass.extension
@@ -334,7 +341,7 @@ if __name__ == "__main__":
     top_acc.merge(ITkTrackRecoCfg(flags))
 
     from AthenaCommon.Constants import DEBUG
-    top_acc.foreach_component("AthEventSeq/*").OutputLevel=DEBUG
+    top_acc.foreach_component("AthEventSeq/*").OutputLevel = DEBUG
     top_acc.printConfig(withDetails=True, summariseProps=True)
     top_acc.store(open("ITkTrackReco.pkl", "wb"))
 
diff --git a/InnerDetector/InDetConfig/python/InDetAmbiTrackSelectionToolConfig.py b/InnerDetector/InDetConfig/python/InDetAmbiTrackSelectionToolConfig.py
index 1b1ee62398bd12f7dccd739f7feac3f0fb8ec4df..9bbbebeab4a44570b4bca9712c458d6a913345fc 100644
--- a/InnerDetector/InDetConfig/python/InDetAmbiTrackSelectionToolConfig.py
+++ b/InnerDetector/InDetConfig/python/InDetAmbiTrackSelectionToolConfig.py
@@ -33,13 +33,13 @@ def InDetAmbiTrackSelectionToolCfg(flags, name="InDetAmbiTrackSelectionTool", **
     kwargs.setdefault("UseParameterization", False)
     kwargs.setdefault("Cosmics", flags.Beam.Type is BeamType.Cosmics)
     kwargs.setdefault("doPixelSplitting",
-                      flags.InDet.Tracking.doPixelClusterSplitting)
+                      flags.Tracking.doPixelClusterSplitting)
 
     if flags.InDet.Tracking.ActiveConfig.useTIDE_Ambi:
         kwargs.setdefault("sharedProbCut",
-                          flags.InDet.Tracking.pixelClusterSplitProb1)
+                          flags.Tracking.pixelClusterSplitProb1)
         kwargs.setdefault("sharedProbCut2",
-                          flags.InDet.Tracking.pixelClusterSplitProb2)
+                          flags.Tracking.pixelClusterSplitProb2)
         kwargs.setdefault("minSiHitsToAllowSplitting",
                           8 if flags.GeoModel.Run is LHCPeriod.Run1 else 9)
         kwargs.setdefault("minUniqueSCTHits", 4)
@@ -134,7 +134,7 @@ def InDetTRTAmbiTrackSelectionToolCfg(flags, name='InDetTRT_SeededAmbiTrackSelec
                       flags.InDet.Tracking.ActiveConfig.useParameterizedTRTCuts)
     kwargs.setdefault("Cosmics", flags.Beam.Type is BeamType.Cosmics)
     kwargs.setdefault("doPixelSplitting",
-                      flags.InDet.Tracking.doPixelClusterSplitting)
+                      flags.Tracking.doPixelClusterSplitting)
 
     acc.setPrivateTools(
         CompFactory.InDet.InDetAmbiTrackSelectionTool(name, **kwargs))
@@ -181,13 +181,13 @@ def ITkAmbiTrackSelectionToolCfg(flags, name="ITkAmbiTrackSelectionTool", **kwar
     kwargs.setdefault("UseParameterization", False)
     kwargs.setdefault("Cosmics", flags.Beam.Type is BeamType.Cosmics)
     kwargs.setdefault("doPixelSplitting",
-                      flags.ITk.Tracking.doPixelClusterSplitting)
+                      flags.Tracking.doPixelClusterSplitting)
     kwargs.setdefault("doITk", True)
 
     kwargs.setdefault("sharedProbCut",
-                      flags.ITk.Tracking.pixelClusterSplitProb1)
+                      flags.Tracking.pixelClusterSplitProb1)
     kwargs.setdefault("sharedProbCut2",
-                      flags.ITk.Tracking.pixelClusterSplitProb2)
+                      flags.Tracking.pixelClusterSplitProb2)
     kwargs.setdefault("minSiHitsToAllowSplitting", 9)
     kwargs.setdefault("minUniqueSCTHits", 4)
     kwargs.setdefault("minTrackChi2ForSharedHits", 3)
diff --git a/InnerDetector/InDetConfig/python/InDetConfigFlags.py b/InnerDetector/InDetConfig/python/InDetConfigFlags.py
index cb4ae545ccc4240f501606e1a853c8f6b72a558e..eba797309de28dc73d77a4bc5708cfc38121b8c7 100644
--- a/InnerDetector/InDetConfig/python/InDetConfigFlags.py
+++ b/InnerDetector/InDetConfig/python/InDetConfigFlags.py
@@ -1,7 +1,7 @@
 # Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
 
 from AthenaConfiguration.AthConfigFlags import AthConfigFlags
-from AthenaConfiguration.Enums import BeamType, LHCPeriod
+from AthenaConfiguration.Enums import BeamType
 
 def createInDetConfigFlags():
     icf = AthConfigFlags()
@@ -41,17 +41,6 @@ def createInDetConfigFlags():
 
     # Tracking parameters
 
-    # Try to split pixel clusters
-    icf.addFlag("InDet.Tracking.doPixelClusterSplitting",
-                lambda prevFlags: not(prevFlags.Beam.Type is BeamType.Cosmics))
-    # choose splitter type: NeuralNet or AnalogClus
-    icf.addFlag("InDet.Tracking.pixelClusterSplittingType", "NeuralNet")
-    # Cut value for splitting clusters into two parts
-    icf.addFlag("InDet.Tracking.pixelClusterSplitProb1",
-                lambda prevFlags: (0.5 if prevFlags.GeoModel.Run is LHCPeriod.Run1 else 0.55))
-    # Cut value for splitting clusters into three parts
-    icf.addFlag("InDet.Tracking.pixelClusterSplitProb2",
-                lambda prevFlags: (0.5 if prevFlags.GeoModel.Run is LHCPeriod.Run1 else 0.45))
     # use beam spot position in pixel NN
     icf.addFlag("InDet.Tracking.useBeamSpotInfoNN", True)
     # Enable check for dead modules and FEs
diff --git a/InnerDetector/InDetConfig/python/SiClusterOnTrackTool_PixelConfig.py b/InnerDetector/InDetConfig/python/SiClusterOnTrackTool_PixelConfig.py
index 41cb137797fe2f0d8154427aeb8c1929ade016a3..949d6e9178542e138dc745fad336fbeb10469ec6 100644
--- a/InnerDetector/InDetConfig/python/SiClusterOnTrackTool_PixelConfig.py
+++ b/InnerDetector/InDetConfig/python/SiClusterOnTrackTool_PixelConfig.py
@@ -31,14 +31,12 @@ def InDetPixelClusterOnTrackToolBaseCfg(flags, name="PixelClusterOnTrackTool", *
         kwargs.setdefault("ErrorStrategy", 0)
         kwargs.setdefault("PositionStrategy", 0)
 
-    kwargs.setdefault(
-        "applyNNcorrection",
-        flags.InDet.Tracking.doPixelClusterSplitting and
-        flags.InDet.Tracking.pixelClusterSplittingType == "NeuralNet")
-    kwargs.setdefault(
-        "NNIBLcorrection",
-        flags.InDet.Tracking.doPixelClusterSplitting and
-        flags.InDet.Tracking.pixelClusterSplittingType == "NeuralNet")
+    kwargs.setdefault("applyNNcorrection",
+                      flags.Tracking.doPixelClusterSplitting and
+                      flags.Tracking.pixelClusterSplittingType == "NeuralNet")
+    kwargs.setdefault("NNIBLcorrection",
+                      flags.Tracking.doPixelClusterSplitting and
+                      flags.Tracking.pixelClusterSplittingType == "NeuralNet")
     split_cluster_map_extension = (
         flags.InDet.Tracking.ActiveConfig.extension
         if flags.InDet.Tracking.ActiveConfig.useTIDE_Ambi else "")
@@ -59,8 +57,8 @@ def InDetPixelClusterOnTrackToolDigitalCfg(flags, name="InDetPixelClusterOnTrack
 def InDetPixelClusterOnTrackToolNNSplittingCfg(flags, name="InDetPixelClusterOnTrackToolNNSplitting", **kwargs):
     acc = ComponentAccumulator()
 
-    if (flags.InDet.Tracking.doPixelClusterSplitting and
-        flags.InDet.Tracking.pixelClusterSplittingType == "NeuralNet" and
+    if (flags.Tracking.doPixelClusterSplitting and
+        flags.Tracking.pixelClusterSplittingType == "NeuralNet" and
             "NnClusterizationFactory" not in kwargs):
         from InDetConfig.SiClusterizationToolConfig import (
             NnClusterizationFactoryCfg)
@@ -154,8 +152,8 @@ def ITkPixelClusterOnTrackToolBaseCfg(flags, name="ITkPixelClusterOnTrackTool",
 def ITkPixelClusterOnTrackToolTruthSplittingCfg(flags, name='ITkPixelClusterOnTrackToolTruthSplitting', **kwargs):
     acc = ComponentAccumulator()
 
-    if (flags.ITk.Tracking.doPixelClusterSplitting and
-            flags.ITk.Tracking.pixelClusterSplittingType == "Truth"):
+    if (flags.Tracking.doPixelClusterSplitting and
+            flags.Tracking.pixelClusterSplittingType == "Truth"):
         if 'NnClusterizationFactory' not in kwargs:
             from InDetConfig.SiClusterizationToolConfig import (
                 ITkTruthClusterizationFactoryCfg)
diff --git a/InnerDetector/InDetConfig/python/SiClusterizationToolConfig.py b/InnerDetector/InDetConfig/python/SiClusterizationToolConfig.py
index b562336658ea9d1222856b8799d7460597ed0b06..893f46cc6237d68f021d9eaaf58ad29f77bc0568 100644
--- a/InnerDetector/InDetConfig/python/SiClusterizationToolConfig.py
+++ b/InnerDetector/InDetConfig/python/SiClusterizationToolConfig.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration
+# Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
 # Configuration of SiClusterizationTool package
 
 from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
@@ -6,335 +6,427 @@ from AthenaConfiguration.ComponentFactory import CompFactory
 from AthenaConfiguration.Enums import BeamType, LHCPeriod
 from IOVDbSvc.IOVDbSvcConfig import addFoldersSplitOnline
 
-def ClusterMakerToolCfg(flags, name="InDetClusterMakerTool", **kwargs) :
+
+def ClusterMakerToolCfg(flags, name="InDetClusterMakerTool"):
     acc = ComponentAccumulator()
+    kwargs = {}
 
     # This directly needs the following Conditions data:
     # PixelChargeCalibCondData & PixelOfflineCalibData
-    from PixelConditionsAlgorithms.PixelConditionsConfig import PixelChargeLUTCalibCondAlgCfg, PixelChargeCalibCondAlgCfg, PixelOfflineCalibCondAlgCfg
+    from PixelConditionsAlgorithms.PixelConditionsConfig import (
+        PixelChargeLUTCalibCondAlgCfg, PixelChargeCalibCondAlgCfg,
+        PixelOfflineCalibCondAlgCfg)
     if flags.GeoModel.Run is LHCPeriod.Run3:
         acc.merge(PixelChargeLUTCalibCondAlgCfg(flags))
     else:
         acc.merge(PixelChargeCalibCondAlgCfg(flags))
     acc.merge(PixelOfflineCalibCondAlgCfg(flags))
 
-    from PixelReadoutGeometry.PixelReadoutGeometryConfig import PixelReadoutManagerCfg
+    from PixelReadoutGeometry.PixelReadoutGeometryConfig import (
+        PixelReadoutManagerCfg)
     acc.merge(PixelReadoutManagerCfg(flags))
 
-    from SiLorentzAngleTool.PixelLorentzAngleConfig import PixelLorentzAngleToolCfg
-    PixelLorentzAngleTool = acc.popToolsAndMerge(PixelLorentzAngleToolCfg(flags))
-    from SiLorentzAngleTool.SCT_LorentzAngleConfig import SCT_LorentzAngleToolCfg
-    SCTLorentzAngleTool = acc.popToolsAndMerge( SCT_LorentzAngleToolCfg(flags) )
+    from SiLorentzAngleTool.PixelLorentzAngleConfig import (
+        PixelLorentzAngleToolCfg)
+    kwargs["PixelLorentzAngleTool"] = acc.popToolsAndMerge(
+        PixelLorentzAngleToolCfg(flags))
 
-    kwargs.setdefault("PixelLorentzAngleTool", PixelLorentzAngleTool)
-    kwargs.setdefault("SCTLorentzAngleTool", SCTLorentzAngleTool)
+    from SiLorentzAngleTool.SCT_LorentzAngleConfig import (
+        SCT_LorentzAngleToolCfg)
+    kwargs["SCTLorentzAngleTool"] = acc.popToolsAndMerge(
+        SCT_LorentzAngleToolCfg(flags))
 
-    InDetClusterMakerTool = CompFactory.InDet.ClusterMakerTool(name, **kwargs)
-    acc.setPrivateTools(InDetClusterMakerTool)
+    acc.setPrivateTools(CompFactory.InDet.ClusterMakerTool(name, **kwargs))
     return acc
 
-def ITkClusterMakerToolCfg(flags, name="ITkClusterMakerTool", **kwargs) :
+
+def ITkClusterMakerToolCfg(flags, name="ITkClusterMakerTool"):
     acc = ComponentAccumulator()
+    kwargs = {}
 
-    from PixelConditionsAlgorithms.ITkPixelConditionsConfig import ITkPixelChargeCalibCondAlgCfg
-    from PixelReadoutGeometry.PixelReadoutGeometryConfig import ITkPixelReadoutManagerCfg
+    from PixelConditionsAlgorithms.ITkPixelConditionsConfig import (
+        ITkPixelChargeCalibCondAlgCfg)
+    from PixelReadoutGeometry.PixelReadoutGeometryConfig import (
+        ITkPixelReadoutManagerCfg)
 
     # This directly needs the following Conditions data:
     # PixelModuleData & PixelChargeCalibCondData
     acc.merge(ITkPixelChargeCalibCondAlgCfg(flags))
     acc.merge(ITkPixelReadoutManagerCfg(flags))
+    kwargs["PixelReadoutManager"] = acc.getService("ITkPixelReadoutManager")
+
+    from SiLorentzAngleTool.ITkPixelLorentzAngleConfig import (
+        ITkPixelLorentzAngleToolCfg)
+    kwargs["PixelLorentzAngleTool"] = acc.popToolsAndMerge(
+        ITkPixelLorentzAngleToolCfg(flags))
 
-    from SiLorentzAngleTool.ITkPixelLorentzAngleConfig import ITkPixelLorentzAngleToolCfg
-    ITkPixelLorentzAngleTool = acc.popToolsAndMerge(ITkPixelLorentzAngleToolCfg(flags))
-    from SiLorentzAngleTool.ITkStripLorentzAngleConfig import ITkStripLorentzAngleToolCfg
-    ITkStripLorentzAngleTool = acc.popToolsAndMerge(ITkStripLorentzAngleToolCfg(flags))
+    from SiLorentzAngleTool.ITkStripLorentzAngleConfig import (
+        ITkStripLorentzAngleToolCfg)
+    kwargs["SCTLorentzAngleTool"] = acc.popToolsAndMerge(
+        ITkStripLorentzAngleToolCfg(flags))
 
-    kwargs.setdefault("PixelChargeCalibCondData", "ITkPixelChargeCalibCondData")
-    kwargs.setdefault("PixelReadoutManager",acc.getService("ITkPixelReadoutManager"))
-    kwargs.setdefault("PixelLorentzAngleTool", ITkPixelLorentzAngleTool)
-    kwargs.setdefault("SCTLorentzAngleTool", ITkStripLorentzAngleTool)
-    kwargs.setdefault("PixelOfflineCalibData", "")
+    kwargs["PixelChargeCalibCondData"] = "ITkPixelChargeCalibCondData"
+    kwargs["PixelOfflineCalibData"] = ""
 
-    ITkClusterMakerTool = CompFactory.InDet.ClusterMakerTool(name, **kwargs)
-    acc.setPrivateTools(ITkClusterMakerTool)
+    acc.setPrivateTools(CompFactory.InDet.ClusterMakerTool(name, **kwargs))
     return acc
 
-def InDetPixelRDOToolCfg(flags, name="InDetPixelRDOTool", **kwargs):
-    acc = ComponentAccumulator()
 
-    from PixelConditionsTools.PixelConditionsSummaryConfig import PixelConditionsSummaryCfg
-    kwargs.setdefault("PixelConditionsSummaryTool", acc.popToolsAndMerge(PixelConditionsSummaryCfg(flags)) )
+def InDetPixelRDOToolCfg(flags, name="InDetPixelRDOTool",
+                         PixelDetElStatus="PixelDetectorElementStatus"):
+    # To produce PixelDetectorElementCollection condition data
+    from PixelGeoModel.PixelGeoModelConfig import PixelReadoutGeometryCfg
+    acc = PixelReadoutGeometryCfg(flags)
+    kwargs = {}
+    kwargs["PixelDetElStatus"] = PixelDetElStatus
+
+    if PixelDetElStatus != "":
+        from PixelConditionsAlgorithms.PixelConditionsConfig import (
+            PixelDetectorElementStatusAlgCfg)
+        acc.merge(PixelDetectorElementStatusAlgCfg(flags))
 
-    if "PixelDetElStatus" not in kwargs :
-         from PixelConditionsAlgorithms.PixelConditionsConfig import PixelDetectorElementStatusAlgCfg
-         acc.merge( PixelDetectorElementStatusAlgCfg(flags) )
-         kwargs.setdefault("PixelDetElStatus", "PixelDetectorElementStatus")
+    from PixelConditionsTools.PixelConditionsSummaryConfig import (
+        PixelConditionsSummaryCfg)
+    kwargs["PixelConditionsSummaryTool"] = acc.popToolsAndMerge(
+        PixelConditionsSummaryCfg(flags))
 
-    # Enable duplicated RDO check for data15 because duplication mechanism was used.
-    if len(flags.Input.ProjectName)>=6 and flags.Input.ProjectName[:6]=="data15":
-        kwargs.setdefault("CheckDuplicatedRDO", True )
+    # Enable duplicated RDO check for data15 because duplication mechanism
+    # was used.
+    kwargs["CheckDuplicatedRDO"] = (len(flags.Input.ProjectName) >= 6 and
+                                    flags.Input.ProjectName[:6] == "data15")
 
     acc.setPrivateTools(CompFactory.InDet.PixelRDOTool(name, **kwargs))
     return acc
 
 
-def ITkPixelRDOToolCfg(flags, name="ITkPixelRDOTool", **kwargs):
-    acc = ComponentAccumulator()
+def ITkPixelRDOToolCfg(flags, name="ITkPixelRDOTool"):
+    # To produce ITkPixelDetectorElementCollection condition data
+    from PixelGeoModelXml.ITkPixelGeoModelConfig import (
+        ITkPixelReadoutGeometryCfg)
+    acc = ITkPixelReadoutGeometryCfg(flags)
+    kwargs = {}
 
-    from PixelConditionsTools.ITkPixelConditionsSummaryConfig import ITkPixelConditionsSummaryCfg
-    kwargs.setdefault(
-        "PixelConditionsSummaryTool",
-        acc.popToolsAndMerge(ITkPixelConditionsSummaryCfg(flags))
-    )
-    kwargs.setdefault("PixelDetEleCollKey","ITkPixelDetectorElementCollection")
-    kwargs.setdefault("CheckGanged", False)
+    from PixelConditionsTools.ITkPixelConditionsSummaryConfig import (
+        ITkPixelConditionsSummaryCfg)
+    kwargs["PixelConditionsSummaryTool"] = acc.popToolsAndMerge(
+        ITkPixelConditionsSummaryCfg(flags))
+
+    kwargs["PixelDetEleCollKey"] = "ITkPixelDetectorElementCollection"
+    kwargs["CheckGanged"] = False
 
     acc.setPrivateTools(CompFactory.InDet.PixelRDOTool(name, **kwargs))
     return acc
 
 
-def TrigPixelRDOToolCfg(flags, name="InDetTrigPixelRDOTool", **kwargs):
-    kwargs.setdefault("PixelDetElStatus", "")
-    return InDetPixelRDOToolCfg(flags, name, **kwargs)
+def TrigPixelRDOToolCfg(flags, name="InDetTrigPixelRDOTool"):
+    return InDetPixelRDOToolCfg(flags, name, PixelDetElStatus="")
 
 
-def MergedPixelsToolCfg(flags, name="InDetMergedPixelsTool", **kwargs) :
+def MergedPixelsToolCfg(flags, name="InDetMergedPixelsTool"):
     acc = ComponentAccumulator()
-    # --- now load the framework for the clustering
-    kwargs.setdefault("globalPosAlg", acc.popToolsAndMerge(ClusterMakerToolCfg(flags)))
-    kwargs.setdefault("PixelRDOTool", acc.popToolsAndMerge(InDetPixelRDOToolCfg(flags)))
+    kwargs = {}
+
+    kwargs["globalPosAlg"] = acc.popToolsAndMerge(ClusterMakerToolCfg(flags))
+    kwargs["PixelRDOTool"] = acc.popToolsAndMerge(InDetPixelRDOToolCfg(flags))
 
-    InDetMergedPixelsTool = CompFactory.InDet.MergedPixelsTool(name, **kwargs)
-    acc.setPrivateTools(InDetMergedPixelsTool)
+    acc.setPrivateTools(CompFactory.InDet.MergedPixelsTool(name, **kwargs))
     return acc
 
 
-def TrigMergedPixelsToolCfg(flags, name="InDetTrigMergedPixelsTool", **kwargs) :
+def TrigMergedPixelsToolCfg(flags, name="InDetTrigMergedPixelsTool"):
     acc = ComponentAccumulator()
-    kwargs.setdefault("globalPosAlg", acc.popToolsAndMerge(ClusterMakerToolCfg(flags)))
-    kwargs.setdefault("PixelRDOTool", acc.popToolsAndMerge(TrigPixelRDOToolCfg(flags)))
+    kwargs = {}
+
+    kwargs["globalPosAlg"] = acc.popToolsAndMerge(ClusterMakerToolCfg(flags))
+    kwargs["PixelRDOTool"] = acc.popToolsAndMerge(TrigPixelRDOToolCfg(flags))
+
     acc.setPrivateTools(CompFactory.InDet.MergedPixelsTool(name, **kwargs))
     return acc
 
-def ITkMergedPixelsToolCfg(flags, name="ITkMergedPixelsTool", **kwargs) :
+
+def ITkMergedPixelsToolCfg(flags, name="ITkMergedPixelsTool"):
     acc = ComponentAccumulator()
-    # --- now load the framework for the clustering
-    kwargs.setdefault("globalPosAlg", acc.popToolsAndMerge(ITkClusterMakerToolCfg(flags)))
-    kwargs.setdefault("PixelRDOTool", acc.popToolsAndMerge(ITkPixelRDOToolCfg(flags)))
+    kwargs = {}
 
-    ITkMergedPixelsTool = CompFactory.InDet.MergedPixelsTool(name, **kwargs)
-    acc.setPrivateTools(ITkMergedPixelsTool)
+    kwargs["globalPosAlg"] = acc.popToolsAndMerge(
+        ITkClusterMakerToolCfg(flags))
+    kwargs["PixelRDOTool"] = acc.popToolsAndMerge(ITkPixelRDOToolCfg(flags))
+
+    acc.setPrivateTools(CompFactory.InDet.MergedPixelsTool(name, **kwargs))
     return acc
 
-def PixelClusterNnCondAlgCfg(flags, **kwargs):
+
+def PixelClusterNnCondAlgCfg(flags, name="PixelClusterNnCondAlg",
+                             trackNetwork=False):
     acc = ComponentAccumulator()
-    track_nn = kwargs.pop('TrackNetwork',False)
+    kwargs = {}
+
     nn_names = [
-          "NumberParticles_NoTrack/",
-          "ImpactPoints1P_NoTrack/",
-          "ImpactPoints2P_NoTrack/",
-          "ImpactPoints3P_NoTrack/",
-          "ImpactPointErrorsX1_NoTrack/",
-          "ImpactPointErrorsX2_NoTrack/",
-          "ImpactPointErrorsX3_NoTrack/",
-          "ImpactPointErrorsY1_NoTrack/",
-          "ImpactPointErrorsY2_NoTrack/",
-          "ImpactPointErrorsY3_NoTrack/" ]
-
-    if track_nn :
-        nn_names = [ elm.replace('_NoTrack', '')  for elm in nn_names ]
-
-    acc.merge(addFoldersSplitOnline(flags, "PIXEL", "/PIXEL/Onl/PixelClustering/PixelClusNNCalib", "/PIXEL/PixelClustering/PixelClusNNCalib", className='CondAttrListCollection'))
-    kwargs.setdefault("NetworkNames", nn_names)
-    kwargs.setdefault("WriteKey", 'PixelClusterNN' if not track_nn else 'PixelClusterNNWithTrack')
-
-    if 'NetworkToHistoTool' not in kwargs:
-        from TrkConfig.TrkNeuralNetworkUtilsConfig import NeuralNetworkToHistoToolCfg
-        NeuralNetworkToHistoTool = acc.popToolsAndMerge(NeuralNetworkToHistoToolCfg(flags))
-        kwargs.setdefault("NetworkToHistoTool", NeuralNetworkToHistoTool)
-
-    acc.addCondAlgo(CompFactory.InDet.TTrainedNetworkCondAlg(kwargs.pop("name", 'PixelClusterNnCondAlg'), **kwargs))
+        "NumberParticles_NoTrack/",
+        "ImpactPoints1P_NoTrack/",
+        "ImpactPoints2P_NoTrack/",
+        "ImpactPoints3P_NoTrack/",
+        "ImpactPointErrorsX1_NoTrack/",
+        "ImpactPointErrorsX2_NoTrack/",
+        "ImpactPointErrorsX3_NoTrack/",
+        "ImpactPointErrorsY1_NoTrack/",
+        "ImpactPointErrorsY2_NoTrack/",
+        "ImpactPointErrorsY3_NoTrack/"]
+
+    if trackNetwork:
+        nn_names = [elm.replace('_NoTrack', '') for elm in nn_names]
+
+    kwargs["NetworkNames"] = nn_names
+    kwargs["GetInputsInfo"] = True
+    kwargs["WriteKey"] = ("PixelClusterNN" if not trackNetwork
+                          else "PixelClusterNNWithTrack")
+
+    acc.merge(addFoldersSplitOnline(
+        flags, "PIXEL",
+        "/PIXEL/Onl/PixelClustering/PixelClusNNCalib",
+        "/PIXEL/PixelClustering/PixelClusNNCalib",
+        className='CondAttrListCollection'))
+
+    from TrkConfig.TrkNeuralNetworkUtilsConfig import (
+        NeuralNetworkToHistoToolCfg)
+    kwargs["NetworkToHistoTool"] = acc.popToolsAndMerge(
+        NeuralNetworkToHistoToolCfg(flags))
+
+    acc.addCondAlgo(CompFactory.InDet.TTrainedNetworkCondAlg(name, **kwargs))
     return acc
 
-def PixelClusterNnWithTrackCondAlgCfg(flags, **kwargs):
-    kwargs.setdefault("TrackNetwork", True)
-    kwargs.setdefault("name", 'PixelClusterNnWithTrackCondAlg')
 
-    acc = PixelClusterNnCondAlgCfg(flags, **kwargs)
-    return acc
+def PixelClusterNnWithTrackCondAlgCfg(
+        flags, name="PixelClusterNnWithTrackCondAlg"):
+    return PixelClusterNnCondAlgCfg(flags, name, trackNetwork=True)
+
 
-def LWTNNCondAlgCfg(flags, **kwargs):
+def LWTNNCondAlgCfg(flags, name="LWTNNCondAlg"):
     acc = ComponentAccumulator()
-    # Check for the folder
-    acc.merge(addFoldersSplitOnline(flags, "PIXEL", "/PIXEL/Onl/PixelClustering/PixelNNCalibJSON", "/PIXEL/PixelClustering/PixelNNCalibJSON", className="CondAttrListCollection"))
-    # What we'll store it as
-    kwargs.setdefault("WriteKey", 'PixelClusterNNJSON')
+    kwargs = {}
 
-    # Set up the algorithm
-    acc.addCondAlgo(CompFactory.InDet.LWTNNCondAlg(kwargs.pop("name", "LWTNNCondAlg"), **kwargs))
+    acc.merge(addFoldersSplitOnline(
+        flags, "PIXEL",
+        "/PIXEL/Onl/PixelClustering/PixelNNCalibJSON",
+        "/PIXEL/PixelClustering/PixelNNCalibJSON",
+        className="CondAttrListCollection"))
+
+    kwargs["WriteKey"] = "PixelClusterNNJSON"
+
+    acc.addCondAlgo(CompFactory.InDet.LWTNNCondAlg(name, **kwargs))
     return acc
 
-def NnClusterizationFactoryCfg(flags, name="NnClusterizationFactory", **kwargs):
+
+def NnClusterizationFactoryCfg(flags, name="NnClusterizationFactory"):
     acc = ComponentAccumulator()
+    kwargs = {}
 
-    from PixelConditionsAlgorithms.PixelConditionsConfig import PixelChargeLUTCalibCondAlgCfg, PixelChargeCalibCondAlgCfg
+    from PixelConditionsAlgorithms.PixelConditionsConfig import (
+        PixelChargeLUTCalibCondAlgCfg, PixelChargeCalibCondAlgCfg)
     if flags.GeoModel.Run is LHCPeriod.Run3:
         acc.merge(PixelChargeLUTCalibCondAlgCfg(flags))
     else:
         acc.merge(PixelChargeCalibCondAlgCfg(flags))
 
-    if "PixelLorentzAngleTool" not in kwargs:
-        from SiLorentzAngleTool.PixelLorentzAngleConfig import PixelLorentzAngleToolCfg
-        PixelLorentzAngleTool = acc.popToolsAndMerge(PixelLorentzAngleToolCfg(flags))
-        kwargs.setdefault("PixelLorentzAngleTool", PixelLorentzAngleTool)
-
     if flags.GeoModel.Run is LHCPeriod.Run1:
-        acc.merge(PixelClusterNnCondAlgCfg(flags, name="PixelClusterNnCondAlg", GetInputsInfo=True))
-        acc.merge(PixelClusterNnWithTrackCondAlgCfg(flags, name="PixelClusterNnWithTrackCondAlg", GetInputsInfo=True))
+        acc.merge(PixelClusterNnCondAlgCfg(flags))
+        acc.merge(PixelClusterNnWithTrackCondAlgCfg(flags))
     else:
-        acc.merge(LWTNNCondAlgCfg(flags, name="LWTNNCondAlg"))
-
-    kwargs.setdefault("doRunI", flags.GeoModel.Run is LHCPeriod.Run1)
-    kwargs.setdefault("useToT", False)
-    kwargs.setdefault("useRecenteringNNWithoutTracks", flags.GeoModel.Run is LHCPeriod.Run1)
-    kwargs.setdefault("useRecenteringNNWithTracks", False)
-    kwargs.setdefault("correctLorShiftBarrelWithoutTracks", 0)
-    kwargs.setdefault("correctLorShiftBarrelWithTracks", 0.030 if flags.GeoModel.Run is LHCPeriod.Run1 else 0.000)
-    kwargs.setdefault("useTTrainedNetworks", flags.GeoModel.Run is LHCPeriod.Run1)
-    kwargs.setdefault("NnCollectionReadKey", "PixelClusterNN" if flags.GeoModel.Run is LHCPeriod.Run1 else "")
-    kwargs.setdefault("NnCollectionWithTrackReadKey", "PixelClusterNNWithTrack" if flags.GeoModel.Run is LHCPeriod.Run1 else "")
-    kwargs.setdefault("NnCollectionJSONReadKey", "" if flags.GeoModel.Run is LHCPeriod.Run1 else "PixelClusterNNJSON")
-
-    acc.setPrivateTools(CompFactory.InDet.NnClusterizationFactory(name, **kwargs))
+        acc.merge(LWTNNCondAlgCfg(flags))
+
+    from SiLorentzAngleTool.PixelLorentzAngleConfig import (
+        PixelLorentzAngleToolCfg)
+    kwargs["PixelLorentzAngleTool"] = acc.popToolsAndMerge(
+        PixelLorentzAngleToolCfg(flags))
+
+    kwargs["doRunI"] = flags.GeoModel.Run is LHCPeriod.Run1
+    kwargs["useToT"] = False
+    kwargs["useRecenteringNNWithoutTracks"] = (
+        flags.GeoModel.Run is LHCPeriod.Run1)
+    kwargs["useRecenteringNNWithTracks"] = False
+    kwargs["correctLorShiftBarrelWithoutTracks"] = 0
+    kwargs["correctLorShiftBarrelWithTracks"] = (
+        0.03 if flags.GeoModel.Run is LHCPeriod.Run1 else 0.)
+    kwargs["useTTrainedNetworks"] = flags.GeoModel.Run is LHCPeriod.Run1
+    kwargs["NnCollectionReadKey"] = (
+        "PixelClusterNN" if flags.GeoModel.Run is LHCPeriod.Run1 else "")
+    kwargs["NnCollectionWithTrackReadKey"] = (
+        "PixelClusterNNWithTrack" if flags.GeoModel.Run is LHCPeriod.Run1
+        else "")
+    kwargs["NnCollectionJSONReadKey"] = (
+        "" if flags.GeoModel.Run is LHCPeriod.Run1
+        else "PixelClusterNNJSON")
+
+    acc.setPrivateTools(
+        CompFactory.InDet.NnClusterizationFactory(name, **kwargs))
     return acc
 
-def TrigNnClusterizationFactoryCfg(flags, name="TrigNnClusterizationFactory", **kwargs):
+
+def TrigNnClusterizationFactoryCfg(flags, name="TrigNnClusterizationFactory"):
     acc = ComponentAccumulator()
+    kwargs = {}
 
-    from PixelConditionsAlgorithms.PixelConditionsConfig import PixelChargeLUTCalibCondAlgCfg, PixelChargeCalibCondAlgCfg
+    from PixelConditionsAlgorithms.PixelConditionsConfig import (
+        PixelChargeLUTCalibCondAlgCfg, PixelChargeCalibCondAlgCfg)
     if flags.GeoModel.Run is LHCPeriod.Run3:
         acc.merge(PixelChargeLUTCalibCondAlgCfg(flags))
     else:
         acc.merge(PixelChargeCalibCondAlgCfg(flags))
 
-    acc.merge(PixelClusterNnCondAlgCfg(flags, name="PixelClusterNnCondAlg", GetInputsInfo=True))
-    acc.merge(PixelClusterNnWithTrackCondAlgCfg(flags, name="PixelClusterNnWithTrackCondAlg", GetInputsInfo=True))
+    acc.merge(PixelClusterNnCondAlgCfg(flags))
+    acc.merge(PixelClusterNnWithTrackCondAlgCfg(flags))
 
-    if "PixelLorentzAngleTool" not in kwargs:
-        from SiLorentzAngleTool.PixelLorentzAngleConfig import PixelLorentzAngleToolCfg
-        PixelLorentzAngleTool = acc.popToolsAndMerge(PixelLorentzAngleToolCfg(flags))
-        kwargs.setdefault("PixelLorentzAngleTool", PixelLorentzAngleTool)
+    from SiLorentzAngleTool.PixelLorentzAngleConfig import (
+        PixelLorentzAngleToolCfg)
+    kwargs["PixelLorentzAngleTool"] = acc.popToolsAndMerge(
+        PixelLorentzAngleToolCfg(flags))
 
-    kwargs.setdefault("useToT", False)
-    kwargs.setdefault("NnCollectionReadKey", "PixelClusterNN")
-    kwargs.setdefault("NnCollectionWithTrackReadKey", "PixelClusterNNWithTrack")
+    kwargs["useToT"] = False
+    kwargs["NnCollectionReadKey"] = "PixelClusterNN"
+    kwargs["NnCollectionWithTrackReadKey"] = "PixelClusterNNWithTrack"
 
-    acc.setPrivateTools(CompFactory.InDet.NnClusterizationFactory(name, **kwargs))
+    acc.setPrivateTools(
+        CompFactory.InDet.NnClusterizationFactory(name, **kwargs))
     return acc
 
-def NnPixelClusterSplitProbToolCfg(flags, name="NnPixelClusterSplitProbTool", **kwargs):
-    acc = ComponentAccumulator()
 
-    # --- new NN prob tool
-    MultiplicityContent = [1 , 1 , 1]
-    NnClusterizationFactory = acc.popToolsAndMerge(NnClusterizationFactoryCfg(flags))
-    kwargs.setdefault("PriorMultiplicityContent", MultiplicityContent)
-    kwargs.setdefault("NnClusterizationFactory", NnClusterizationFactory)
-    kwargs.setdefault("useBeamSpotInfo", flags.InDet.Tracking.useBeamSpotInfoNN)
+def NnPixelClusterSplitProbToolCfg(flags, name="NnPixelClusterSplitProbTool"):
+    acc = ComponentAccumulator()
+    kwargs = {}
 
-    NnPixelClusterSplitProbTool = CompFactory.InDet.NnPixelClusterSplitProbTool(name,**kwargs)
+    kwargs["NnClusterizationFactory"] = acc.popToolsAndMerge(
+        NnClusterizationFactoryCfg(flags))
+    kwargs["PriorMultiplicityContent"] = [1, 1, 1]
+    kwargs["useBeamSpotInfo"] = flags.InDet.Tracking.useBeamSpotInfoNN
 
-    acc.setPrivateTools(NnPixelClusterSplitProbTool)
+    acc.setPrivateTools(
+        CompFactory.InDet.NnPixelClusterSplitProbTool(name, **kwargs))
     return acc
 
-def PixelGangedAmbiguitiesFinderCfg(flags, name="InDetPixelGangedAmbiguitiesFinder", **kwargs) :
+
+def PixelGangedAmbiguitiesFinderCfg(
+        flags, name="InDetPixelGangedAmbiguitiesFinder"):
+    # To produce PixelDetectorElementCollection condition data
     from PixelGeoModel.PixelGeoModelConfig import PixelReadoutGeometryCfg
     acc = PixelReadoutGeometryCfg(flags)
-    InDetPixelGangedAmbiguitiesFinder = CompFactory.InDet.PixelGangedAmbiguitiesFinder(name, **kwargs)
-    acc.setPrivateTools( InDetPixelGangedAmbiguitiesFinder )
+    acc.setPrivateTools(CompFactory.InDet.PixelGangedAmbiguitiesFinder(name))
     return acc
 
-def ITkPixelGangedAmbiguitiesFinderCfg(flags, name="ITkPixelGangedAmbiguitiesFinder", **kwargs) :
-    from PixelGeoModelXml.ITkPixelGeoModelConfig import ITkPixelReadoutGeometryCfg
+
+def ITkPixelGangedAmbiguitiesFinderCfg(
+        flags, name="ITkPixelGangedAmbiguitiesFinder"):
+    # To produce ITkPixelDetectorElementCollection condition data
+    from PixelGeoModelXml.ITkPixelGeoModelConfig import (
+        ITkPixelReadoutGeometryCfg)
     acc = ITkPixelReadoutGeometryCfg(flags)
-    kwargs.setdefault("PixelDetEleCollKey", "ITkPixelDetectorElementCollection")
-    ITkPixelGangedAmbiguitiesFinder = CompFactory.InDet.PixelGangedAmbiguitiesFinder(name, **kwargs)
-    acc.setPrivateTools( ITkPixelGangedAmbiguitiesFinder )
+    kwargs = {}
+    kwargs["PixelDetEleCollKey"] = "ITkPixelDetectorElementCollection"
+
+    acc.setPrivateTools(
+        CompFactory.InDet.PixelGangedAmbiguitiesFinder(name, **kwargs))
     return acc
 
-def SCT_ClusteringToolCfg(flags, name="InDetSCT_ClusteringTool", **kwargs):
+
+def SCT_ClusteringToolCfg(
+        flags, name="InDetSCT_ClusteringTool",
+        conditionsTool=None,
+        SCTDetElStatus="SCTDetectorElementStatusWithoutFlagged"):
+    # To produce SCT_DetectorElementCollection
     from SCT_GeoModel.SCT_GeoModelConfig import SCT_ReadoutGeometryCfg
-    acc = SCT_ReadoutGeometryCfg(flags) # To produce SCT_DetectorElementCollection
-    from SCT_ConditionsTools.SCT_ConditionsToolsConfig import SCT_ConditionsSummaryToolCfg
-    InDetSCT_ConditionsSummaryToolWithoutFlagged = acc.popToolsAndMerge(SCT_ConditionsSummaryToolCfg(flags, withFlaggedCondTool=False))
-    InDetClusterMakerTool = acc.popToolsAndMerge(ClusterMakerToolCfg(flags))
-    from SiLorentzAngleTool.SCT_LorentzAngleConfig import SCT_LorentzAngleToolCfg
-    SCTLorentzAngleTool = acc.popToolsAndMerge(SCT_LorentzAngleToolCfg(flags))
-
-    kwargs.setdefault("conditionsTool", InDetSCT_ConditionsSummaryToolWithoutFlagged)
-    kwargs.setdefault("SCTDetElStatus","SCTDetectorElementStatusWithoutFlagged")
-    kwargs.setdefault("globalPosAlg", InDetClusterMakerTool)
-    kwargs.setdefault("LorentzAngleTool", SCTLorentzAngleTool)
-    if flags.InDet.selectSCTIntimeHits :
-        coll_25ns = flags.Beam.BunchSpacing<=25 and flags.Beam.Type is BeamType.Collisions
-        kwargs.setdefault("timeBins", "01X" if coll_25ns else "X1X")
-
-    InDetSCT_ClusteringTool = CompFactory.InDet.SCT_ClusteringTool(name, **kwargs)
-    acc.setPrivateTools(InDetSCT_ClusteringTool)
+    acc = SCT_ReadoutGeometryCfg(flags)
+    kwargs = {}
+    kwargs["SCTDetElStatus"] = SCTDetElStatus
+
+    if conditionsTool is None:
+        from SCT_ConditionsTools.SCT_ConditionsToolsConfig import (
+            SCT_ConditionsSummaryToolCfg)
+        conditionsTool = acc.popToolsAndMerge(
+            SCT_ConditionsSummaryToolCfg(flags, withFlaggedCondTool=False))
+    kwargs["conditionsTool"] = conditionsTool
+
+    from SiLorentzAngleTool.SCT_LorentzAngleConfig import (
+        SCT_LorentzAngleToolCfg)
+    kwargs["LorentzAngleTool"] = acc.popToolsAndMerge(
+        SCT_LorentzAngleToolCfg(flags))
+
+    kwargs["globalPosAlg"] = acc.popToolsAndMerge(ClusterMakerToolCfg(flags))
+
+    if flags.InDet.selectSCTIntimeHits:
+        coll_25ns = (flags.Beam.BunchSpacing <= 25 and
+                     flags.Beam.Type is BeamType.Collisions)
+        kwargs["timeBins"] = "01X" if coll_25ns else "X1X"
+
+    acc.setPrivateTools(CompFactory.InDet.SCT_ClusteringTool(name, **kwargs))
     return acc
 
-def Trig_SCT_ClusteringToolCfg(flags, name="Trig_SCT_ClusteringTool", **kwargs):
-    acc = ComponentAccumulator()
-    from SCT_ConditionsTools.SCT_ConditionsToolsConfig import SCT_ConditionsSummaryToolCfg
-    InDetSCT_ConditionsSummaryToolWithoutFlagged = acc.popToolsAndMerge(SCT_ConditionsSummaryToolCfg(flags, withFlaggedCondTool=False, withTdaqTool = False))
-
-    kwargs.setdefault("conditionsTool", InDetSCT_ConditionsSummaryToolWithoutFlagged)
-    kwargs.setdefault("SCTDetElStatus","")
-
-    return SCT_ClusteringToolCfg(flags, name, **kwargs)
-
-def ITKStrip_SCT_ClusteringToolCfg(flags, name="ITkStripClusteringTool", **kwargs):
-    from StripGeoModelXml.ITkStripGeoModelConfig import ITkStripReadoutGeometryCfg
-    acc = ITkStripReadoutGeometryCfg(flags) # To produce ITkStripDetectorElementCollection
-    kwargs.setdefault("SCTDetEleCollKey", "ITkStripDetectorElementCollection")
-
-    from SCT_ConditionsTools.ITkStripConditionsToolsConfig import ITkStripConditionsSummaryToolCfg
-    ITkStripConditionsSummaryTool = acc.popToolsAndMerge(ITkStripConditionsSummaryToolCfg(flags))
-    ITkClusterMakerTool = acc.popToolsAndMerge(ITkClusterMakerToolCfg(flags))
-    from SiLorentzAngleTool.ITkStripLorentzAngleConfig import ITkStripLorentzAngleToolCfg
-    ITkStripLorentzAngleTool = acc.popToolsAndMerge( ITkStripLorentzAngleToolCfg(flags) )
-
-    kwargs.setdefault("conditionsTool", ITkStripConditionsSummaryTool)
-    kwargs.setdefault("globalPosAlg", ITkClusterMakerTool)
-    kwargs.setdefault("LorentzAngleTool", ITkStripLorentzAngleTool)
-    kwargs.setdefault("useRowInformation", True) # ITk-specific clustering
-    if flags.ITk.selectStripIntimeHits :
-        coll_25ns = flags.Beam.BunchSpacing<=25 and flags.Beam.Type is BeamType.Collisions
-        kwargs.setdefault("timeBins", "01X" if coll_25ns else "X1X")
-
-    InDetSCT_ClusteringTool = CompFactory.InDet.SCT_ClusteringTool(name, **kwargs)
-    acc.setPrivateTools(InDetSCT_ClusteringTool)
-    return acc
 
-def ITkTruthClusterizationFactoryCfg(flags, name = 'ITkTruthClusterizationFactory', **kwargs):
+def Trig_SCT_ClusteringToolCfg(flags, name="Trig_SCT_ClusteringTool"):
     acc = ComponentAccumulator()
-    kwargs.setdefault("InputSDOMap", 'ITkPixelSDO_Map')
-    ITkTruthClusterizationFactory = CompFactory.InDet.TruthClusterizationFactory( name, **kwargs )
-    acc.setPrivateTools(ITkTruthClusterizationFactory)
+
+    from SCT_ConditionsTools.SCT_ConditionsToolsConfig import (
+        SCT_ConditionsSummaryToolCfg)
+    conditionsTool = acc.popToolsAndMerge(SCT_ConditionsSummaryToolCfg(
+        flags, withFlaggedCondTool=False, withTdaqTool=False))
+
+    acc.setPrivateTools(acc.popToolsAndMerge(SCT_ClusteringToolCfg(
+        flags, name,
+        conditionsTool=conditionsTool,
+        SCTDetElStatus=""
+    )))
     return acc
 
-def ITkTruthPixelClusterSplitProbToolCfg(flags, name="ITkTruthPixelClusterSplitProbTool", **kwargs):
-    acc = ComponentAccumulator()
 
-    # --- new NN prob tool
-    MultiplicityContent = [1 , 1 , 1]
-    ITkTruthClusterizationFactory = acc.popToolsAndMerge(ITkTruthClusterizationFactoryCfg(flags))
+def ITKStrip_SCT_ClusteringToolCfg(flags, name="ITkStripClusteringTool"):
+    # To produce ITkStripDetectorElementCollection
+    from StripGeoModelXml.ITkStripGeoModelConfig import (
+        ITkStripReadoutGeometryCfg)
+    acc = ITkStripReadoutGeometryCfg(flags)
+    kwargs = {}
+    kwargs["SCTDetEleCollKey"] = "ITkStripDetectorElementCollection"
+    kwargs["useRowInformation"] = True  # ITk-specific clustering
+
+    from SCT_ConditionsTools.ITkStripConditionsToolsConfig import (
+        ITkStripConditionsSummaryToolCfg)
+    kwargs["conditionsTool"] = acc.popToolsAndMerge(
+        ITkStripConditionsSummaryToolCfg(flags))
+
+    from SiLorentzAngleTool.ITkStripLorentzAngleConfig import (
+        ITkStripLorentzAngleToolCfg)
+    kwargs["LorentzAngleTool"] = acc.popToolsAndMerge(
+        ITkStripLorentzAngleToolCfg(flags))
 
-    kwargs.setdefault("PriorMultiplicityContent", MultiplicityContent)
-    kwargs.setdefault("NnClusterizationFactory", ITkTruthClusterizationFactory) #Truth-based for ITk for now
+    kwargs["globalPosAlg"] = acc.popToolsAndMerge(
+        ITkClusterMakerToolCfg(flags))
 
-    ITkTruthPixelClusterSplitProbTool = CompFactory.InDet.TruthPixelClusterSplitProbTool(name,**kwargs) #Truth-based for ITk for now
+    if flags.ITk.selectStripIntimeHits:
+        coll_25ns = (flags.Beam.BunchSpacing <= 25 and
+                     flags.Beam.Type is BeamType.Collisions)
+        kwargs["timeBins"] = "01X" if coll_25ns else "X1X"
 
-    acc.setPrivateTools(ITkTruthPixelClusterSplitProbTool)
+    acc.setPrivateTools(CompFactory.InDet.SCT_ClusteringTool(name, **kwargs))
     return acc
 
+
+def ITkTruthClusterizationFactoryCfg(
+        flags, name='ITkTruthClusterizationFactory'):
+    acc = ComponentAccumulator()
+    kwargs = {}
+    kwargs["InputSDOMap"] = "ITkPixelSDO_Map"
+
+    acc.setPrivateTools(
+        CompFactory.InDet.TruthClusterizationFactory(name, **kwargs))
+    return acc
+
+
+def ITkTruthPixelClusterSplitProbToolCfg(
+        flags, name="ITkTruthPixelClusterSplitProbTool"):
+    acc = ComponentAccumulator()
+    kwargs = {}
+    kwargs["PriorMultiplicityContent"] = [1, 1, 1]
+    kwargs["NnClusterizationFactory"] = acc.popToolsAndMerge(
+        ITkTruthClusterizationFactoryCfg(flags))
+
+    # Truth-based for ITk for now
+    acc.setPrivateTools(
+        CompFactory.InDet.TruthPixelClusterSplitProbTool(name, **kwargs))
+    return acc
diff --git a/InnerDetector/InDetConfig/python/SiliconPreProcessing.py b/InnerDetector/InDetConfig/python/SiliconPreProcessing.py
index c6348282b7eabe2d6d4c57c2cd533eeea0b8c762..5da07742c2f7ebec13d1be8d29424b43de27012a 100644
--- a/InnerDetector/InDetConfig/python/SiliconPreProcessing.py
+++ b/InnerDetector/InDetConfig/python/SiliconPreProcessing.py
@@ -2,6 +2,7 @@
 from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
 from AthenaConfiguration.Enums import Format
 
+
 def InDetRecPreProcessingSiliconCfg(flags, **kwargs):
     acc = ComponentAccumulator()
     # ------------------------------------------------------------
@@ -15,65 +16,78 @@ def InDetRecPreProcessingSiliconCfg(flags, **kwargs):
 
     #
     # --- Slim BCM RDOs by zero-suppressing
-    #   
+    #
     if flags.Detector.EnableBCM:
         if flags.Input.Format is Format.BS:
-            from BCM_RawDataByteStreamCnv.BCM_RawDataByteStreamCnvConfig import BCM_RawDataProviderAlgCfg
+            from BCM_RawDataByteStreamCnv.BCM_RawDataByteStreamCnvConfig import (
+                BCM_RawDataProviderAlgCfg)
             acc.merge(BCM_RawDataProviderAlgCfg(flags))
         from InDetConfig.BCM_ZeroSuppressionConfig import BCM_ZeroSuppressionCfg
         acc.merge(BCM_ZeroSuppressionCfg(flags))
-    
+
     #
     # -- Pixel Clusterization
     #
-    if flags.Detector.EnablePixel and (   flags.Input.Format is Format.BS
-                                       or 'PixelRDOs' in flags.Input.Collections):
+    if (flags.Detector.EnablePixel and
+        (flags.Input.Format is Format.BS
+         or 'PixelRDOs' in flags.Input.Collections)):
 
         #
         # --- PixelClusterization algorithm
         #
-        from InDetConfig.InDetPrepRawDataFormationConfig import PixelClusterizationCfg
+        from InDetConfig.InDetPrepRawDataFormationConfig import (
+            PixelClusterizationCfg)
         acc.merge(PixelClusterizationCfg(flags))
-        if flags.InDet.doSplitReco :
-            from InDetConfig.InDetPrepRawDataFormationConfig import PixelClusterizationPUCfg
+        if flags.InDet.doSplitReco:
+            from InDetConfig.InDetPrepRawDataFormationConfig import (
+                PixelClusterizationPUCfg)
             acc.merge(PixelClusterizationPUCfg(flags))
     #
     # --- SCT Clusterization
     #
-    if flags.Detector.EnableSCT and (   flags.Input.Format is Format.BS
-                                     or 'SCT_RDOs' in flags.Input.Collections):
+    if (flags.Detector.EnableSCT and
+        (flags.Input.Format is Format.BS
+         or 'SCT_RDOs' in flags.Input.Collections)):
 
         #
         # --- SCT_Clusterization algorithm
         #
-        from InDetConfig.InDetPrepRawDataFormationConfig import SCTClusterizationCfg
+        from InDetConfig.InDetPrepRawDataFormationConfig import (
+            SCTClusterizationCfg)
         acc.merge(SCTClusterizationCfg(flags))
-        if flags.InDet.doSplitReco :
-            from InDetConfig.InDetPrepRawDataFormationConfig import SCTClusterizationPUCfg
+        if flags.InDet.doSplitReco:
+            from InDetConfig.InDetPrepRawDataFormationConfig import (
+                SCTClusterizationPUCfg)
             acc.merge(SCTClusterizationPUCfg(flags))
 
     #
     # ----------- form SpacePoints from clusters in SCT and Pixels
     #
     #
-    from InDetConfig.SiSpacePointFormationConfig import InDetSiTrackerSpacePointFinderCfg
+    from InDetConfig.SiSpacePointFormationConfig import (
+        InDetSiTrackerSpacePointFinderCfg)
     acc.merge(InDetSiTrackerSpacePointFinderCfg(flags))
 
     # this truth must only be done if you do PRD and SpacePointformation
     # If you only do the latter (== running on ESD) then the needed input (simdata)
     # is not in ESD but the resulting truth (clustertruth) is already there ...
-    if (flags.InDet.doTruth
-        and (not flags.Detector.EnableSCT   or 'SCT_SDO_Map'  in flags.Input.Collections)
-        and (not flags.Detector.EnablePixel or 'PixelSDO_Map' in flags.Input.Collections)) :
-
-        from InDetConfig.InDetTruthAlgsConfig import InDetPRD_MultiTruthMakerSiCfg
+    if (flags.InDet.doTruth and
+        (not flags.Detector.EnableSCT or
+         'SCT_SDO_Map' in flags.Input.Collections) and
+        (not flags.Detector.EnablePixel or
+         'PixelSDO_Map' in flags.Input.Collections)):
+
+        from InDetConfig.InDetTruthAlgsConfig import (
+            InDetPRD_MultiTruthMakerSiCfg)
         acc.merge(InDetPRD_MultiTruthMakerSiCfg(flags))
         if flags.InDet.doSplitReco:
-            from InDetConfig.InDetTruthAlgsConfig import InDetPRD_MultiTruthMakerSiPUCfg
+            from InDetConfig.InDetTruthAlgsConfig import (
+                InDetPRD_MultiTruthMakerSiPUCfg)
             acc.merge(InDetPRD_MultiTruthMakerSiPUCfg(flags))
 
     return acc
 
+
 def ITkRecPreProcessingSiliconCfg(flags, **kwargs):
     acc = ComponentAccumulator()
     # ------------------------------------------------------------
@@ -95,64 +109,76 @@ def ITkRecPreProcessingSiliconCfg(flags, **kwargs):
     #
     # --- Deducing configuration from the flags
     #
-    from ActsInterop.TrackingComponentConfigurer import TrackingComponentConfigurer
+    from ActsInterop.TrackingComponentConfigurer import (
+        TrackingComponentConfigurer)
     configuration_settings = TrackingComponentConfigurer(flags)
-         
+
     #
     # -- Clusterization Algorithms
     #
     if configuration_settings.doAthenaCluster:
-        from InDetConfig.InDetPrepRawDataFormationConfig import AthenaTrkClusterizationCfg
+        from InDetConfig.InDetPrepRawDataFormationConfig import (
+            AthenaTrkClusterizationCfg)
         acc.merge(AthenaTrkClusterizationCfg(flags))
-        
+
     if configuration_settings.doActsCluster:
-        from ActsTrkClusterization.ActsTrkClusterizationConfig import ActsTrkClusterizationCfg
+        from ActsTrkClusterization.ActsTrkClusterizationConfig import (
+            ActsTrkClusterizationCfg)
         acc.merge(ActsTrkClusterizationCfg(flags))
 
     #
     # ---  Cluster EDM converters
     #
-    if configuration_settings.doAthenaToActsCluster: 
-        if not flags.Detector.EnableITkPixel or not flags.Detector.EnableITkStrip:
-            raise RuntimeError("Cluster EDM converter (InDet -> xAOD) must be activated for both Pixel and Strips")
+    if configuration_settings.doAthenaToActsCluster:
+        if (not flags.Detector.EnableITkPixel or
+                not flags.Detector.EnableITkStrip):
+            raise RuntimeError(
+                "Cluster EDM converter (InDet -> xAOD) must be activated for both Pixel and Strips")
         #
         # --- InDet -> xAOD Cluster EDM converter
         #
-        from InDetConfig.InDetPrepRawDataFormationConfig import ITkInDetToXAODClusterConversionCfg
+        from InDetConfig.InDetPrepRawDataFormationConfig import (
+            ITkInDetToXAODClusterConversionCfg)
         acc.merge(ITkInDetToXAODClusterConversionCfg(flags))
 
     if configuration_settings.doActsToAthenaCluster:
-        if not flags.Detector.EnableITkPixel or not flags.Detector.EnableITkStrip:
-            raise RuntimeError("Cluster EDM converter (xAOD -> InDet) must be activated for both Pixel and Strips")
+        if (not flags.Detector.EnableITkPixel or
+                not flags.Detector.EnableITkStrip):
+            raise RuntimeError(
+                "Cluster EDM converter (xAOD -> InDet) must be activated for both Pixel and Strips")
         #
         # --- xAOD -> InDet Cluster EDM converter
         #
-        from InDetConfig.InDetPrepRawDataFormationConfig import ITkXAODToInDetClusterConversionCfg
+        from InDetConfig.InDetPrepRawDataFormationConfig import (
+            ITkXAODToInDetClusterConversionCfg)
         acc.merge(ITkXAODToInDetClusterConversionCfg(flags))
-        
 
     #
     # ----------- form SpacePoints from clusters in SCT and Pixels
     #
     if configuration_settings.doAthenaSpacePoint:
-        from InDetConfig.SiSpacePointFormationConfig import ITkSiTrackerSpacePointFinderCfg
+        from InDetConfig.SiSpacePointFormationConfig import (
+            ITkSiTrackerSpacePointFinderCfg)
         acc.merge(ITkSiTrackerSpacePointFinderCfg(flags))
 
     if configuration_settings.doActsSpacePoint:
-        from TrkConfig.ActsTrkSpacePointFormationConfig import ActsTrkSpacePointFormationCfg
+        from TrkConfig.ActsTrkSpacePointFormationConfig import (
+            ActsTrkSpacePointFormationCfg)
         acc.merge(ActsTrkSpacePointFormationCfg(flags))
 
-
     #
     # --- Space Point EDM converters
     #
     if configuration_settings.AthenaToActsSpacePointConverter:
-        if not flags.Detector.EnableITkPixel or not flags.Detector.EnableITkStrip:
-            raise RuntimeError("Space Point EDM converter (Trk -> xAOD) must be activated for both Pixel and Strips")
+        if (not flags.Detector.EnableITkPixel or
+                not flags.Detector.EnableITkStrip):
+            raise RuntimeError(
+                "Space Point EDM converter (Trk -> xAOD) must be activated for both Pixel and Strips")
 
         #
         # --- Trk -> xAOD Space Point EDM converter
-        from SiSpacePointFormation.SiSpacePointFormationConfig import TrkToXAODSpacePointConversionCfg            
+        from SiSpacePointFormation.SiSpacePointFormationConfig import (
+            TrkToXAODSpacePointConversionCfg)
         acc.merge(TrkToXAODSpacePointConversionCfg(flags))
 
     # this truth must only be done if you do PRD and SpacePointformation
@@ -172,16 +198,15 @@ if __name__ == "__main__":
     from AthenaConfiguration.TestDefaults import defaultTestFiles
     flags.Input.Files = defaultTestFiles.RDO_RUN2
 
-    flags.InDet.Tracking.doPixelClusterSplitting = True
-
-    numThreads=1
-    flags.Concurrency.NumThreads=numThreads
-    flags.Concurrency.NumConcurrentEvents=numThreads
+    flags.Tracking.doPixelClusterSplitting = True
 
+    numThreads = 1
+    flags.Concurrency.NumThreads = numThreads
+    flags.Concurrency.NumConcurrentEvents = numThreads
 
     flags.lock()
     flags.dump()
-    
+
     from AthenaConfiguration.MainServicesConfig import MainServicesCfg
     top_acc = MainServicesCfg(flags)
 
@@ -191,7 +216,7 @@ if __name__ == "__main__":
     top_acc.merge(InDetRecPreProcessingSiliconCfg(flags))
 
     iovsvc = top_acc.getService('IOVDbSvc')
-    iovsvc.OutputLevel=5
+    iovsvc.OutputLevel = 5
 
     top_acc.printConfig()
     top_acc.run(25)
diff --git a/InnerDetector/InDetConfig/python/TrackRecoConfig.py b/InnerDetector/InDetConfig/python/TrackRecoConfig.py
index 1581c1e9817474a34e0ac359da0bc5e8d78075bd..d9ed35b207537b0f5f6ab4d37b320c1cf758d015 100644
--- a/InnerDetector/InDetConfig/python/TrackRecoConfig.py
+++ b/InnerDetector/InDetConfig/python/TrackRecoConfig.py
@@ -506,8 +506,9 @@ def InDetTrackRecoCfg(flags):
                     InputCollections=InputCombinedInDetTracks,
                     ClusterSplitProbContainer=ClusterSplitProbContainer))
 
-                ClusterSplitProbContainer = "InDetTRT_SeededAmbiguityProcessorSplitProb" + \
-                    current_flags.InDet.Tracking.ActiveConfig.extension
+                ClusterSplitProbContainer = (
+                    "InDetTRT_SeededAmbiguityProcessorSplitProb" +
+                    current_flags.InDet.Tracking.ActiveConfig.extension)
                 TRTSeededTracks = "TRTSeededTracks"
                 ResolvedTRTSeededTracks = "ResolvedTRTSeededTracks"
                 InputCombinedInDetTracks += [ResolvedTRTSeededTracks]
@@ -736,7 +737,7 @@ def InDetTrackRecoCfg(flags):
             result.addEventAlgo(
                 CompFactory.DerivationFramework.CommonAugmentation(
                     "SiSPInDetCommonKernel",
-                    AugmentationTools = [SiSPTrackStateOnSurfaceDecorator]))
+                    AugmentationTools=[SiSPTrackStateOnSurfaceDecorator]))
 
         if flags.Input.isMC:
             from InDetPhysValMonitoring.InDetPhysValDecorationConfig import (
@@ -824,7 +825,7 @@ def InDetTrackRecoOutputCfg(flags):
         "InDet::TRT_DriftCircleContainer#TRT_DriftCircles",
         "InDet::PixelGangedClusterAmbiguities#PixelClusterAmbiguitiesMap",
     ]
-    if flags.InDet.Tracking.doPixelClusterSplitting:
+    if flags.Tracking.doPixelClusterSplitting:
         toESD += ["InDet::PixelGangedClusterAmbiguities#SplitClusterAmbiguityMap"]
     toESD += ["IDCInDetBSErrContainer#SCT_FlaggedCondData"]
     toESD += ["Trk::ClusterSplitProbabilityContainer#" +
@@ -947,7 +948,8 @@ def InDetTrackRecoOutputCfg(flags):
             toAOD += ["DetailedTrackTruthCollection#ObservedDetailedTracksTruth"]
     if flags.InDet.Tracking.doStoreSiSPSeededTracks:
         toAOD += ["xAOD::TrackParticleContainer#SiSPSeededTracksTrackParticles"]
-        toAOD += [f"xAOD::TrackParticleAuxContainer#SiSPSeededTracksTrackParticlesAux.{excludedAuxData}"]
+        toAOD += [
+            f"xAOD::TrackParticleAuxContainer#SiSPSeededTracksTrackParticlesAux.{excludedAuxData}"]
 
     if flags.Tracking.doStoreTrackSeeds:
         toAOD += [
diff --git a/InnerDetector/InDetConfig/python/TrackTruthConfig.py b/InnerDetector/InDetConfig/python/TrackTruthConfig.py
index 3f0dca9e7c06c9537e465d94781a73d5c8f41534..fb40aef2b10ad0c2dfba0e68018cc09401e4bdec 100644
--- a/InnerDetector/InDetConfig/python/TrackTruthConfig.py
+++ b/InnerDetector/InDetConfig/python/TrackTruthConfig.py
@@ -7,25 +7,28 @@ from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
 #
 # -------------------------------------------------------------------------
 
+
 def InDetTrackTruthCfg(flags,
-                       Tracks = "CombinedInDetTracks",
-                       DetailedTruth = "DetailedTrackTruth",
-                       TracksTruth = "TrackTruthCollection"):
+                       Tracks="CombinedInDetTracks",
+                       DetailedTruth="DetailedTrackTruth",
+                       TracksTruth="TrackTruthCollection"):
     acc = ComponentAccumulator()
     #
     # --- Enable the detailed track truth
     #
     from InDetConfig.InDetTruthAlgsConfig import InDetDetailedTrackTruthMakerCfg
-    acc.merge(InDetDetailedTrackTruthMakerCfg(flags,
-                                              TrackCollectionName = Tracks,
-                                              DetailedTrackTruthName = DetailedTruth))
+    acc.merge(InDetDetailedTrackTruthMakerCfg(
+        flags,
+        TrackCollectionName=Tracks,
+        DetailedTrackTruthName=DetailedTruth))
     #
     # --- Detailed to old TrackTruth
     #
     from TrkConfig.TrkTruthAlgsConfig import TrackTruthSimilaritySelectorCfg
-    acc.merge(TrackTruthSimilaritySelectorCfg(flags,
-                                              DetailedTrackTruthName = DetailedTruth,
-                                              OutputName = TracksTruth))
+    acc.merge(TrackTruthSimilaritySelectorCfg(
+        flags,
+        DetailedTrackTruthName=DetailedTruth,
+        OutputName=TracksTruth))
 
     return acc
 
@@ -34,15 +37,16 @@ if __name__ == "__main__":
     from AthenaConfiguration.AllConfigFlags import initConfigFlags
     flags = initConfigFlags()
 
-    numThreads=1
-    flags.Concurrency.NumThreads=numThreads
-    flags.Concurrency.NumConcurrentEvents=numThreads # Might change this later, but good enough for the moment.
+    numThreads = 1
+    flags.Concurrency.NumThreads = numThreads
+    # Might change this later, but good enough for the moment.
+    flags.Concurrency.NumConcurrentEvents = numThreads
 
     flags.Detector.GeometryPixel = True
     flags.Detector.GeometrySCT = True
-    flags.Detector.GeometryTRT   = True
+    flags.Detector.GeometryTRT = True
 
-    flags.InDet.Tracking.doPixelClusterSplitting = True
+    flags.Tracking.doPixelClusterSplitting = True
 
     from AthenaConfiguration.TestDefaults import defaultTestFiles
     flags.Input.Files = defaultTestFiles.RDO_RUN2
@@ -61,8 +65,8 @@ if __name__ == "__main__":
     #################### TRTPreProcessing Configurations #####################
     from InDetConfig.TRTPreProcessing import TRTPreProcessingCfg
     top_acc.merge(TRTPreProcessingCfg(flags))
-    
-    #//// TrackingSiPatternConfig configurations from Temporary location /////
+
+    # //// TrackingSiPatternConfig configurations from Temporary location /////
     ################# SiSPSeededTrackFinder Configurations ###################
 
     InputCollections = []
@@ -70,20 +74,22 @@ if __name__ == "__main__":
     SiSPSeededTrackCollectionKey = 'SiSPSeededPixelTracks'
     ResolvedTrackCollectionKey = 'ResolvedPixelTracks'
     from InDetConfig.TrackingSiPatternConfig import SiSPSeededTrackFinderCfg
-    top_acc.merge(SiSPSeededTrackFinderCfg( flags,
-                                            InputCollections = InputCollections, 
-                                            SiSPSeededTrackCollectionKey = SiSPSeededTrackCollectionKey))
+    top_acc.merge(SiSPSeededTrackFinderCfg(
+        flags,
+        InputCollections=InputCollections,
+        SiSPSeededTrackCollectionKey=SiSPSeededTrackCollectionKey))
     ##########################################################################
     #################### InDetTrackTruth Configurations ######################
 
     InputTrackCollection = 'SiSPSeededPixelTracks'
     InputDetailedTrackTruth = 'DetailedTrackTruth'
     InputTrackCollectionTruth = 'TrackTruthCollection'
-    
-    top_acc.merge(InDetTrackTruthCfg(flags,
-                                     Tracks = InputTrackCollection,
-                                     DetailedTruth = InputDetailedTrackTruth,
-                                     TracksTruth = InputTrackCollectionTruth))
+
+    top_acc.merge(InDetTrackTruthCfg(
+        flags,
+        Tracks=InputTrackCollection,
+        DetailedTruth=InputDetailedTrackTruth,
+        TracksTruth=InputTrackCollectionTruth))
     #################################################################
     top_acc.printConfig()
     top_acc.run(25)
diff --git a/InnerDetector/InDetEventCnv/InDetJiveXML/src/SiSpacePointRetriever.cxx b/InnerDetector/InDetEventCnv/InDetJiveXML/src/SiSpacePointRetriever.cxx
index 82a40a95e5f69646a806537e9a594c22158e09b1..a5b7550e73e572411aefa1174074aab11af10a4a 100755
--- a/InnerDetector/InDetEventCnv/InDetJiveXML/src/SiSpacePointRetriever.cxx
+++ b/InnerDetector/InDetEventCnv/InDetJiveXML/src/SiSpacePointRetriever.cxx
@@ -9,6 +9,7 @@
 #include "AthContainers/DataVector.h"
 #include "StoreGate/ReadHandle.h"
 
+#include "InDetIdentifier/PixelID.h"
 #include "InDetIdentifier/SCT_ID.h"
 #include "TrkSpacePoint/SpacePoint.h"
 #include "TrkSpacePoint/SpacePointCollection.h"
@@ -205,8 +206,14 @@ namespace JiveXML
           Identifier idSecond = (clusterList.second != NULL) ? clusterList.second->identify() : Identifier();
 
           //Get phi and eta of the module in detector coordinates of the first cluster
-          phiModule.push_back(DataType(m_geo->SCTIDHelper()->phi_module(idFirst)));
-          etaModule.push_back(DataType(m_geo->SCTIDHelper()->eta_module(idFirst)));
+          if (clusterList.first->type(Trk::PrepRawDataType::SCT_Cluster)) {
+                phiModule.push_back(DataType(m_geo->SCTIDHelper()->phi_module(idFirst)));
+                etaModule.push_back(DataType(m_geo->SCTIDHelper()->eta_module(idFirst)));
+          }
+          else {
+             phiModule.push_back(DataType(m_geo->PixelIDHelper()->phi_module(idFirst)));
+             etaModule.push_back(DataType(m_geo->PixelIDHelper()->eta_module(idFirst)));
+          }
 
           // Store the cluster(s) identifier (pair)
           clusters.push_back(DataType(idFirst.get_compact()));   
diff --git a/InnerDetector/InDetG4/TRT_G4Utilities/src/TRTVisualization.cc b/InnerDetector/InDetG4/TRT_G4Utilities/src/TRTVisualization.cc
index 4c127b19d57eee35aeaa63ec6baa0e0d93bb98ea..55f14e611952f6cd4a727300d65266a4206c9438 100644
--- a/InnerDetector/InDetG4/TRT_G4Utilities/src/TRTVisualization.cc
+++ b/InnerDetector/InDetG4/TRT_G4Utilities/src/TRTVisualization.cc
@@ -58,7 +58,7 @@ void TRTVisualization::Visualize(G4LogicalVolume* pLogicalVolume,
   switch(colourIndex)
   {
     case 0:
-      pLogicalVolume->SetVisAttributes(G4VisAttributes::Invisible);
+      pLogicalVolume->SetVisAttributes(G4VisAttributes::GetInvisible());
       break;
     case 1:
       pLogicalVolume->SetVisAttributes(m_pVisAttributeRed);
diff --git a/LArCalorimeter/LArG4/LArG4Barrel/src/CryostatCalibrationCalculator.cxx b/LArCalorimeter/LArG4/LArG4Barrel/src/CryostatCalibrationCalculator.cxx
index a1a39100108a6e0f28ec17f8081631369d7422b7..dcb14ee06a067ba1db225354108b8d51bd81738d 100644
--- a/LArCalorimeter/LArG4/LArG4Barrel/src/CryostatCalibrationCalculator.cxx
+++ b/LArCalorimeter/LArG4/LArG4Barrel/src/CryostatCalibrationCalculator.cxx
@@ -521,13 +521,13 @@ namespace LArG4 {
                  << G4endl;
 #endif
 
-          if(volumeName.index("LArMgr::") == 0) volumeName.erase(0,8);
-          if(volumeName.index("LAr::Barrel::Cryostat::Sector")==0) { // ears, legs, Ti blocks
+          if(volumeName.find("LArMgr::") == 0) volumeName.erase(0,8);
+          if(volumeName.find("LAr::Barrel::Cryostat::Sector")==0) { // ears, legs, Ti blocks
             volumeName = "LAr::Barrel::Cryostat::Sector";
             if(copyNumber != 7 && copyNumber !=12) copyNumber=1; // assignment arbitrary copyNumber to Ti block
-          }else if(volumeName.index("LAr::Barrel::Cryostat::Cylinder")==0){
+          }else if(volumeName.find("LAr::Barrel::Cryostat::Cylinder")==0){
             volumeName = "LAr::Barrel::Cryostat::Cylinder";
-          }else if(volumeName.index("LAr::Barrel::Cryostat::InnerWall")==0){
+          }else if(volumeName.find("LAr::Barrel::Cryostat::InnerWall")==0){
             volumeName = "LAr::Barrel::Cryostat::InnerWall";
             copyNumber = 1; // assignment arbitrary copyNumber
           }
diff --git a/LArCalorimeter/LArG4/LArG4EC/src/CryostatCalibrationCalculator.cc b/LArCalorimeter/LArG4/LArG4EC/src/CryostatCalibrationCalculator.cc
index 379b4dcbb6f4608d80c6a348d95d4c138f13376e..6ca5a76f1530187f357af74576ce085b759dbfc8 100644
--- a/LArCalorimeter/LArG4/LArG4EC/src/CryostatCalibrationCalculator.cc
+++ b/LArCalorimeter/LArG4/LArG4EC/src/CryostatCalibrationCalculator.cc
@@ -454,7 +454,7 @@ namespace LArG4 {
           const G4int copyNumber = physical->GetCopyNo();
           G4String volumeName = physical->GetLogicalVolume()->GetName();
 
-          if(volumeName.index("LArMgr::") == 0) volumeName.erase(0,8);
+          if(volumeName.find("LArMgr::") == 0) volumeName.erase(0,8);
 
 
 #ifdef DEBUG_HITS
diff --git a/LArCalorimeter/LArG4/LArG4EC/src/EMECSupportCalibrationCalculator.cc b/LArCalorimeter/LArG4/LArG4EC/src/EMECSupportCalibrationCalculator.cc
index b35f400fb51deb8f6e136182de0e4eb693b3a12c..ba05cc4c65ff6fb66046b0e6bdcadc17212df511 100644
--- a/LArCalorimeter/LArG4/LArG4EC/src/EMECSupportCalibrationCalculator.cc
+++ b/LArCalorimeter/LArG4/LArG4EC/src/EMECSupportCalibrationCalculator.cc
@@ -223,7 +223,7 @@ namespace LArG4 {
 
       G4String name = a_step->GetPreStepPoint()->GetPhysicalVolume()->GetName();
 
-      if(name.index("LArMgr::") == 0) name.erase(0,8);
+      if(name.find("LArMgr::") == 0) name.erase(0,8);
 
 #if defined (DEBUG_VOLUMES) || defined (DEBUG_HITS)
       // The 'copy' variable is used only inside defines
@@ -241,14 +241,14 @@ namespace LArG4 {
         << ", phi=" << phi << std::endl;
 #endif
 
-      if ( (name.index("LAr::EMEC::Front")==0) ||
-           (name.index("LAr::EMEC::MotherBoard::")==0) ||
-           (name.index("LAr::EMEC::Outer")==0) ||
-           (name.index("LAr::EMEC::TopIndexing")==0) ||
-           (name.index("LAr::EMEC::WideStretcher")==0) ||
-           (name.index("LAr::EMEC::NarrowStretcher")==0) ||
-           (name.index("LAr::EMEC::InnerAluCone")==0) ||
-           (name.index("LAr::EMEC::ExtraCyl_afterPS")==0) || 
+      if ( (name.find("LAr::EMEC::Front")==0) ||
+           (name.find("LAr::EMEC::MotherBoard::")==0) ||
+           (name.find("LAr::EMEC::Outer")==0) ||
+           (name.find("LAr::EMEC::TopIndexing")==0) ||
+           (name.find("LAr::EMEC::WideStretcher")==0) ||
+           (name.find("LAr::EMEC::NarrowStretcher")==0) ||
+           (name.find("LAr::EMEC::InnerAluCone")==0) ||
+           (name.find("LAr::EMEC::ExtraCyl_afterPS")==0) || 
            (name=="LAr::EMEC::Mother" && fabs(p.z()) < m_par->m_zInFrontOfSpanishFan) )
       {
         // case 1  // Front + Outer + Inner of EMEC
@@ -363,7 +363,7 @@ namespace LArG4 {
           }
         }
 
-      } else if ((name.index("LAr::EMEC::Back")==0) ||
+      } else if ((name.find("LAr::EMEC::Back")==0) ||
                   (name=="LAr::EMEC::Mother" && fabs(p.z()) < m_par->m_zInFrontOfHEC) ) {
         // case 3  - between EMEC and HEC
         type = 1;
diff --git a/LArCalorimeter/LArG4/LArG4H6SD/src/LArG4H6BeamSD.cc b/LArCalorimeter/LArG4/LArG4H6SD/src/LArG4H6BeamSD.cc
index 2874b9485ec117bd7b5da2d0fef4d9c948441c92..e4f33df9aa2649a462d00cac5a11a51b53f76d9a 100644
--- a/LArCalorimeter/LArG4/LArG4H6SD/src/LArG4H6BeamSD.cc
+++ b/LArCalorimeter/LArG4/LArG4H6SD/src/LArG4H6BeamSD.cc
@@ -54,8 +54,8 @@ G4bool LArG4H6BeamSD::ProcessHits(G4Step* aStep, G4TouchableHistory* /*Touchable
   //dubina=theTouchable->GetHistoryDepth();
 //
   G4String lname(ime1);
-  G4int kk = lname.last(':');
-  lname.remove(0,kk+1);
+  G4int kk = lname.rfind(':');
+  lname.erase(0,kk+1);
 #ifdef DEBUG_HITS
   std::cout<<"**** LArG4H6BeamSD: "<<SensitiveDetectorName.data()<<" :ProcessHits: lname: "<<lname.data()<<std::endl;
 #endif
diff --git a/LArCalorimeter/LArG4/LArG4H6SD/src/LArG4H6BeamSDTool.cc b/LArCalorimeter/LArG4/LArG4H6SD/src/LArG4H6BeamSDTool.cc
index 1844cef35d41fb22dfc79bd38e22c47f7a9ec491..29dc85681d0c600ac8defeecc66cdc2732b51271 100644
--- a/LArCalorimeter/LArG4/LArG4H6SD/src/LArG4H6BeamSDTool.cc
+++ b/LArCalorimeter/LArG4/LArG4H6SD/src/LArG4H6BeamSDTool.cc
@@ -5,6 +5,7 @@
 #include "LArG4H6BeamSDTool.h"
 #include "LArG4H6BeamSD.h"
 
+#include "G4Version.hh"
 #include "G4String.hh"
 
 LArG4H6BeamSDTool::LArG4H6BeamSDTool(const std::string& type, const std::string& name, const IInterface *parent)
@@ -18,11 +19,16 @@ G4VSensitiveDetector* LArG4H6BeamSDTool::makeSD() const
   //FIXME better to use a configurable property here?
 
   // be smart, and take only last part of the name
+#if G4VERSION_NUMBER < 1100
   G4String colname = G4String(name()).strip(G4String::both,':');
   if ( colname.contains(':') )
+#else
+  G4String colname = G4StrUtil::strip_copy(G4String(name()),':');
+  if ( G4StrUtil::contains(colname, ':') )
+#endif
   {
-    G4int last = colname.last(':');
-    colname.remove(0,last+1);
+    G4int last = colname.rfind(':');
+    colname.erase(0,last+1);
   }
   colname += "::Hits";
   return new LArG4H6BeamSD(name(),colname);
diff --git a/LArCalorimeter/LArG4/LArG4H6SD/src/LArG4H6COLDTCMod0Calculator.cc b/LArCalorimeter/LArG4/LArG4H6SD/src/LArG4H6COLDTCMod0Calculator.cc
index 6f8dd573566eaad67932b545a2038a77dd470b0b..267a38799cb240ec74ea26417123bd141fed0c71 100644
--- a/LArCalorimeter/LArG4/LArG4H6SD/src/LArG4H6COLDTCMod0Calculator.cc
+++ b/LArCalorimeter/LArG4/LArG4H6SD/src/LArG4H6COLDTCMod0Calculator.cc
@@ -9,6 +9,7 @@
 #include "LArG4Code/LArG4Identifier.h"
 
 // Geant4 includes
+#include "G4Version.hh"
 #include "G4NavigationHistory.hh"
 #include "G4LogicalVolume.hh"
 #include "G4VPhysicalVolume.hh"
@@ -116,9 +117,13 @@ G4bool LArG4H6COLDTCMod0Calculator::Process(const G4Step* a_step, std::vector<LA
   /////////////////////////////////////
   // Strip the name of the volume:
   G4String hitVolume = pre_step_point->GetTouchable()->GetVolume(0)->GetName();
+#if G4VERSION_NUMBER < 1100
   if(hitVolume.contains("::") ) {
-           int last = hitVolume.last(':');
-            hitVolume.remove(0,last+1);
+#else
+  if(G4StrUtil::contains(hitVolume,"::") ) {
+#endif
+           int last = hitVolume.rfind(':');
+            hitVolume.erase(0,last+1);
   }
   int volnum = 0;
   if( hitVolume == "Gap") {
diff --git a/LArCalorimeter/LArG4/LArG4H6SD/src/LArG4TBECBeamChSensitiveDetector.cc b/LArCalorimeter/LArG4/LArG4H6SD/src/LArG4TBECBeamChSensitiveDetector.cc
index 71e51032f2594f5165fcb3b31b1bd935d4246d8c..4dddb4ff3f12deae10e32bb8ae529088a61254a7 100644
--- a/LArCalorimeter/LArG4/LArG4H6SD/src/LArG4TBECBeamChSensitiveDetector.cc
+++ b/LArCalorimeter/LArG4/LArG4H6SD/src/LArG4TBECBeamChSensitiveDetector.cc
@@ -10,6 +10,7 @@
 #include "LArG4TBECBeamChCalculator.h"
 #include "LArG4TBECBeamChHit.h"
 
+#include "G4Version.hh"
 #include "G4Step.hh"
 #include "G4ios.hh"
 
@@ -25,11 +26,16 @@ LArG4TBECBeamChSensitiveDetector::LArG4TBECBeamChSensitiveDetector(G4String a_na
   // a sensitive detector.  Hit collection names can't have any
   // slashes ("/"), because that confuses the name with the sensitive
   // detector names.
+#if G4VERSION_NUMBER < 1100
   G4String HCname = m_detectorName.strip(G4String::both,'/');
   if ( HCname.contains('/') )
+#else
+  G4String HCname = G4StrUtil::strip_copy(m_detectorName,'/');
+  if ( G4StrUtil::contains(HCname, '/') )
+#endif
     {
-      G4int lastSlash = HCname.last('/');
-      HCname.remove(0,lastSlash+1);
+      G4int lastSlash = HCname.rfind('/');
+      HCname.erase(0,lastSlash+1);
     }
 
   // This is the name to search for in the hit-collection table.
diff --git a/LArCalorimeter/LArG4/LArG4HEC/src/HECGeometry.cc b/LArCalorimeter/LArG4/LArG4HEC/src/HECGeometry.cc
index 7281b7e57548228b5564b09385da853bf50b4054..092653c609111f7a70bffe784edcf760bb25afb3 100644
--- a/LArCalorimeter/LArG4/LArG4HEC/src/HECGeometry.cc
+++ b/LArCalorimeter/LArG4/LArG4HEC/src/HECGeometry.cc
@@ -6,6 +6,7 @@
 #include "LArG4Code/LArG4Identifier.h"
 #include "LArG4HEC/HECGeometry.h"
 
+#include "G4Version.hh"
 #include "G4ThreeVector.hh"
 #include "G4StepPoint.hh"
 #include "G4Step.hh"
@@ -265,9 +266,11 @@ namespace LArG4 {
 
       // ------- ACTIVE and INACTIVE volumes -----------------------
       // (They are all inside a Depth (and some DM, too))
-
+#if G4VERSION_NUMBER < 1100
       if ( volumeName.contains("LArMgr::LAr::HEC::Module::Depth") )
-
+#else
+      if ( G4StrUtil::contains(volumeName, "LArMgr::LAr::HEC::Module::Depth") )
+#endif
         {
 
           const int depthVol= m_g4historyDepth+2 ; // geant depth of the HEC::Module::Depth
@@ -379,7 +382,11 @@ namespace LArG4 {
           else   // (has to be dead)
             {
               int itype = 2;
+#if G4VERSION_NUMBER < 1100
               if ( volumeName.contains("LArMgr::LAr::HEC::Module::Depth::FirstAbsorber") )   {
+#else
+              if ( G4StrUtil::contains(volumeName, "LArMgr::LAr::HEC::Module::Depth::FirstAbsorber") )   {
+#endif
                 itype = 1;
                 sampling = 2;
                 iphi = moduleIndex;
diff --git a/LArCalorimeter/LArG4/LArG4HEC/src/LocalCalibrationCalculator.cc b/LArCalorimeter/LArG4/LArG4HEC/src/LocalCalibrationCalculator.cc
index 24c73ebab4541f8a8fc114ec11dbb181c68c331b..77586c31b6c033caed750c4d64d61b152c4730b7 100644
--- a/LArCalorimeter/LArG4/LArG4HEC/src/LocalCalibrationCalculator.cc
+++ b/LArCalorimeter/LArG4/LArG4HEC/src/LocalCalibrationCalculator.cc
@@ -4,6 +4,7 @@
 
 #include "LocalCalibrationCalculator.h"
 
+#include "G4Version.hh"
 #include "G4Step.hh"
 #include "G4TouchableHistory.hh"
 
@@ -86,10 +87,17 @@ namespace LArG4 {
            const G4TouchableHistory* theTouchable = static_cast<const G4TouchableHistory*>(pre_step_point->GetTouchable());
            // Volume name 
            G4String hitVolume = theTouchable->GetVolume(0)->GetName();
+#if G4VERSION_NUMBER < 1100
           if(hitVolume.contains("::") ) {
              const int last = hitVolume.last(':');
              hitVolume.remove(0,last+1);
           }
+#else
+          if(G4StrUtil::contains(hitVolume, "::") ) {
+             const int last = hitVolume.rfind(':');
+             hitVolume.erase(0,last+1);
+          }
+#endif
           static const G4String sliceVolume("Slice");
           static const G4String absorberVolume("Absorber");
           static const G4String electrodeVolume("Electrode");
diff --git a/LArCalorimeter/LArMonitoring/python/GlobalVariables.py b/LArCalorimeter/LArMonitoring/python/GlobalVariables.py
index 1841882d8ee35dd0b1a6b3e8c05fc78d79a1e20c..aa1f533ce8e822d69412fb572f0053d820d6aed0 100644
--- a/LArCalorimeter/LArMonitoring/python/GlobalVariables.py
+++ b/LArCalorimeter/LArMonitoring/python/GlobalVariables.py
@@ -361,10 +361,7 @@ for sdet in lArDQGlobals.SubDet:
                   
                   lArDQGlobals.Cell_Variables["etaRange"][sdet]["A"][Lay]=currange
                   #The C side is just the symmeteric of the A side
-                  if sdet=="FCal":
-                        lArDQGlobals.Cell_Variables["etaRange"][sdet]["C"][Lay] = lArDQGlobals.Cell_Variables["etaRange"][sdet]["A"][Lay]
-                  else: #all other partitions
-                        lArDQGlobals.Cell_Variables["etaRange"][sdet]["C"][Lay] =list(map(lambda x: x*-1,lArDQGlobals.Cell_Variables["etaRange"][sdet]["A"][Lay]))[::-1]
+                  lArDQGlobals.Cell_Variables["etaRange"][sdet]["C"][Lay] =list(map(lambda x: x*-1,lArDQGlobals.Cell_Variables["etaRange"][sdet]["A"][Lay]))[::-1]
 
 #CNF
 lArDQGlobals.CNFN_tot = 80
diff --git a/LArCalorimeter/LArMonitoring/python/LArCosmicsMonAlg.py b/LArCalorimeter/LArMonitoring/python/LArCosmicsMonAlg.py
index 1d4f2c4e0585981ebf1ecd581e661169238935a6..24779aac18aa6cded58381a3b4d39123e9a24313 100644
--- a/LArCalorimeter/LArMonitoring/python/LArCosmicsMonAlg.py
+++ b/LArCalorimeter/LArMonitoring/python/LArCosmicsMonAlg.py
@@ -52,7 +52,7 @@ def LArCosmicsMonConfigCore(helper, algoinstance,inputFlags):
 
     cosmic_path="Cosmics/"
 
-    EM_bins=lArDQGlobals.Cell_Variables["etaRange"]["EMEC"]["C"]["2"]+lArDQGlobals.Cell_Variables["etaRange"]["EMB"]["C"]["2"]+lArDQGlobals.Cell_Variables["etaRange"]["EMB"]["A"]["2"]+lArDQGlobals.Cell_Variables["etaRange"]["EMEC"]["A"]["2"]
+    EM_bins=sorted(list(set(lArDQGlobals.Cell_Variables["etaRange"]["EMEC"]["C"]["2"]+lArDQGlobals.Cell_Variables["etaRange"]["EMB"]["C"]["2"]+lArDQGlobals.Cell_Variables["etaRange"]["EMB"]["A"]["2"]+lArDQGlobals.Cell_Variables["etaRange"]["EMEC"]["A"]["2"])))
     cosmicMonGroup.defineHistogram('mon_eta_EM,mon_phi;Muon2DHitsECAL',
                                    type='TH2F', 
                                    path=cosmic_path,
@@ -60,7 +60,7 @@ def LArCosmicsMonConfigCore(helper, algoinstance,inputFlags):
                                    xbins=EM_bins,
                                    ybins=lArDQGlobals.Cell_Variables["phiRange"]["EMB"]["A"]["2"])
 
-    HEC_bins=lArDQGlobals.Cell_Variables["etaRange"]["HEC"]["C"]["1"]+lArDQGlobals.Cell_Variables["etaRange"]["HEC"]["A"]["1"]
+    HEC_bins=sorted(list(set(lArDQGlobals.Cell_Variables["etaRange"]["HEC"]["C"]["1"]+lArDQGlobals.Cell_Variables["etaRange"]["HEC"]["A"]["1"])))
     cosmicMonGroup.defineHistogram('mon_eta_HEC,mon_phi;Muon2DHitsHCAL',
                                    type='TH2F', 
                                    path=cosmic_path,
@@ -68,7 +68,7 @@ def LArCosmicsMonConfigCore(helper, algoinstance,inputFlags):
                                    xbins=HEC_bins,
                                    ybins=lArDQGlobals.Cell_Variables["phiRange"]["HEC"]["A"]["1"])
 
-    FCal_bins=lArDQGlobals.Cell_Variables["etaRange"]["FCal"]["C"]["2"]+lArDQGlobals.Cell_Variables["etaRange"]["FCal"]["A"]["2"]
+    FCal_bins=sorted(list(set(lArDQGlobals.Cell_Variables["etaRange"]["FCal"]["C"]["2"]+lArDQGlobals.Cell_Variables["etaRange"]["FCal"]["A"]["2"])))
     cosmicMonGroup.defineHistogram('mon_eta_FCal,mon_phi;Muon2DHitsFCAL',
                                    type='TH2F', 
                                    path=cosmic_path,
diff --git a/LArCalorimeter/LArROD/src/LArLATOMEBuilderAlg.cxx b/LArCalorimeter/LArROD/src/LArLATOMEBuilderAlg.cxx
index 2aba11397ff731f44546645626c0a3fa1663d7b1..cbdf5fab4ae106d47a16ecac532e623a3b971cac 100644
--- a/LArCalorimeter/LArROD/src/LArLATOMEBuilderAlg.cxx
+++ b/LArCalorimeter/LArROD/src/LArLATOMEBuilderAlg.cxx
@@ -280,7 +280,7 @@ StatusCode LArLATOMEBuilderAlg::execute(const EventContext& ctx) const {
 /// reproduce LDPB package computation in https://gitlab.cern.ch/atlas-lar-online/onlinelatomedb/-/blob/master/src/CondFloatDB.cpp
 bool LArLATOMEBuilderAlg::floatToInt(float val, int &newval, int hardpoint, int size) const{
   
-  if( isnan(val) )return false;
+  if( std::isnan(val) )return false;
   int intVal = round(val*pow(2,hardpoint));
   bool isNeg = (intVal<0);
   unsigned int posVal = abs(intVal);
diff --git a/MuonSpectrometer/MuonConditions/MuonCondGeneral/MuonCondTest/CMakeLists.txt b/MuonSpectrometer/MuonConditions/MuonCondGeneral/MuonCondTest/CMakeLists.txt
index 62216673033dca9890cb42c4530c6884edb0948a..a0b9114897d198df9b35d493520d828565369470 100644
--- a/MuonSpectrometer/MuonConditions/MuonCondGeneral/MuonCondTest/CMakeLists.txt
+++ b/MuonSpectrometer/MuonConditions/MuonCondGeneral/MuonCondTest/CMakeLists.txt
@@ -26,6 +26,11 @@ atlas_add_test( MdtCabling_Run2Data
                   PROPERTIES TIMEOUT 600
                   POST_EXEC_SCRIPT nopost.sh)
 
+atlas_add_test( MdtCabling_Run2MC
+                  SCRIPT python -m MuonCondTest.MdtCablingTester -i /cvmfs/atlas-nightlies.cern.ch/repo/data/data-art/WorkflowReferences/master/q443/v9/myESD.pool.root
+                  PROPERTIES TIMEOUT 600
+                  POST_EXEC_SCRIPT nopost.sh)
+
 atlas_add_test( MdtCabling_Run3MC
                 SCRIPT python -m MuonCondTest.MdtCablingTester -i /cvmfs/atlas-nightlies.cern.ch/repo/data/data-art/WorkflowReferences/22.0/q445/v20/myESD.pool.root
                 PROPERTIES TIMEOUT 600
diff --git a/MuonSpectrometer/MuonConditions/MuonCondGeneral/MuonCondTest/python/MdtCablingTester.py b/MuonSpectrometer/MuonConditions/MuonCondGeneral/MuonCondTest/python/MdtCablingTester.py
index 5f32f0670eec9f6fd5c1d10a7cd4151cdb059742..9ab761177c1fac4bdbffd8ddb53246c8912a51eb 100644
--- a/MuonSpectrometer/MuonConditions/MuonCondGeneral/MuonCondTest/python/MdtCablingTester.py
+++ b/MuonSpectrometer/MuonConditions/MuonCondGeneral/MuonCondTest/python/MdtCablingTester.py
@@ -24,6 +24,13 @@ def SetupArgParser():
 def setupServicesCfg(flags):
     from AthenaConfiguration.MainServicesConfig import MainServicesCfg
     result = MainServicesCfg(flags)
+    ### Setup the file reading
+    from AthenaConfiguration.Enums import Format
+    if flags.Input.Format is Format.POOL:
+        from AthenaPoolCnvSvc.PoolReadConfig import PoolReadCfg
+        result.merge(PoolReadCfg(flags))
+       
+
     from MuonConfig.MuonGeometryConfig import MuonGeoModelCfg
     result.merge(MuonGeoModelCfg(flags))
     from MuonConfig.MuonGeometryConfig import MuonIdHelperSvcCfg
@@ -35,7 +42,12 @@ def MdtCablingTestAlgCfg(flags, name = "MdtCablingTestAlg"):
     from AthenaConfiguration.ComponentFactory import CompFactory
     result = setupServicesCfg(flags)
     from MuonConfig.MuonCablingConfig import MDTCablingConfigCfg
-    result.merge(MDTCablingConfigCfg(flags))
+    from MuonConfig.MuonCondAlgConfig import MdtCondDbAlgCfg
+    result.merge(MdtCondDbAlgCfg(flags))
+    result.merge(MDTCablingConfigCfg(flags,
+                                #MezzanineJSON="MezzMapping.json",
+                                #CablingJSON="MdtCabling.json"
+                                ))
     event_algo = CompFactory.MdtCablingTestAlg(name)
     result.addEventAlgo(event_algo, primary = True)
     return result
@@ -49,20 +61,13 @@ if __name__ == "__main__":
     flags.Concurrency.NumConcurrentEvents = args.threads  # Might change this later, but good enough for the moment.
     flags.Output.ESDFileName = args.output
     flags.Input.Files = args.inputFile
+    flags.Input.RunNumber = 310000
     flags.lock()   
     
     cfg = MdtCablingTestAlgCfg(flags)
-    msgService = cfg.getService('MessageSvc')
-    msgService.Format = "S:%s E:%e % F%128W%S%7W%R%T  %0W%M"
-
     cfg.printConfig(withDetails=True, summariseProps=True)
-
     flags.dump()
-
-    f = open("MdtCablingTester.pkl", "wb")
-    cfg.store(f)
-    f.close()
-
+   
     sc = cfg.run(1)
     if not sc.isSuccess():
         import sys
diff --git a/MuonSpectrometer/MuonConditions/MuonCondGeneral/MuonCondTest/python/MdtMezzExtraction.py b/MuonSpectrometer/MuonConditions/MuonCondGeneral/MuonCondTest/python/MdtMezzExtraction.py
index e33996b38f36300b31c59afbc77f138519fd10a7..7938c75695d4a29062ddbb4a9edfeb530d8b2904 100644
--- a/MuonSpectrometer/MuonConditions/MuonCondGeneral/MuonCondTest/python/MdtMezzExtraction.py
+++ b/MuonSpectrometer/MuonConditions/MuonCondGeneral/MuonCondTest/python/MdtMezzExtraction.py
@@ -1,38 +1,8 @@
 # Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
-
-def SetupArgParser():
-    from argparse import ArgumentParser
-
-    parser = ArgumentParser()
-    parser.add_argument("-t", "--threads", dest="threads", type=int, help="number of threads", default=1)
-
-    parser.add_argument("-o", "--output", dest="output", default='newESD.pool.root', help="write ESD to FILE", metavar="FILE")
-
-    parser.add_argument("--run",
-                        help="Run directly from the python. If false, just stop once the pickle is written.",
-                        action="store_true",
-                        default=True)
-
-    parser.add_argument("--forceclone",
-                        help="Override default cloneability of algorithms to force them to run in parallel",
-                        action="store_true")
-    parser.add_argument("-d", "--debug", default=None, help="attach debugger (gdb) before run, <stage>: conf, init, exec, fini")
-    parser.add_argument("--inputFile", "-i", default=["/cvmfs/atlas-nightlies.cern.ch/repo/data/data-art/Tier0ChainTests/data17_13TeV.00330470.physics_Main.daq.RAW._lb0310._SFO-1._0001.data"], 
-                        help="Input file to run on ", nargs="+")
-    return parser
-    
-def setupServicesCfg(flags):
-    from AthenaConfiguration.MainServicesConfig import MainServicesCfg
-    result = MainServicesCfg(flags)
-    from MuonConfig.MuonGeometryConfig import MuonGeoModelCfg
-    result.merge(MuonGeoModelCfg(flags))
-    from MuonConfig.MuonGeometryConfig import MuonIdHelperSvcCfg
-    result.merge(MuonIdHelperSvcCfg(flags))
-    
-    return result
-
+ 
 def MdtCablMezzAlgCfg(flags, name = "MdtCablMezzAlg"):
     from AthenaConfiguration.ComponentFactory import CompFactory
+    from MuonCondTest.MdtCablingTester import setupServicesCfg
     result = setupServicesCfg(flags)
     from MuonConfig.MuonCablingConfig import MDTCablingConfigCfg
     result.merge(MDTCablingConfigCfg(flags))
@@ -42,6 +12,7 @@ def MdtCablMezzAlgCfg(flags, name = "MdtCablMezzAlg"):
 
 if __name__ == "__main__":
     from AthenaConfiguration.AllConfigFlags import initConfigFlags
+    from MuonCondTester.MdtCablingTester import SetupArgParser
     args = SetupArgParser().parse_args()
 
     flags = initConfigFlags()
@@ -52,17 +23,10 @@ if __name__ == "__main__":
     flags.lock()   
     
     cfg = MdtCablMezzAlgCfg(flags)
-    msgService = cfg.getService('MessageSvc')
-    msgService.Format = "S:%s E:%e % F%128W%S%7W%R%T  %0W%M"
-
     cfg.printConfig(withDetails=True, summariseProps=True)
 
     flags.dump()
 
-    f = open("MdtCablingTester.pkl", "wb")
-    cfg.store(f)
-    f.close()
-
     sc = cfg.run(1)
     if not sc.isSuccess():
         import sys
diff --git a/MuonSpectrometer/MuonConditions/MuonCondGeneral/MuonCondTest/python/RpcCablingTester.py b/MuonSpectrometer/MuonConditions/MuonCondGeneral/MuonCondTest/python/RpcCablingTester.py
index 7c8d5c285d524e02e7f62645b8f3f422c9580d68..6a973cd4dacf34013b3408a81222b3bd1b589e9a 100644
--- a/MuonSpectrometer/MuonConditions/MuonCondGeneral/MuonCondTest/python/RpcCablingTester.py
+++ b/MuonSpectrometer/MuonConditions/MuonCondGeneral/MuonCondTest/python/RpcCablingTester.py
@@ -1,48 +1,22 @@
 # Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
 
-def SetupArgParser():
-    from argparse import ArgumentParser
-
-    parser = ArgumentParser()
-    parser.add_argument("-t", "--threads", dest="threads", type=int, help="number of threads", default=1)
-
-    parser.add_argument("-o", "--output", dest="output", default='newESD.pool.root', help="write ESD to FILE", metavar="FILE")
-
-    parser.add_argument("--run",
-                        help="Run directly from the python. If false, just stop once the pickle is written.",
-                        action="store_true",
-                        default=True)
-
-    parser.add_argument("--forceclone",
-                        help="Override default cloneability of algorithms to force them to run in parallel",
-                        action="store_true")
-    parser.add_argument("-d", "--debug", default=None, help="attach debugger (gdb) before run, <stage>: conf, init, exec, fini")
-    parser.add_argument("--inputFile", "-i", default=["/cvmfs/atlas-nightlies.cern.ch/repo/data/data-art/WorkflowReferences/22.0/q445/v20/myESD.pool.root"], 
-                        help="Input file to run on ", nargs="+")
-    return parser
-    
-def setupServicesCfg(flags):
-    from AthenaConfiguration.MainServicesConfig import MainServicesCfg
-    result = MainServicesCfg(flags)
-    from MuonConfig.MuonGeometryConfig import MuonGeoModelCfg
-    result.merge(MuonGeoModelCfg(flags))
-    from MuonConfig.MuonGeometryConfig import MuonIdHelperSvcCfg
-    result.merge(MuonIdHelperSvcCfg(flags))    
-    return result
-
 def RpcCablingTestAlgCfg(flags, name = "RpcCablingTestAlg"):
     from AthenaConfiguration.ComponentFactory import CompFactory
+    from MuonCondTest.MdtCablingTester import setupServicesCfg
     result = setupServicesCfg(flags)
     from MuonConfig.MuonCablingConfig import NRPCCablingConfigCfg
     from AthenaCommon.Constants import DEBUG
-    result.getPrimaryAndMerge(NRPCCablingConfigCfg(flags, JSONFile = "CablingFile.json")).OutputLevel = DEBUG
+    result.merge(NRPCCablingConfigCfg(flags, JSONFile = "CablingFile.json", OutputLevel = DEBUG ))
     event_algo = CompFactory.RpcCablingTestAlg(name, OutputLevel = DEBUG)
     result.addEventAlgo(event_algo, primary = True)
     return result
 
 if __name__ == "__main__":
     from AthenaConfiguration.AllConfigFlags import initConfigFlags
-    args = SetupArgParser().parse_args()
+    from MuonCondTest.MdtCablingTester import SetupArgParser
+    parser = SetupArgParser()
+    parser.set_defaults(inputFile=["/cvmfs/atlas-nightlies.cern.ch/repo/data/data-art/WorkflowReferences/22.0/q445/v20/myESD.pool.root"])
+    args = parser.parse_args()
 
     flags = initConfigFlags()
     flags.Concurrency.NumThreads = args.threads
@@ -51,18 +25,10 @@ if __name__ == "__main__":
     flags.Input.Files = args.inputFile
     flags.lock()   
     
-    cfg = RpcCablingTestAlgCfg(flags)
-    msgService = cfg.getService('MessageSvc')
-    msgService.Format = "S:%s E:%e % F%128W%S%7W%R%T  %0W%M"
-
+    cfg = RpcCablingTestAlgCfg(flags)  
     cfg.printConfig(withDetails=True, summariseProps=True)
-
     flags.dump()
-
-    f = open("RpcCablingTester.pkl", "wb")
-    cfg.store(f)
-    f.close()
-
+   
     sc = cfg.run(1)
     if not sc.isSuccess():
         import sys
diff --git a/MuonSpectrometer/MuonConditions/MuonCondGeneral/MuonCondTest/src/MdtCablingTestAlg.cxx b/MuonSpectrometer/MuonConditions/MuonCondGeneral/MuonCondTest/src/MdtCablingTestAlg.cxx
index a3ff618c4f03e211eb504d4ee5b24d8794f85ebd..cba86a4aba3acb9fb2790e98ad444cfdeb10ccc2 100644
--- a/MuonSpectrometer/MuonConditions/MuonCondGeneral/MuonCondTest/src/MdtCablingTestAlg.cxx
+++ b/MuonSpectrometer/MuonConditions/MuonCondGeneral/MuonCondTest/src/MdtCablingTestAlg.cxx
@@ -16,6 +16,7 @@ StatusCode MdtCablingTestAlg::initialize(){
   ATH_CHECK(m_idHelperSvc.retrieve());
   ATH_CHECK(m_DetectorManagerKey.initialize());
   ATH_CHECK(m_cablingKey.initialize());
+  ATH_CHECK(m_deadChanKey.initialize(!m_deadChanKey.empty()));
   return StatusCode::SUCCESS;
 } 
 
@@ -79,11 +80,23 @@ StatusCode MdtCablingTestAlg::execute(){
      ATH_MSG_ERROR("Failed to retrieve the Mdt cabling "<<m_cablingKey.fullKey());
      return StatusCode::FAILURE;
   }
-  const MdtIdHelper& idHelper = m_idHelperSvc->mdtIdHelper();
-  unsigned int n_elements{0}, n_success{0};
-  bool failure{false};
-  for (unsigned int hash = 0; hash < MuonGM::MuonDetectorManager::MdtRElMaxHash; ++hash){
-    const IdentifierHash id_hash{hash};
+
+  const MdtCondDbData* deadChan{nullptr};
+  if (!m_deadChanKey.empty()) {
+     SG::ReadCondHandle<MdtCondDbData> deadChanHandle{m_deadChanKey,ctx};
+     if (!deadChanHandle.isValid()) {
+        ATH_MSG_FATAL("Failed to retrieve Mdt conditions "<<m_deadChanKey.fullKey());
+        return StatusCode::FAILURE;
+     }
+     deadChan = deadChanHandle.cptr();
+
+  }
+  
+   const MdtIdHelper& idHelper = m_idHelperSvc->mdtIdHelper();
+   unsigned int n_elements{0}, n_success{0};
+   bool failure{false};
+   for (unsigned int hash = 0; hash < MuonGM::MuonDetectorManager::MdtRElMaxHash; ++hash){
+     const IdentifierHash id_hash{hash};
 
     const MuonGM::MdtReadoutElement* readEle = detectorMgr->getMdtReadoutElement(id_hash);
     if (!readEle) {
@@ -91,6 +104,11 @@ StatusCode MdtCablingTestAlg::execute(){
         continue;
     }
     const Identifier station_id = idHelper.elementID(readEle->identify());
+    
+    if (deadChan && !deadChan->isGoodStation(station_id)) {
+      ATH_MSG_ALWAYS("Dead station found "<<m_idHelperSvc->toString(station_id));
+      continue;
+    }
     ATH_MSG_DEBUG("Check station "<<m_idHelperSvc->toString(station_id));
     for (int layer = 1 ; layer <= readEle->getNLayers(); ++layer){
       for (int tube = 1 ; tube <= readEle->getNtubesperlayer(); ++tube){
@@ -100,22 +118,28 @@ StatusCode MdtCablingTestAlg::execute(){
             ATH_MSG_VERBOSE("Invalid element");
             continue;
           }
+          if (deadChan && !deadChan->isGood(tube_id)) {
+            ATH_MSG_ALWAYS("Dead dube detected "<<m_idHelperSvc->toString(tube_id));
+            continue;
+          }
           ++n_elements;
           /// Create the cabling object
           MdtCablingData cabling_data{};
           cabling->convert(tube_id,cabling_data);
           /// Test if the online channel can be found
           if (!cabling->getOnlineId(cabling_data,msgStream())){
-             ATH_MSG_ERROR("Could no retrieve a valid online channel for "<<m_idHelperSvc->toString(tube_id));
+             ATH_MSG_ERROR("Could no retrieve a valid online channel for "<<m_idHelperSvc->toString(tube_id)<<" from station ID "<<m_idHelperSvc->toString(readEle->identify()));
+             failure = true;
              continue;
           }
           /// Test if the online channel can be transformed back
           
           /// Reset the offline cabling          
           const MdtCablingOffData off_data{};
-          cabling_data.MdtCablingOffData::operator=(off_data);
+          static_cast<MdtCablingOffData&> (cabling_data) = off_data;
           if (!cabling->getOfflineId(cabling_data, msgStream())){
             ATH_MSG_ERROR("Could not convert the online cabling "<<cabling_data<<" to an offline identifier. Initial identifier "<<m_idHelperSvc->toString(tube_id));
+            failure = true;
             continue;
           }
           
@@ -128,12 +152,11 @@ StatusCode MdtCablingTestAlg::execute(){
           if (test_id != tube_id){
             ATH_MSG_ERROR("The forward -> backward conversion failed. Started with "<<m_idHelperSvc->toString(tube_id)<<" ended with "<<m_idHelperSvc->toString(test_id));
             failure = true;
-            return StatusCode::FAILURE;
             continue;
           }
           
           /// Reset the offline cabling again
-          cabling_data.MdtCablingOffData::operator=(off_data);
+          static_cast<MdtCablingOffData&>(cabling_data) = off_data;
           
           /// Test whether the online module can be decoded successfully
           cabling_data.tdcId = 0xff;
diff --git a/MuonSpectrometer/MuonConditions/MuonCondGeneral/MuonCondTest/src/MdtCablingTestAlg.h b/MuonSpectrometer/MuonConditions/MuonCondGeneral/MuonCondTest/src/MdtCablingTestAlg.h
index cb80040e21ca14812c5146692066311a92b9671a..65c6072ffec2c22b973578994bd3bc681533b370 100644
--- a/MuonSpectrometer/MuonConditions/MuonCondGeneral/MuonCondTest/src/MdtCablingTestAlg.h
+++ b/MuonSpectrometer/MuonConditions/MuonCondGeneral/MuonCondTest/src/MdtCablingTestAlg.h
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
 */
 
 /**
@@ -15,7 +15,7 @@
 #include "MuonIdHelpers/IMuonIdHelperSvc.h"
 #include "StoreGate/ReadCondHandleKey.h"
 #include "MuonReadoutGeometry/MuonDetectorManager.h"
-
+#include "MuonCondData/MdtCondDbData.h"
 
 
 class MdtCablingTestAlg : public AthAlgorithm {
@@ -35,6 +35,8 @@ private:
                                                                                 "Key of input MuonDetectorManager condition data"};
 
     SG::ReadCondHandleKey<MuonMDT_CablingMap> m_cablingKey{this, "WriteKey", "MuonMDT_CablingMap", "Key of input MDT cabling map"};
+
+    SG::ReadCondHandleKey<MdtCondDbData> m_deadChanKey{this, "ReadKey", "MdtCondDbData", "Key of MdtCondDbData"};
     
 };
 
diff --git a/MuonSpectrometer/MuonConfig/python/MuonReconstructionConfig.py b/MuonSpectrometer/MuonConfig/python/MuonReconstructionConfig.py
index 8310352ccd7cc34711301c97b736b56c645074fa..3ae727e08ad10177068df2f6e1f532ea27f97844 100644
--- a/MuonSpectrometer/MuonConfig/python/MuonReconstructionConfig.py
+++ b/MuonSpectrometer/MuonConfig/python/MuonReconstructionConfig.py
@@ -254,3 +254,5 @@ if __name__ == "__main__":
         if not sc.isSuccess():
             import sys
             sys.exit("Execution failed")
+    else:
+        cfg.wasMerged()
diff --git a/MuonSpectrometer/MuonConfig/python/MuonSegmentFindingConfig.py b/MuonSpectrometer/MuonConfig/python/MuonSegmentFindingConfig.py
index ccd6c2f0b42cfb95528dd3ac9dbf8a22c07eaabc..0c369997e4724a5b1c3b82232c38c852bad37d85 100644
--- a/MuonSpectrometer/MuonConfig/python/MuonSegmentFindingConfig.py
+++ b/MuonSpectrometer/MuonConfig/python/MuonSegmentFindingConfig.py
@@ -875,3 +875,5 @@ if __name__=="__main__":
         if not sc.isSuccess():
             import sys
             sys.exit("Execution failed")
+    else:
+        cfg.wasMerged()
diff --git a/MuonSpectrometer/MuonValidation/MuonDQA/MuonTrackMonitoring/python/MuonTrackMonitorAlgorithm.py b/MuonSpectrometer/MuonValidation/MuonDQA/MuonTrackMonitoring/python/MuonTrackMonitorAlgorithm.py
index 6a60033248d25c730242f1d77f045f192a441dbd..7f27decea0739f5839c8ce99f1308f888c3961fe 100644
--- a/MuonSpectrometer/MuonValidation/MuonDQA/MuonTrackMonitoring/python/MuonTrackMonitorAlgorithm.py
+++ b/MuonSpectrometer/MuonValidation/MuonDQA/MuonTrackMonitoring/python/MuonTrackMonitorAlgorithm.py
@@ -3,7 +3,7 @@ Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
 2020 Matthias Schott - Uni Mainz
 """
 
-from AthenaConfiguration.Enums import BeamType, Format
+from AthenaConfiguration.Enums import BeamType
 
 
 def MuonTrackConfig(flags, isOld=False, **kwargs):
@@ -19,13 +19,8 @@ def MuonTrackConfig(flags, isOld=False, **kwargs):
     helper = AthMonitorCfgHelper(flags, "MuonTrackMonitoringConfig")
     if flags.Beam.Type != BeamType.Collisions:
         kwargs.setdefault("PrimaryVerticesKey", "")
+    if flags.Common.isOnline or flags.Beam.Type != BeamType.Collisions:
         kwargs.setdefault("RequireBeamSpot", False)
-    elif flags.Input.Format is Format.BS:
-        # TODO: not sure if this is needed at all, probably it was needed due to wrapping
-        # it has been agreed on that beamspot decoration is done once centrally during RAWtoALL
-        from xAODEventInfoCnv.EventInfoBeamSpotDecoratorAlgConfig import (
-            EventInfoBeamSpotDecoratorAlgCfg)
-        helper.resobj.merge(EventInfoBeamSpotDecoratorAlgCfg(flags))
 
     muonTrackAlg = helper.addAlgorithm(MuonTrackMonitorAlgorithm, "MuonTrackMonitorAlg", **kwargs)
 
diff --git a/PhysicsAnalysis/D3PDMaker/D3PDMakerReader/src/RootReaderD3PDBase.cxx b/PhysicsAnalysis/D3PDMaker/D3PDMakerReader/src/RootReaderD3PDBase.cxx
index 1a8c6328ddeeeb3caa051146db1527bff9af5593..eb16f3fa8c3e93e4ce5cc74b93368e7e81fd64bf 100644
--- a/PhysicsAnalysis/D3PDMaker/D3PDMakerReader/src/RootReaderD3PDBase.cxx
+++ b/PhysicsAnalysis/D3PDMaker/D3PDMakerReader/src/RootReaderD3PDBase.cxx
@@ -7,9 +7,6 @@
 // ROOT include(s):
 #include <Rtypes.h>
 
-// Boost include(s):
-#include <boost/algorithm/string.hpp>
-
 // Gaudi/Athena include(s):
 #include "GaudiKernel/System.h"
 #include "AthenaKernel/errorcheck.h"
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkConfiguration/python/DerivationConfigList.py b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkConfiguration/python/DerivationConfigList.py
index 33228a7ca609d1fba442447fffc445848bfa9ddf..72d062e89fe3deb321024f02daae939e783d12fc 100644
--- a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkConfiguration/python/DerivationConfigList.py
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkConfiguration/python/DerivationConfigList.py
@@ -80,6 +80,7 @@ from DerivationFrameworkEGamma.EGAM10 import EGAM10Cfg
 # FTAG derivations
 from DerivationFrameworkFlavourTag.FTAG1 import FTAG1Cfg
 from DerivationFrameworkFlavourTag.FTAG2 import FTAG2Cfg
+from DerivationFrameworkFlavourTag.FTAG3 import FTAG3Cfg
 
 # Jet/Etmiss derivations
 # JETM1: dijet for MC calibrations, JER, MJB, eta-intercalibration
@@ -112,7 +113,7 @@ __all__ = ['TEST1Cfg','TEST2Cfg','TEST3Cfg','TEST4Cfg','TEST5Cfg','TEST6Cfg',
            'TRUTH0Cfg','TRUTH1Cfg','TRUTH3Cfg',
            'PHYSCfg','PHYSLITECfg',
            'PHYSVALCfg',
-           'FTAG1Cfg', 'FTAG2Cfg',
+           'FTAG1Cfg', 'FTAG2Cfg', 'FTAG3Cfg',
            'HIGG1D1Cfg',
            'LLP1Cfg',
            'IDTR2Cfg',
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkConfiguration/python/DerivationSkeleton.py b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkConfiguration/python/DerivationSkeleton.py
index f86f4e44c7465d10de45bada0b01da90eecf15f2..1f5758b3c901216e75a441d5aa0660c4f66fc3a4 100644
--- a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkConfiguration/python/DerivationSkeleton.py
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkConfiguration/python/DerivationSkeleton.py
@@ -69,10 +69,11 @@ def fromRunArgs(runArgs):
 
     # Output files
     for runArg in dir(runArgs):
-        if 'output' in runArg and 'File' in runArg and 'NTUP_PHYSVAL' not in runArg:
+        if 'output' in runArg and 'File' in runArg and 'Type' not in runArg and 'NTUP_PHYSVAL' not in runArg:
             outputFileName = getattr(runArgs, runArg)
             flagString = f'Output.{runArg.strip("output")}Name'
             flags.addFlag(flagString, outputFileName)
+            flags.addFlag(f'Output.doWrite{runArg.removeprefix("output").removesuffix("File")}', True)
             flags.Output.doWriteDAOD = True
 
     # Pre-include
@@ -101,9 +102,12 @@ def fromRunArgs(runArgs):
     from EventBookkeeperTools.EventBookkeeperToolsConfig import CutFlowSvcCfg
     cfg.merge(CutFlowSvcCfg(flags))
 
+    from xAODMetaDataCnv.InfileMetaDataConfig import InfileMetaDataCfg
     for formatName in formats:
         derivationConfig = getattr(DerivationConfigList, f'{formatName}Cfg')
         cfg.merge(derivationConfig(flags))
+        # Needed for MetaData
+        cfg.merge(InfileMetaDataCfg(flags, f"DAOD_{formatName}"))
 
     # Pass-through mode (ignore skimming and accept all events)
     if hasattr(runArgs, 'passThrough'):
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkFlavourTag/CMakeLists.txt b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkFlavourTag/CMakeLists.txt
index f58f53f93264cd3f817d3f9aea01c3ecc1a76b70..43ec2980ec791a27b476369dfa304214f0bd06b0 100644
--- a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkFlavourTag/CMakeLists.txt
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkFlavourTag/CMakeLists.txt
@@ -14,4 +14,3 @@ atlas_add_component( DerivationFrameworkFlavourTag
 
 # Install files from the package:
 atlas_install_python_modules( python/*.py POST_BUILD_CMD ${ATLAS_FLAKE8} )
-atlas_install_joboptions( share/*.py )
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkFlavourTag/python/BTaggingContent.py b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkFlavourTag/python/BTaggingContent.py
index c508668ed281bf04218448be825e5be93d67b930..f10adb31e422088f03dce29c9639a71af63ed146 100644
--- a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkFlavourTag/python/BTaggingContent.py
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkFlavourTag/python/BTaggingContent.py
@@ -33,6 +33,9 @@ BTaggingStandardRun3Aux = \
     , "dipsLoose20220314v2_pu"
     , "dipsLoose20220314v2_pc"
     , "dipsLoose20220314v2_pb"
+    , "dipsLooseVR20230208_pu"
+    , "dipsLooseVR20230208_pc"
+    , "dipsLooseVR20230208_pb"
 
     , "SV1_NGTinSvx"
     , "SV1_masssvx"
@@ -56,7 +59,9 @@ BTaggingStandardRun3Aux = \
     , "GN120220509_pb"
     , "GN120220509_pc"
     , "GN120220509_pu"
-
+    , "GN2v00_pb"
+    , "GN2v00_pc"
+    , "GN2v00_pu"
     ]
 
 BTaggingStandardRun4Aux = [
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkFlavourTag/python/FTAG1.py b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkFlavourTag/python/FTAG1.py
index e2323194d95c4dcd6b43a7bf5319b8e309c8c2c6..d836ed7e3abe0ca9eba899b2a6626ca9ea01511a 100644
--- a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkFlavourTag/python/FTAG1.py
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkFlavourTag/python/FTAG1.py
@@ -35,19 +35,13 @@ def FTAG1KernelCfg(flags, name='FTAG1Kernel', **kwargs):
     return acc
 
 
-def FTAG1Cfg(flags):
+def FTAG1CoreCfg(flags, name_tag='FTAG1', extra_SmartCollections=None, extra_AllVariables=None, trigger_option=''):
 
-    acc = ComponentAccumulator()
+    if extra_SmartCollections is None: extra_SmartCollections = []
+    if extra_AllVariables is None: extra_AllVariables = []
 
-    # Get the lists of triggers needed for trigger matching.
-    # This is needed at this scope (for the slimming) and further down in the config chain
-    # for actually configuring the matching, so we create it here and pass it down
-    # TODO: this should ideally be called higher up to avoid it being run multiple times in a train
-    from DerivationFrameworkPhys.TriggerListsHelper import TriggerListsHelper
-    FTAG1TriggerListsHelper = TriggerListsHelper(flags)
 
-    # Common augmentations
-    acc.merge(FTAG1KernelCfg(flags, name="FTAG1Kernel", StreamName = 'StreamDAOD_FTAG1', TriggerListsHelper = FTAG1TriggerListsHelper))
+    acc = ComponentAccumulator()
 
     # ============================
     # Define contents of the format
@@ -55,7 +49,7 @@ def FTAG1Cfg(flags):
     from OutputStreamAthenaPool.OutputStreamConfig import OutputStreamCfg
     from DerivationFrameworkCore.SlimmingHelper import SlimmingHelper
     
-    FTAG1SlimmingHelper = SlimmingHelper("FTAG1SlimmingHelper", NamesAndTypes = flags.Input.TypedCollections, flags = flags)
+    FTAG1SlimmingHelper = SlimmingHelper(name_tag+"SlimmingHelper", NamesAndTypes = flags.Input.TypedCollections, flags = flags)
 
     # Many of these are added to AllVariables below as well. We add
     # these items in both places in case some of the smart collections
@@ -74,6 +68,11 @@ def FTAG1Cfg(flags):
                                            "AntiKt10UFOCSSKJets",
                                            "AntiKt10UFOCSSKSoftDropBeta100Zcut10Jets",
                                           ]
+    if len(extra_SmartCollections)>0:
+        for a_container in extra_SmartCollections:
+            if a_container not in FTAG1SlimmingHelper.SmartCollections:
+                FTAG1SlimmingHelper.SmartCollections.append(a_container)
+
     FTAG1SlimmingHelper.AllVariables = [
             "EventInfo",
             "PrimaryVertices",
@@ -95,6 +94,10 @@ def FTAG1Cfg(flags):
             "TruthVertices",
             "TruthBottom", "TruthElectrons","TruthMuons","TruthTaus",
             ]
+    if len(extra_AllVariables)>0:
+        for a_container in extra_AllVariables:
+            if a_container not in FTAG1SlimmingHelper.AllVariables:
+                FTAG1SlimmingHelper.AllVariables.append(a_container)
 
     if flags.BTagging.Pseudotrack:
         FTAG1SlimmingHelper.AllVariables += [ "InDetPseudoTrackParticles" ]
@@ -111,14 +114,6 @@ def FTAG1Cfg(flags):
                                                        'NVSI_SecVrt_Loose' : 'xAOD::VertexContainer','NVSI_SecVrt_LooseAux' : 'xAOD::VertexAuxContainer'})
 
     # Append to dictionary
-    FTAG1SlimmingHelper.AppendToDictionary['GlobalChargedParticleFlowObjects'] ='xAOD::FlowElementContainer'
-    FTAG1SlimmingHelper.AppendToDictionary['GlobalChargedParticleFlowObjectsAux'] ='xAOD::FlowElementAuxContainer'
-    FTAG1SlimmingHelper.AppendToDictionary['GlobalNeutralParticleFlowObjects'] = 'xAOD::FlowElementContainer'
-    FTAG1SlimmingHelper.AppendToDictionary['GlobalNeutralParticleFlowObjectsAux'] = 'xAOD::FlowElementAuxContainer'
-    FTAG1SlimmingHelper.AppendToDictionary['CHSGChargedParticleFlowObjects'] = 'xAOD::FlowElementContainer'
-    FTAG1SlimmingHelper.AppendToDictionary['CHSGChargedParticleFlowObjectsAux'] = 'xAOD::ShallowAuxContainer'
-    FTAG1SlimmingHelper.AppendToDictionary['CHSGNeutralParticleFlowObjects'] = 'xAOD::FlowElementContainer'
-    FTAG1SlimmingHelper.AppendToDictionary['CHSGNeutralParticleFlowObjectsAux'] = 'xAOD::ShallowAuxContainer'
 
 
     from DerivationFrameworkFlavourTag import FtagBaseContent
@@ -166,15 +161,37 @@ def FTAG1Cfg(flags):
     FtagBaseContent.add_ExtraVariables_to_SlimmingHelper(FTAG1SlimmingHelper)
    
     # Trigger content
-    FtagBaseContent.trigger_setup(FTAG1SlimmingHelper)
+    FtagBaseContent.trigger_setup(FTAG1SlimmingHelper, trigger_option)
 
 
     # Output stream    
     FTAG1ItemList = FTAG1SlimmingHelper.GetItemList()
-    acc.merge(OutputStreamCfg(flags, "DAOD_FTAG1", ItemList=FTAG1ItemList, AcceptAlgs=["FTAG1Kernel"]))
+    acc.merge(OutputStreamCfg(flags, "DAOD_"+name_tag, ItemList=FTAG1ItemList, AcceptAlgs=[name_tag+"Kernel"]))
+
+    return acc
+
+def FTAG1Cfg(flags):
+
+    acc = ComponentAccumulator()
+
+    # Get the lists of triggers needed for trigger matching.
+    # This is needed at this scope (for the slimming) and further down in the config chain
+    # for actually configuring the matching, so we create it here and pass it down
+    # TODO: this should ideally be called higher up to avoid it being run multiple times in a train
+    from DerivationFrameworkPhys.TriggerListsHelper import TriggerListsHelper
+    FTAG1TriggerListsHelper = TriggerListsHelper(flags)
+   
+    # name_tag has to be consistent between KernelCfg and CoreCfg
+    FTAG1_name_tag = 'FTAG1'
+
+    # Common augmentations
+    acc.merge(FTAG1KernelCfg(flags, name=FTAG1_name_tag + "Kernel", StreamName = 'StreamDAOD_'+FTAG1_name_tag, TriggerListsHelper = FTAG1TriggerListsHelper))
+    # Content of FTAG1 
+    acc.merge(FTAG1CoreCfg(flags, FTAG1_name_tag))
 
     return acc
 
+
 def V0ToolCfg(flags, augmentationTools=None, tool_name_prefix="FTAG1", container_name_prefix="FTAG"):
     
     acc = ComponentAccumulator()
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkFlavourTag/python/FTAG3.py b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkFlavourTag/python/FTAG3.py
new file mode 100644
index 0000000000000000000000000000000000000000..a523876172522e75664c6fbe8755c84cedc5a672
--- /dev/null
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkFlavourTag/python/FTAG3.py
@@ -0,0 +1,114 @@
+# Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
+#!/usr/bin/env python
+#====================================================================
+# DAOD_FTAG3.py
+# This defines DAOD_FTAG3, an unskimmed DAOD format for Run 3.
+# It is designed for the g->bb calibration.
+# It requires the flag FTAG3 in Derivation_tf.py   
+#====================================================================
+
+from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
+from AthenaConfiguration.ComponentFactory import CompFactory
+
+
+# Main algorithm config
+def FTAG3KernelCfg(flags, name='FTAG3Kernel', **kwargs):
+    """Configure the derivation framework driving algorithm (kernel) for FTAG3"""
+    acc = ComponentAccumulator()
+    
+    from DerivationFrameworkFlavourTag.FTAG1 import FTAG1KernelCfg
+    acc.merge(FTAG1KernelCfg(flags, name, TriggerListsHelper = kwargs['TriggerListsHelper']))
+
+    # augmentation tools
+    augmentationTools = []
+
+    # skimming tools
+    skimmingTools = []
+    # filter leptons
+    lepton_skimming_expression = 'count( (Muons.pt > 5*GeV) && (0 == Muons.muonType || 1 == Muons.muonType || 4 == Muons.muonType) ) >=1'
+    FTAG3LeptonSkimmingTool = CompFactory.DerivationFramework.xAODStringSkimmingTool(
+            name = "FTAG3LeptonSkimmingTool",
+            expression = lepton_skimming_expression )
+    acc.addPublicTool(FTAG3LeptonSkimmingTool)
+    # filter large-R jets
+    UFOjets_skimming_expression = 'count( AntiKt10UFOCSSKSoftDropBeta100Zcut10Jets.pt > 150*GeV ) >= 1' 
+    FTAG3UFOjetsSkimmingTool = CompFactory.DerivationFramework.xAODStringSkimmingTool(
+            name = "FTAG3UFOjetsSkimmingTool",
+            expression = UFOjets_skimming_expression )
+    acc.addPublicTool(FTAG3UFOjetsSkimmingTool)
+    # filter single-jet triggers for data
+    if not flags.Input.isMC:
+        acc.merge(FTAG3TriggerSkimmingToolCfg(flags, skimmingTools))
+
+    # thinning tools
+    thinningTools = []
+    from DerivationFrameworkInDet.InDetToolsConfig import MuonTrackParticleThinningCfg
+    # Include inner detector tracks associated with muons
+    FTAG3MuonTPThinningTool = acc.getPrimaryAndMerge(MuonTrackParticleThinningCfg(
+        flags,
+        name                    = "FTAG3MuonTPThinningTool",
+        StreamName              = kwargs['StreamName'],
+        MuonKey                 = "Muons",
+        InDetTrackParticlesKey  = "InDetTrackParticles"))
+
+    skimmingTools += [
+            FTAG3UFOjetsSkimmingTool,
+            FTAG3LeptonSkimmingTool,
+            ]
+
+    thinningTools = [
+            FTAG3MuonTPThinningTool,
+            ]
+
+    # Finally the kernel itself
+    DerivationKernel = CompFactory.DerivationFramework.DerivationKernel
+    acc.addEventAlgo(DerivationKernel(name, AugmentationTools = augmentationTools, ThinningTools = thinningTools, SkimmingTools = skimmingTools))
+    return acc
+
+
+def FTAG3Cfg(flags, skimmingTools=None):
+    acc = ComponentAccumulator()
+    
+    # Get the lists of triggers needed for trigger matching.
+    # This is needed at this scope (for the slimming) and further down in the config chain
+    # for actually configuring the matching, so we create it here and pass it down
+    # TODO: this should ideally be called higher up to avoid it being run multiple times in a train
+    from DerivationFrameworkPhys.TriggerListsHelper import TriggerListsHelper
+    FTAG3TriggerListsHelper = TriggerListsHelper(flags)
+
+    # the name_tag has to consistent between KernelCfg and CoreCfg
+    FTAG3_name_tag = 'FTAG3'
+
+    # Common augmentations
+    acc.merge(FTAG3KernelCfg(flags, name= FTAG3_name_tag + "Kernel", StreamName = 'StreamDAOD_'+FTAG3_name_tag, TriggerListsHelper = FTAG3TriggerListsHelper))
+
+    from DerivationFrameworkFlavourTag.FTAG1 import FTAG1CoreCfg
+
+    extra_SmartCollections = []
+    extra_AllVariables = [ "AntiKt10LCTopoTrimmedPtFrac5SmallR20Jets" ]
+    trigger_option = 'FTAG3'
+    acc.merge(FTAG1CoreCfg(flags, FTAG3_name_tag, extra_SmartCollections, extra_AllVariables, trigger_option))
+
+    return acc
+
+
+def FTAG3TriggerSkimmingToolCfg(flags, skimmingTools=None):
+    """configure the trigger skimming tool"""
+    acc = ComponentAccumulator()
+
+    if skimmingTools is None:
+        skimmingTools = []
+    
+    triggers = [
+            'HLT_j150', 'HLT_j200', 'HLT_j260', 'HLT_j300', 'HLT_j320', 'HLT_j360', 'HLT_j380', 'HLT_j400', 'HLT_j420'
+            ]
+
+    FTAG3TrigSkimmingTool = CompFactory.DerivationFramework.TriggerSkimmingTool( name                   = "FTAG3TrigSkimmingTool1",
+            TriggerListOR          = triggers )
+    acc.addPublicTool(FTAG3TrigSkimmingTool)
+    skimmingTools += [
+            FTAG3TrigSkimmingTool
+            ]
+    return(acc)
+
+
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkFlavourTag/python/FtagBaseContent.py b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkFlavourTag/python/FtagBaseContent.py
index e893105044345ee7531439bb2d036c8c2c1b84ae..4e85ea7405a4169092e045293822c7d9bfb0fc29 100644
--- a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkFlavourTag/python/FtagBaseContent.py
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkFlavourTag/python/FtagBaseContent.py
@@ -75,6 +75,9 @@ def trigger_setup(SlimmingHelper, option=''):
         SlimmingHelper.IncludeEGammaTriggerContent = True
         SlimmingHelper.IncludeBJetTriggerContent = True
         SlimmingHelper.IncludeBPhysTriggerContent = True
+    if option == 'FTAG3':
+        SlimmingHelper.IncludeJetTriggerContent = True
+
 
 def trigger_matching(SlimmingHelper, TriggerListsHelper, ConfigFlags):
     # Trigger matching
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkFlavourTag/python/FtagCommon.py b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkFlavourTag/python/FtagCommon.py
deleted file mode 100644
index 5779cf144a1fba908048cb52c4cb33945a803942..0000000000000000000000000000000000000000
--- a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkFlavourTag/python/FtagCommon.py
+++ /dev/null
@@ -1,51 +0,0 @@
-# Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration
-
-#====================================================================
-# FtagCommon.py
-# This is to define common objects used by PHYSVAL, FTAG1 and FTAG2.
-#====================================================================
-
-from DerivationFrameworkCore.DerivationFrameworkMaster import DerivationFrameworkIsMonteCarlo
-from DerivationFrameworkMCTruth.MCTruthCommon import addTruth3ContentToSlimmerTool
-from DerivationFrameworkEGamma.ElectronsCPDetailedContent import GSFTracksCPDetailedContent
-from DerivationFrameworkFlavourTag import FtagBaseContent
-
-# Import common items used in PHYSVAL, FTAG1 and FTAG2 from FtagBaseContent
-PHYSVAL_FTAG1_FTAG2_mc_AppendToDictionary = FtagBaseContent.PHYSVAL_FTAG1_FTAG2_mc_AppendToDictionary
-PHYSVAL_FTAG1_FTAG2_ExtraVariables = FtagBaseContent.PHYSVAL_FTAG1_FTAG2_ExtraVariables
-PHYSVAL_FTAG1_FTAG2_StaticContent = FtagBaseContent.PHYSVAL_FTAG1_FTAG2_StaticContent
-
-## Common functions used in PHYSVAL, FTAG1 and FTAG2
-def add_static_content_to_SlimmingHelper(SlimmingHelper):
-    SlimmingHelper.StaticContent = PHYSVAL_FTAG1_FTAG2_StaticContent
-
-def add_truth_to_SlimmingHelper(SlimmingHelper):
-    if DerivationFrameworkIsMonteCarlo:
-        SlimmingHelper.AppendToDictionary = PHYSVAL_FTAG1_FTAG2_mc_AppendToDictionary
-        addTruth3ContentToSlimmerTool(SlimmingHelper)
-        SlimmingHelper.AllVariables += ['TruthHFWithDecayParticles','TruthHFWithDecayVertices','TruthCharm']
-
-def add_ExtraVariables_to_SlimmingHelper(SlimmingHelper):
-    SlimmingHelper.ExtraVariables += PHYSVAL_FTAG1_FTAG2_ExtraVariables
-    SlimmingHelper.ExtraVariables += GSFTracksCPDetailedContent
-
-## Common function used in FTAG1 and FTAG2
-def trigger_setup(SlimmingHelper, option=''):
-    SlimmingHelper.IncludeTriggerNavigation = False
-    SlimmingHelper.IncludeJetTriggerContent = False
-    SlimmingHelper.IncludeMuonTriggerContent = False
-    SlimmingHelper.IncludeEGammaTriggerContent = False
-    SlimmingHelper.IncludeJetTauEtMissTriggerContent = False
-    SlimmingHelper.IncludeTauTriggerContent = False
-    SlimmingHelper.IncludeEtMissTriggerContent = False
-    SlimmingHelper.IncludeBJetTriggerContent = False
-    SlimmingHelper.IncludeBPhysTriggerContent = False
-    SlimmingHelper.IncludeMinBiasTriggerContent = False
-    if option == 'FTAG2':
-        SlimmingHelper.IncludeMuonTriggerContent = True
-        SlimmingHelper.IncludeEGammaTriggerContent = True
-        SlimmingHelper.IncludeBJetTriggerContent = True
-        SlimmingHelper.IncludeBPhysTriggerContent = True
-
-
-
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkFlavourTag/share/FTAG1.py b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkFlavourTag/share/FTAG1.py
deleted file mode 100644
index 394089b5d9cf338f8135a927bbe6fd9cf9bbaa99..0000000000000000000000000000000000000000
--- a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkFlavourTag/share/FTAG1.py
+++ /dev/null
@@ -1,111 +0,0 @@
-# Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration
-
-#====================================================================
-# DAOD_FTAG1.py
-# This defines DAOD_FTAG1, an unskimmed DAOD format for Run 3.
-# It contains the variables and objects needed for 
-# ftag algorithm development.
-# It requires the reductionConf flag FTAG1 in Reco_tf.py   
-#====================================================================
-
-from AthenaCommon import Logging
-nanolog = Logging.logging.getLogger('FTAG1')
-
-from DerivationFrameworkCore.DerivationFrameworkMaster import buildFileName, DerivationFrameworkIsMonteCarlo, DerivationFrameworkJob
-from DerivationFrameworkPhys import PhysCommon
-from DerivationFrameworkPhys import PhysCommonTrigger
-from DerivationFrameworkEGamma import ElectronsCPDetailedContent
-from DerivationFrameworkJetEtMiss import METCommon
-from DerivationFrameworkJetEtMiss.METCommon import scheduleMETAssocAlg
-from DerivationFrameworkCore import LHE3WeightMetadata
-from DerivationFrameworkFlavourTag import FtagCommon
-
-import re
-
-
-#====================================================================
-# Set up sequence for this format and add to the top sequence 
-#====================================================================
-FTAG1Seq = CfgMgr.AthSequencer("FTAG1Seq")
-DerivationFrameworkJob += FTAG1Seq
-
-#====================================================================
-# SET UP STREAM   
-#====================================================================
-streamName = derivationFlags.WriteDAOD_FTAG1Stream.StreamName
-fileName   = buildFileName( derivationFlags.WriteDAOD_FTAG1Stream )
-FTAG1Stream = MSMgr.NewPoolRootStream( streamName, fileName )
-FTAG1Stream.AcceptAlgs(["FTAG1Kernel"])
-
-### Thinning and augmentation tools lists
-thinningTools       = []
-AugmentationTools   = []
-
-# Special sequence 
-FTAG1Seq = CfgMgr.AthSequencer("FTAG1Seq")
-
-
-#====================================================================
-# CREATE THE DERIVATION KERNEL ALGORITHM   
-#====================================================================
-# Add the kernel for thinning (requires the objects be defined)
-FTAG1Seq += CfgMgr.DerivationFramework__DerivationKernel("FTAG1Kernel",
-                                                                ThinningTools = thinningTools)
-
-
-#====================================================================
-# CONTENTS   
-#====================================================================
-from DerivationFrameworkCore.SlimmingHelper import SlimmingHelper
-FTAG1SlimmingHelper = SlimmingHelper("FTAG1SlimmingHelper")
-
-FTAG1SlimmingHelper.SmartCollections = ["Electrons",
-                                       "Muons",
-                                       "PrimaryVertices",
-                                       "InDetTrackParticles",
-                                       "AntiKt4EMPFlowJets",
-                                       "BTagging_AntiKt4EMPFlow",
-                                       "AntiKtVR30Rmax4Rmin02PV0TrackJets",
-                                       "BTagging_AntiKtVR30Rmax4Rmin02Track",
-                                       "MET_Baseline_AntiKt4EMPFlow",
-                                      ]
-
-FTAG1SlimmingHelper.AllVariables = [
-                                       "EventInfo",
-                                       "PrimaryVertices",
-                                       "InDetTrackParticles",
-                                       "InDetLargeD0TrackParticles",
-                                       "BTagging_AntiKt4EMPFlow",
-                                       "BTagging_AntiKtVR30Rmax4Rmin02Track",
-                                       "BTagging_AntiKt4EMPFlowJFVtx",
-                                       "BTagging_AntiKt4EMPFlowSecVtx",
-                                       "TruthParticles",
-                                       "TruthVertices",
-                                        "TruthBottom", "TruthElectrons","TruthMuons","TruthTaus",
-                                        ]
-
-from AthenaConfiguration.AllConfigFlags import ConfigFlags as flags
-if flags.BTagging.Pseudotrack:
-    FTAG1SlimmingHelper.AllVariables += [ "InDetPseudoTrackParticles" ]
-
-if flags.BTagging.Trackless:
-    FTAG1SlimmingHelper.AllVariables += [
-                                        "JetAssociatedPixelClusters",
-                                        "JetAssociatedSCTClusters",
-                                        ]
-
-# Static content
-FtagCommon.add_static_content_to_SlimmingHelper(FTAG1SlimmingHelper)
-
-# Trigger content
-FtagCommon.trigger_setup(FTAG1SlimmingHelper)
-
-# Add truth containers
-FtagCommon.add_truth_to_SlimmingHelper(FTAG1SlimmingHelper)
-
-# Add ExtraVariables
-FtagCommon.add_ExtraVariables_to_SlimmingHelper(FTAG1SlimmingHelper)
-
-# Final construction of output stream
-FTAG1SlimmingHelper.AppendContentToStream(FTAG1Stream)
-
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkFlavourTag/share/FTAG2.py b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkFlavourTag/share/FTAG2.py
deleted file mode 100644
index 3a7cd97959b5d16387376c45b9d267df64db37fa..0000000000000000000000000000000000000000
--- a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkFlavourTag/share/FTAG2.py
+++ /dev/null
@@ -1,155 +0,0 @@
-# Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration
-
-#====================================================================
-# DAOD_FTAG2.py
-# This defines DAOD_FTAG2, an unskimmed DAOD format for Run 3.
-# It contains the variables and objects needed for
-# 2-lepton based ftag calibration.
-# It requires the reductionConf flag FTAG2 in Reco_tf.py   
-#====================================================================
-
-from AthenaCommon import Logging
-nanolog = Logging.logging.getLogger('FTAG2')
-
-from DerivationFrameworkCore.DerivationFrameworkMaster import buildFileName, DerivationFrameworkIsMonteCarlo, DerivationFrameworkJob
-from DerivationFrameworkPhys import PhysCommon
-from DerivationFrameworkPhys import PhysCommonTrigger
-from DerivationFrameworkEGamma import ElectronsCPDetailedContent
-from DerivationFrameworkJetEtMiss import METCommon
-from DerivationFrameworkJetEtMiss.METCommon import scheduleMETAssocAlg
-from DerivationFrameworkCore import LHE3WeightMetadata
-from DerivationFrameworkFlavourTag import FtagCommon
-import re
-
-
-#====================================================================
-# Set up sequence for this format and add to the top sequence 
-#====================================================================
-FTAG2Seq = CfgMgr.AthSequencer("FTAG2Seq")
-DerivationFrameworkJob += FTAG2Seq
-
-#====================================================================
-# SET UP STREAM   
-#====================================================================
-streamName = derivationFlags.WriteDAOD_FTAG2Stream.StreamName
-fileName   = buildFileName( derivationFlags.WriteDAOD_FTAG2Stream )
-FTAG2Stream = MSMgr.NewPoolRootStream( streamName, fileName )
-FTAG2Stream.AcceptAlgs(["FTAG2Kernel"])
-
-### Thinning and augmentation tools lists
-thinningTools       = []
-AugmentationTools   = []
-
-# Special sequence 
-FTAG2Seq = CfgMgr.AthSequencer("FTAG2Seq")
-
-#====================================================================
-# SKIMMING TOOLS
-# (SKIMMING = REMOVING WHOLE EVENTS THAT FAIL CRITERIA)
-# Create skimming tool, and create + add kernel to sequence
-#====================================================================
-lepton_skimming_expression = 'count( (Muons.pt > 18*GeV) && (0 == Muons.muonType || 1 == Muons.muonType || 4 == Muons.muonType) ) + count(( Electrons.pt > 18*GeV) && ((Electrons.Loose) || (Electrons.DFCommonElectronsLHLoose))) >= 2 && count( (Muons.pt > 25*GeV) && (0 == Muons.muonType || 1 == Muons.muonType || 4 == Muons.muonType) ) + count(( Electrons.pt > 25*GeV) && ((Electrons.Loose) || (Electrons.DFCommonElectronsLHLoose))) >= 1'
-
-from DerivationFrameworkTools.DerivationFrameworkToolsConf import DerivationFramework__xAODStringSkimmingTool
-FTAG2StringSkimmingTool = DerivationFramework__xAODStringSkimmingTool(name = "FTAG2StringSkimmingTool",
-                                  expression = lepton_skimming_expression 
-                                  )
-
-ToolSvc += FTAG2StringSkimmingTool
-FTAG2Seq += CfgMgr.DerivationFramework__DerivationKernel("FTAG2SkimKernel",
-        SkimmingTools = [FTAG2StringSkimmingTool],
-        )
-
-
-# TrackParticles associated with small-R jets
-track_selection_string = "InDetTrackParticles.numberOfSCTHits + InDetTrackParticles.numberOfPixelHits > 1"
-
-from DerivationFrameworkInDet.DerivationFrameworkInDetConf import DerivationFramework__JetTrackParticleThinning
-FTAG2AktVRJetTPThinningTool = DerivationFramework__JetTrackParticleThinning( name          = "FTAG2AktVRJetTPThinningTool",
-        StreamName              = FTAG2Stream.Name,
-        JetKey                  = "AntiKtVR30Rmax4Rmin02PV0TrackJets",
-        SelectionString         = "AntiKtVR30Rmax4Rmin02PV0TrackJets.pt > 7*GeV",
-        TrackSelectionString    = track_selection_string,
-        InDetTrackParticlesKey  = "InDetTrackParticles",
-        )
-ToolSvc += FTAG2AktVRJetTPThinningTool
-thinningTools.append(FTAG2AktVRJetTPThinningTool)
-
-FTAG2Akt4PFlowJetTPThinningTool = DerivationFramework__JetTrackParticleThinning( name          = "FTAG2Akt4PFlowJetTPThinningTool",
-        StreamName              = FTAG2Stream.Name,
-        JetKey                  = "AntiKt4EMPFlowJets",
-        SelectionString         = "AntiKt4EMPFlowJets.pt > 15*GeV",
-        TrackSelectionString    = track_selection_string,
-        InDetTrackParticlesKey  = "InDetTrackParticles",
-        )
-ToolSvc += FTAG2Akt4PFlowJetTPThinningTool
-thinningTools.append(FTAG2Akt4PFlowJetTPThinningTool)
-
-
-# Include inner detector tracks associated with muons
-from DerivationFrameworkInDet.DerivationFrameworkInDetConf import DerivationFramework__MuonTrackParticleThinning
-FTAG2MuonTPThinningTool = DerivationFramework__MuonTrackParticleThinning(name                    = "FTAG2MuonTPThinningTool",
-        StreamName              = FTAG2Stream.Name,
-        MuonKey                 = "Muons",
-        InDetTrackParticlesKey  = "InDetTrackParticles")
-
-ToolSvc += FTAG2MuonTPThinningTool
-thinningTools.append(FTAG2MuonTPThinningTool)
-
-
-
-#====================================================================
-# CREATE THE DERIVATION KERNEL ALGORITHM   
-#====================================================================
-# Add the kernel for thinning (requires the objects be defined)
-FTAG2Seq += CfgMgr.DerivationFramework__DerivationKernel("FTAG2Kernel",
-        ThinningTools = thinningTools)
-
-
-#====================================================================
-# CONTENTS   
-#====================================================================
-from DerivationFrameworkCore.SlimmingHelper import SlimmingHelper
-FTAG2SlimmingHelper = SlimmingHelper("FTAG2SlimmingHelper")
-
-FTAG2SlimmingHelper.SmartCollections = ["Electrons",
-                                       "Muons",
-                                       "PrimaryVertices",
-                                       "InDetTrackParticles",
-                                       "AntiKt4EMPFlowJets",
-                                       "BTagging_AntiKt4EMPFlow",
-                                       "AntiKtVR30Rmax4Rmin02PV0TrackJets",
-                                       "BTagging_AntiKtVR30Rmax4Rmin02Track",
-                                       "MET_Baseline_AntiKt4EMPFlow",
-                                      ]
-
-FTAG2SlimmingHelper.AllVariables = [   
-                                       "EventInfo",
-                                       "PrimaryVertices",
-                                       "InDetTrackParticles",
-                                       "BTagging_AntiKt4EMPFlow",
-                                       "BTagging_AntiKtVR30Rmax4Rmin02Track",
-                                       "BTagging_AntiKt4EMPFlowJFVtx",
-                                       "BTagging_AntiKt4EMPFlowSecVtx",
-                                       "TruthBottom", "TruthElectrons","TruthMuons","TruthTaus",
-                                       ]
-
-# Static content
-FtagCommon.add_static_content_to_SlimmingHelper(FTAG2SlimmingHelper)
-
-# Trigger content
-FtagCommon.trigger_setup(FTAG2SlimmingHelper,"FTAG2")
-
-# Add truth containers
-FtagCommon.add_truth_to_SlimmingHelper(FTAG2SlimmingHelper)
-
-# Add ExtraVariables
-FtagCommon.add_ExtraVariables_to_SlimmingHelper(FTAG2SlimmingHelper)
-
-# Add trigger matching
-PhysCommonTrigger.trigmatching_helper_notau.add_to_slimming(FTAG2SlimmingHelper)
-PhysCommonTrigger.trigmatching_helper_tau.add_to_slimming(FTAG2SlimmingHelper)
-
-# Final construction of output stream
-FTAG2SlimmingHelper.AppendContentToStream(FTAG2Stream)
-
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkLLP/python/LLPToolsConfig.py b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkLLP/python/LLPToolsConfig.py
index 789f9dc0cffeaa5110ac98eb579a80e0895e9daf..63bfe3a126e4f30f0f1be6bc27408c6778a07171 100644
--- a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkLLP/python/LLPToolsConfig.py
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkLLP/python/LLPToolsConfig.py
@@ -123,42 +123,50 @@ def LRTElectronMergerAlg(ConfigFlags, name="LLP1_ElectronLRTMergingAlg", **kwarg
     return acc
 
 # Electron LLH setup for LLP1
-# because the egamma config does not support setting the conf file
 def LRTElectronLHSelectorsCfg(ConfigFlags):
-    
-    AsgElectronLikelihoodTool = CompFactory.AsgElectronLikelihoodTool
+
     acc = ComponentAccumulator()
 
-    ElectronLHSelectorVeryLooseNoPix = AsgElectronLikelihoodTool(
-        "ElectronLHSelectorVeryLooseNoPix",
-        ConfigFile = "ElectronPhotonSelectorTools/trigger/rel22_20210611/ElectronLikelihoodVeryLooseTriggerConfig_NoPix.conf")
-    ElectronLHSelectorVeryLooseNoPix.primaryVertexContainer = "PrimaryVertices"
-    ElectronLHSelectorVeryLooseNoPix.usePVContainer = ConfigFlags.Tracking.doVertexFinding
-    acc.addPublicTool(ElectronLHSelectorVeryLooseNoPix)
+    from ElectronPhotonSelectorTools.AsgElectronLikelihoodToolsConfig import AsgElectronLikelihoodToolCfg
+    from ElectronPhotonSelectorTools.ElectronLikelihoodToolMapping import electronLHmenu
+    from ROOT import LikeEnum
 
+    lhMenu = electronLHmenu.offlineMC21
+    from AtlasGeoModel.CommonGMJobProperties import CommonGeometryFlags as geoFlags
+    if geoFlags.Run() == "RUN2" :
+        lhMenu = electronLHmenu.offlineMC20
 
-    ElectronLHSelectorLooseNoPix = AsgElectronLikelihoodTool(
-        "ElectronLHSelectorLooseNoPix",
-        ConfigFile = "ElectronPhotonSelectorTools/trigger/rel22_20210611/ElectronLikelihoodLooseTriggerConfig_NoPix.conf")
+    ElectronLHSelectorVeryLooseNoPix = acc.popToolsAndMerge(AsgElectronLikelihoodToolCfg(
+        ConfigFlags,
+        name="ElectronLHSelectorVeryLooseNoPix",
+        quality=LikeEnum.VeryLooseLLP,
+        menu=lhMenu)
+    )
+    ElectronLHSelectorVeryLooseNoPix.primaryVertexContainer = "PrimaryVertices"
+    
+    ElectronLHSelectorLooseNoPix = acc.popToolsAndMerge(AsgElectronLikelihoodToolCfg(
+        ConfigFlags,
+        name="ElectronLHSelectorLooseNoPix",
+        quality=LikeEnum.LooseLLP,
+        menu=lhMenu)
+    )
     ElectronLHSelectorLooseNoPix.primaryVertexContainer = "PrimaryVertices"
-    ElectronLHSelectorLooseNoPix.usePVContainer = ConfigFlags.Tracking.doVertexFinding
-    acc.addPublicTool(ElectronLHSelectorLooseNoPix)
-
 
-    ElectronLHSelectorMediumNoPix = AsgElectronLikelihoodTool(
-        "ElectronLHSelectorMediumNoPix",
-        ConfigFile = "ElectronPhotonSelectorTools/trigger/rel22_20210611/ElectronLikelihoodMediumTriggerConfig_NoPix.conf")
+    ElectronLHSelectorMediumNoPix = acc.popToolsAndMerge(AsgElectronLikelihoodToolCfg(
+        ConfigFlags,
+        name="ElectronLHSelectorMediumNoPix",
+        quality=LikeEnum.MediumLLP,
+        menu=lhMenu)
+    )
     ElectronLHSelectorMediumNoPix.primaryVertexContainer = "PrimaryVertices"
-    ElectronLHSelectorMediumNoPix.usePVContainer = ConfigFlags.Tracking.doVertexFinding
-    acc.addPublicTool(ElectronLHSelectorMediumNoPix)
 
-
-    ElectronLHSelectorTightNoPix = AsgElectronLikelihoodTool(
-        "ElectronLHSelectorTightNoPix",
-        ConfigFile = "ElectronPhotonSelectorTools/trigger/rel22_20210611/ElectronLikelihoodTightTriggerConfig_NoPix.conf")
+    ElectronLHSelectorTightNoPix = acc.popToolsAndMerge(AsgElectronLikelihoodToolCfg(
+        ConfigFlags,
+        name="ElectronLHSelectorTightNoPix",
+        quality=LikeEnum.TightLLP,
+        menu=lhMenu)
+    )
     ElectronLHSelectorTightNoPix.primaryVertexContainer = "PrimaryVertices"
-    ElectronLHSelectorTightNoPix.usePVContainer = ConfigFlags.Tracking.doVertexFinding
-    acc.addPublicTool(ElectronLHSelectorTightNoPix)
 
     from DerivationFrameworkEGamma.EGammaToolsConfig import EGElectronLikelihoodToolWrapperCfg
 
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkPhys/python/PHYS.py b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkPhys/python/PHYS.py
index 90dcb323ada99be2ab22394a2714692ab6b9e929..40b486b188a6af0cfdab65128b316f0ae31e620c 100644
--- a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkPhys/python/PHYS.py
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkPhys/python/PHYS.py
@@ -162,7 +162,7 @@ def PHYSCfg(ConfigFlags):
             msg = logging.getLogger('PHYSCfg')
             msg.warn('doEDMVersionConversion is still in validation, WRITING FULL TRIGGER EDM TO THE DAOD!')
             addTrigEDMSetToOutput(ConfigFlags, PHYSSlimmingHelper, "AODFULL")
-            PHYSSlimmingHelper.AppendToDictionary.update({'HLTNav_R2ToR3Summary':'xAOD::TrigCompositeContainer'})
+            PHYSSlimmingHelper.AppendToDictionary.update({'HLTNav_R2ToR3Summary':'xAOD::TrigCompositeContainer','HLTNav_R2ToR3SummaryAux':'xAOD::TrigCompositeAuxContainer'})
             PHYSSlimmingHelper.AllVariables += ['HLTNav_R2ToR3Summary']
         ##
         #####################################################
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkPhysicsValidation/python/PHYSVAL.py b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkPhysicsValidation/python/PHYSVAL.py
index cdf8c4da2fc58eb4b594970479beda1d7d0e80a5..6b2d7b27cc8a3aff3be085fa5ee0254472e35b21 100644
--- a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkPhysicsValidation/python/PHYSVAL.py
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkPhysicsValidation/python/PHYSVAL.py
@@ -271,6 +271,9 @@ def PHYSVALCfg(ConfigFlags):
                                          OutputContainerPrefix = "TrigMatch_",
                                          TriggerList = PHYSVALTriggerListsHelper.Run3TriggerNamesNoTau)
 
+    # Full trigger content (needed for T0-style monitoring)
+    from DerivationFrameworkTrigger.TrigSlimmingHelper import addTrigEDMSetToOutput
+    addTrigEDMSetToOutput(ConfigFlags, PHYSVALSlimmingHelper, "AODFULL")
 
     # Output stream
     PHYSVALItemList = PHYSVALSlimmingHelper.GetItemList()
diff --git a/PhysicsAnalysis/ElectronPhotonID/ElectronPhotonSelectorTools/ElectronPhotonSelectorTools/LikelihoodEnums.h b/PhysicsAnalysis/ElectronPhotonID/ElectronPhotonSelectorTools/ElectronPhotonSelectorTools/LikelihoodEnums.h
index 6754f13fab89b44c7083a3ab8ef34d6c12cf062e..2dce4c2e1d62a5f72dc9b1f8886af490273b9e67 100644
--- a/PhysicsAnalysis/ElectronPhotonID/ElectronPhotonSelectorTools/ElectronPhotonSelectorTools/LikelihoodEnums.h
+++ b/PhysicsAnalysis/ElectronPhotonID/ElectronPhotonSelectorTools/ElectronPhotonSelectorTools/LikelihoodEnums.h
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
 */
 
 #ifndef _LIKELIHOODENUMS_H
@@ -15,7 +15,11 @@ namespace LikeEnum {
     Tight,
     VeryTight,
     LooseRelaxed,
-    CustomOperatingPoint
+    CustomOperatingPoint,
+    VeryLooseLLP,
+    LooseLLP,
+    MediumLLP,
+    TightLLP
   };
 
    struct ROOT6_NamespaceAutoloadHook{};
diff --git a/PhysicsAnalysis/ElectronPhotonID/ElectronPhotonSelectorTools/Root/EGSelectorConfigurationMapping.h b/PhysicsAnalysis/ElectronPhotonID/ElectronPhotonSelectorTools/Root/EGSelectorConfigurationMapping.h
index 9bc63e5e95b0022e20a0c8edf4a66f874d535e6e..28671965ecbe29a07022c5b9c1533d502cd396a5 100644
--- a/PhysicsAnalysis/ElectronPhotonID/ElectronPhotonSelectorTools/Root/EGSelectorConfigurationMapping.h
+++ b/PhysicsAnalysis/ElectronPhotonID/ElectronPhotonSelectorTools/Root/EGSelectorConfigurationMapping.h
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
 */
 
 #ifndef __EGSelectorConfigurationMapping__
@@ -15,7 +15,7 @@ namespace EgammaSelectors {
 // Note: keep this conf file up to date with the PhotonIsEMTightSelectorConfig
 // function in python/PhotonIsEMTightSelectorCutDefs.py
 
-// This is the internal part , We need to  map string to latest reccomendations
+// This is the internal part , We need to  map string to latest recommendations
 const std::map<std::string, std::string> LHPointToConfFile = {
   { "VeryLooseLHElectron",
     "ElectronPhotonSelectorTools/offline/mc20_20210514/"
@@ -47,6 +47,18 @@ const std::map<std::string, std::string> LHPointToConfFile = {
   { "TightLHElectron_Run2",
     "ElectronPhotonSelectorTools/offline/mc20_20210514/"
     "ElectronLikelihoodTightOfflineConfig2017_Smooth.conf" },
+  { "VeryLooseLHElectron_LLP",
+    "ElectronPhotonSelectorTools/trigger/rel22_20210611/"
+    "ElectronLikelihoodVeryLooseTriggerConfig_NoPix.conf" },
+  { "LooseLHElectron_LLP",
+    "ElectronPhotonSelectorTools/trigger/rel22_20210611/"
+    "ElectronLikelihoodLooseTriggerConfig_NoPix.conf" },
+  { "MediumLHElectron_LLP",
+    "ElectronPhotonSelectorTools/trigger/rel22_20210611/"
+    "ElectronLikelihoodMediumTriggerConfig_NoPix.conf" },
+  { "TightLHElectron_LLP",
+    "ElectronPhotonSelectorTools/trigger/rel22_20210611/"
+    "ElectronLikelihoodTightTriggerConfig_NoPix.conf" },
 };
 const std::map<std::string, std::string> PhotonCutPointToConfFile = {
   { "LoosePhoton",
diff --git a/PhysicsAnalysis/ElectronPhotonID/ElectronPhotonSelectorTools/python/ElectronLikelihoodMenuDefs.py b/PhysicsAnalysis/ElectronPhotonID/ElectronPhotonSelectorTools/python/ElectronLikelihoodMenuDefs.py
index b3b2186fa0755ea5e8112c59b67ad0d701e380c0..6b3a50a1f49aa4b3c69a96cd7cea90fe554f8fa7 100644
--- a/PhysicsAnalysis/ElectronPhotonID/ElectronPhotonSelectorTools/python/ElectronLikelihoodMenuDefs.py
+++ b/PhysicsAnalysis/ElectronPhotonID/ElectronPhotonSelectorTools/python/ElectronLikelihoodMenuDefs.py
@@ -28,6 +28,7 @@ def ElectronLikelihoodTightTriggerConfig2015(theTool):
     '''
     theTool.ConfigFile = "ElectronPhotonSelectorTools/trigger/mc15_20150712/ElectronLikelihoodTightTriggerConfig2015.conf"
 
+# Standard configuration MC20
 def ElectronLikelihoodVeryLooseOfflineConfigMC20(theTool):
     '''
     This is for the custom implementation of the VeryLoose offline likelihood for MC20 / Run2 / Release 22.
@@ -60,7 +61,34 @@ def ElectronLikelihoodTightOfflineConfigMC20(theTool):
     '''
     theTool.ConfigFile = "ElectronPhotonSelectorTools/offline/mc20_20210514/ElectronLikelihoodTightOfflineConfig2017_Smooth.conf"
 
+# LLP Configuration MC20
+def ElectronLikelihoodVeryLooseLLPOfflineConfigMC20(theTool):
+    '''
+    This is for the custom implementation of the VeryLooseLLP offline likelihood for LRT electrons for MC20 / Run2 / Release 22.
+    '''
+    theTool.ConfigFile = "ElectronPhotonSelectorTools/trigger/rel22_20210611/ElectronLikelihoodVeryLooseTriggerConfig_NoPix.conf"
+
+
+def ElectronLikelihoodLooseLLPOfflineConfigMC20(theTool):
+    '''
+    This is for the custom implementation of the LooseLLP offline likelihood for LRT electrons  for MC20 / Run2 / Release 22.
+    '''
+    theTool.ConfigFile = "ElectronPhotonSelectorTools/trigger/rel22_20210611/ElectronLikelihoodLooseTriggerConfig_NoPix.conf"
+
+def ElectronLikelihoodMediumLLPOfflineConfigMC20(theTool):
+    '''
+    This is for the custom implementation of the MediumLLP offline likelihood for LRT electrons  for MC20 / Run2 / Release 22.
+    (NOTE: same signal eff as offline Mediumpp + 1%)
+    '''
+    theTool.ConfigFile = "ElectronPhotonSelectorTools/trigger/rel22_20210611/ElectronLikelihoodMediumTriggerConfig_NoPix.conf"
+
+def ElectronLikelihoodTightLLPOfflineConfigMC20(theTool):
+    '''
+    This is for the custom implementation of the TightLLP offline likelihood for LRT electrons  for MC20 / Run2 / Release 22.
+    '''
+    theTool.ConfigFile = "ElectronPhotonSelectorTools/trigger/rel22_20210611/ElectronLikelihoodTightTriggerConfig_NoPix.conf"
 
+# Standard configuration MC21
 def ElectronLikelihoodVeryLooseOfflineConfigMC21(theTool):
     '''
     This is for the custom implementation of the VeryLoose offline likelihood for MC21 / Run3 / Release 22.
@@ -90,3 +118,28 @@ def ElectronLikelihoodTightOfflineConfigMC21(theTool):
     This is for the custom implementation of the Tight offline likelihood for MC21 / Run3 / Release 22.
     '''
     theTool.ConfigFile = "ElectronPhotonSelectorTools/offline/mc20_20210514/ElectronLikelihoodTightOfflineConfig2017_Smooth.conf"
+
+# LLP Configuration MC21
+def ElectronLikelihoodVeryLooseLLPOfflineConfigMC21(theTool):
+    '''
+    This is for the custom implementation of the VeryLooseLLP offline likelihood for LRT electrons  for MC21 / Run3 / Release 22.
+    '''
+    theTool.ConfigFile = "ElectronPhotonSelectorTools/trigger/rel22_20210611/ElectronLikelihoodVeryLooseTriggerConfig_NoPix.conf"
+
+def ElectronLikelihoodLooseLLPOfflineConfigMC21(theTool):
+    '''
+    This is for the custom implementation of the LooseLLP offline likelihood for LRT electrons  for MC21 / Run3 / Release 22.
+    '''
+    theTool.ConfigFile = "ElectronPhotonSelectorTools/trigger/rel22_20210611/ElectronLikelihoodLooseTriggerConfig_NoPix.conf"
+
+def ElectronLikelihoodMediumLLPOfflineConfigMC21(theTool):
+    '''
+    This is for the custom implementation of the MediumLLP offline likelihood for LRT electrons  for MC21 / Run3 / Release 22.
+    '''
+    theTool.ConfigFile = "ElectronPhotonSelectorTools/trigger/rel22_20210611/ElectronLikelihoodMediumTriggerConfig_NoPix.conf"
+
+def ElectronLikelihoodTightLLPOfflineConfigMC21(theTool):
+    '''
+    This is for the custom implementation of the TightLLP offline likelihood for LRT electrons  for MC21 / Run3 / Release 22.
+    '''
+    theTool.ConfigFile = "ElectronPhotonSelectorTools/trigger/rel22_20210611/ElectronLikelihoodTightTriggerConfig_NoPix.conf"
\ No newline at end of file
diff --git a/PhysicsAnalysis/ElectronPhotonID/ElectronPhotonSelectorTools/python/ElectronLikelihoodToolMapping.py b/PhysicsAnalysis/ElectronPhotonID/ElectronPhotonSelectorTools/python/ElectronLikelihoodToolMapping.py
index 5d2f17408e61af43c45fc5a166ada37f7f27d921..faa093de94112e62b9a9e02fd9e38ae625acc0ab 100644
--- a/PhysicsAnalysis/ElectronPhotonID/ElectronPhotonSelectorTools/python/ElectronLikelihoodToolMapping.py
+++ b/PhysicsAnalysis/ElectronPhotonID/ElectronPhotonSelectorTools/python/ElectronLikelihoodToolMapping.py
@@ -34,6 +34,11 @@ ElectronLHMapOfflineMC20 = {
     LikeEnum.LooseBL: (LikeEnum.CustomOperatingPoint, ElectronLikelihoodMenuDefs.ElectronLikelihoodLooseBLOfflineConfigMC20),
     LikeEnum.Medium: (LikeEnum.CustomOperatingPoint, ElectronLikelihoodMenuDefs.ElectronLikelihoodMediumOfflineConfigMC20),
     LikeEnum.Tight: (LikeEnum.CustomOperatingPoint, ElectronLikelihoodMenuDefs.ElectronLikelihoodTightOfflineConfigMC20),
+
+    LikeEnum.VeryLooseLLP: (LikeEnum.CustomOperatingPoint, ElectronLikelihoodMenuDefs.ElectronLikelihoodVeryLooseLLPOfflineConfigMC20),
+    LikeEnum.LooseLLP: (LikeEnum.CustomOperatingPoint, ElectronLikelihoodMenuDefs.ElectronLikelihoodLooseLLPOfflineConfigMC20),
+    LikeEnum.MediumLLP: (LikeEnum.CustomOperatingPoint, ElectronLikelihoodMenuDefs.ElectronLikelihoodMediumLLPOfflineConfigMC20),
+    LikeEnum.TightLLP: (LikeEnum.CustomOperatingPoint, ElectronLikelihoodMenuDefs.ElectronLikelihoodTightLLPOfflineConfigMC20),
 }
 
 ElectronLHMapOfflineMC21 = {
@@ -42,6 +47,11 @@ ElectronLHMapOfflineMC21 = {
     LikeEnum.LooseBL: (LikeEnum.CustomOperatingPoint, ElectronLikelihoodMenuDefs.ElectronLikelihoodLooseBLOfflineConfigMC21),
     LikeEnum.Medium: (LikeEnum.CustomOperatingPoint, ElectronLikelihoodMenuDefs.ElectronLikelihoodMediumOfflineConfigMC21),
     LikeEnum.Tight: (LikeEnum.CustomOperatingPoint, ElectronLikelihoodMenuDefs.ElectronLikelihoodTightOfflineConfigMC21),
+
+    LikeEnum.VeryLooseLLP: (LikeEnum.CustomOperatingPoint, ElectronLikelihoodMenuDefs.ElectronLikelihoodVeryLooseLLPOfflineConfigMC21),
+    LikeEnum.LooseLLP: (LikeEnum.CustomOperatingPoint, ElectronLikelihoodMenuDefs.ElectronLikelihoodLooseLLPOfflineConfigMC21),
+    LikeEnum.MediumLLP: (LikeEnum.CustomOperatingPoint, ElectronLikelihoodMenuDefs.ElectronLikelihoodMediumLLPOfflineConfigMC21),
+    LikeEnum.TightLLP: (LikeEnum.CustomOperatingPoint, ElectronLikelihoodMenuDefs.ElectronLikelihoodTightLLPOfflineConfigMC21),
 }
 
 def ElectronLikelihoodMap(quality, menu):
diff --git a/PhysicsAnalysis/ElectronPhotonID/LRTElectronAnalysisTools/Root/ElectronLRTOverlapRemovalTool.cxx b/PhysicsAnalysis/ElectronPhotonID/LRTElectronAnalysisTools/Root/ElectronLRTOverlapRemovalTool.cxx
index da65cb459ecc2a8f264fe7d024b5c7d2b8b02808..1b41abc96e5e3db49bcb25901983d631e365eee6 100644
--- a/PhysicsAnalysis/ElectronPhotonID/LRTElectronAnalysisTools/Root/ElectronLRTOverlapRemovalTool.cxx
+++ b/PhysicsAnalysis/ElectronPhotonID/LRTElectronAnalysisTools/Root/ElectronLRTOverlapRemovalTool.cxx
@@ -27,7 +27,7 @@ namespace CP
             if (m_electronLLHToolVeryLooseNoPix.empty())
             {
                 asg::AsgToolConfig config("AsgElectronLikelihoodTool/ElectronLHSelectorVeryLooseNoPix");
-                ATH_CHECK(config.setProperty("ConfigFile", "ElectronPhotonSelectorTools/trigger/rel22_20210611/ElectronLikelihoodVeryLooseTriggerConfig_NoPix.conf"));
+                ATH_CHECK(config.setProperty("WorkingPoint", "VeryLooseLHElectron_LLP"));
                 ATH_CHECK(config.makePrivateTool(m_electronLLHToolVeryLooseNoPix));
             }
 
@@ -37,7 +37,7 @@ namespace CP
             if (m_electronLLHToolLooseNoPix.empty())
             {
                 asg::AsgToolConfig config("AsgElectronLikelihoodTool/ElectronLHSelectorLooseNoPix");
-                ATH_CHECK(config.setProperty("ConfigFile", "ElectronPhotonSelectorTools/trigger/rel22_20210611/ElectronLikelihoodLooseTriggerConfig_NoPix.conf"));
+                ATH_CHECK(config.setProperty("WorkingPoint", "LooseLHElectron_LLP"));
                 ATH_CHECK(config.makePrivateTool(m_electronLLHToolLooseNoPix));
             }
 
@@ -47,7 +47,7 @@ namespace CP
             if (m_electronLLHToolMediumNoPix.empty())
             {
                 asg::AsgToolConfig config("AsgElectronLikelihoodTool/ElectronLHSelectorMediumNoPix");
-                ATH_CHECK(config.setProperty("ConfigFile", "ElectronPhotonSelectorTools/trigger/rel22_20210611/ElectronLikelihoodMediumTriggerConfig_NoPix.conf"));
+                ATH_CHECK(config.setProperty("WorkingPoint", "MediumLHElectron_LLP"));
                 ATH_CHECK(config.makePrivateTool(m_electronLLHToolMediumNoPix));
             }
 
@@ -57,7 +57,7 @@ namespace CP
             if (m_electronLLHToolTightNoPix.empty())
             {
                 asg::AsgToolConfig config("AsgElectronLikelihoodTool/ElectronLHSelectorTightNoPix");
-                ATH_CHECK(config.setProperty("ConfigFile", "ElectronPhotonSelectorTools/trigger/rel22_20210611/ElectronLikelihoodTightTriggerConfig_NoPix.conf"));
+                ATH_CHECK(config.setProperty("WorkingPoint", "TightLHElectron_LLP"));
                 ATH_CHECK(config.makePrivateTool(m_electronLLHToolTightNoPix));
             }
 
diff --git a/PhysicsAnalysis/ElectronPhotonID/PhotonEfficiencyCorrection/PhotonEfficiencyCorrection/AsgPhotonEfficiencyCorrectionTool.h b/PhysicsAnalysis/ElectronPhotonID/PhotonEfficiencyCorrection/PhotonEfficiencyCorrection/AsgPhotonEfficiencyCorrectionTool.h
index a41bbbc94de5e9a8ce2ef10f6ef9f5c813360e6f..c8b46752e4b66d69fbbd266adee85cfe60241fd2 100644
--- a/PhysicsAnalysis/ElectronPhotonID/PhotonEfficiencyCorrection/PhotonEfficiencyCorrection/AsgPhotonEfficiencyCorrectionTool.h
+++ b/PhysicsAnalysis/ElectronPhotonID/PhotonEfficiencyCorrection/PhotonEfficiencyCorrection/AsgPhotonEfficiencyCorrectionTool.h
@@ -21,10 +21,6 @@
 #include <fstream>
 #include <unordered_map>
 
-// Utility includes
-#include "boost/algorithm/string.hpp" // this one to replace std::string names
-
-
 //xAOD includes
 #include "AsgTools/AsgTool.h"
 #include "PATInterfaces/ISystematicsTool.h"
diff --git a/PhysicsAnalysis/JetTagging/JetTagAlgs/BTagging/python/BTagConfig.py b/PhysicsAnalysis/JetTagging/JetTagAlgs/BTagging/python/BTagConfig.py
index 7318628ffb5b9dfafa47539a174618482bfc8efa..bae834baeff0061b5fb55ee6e14393865b2ee020 100644
--- a/PhysicsAnalysis/JetTagging/JetTagAlgs/BTagging/python/BTagConfig.py
+++ b/PhysicsAnalysis/JetTagging/JetTagAlgs/BTagging/python/BTagConfig.py
@@ -46,6 +46,7 @@ def GetTaggerTrainingMap(inputFlags, jet_collection_list):
             "BTagging/20220314/dipsLoose/antikt4empflow/network.json",  # new r22 training
             "BTagging/20220509/dl1dLoose/antikt4empflow/network.json",  # new "recommended tagger" named DL1dv01 in EDM
             "BTagging/20220509/gn1/antikt4empflow/network.onnx",
+            "BTagging/20230306/gn2v00/antikt4empflow/network.onnx",
         ],
         # PFlow jet with custom vertex definition used in HIGG1D1 
         "AntiKt4EMPFlowCustomVtx": [
@@ -58,7 +59,8 @@ def GetTaggerTrainingMap(inputFlags, jet_collection_list):
             "BTagging/20210824r22/dl1r/antikt4empflow/network.json",
             "BTagging/20220314/dipsLoose/antikt4empflow/network.json",  # new r22 training
             "BTagging/20220509/dl1dLoose/antikt4empflow/network.json",  # new "recommended tagger" named DL1dv01 in EDM    
-            "BTagging/20220509/gn1/antikt4empflow/network.onnx"
+            "BTagging/20220509/gn1/antikt4empflow/network.onnx",
+            "BTagging/20230306/gn2v00/antikt4empflow/network.onnx",
         ],
         "AntiKt4EMTopo": [
             "BTagging/201903/rnnip/antikt4empflow/network.json",
@@ -75,14 +77,9 @@ def GetTaggerTrainingMap(inputFlags, jet_collection_list):
         "AntiKtVR30Rmax4Rmin02Track": [
             "BTagging/201903/rnnip/antiktvr30rmax4rmin02track/network.json",
             "BTagging/201903/dl1r/antiktvr30rmax4rmin02track/network.json",
-            "BTagging/20210519r22/dl1r/antikt4empflow/network.json",
-            "BTagging/20210729/dipsLoose/antikt4empflow/network.json",  # old r22 trainings
-            "BTagging/20210729/dips/antikt4empflow/network.json",
-            "BTagging/20210824r22/dl1dLoose/antikt4empflow/network.json",  # “recommended tagger” which is DL1dLoose20210824r22 named DL1dv00 in EDM
-            "BTagging/20210824r22/dl1d/antikt4empflow/network.json",
-            "BTagging/20210824r22/dl1r/antikt4empflow/network.json",
-            "BTagging/20220314/dipsLoose/antikt4empflow/network.json",  # new r22 training
-            "BTagging/20220509/dl1dLoose/antikt4empflow/network.json",  # new "recommended tagger" named DL1dv01 in EDM
+            "BTagging/20230208/dipsLoose/antiktvr30rmax4rmin02track/network.json",  # new r22 training for VR track jets
+            "BTagging/20230307/DL1dv01/antiktvr30rmax4rmin02track/network.json",  # new "recommended tagger" for VR track jets named DL1dv01 in EDM
+            "BTagging/20230307/gn2v00/antiktvr30rmax4rmin02track/network.onnx",
         ],
     }
 
diff --git a/Reconstruction/MuonIdentification/MuonCombinedConfig/python/MuonCombinedReconstructionConfig.py b/Reconstruction/MuonIdentification/MuonCombinedConfig/python/MuonCombinedReconstructionConfig.py
index 5143bfe5a0f9d271e6a59a7aef272e9fb1d7a22c..38bcd6b107cbac52c76c2fb9b4627b6608e00158 100644
--- a/Reconstruction/MuonIdentification/MuonCombinedConfig/python/MuonCombinedReconstructionConfig.py
+++ b/Reconstruction/MuonIdentification/MuonCombinedConfig/python/MuonCombinedReconstructionConfig.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration
+# Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
 
 from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
 from AthenaConfiguration.ComponentFactory import CompFactory
@@ -830,3 +830,5 @@ if __name__ == "__main__":
         if not sc.isSuccess():
             import sys
             sys.exit("Execution failed")
+    else:
+        cfg.wasMerged()
diff --git a/Reconstruction/RecExample/RecExCommon/share/RecExCommon_topOptions.py b/Reconstruction/RecExample/RecExCommon/share/RecExCommon_topOptions.py
index 69f2b99259ec801e90ef07062a85ba38d1c97c03..57c41ae5e2ebb2b846f74d2ae39065eac5569e16 100644
--- a/Reconstruction/RecExample/RecExCommon/share/RecExCommon_topOptions.py
+++ b/Reconstruction/RecExample/RecExCommon/share/RecExCommon_topOptions.py
@@ -496,7 +496,10 @@ if rec.readRDO():
 # Write beamspot information into xAOD::EventInfo.
 #
 if globalflags.InputFormat.is_bytestream() and not athenaCommonFlags.isOnline() and InDetFlags.enableBeamSpotDecoration():
-    topSequence += CfgMgr.xAODMaker__EventInfoBeamSpotDecoratorAlg()
+    from xAODEventInfoCnv.EventInfoBeamSpotDecoratorAlgConfig import EventInfoBeamSpotDecoratorAlgCfg
+    from AthenaConfiguration.ComponentAccumulator import CAtoGlobalWrapper
+    from AthenaConfiguration.AllConfigFlags import ConfigFlags
+    CAtoGlobalWrapper(EventInfoBeamSpotDecoratorAlgCfg, ConfigFlags)
     pass
 
 #
diff --git a/Reconstruction/RecExample/RecJobTransformTests/test/test_data22_13p6TeV_isOnline.sh b/Reconstruction/RecExample/RecJobTransformTests/test/test_data22_13p6TeV_isOnline.sh
deleted file mode 100755
index bbbd9f8373d0823ebb252dbd36e1d6daaad727a4..0000000000000000000000000000000000000000
--- a/Reconstruction/RecExample/RecJobTransformTests/test/test_data22_13p6TeV_isOnline.sh
+++ /dev/null
@@ -1,21 +0,0 @@
-#!/bin/sh
-#
-# art-description: Reco_tf runs on 13TeV collision data 2018 in an isOnline format
-# art-athena-mt: 8
-# art-type: grid
-# art-include: master/Athena
-
-#The input file has to be specified twice because Reco_tf requires such an argument, whilst The RecExOnline job options ignore that and instead uses its own fileName to configure
-#the input file - without that specified the code crashes out complaining that fileName was not specified.
-inputFile="/cvmfs/atlas-nightlies.cern.ch/repo/data/data-art/RecJobTransformTests/data22_13p6TeV/data22_13p6TeV.00430536.physics_Main.daq.RAW/data22_13p6TeV.00430536.physics_Main.daq.RAW._lb1015._SFO-20._0001.data"
-
-preIncludeString="RecExOnline/RecExOnline_globalconfig.py,RecExOnline/RecExOnline_recoflags.py,RecExOnline/RecExOnline_monitoring.py"
-preExecStringOne="isOnline=True;isOnlineStateless=True;isGlobalMonitoring=False;useEmon=False;useAtlantisEmon=False;evtMax=300;from AthenaConfiguration.AllConfigFlags import ConfigFlags;ConfigFlags.Trigger.triggerConfig=\"DB\";fileName=\"${inputFile}\""
-
-Reco_tf.py --inputBSFile="${inputFile}" --preInclude="${preIncludeString}" --preExec="${preExecStringOne}" --postInclude="RecExOnline/RecExOnline_postconfig.py" \
-        --AMI=f1263 --outputESDFile myESD.pool.root --outputAODFile myAOD.pool.root --outputHISTFile myHist.root --conditionsTag="CONDBR2-HLTP-2022-02"
-
-#Remember retval of transform as art result
-RES=$?
-echo "art-result: $RES Reco"
-
diff --git a/Reconstruction/RecExample/RecJobTransformTests/test/test_mc20_rdotobs.sh b/Reconstruction/RecExample/RecJobTransformTests/test/test_mc20_rdotobs.sh
deleted file mode 100755
index 612556d1f4e471865bf168ab8aee7740cb511a2b..0000000000000000000000000000000000000000
--- a/Reconstruction/RecExample/RecJobTransformTests/test/test_mc20_rdotobs.sh
+++ /dev/null
@@ -1,12 +0,0 @@
-#!/bin/sh
-#
-# art-description: RDO to BS on tt mc20
-# art-athena-mt: 4
-# art-type: grid
-# art-include: master/Athena
-
-Reco_tf.py --athenaopts="--threads=8" --inputRDOFile /cvmfs/atlas-nightlies.cern.ch/repo/data/data-art/RecJobTransformTests/mc20_13TeV/mc20_13TeV.410470.PhPy8EG_A14_ttbar_hdamp258p75_nonallhad.digit.RDO.e6337_e5984_s3126_d1708/RDO.26820830._000021.pool.root.1 --outputBSFile mc20_13TeV.410470.PhPy8EG_A14_ttbar_hdamp258p75_nonallhad.data --autoConfiguration everything --maxEvents 300 --conditionsTag=default:OFLCOND-MC16-SDR-RUN2-09 --geometryVersion=default:ATLAS-R2-2016-01-00-01 --runNumber=410470
-
-RES=$?
-echo "art-result: $RES Reco"
-
diff --git a/Reconstruction/RecExample/RecJobTransformTests/test/test_mc18_heavy_ion_withtrigger.sh b/Reconstruction/RecExample/RecJobTransformTests/test/test_mc21_13p6TeV_hi_withtrigger.sh
similarity index 79%
rename from Reconstruction/RecExample/RecJobTransformTests/test/test_mc18_heavy_ion_withtrigger.sh
rename to Reconstruction/RecExample/RecJobTransformTests/test/test_mc21_13p6TeV_hi_withtrigger.sh
index 5e9e52fbe205738eddc29b1fd4923dfec4fa9291..2220614afa6acbf4810908fd9a71a570a6997442 100755
--- a/Reconstruction/RecExample/RecJobTransformTests/test/test_mc18_heavy_ion_withtrigger.sh
+++ b/Reconstruction/RecExample/RecJobTransformTests/test/test_mc21_13p6TeV_hi_withtrigger.sh
@@ -1,6 +1,6 @@
 #!/bin/sh
 #
-# art-description: heavy ion reconstruction test from Sebastian Tapia
+# art-description: heavy ion reconstruction on mc21 using ttbar
 # art-athena-mt: 8
 # art-type: grid
 # art-include: master/Athena
@@ -9,13 +9,13 @@
 export ATHENA_CORE_NUMBER=8
 export TRF_ECHO=True; Reco_tf.py  \
 --multithreaded \
---inputHITSFile=/cvmfs/atlas-nightlies.cern.ch/repo/data/data-art/RecJobTransformTests/mc16_5TeV.420000.Hijing_PbPb_5p02TeV_MinBias_Flow_JJFV6.merge.HITS.e4962_a890_s3136/HITS.17784755._001903.pool.root.1 \
+--inputHITSFile=/cvmfs/atlas-nightlies.cern.ch/repo/data/data-art/RecJobTransformTests/mc21_13p6TeV/HITSFiles/mc21_13p6TeV.601229.PhPy8EG_A14_ttbar_hdamp258p75_SingleLep.simul.HITS.e8453_s3873/HITS.29625927._000632.pool.root.1 \
 --outputESDFile=ESD.pool.root \
 --outputAODFile=AOD.pool.root \
 --maxEvents=20 \
 --steering 'doRDO_TRIG' \
---conditionsTag 'all:OFLCOND-MC16-SDR-RUN2-08' \
---postInclude 'all:RecJobTransforms/UseFrontier.py,SimulationJobOptions/postInclude.HijingPars.py' \
+--conditionsTag 'all:OFLCOND-MC21-SDR-RUN3-07' \
+--postInclude 'all:RecJobTransforms/UseFrontier.py' \
 --postExec  'r2a:y=(StreamAOD.ItemList if "StreamAOD" in dir() else []);y+=["xAOD::CaloClusterAuxContainer#CaloCalTopoClustersAux.SECOND_R.SECOND_LAMBDA.CENTER_MAG.CENTER_LAMBDA.FIRST_ENG_DENS.ENG_FRAC_MAX.ISOLATION.ENG_BAD_CELLS.N_BAD_CELLS.BADLARQ_FRAC.ENG_POS.AVG_LAR_Q.AVG_TILE_Q.EM_PROBABILITY.BadChannelList.CELL_SIGNIFICANCE.CELL_SIG_SAMPLING"];' \
 --preExec  'r2a:from InDetRecExample.InDetJobProperties import InDetFlags;InDetFlags.cutLevel.set_Value_and_Lock(4);jobproperties.Beam.bunchSpacing.set_Value_and_Lock(100);rec.doDPD.set_Value_and_Lock(True);' 'all:from AthenaMonitoring.DQMonFlags import jobproperties; jobproperties.DQMonFlagsCont.doHIMon.set_Value_and_Lock(False);rec.doZdc.set_Value_and_Lock(False);rec.doHeavyIon.set_Value_and_Lock(True);' 'r2t:from AthenaConfiguration.AllConfigFlags import ConfigFlags; ConfigFlags.Trigger.triggerMenuSetup="Dev_HI_run3_v1"; ConfigFlags.Trigger.AODEDMSet = "AODFULL"; ConfigFlags.Trigger.HLTSeeding.forceEnableAllChains=True;' \
 --autoConfiguration 'everything' \
diff --git a/Reconstruction/RecJobTransforms/python/RecoConfigFlags.py b/Reconstruction/RecJobTransforms/python/RecoConfigFlags.py
index 26e86718af10591627c5fa7bd0f5f6aee561fcc3..5a8f212631f7e2db76f3279dbf497ed538fd2df9 100644
--- a/Reconstruction/RecJobTransforms/python/RecoConfigFlags.py
+++ b/Reconstruction/RecJobTransforms/python/RecoConfigFlags.py
@@ -110,7 +110,8 @@ def createRecoConfigFlags():
 
     # Enable alg for decorating EventInfo with BeamSpot info
     # (maybe not always available for calibration runs, etc)
-    flags.addFlag("Reco.EnableBeamSpotDecoration", True)
+    flags.addFlag("Reco.EnableBeamSpotDecoration",
+                  lambda prevFlags: not prevFlags.Common.isOnline)
 
     # Enable common thinning and other post-processing
     flags.addFlag("Reco.EnablePostProcessing", True)
diff --git a/Reconstruction/RecJobTransforms/python/RecoSteering.py b/Reconstruction/RecJobTransforms/python/RecoSteering.py
index d2f224ca9bb04f57fc7a904c645f438145e9518a..785a1dcdc0dc0b060ef830aba9a4b7ce48af7332 100644
--- a/Reconstruction/RecJobTransforms/python/RecoSteering.py
+++ b/Reconstruction/RecJobTransforms/python/RecoSteering.py
@@ -226,18 +226,27 @@ def RecoSteering(flags):
 
     # setup output
     acc.flagPerfmonDomain('IO')
+    from xAODMetaDataCnv.InfileMetaDataConfig import InfileMetaDataCfg
     if flags.Output.doWriteESD:
         # Needed for Trk::Tracks TPCnv
         from TrkEventCnvTools.TrkEventCnvToolsConfigCA import (
             TrkEventCnvSuperToolCfg)
         acc.merge(TrkEventCnvSuperToolCfg(flags))
+        # Needed for MetaData
+        acc.merge(InfileMetaDataCfg(flags, "ESD"))
         log.info("ESD ItemList: %s", acc.getEventAlgo(
             "OutputStreamESD").ItemList)
+        log.info("ESD MetadataItemList: %s", acc.getEventAlgo(
+            "OutputStreamESD").MetadataItemList)
         log.info("---------- Configured ESD writing")
 
     if flags.Output.doWriteAOD:
+        # Needed for MetaData
+        acc.merge(InfileMetaDataCfg(flags, "AOD"))
         log.info("AOD ItemList: %s", acc.getEventAlgo(
             "OutputStreamAOD").ItemList)
+        log.info("AOD MetadataItemList: %s", acc.getEventAlgo(
+            "OutputStreamAOD").MetadataItemList)
         log.info("---------- Configured AOD writing")
 
     # Set up PerfMon
diff --git a/Reconstruction/egamma/EgammaPhysValMonitoring/python/EgammaPhysValMonitoringConfig.py b/Reconstruction/egamma/EgammaPhysValMonitoring/python/EgammaPhysValMonitoringConfig.py
index fd496329e1c299613c67c0519823ee50a14a9e11..34af3f3a8dc58b8ae159665c44862fe3973ddfe8 100644
--- a/Reconstruction/egamma/EgammaPhysValMonitoring/python/EgammaPhysValMonitoringConfig.py
+++ b/Reconstruction/egamma/EgammaPhysValMonitoring/python/EgammaPhysValMonitoringConfig.py
@@ -27,32 +27,51 @@ def EgammaPhysValMonitoringToolCfg(flags, **kwargs):
     if flags.Tracking.doLargeD0:
         kwargs.setdefault("LRTElectronContainerName", "LRTElectrons")
 
+
+    from ElectronPhotonSelectorTools.AsgElectronLikelihoodToolsConfig import AsgElectronLikelihoodToolCfg
+    from ElectronPhotonSelectorTools.ElectronLikelihoodToolMapping import electronLHmenu
+    from ROOT import LikeEnum
+
+    lhMenu = electronLHmenu.offlineMC21
+
     # VeryLooseNoPix
-    ElectronLHSelectorVeryLooseNoPix = CompFactory.AsgElectronLikelihoodTool(
-        "ElectronLHSelectorVeryLooseNoPix",
-        ConfigFile = "ElectronPhotonSelectorTools/trigger/rel22_20210611/ElectronLikelihoodVeryLooseTriggerConfig_NoPix.conf",
-        primaryVertexContainer = "PrimaryVertices")
+    ElectronLHSelectorVeryLooseNoPix = acc.popToolsAndMerge(AsgElectronLikelihoodToolCfg(
+        flags,
+        name="ElectronLHSelectorVeryLooseNoPix",
+        quality=LikeEnum.VeryLooseLLP,
+        menu=lhMenu)
+    )
+    ElectronLHSelectorVeryLooseNoPix.primaryVertexContainer = "PrimaryVertices"
     kwargs.setdefault("ElectronLHSelectorVeryLooseNoPix", ElectronLHSelectorVeryLooseNoPix)
-
+    
     # LooseNoPix
-    ElectronLHSelectorLooseNoPix = CompFactory.AsgElectronLikelihoodTool(
-        "ElectronLHSelectorLooseNoPix",
-        ConfigFile = "ElectronPhotonSelectorTools/trigger/rel22_20210611/ElectronLikelihoodLooseTriggerConfig_NoPix.conf",
-        primaryVertexContainer = "PrimaryVertices")
+    ElectronLHSelectorLooseNoPix = acc.popToolsAndMerge(AsgElectronLikelihoodToolCfg(
+        flags,
+        name="ElectronLHSelectorLooseNoPix",
+        quality=LikeEnum.LooseLLP,
+        menu=lhMenu)
+    )
+    ElectronLHSelectorLooseNoPix.primaryVertexContainer = "PrimaryVertices"
     kwargs.setdefault("ElectronLHSelectorLooseNoPix", ElectronLHSelectorLooseNoPix)
 
     # MediumNoPix
-    ElectronLHSelectorMediumNoPix = CompFactory.AsgElectronLikelihoodTool(
-        "ElectronLHSelectorMediumNoPix",
-        ConfigFile = "ElectronPhotonSelectorTools/trigger/rel22_20210611/ElectronLikelihoodMediumTriggerConfig_NoPix.conf",
-        primaryVertexContainer = "PrimaryVertices")
+    ElectronLHSelectorMediumNoPix = acc.popToolsAndMerge(AsgElectronLikelihoodToolCfg(
+        flags,
+        name="ElectronLHSelectorMediumNoPix",
+        quality=LikeEnum.MediumLLP,
+        menu=lhMenu)
+    )
+    ElectronLHSelectorMediumNoPix.primaryVertexContainer = "PrimaryVertices"
     kwargs.setdefault("ElectronLHSelectorMediumNoPix", ElectronLHSelectorMediumNoPix)
 
     # TightNoPix
-    ElectronLHSelectorTightNoPix = CompFactory.AsgElectronLikelihoodTool(
-        "ElectronLHSelectorTightNoPix",
-        ConfigFile = "ElectronPhotonSelectorTools/trigger/rel22_20210611/ElectronLikelihoodTightTriggerConfig_NoPix.conf",
-        primaryVertexContainer = "PrimaryVertices")
+    ElectronLHSelectorTightNoPix = acc.popToolsAndMerge(AsgElectronLikelihoodToolCfg(
+        flags,
+        name="ElectronLHSelectorTightNoPix",
+        quality=LikeEnum.TightLLP,
+        menu=lhMenu)
+    )
+    ElectronLHSelectorTightNoPix.primaryVertexContainer = "PrimaryVertices"
     kwargs.setdefault("ElectronLHSelectorTightNoPix", ElectronLHSelectorTightNoPix)
 
     acc.setPrivateTools(
diff --git a/Simulation/Digitization/python/DigitizationSteering.py b/Simulation/Digitization/python/DigitizationSteering.py
index 4d827dcf00dff23836f60af194f76b9b0ca1d4eb..d44847688cc5e42b8d9509cab6acf60ad92ef57f 100644
--- a/Simulation/Digitization/python/DigitizationSteering.py
+++ b/Simulation/Digitization/python/DigitizationSteering.py
@@ -189,6 +189,10 @@ def DigitizationMainContentCfg(flags):
         from PerfMonComps.PerfMonCompsConfig import PerfMonMTSvcCfg
         acc.merge(PerfMonMTSvcCfg(flags))
 
+    # Add in-file MetaData
+    from xAODMetaDataCnv.InfileMetaDataConfig import InfileMetaDataCfg
+    acc.merge(InfileMetaDataCfg(flags, "RDO"))
+
     return acc
 
 
diff --git a/Simulation/FastSimulation/FastChainPileup/test/test_MC20a_ATLFAST3F_G4MS_MCOverlay_ttbar_CAvsCG.sh b/Simulation/FastSimulation/FastChainPileup/test/test_MC20a_ATLFAST3F_G4MS_MCOverlay_ttbar_CAvsCG.sh
index f70afcf6eb0fc1661085537fe1f0db63a42d417a..cfc6cd2ccca4bbb9720a9758e653af2defc54625 100755
--- a/Simulation/FastSimulation/FastChainPileup/test/test_MC20a_ATLFAST3F_G4MS_MCOverlay_ttbar_CAvsCG.sh
+++ b/Simulation/FastSimulation/FastChainPileup/test/test_MC20a_ATLFAST3F_G4MS_MCOverlay_ttbar_CAvsCG.sh
@@ -5,7 +5,10 @@
 # art-include: master/Athena
 # art-include: 23.0/Athena
 # art-output: run_*
+# art-output: log.*
+# art-output: *.pkl
 # art-output: *.txt
+# art-output: *DO.pool.root
 # art-output: pkldiff.log
 # art-architecture: '#x86_64-intel'
 
@@ -43,9 +46,17 @@ FastChain_tf.py \
 ca=$?
 echo  "art-result: $ca EVNTtoRDO_CA"
 status=$ca
+# Copy outputs back to main directory
+cp log.EVNTtoRDO ../log.EVNTtoRDO_CA
+cp ${RDO_File} ../CA.${RDO_File}
+capkl=-9999
+if [ -f "ConfigCA.pkl" ]; then
+    capkl=0
+    cp ConfigCA.pkl ../ConfigCA.pkl
+fi
 cd ../
 
-mkdir ./run_cg_pkl; cd run_cg_pkl
+mkdir -p ./run_cg_pkl; cd run_cg_pkl
 FastChain_tf.py \
   --simulator ATLFAST3F_G4MS \
   --steering doFCwOverlay \
@@ -72,6 +83,7 @@ FastChain_tf.py \
 cgpkl=-9999
 if [ -f "ConfigCG.pkl" ]; then
     cgpkl=0
+    cp ConfigCG.pkl ../ConfigCG.pkl
 fi
 echo "art-result: $cgpkl EVNTtoRDO_CG_PKL"
 cd ../
@@ -102,6 +114,8 @@ FastChain_tf.py \
 
 cg=$?
 echo "art-result: $cg EVNTtoRDO_CG"
+cp log.EVNTtoRDOwOverlay ../log.EVNTtoRDO_CG
+cp ${RDO_File} ../${RDO_File}
 if [ $status -eq 0 ]
 then
     status=$cg
@@ -109,7 +123,7 @@ fi
 cd ../
 
 pkldiff=-9999
-if [ $cgpkl -eq 0 ] && [ $ca -eq 0 ]
+if [ $cgpkl -eq 0 ] && [ $capkl -eq 0 ]
 then
    confTool.py --diff --ignoreIrrelevant --shortenDefaultComponents --ignoreDefaults run_cg_pkl/ConfigCG.pkl run_ca/ConfigCA.pkl > pkldiff.log
    pkldiff=$(grep -o 'differ' pkldiff.log | wc -l)
@@ -128,7 +142,7 @@ echo  "art-result: $diff OLDvsCA"
 reg=-9999
 if [ $cg -eq 0 ]
 then
-   art.py compare --file run_cg/${RDO_File} --mode=semi-detailed --entries 10
+   art.py compare --file ${RDO_File} --mode=semi-detailed --entries 10
    reg=$?
    status=$reg
 fi
diff --git a/Simulation/FastSimulation/FastChainPileup/test/test_MC20a_ATLFAST3F_G4MS_pileup_ttbar_CAvsCG.sh b/Simulation/FastSimulation/FastChainPileup/test/test_MC20a_ATLFAST3F_G4MS_pileup_ttbar_CAvsCG.sh
index 2ac567d1c708aa93f06a0cff1c5c733557a9e9fe..aaef737d1d3296b1be98b9d8c26ef3aa9e252730 100755
--- a/Simulation/FastSimulation/FastChainPileup/test/test_MC20a_ATLFAST3F_G4MS_pileup_ttbar_CAvsCG.sh
+++ b/Simulation/FastSimulation/FastChainPileup/test/test_MC20a_ATLFAST3F_G4MS_pileup_ttbar_CAvsCG.sh
@@ -5,7 +5,10 @@
 # art-include: master/Athena
 # art-include: 23.0/Athena
 # art-output: run_*
+# art-output: log.*
+# art-output: *.pkl
 # art-output: *.txt
+# art-output: *DO.pool.root
 # art-output: pkldiff.log
 # art-architecture: '#x86_64-intel'
 
@@ -43,12 +46,19 @@ FastChain_tf.py \
     --imf False
 
 ca=$?
-echo  "art-result: $rc EVNTtoRDO_CA"
+echo  "art-result: $ca EVNTtoRDO_CA"
 status=$ca
+cp log.EVNTtoRDO ../log.EVNTtoRDO_CA
+cp ${RDO_File} ../CA.${RDO_File}
+capkl=-9999
+if [ -f "ConfigCA.pkl" ]; then
+    capkl=0
+    cp ConfigCA.pkl ../ConfigCA.pkl
+fi
 cd ../
 
 
-mkdir ./run_cg_pkl; cd run_cg_pkl
+mkdir -p ./run_cg_pkl; cd run_cg_pkl
 FastChain_tf.py \
     --simulator 'ATLFAST3F_G4MS' \
     --physicsList 'FTFP_BERT_ATL' \
@@ -76,6 +86,7 @@ FastChain_tf.py \
 cgpkl=-9999
 if [ -f "ConfigCG.pkl" ]; then
     cgpkl=0
+    cp ConfigCG.pkl ../ConfigCG.pkl
 fi
 echo "art-result: $cgpkl EVNTtoRDO_CG_PKL"
 cd ../
@@ -105,6 +116,8 @@ FastChain_tf.py \
     --imf False
 
 cg=$?
+cp log.EVNTtoRDO ../log.EVNTtoRDO_CG
+cp ${RDO_File} ../${RDO_File}
 echo "art-result: $cg EVNTtoRDO_CG"
 if [ $status -eq 0 ]
 then
@@ -113,7 +126,7 @@ fi
 cd ../
 
 pkldiff=-9999
-if [ $cgpkl -eq 0 ] && [ $ca -eq 0 ]
+if [ $cgpkl -eq 0 ] && [ $capkl -eq 0 ]
 then
    confTool.py --diff --ignoreIrrelevant --shortenDefaultComponents --ignoreDefaults "run_cg_pkl/ConfigCG.pkl" "run_ca/ConfigCA.pkl" > pkldiff.log
    pkldiff=$(grep -o 'differ' pkldiff.log | wc -l)
@@ -132,7 +145,7 @@ echo  "art-result: $diff OLDvsCA"
 reg=-9999
 if [ $cg -eq 0 ]
 then
-   art.py compare --file run_cg/${RDO_File} --mode=semi-detailed --entries 10
+   art.py compare --file ${RDO_File} --mode=semi-detailed --entries 10
    reg=$?
    status=$reg
 fi
diff --git a/Simulation/FastSimulation/FastChainPileup/test/test_MC21a_ATLFAST3F_G4MS_MCOverlay_ttbar_CAvsCG.sh b/Simulation/FastSimulation/FastChainPileup/test/test_MC21a_ATLFAST3F_G4MS_MCOverlay_ttbar_CAvsCG.sh
index c39da1c0f4e775e85d9a33eec5e2cf03a7a140d1..60b1e63b02d8c2802c4e5514025399ce1111b24f 100755
--- a/Simulation/FastSimulation/FastChainPileup/test/test_MC21a_ATLFAST3F_G4MS_MCOverlay_ttbar_CAvsCG.sh
+++ b/Simulation/FastSimulation/FastChainPileup/test/test_MC21a_ATLFAST3F_G4MS_MCOverlay_ttbar_CAvsCG.sh
@@ -5,7 +5,10 @@
 # art-include: master/Athena
 # art-include: 23.0/Athena
 # art-output: run_*
+# art-output: log.*
+# art-output: *.pkl
 # art-output: *.txt
+# art-output: *DO.pool.root
 # art-output: pkldiff.log
 # art-architecture: '#x86_64-intel'
 
@@ -42,9 +45,16 @@ FastChain_tf.py \
 ca=$?
 echo  "art-result: $ca EVNTtoRDO_CA"
 status=$ca
+cp log.EVNTtoRDO ../log.EVNTtoRDO_CA
+cp ${RDO_File} ../CA.${RDO_File}
+capkl=-9999
+if [ -f "ConfigCA.pkl" ]; then
+    capkl=0
+    cp ConfigCA.pkl ../ConfigCA.pkl
+fi
 cd ../
 
-mkdir ./run_cg_pkl; cd run_cg_pkl
+mkdir --p ./run_cg_pkl; cd run_cg_pkl
 FastChain_tf.py \
   --runNumber 601229 \
   --simulator ATLFAST3F_G4MS \
@@ -72,6 +82,7 @@ FastChain_tf.py \
 cgpkl=-9999
 if [ -f "ConfigCG.pkl" ]; then
     cgpkl=0
+    cp ConfigCG.pkl ../ConfigCG.pkl
 fi
 echo "art-result: $cgpkl EVNTtoRDO_CG_PKL"
 cd ../
@@ -102,6 +113,8 @@ FastChain_tf.py \
   --ignoreErrors True
 
 cg=$?
+cp log.EVNTtoRDOwOverlay ../log.EVNTtoRDO_CG
+cp ${RDO_File} ../${RDO_File}
 echo "art-result: $cg EVNTtoRDO_CG"
 if [ $status -eq 0 ]
 then
@@ -110,7 +123,7 @@ fi
 cd ../
 
 pkldiff=-9999
-if [ $cgpkl -eq 0 ] && [ $ca -eq 0 ]
+if [ $cgpkl -eq 0 ] && [ $capkl -eq 0 ]
 then
    confTool.py --diff --ignoreIrrelevant --shortenDefaultComponents --ignoreDefaults run_cg_pkl/ConfigCG.pkl run_ca/ConfigCA.pkl > pkldiff.log
    pkldiff=$(grep -o 'differ' pkldiff.log | wc -l)
@@ -129,7 +142,7 @@ echo  "art-result: $diff OLDvsCA"
 reg=-9999
 if [ $cg -eq 0 ]
 then
-   art.py compare --file run_cg/${RDO_File} --mode=semi-detailed --entries 10
+   art.py compare --file ${RDO_File} --mode=semi-detailed --entries 10
    reg=$?
    status=$reg
 fi
diff --git a/Simulation/FastSimulation/FastChainPileup/test/test_MC21a_ATLFAST3F_G4MS_TrackOverlay_ttbar_CA.sh b/Simulation/FastSimulation/FastChainPileup/test/test_MC21a_ATLFAST3F_G4MS_TrackOverlay_ttbar_CA.sh
index e804b3b5ca19f3eae975fd5313c440ab380c3a57..6f5311610ddaedafe1a7cf559b7f4665595c7365 100755
--- a/Simulation/FastSimulation/FastChainPileup/test/test_MC21a_ATLFAST3F_G4MS_TrackOverlay_ttbar_CA.sh
+++ b/Simulation/FastSimulation/FastChainPileup/test/test_MC21a_ATLFAST3F_G4MS_TrackOverlay_ttbar_CA.sh
@@ -5,7 +5,10 @@
 # art-include: master/Athena
 # art-include: 23.0/Athena
 # art-output: run_*
+# art-output: log.*
+# art-output: *.pkl
 # art-output: *.txt
+# art-output: RDO.pool.root
 # art-architecture: '#x86_64-intel'
 
 events=50
@@ -40,13 +43,18 @@ FastChain_tf.py \
   --imf False
 ca=$?
 echo  "art-result: $ca EVNTtoRDO_CA"
+cp log.* ../
+cp ${RDO_File} ../${RDO_File}
+if [ -f "ConfigCA.pkl" ]; then
+    cp ConfigCA.pkl ../ConfigCA.pkl
+fi
 status=$ca
 cd ../
 
 reg=-9999
 if [ $ca -eq 0 ]
 then
-   art.py compare --file run_ca/${RDO_File} --mode=semi-detailed --entries 10
+   art.py compare --file ${RDO_File} --mode=semi-detailed --entries 10
    reg=$?
    status=$reg
 fi
diff --git a/Simulation/FastSimulation/FastChainPileup/test/test_MC21a_ATLFAST3F_G4MS_pileup_ttbar_CAvsCG.sh b/Simulation/FastSimulation/FastChainPileup/test/test_MC21a_ATLFAST3F_G4MS_pileup_ttbar_CAvsCG.sh
index 6c4c9ae2e79e78ee9ae0e351b4dbfb32b2088d00..23e951357d05481691b875dc56a8716a4fdbc97c 100755
--- a/Simulation/FastSimulation/FastChainPileup/test/test_MC21a_ATLFAST3F_G4MS_pileup_ttbar_CAvsCG.sh
+++ b/Simulation/FastSimulation/FastChainPileup/test/test_MC21a_ATLFAST3F_G4MS_pileup_ttbar_CAvsCG.sh
@@ -5,7 +5,10 @@
 # art-include: master/Athena
 # art-include: 23.0/Athena
 # art-output: run_*
+# art-output: log.*
+# art-output: *.pkl
 # art-output: *.txt
+# art-output: *DO.pool.root
 # art-output: pkldiff.log
 # art-architecture: '#x86_64-intel'
 
@@ -44,12 +47,19 @@ FastChain_tf.py \
     --imf False
 
 ca=$?
-echo  "art-result: $rc EVNTtoRDO_CA"
+echo  "art-result: $ca EVNTtoRDO_CA"
 status=$ca
+cp log.EVNTtoRDO ../log.EVNTtoRDO_CA
+cp ${RDO_File} ../CA.${RDO_File}
+capkl=-9999
+if [ -f "ConfigCA.pkl" ]; then
+    capkl=0
+    cp ConfigCA.pkl ../ConfigCA.pkl
+fi
 cd ../
 
 
-mkdir ./run_cg_pkl; cd run_cg_pkl
+mkdir -p ./run_cg_pkl; cd run_cg_pkl
 FastChain_tf.py \
     --runNumber 601229 \
     --simulator 'ATLFAST3F_G4MS' \
@@ -79,6 +89,7 @@ FastChain_tf.py \
 cgpkl=-9999
 if [ -f "ConfigCG.pkl" ]; then
     cgpkl=0
+    cp ConfigCG.pkl ../ConfigCG.pkl
 fi
 echo "art-result: $cgpkl EVNTtoRDO_CG_PKL"
 cd ../
@@ -103,12 +114,14 @@ FastChain_tf.py \
     --digiSeedOffset2 '727' \
     --geometryVersion default:ATLAS-R3S-2021-03-00-00 \
     --conditionsTag default:OFLCOND-MC21-SDR-RUN3-07 \
-    --preInclude 'all:Campaigns/MC21a.py,Campaigns/PileUpMC21a.py' \
+    --preInclude 'all:Campaigns/MC21a.py,Campaigns/PileUpMC21a.py,Campaigns/MC21SimulationNoIoV.py' \
     --postInclude='PyJobTransforms/UseFrontier.py' \
     --postExec 'from AthenaCommon.ConfigurationShelve import saveToAscii;saveToAscii("LegacyConfig.txt")' \
     --imf False
 
 cg=$?
+cp log.EVNTtoRDO ../log.EVNTtoRDO_CG
+cp ${RDO_File} ../${RDO_File}
 echo "art-result: $cg EVNTtoRDO_CG"
 if [ $status -eq 0 ]
 then
@@ -117,7 +130,7 @@ fi
 cd ../
 
 pkldiff=-9999
-if [ $cgpkl -eq 0 ] && [ $ca -eq 0 ]
+if [ $cgpkl -eq 0 ] && [ $capkl -eq 0 ]
 then
    confTool.py --diff --ignoreIrrelevant --shortenDefaultComponents --ignoreDefaults "run_cg_pkl/ConfigCG.pkl" "run_ca/ConfigCA.pkl" > pkldiff.log
    pkldiff=$(grep -o 'differ' pkldiff.log | wc -l)
@@ -136,7 +149,7 @@ echo  "art-result: $diff OLDvsCA"
 reg=-9999
 if [ $cg -eq 0 ]
 then
-   art.py compare --file run_cg/${RDO_File} --mode=semi-detailed --entries 10
+   art.py compare --file ${RDO_File} --mode=semi-detailed --entries 10
    reg=$?
    status=$reg
 fi
diff --git a/Simulation/FastSimulation/FastChainPileup/test/test_MC21a_ATLFAST3MT_MCOverlay_ttbar_CAvsCG.sh b/Simulation/FastSimulation/FastChainPileup/test/test_MC21a_ATLFAST3MT_MCOverlay_ttbar_CAvsCG.sh
index ac0e41597d8d4d644df11344deb541fa2d8107d8..5bef241075178d00b8a1ada202ecc0b84da52cc2 100755
--- a/Simulation/FastSimulation/FastChainPileup/test/test_MC21a_ATLFAST3MT_MCOverlay_ttbar_CAvsCG.sh
+++ b/Simulation/FastSimulation/FastChainPileup/test/test_MC21a_ATLFAST3MT_MCOverlay_ttbar_CAvsCG.sh
@@ -5,7 +5,10 @@
 # art-include: master/Athena
 # art-include: 23.0/Athena
 # art-output: run_*
+# art-output: log.*
+# art-output: *.pkl
 # art-output: *.txt
+# art-output: *DO.pool.root
 # art-output: pkldiff.log
 # art-architecture: '#x86_64-intel'
 
@@ -42,9 +45,16 @@ FastChain_tf.py \
 ca=$?
 echo  "art-result: $ca EVNTtoRDO_CA"
 status=$ca
+cp log.EVNTtoRDO ../log.EVNTtoRDO_CA
+cp ${RDO_File} ../CA.${RDO_File}
+capkl=-9999
+if [ -f "ConfigCA.pkl" ]; then
+    capkl=0
+    cp ConfigCA.pkl ../ConfigCA.pkl
+fi
 cd ../
 
-mkdir ./run_cg_pkl; cd run_cg_pkl
+mkdir -p ./run_cg_pkl; cd run_cg_pkl
 FastChain_tf.py \
   --runNumber 601229 \
   --simulator ATLFAST3MT \
@@ -72,6 +82,7 @@ FastChain_tf.py \
 cgpkl=-9999
 if [ -f "ConfigCG.pkl" ]; then
     cgpkl=0
+    cp ConfigCG.pkl ../ConfigCG.pkl
 fi
 echo "art-result: $cgpkl EVNTtoRDO_CG_PKL"
 cd ../
@@ -101,6 +112,8 @@ FastChain_tf.py \
   --ignoreErrors True
 
 cg=$?
+cp log.EVNTtoRDOwOverlay ../log.EVNTtoRDO_CG
+cp ${RDO_File} ../${RDO_File}
 echo "art-result: $cg EVNTtoRDO_CG"
 if [ $status -eq 0 ]
 then
@@ -109,7 +122,7 @@ fi
 cd ../
 
 pkldiff=-9999
-if [ $cgpkl -eq 0 ] && [ $ca -eq 0 ]
+if [ $cgpkl -eq 0 ] && [ $capkl -eq 0 ]
 then
    confTool.py --diff --ignoreIrrelevant --shortenDefaultComponents --ignoreDefaults run_cg_pkl/ConfigCG.pkl run_ca/ConfigCA.pkl > pkldiff.log
    pkldiff=$(grep -o 'differ' pkldiff.log | wc -l)
@@ -128,7 +141,7 @@ echo  "art-result: $diff OLDvsCA"
 reg=-9999
 if [ $cg -eq 0 ]
 then
-   art.py compare --file run_cg/${RDO_File} --mode=semi-detailed --entries 10
+   art.py compare --file ${RDO_File} --mode=semi-detailed --entries 10
    reg=$?
    status=$reg
 fi
diff --git a/Simulation/FastSimulation/FastChainPileup/test/test_MC21a_TrackOverlay_ttbar_CA.sh b/Simulation/FastSimulation/FastChainPileup/test/test_MC21a_TrackOverlay_ttbar_CA.sh
index 8a20d566971323ab858358faa60d8e90d90967ef..1b19bcff2644c1823343212959756e94a1f58121 100755
--- a/Simulation/FastSimulation/FastChainPileup/test/test_MC21a_TrackOverlay_ttbar_CA.sh
+++ b/Simulation/FastSimulation/FastChainPileup/test/test_MC21a_TrackOverlay_ttbar_CA.sh
@@ -5,7 +5,10 @@
 # art-include: master/Athena
 # art-include: 23.0/Athena
 # art-output: run_*
+# art-output: log.*
+# art-output: *.pkl
 # art-output: *.txt
+# art-output: RDO.pool.root
 # art-architecture: '#x86_64-intel'
 
 events=50
@@ -34,13 +37,20 @@ Overlay_tf.py \
   --imf False
 ca=$?
 echo  "art-result: $ca HITStoRDO_CA"
+# Copy outputs back to main directory
+cp ${RDO_File} ../${RDO_File}
+cp log.* ../
+cp *.txt ../
 status=$ca
+if [ -f "ConfigCA.pkl" ]; then
+    cp ConfigCA.pkl ../ConfigCA.pkl
+fi
 cd ../
 
 reg=-9999
 if [ $ca -eq 0 ]
 then
-   art.py compare --file run_ca/${RDO_File} --mode=semi-detailed --entries 10
+   art.py compare --file ${RDO_File} --mode=semi-detailed --entries 10
    reg=$?
    status=$reg
 fi
diff --git a/Simulation/G4Atlas/G4AtlasTools/src/VoxelDensityTool.cxx b/Simulation/G4Atlas/G4AtlasTools/src/VoxelDensityTool.cxx
index 33586accb5396ae5e2fa45f2629fe1a477c8e3e2..0b557438a57ae9c9d020b506d8c80350c0178830 100644
--- a/Simulation/G4Atlas/G4AtlasTools/src/VoxelDensityTool.cxx
+++ b/Simulation/G4Atlas/G4AtlasTools/src/VoxelDensityTool.cxx
@@ -6,6 +6,7 @@
 #include "VoxelDensityTool.h"
 
 // Geant4 includes
+#include "G4Version.hh"
 #include "G4LogicalVolumeStore.hh"
 
 //=============================================================================
@@ -50,7 +51,11 @@ StatusCode VoxelDensityTool::postGeometryConfigure() const
 
     //Now for any volumes set via job property std::pair<volume name, value>...
     for (auto& volToSet:m_volumeVoxelDensityLevel) {
+#if G4VERSION_NUMBER < 1100
       if (ilv->GetName().contains(volToSet.first)) {
+#else
+      if (G4StrUtil::contains(ilv->GetName(), std::string_view(volToSet.first))) {
+#endif
         ilv->SetSmartless(volToSet.second);
         ATH_MSG_INFO("Set VoxelDensity for "<<ilv->GetName()<<" to "<<volToSet.second);
       }
diff --git a/Simulation/G4Extensions/Monopole/src/G4mplAtlasIonisation.cxx b/Simulation/G4Extensions/Monopole/src/G4mplAtlasIonisation.cxx
index 114790b37134c6c6d273cd56515797e3b81da797..52e84d813bb5c011a609260aef3bc2db892fa078 100644
--- a/Simulation/G4Extensions/Monopole/src/G4mplAtlasIonisation.cxx
+++ b/Simulation/G4Extensions/Monopole/src/G4mplAtlasIonisation.cxx
@@ -50,7 +50,12 @@
 // package headers
 #include "G4mplAtlasIonisationWithDeltaModel.hh"
 // Geant4 headers
+#include "G4Version.hh"
+
+#if G4VERSION_NUMBER < 1100
 #include "G4BohrFluctuations.hh"
+#endif
+
 #include "G4Electron.hh"
 #include "G4EmProcessSubType.hh"
 #include "G4Version.hh"
diff --git a/Simulation/G4Extensions/Monopole/src/G4mplAtlasIonisation.hh b/Simulation/G4Extensions/Monopole/src/G4mplAtlasIonisation.hh
index 6fa3170556f2059928a2a2fdc7dc1141cd3b21f8..741edaeac28ce877f5a3e61f868ed7f5a3313c88 100644
--- a/Simulation/G4Extensions/Monopole/src/G4mplAtlasIonisation.hh
+++ b/Simulation/G4Extensions/Monopole/src/G4mplAtlasIonisation.hh
@@ -55,6 +55,7 @@
 #ifndef MONOPOLE_G4mplAtlasIonisation_h
 #define MONOPOLE_G4mplAtlasIonisation_h 1
 
+#include "G4Version.hh"
 #include "G4VEnergyLossProcess.hh"
 #include "globals.hh"
 #include "G4VEmModel.hh"
@@ -104,12 +105,15 @@ private:
 inline G4bool G4mplAtlasIonisation::IsApplicable(const G4ParticleDefinition& p)
 {
   G4String lowPartName = p.GetParticleName();
+#if G4VERSION_NUMBER < 1100
   lowPartName.toLower();
-  //  G4String lowPartName = (p.GetParticleName()).toLower();
-
-  //  return ((p.GetParticleName() == "monopole") || (p.GetParticleName() == "monopolebar"));
   return  ( (lowPartName.contains("monopole")) ||
             (lowPartName.contains("dyon")) );
+#else
+  G4StrUtil::to_lower(lowPartName);
+  return ( (G4StrUtil::contains(lowPartName, "monopole")) ||
+           (G4StrUtil::contains(lowPartName, "dyon")) );
+#endif
 }
 
 
diff --git a/Simulation/G4Extensions/Monopole/src/G4mplAtlasIonisationModel.cxx b/Simulation/G4Extensions/Monopole/src/G4mplAtlasIonisationModel.cxx
index 68127ff6a8e9364ce686a7fa65dadf7e5503d1ee..c742e3f6e9482edc1cbc67a17d33a2ca78d52301 100644
--- a/Simulation/G4Extensions/Monopole/src/G4mplAtlasIonisationModel.cxx
+++ b/Simulation/G4Extensions/Monopole/src/G4mplAtlasIonisationModel.cxx
@@ -177,25 +177,26 @@ G4double G4mplAtlasIonisationModel::ComputeDEDXPerVolume(const G4Material* mater
 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
 
 G4double G4mplAtlasIonisationModel::SampleFluctuations(
-#if G4VERSION_NUMBER > 1009
+#if G4VERSION_NUMBER < 1100
                                                        const G4MaterialCutsCouple* material,
                                                        const G4DynamicParticle* dp,
                                                        G4double tmax,
                                                        G4double length,
-                                                       G4double meanLoss
+                                                       G4double meanLoss)
 #else
-                                                       const G4Material* material,
+                                                       const G4MaterialCutsCouple* material,
                                                        const G4DynamicParticle* dp,
-                                                       G4double& tmax,
-                                                       G4double& length,
-                                                       G4double& meanLoss
+                                                       const G4double tcut,
+                                                       const G4double tmax,
+                                                       const G4double length,
+                                                       const G4double meanLoss)
+
 #endif
-                                                       )
 {
-#if G4VERSION_NUMBER > 1009
+#if G4VERSION_NUMBER < 1100
   G4double siga = Dispersion(material->GetMaterial(),dp,tmax,length);
 #else
-  G4double siga = Dispersion(material,dp,tmax,length);
+  G4double siga = Dispersion(material->GetMaterial(),dp,tcut,tmax,length);
 #endif
   G4double loss = meanLoss;
   siga = sqrt(siga);
diff --git a/Simulation/G4Extensions/Monopole/src/G4mplAtlasIonisationModel.hh b/Simulation/G4Extensions/Monopole/src/G4mplAtlasIonisationModel.hh
index 7f8f088a1f84eedf78cdf228fb0e9559f504a967..b3dd2c3c2c799403b99fc3e860d22afed10b7f10 100644
--- a/Simulation/G4Extensions/Monopole/src/G4mplAtlasIonisationModel.hh
+++ b/Simulation/G4Extensions/Monopole/src/G4mplAtlasIonisationModel.hh
@@ -50,6 +50,7 @@
 #ifndef MONOPOLE_G4mplAtlasIonisationModel_h
 #define MONOPOLE_G4mplAtlasIonisationModel_h 1
 
+#include "G4Version.hh"
 #include "G4VEmModel.hh"
 #include "G4VEmFluctuationModel.hh"
 #include "G4Version.hh"
@@ -80,6 +81,7 @@ public:
                                       G4double maxEnergy) override final;
 
 
+#if G4VERSION_NUMBER < 1100
   virtual G4double SampleFluctuations(const G4MaterialCutsCouple* material,
                                       const G4DynamicParticle* dp,
                                       G4double tmax,
@@ -90,6 +92,20 @@ public:
                                       const G4DynamicParticle*,
                                       G4double tmax,
                                       G4double length) override final;
+#else
+  virtual G4double SampleFluctuations(const G4MaterialCutsCouple* material,
+                                      const G4DynamicParticle* dp,
+                                      const G4double tcut,
+                                      const G4double tmax,
+                                      const G4double length,
+                                      const G4double meanLoss) override final;
+
+  virtual G4double Dispersion(        const G4Material*,
+                                      const G4DynamicParticle*,
+                                      const G4double tcut,
+                                      const G4double tmax,
+                                      const G4double length) override final;
+#endif 
 
   // hide assignment operator and copy constructor
   G4mplAtlasIonisationModel & operator=(const  G4mplAtlasIonisationModel &right) = delete;
@@ -126,10 +142,18 @@ inline void G4mplAtlasIonisationModel::SampleSecondaries(
 {;}
 
 inline G4double G4mplAtlasIonisationModel::Dispersion(
+#if G4VERSION_NUMBER < 1100
                                                       const G4Material* material,
                                                       const G4DynamicParticle* dp,
                                                       G4double tmax,
                                                       G4double length)
+#else
+                                                      const G4Material* material,
+                                                      const G4DynamicParticle* dp,
+                                                      const G4double /*tcut*/,
+                                                      const G4double tmax,
+                                                      const G4double length)
+#endif
 {
   G4double siga = 0.0;
   G4double tau   = dp->GetKineticEnergy()/mass;
diff --git a/Simulation/G4Extensions/Monopole/src/G4mplAtlasIonisationWithDeltaModel.cxx b/Simulation/G4Extensions/Monopole/src/G4mplAtlasIonisationWithDeltaModel.cxx
index 93accaeedfacbb0d751a492d11000ff21ede7fd9..d7e727f3f3f3046ec123eec2ae97dad787121087 100644
--- a/Simulation/G4Extensions/Monopole/src/G4mplAtlasIonisationWithDeltaModel.cxx
+++ b/Simulation/G4Extensions/Monopole/src/G4mplAtlasIonisationWithDeltaModel.cxx
@@ -290,25 +290,26 @@ G4mplAtlasIonisationWithDeltaModel::SampleSecondaries(std::vector<G4DynamicParti
 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
 
 G4double G4mplAtlasIonisationWithDeltaModel::SampleFluctuations(
-#if G4VERSION_NUMBER > 1009
+#if G4VERSION_NUMBER < 1100
                                                                 const G4MaterialCutsCouple* material,
                                                                 const G4DynamicParticle* dp,
                                                                 G4double tmax,
                                                                 G4double length,
                                                                 G4double meanLoss
 #else
-                                                                const G4Material* material,
+                                                                const G4MaterialCutsCouple* material,
                                                                 const G4DynamicParticle* dp,
-                                                                G4double& tmax,
-                                                                G4double& length,
-                                                                G4double& meanLoss
+                                                                const G4double tcut,
+                                                                const G4double tmax,
+                                                                const G4double length,
+                                                                const G4double meanLoss
 #endif
                                                                 )
 {
-#if G4VERSION_NUMBER > 1009
+#if G4VERSION_NUMBER < 1100
   G4double siga = Dispersion(material->GetMaterial(),dp,tmax,length);
 #else
-  G4double siga = Dispersion(material,dp,tmax,length);
+  G4double siga = Dispersion(material->GetMaterial(),dp,tcut,tmax,length);
 #endif
   G4double loss = meanLoss;
   siga = std::sqrt(siga);
@@ -333,12 +334,13 @@ G4double G4mplAtlasIonisationWithDeltaModel::SampleFluctuations(
 G4double
 G4mplAtlasIonisationWithDeltaModel::Dispersion(const G4Material* material,
                                                const G4DynamicParticle* dp,
-#if G4VERSION_NUMBER > 1009
+#if G4VERSION_NUMBER < 1100
                                                G4double tmax,
                                                G4double length
 #else
-                                               G4double& tmax,
-                                               G4double& length
+                                               const G4double /*tcut*/,
+                                               const G4double tmax,
+                                               const G4double length
 #endif
                                                )
 {
diff --git a/Simulation/G4Extensions/Monopole/src/G4mplAtlasIonisationWithDeltaModel.hh b/Simulation/G4Extensions/Monopole/src/G4mplAtlasIonisationWithDeltaModel.hh
index 24e8906e4a36c69d607ce787433aaf20a0bd7b5d..eb0727c561f25c0e6ea761b54388c1beb7a4c5df 100644
--- a/Simulation/G4Extensions/Monopole/src/G4mplAtlasIonisationWithDeltaModel.hh
+++ b/Simulation/G4Extensions/Monopole/src/G4mplAtlasIonisationWithDeltaModel.hh
@@ -92,7 +92,7 @@ public:
                                  G4double maxEnergy);
 
 
-#if G4VERSION_NUMBER > 1009
+#if G4VERSION_NUMBER < 1100
   virtual G4double SampleFluctuations(const G4MaterialCutsCouple* material,
                                       const G4DynamicParticle* dp,
                                       G4double tmax,
@@ -104,16 +104,18 @@ public:
                               G4double tmax,
                               G4double length);
 #else
-  virtual G4double SampleFluctuations(const G4Material*,
-                                      const G4DynamicParticle*,
-                                      G4double& tmax,
-                                      G4double& length,
-                                      G4double& meanLoss);
+  virtual G4double SampleFluctuations(const G4MaterialCutsCouple* material,
+                                      const G4DynamicParticle* dp,
+                                      const G4double tcut,
+                                      const G4double tmax,
+                                      const G4double length,
+                                      const G4double meanLoss);
 
   virtual G4double Dispersion(const G4Material*,
                               const G4DynamicParticle*,
-                              G4double& tmax,
-                              G4double& length);
+                              const G4double tcut,
+                              const G4double tmax,
+                              const G4double length);
 #endif
 
 protected:
diff --git a/Simulation/G4Extensions/Quirks/src/DebugSteppingAction.h b/Simulation/G4Extensions/Quirks/src/DebugSteppingAction.h
index bf76e6950f97e6d53e3981fca758d88e383db0f6..bb2ea81d26e0b5f43688d1f02fcb4869732d57d1 100644
--- a/Simulation/G4Extensions/Quirks/src/DebugSteppingAction.h
+++ b/Simulation/G4Extensions/Quirks/src/DebugSteppingAction.h
@@ -5,6 +5,7 @@
 #ifndef DEBUGSTEPPINGACTION_H
 #define DEBUGSTEPPINGACTION_H
 
+#include "G4Types.hh"
 #include "G4LorentzVector.hh"
 #include "G4UserSteppingAction.hh"
 
diff --git a/Simulation/G4Extensions/RHadrons/src/FullModelHadronicProcess.cxx b/Simulation/G4Extensions/RHadrons/src/FullModelHadronicProcess.cxx
index b0fc271919f67a3d578d5ce2f874194876933ff9..3e5d4b41e83de3dbecaf4986cd957c90d6aab379 100644
--- a/Simulation/G4Extensions/RHadrons/src/FullModelHadronicProcess.cxx
+++ b/Simulation/G4Extensions/RHadrons/src/FullModelHadronicProcess.cxx
@@ -3,11 +3,18 @@
 */
 
 #include "FullModelHadronicProcess.hh"
+#include "G4Version.hh"
 #include "G4ProcessManager.hh"
 #include "G4ProcessHelper.hh"
 #include "G4ParticleTable.hh"
 #include "FullModelReactionDynamics.hh"
+
+#if G4VERSION_NUMBER < 1100
 #include "G4HadReentrentException.hh"
+#else
+#include "G4HadronicException.hh"
+#endif
+
 #include "CustomPDGParser.h"
 #include "CustomParticle.h"
 
@@ -554,11 +561,19 @@ void FullModelHadronicProcess::CalculateMomenta(
                                                            targetHasChanged, leadFlag,
                                                            leadingStrangeParticle );
         }
+#if G4VERSION_NUMBER < 1100
       catch(G4HadReentrentException& aC)
         {
           aC.Report(G4cout);
           throw G4HadReentrentException(__FILE__, __LINE__, "Failing to calculate momenta");
         }
+#else
+      catch(G4HadronicException& aC)
+        {
+          aC.Report(G4cout);
+          throw G4HadronicException(__FILE__, __LINE__, "Failing to calculate momenta");
+        }
+#endif
     }
   if( finishedTwoClu )
     {
diff --git a/Simulation/G4Extensions/RHadrons/src/FullModelHadronicProcess.hh b/Simulation/G4Extensions/RHadrons/src/FullModelHadronicProcess.hh
index ae034ff6949ca2788787714ac61fa636373181e6..a24dbe90a50be3bcdbad8d9d5e3a10ee8ebb6800 100644
--- a/Simulation/G4Extensions/RHadrons/src/FullModelHadronicProcess.hh
+++ b/Simulation/G4Extensions/RHadrons/src/FullModelHadronicProcess.hh
@@ -6,6 +6,7 @@
 #define FullModelHadronicProcess_h 
 
 #include "globals.hh"
+#include "G4FastVector.hh"
 #include "G4VDiscreteProcess.hh"
 #include "G4EnergyRangeManager.hh"
 #include "G4Nucleus.hh"
diff --git a/Simulation/G4Extensions/RHadrons/src/FullModelReactionDynamics.cxx b/Simulation/G4Extensions/RHadrons/src/FullModelReactionDynamics.cxx
index 61902ddbc583bbbe372c62a37346fca90910d8a4..8acf3cb601fc50f0cc8ac160679b8446bae9a07b 100644
--- a/Simulation/G4Extensions/RHadrons/src/FullModelReactionDynamics.cxx
+++ b/Simulation/G4Extensions/RHadrons/src/FullModelReactionDynamics.cxx
@@ -49,11 +49,16 @@
 // J. Allison, 17-Jun-99:  Replaced a min function to get correct behaviour on DEC.
 
 #include "FullModelReactionDynamics.hh"
+#include "G4Version.hh"
 #include "G4AntiProton.hh"
 #include "G4AntiNeutron.hh"
 #include "Randomize.hh"
 #include <iostream>
+#if G4VERSION_NUMBER < 1100
 #include "G4HadReentrentException.hh"
+#else
+#include "G4HadronicException.hh"
+#endif
 #include <signal.h>
 //#include "G4ParticleTable.hh"
 
@@ -460,7 +465,11 @@ G4bool FullModelReactionDynamics::GenerateXandPt(
                     {
                       for(G4int i=0; i<vecLen; i++) delete vec[i];
                       vecLen = 0;
+#if G4VERSION_NUMBER < 1100
                       throw G4HadReentrentException(__FILE__, __LINE__,
+#else
+                      throw G4HadronicException(__FILE__, __LINE__,
+#endif
                                                     "FullModelReactionDynamics::GenerateXandPt : a pion has been counted as a backward nucleon");
                     }
                   vec[i]->SetSide( -3 );
@@ -1504,7 +1513,11 @@ G4bool FullModelReactionDynamics::TwoCluster(
         {
           for(G4int i=0; i<vecLen; i++) delete vec[i];
           vecLen = 0;
+#if G4VERSION_NUMBER < 1100
           throw G4HadReentrentException(__FILE__, __LINE__,
+#else
+          throw G4HadronicException(__FILE__, __LINE__,
+#endif
                                         "FullModelReactionDynamics::TwoCluster: Negative number of particles");
         }
       delete vec[vecLen-1];
diff --git a/Simulation/G4Utilities/G4DebuggingTools/src/helper/G4DebuggingHelper.cxx b/Simulation/G4Utilities/G4DebuggingTools/src/helper/G4DebuggingHelper.cxx
index fbdf6a98d150487acecf106028644c22d288b998..69e2e1966f68cad26255ed31fb522dff19021834 100644
--- a/Simulation/G4Utilities/G4DebuggingTools/src/helper/G4DebuggingHelper.cxx
+++ b/Simulation/G4Utilities/G4DebuggingTools/src/helper/G4DebuggingHelper.cxx
@@ -12,6 +12,7 @@
 #include "G4PionPlus.hh"
 #include "G4PionMinus.hh"
 #include "G4PionZero.hh"
+#include "G4Version.hh"
 
 namespace G4DebuggingHelpers {
 
@@ -97,8 +98,13 @@ namespace G4DebuggingHelpers {
          ||   ( nom.length() >= 4  && nom.substr(0, 4)  == "Muon" )
          ||   ( nom.length() >= 9  && nom.substr(0, 9)  == "DriftTube" )
          ||   ( nom.length() >= 12 && nom.substr(0, 12) == "SensitiveGas" )
+#if G4VERSION_NUMBER < 1100
          ||     nom.contains("MDT")
          ||     nom.contains("station") ) {
+#else
+         ||     G4StrUtil::contains(nom, "MDT")
+         ||     G4StrUtil::contains(nom, "station") ) {
+#endif
       return "Muon";
     }
     else if ( nom.length() >= 8 && nom.substr(0, 8) == "ITkPixel" ) {
diff --git a/Simulation/G4Utilities/G4PhysicsLists/src/MuBias/G4EmStandardPhysics_MuBias.cc b/Simulation/G4Utilities/G4PhysicsLists/src/MuBias/G4EmStandardPhysics_MuBias.cc
index 5f3fd919d8efc8d520d449be4217ea339f7f93b1..25dded9ec1c9806097c57c02e3724d65eaa930a7 100644
--- a/Simulation/G4Utilities/G4PhysicsLists/src/MuBias/G4EmStandardPhysics_MuBias.cc
+++ b/Simulation/G4Utilities/G4PhysicsLists/src/MuBias/G4EmStandardPhysics_MuBias.cc
@@ -93,7 +93,6 @@ using G4UrbanMscModel=G4UrbanMscModel96;
 
 #include "G4hIonisation.hh"
 #include "G4ionIonisation.hh"
-#include "G4alphaIonisation.hh"
 
 #include "G4Gamma.hh"
 #include "G4Electron.hh"
diff --git a/Simulation/G4Utilities/G4PhysicsLists/src/MuBias/HadronPhysicsQGSP_BERT_MuBias.cc b/Simulation/G4Utilities/G4PhysicsLists/src/MuBias/HadronPhysicsQGSP_BERT_MuBias.cc
index 5d7abe40f0440ce39ba7b1049c37c2d3dc1a8d17..c375ee615cfde1d8c971d9321456db4ae7809499 100644
--- a/Simulation/G4Utilities/G4PhysicsLists/src/MuBias/HadronPhysicsQGSP_BERT_MuBias.cc
+++ b/Simulation/G4Utilities/G4PhysicsLists/src/MuBias/HadronPhysicsQGSP_BERT_MuBias.cc
@@ -46,6 +46,7 @@
 
 #include "HadronPhysicsQGSP_BERT_MuBias.hh"
 
+#include "G4Version.hh"
 #include "globals.hh"
 #include "G4ios.hh"
 #include "G4SystemOfUnits.hh"
@@ -57,7 +58,11 @@
 #include "G4ShortLivedConstructor.hh"
 #include "G4IonConstructor.hh"
 
+#if G4VERSION_NUMBER < 1100
 #include "G4HadronCaptureProcess.hh"
+#else
+#include "G4NeutronCaptureProcess.hh"
+#endif
 #include "G4NeutronRadCapture.hh"
 #include "G4NeutronInelasticXS.hh"
 #include "G4NeutronCaptureXS.hh"
@@ -236,7 +241,11 @@ void G4HadronPhysicsQGSP_BERT_MuBias::ConstructProcess()
     }
   }
   if ( ! capture ) {
+#if G4VERSION_NUMBER < 1100
     capture = new G4HadronCaptureProcess("nCapture");
+#else
+    capture = new G4NeutronCaptureProcess("nCapture");
+#endif
     pmanager->AddDiscreteProcess(capture);
   }
   s_tpdata->xsNeutronCaptureXS = new G4NeutronCaptureXS();
diff --git a/Simulation/G4Utilities/G4PhysicsLists/src/hadronicVariations/G4AtlasHadronPhysicsFTFP_BERP_ATL.cc b/Simulation/G4Utilities/G4PhysicsLists/src/hadronicVariations/G4AtlasHadronPhysicsFTFP_BERP_ATL.cc
index 9fb198a1628da5de43d51086fe9255252af7f9fd..d0fdcae9d47111a34a34189fec038a3d03f376f3 100644
--- a/Simulation/G4Utilities/G4PhysicsLists/src/hadronicVariations/G4AtlasHadronPhysicsFTFP_BERP_ATL.cc
+++ b/Simulation/G4Utilities/G4PhysicsLists/src/hadronicVariations/G4AtlasHadronPhysicsFTFP_BERP_ATL.cc
@@ -54,15 +54,18 @@
 #include "G4ChipsKaonZeroInelasticXS.hh"
 #include "G4CrossSectionDataSetRegistry.hh"
 
-#include "G4HadronCaptureProcess.hh"
 #include "G4NeutronRadCapture.hh"
 #include "G4NeutronInelasticXS.hh"
 #include "G4NeutronCaptureXS.hh"
 
 #include "G4ProcessManager.hh"
 #include "G4BGGNucleonInelasticXS.hh"
+#if G4VERSION_NUMBER < 1100
 #include "G4PiNuclearCrossSection.hh"
 #include "G4CrossSectionPairGG.hh"
+#else
+#include "G4BGGPionInelasticXS.hh"
+#endif
 #include "G4ComponentAntiNuclNuclearXS.hh"
 #include "G4CrossSectionInelastic.hh"
 
@@ -114,7 +117,8 @@ G4AtlasHadronPhysicsFTFP_BERP_ATL::G4AtlasHadronPhysicsFTFP_BERP_ATL(G4int)
     , theAntiTritonInelastic(0)
     , theAntiHe3Inelastic(0)
     , theAntiAlphaInelastic(0)
-    , thePiXS(0)
+    , thePiPlusXS(0)
+    , thePiMinusXS(0)
     , theChipsHyperonInelasticXS(0)
     , theAntiNucleonXS(0)
     , theChipsKaonMinusXS(0)
@@ -165,7 +169,8 @@ G4AtlasHadronPhysicsFTFP_BERP_ATL::G4AtlasHadronPhysicsFTFP_BERP_ATL(const G4Str
     , theAntiTritonInelastic(0)
     , theAntiHe3Inelastic(0)
     , theAntiAlphaInelastic(0)
-    , thePiXS(0)
+    , thePiPlusXS(0)
+    , thePiMinusXS(0)
     , theChipsHyperonInelasticXS(0)
     , theAntiNucleonXS(0)
     , theChipsKaonMinusXS(0)
@@ -230,7 +235,14 @@ void G4AtlasHadronPhysicsFTFP_BERP_ATL::CreateModels()
   theNeutronCaptureModel->SetMaxEnergy( 100.0*TeV );
 
   // Cross sections
-  thePiXS = new G4CrossSectionPairGG( new G4PiNuclearCrossSection(), 91*GeV );
+#if G4VERSION_NUMBER < 1100
+  thePiPlusXS = new G4CrossSectionPairGG( new G4PiNuclearCrossSection(), 91*GeV );
+  thePiMinusXS = thePiPlusXS; 
+#else
+  thePiPlusXS = new G4BGGPionInelasticXS( G4PionPlus::Definition() );
+  thePiMinusXS = new G4BGGPionInelasticXS( G4PionMinus::Definition() );
+#endif
+
   theAntiNucleonXS = new G4CrossSectionInelastic( new G4ComponentAntiNuclNuclearXS() );
   theChipsHyperonInelasticXS = G4CrossSectionDataSetRegistry::Instance()->GetCrossSectionDataSet( G4ChipsHyperonInelasticXS::Default_Name() );
   theChipsKaonMinusXS        = G4CrossSectionDataSetRegistry::Instance()->GetCrossSectionDataSet( G4ChipsKaonMinusInelasticXS::Default_Name() );
@@ -267,176 +279,285 @@ void G4AtlasHadronPhysicsFTFP_BERP_ATL::ConstructProcess()
 
   G4ProcessManager * aProcMan = 0;
 
+#if G4VERSION_NUMBER < 1100
   theNeutronInelastic = new G4NeutronInelasticProcess();
+#else
+  theNeutronInelastic = new G4HadronInelasticProcess( "NeutronInelastic", G4Neutron::Definition() );
+#endif  
   theNeutronInelastic->RegisterMe( theModel1 );
   theNeutronInelastic->RegisterMe( theBertini1 );
   theNeutronInelastic->AddDataSet( new G4BGGNucleonInelasticXS( G4Neutron::Neutron() ) );
   theNeutronInelastic->AddDataSet( theNeutronInelasticXS );
   aProcMan = G4Neutron::Neutron()->GetProcessManager();
   aProcMan->AddDiscreteProcess( theNeutronInelastic );
+
+#if G4VERSION_NUMBER < 1100
   theNeutronCaptureProcess = new G4HadronCaptureProcess();
+#else
+  theNeutronCaptureProcess = new G4NeutronCaptureProcess();
+#endif
   theNeutronCaptureProcess->RegisterMe( theNeutronCaptureModel );
   theNeutronCaptureProcess->AddDataSet( theNeutronCaptureXS );
   aProcMan->AddDiscreteProcess( theNeutronCaptureProcess );
 
+#if G4VERSION_NUMBER < 1100
   theProtonInelastic = new G4ProtonInelasticProcess();
+#else
+  theProtonInelastic = new G4HadronInelasticProcess( "ProtonInelastic", G4Proton::Definition() );
+#endif
   theProtonInelastic->RegisterMe( theModel1 );
   theProtonInelastic->RegisterMe( theBertini1 );
   theProtonInelastic->AddDataSet( new G4BGGNucleonInelasticXS( G4Proton::Proton() ) );
   aProcMan = G4Proton::Proton()->GetProcessManager();
   aProcMan->AddDiscreteProcess( theProtonInelastic );
 
+#if G4VERSION_NUMBER < 1100
   thePionMinusInelastic = new G4PionMinusInelasticProcess();
+#else
+  thePionMinusInelastic = new G4HadronInelasticProcess( "PionMinusInelastic", G4PionMinus::Definition() );
+#endif
   thePionMinusInelastic->RegisterMe( theModel1 );
   thePionMinusInelastic->RegisterMe( theBertini1 );
-  thePionMinusInelastic->AddDataSet( thePiXS );
+  thePionMinusInelastic->AddDataSet( thePiMinusXS );
   aProcMan = G4PionMinus::PionMinus()->GetProcessManager();
   aProcMan->AddDiscreteProcess( thePionMinusInelastic );
 
+#if G4VERSION_NUMBER < 1100
   thePionPlusInelastic = new G4PionPlusInelasticProcess();
+#else
+  thePionPlusInelastic = new G4HadronInelasticProcess( "PionPlusInelastic", G4PionPlus::Definition() );
+#endif
   thePionPlusInelastic->RegisterMe( theModel1 );
   thePionPlusInelastic->RegisterMe( theBertini1 );
-  thePionPlusInelastic->AddDataSet( thePiXS );
+  thePionPlusInelastic->AddDataSet( thePiPlusXS );
   aProcMan = G4PionPlus::PionPlus()->GetProcessManager();
   aProcMan->AddDiscreteProcess( thePionPlusInelastic );
 
+#if G4VERSION_NUMBER < 1100
   theKaonMinusInelastic = new G4KaonMinusInelasticProcess();
+#else
+  theKaonMinusInelastic = new G4HadronInelasticProcess( "KaonMinusInelastic", G4KaonMinus::Definition() );
+#endif
   theKaonMinusInelastic->RegisterMe( theModel1 );
   theKaonMinusInelastic->RegisterMe( theBertini1 );
   theKaonMinusInelastic->AddDataSet( theChipsKaonMinusXS );
   aProcMan = G4KaonMinus::KaonMinus()->GetProcessManager();
   aProcMan->AddDiscreteProcess( theKaonMinusInelastic );
 
+#if G4VERSION_NUMBER < 1100
   theKaonPlusInelastic = new G4KaonPlusInelasticProcess();
+#else
+  theKaonPlusInelastic = new G4HadronInelasticProcess( "KaonPlusInelastic", G4KaonPlus::Definition() );
+#endif
   theKaonPlusInelastic->RegisterMe( theModel1 );
   theKaonPlusInelastic->RegisterMe( theBertini1 );
   theKaonPlusInelastic->AddDataSet( theChipsKaonPlusXS );
   aProcMan = G4KaonPlus::KaonPlus()->GetProcessManager();
   aProcMan->AddDiscreteProcess( theKaonPlusInelastic );
 
+#if G4VERSION_NUMBER < 1100
   theKaonZeroLInelastic = new G4KaonZeroLInelasticProcess();
+#else
+  theKaonZeroLInelastic = new G4HadronInelasticProcess( "KaonZeroLInelastic", G4KaonZeroLong::Definition() );
+#endif
   theKaonZeroLInelastic->RegisterMe( theModel1 );
   theKaonZeroLInelastic->RegisterMe( theBertini1 );
   theKaonZeroLInelastic->AddDataSet( theChipsKaonZeroXS );
   aProcMan = G4KaonZeroLong::KaonZeroLong()->GetProcessManager();
   aProcMan->AddDiscreteProcess( theKaonZeroLInelastic );
 
+#if G4VERSION_NUMBER < 1100
   theKaonZeroSInelastic = new G4KaonZeroSInelasticProcess();
+#else
+  theKaonZeroSInelastic = new G4HadronInelasticProcess( "KaonZeroSInelastic", G4KaonZeroShort::Definition() );
+#endif
   theKaonZeroSInelastic->RegisterMe( theModel1 );
   theKaonZeroSInelastic->RegisterMe( theBertini1 );
   theKaonZeroSInelastic->AddDataSet( theChipsKaonZeroXS );
   aProcMan = G4KaonZeroShort::KaonZeroShort()->GetProcessManager();
   aProcMan->AddDiscreteProcess( theKaonZeroSInelastic );
 
+#if G4VERSION_NUMBER < 1100
   theLambdaInelastic = new G4LambdaInelasticProcess();
+#else
+  theLambdaInelastic = new G4HadronInelasticProcess( "LambdaInelastic", G4Lambda::Definition() );
+#endif
   theLambdaInelastic->RegisterMe( theModel2 );
   theLambdaInelastic->RegisterMe( theBertini2 );
   theLambdaInelastic->AddDataSet( theChipsHyperonInelasticXS );
   aProcMan = G4Lambda::Lambda()->GetProcessManager();
   aProcMan->AddDiscreteProcess( theLambdaInelastic );
 
+#if G4VERSION_NUMBER < 1100
   theAntiLambdaInelastic = new G4AntiLambdaInelasticProcess();
+#else
+  theAntiLambdaInelastic = new G4HadronInelasticProcess( "AntiLambdaInelastic", G4AntiLambda::Definition() );
+#endif
   theAntiLambdaInelastic->RegisterMe( theModel3 );
   theAntiLambdaInelastic->AddDataSet( theChipsHyperonInelasticXS );
   aProcMan = G4AntiLambda::AntiLambda()->GetProcessManager();
   aProcMan->AddDiscreteProcess( theAntiLambdaInelastic );
 
+#if G4VERSION_NUMBER < 1100
   theSigmaMinusInelastic = new G4SigmaMinusInelasticProcess();
+#else
+  theSigmaMinusInelastic = new G4HadronInelasticProcess( "SigmaMinusInelastic", G4SigmaMinus::Definition() );
+#endif
   theSigmaMinusInelastic->RegisterMe( theModel2 );
   theSigmaMinusInelastic->RegisterMe( theBertini2 );
   theSigmaMinusInelastic->AddDataSet( theChipsHyperonInelasticXS );
   aProcMan = G4SigmaMinus::SigmaMinus()->GetProcessManager();
   aProcMan->AddDiscreteProcess( theSigmaMinusInelastic );
 
+#if G4VERSION_NUMBER < 1100
   theAntiSigmaMinusInelastic = new G4AntiSigmaMinusInelasticProcess();
+#else
+  theAntiSigmaMinusInelastic = new G4HadronInelasticProcess( "AntiSigmaMinusInelastic", G4AntiSigmaMinus::Definition() );
+#endif
   theAntiSigmaMinusInelastic->RegisterMe( theModel3 );
   theAntiSigmaMinusInelastic->AddDataSet( theChipsHyperonInelasticXS );
   aProcMan = G4AntiSigmaMinus::AntiSigmaMinus()->GetProcessManager();
   aProcMan->AddDiscreteProcess( theAntiSigmaMinusInelastic );
 
+#if G4VERSION_NUMBER < 1100
   theSigmaPlusInelastic = new G4SigmaPlusInelasticProcess();
+#else
+  theSigmaPlusInelastic = new G4HadronInelasticProcess( "SigmaPlusInelastic", G4SigmaPlus::Definition() );
+#endif
   theSigmaPlusInelastic->RegisterMe( theModel2 );
   theSigmaPlusInelastic->RegisterMe( theBertini2 );
   theSigmaPlusInelastic->AddDataSet( theChipsHyperonInelasticXS );
   aProcMan = G4SigmaPlus::SigmaPlus()->GetProcessManager();
   aProcMan->AddDiscreteProcess( theSigmaPlusInelastic );
 
+#if G4VERSION_NUMBER < 1100
   theAntiSigmaPlusInelastic = new G4AntiSigmaPlusInelasticProcess();
+#else
+  theAntiSigmaPlusInelastic = new G4HadronInelasticProcess( "AntiSigmaPlusInelastic", G4AntiSigmaPlus::Definition() );
+#endif
   theAntiSigmaPlusInelastic->RegisterMe( theModel3 );
   theAntiSigmaPlusInelastic->AddDataSet( theChipsHyperonInelasticXS );
   aProcMan = G4AntiSigmaPlus::AntiSigmaPlus()->GetProcessManager();
   aProcMan->AddDiscreteProcess( theAntiSigmaPlusInelastic );
 
+#if G4VERSION_NUMBER < 1100
   theXiMinusInelastic = new G4XiMinusInelasticProcess();
+#else
+  theXiMinusInelastic = new G4HadronInelasticProcess( "XiMinusInelastic", G4XiMinus::Definition() );
+#endif
   theXiMinusInelastic->RegisterMe( theModel2 );
   theXiMinusInelastic->RegisterMe( theBertini2 );
   theXiMinusInelastic->AddDataSet( theChipsHyperonInelasticXS );
   aProcMan = G4XiMinus::XiMinus()->GetProcessManager();
   aProcMan->AddDiscreteProcess( theXiMinusInelastic );
 
+#if G4VERSION_NUMBER < 1100
   theAntiXiMinusInelastic = new G4AntiXiMinusInelasticProcess();
+#else
+  theAntiXiMinusInelastic = new G4HadronInelasticProcess( "AntiXiMinusInelastic", G4AntiXiMinus::Definition() );
+#endif
   theAntiXiMinusInelastic->RegisterMe( theModel3 );
   theAntiXiMinusInelastic->AddDataSet( theChipsHyperonInelasticXS );
   aProcMan = G4AntiXiMinus::AntiXiMinus()->GetProcessManager();
   aProcMan->AddDiscreteProcess( theAntiXiMinusInelastic );
 
+#if G4VERSION_NUMBER < 1100
   theXiZeroInelastic = new G4XiZeroInelasticProcess();
+#else
+  theXiZeroInelastic = new G4HadronInelasticProcess( "XiZeroInelastic", G4XiZero::Definition() );
+#endif
   theXiZeroInelastic->RegisterMe( theModel2 );
   theXiZeroInelastic->RegisterMe( theBertini2 );
   theXiZeroInelastic->AddDataSet( theChipsHyperonInelasticXS );
   aProcMan = G4XiZero::XiZero()->GetProcessManager();
   aProcMan->AddDiscreteProcess( theXiZeroInelastic );
 
+#if G4VERSION_NUMBER < 1100
   theAntiXiZeroInelastic = new G4AntiXiZeroInelasticProcess();
+#else
+  theAntiXiZeroInelastic = new G4HadronInelasticProcess( "AntiXiZeroInelastic", G4AntiXiZero::Definition() );
+#endif
   theAntiXiZeroInelastic->RegisterMe( theModel3 );
   theAntiXiZeroInelastic->AddDataSet( theChipsHyperonInelasticXS );
   aProcMan = G4AntiXiZero::AntiXiZero()->GetProcessManager();
   aProcMan->AddDiscreteProcess( theAntiXiZeroInelastic );
 
+#if G4VERSION_NUMBER < 1100
   theOmegaMinusInelastic = new G4OmegaMinusInelasticProcess();
+#else
+  theOmegaMinusInelastic = new G4HadronInelasticProcess( "OmegaMinusInelastic", G4OmegaMinus::Definition() );
+#endif
   theOmegaMinusInelastic->RegisterMe( theModel2 );
   theOmegaMinusInelastic->RegisterMe( theBertini2 );
   theOmegaMinusInelastic->AddDataSet( theChipsHyperonInelasticXS );
   aProcMan = G4OmegaMinus::OmegaMinus()->GetProcessManager();
   aProcMan->AddDiscreteProcess( theOmegaMinusInelastic );
 
+#if G4VERSION_NUMBER < 1100
   theAntiOmegaMinusInelastic = new G4AntiOmegaMinusInelasticProcess();
+#else
+  theAntiOmegaMinusInelastic = new G4HadronInelasticProcess( "AntiOmegaMinusInelastic", G4AntiOmegaMinus::Definition() );
+#endif
   theAntiOmegaMinusInelastic->RegisterMe( theModel3 );
   theAntiOmegaMinusInelastic->AddDataSet( theChipsHyperonInelasticXS );
   aProcMan = G4AntiOmegaMinus::AntiOmegaMinus()->GetProcessManager();
   aProcMan->AddDiscreteProcess( theAntiOmegaMinusInelastic );
 
+#if G4VERSION_NUMBER < 1100
   theAntiProtonInelastic = new G4AntiProtonInelasticProcess();
+#else
+  theAntiProtonInelastic = new G4HadronInelasticProcess( "AntiProtonInelastic", G4AntiProton::Definition() );
+#endif
   theAntiProtonInelastic->RegisterMe( theModel3 );
   theAntiProtonInelastic->AddDataSet( theAntiNucleonXS );
   aProcMan = G4AntiProton::AntiProton()->GetProcessManager();
   aProcMan->AddDiscreteProcess( theAntiProtonInelastic );
 
+#if G4VERSION_NUMBER < 1100
   theAntiNeutronInelastic = new G4AntiNeutronInelasticProcess();
+#else
+  theAntiNeutronInelastic = new G4HadronInelasticProcess( "AntiNeutronInelastic", G4AntiNeutron::Definition() );
+#endif
   theAntiNeutronInelastic->RegisterMe( theModel3 );
   theAntiNeutronInelastic->AddDataSet( theAntiNucleonXS );
   aProcMan = G4AntiNeutron::AntiNeutron()->GetProcessManager();
   aProcMan->AddDiscreteProcess( theAntiNeutronInelastic );
 
+#if G4VERSION_NUMBER < 1100
   theAntiDeuteronInelastic = new G4AntiDeuteronInelasticProcess();
+#else
+  theAntiDeuteronInelastic = new G4HadronInelasticProcess( "AntiDeuteronInelastic", G4AntiDeuteron::Definition() );
+#endif
   theAntiDeuteronInelastic->RegisterMe( theModel3 );
   theAntiDeuteronInelastic->AddDataSet( theAntiNucleonXS );
   aProcMan = G4AntiDeuteron::AntiDeuteron()->GetProcessManager();
   aProcMan->AddDiscreteProcess( theAntiDeuteronInelastic );
 
+#if G4VERSION_NUMBER < 1100
   theAntiTritonInelastic = new G4AntiTritonInelasticProcess();
+#else
+  theAntiTritonInelastic = new G4HadronInelasticProcess( "AntiTritonInelastic", G4AntiTriton::Definition() );
+#endif
   theAntiTritonInelastic->RegisterMe( theModel3 );
   theAntiTritonInelastic->AddDataSet( theAntiNucleonXS );
   aProcMan = G4AntiTriton::AntiTriton()->GetProcessManager();
   aProcMan->AddDiscreteProcess( theAntiTritonInelastic );
 
+#if G4VERSION_NUMBER < 1100
   theAntiHe3Inelastic = new G4AntiHe3InelasticProcess();
+#else
+  theAntiHe3Inelastic = new G4HadronInelasticProcess( "AntiHe3Inelastic", G4AntiHe3::Definition() );
+#endif
   theAntiHe3Inelastic->RegisterMe( theModel3 );
   theAntiHe3Inelastic->AddDataSet( theAntiNucleonXS );
   aProcMan = G4AntiHe3::AntiHe3()->GetProcessManager();
   aProcMan->AddDiscreteProcess( theAntiHe3Inelastic );
 
+#if G4VERSION_NUMBER < 1100
   theAntiAlphaInelastic = new G4AntiAlphaInelasticProcess();
+#else
+  theAntiAlphaInelastic = new G4HadronInelasticProcess( "AntiAlphaInelastic", G4AntiAlpha::Definition() );
+#endif
   theAntiAlphaInelastic->RegisterMe( theModel3 );
   theAntiAlphaInelastic->AddDataSet( theAntiNucleonXS );
   aProcMan = G4AntiAlpha::AntiAlpha()->GetProcessManager();
diff --git a/Simulation/G4Utilities/G4PhysicsLists/src/hadronicVariations/G4AtlasHadronPhysicsFTFP_BERP_ATL.hh b/Simulation/G4Utilities/G4PhysicsLists/src/hadronicVariations/G4AtlasHadronPhysicsFTFP_BERP_ATL.hh
index 6ea71ce820ff6d4e1530fbe3446bfd8d7cd7745f..d4cb4933198da8dcaf16370086606cb75057e9fd 100644
--- a/Simulation/G4Utilities/G4PhysicsLists/src/hadronicVariations/G4AtlasHadronPhysicsFTFP_BERP_ATL.hh
+++ b/Simulation/G4Utilities/G4PhysicsLists/src/hadronicVariations/G4AtlasHadronPhysicsFTFP_BERP_ATL.hh
@@ -38,6 +38,7 @@
 #ifndef G4AtlasHadronPhysicsFTFP_BERP_ATL_h
 #define G4AtlasHadronPhysicsFTFP_BERP_ATL_h 1
 
+#include "G4Version.hh"
 #include "globals.hh"
 #include "G4ios.hh"
 
@@ -55,8 +56,13 @@
 #include "G4QuasiElasticChannel.hh"
 #include "G4CascadeInterface.hh"
 
-#include "G4HadronFissionProcess.hh"
+#if G4VERSION_NUMBER < 1100
 #include "G4HadronCaptureProcess.hh"
+#else
+#include "G4NeutronCaptureProcess.hh"
+#endif
+
+#if G4VERSION_NUMBER < 1100
 
 #include "G4NeutronInelasticProcess.hh"
 #include "G4ProtonInelasticProcess.hh"
@@ -87,6 +93,10 @@
 #include "G4AntiHe3InelasticProcess.hh"
 #include "G4AntiAlphaInelasticProcess.hh"
 
+#else
+#include "G4HadronInelasticProcess.hh"
+#endif
+
 #include "G4ChipsHyperonInelasticXS.hh"
 
 
@@ -119,8 +129,13 @@ class G4AtlasHadronPhysicsFTFP_BERP_ATL : public G4VPhysicsConstructor
     G4CascadeInterface * theBertini1;
     G4CascadeInterface * theBertini2;
 
+#if G4VERSION_NUMBER < 1100
     G4HadronCaptureProcess * theNeutronCaptureProcess;
+#else
+    G4NeutronCaptureProcess * theNeutronCaptureProcess;
+#endif
 
+#if G4VERSION_NUMBER < 1100
     G4NeutronInelasticProcess *   theNeutronInelastic;
     G4ProtonInelasticProcess *    theProtonInelastic;
     G4PionMinusInelasticProcess * thePionMinusInelastic;
@@ -149,8 +164,39 @@ class G4AtlasHadronPhysicsFTFP_BERP_ATL : public G4VPhysicsConstructor
     G4AntiTritonInelasticProcess *   theAntiTritonInelastic;
     G4AntiHe3InelasticProcess *      theAntiHe3Inelastic;
     G4AntiAlphaInelasticProcess *    theAntiAlphaInelastic;
+#else
+    G4HadronInelasticProcess*   theNeutronInelastic;
+    G4HadronInelasticProcess*    theProtonInelastic;
+    G4HadronInelasticProcess* thePionMinusInelastic;
+    G4HadronInelasticProcess*  thePionPlusInelastic;
+    G4HadronInelasticProcess* theKaonMinusInelastic;
+    G4HadronInelasticProcess*  theKaonPlusInelastic;
+    G4HadronInelasticProcess* theKaonZeroLInelastic;
+    G4HadronInelasticProcess* theKaonZeroSInelastic;
+
+    G4HadronInelasticProcess*         theLambdaInelastic;
+    G4HadronInelasticProcess*     theAntiLambdaInelastic;
+    G4HadronInelasticProcess*     theSigmaMinusInelastic;
+    G4HadronInelasticProcess* theAntiSigmaMinusInelastic;
+    G4HadronInelasticProcess*      theSigmaPlusInelastic;
+    G4HadronInelasticProcess*  theAntiSigmaPlusInelastic;
+    G4HadronInelasticProcess*         theXiZeroInelastic;
+    G4HadronInelasticProcess*     theAntiXiZeroInelastic;
+    G4HadronInelasticProcess*        theXiMinusInelastic;
+    G4HadronInelasticProcess*    theAntiXiMinusInelastic;
+    G4HadronInelasticProcess*     theOmegaMinusInelastic;
+    G4HadronInelasticProcess* theAntiOmegaMinusInelastic;
+
+    G4HadronInelasticProcess*   theAntiProtonInelastic;
+    G4HadronInelasticProcess*  theAntiNeutronInelastic;
+    G4HadronInelasticProcess* theAntiDeuteronInelastic;
+    G4HadronInelasticProcess*   theAntiTritonInelastic;
+    G4HadronInelasticProcess*      theAntiHe3Inelastic;
+    G4HadronInelasticProcess*    theAntiAlphaInelastic;
+#endif
 
-    G4VCrossSectionDataSet * thePiXS;
+    G4VCrossSectionDataSet * thePiPlusXS;
+    G4VCrossSectionDataSet * thePiMinusXS;
     G4VCrossSectionDataSet * theChipsHyperonInelasticXS;
     G4VCrossSectionDataSet * theAntiNucleonXS;
     G4VCrossSectionDataSet * theChipsKaonMinusXS;
diff --git a/Simulation/G4Utilities/G4PhysicsLists/src/hadronicVariations/G4AtlasHadronPhysicsFTFP_BERT_ATL.cc b/Simulation/G4Utilities/G4PhysicsLists/src/hadronicVariations/G4AtlasHadronPhysicsFTFP_BERT_ATL.cc
index b9a71333883e36dd2d178fef2835828d30addc2a..e2001a105ab85d440c1e2e435c0deec669b2e60e 100644
--- a/Simulation/G4Utilities/G4PhysicsLists/src/hadronicVariations/G4AtlasHadronPhysicsFTFP_BERT_ATL.cc
+++ b/Simulation/G4Utilities/G4PhysicsLists/src/hadronicVariations/G4AtlasHadronPhysicsFTFP_BERT_ATL.cc
@@ -40,6 +40,7 @@
 
 #include "G4AtlasHadronPhysicsFTFP_BERT_ATL.hh"
 
+#include "G4Version.hh"
 #include "globals.hh"
 #include "G4ios.hh"
 #include "G4SystemOfUnits.hh"
@@ -55,7 +56,11 @@
 #include "G4ChipsKaonZeroInelasticXS.hh"
 #include "G4CrossSectionDataSetRegistry.hh"
 
+#if G4VERSION_NUMBER < 1100
 #include "G4HadronCaptureProcess.hh"
+#else
+#include "G4NeutronCaptureProcess.hh"
+#endif
 #include "G4NeutronRadCapture.hh"
 #include "G4NeutronInelasticXS.hh"
 #include "G4NeutronCaptureXS.hh"
@@ -223,7 +228,11 @@ void G4AtlasHadronPhysicsFTFP_BERT_ATL::ConstructProcess()
     }
   }
   if ( ! capture ) {
+#if G4VERSION_NUMBER < 1100
     capture = new G4HadronCaptureProcess("nCapture");
+#else
+    capture = new G4NeutronCaptureProcess("nCapture");
+#endif
     pmanager->AddDiscreteProcess(capture);
   }
   tpdata->xsNeutronCaptureXS = (G4NeutronCaptureXS*)G4CrossSectionDataSetRegistry::Instance()->GetCrossSectionDataSet(G4NeutronCaptureXS::Default_Name());
diff --git a/Simulation/G4Utilities/G4PhysicsLists/src/hadronicVariations/G4AtlasHadronPhysicsFTFP_BERT_ATL_HP.cc b/Simulation/G4Utilities/G4PhysicsLists/src/hadronicVariations/G4AtlasHadronPhysicsFTFP_BERT_ATL_HP.cc
index a005fb580621d60078871cb3171e39d571b7d61e..944d1671950c775cdb6b666864c56ba77b65365f 100644
--- a/Simulation/G4Utilities/G4PhysicsLists/src/hadronicVariations/G4AtlasHadronPhysicsFTFP_BERT_ATL_HP.cc
+++ b/Simulation/G4Utilities/G4PhysicsLists/src/hadronicVariations/G4AtlasHadronPhysicsFTFP_BERT_ATL_HP.cc
@@ -40,6 +40,7 @@
 
 #include "G4AtlasHadronPhysicsFTFP_BERT_ATL_HP.hh"
 
+#include "G4Version.hh"
 #include "globals.hh"
 #include "G4ios.hh"
 #include "G4SystemOfUnits.hh"
@@ -55,7 +56,13 @@
 #include "G4ChipsKaonZeroInelasticXS.hh"
 #include "G4CrossSectionDataSetRegistry.hh"
 
+#if G4VERSION_NUMBER < 1100
 #include "G4HadronCaptureProcess.hh"
+#include "G4HadronFissionProcess.hh"
+#else
+#include "G4NeutronCaptureProcess.hh"
+#include "G4NeutronFissionProcess.hh"
+#endif
 #include "G4NeutronRadCapture.hh"
 #include "G4NeutronCaptureXS.hh"
 #include "G4NeutronHPCaptureData.hh"
@@ -226,7 +233,11 @@ void G4AtlasHadronPhysicsFTFP_BERT_ATL_HP::ConstructProcess()
     }
   }
   if ( ! capture ) {
+#if G4VERSION_NUMBER < 1100
     capture = new G4HadronCaptureProcess("nCapture");
+#else
+    capture = new G4NeutronCaptureProcess("nCapture");
+#endif
     pmanager->AddDiscreteProcess(capture);
   }
   tpdata->xsNeutronCaptureXS = (G4NeutronCaptureXS*)G4CrossSectionDataSetRegistry::Instance()->GetCrossSectionDataSet(G4NeutronCaptureXS::Default_Name());
@@ -236,7 +247,11 @@ void G4AtlasHadronPhysicsFTFP_BERT_ATL_HP::ConstructProcess()
   theNeutronRadCapture->SetMinEnergy( 19.9*MeV ); 
   capture->RegisterMe( theNeutronRadCapture );
   if ( ! fission ) {
+#if G4VERSION_NUMBER < 1100
     fission = new G4HadronFissionProcess("nFission");
+#else
+    fission = new G4NeutronFissionProcess("nFission");
+#endif
     pmanager->AddDiscreteProcess(fission);
   }
   G4LFission* theNeutronLEPFission = new G4LFission();
diff --git a/Simulation/G4Utilities/G4PhysicsLists/src/hadronicVariations/G4AtlasHadronPhysicsFTFP_BERT_ATL_chipsXS.cc b/Simulation/G4Utilities/G4PhysicsLists/src/hadronicVariations/G4AtlasHadronPhysicsFTFP_BERT_ATL_chipsXS.cc
index 04cc8a702f0222d66153e4264d18343c15736f17..4e2543fb934557a2411ae650afaa85ab744f9935 100644
--- a/Simulation/G4Utilities/G4PhysicsLists/src/hadronicVariations/G4AtlasHadronPhysicsFTFP_BERT_ATL_chipsXS.cc
+++ b/Simulation/G4Utilities/G4PhysicsLists/src/hadronicVariations/G4AtlasHadronPhysicsFTFP_BERT_ATL_chipsXS.cc
@@ -39,6 +39,7 @@
 
 #include "G4AtlasHadronPhysicsFTFP_BERT_ATL_chipsXS.hh"
 
+#include "G4Version.hh"
 #include "globals.hh"
 #include "G4ios.hh"
 #include "G4SystemOfUnits.hh"
@@ -58,7 +59,11 @@
 #include "G4ChipsProtonInelasticXS.hh"
 #include "G4CrossSectionDataSetRegistry.hh"
 
+#if G4VERSION_NUMBER < 1100
 #include "G4HadronCaptureProcess.hh"
+#else
+#include "G4NeutronCaptureProcess.hh"
+#endif
 #include "G4NeutronRadCapture.hh"
 #include "G4NeutronCaptureXS.hh"
 
@@ -235,7 +240,11 @@ void G4AtlasHadronPhysicsFTFP_BERT_ATL_chipsXS::ConstructProcess()
     }
   }
   if ( ! capture ) {
+#if G4VERSION_NUMBER < 1100
     capture = new G4HadronCaptureProcess("nCapture");
+#else
+    capture = new G4NeutronCaptureProcess("nCapture");
+#endif
     pmanager->AddDiscreteProcess(capture);
   }
   tpdata->xsNeutronCaptureXS = (G4NeutronCaptureXS*)G4CrossSectionDataSetRegistry::Instance()->GetCrossSectionDataSet(G4NeutronCaptureXS::Default_Name());
diff --git a/Simulation/G4Utilities/G4PhysicsLists/src/hadronicVariations/G4AtlasHadronPhysicsFTFP_BERT_ATL_noDiffraction.cc b/Simulation/G4Utilities/G4PhysicsLists/src/hadronicVariations/G4AtlasHadronPhysicsFTFP_BERT_ATL_noDiffraction.cc
index a779d69e256bcc5bef3ea3165ec3b04240d37295..0ae817fab379a31595ef8bce1a3c6d5b6f0ba836 100644
--- a/Simulation/G4Utilities/G4PhysicsLists/src/hadronicVariations/G4AtlasHadronPhysicsFTFP_BERT_ATL_noDiffraction.cc
+++ b/Simulation/G4Utilities/G4PhysicsLists/src/hadronicVariations/G4AtlasHadronPhysicsFTFP_BERT_ATL_noDiffraction.cc
@@ -56,15 +56,18 @@
 #include "G4ChipsKaonZeroInelasticXS.hh"
 #include "G4CrossSectionDataSetRegistry.hh"
 
-#include "G4HadronCaptureProcess.hh"
 #include "G4NeutronRadCapture.hh"
 #include "G4NeutronInelasticXS.hh"
 #include "G4NeutronCaptureXS.hh"
 
 #include "G4ProcessManager.hh"
 #include "G4BGGNucleonInelasticXS.hh"
+#if G4VERSION_NUMBER < 1100
 #include "G4PiNuclearCrossSection.hh"
 #include "G4CrossSectionPairGG.hh"
+#else
+#include "G4BGGPionInelasticXS.hh"
+#endif	
 #include "G4ComponentAntiNuclNuclearXS.hh"
 #include "G4CrossSectionInelastic.hh"
 
@@ -116,7 +119,8 @@ G4AtlasHadronPhysicsFTFP_BERT_ATL_noDiffraction::G4AtlasHadronPhysicsFTFP_BERT_A
     , theAntiTritonInelastic(0)
     , theAntiHe3Inelastic(0)
     , theAntiAlphaInelastic(0)
-    , thePiXS(0)
+    , thePiPlusXS(0)
+    , thePiMinusXS(0)
     , theChipsHyperonInelasticXS(0)
     , theAntiNucleonXS(0)
     , theChipsKaonMinusXS(0)
@@ -167,7 +171,8 @@ G4AtlasHadronPhysicsFTFP_BERT_ATL_noDiffraction::G4AtlasHadronPhysicsFTFP_BERT_A
     , theAntiTritonInelastic(0)
     , theAntiHe3Inelastic(0)
     , theAntiAlphaInelastic(0)
-    , thePiXS(0)
+    , thePiPlusXS(0)
+    , thePiMinusXS(0)
     , theChipsHyperonInelasticXS(0)
     , theAntiNucleonXS(0)
     , theChipsKaonMinusXS(0)
@@ -233,7 +238,13 @@ void G4AtlasHadronPhysicsFTFP_BERT_ATL_noDiffraction::CreateModels()
   theNeutronCaptureModel->SetMaxEnergy( 100.0*TeV );
 
   // Cross sections
-  thePiXS = new G4CrossSectionPairGG( new G4PiNuclearCrossSection(), 91*GeV );
+#if G4VERSION_NUMBER < 1100
+  thePiPlusXS = new G4CrossSectionPairGG( new G4PiNuclearCrossSection(), 91*GeV );
+  thePiMinusXS = thePiPlusXS;
+#else
+  thePiPlusXS = new G4BGGPionInelasticXS( G4PionPlus::Definition() );
+  thePiMinusXS = new G4BGGPionInelasticXS( G4PionMinus::Definition() );
+#endif	
   theAntiNucleonXS = new G4CrossSectionInelastic( new G4ComponentAntiNuclNuclearXS() );
   theChipsHyperonInelasticXS = G4CrossSectionDataSetRegistry::Instance()->GetCrossSectionDataSet( G4ChipsHyperonInelasticXS::Default_Name() );
   theChipsKaonMinusXS        = G4CrossSectionDataSetRegistry::Instance()->GetCrossSectionDataSet( G4ChipsKaonMinusInelasticXS::Default_Name() );
@@ -270,176 +281,285 @@ void G4AtlasHadronPhysicsFTFP_BERT_ATL_noDiffraction::ConstructProcess()
 
   G4ProcessManager * aProcMan = 0;
 
+#if G4VERSION_NUMBER < 1100
   theNeutronInelastic = new G4NeutronInelasticProcess();
+#else
+  theNeutronInelastic = new G4HadronInelasticProcess( "NeutronInelastic", G4Neutron::Definition() );
+#endif  
   theNeutronInelastic->RegisterMe( theModel1 );
   theNeutronInelastic->RegisterMe( theBertini1 );
   theNeutronInelastic->AddDataSet( new G4BGGNucleonInelasticXS( G4Neutron::Neutron() ) );
   theNeutronInelastic->AddDataSet( theNeutronInelasticXS );
   aProcMan = G4Neutron::Neutron()->GetProcessManager();
   aProcMan->AddDiscreteProcess( theNeutronInelastic );
+
+#if G4VERSION_NUMBER < 1100
   theNeutronCaptureProcess = new G4HadronCaptureProcess();
+#else
+  theNeutronCaptureProcess = new G4NeutronCaptureProcess();
+#endif
   theNeutronCaptureProcess->RegisterMe( theNeutronCaptureModel );
   theNeutronCaptureProcess->AddDataSet( theNeutronCaptureXS );
   aProcMan->AddDiscreteProcess( theNeutronCaptureProcess );
 
+#if G4VERSION_NUMBER < 1100
   theProtonInelastic = new G4ProtonInelasticProcess();
+#else
+  theProtonInelastic = new G4HadronInelasticProcess( "ProtonInelastic", G4Proton::Definition() );
+#endif
   theProtonInelastic->RegisterMe( theModel1 );
   theProtonInelastic->RegisterMe( theBertini1 );
   theProtonInelastic->AddDataSet( new G4BGGNucleonInelasticXS( G4Proton::Proton() ) );
   aProcMan = G4Proton::Proton()->GetProcessManager();
   aProcMan->AddDiscreteProcess( theProtonInelastic );
 
+#if G4VERSION_NUMBER < 1100
   thePionMinusInelastic = new G4PionMinusInelasticProcess();
+#else
+  thePionMinusInelastic = new G4HadronInelasticProcess( "PionMinusInelastic", G4PionMinus::Definition() );
+#endif
   thePionMinusInelastic->RegisterMe( theModel1 );
   thePionMinusInelastic->RegisterMe( theBertini1 );
-  thePionMinusInelastic->AddDataSet( thePiXS );
+  thePionMinusInelastic->AddDataSet( thePiMinusXS );
   aProcMan = G4PionMinus::PionMinus()->GetProcessManager();
   aProcMan->AddDiscreteProcess( thePionMinusInelastic );
 
+#if G4VERSION_NUMBER < 1100
   thePionPlusInelastic = new G4PionPlusInelasticProcess();
+#else
+  thePionPlusInelastic = new G4HadronInelasticProcess( "PionPlusInelastic", G4PionPlus::Definition() );
+#endif
   thePionPlusInelastic->RegisterMe( theModel1 );
   thePionPlusInelastic->RegisterMe( theBertini1 );
-  thePionPlusInelastic->AddDataSet( thePiXS );
+  thePionPlusInelastic->AddDataSet( thePiPlusXS );
   aProcMan = G4PionPlus::PionPlus()->GetProcessManager();
   aProcMan->AddDiscreteProcess( thePionPlusInelastic );
 
+#if G4VERSION_NUMBER < 1100
   theKaonMinusInelastic = new G4KaonMinusInelasticProcess();
+#else
+  theKaonMinusInelastic = new G4HadronInelasticProcess( "KaonMinusInelastic", G4KaonMinus::Definition() );
+#endif
   theKaonMinusInelastic->RegisterMe( theModel1 );
   theKaonMinusInelastic->RegisterMe( theBertini1 );
   theKaonMinusInelastic->AddDataSet( theChipsKaonMinusXS );
   aProcMan = G4KaonMinus::KaonMinus()->GetProcessManager();
   aProcMan->AddDiscreteProcess( theKaonMinusInelastic );
 
+#if G4VERSION_NUMBER < 1100
   theKaonPlusInelastic = new G4KaonPlusInelasticProcess();
+#else
+  theKaonPlusInelastic = new G4HadronInelasticProcess( "KaonPlusInelastic", G4KaonPlus::Definition() );
+#endif
   theKaonPlusInelastic->RegisterMe( theModel1 );
   theKaonPlusInelastic->RegisterMe( theBertini1 );
   theKaonPlusInelastic->AddDataSet( theChipsKaonPlusXS );
   aProcMan = G4KaonPlus::KaonPlus()->GetProcessManager();
   aProcMan->AddDiscreteProcess( theKaonPlusInelastic );
 
+#if G4VERSION_NUMBER < 1100
   theKaonZeroLInelastic = new G4KaonZeroLInelasticProcess();
+#else
+  theKaonZeroLInelastic = new G4HadronInelasticProcess( "KaonZeroLInelastic", G4KaonZeroLong::Definition() );
+#endif
   theKaonZeroLInelastic->RegisterMe( theModel1 );
   theKaonZeroLInelastic->RegisterMe( theBertini1 );
   theKaonZeroLInelastic->AddDataSet( theChipsKaonZeroXS );
   aProcMan = G4KaonZeroLong::KaonZeroLong()->GetProcessManager();
   aProcMan->AddDiscreteProcess( theKaonZeroLInelastic );
 
+#if G4VERSION_NUMBER < 1100
   theKaonZeroSInelastic = new G4KaonZeroSInelasticProcess();
+#else
+  theKaonZeroSInelastic = new G4HadronInelasticProcess( "KaonZeroSInelastic", G4KaonZeroShort::Definition() );
+#endif
   theKaonZeroSInelastic->RegisterMe( theModel1 );
   theKaonZeroSInelastic->RegisterMe( theBertini1 );
   theKaonZeroSInelastic->AddDataSet( theChipsKaonZeroXS );
   aProcMan = G4KaonZeroShort::KaonZeroShort()->GetProcessManager();
   aProcMan->AddDiscreteProcess( theKaonZeroSInelastic );
 
+#if G4VERSION_NUMBER < 1100
   theLambdaInelastic = new G4LambdaInelasticProcess();
+#else
+  theLambdaInelastic = new G4HadronInelasticProcess( "LambdaInelastic", G4Lambda::Definition() );
+#endif
   theLambdaInelastic->RegisterMe( theModel2 );
   theLambdaInelastic->RegisterMe( theBertini2 );
   theLambdaInelastic->AddDataSet( theChipsHyperonInelasticXS );
   aProcMan = G4Lambda::Lambda()->GetProcessManager();
   aProcMan->AddDiscreteProcess( theLambdaInelastic );
 
+#if G4VERSION_NUMBER < 1100
   theAntiLambdaInelastic = new G4AntiLambdaInelasticProcess();
+#else
+  theAntiLambdaInelastic = new G4HadronInelasticProcess( "AntiLambdaInelastic", G4AntiLambda::Definition() );
+#endif
   theAntiLambdaInelastic->RegisterMe( theModel3 );
   theAntiLambdaInelastic->AddDataSet( theChipsHyperonInelasticXS );
   aProcMan = G4AntiLambda::AntiLambda()->GetProcessManager();
   aProcMan->AddDiscreteProcess( theAntiLambdaInelastic );
 
+#if G4VERSION_NUMBER < 1100
   theSigmaMinusInelastic = new G4SigmaMinusInelasticProcess();
+#else
+  theSigmaMinusInelastic = new G4HadronInelasticProcess( "SigmaMinusInelastic", G4SigmaMinus::Definition() );
+#endif
   theSigmaMinusInelastic->RegisterMe( theModel2 );
   theSigmaMinusInelastic->RegisterMe( theBertini2 );
   theSigmaMinusInelastic->AddDataSet( theChipsHyperonInelasticXS );
   aProcMan = G4SigmaMinus::SigmaMinus()->GetProcessManager();
   aProcMan->AddDiscreteProcess( theSigmaMinusInelastic );
 
+#if G4VERSION_NUMBER < 1100
   theAntiSigmaMinusInelastic = new G4AntiSigmaMinusInelasticProcess();
+#else
+  theAntiSigmaMinusInelastic = new G4HadronInelasticProcess( "AntiSigmaMinusInelastic", G4AntiSigmaMinus::Definition() );
+#endif
   theAntiSigmaMinusInelastic->RegisterMe( theModel3 );
   theAntiSigmaMinusInelastic->AddDataSet( theChipsHyperonInelasticXS );
   aProcMan = G4AntiSigmaMinus::AntiSigmaMinus()->GetProcessManager();
   aProcMan->AddDiscreteProcess( theAntiSigmaMinusInelastic );
 
+#if G4VERSION_NUMBER < 1100
   theSigmaPlusInelastic = new G4SigmaPlusInelasticProcess();
+#else
+  theSigmaPlusInelastic = new G4HadronInelasticProcess( "SigmaPlusInelastic", G4SigmaPlus::Definition() );
+#endif
   theSigmaPlusInelastic->RegisterMe( theModel2 );
   theSigmaPlusInelastic->RegisterMe( theBertini2 );
   theSigmaPlusInelastic->AddDataSet( theChipsHyperonInelasticXS );
   aProcMan = G4SigmaPlus::SigmaPlus()->GetProcessManager();
   aProcMan->AddDiscreteProcess( theSigmaPlusInelastic );
 
+#if G4VERSION_NUMBER < 1100
   theAntiSigmaPlusInelastic = new G4AntiSigmaPlusInelasticProcess();
+#else
+  theAntiSigmaPlusInelastic = new G4HadronInelasticProcess( "AntiSigmaPlusInelastic", G4AntiSigmaPlus::Definition() );
+#endif
   theAntiSigmaPlusInelastic->RegisterMe( theModel3 );
   theAntiSigmaPlusInelastic->AddDataSet( theChipsHyperonInelasticXS );
   aProcMan = G4AntiSigmaPlus::AntiSigmaPlus()->GetProcessManager();
   aProcMan->AddDiscreteProcess( theAntiSigmaPlusInelastic );
 
+#if G4VERSION_NUMBER < 1100
   theXiMinusInelastic = new G4XiMinusInelasticProcess();
+#else
+  theXiMinusInelastic = new G4HadronInelasticProcess( "XiMinusInelastic", G4XiMinus::Definition() );
+#endif
   theXiMinusInelastic->RegisterMe( theModel2 );
   theXiMinusInelastic->RegisterMe( theBertini2 );
   theXiMinusInelastic->AddDataSet( theChipsHyperonInelasticXS );
   aProcMan = G4XiMinus::XiMinus()->GetProcessManager();
   aProcMan->AddDiscreteProcess( theXiMinusInelastic );
 
+#if G4VERSION_NUMBER < 1100
   theAntiXiMinusInelastic = new G4AntiXiMinusInelasticProcess();
+#else
+  theAntiXiMinusInelastic = new G4HadronInelasticProcess( "AntiXiMinusInelastic", G4AntiXiMinus::Definition() );
+#endif
   theAntiXiMinusInelastic->RegisterMe( theModel3 );
   theAntiXiMinusInelastic->AddDataSet( theChipsHyperonInelasticXS );
   aProcMan = G4AntiXiMinus::AntiXiMinus()->GetProcessManager();
   aProcMan->AddDiscreteProcess( theAntiXiMinusInelastic );
 
+#if G4VERSION_NUMBER < 1100
   theXiZeroInelastic = new G4XiZeroInelasticProcess();
+#else
+  theXiZeroInelastic = new G4HadronInelasticProcess( "XiZeroInelastic", G4XiZero::Definition() );
+#endif
   theXiZeroInelastic->RegisterMe( theModel2 );
   theXiZeroInelastic->RegisterMe( theBertini2 );
   theXiZeroInelastic->AddDataSet( theChipsHyperonInelasticXS );
   aProcMan = G4XiZero::XiZero()->GetProcessManager();
   aProcMan->AddDiscreteProcess( theXiZeroInelastic );
 
+#if G4VERSION_NUMBER < 1100
   theAntiXiZeroInelastic = new G4AntiXiZeroInelasticProcess();
+#else
+  theAntiXiZeroInelastic = new G4HadronInelasticProcess( "AntiXiZeroInelastic", G4AntiXiZero::Definition() );
+#endif
   theAntiXiZeroInelastic->RegisterMe( theModel3 );
   theAntiXiZeroInelastic->AddDataSet( theChipsHyperonInelasticXS );
   aProcMan = G4AntiXiZero::AntiXiZero()->GetProcessManager();
   aProcMan->AddDiscreteProcess( theAntiXiZeroInelastic );
 
+#if G4VERSION_NUMBER < 1100
   theOmegaMinusInelastic = new G4OmegaMinusInelasticProcess();
+#else
+  theOmegaMinusInelastic = new G4HadronInelasticProcess( "OmegaMinusInelastic", G4OmegaMinus::Definition() );
+#endif
   theOmegaMinusInelastic->RegisterMe( theModel2 );
   theOmegaMinusInelastic->RegisterMe( theBertini2 );
   theOmegaMinusInelastic->AddDataSet( theChipsHyperonInelasticXS );
   aProcMan = G4OmegaMinus::OmegaMinus()->GetProcessManager();
   aProcMan->AddDiscreteProcess( theOmegaMinusInelastic );
 
+#if G4VERSION_NUMBER < 1100
   theAntiOmegaMinusInelastic = new G4AntiOmegaMinusInelasticProcess();
+#else
+  theAntiOmegaMinusInelastic = new G4HadronInelasticProcess( "AntiOmegaMinusInelastic", G4AntiOmegaMinus::Definition() );
+#endif
   theAntiOmegaMinusInelastic->RegisterMe( theModel3 );
   theAntiOmegaMinusInelastic->AddDataSet( theChipsHyperonInelasticXS );
   aProcMan = G4AntiOmegaMinus::AntiOmegaMinus()->GetProcessManager();
   aProcMan->AddDiscreteProcess( theAntiOmegaMinusInelastic );
 
+#if G4VERSION_NUMBER < 1100
   theAntiProtonInelastic = new G4AntiProtonInelasticProcess();
+#else
+  theAntiProtonInelastic = new G4HadronInelasticProcess( "AntiProtonInelastic", G4AntiProton::Definition() );
+#endif
   theAntiProtonInelastic->RegisterMe( theModel3 );
   theAntiProtonInelastic->AddDataSet( theAntiNucleonXS );
   aProcMan = G4AntiProton::AntiProton()->GetProcessManager();
   aProcMan->AddDiscreteProcess( theAntiProtonInelastic );
 
+#if G4VERSION_NUMBER < 1100
   theAntiNeutronInelastic = new G4AntiNeutronInelasticProcess();
+#else
+  theAntiNeutronInelastic = new G4HadronInelasticProcess( "AntiNeutronInelastic", G4AntiNeutron::Definition() );
+#endif
   theAntiNeutronInelastic->RegisterMe( theModel3 );
   theAntiNeutronInelastic->AddDataSet( theAntiNucleonXS );
   aProcMan = G4AntiNeutron::AntiNeutron()->GetProcessManager();
   aProcMan->AddDiscreteProcess( theAntiNeutronInelastic );
 
+#if G4VERSION_NUMBER < 1100
   theAntiDeuteronInelastic = new G4AntiDeuteronInelasticProcess();
+#else
+  theAntiDeuteronInelastic = new G4HadronInelasticProcess( "AntiDeuteronInelastic", G4AntiDeuteron::Definition() );
+#endif
   theAntiDeuteronInelastic->RegisterMe( theModel3 );
   theAntiDeuteronInelastic->AddDataSet( theAntiNucleonXS );
   aProcMan = G4AntiDeuteron::AntiDeuteron()->GetProcessManager();
   aProcMan->AddDiscreteProcess( theAntiDeuteronInelastic );
 
+#if G4VERSION_NUMBER < 1100
   theAntiTritonInelastic = new G4AntiTritonInelasticProcess();
+#else
+  theAntiTritonInelastic = new G4HadronInelasticProcess( "AntiTritonInelastic", G4AntiTriton::Definition() );
+#endif
   theAntiTritonInelastic->RegisterMe( theModel3 );
   theAntiTritonInelastic->AddDataSet( theAntiNucleonXS );
   aProcMan = G4AntiTriton::AntiTriton()->GetProcessManager();
   aProcMan->AddDiscreteProcess( theAntiTritonInelastic );
 
+#if G4VERSION_NUMBER < 1100
   theAntiHe3Inelastic = new G4AntiHe3InelasticProcess();
+#else
+  theAntiHe3Inelastic = new G4HadronInelasticProcess( "AntiHe3Inelastic", G4AntiHe3::Definition() );
+#endif
   theAntiHe3Inelastic->RegisterMe( theModel3 );
   theAntiHe3Inelastic->AddDataSet( theAntiNucleonXS );
   aProcMan = G4AntiHe3::AntiHe3()->GetProcessManager();
   aProcMan->AddDiscreteProcess( theAntiHe3Inelastic );
 
+#if G4VERSION_NUMBER < 1100
   theAntiAlphaInelastic = new G4AntiAlphaInelasticProcess();
+#else
+  theAntiAlphaInelastic = new G4HadronInelasticProcess( "AntiAlphaInelastic", G4AntiAlpha::Definition() );
+#endif
   theAntiAlphaInelastic->RegisterMe( theModel3 );
   theAntiAlphaInelastic->AddDataSet( theAntiNucleonXS );
   aProcMan = G4AntiAlpha::AntiAlpha()->GetProcessManager();
diff --git a/Simulation/G4Utilities/G4PhysicsLists/src/hadronicVariations/G4AtlasHadronPhysicsFTFP_BERT_ATL_noDiffraction.hh b/Simulation/G4Utilities/G4PhysicsLists/src/hadronicVariations/G4AtlasHadronPhysicsFTFP_BERT_ATL_noDiffraction.hh
index 73fc6faa301d6bcadc7dfdb40a01990db1426541..4fbc2206f8ffd10b34ce8e79fa616e997b21decd 100644
--- a/Simulation/G4Utilities/G4PhysicsLists/src/hadronicVariations/G4AtlasHadronPhysicsFTFP_BERT_ATL_noDiffraction.hh
+++ b/Simulation/G4Utilities/G4PhysicsLists/src/hadronicVariations/G4AtlasHadronPhysicsFTFP_BERT_ATL_noDiffraction.hh
@@ -40,6 +40,7 @@
 #ifndef G4AtlasHadronPhysicsFTFP_BERT_ATL_noDiffraction_h
 #define G4AtlasHadronPhysicsFTFP_BERT_ATL_noDiffraction_h 1
 
+#include "G4Version.hh"
 #include "globals.hh"
 #include "G4ios.hh"
 
@@ -57,9 +58,13 @@
 #include "G4QuasiElasticChannel.hh"
 #include "G4CascadeInterface.hh"
 
-#include "G4HadronFissionProcess.hh"
+#if G4VERSION_NUMBER < 1100
 #include "G4HadronCaptureProcess.hh"
+#else
+#include "G4NeutronCaptureProcess.hh"
+#endif
 
+#if G4VERSION_NUMBER < 1100
 #include "G4NeutronInelasticProcess.hh"
 #include "G4ProtonInelasticProcess.hh"
 #include "G4PionMinusInelasticProcess.hh"
@@ -81,7 +86,6 @@
 #include "G4AntiXiMinusInelasticProcess.hh"
 #include "G4OmegaMinusInelasticProcess.hh"
 #include "G4AntiOmegaMinusInelasticProcess.hh"
-
 #include "G4AntiProtonInelasticProcess.hh"
 #include "G4AntiNeutronInelasticProcess.hh"
 #include "G4AntiDeuteronInelasticProcess.hh"
@@ -89,6 +93,10 @@
 #include "G4AntiHe3InelasticProcess.hh"
 #include "G4AntiAlphaInelasticProcess.hh"
 
+#else
+#include "G4HadronInelasticProcess.hh"
+#endif
+
 #include "G4ChipsHyperonInelasticXS.hh"
 
 
@@ -121,8 +129,13 @@ class G4AtlasHadronPhysicsFTFP_BERT_ATL_noDiffraction : public G4VPhysicsConstru
     G4CascadeInterface * theBertini1;
     G4CascadeInterface * theBertini2;
 
+#if G4VERSION_NUMBER < 1100
     G4HadronCaptureProcess * theNeutronCaptureProcess;
+#else
+    G4NeutronCaptureProcess * theNeutronCaptureProcess;
+#endif
 
+#if G4VERSION_NUMBER < 1100
     G4NeutronInelasticProcess *   theNeutronInelastic;
     G4ProtonInelasticProcess *    theProtonInelastic;
     G4PionMinusInelasticProcess * thePionMinusInelastic;
@@ -151,8 +164,40 @@ class G4AtlasHadronPhysicsFTFP_BERT_ATL_noDiffraction : public G4VPhysicsConstru
     G4AntiTritonInelasticProcess *   theAntiTritonInelastic;
     G4AntiHe3InelasticProcess *      theAntiHe3Inelastic;
     G4AntiAlphaInelasticProcess *    theAntiAlphaInelastic;
+#else
+    G4HadronInelasticProcess *theNeutronInelastic;
+    G4HadronInelasticProcess *theProtonInelastic;
+    G4HadronInelasticProcess *thePionMinusInelastic;
+    G4HadronInelasticProcess *thePionPlusInelastic;
+    G4HadronInelasticProcess *theKaonMinusInelastic;
+    G4HadronInelasticProcess *theKaonPlusInelastic;
+    G4HadronInelasticProcess *theKaonZeroLInelastic;
+    G4HadronInelasticProcess *theKaonZeroSInelastic;
+
+    G4HadronInelasticProcess *theLambdaInelastic;
+    G4HadronInelasticProcess *theAntiLambdaInelastic;
+    G4HadronInelasticProcess *theSigmaMinusInelastic;
+    G4HadronInelasticProcess *theAntiSigmaMinusInelastic;
+    G4HadronInelasticProcess *theSigmaPlusInelastic;
+    G4HadronInelasticProcess *theAntiSigmaPlusInelastic;
+    G4HadronInelasticProcess *theXiZeroInelastic;
+    G4HadronInelasticProcess *theAntiXiZeroInelastic;
+    G4HadronInelasticProcess *theXiMinusInelastic;
+    G4HadronInelasticProcess *theAntiXiMinusInelastic;
+    G4HadronInelasticProcess *theOmegaMinusInelastic;
+    G4HadronInelasticProcess *theAntiOmegaMinusInelastic;
+
+    G4HadronInelasticProcess *theAntiProtonInelastic;
+    G4HadronInelasticProcess *theAntiNeutronInelastic;
+    G4HadronInelasticProcess *theAntiDeuteronInelastic;
+    G4HadronInelasticProcess *theAntiTritonInelastic;
+    G4HadronInelasticProcess *theAntiHe3Inelastic;
+    G4HadronInelasticProcess *theAntiAlphaInelastic;
+
+#endif
 
-    G4VCrossSectionDataSet * thePiXS;
+    G4VCrossSectionDataSet * thePiPlusXS;
+    G4VCrossSectionDataSet * thePiMinusXS;
     G4VCrossSectionDataSet * theChipsHyperonInelasticXS;
     G4VCrossSectionDataSet * theAntiNucleonXS;
     G4VCrossSectionDataSet * theChipsKaonMinusXS;
diff --git a/Simulation/G4Utilities/G4PhysicsLists/src/hadronicVariations/G4AtlasHadronPhysicsFTFP_BERT_ATL_rescattering.cc b/Simulation/G4Utilities/G4PhysicsLists/src/hadronicVariations/G4AtlasHadronPhysicsFTFP_BERT_ATL_rescattering.cc
index 1a894d11cf5246b7ee7f62f07894c53fb68307d4..b832258ca86dd27490ad108ccfd3732d16cf24cf 100644
--- a/Simulation/G4Utilities/G4PhysicsLists/src/hadronicVariations/G4AtlasHadronPhysicsFTFP_BERT_ATL_rescattering.cc
+++ b/Simulation/G4Utilities/G4PhysicsLists/src/hadronicVariations/G4AtlasHadronPhysicsFTFP_BERT_ATL_rescattering.cc
@@ -39,6 +39,7 @@
 
 #include "G4AtlasHadronPhysicsFTFP_BERT_ATL_rescattering.hh"
 
+#include "G4Version.hh"
 #include "globals.hh"
 #include "G4ios.hh"
 #include "G4SystemOfUnits.hh"
@@ -54,7 +55,11 @@
 #include "G4ChipsKaonZeroInelasticXS.hh"
 #include "G4CrossSectionDataSetRegistry.hh"
 
+#if G4VERSION_NUMBER < 1100
 #include "G4HadronCaptureProcess.hh"
+#else
+#include "G4NeutronCaptureProcess.hh"
+#endif
 #include "G4NeutronRadCapture.hh"
 #include "G4NeutronInelasticXS.hh"
 #include "G4NeutronCaptureXS.hh"
@@ -237,7 +242,11 @@ void G4AtlasHadronPhysicsFTFP_BERT_ATL_rescattering::ConstructProcess()
     }
   }
   if ( ! capture ) {
+#if G4VERSION_NUMBER < 1100
     capture = new G4HadronCaptureProcess("nCapture");
+#else
+    capture = new G4NeutronCaptureProcess("nCapture");
+#endif
     pmanager->AddDiscreteProcess(capture);
   }
   tpdata->xsNeutronCaptureXS = (G4NeutronCaptureXS*)G4CrossSectionDataSetRegistry::Instance()->GetCrossSectionDataSet(G4NeutronCaptureXS::Default_Name());
diff --git a/Simulation/G4Utilities/G4PhysicsLists/src/hadronicVariations/G4AtlasHadronPhysicsFTFP_BERT_BIC_ATL.cc b/Simulation/G4Utilities/G4PhysicsLists/src/hadronicVariations/G4AtlasHadronPhysicsFTFP_BERT_BIC_ATL.cc
index 54ed6b4dae7ab51f53900bd4a7ae4c1761525251..7637bf8076fa29778acec0bde3fbd909f99a8cad 100644
--- a/Simulation/G4Utilities/G4PhysicsLists/src/hadronicVariations/G4AtlasHadronPhysicsFTFP_BERT_BIC_ATL.cc
+++ b/Simulation/G4Utilities/G4PhysicsLists/src/hadronicVariations/G4AtlasHadronPhysicsFTFP_BERT_BIC_ATL.cc
@@ -39,6 +39,7 @@
 
 #include "G4AtlasHadronPhysicsFTFP_BERT_BIC_ATL.hh"
 
+#include "G4Version.hh"
 #include "globals.hh"
 #include "G4ios.hh"
 #include "G4SystemOfUnits.hh"
@@ -54,7 +55,11 @@
 #include "G4ChipsKaonZeroInelasticXS.hh"
 #include "G4CrossSectionDataSetRegistry.hh"
 
+#if G4VERSION_NUMBER < 1100
 #include "G4HadronCaptureProcess.hh"
+#else
+#include "G4NeutronCaptureProcess.hh"
+#endif
 #include "G4NeutronRadCapture.hh"
 #include "G4NeutronInelasticXS.hh"
 #include "G4NeutronCaptureXS.hh"
@@ -264,7 +269,11 @@ void G4AtlasHadronPhysicsFTFP_BERT_BIC_ATL::ConstructProcess()
     }
   }
   if ( ! capture ) {
+#if G4VERSION_NUMBER < 1100
     capture = new G4HadronCaptureProcess("nCapture");
+#else
+    capture = new G4NeutronCaptureProcess("nCapture");
+#endif
     pmanager->AddDiscreteProcess(capture);
   }
   tpdata->xsNeutronCaptureXS = (G4NeutronCaptureXS*)G4CrossSectionDataSetRegistry::Instance()->GetCrossSectionDataSet(G4NeutronCaptureXS::Default_Name());
diff --git a/Simulation/G4Utilities/G4PhysicsLists/src/hadronicVariations/G4AtlasHadronPhysicsQGSP_FTFP_BERT_ATL.cc b/Simulation/G4Utilities/G4PhysicsLists/src/hadronicVariations/G4AtlasHadronPhysicsQGSP_FTFP_BERT_ATL.cc
index d40ec7128f12901e9def8122de7a9b9a82f91ee7..5b6dfd206fba0a88b418965ed7fbbd9399ffd542 100644
--- a/Simulation/G4Utilities/G4PhysicsLists/src/hadronicVariations/G4AtlasHadronPhysicsQGSP_FTFP_BERT_ATL.cc
+++ b/Simulation/G4Utilities/G4PhysicsLists/src/hadronicVariations/G4AtlasHadronPhysicsQGSP_FTFP_BERT_ATL.cc
@@ -39,6 +39,7 @@
 
 #include "G4AtlasHadronPhysicsQGSP_FTFP_BERT_ATL.hh"
 
+#include "G4Version.hh"
 #include "globals.hh"
 #include "G4ios.hh"
 #include "G4SystemOfUnits.hh"
@@ -54,7 +55,11 @@
 #include "G4ChipsKaonZeroInelasticXS.hh"
 #include "G4CrossSectionDataSetRegistry.hh"
 
+#if G4VERSION_NUMBER < 1100
 #include "G4HadronCaptureProcess.hh"
+#else
+#include "G4NeutronCaptureProcess.hh"
+#endif
 #include "G4NeutronRadCapture.hh"
 #include "G4NeutronInelasticXS.hh"
 #include "G4NeutronCaptureXS.hh"
@@ -255,7 +260,11 @@ void G4AtlasHadronPhysicsQGSP_FTFP_BERT_ATL::ConstructProcess()
     }
   }
   if ( ! capture ) {
+#if G4VERSION_NUMBER < 1100
     capture = new G4HadronCaptureProcess("nCapture");
+#else
+    capture = new G4NeutronCaptureProcess("nCapture");
+#endif
     pmanager->AddDiscreteProcess(capture);
   }
   tpdata->xsNeutronCaptureXS = (G4NeutronCaptureXS*)G4CrossSectionDataSetRegistry::Instance()->GetCrossSectionDataSet(G4NeutronCaptureXS::Default_Name());
diff --git a/Simulation/G4Utilities/G4ProfilingTools/src/TestActionTimer.cxx b/Simulation/G4Utilities/G4ProfilingTools/src/TestActionTimer.cxx
index 56978d37d49ce2851ed2ebca08073b4ba62c0fd6..bf40ab5dff739fb3ef9e1eb1403e090d513c3453 100644
--- a/Simulation/G4Utilities/G4ProfilingTools/src/TestActionTimer.cxx
+++ b/Simulation/G4Utilities/G4ProfilingTools/src/TestActionTimer.cxx
@@ -20,6 +20,7 @@
 
 #include "TestActionTimer.h"
 
+#include "G4Version.hh"
 #include "G4Run.hh"
 #include "G4Event.hh"
 #include "G4Step.hh"
@@ -41,6 +42,15 @@
 
 namespace G4UA
 {
+  // Helper for G4String changes
+  bool G4StrContains(const G4String& s, const char* v)
+  {
+#if G4VERSION_NUMBER < 1100
+    return s.contains(v);
+#else
+    return G4StrUtil::contains(s, v);
+#endif
+  }
 
   TestActionTimer::TestActionTimer()
     : m_report(),
@@ -259,95 +269,95 @@ namespace G4UA
   int TestActionTimer::ClassifyVolume( G4String& nom ) const
   {
     if( nom.length() >= 17 &&
-        nom(13,4) == "EMEC" ){
+        nom.substr(13,4) == "EMEC" ){
       return eEMEC;
     }
     else if ( nom.length() >= 16 &&
-              nom(13,3) == "EMB" ){
+              nom.substr(13,3) == "EMB" ){
       return eEMB;
     }
     else if( nom.length() >= 25 &&
-             nom(21,4) == "Cryo" ) {
+             nom.substr(21,4) == "Cryo" ) {
       return eCry;
     }
     else if( nom.length() >= 26 &&
-             nom(13,13) == "FCAL::Module1"){
+             nom.substr(13,13) == "FCAL::Module1"){
       return eFC1;
     }
     else if( nom.length() >= 25 &&
-             nom(13,12) == "FCAL::Module" ){
+             nom.substr(13,12) == "FCAL::Module" ){
       return eFC23;
     }
     else if ( nom.length() >= 17 &&
-              nom(13,4) == "FCAL" ){
+              nom.substr(13,4) == "FCAL" ){
       return eFCO;
     }
     else if ( nom.length() >= 16 &&
-              nom(13,3) == "HEC" ){
+              nom.substr(13,3) == "HEC" ){
       return eHEC;
     }
     else if( nom.length() >= 31 &&
-             nom(21,10) == "Presampler" ) {
+             nom.substr(21,10) == "Presampler" ) {
       return ePre;
     }
     else if ( nom.length() >= 3 &&
-              nom(0,3) == "LAr" ){
+              nom.substr(0,3) == "LAr" ){
       return eLAr;
     }
     else if( ( (nom.length() >= 4 &&
-                nom(0,4) == "Muon") ||
-               nom(0,4) == "MUON" ) ||
+                nom.substr(0,4) == "Muon") ||
+               nom.substr(0,4) == "MUON" ) ||
              ( nom.length() >= 9 &&
-               nom(0,9) == "DriftTube" ) ||
-             nom.contains("MDT") ||
+               nom.substr(0,9) == "DriftTube" ) ||
+             G4StrContains(nom, "MDT") ||
              ( nom.length() >= 12 &&
-               nom(0,12) == "SensitiveGas" ) ||
-             nom.contains("MDT") ||
-             nom.contains("station") ){
+               nom.substr(0,12) == "SensitiveGas" ) ||
+             G4StrContains(nom, "MDT") ||
+             G4StrContains(nom, "station") ){
       return eMu;
     }
     else if ( nom.length() >= 8 &&
-              nom(0,8) == "ITkPixel" ){
+              nom.substr(0,8) == "ITkPixel" ){
       return eITkPix;
     }
     else if ( nom.length() >= 8 &&
-              nom(0,8) == "ITkStrip" ){
+              nom.substr(0,8) == "ITkStrip" ){
       return eITkStrip;
     }
     else if ((nom.length() >= 5 &&
-              nom(0,5) == "Pixel") ||
+              nom.substr(0,5) == "Pixel") ||
              nom == "Outside Barrel Service"){
       return ePx;
     }
     else if ( nom.length() >= 3 &&
-              nom(0,3) == "SCT" ){
+              nom.substr(0,3) == "SCT" ){
       return eSct;
     }
     else if ( ( nom.length() >= 3 &&
-                nom(0,3) == "TRT" ) ||
+                nom.substr(0,3) == "TRT" ) ||
               nom == "GasMANeg" ){
       return eTrt;
     }
     else if ( nom.length() >= 4 &&
-              nom(0,4) == "Tile"){
+              nom.substr(0,4) == "Tile"){
       return eHCB;
     }
     else if ( ( nom.length() >= 12 &&
-                nom(0,12) == "InDetServMat" ) ||
+                nom.substr(0,12) == "InDetServMat" ) ||
               ( nom.length() >= 4 &&
-                nom(0,4) == "IDET" ) ||
+                nom.substr(0,4) == "IDET" ) ||
               ( nom.length() >= 3 &&
-                nom(0,3) == "ITK" ) ||
+                nom.substr(0,3) == "ITK" ) ||
               ( nom.length() >= 8 &&
-                nom(0,8) == "BeamPipe" ) ||
+                nom.substr(0,8) == "BeamPipe" ) ||
               ( nom.length() >= 7 &&
-                nom(0,7) == "Section" ) ||
+                nom.substr(0,7) == "Section" ) ||
               ( nom.length() >= 3 &&
-                ( nom(0,3) == "BLM" ||
-                  nom(0,3) == "BCM" ||
-                  nom(0,3) == "PLR" ) ) ||
+                ( nom.substr(0,3) == "BLM" ||
+                  nom.substr(0,3) == "BCM" ||
+                  nom.substr(0,3) == "PLR" ) ) ||
               ( nom.length() >= 8 &&
-                nom(0,8) == "BCMPrime" ) ){
+                nom.substr(0,8) == "BCMPrime" ) ){
       return eSev;
     }
     return eOther;
diff --git a/Simulation/ISF/ISF_FastCaloSim/ISF_FastCaloSimServices/python/ISF_FastCaloSimJobProperties.py b/Simulation/ISF/ISF_FastCaloSim/ISF_FastCaloSimServices/python/ISF_FastCaloSimJobProperties.py
index 7bab54ef3a31ec689baf9e5881882bb956f87cb2..4a1f52dd1fb1a663b58f41e50182b4fe793f9226 100644
--- a/Simulation/ISF/ISF_FastCaloSim/ISF_FastCaloSimServices/python/ISF_FastCaloSimJobProperties.py
+++ b/Simulation/ISF/ISF_FastCaloSim/ISF_FastCaloSimServices/python/ISF_FastCaloSimJobProperties.py
@@ -78,37 +78,37 @@ class PunchThroughParamsInputFilename(JobProperty):
     """ Filename of the muon punch through input parametrizations file. """
     statusOn     = True
     allowedTypes = ['str']
-    StoredValue  = 'FastCaloSim/MC16/TFCSparam_mpt_v05.root'
+    StoredValue  = 'FastCaloSim/MC23/TFCSparam_mpt_v06.root'
 
 class PunchThroughParamsInverseCdfFilename(JobProperty):
     """ Filename of the muon punch through param inverse cdf config. """
     statusOn     = True
     allowedTypes = ['str']
-    StoredValue  = 'FastCaloSim/MC16/TFCSparam_mpt_inverseCdf_v02.xml'
+    StoredValue  = 'FastCaloSim/MC23/TFCSparam_mpt_inverseCdf_v03.xml'
 
 class PunchThroughParamsInversePcaFilename(JobProperty):
     """ Filename of the muon punch through param inverse pca config. """
     statusOn     = True
     allowedTypes = ['str']
-    StoredValue  = 'FastCaloSim/MC16/TFCSparam_mpt_inversePca_v02.xml'
+    StoredValue  = 'FastCaloSim/MC23/TFCSparam_mpt_inversePca_v03.xml'
 
 class PunchThroughClassifierScalerFilename(JobProperty):
     """ Filename of the muon punch through classifier input variable MinMaxScaler. """
     statusOn     = True
     allowedTypes = ['str']
-    StoredValue  = 'FastCaloSim/MC16/TFCSparam_mpt_classScaler_v02.xml'
+    StoredValue  = 'FastCaloSim/MC23/TFCSparam_mpt_classScaler_v03.xml'
 
 class PunchThroughClassifierNetworkFilename(JobProperty):
     """ Filename of the muon punch through classifier neural network. """
     statusOn     = True
     allowedTypes = ['str']
-    StoredValue  = 'FastCaloSim/MC16/TFCSparam_mpt_classNet_v02.json'
+    StoredValue  = 'FastCaloSim/MC23/TFCSparam_mpt_classNet_v03.json'
 
 class PunchThroughClassifierCalibratorFilename(JobProperty):
     """ Filename of the muon punch through classifier calibrator. """
     statusOn     = True
     allowedTypes = ['str']
-    StoredValue  = 'FastCaloSim/MC16/TFCSparam_mpt_classCalib_v02.xml'
+    StoredValue  = 'FastCaloSim/MC23/TFCSparam_mpt_classCalib_v03.xml'
 ##-----------------------------------------------------------------------------
 ## 2nd step
 ## Definition of the InDet flag container
diff --git a/Simulation/ISF/ISF_FastCaloSim/ISF_FastCaloSimServices/python/ISF_FastCaloSimServicesConfig.py b/Simulation/ISF/ISF_FastCaloSim/ISF_FastCaloSimServices/python/ISF_FastCaloSimServicesConfig.py
index 4351aad7e2a98950f25db2fb7c5934dc76b2d63c..9ad4f0e1b3b23ef37f1660338fcffd2746dc57d3 100644
--- a/Simulation/ISF/ISF_FastCaloSim/ISF_FastCaloSimServices/python/ISF_FastCaloSimServicesConfig.py
+++ b/Simulation/ISF/ISF_FastCaloSim/ISF_FastCaloSimServices/python/ISF_FastCaloSimServicesConfig.py
@@ -17,9 +17,9 @@ from FastCaloSim.FastCaloSimFactoryNew import (NITimedExtrapolatorCfg,
 
 def PunchThroughClassifierCfg(flags, name="ISF_PunchThroughClassifier", **kwargs):
     acc = ComponentAccumulator()
-    kwargs.setdefault("ScalerConfigFileName"     , "FastCaloSim/MC16/TFCSparam_mpt_classScaler_v02.xml" )
-    kwargs.setdefault("NetworkConfigFileName"     , "FastCaloSim/MC16/TFCSparam_mpt_classNet_v02.json" )
-    kwargs.setdefault("CalibratorConfigFileName"    , "FastCaloSim/MC16/TFCSparam_mpt_classCalib_v02.xml")
+    kwargs.setdefault("ScalerConfigFileName"     , "FastCaloSim/MC23/TFCSparam_mpt_classScaler_v03.xml" )
+    kwargs.setdefault("NetworkConfigFileName"     , "FastCaloSim/MC23/TFCSparam_mpt_classNet_v03.json" )
+    kwargs.setdefault("CalibratorConfigFileName"    , "FastCaloSim/MC23/TFCSparam_mpt_classCalib_v03.xml")
     acc.setPrivateTools(CompFactory.ISF.PunchThroughClassifier(name, **kwargs))
     return acc
 
@@ -34,9 +34,9 @@ def PunchThroughToolCfg(flags, name="ISF_PunchThroughTool", **kwargs):
         acc.addPublicTool(PT_classifier)
         kwargs.setdefault("PunchThroughClassifier", acc.getPublicTool(PT_classifier.name))
 
-    kwargs.setdefault("FilenameLookupTable"     , "FastCaloSim/MC16/TFCSparam_mpt_v05.root")
-    kwargs.setdefault("FilenameInverseCdf"      , "FastCaloSim/MC16/TFCSparam_mpt_inverseCdf_v02.xml")
-    kwargs.setdefault("FilenameInversePca"      , "FastCaloSim/MC16/TFCSparam_mpt_inversePca_v02.xml")
+    kwargs.setdefault("FilenameLookupTable"     , "FastCaloSim/MC23/TFCSparam_mpt_v06.root")
+    kwargs.setdefault("FilenameInverseCdf"      , "FastCaloSim/MC23/TFCSparam_mpt_inverseCdf_v03.xml")
+    kwargs.setdefault("FilenameInversePca"      , "FastCaloSim/MC23/TFCSparam_mpt_inversePca_v03.xml")
     kwargs.setdefault("PunchThroughInitiators"  , [ 211, 321, 311, 310, 130, 2212, 2112]        )
     kwargs.setdefault("InitiatorsMinEnergy"     , [ 65536, 65536, 65536, 65536, 65536, 65536, 65536]                                         )
     kwargs.setdefault("InitiatorsEtaRange"      , [ -3.2,   3.2 ]                               )
diff --git a/Simulation/ISF/ISF_FastCaloSim/ISF_PunchThroughTools/src/PunchThroughTool.cxx b/Simulation/ISF/ISF_FastCaloSim/ISF_PunchThroughTools/src/PunchThroughTool.cxx
index aa2a65d7f890c5851c2210b9925101368adc6d86..5bd562c99b9c08696afc7b2af322f360796bdb9e 100644
--- a/Simulation/ISF/ISF_FastCaloSim/ISF_PunchThroughTools/src/PunchThroughTool.cxx
+++ b/Simulation/ISF/ISF_FastCaloSim/ISF_PunchThroughTools/src/PunchThroughTool.cxx
@@ -116,6 +116,13 @@ StatusCode ISF::PunchThroughTool::initialize()
     return StatusCode::FAILURE;
   }
 
+  //check size of infoMap for both PCA and CDF, they should be equal
+  if (!(m_xml_info_pca.size() == m_xml_info_cdf.size()))
+  {
+    ATH_MSG_WARNING("[ punchthrough ] size of infoMap for PCA and CDF differs! Something is wrong with input xml files.");
+    return StatusCode::FAILURE;
+  }
+
   // retrieve the ParticleProperties handle
   ATH_CHECK( m_particlePropSvc.retrieve() );
 
@@ -593,6 +600,11 @@ ISF::ISFParticle *ISF::PunchThroughTool::getOneParticle(const ISF::ISFParticle &
   // get a local copy of the needed punch-through particle class
   PunchThroughParticle *p = m_particles.at(pdg);
 
+  // (0.) get the pca / cdf group based on pdgId and eta, eta times 100, e.g eta -4 to 4 is from eta -400 to 400
+  int pcaCdfIterator = passedParamIterator(pdg, interpEta*100, m_xml_info_pca); //pca and cdf info should be of same size
+
+  ATH_MSG_DEBUG("[punchthrough] passedPCAIterator ==> passedParamIterator = "<< pcaCdfIterator <<" , pdg = "<< pdg <<" , interpEnergy = "<< interpEnergy <<" MeV, interpEta(*100) = "<< interpEta*100);
+
   // (1.) decide if we create a particle or an anti-particle
   int anti = 1;
   if ( p->getdoAnti() )
@@ -641,13 +653,13 @@ ISF::ISFParticle *ISF::PunchThroughTool::getOneParticle(const ISF::ISFParticle &
       principal_components.push_back(principal_component_3);
       principal_components.push_back(principal_component_4);
 
-      transformed_variables = inversePCA(principal_components);
+      transformed_variables = inversePCA(pcaCdfIterator,principal_components);
 
-      energy = inverseCdfTransform(transformed_variables.at(0), m_variable0_inverse_cdf);
-      deltaTheta = inverseCdfTransform(transformed_variables.at(1), m_variable1_inverse_cdf);
-      deltaPhi = inverseCdfTransform(transformed_variables.at(2), m_variable2_inverse_cdf);
-      momDeltaTheta = inverseCdfTransform(transformed_variables.at(3), m_variable3_inverse_cdf);
-      momDeltaPhi = inverseCdfTransform(transformed_variables.at(4), m_variable4_inverse_cdf);
+      energy = inverseCdfTransform(transformed_variables.at(0), m_variable0_inverse_cdf[pcaCdfIterator]);
+      deltaTheta = inverseCdfTransform(transformed_variables.at(1), m_variable1_inverse_cdf[pcaCdfIterator]);
+      deltaPhi = inverseCdfTransform(transformed_variables.at(2), m_variable2_inverse_cdf[pcaCdfIterator]);
+      momDeltaTheta = inverseCdfTransform(transformed_variables.at(3), m_variable3_inverse_cdf[pcaCdfIterator]);
+      momDeltaPhi = inverseCdfTransform(transformed_variables.at(4), m_variable4_inverse_cdf[pcaCdfIterator]);
 
       ATH_MSG_DEBUG("Transformed punch through kinematics: energy = "<< energy <<" MeV deltaTheta = "<< deltaTheta <<" deltaPhi = "<< deltaPhi <<" momDeltaTheta = "<< momDeltaTheta <<" momDeltaPhi = "<< momDeltaPhi );
 
@@ -735,56 +747,177 @@ std::vector<double> ISF::PunchThroughTool::dotProduct(const std::vector<std::vec
     return result;
 }
 
-std::vector<double> ISF::PunchThroughTool::inversePCA(std::vector<double> &variables) const
+std::vector<std::string> ISF::PunchThroughTool::str_to_list(std::string str)
 {
-    std::vector<double> transformed_variables = dotProduct(m_inverse_PCA_matrix, variables);
-
-    std::transform (transformed_variables.begin(), transformed_variables.end(), m_PCA_means.begin(), transformed_variables.begin(), std::plus<double>()); // + means
-
-    return transformed_variables;
+    std::vector<std::string> v;
+    std::stringstream ss(str); 
+    while (ss.good()) {
+        std::string substr;
+        std::getline(ss, substr, ',');
+        v.push_back(substr);
+    }
+    return v;
 }
 
-StatusCode ISF::PunchThroughTool::initializeInversePCA(const std::string & inversePCAConfigFile){
-
-    xmlDocPtr doc = xmlParseFile( inversePCAConfigFile.c_str() );
+int ISF::PunchThroughTool::passedParamIterator(int pid, double eta, std::vector<std::map<std::string, std::string>> mapvect)
+{
+    //convert the pid to absolute value and string for query
+    std::string pidStrSingle = std::to_string(std::abs(pid));
+    //initialize holder vector for pid string
+    std::vector<std::string> v;
+    //vector to hold filtered iterator of info mapvect
+    std::vector<int> elemNoForPid;
+    //STEP 1
+    //filter items matching pid first
+
+    for (unsigned int i = 0; i < mapvect.size(); i++){
+        std::string pidStr = mapvect[i].at("pidStr");
+        v = str_to_list(pidStr);        
+        if(std::find(v.begin(), v.end(),pidStrSingle)!=v.end()){
+            // create a vector of positions in map satisfying (in loop)
+            elemNoForPid.push_back(i);
+        }        
+    }
+    //STEP 2
+    //then from that vector find the map element
+    //loop again this time for each of the map element, loop over the different etamins and etamaxs
+    std::string etaMaxsStr, etaMinsStr;
+    std::vector<std::string> etaMinsVect, etaMaxsVect;
+    std::vector<int> matchedCondVect;
+    double etaMinToCompare, etaMaxToCompare;
+    for (unsigned int i = 0; i < elemNoForPid.size(); i++){
+        etaMinsStr = mapvect[elemNoForPid[i]].at("etaMins");
+        etaMaxsStr = mapvect[elemNoForPid[i]].at("etaMaxs");
+        etaMinsVect = str_to_list(etaMinsStr);
+        etaMaxsVect = str_to_list(etaMaxsStr);   
+        std::vector<std::tuple<double, double>> etaRangesVect;
+        for (unsigned int j = 0; j < etaMinsVect.size(); j++){ // assume size etaMinsVect == etaMaxsVect
+            etaRangesVect.push_back({std::stod(etaMinsVect[j]),std::stod(etaMaxsVect[j])});    
+        }
+        //make comparison
+        for (unsigned int k = 0; k < etaRangesVect.size(); k++){ // assume size etaMinsVect == etaMaxsVect
+          etaMinToCompare = std::get<0>(etaRangesVect[k]);
+          etaMaxToCompare = std::get<1>(etaRangesVect[k]);
+          if((eta >= etaMinToCompare) && (eta < etaMaxToCompare)){
+            //PASS CONDITION
+            //then choose the passing one and note it's iterator
+            matchedCondVect.push_back(elemNoForPid[i]); //in case more than 1 match (ambiguous case)
+          }
+        }
+    }
+    //STEP 3
+    //always take the first element in the mapvect as the pca (in case it is ambiguos)
+    int matchedIt; //matchedIterator
+    if((matchedCondVect.size() >= 1)){
+      matchedIt = matchedCondVect[0];
+    }
+    //if none found, set the iterator to the first (provided pca is not empty)
+    else{
+      //FAIL CONDITION
+      matchedIt = 0;      
+    }
+    //return the match
+    return matchedIt;
+}
 
-    ATH_MSG_INFO( "[ punchthrough ] Loading inversePCA: " << inversePCAConfigFile);
+std::vector<std::map<std::string, std::string>> ISF::PunchThroughTool::getInfoMap(std::string mainNode, const std::string &xmlFilePath){
+    std::vector<std::map<std::string, std::string>>  xml_info;
+    xmlDocPtr doc = xmlParseFile( xmlFilePath.c_str() );
 
+    //check info first
     for( xmlNodePtr nodeRoot = doc->children; nodeRoot != nullptr; nodeRoot = nodeRoot->next) {
+        if (xmlStrEqual( nodeRoot->name, BAD_CAST mainNode.c_str() )) {
+            for( xmlNodePtr nodeRootChild = nodeRoot->children; nodeRootChild != nullptr; nodeRootChild = nodeRootChild->next ) {
+                if (xmlStrEqual( nodeRootChild->name, BAD_CAST "info" )) {
+                    if (nodeRootChild->children != NULL) {
+                        for( xmlNodePtr infoNode = nodeRootChild->children; infoNode != nullptr; infoNode = infoNode->next) {
+                            if(xmlStrEqual( infoNode->name, BAD_CAST "item" )){
+                                std::map<std::string, std::string>  xml_info_item;
+                                xml_info_item.insert({ "name", (const char*) xmlGetProp( infoNode, BAD_CAST "name" ) });
+                                xml_info_item.insert({ "etaMins", (const char*) xmlGetProp( infoNode, BAD_CAST "etaMins" ) });
+                                xml_info_item.insert({ "etaMaxs", (const char*) xmlGetProp( infoNode, BAD_CAST "etaMaxs" ) });
+                                xml_info_item.insert({ "pidStr", (const char*) xmlGetProp( infoNode, BAD_CAST "pidStr" ) });
+                                xml_info.push_back(xml_info_item);                                
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }
+    return xml_info;  
+}
 
-        if (xmlStrEqual( nodeRoot->name, BAD_CAST "PCAinverse" )) {
-            for( xmlNodePtr nodePCAinverse = nodeRoot->children; nodePCAinverse != nullptr; nodePCAinverse = nodePCAinverse->next ) {
-
-                if (xmlStrEqual( nodePCAinverse->name, BAD_CAST "PCAmatrix" )) {
+std::vector<double> ISF::PunchThroughTool::inversePCA(int pcaCdfIterator, std::vector<double> &variables) const
+{
+    std::vector<double> transformed_variables = dotProduct(m_inverse_PCA_matrix[pcaCdfIterator], variables);
 
-                    std::vector<double> PCA_matrix_row;
+    std::transform (transformed_variables.begin(), transformed_variables.end(), m_PCA_means[pcaCdfIterator].begin(), transformed_variables.begin(), std::plus<double>()); // + means
 
-                    PCA_matrix_row.push_back( atof( (const char*) xmlGetProp( nodePCAinverse, BAD_CAST "comp_0" ) ) );
-                    PCA_matrix_row.push_back( atof( (const char*) xmlGetProp( nodePCAinverse, BAD_CAST "comp_1" ) ) );
-                    PCA_matrix_row.push_back( atof( (const char*) xmlGetProp( nodePCAinverse, BAD_CAST "comp_2" ) ) );
-                    PCA_matrix_row.push_back( atof( (const char*) xmlGetProp( nodePCAinverse, BAD_CAST "comp_3" ) ) );
-                    PCA_matrix_row.push_back( atof( (const char*) xmlGetProp( nodePCAinverse, BAD_CAST "comp_4" ) ) );
+    return transformed_variables;
+}
 
-                    m_inverse_PCA_matrix.push_back(PCA_matrix_row);
+StatusCode ISF::PunchThroughTool::initializeInversePCA(const std::string & inversePCAConfigFile){
 
-                }
+    xmlDocPtr doc = xmlParseFile( inversePCAConfigFile.c_str() );
 
-                else if (xmlStrEqual( nodePCAinverse->name, BAD_CAST "PCAmeans" )) {
+    ATH_MSG_INFO( "[ punchthrough ] Loading inversePCA: " << inversePCAConfigFile);
 
-                    m_PCA_means.push_back( atof( (const char*) xmlGetProp( nodePCAinverse, BAD_CAST "mean_0" ) ) );
-                    m_PCA_means.push_back( atof( (const char*) xmlGetProp( nodePCAinverse, BAD_CAST "mean_1" ) ) );
-                    m_PCA_means.push_back( atof( (const char*) xmlGetProp( nodePCAinverse, BAD_CAST "mean_2" ) ) );
-                    m_PCA_means.push_back( atof( (const char*) xmlGetProp( nodePCAinverse, BAD_CAST "mean_3" ) ) );
-                    m_PCA_means.push_back( atof( (const char*) xmlGetProp( nodePCAinverse, BAD_CAST "mean_4" ) ) );
+    //check info first
+    m_xml_info_pca = getInfoMap("PCAinverse",inversePCAConfigFile.c_str());
+
+    //do the saving
+    for (unsigned int i = 0; i < m_xml_info_pca.size(); i++) {
+        std::vector<std::vector<double>> PCA_matrix;
+        ATH_MSG_DEBUG( "[ punchthrough ] m_xml_info_pca[" << i << "].at('name') = " << m_xml_info_pca[i].at("name"));
+
+        for( xmlNodePtr nodeRoot = doc->children; nodeRoot != nullptr; nodeRoot = nodeRoot->next) {
+            if (xmlStrEqual( nodeRoot->name, BAD_CAST "PCAinverse" )) {
+                for( xmlNodePtr nodePCAinverse = nodeRoot->children; nodePCAinverse != nullptr; nodePCAinverse = nodePCAinverse->next ) {
+
+                    if (xmlStrEqual( nodePCAinverse->name, BAD_CAST m_xml_info_pca[i].at("name").c_str() )) {
+                        if (nodePCAinverse->children != NULL) {
+                            for( xmlNodePtr pcaNode = nodePCAinverse->children; pcaNode != nullptr; pcaNode = pcaNode->next) {
+
+                                if (xmlStrEqual( pcaNode->name, BAD_CAST "PCAmatrix" )) {
+                                    std::vector<double> PCA_matrix_row;
+                                    PCA_matrix_row.push_back( atof( (const char*) xmlGetProp( pcaNode, BAD_CAST "comp_0" ) ) );
+                                    PCA_matrix_row.push_back( atof( (const char*) xmlGetProp( pcaNode, BAD_CAST "comp_1" ) ) );
+                                    PCA_matrix_row.push_back( atof( (const char*) xmlGetProp( pcaNode, BAD_CAST "comp_2" ) ) );
+                                    PCA_matrix_row.push_back( atof( (const char*) xmlGetProp( pcaNode, BAD_CAST "comp_3" ) ) );
+                                    PCA_matrix_row.push_back( atof( (const char*) xmlGetProp( pcaNode, BAD_CAST "comp_4" ) ) );
+                                    PCA_matrix.push_back(PCA_matrix_row);          
+                                }
+                                else if (xmlStrEqual( pcaNode->name, BAD_CAST "PCAmeans" )) {
+                                    std::vector<double> PCA_means_row;
+                                    PCA_means_row.push_back( atof( (const char*) xmlGetProp( pcaNode, BAD_CAST "mean_0" ) ) );
+                                    PCA_means_row.push_back( atof( (const char*) xmlGetProp( pcaNode, BAD_CAST "mean_1" ) ) );
+                                    PCA_means_row.push_back( atof( (const char*) xmlGetProp( pcaNode, BAD_CAST "mean_2" ) ) );
+                                    PCA_means_row.push_back( atof( (const char*) xmlGetProp( pcaNode, BAD_CAST "mean_3" ) ) );
+                                    PCA_means_row.push_back( atof( (const char*) xmlGetProp( pcaNode, BAD_CAST "mean_4" ) ) );
+                                    m_PCA_means.push_back(PCA_means_row);  
+                                }
+
+                            }
+
+                        }
+                    }
 
                 }
             }
         }
+        m_inverse_PCA_matrix.push_back(PCA_matrix);
     }
+    
     return StatusCode::SUCCESS;
 }
 
 StatusCode ISF::PunchThroughTool::initializeInverseCDF(const std::string & inverseCdfConfigFile){
+    std::map<double, double>  variable0_inverse_cdf_row;
+    std::map<double, double>  variable1_inverse_cdf_row;
+    std::map<double, double>  variable2_inverse_cdf_row;
+    std::map<double, double>  variable3_inverse_cdf_row;
+    std::map<double, double>  variable4_inverse_cdf_row;
 
     //parse xml that contains config for inverse CDF for each of punch through particle kinematics
 
@@ -792,28 +925,47 @@ StatusCode ISF::PunchThroughTool::initializeInverseCDF(const std::string & inver
 
     ATH_MSG_INFO( "[ punchthrough ] Loading inverse CDF: " << inverseCdfConfigFile);
 
-    for( xmlNodePtr nodeRoot = doc->children; nodeRoot != nullptr; nodeRoot = nodeRoot->next) {
-
-        if (xmlStrEqual( nodeRoot->name, BAD_CAST "CDFMappings" )) {
-            for( xmlNodePtr nodeMappings = nodeRoot->children; nodeMappings != nullptr; nodeMappings = nodeMappings->next ) {
-
-                if (xmlStrEqual( nodeMappings->name, BAD_CAST "variable0" )) {
-                    m_variable0_inverse_cdf = getVariableCDFmappings(nodeMappings);
-                }
-                else if (xmlStrEqual( nodeMappings->name, BAD_CAST "variable1" )) {
-                    m_variable1_inverse_cdf = getVariableCDFmappings(nodeMappings);
-                }
-                else if (xmlStrEqual( nodeMappings->name, BAD_CAST "variable2" )) {
-                    m_variable2_inverse_cdf = getVariableCDFmappings(nodeMappings);
-                }
-                else if (xmlStrEqual( nodeMappings->name, BAD_CAST "variable3" )) {
-                    m_variable3_inverse_cdf = getVariableCDFmappings(nodeMappings);
-                }
-                else if (xmlStrEqual( nodeMappings->name, BAD_CAST "variable4" )) {
-                    m_variable4_inverse_cdf = getVariableCDFmappings(nodeMappings);
+    //check info first
+    m_xml_info_cdf = getInfoMap("CDFMappings",inverseCdfConfigFile.c_str());
+
+    //do the saving
+    for (unsigned int i = 0; i < m_xml_info_cdf.size(); i++) {
+        ATH_MSG_DEBUG( "[ punchthrough ] m_xml_info_cdf[" << i << "].at('name') = " << m_xml_info_cdf[i].at("name"));
+
+        for( xmlNodePtr nodeRoot = doc->children; nodeRoot != nullptr; nodeRoot = nodeRoot->next) {
+            if (xmlStrEqual( nodeRoot->name, BAD_CAST "CDFMappings" )) {
+                for( xmlNodePtr typeMappings = nodeRoot->children; typeMappings != nullptr; typeMappings = typeMappings->next ) {
+                    if (xmlStrEqual( typeMappings->name, BAD_CAST m_xml_info_cdf[i].at("name").c_str() )) {
+                        if (typeMappings->children != NULL) {
+                            for( xmlNodePtr nodeMappings = typeMappings->children; nodeMappings != nullptr; nodeMappings = nodeMappings->next) {
+
+                                if (xmlStrEqual( nodeMappings->name, BAD_CAST "variable0" )) {
+                                    variable0_inverse_cdf_row = getVariableCDFmappings(nodeMappings);
+                                }
+                                else if (xmlStrEqual( nodeMappings->name, BAD_CAST "variable1" )) {
+                                    variable1_inverse_cdf_row = getVariableCDFmappings(nodeMappings);
+                                }
+                                else if (xmlStrEqual( nodeMappings->name, BAD_CAST "variable2" )) {
+                                    variable2_inverse_cdf_row = getVariableCDFmappings(nodeMappings);
+                                }
+                                else if (xmlStrEqual( nodeMappings->name, BAD_CAST "variable3" )) {
+                                    variable3_inverse_cdf_row = getVariableCDFmappings(nodeMappings);
+                                }
+                                else if (xmlStrEqual( nodeMappings->name, BAD_CAST "variable4" )) {
+                                    variable4_inverse_cdf_row = getVariableCDFmappings(nodeMappings);
+                                }
+                            }
+
+                        }
+                    }
                 }
             }
         }
+        m_variable0_inverse_cdf.push_back(variable0_inverse_cdf_row);
+        m_variable1_inverse_cdf.push_back(variable1_inverse_cdf_row);
+        m_variable2_inverse_cdf.push_back(variable2_inverse_cdf_row);
+        m_variable3_inverse_cdf.push_back(variable3_inverse_cdf_row);
+        m_variable4_inverse_cdf.push_back(variable4_inverse_cdf_row);
     }
 
     return StatusCode::SUCCESS;
@@ -1319,4 +1471,4 @@ Amg::Vector3D ISF::PunchThroughTool::propagator(double theta,double phi) const
   ATH_MSG_DEBUG("GeoID thinks: Calo: "<< m_geoIDSvc->inside(pos, AtlasDetDescr::fAtlasCalo) <<" MS: "<< m_geoIDSvc->inside(pos,AtlasDetDescr::fAtlasMS));
 
   return pos;
-}
+}
\ No newline at end of file
diff --git a/Simulation/ISF/ISF_FastCaloSim/ISF_PunchThroughTools/src/PunchThroughTool.h b/Simulation/ISF/ISF_FastCaloSim/ISF_PunchThroughTools/src/PunchThroughTool.h
index 17706cbdb177c8ed71b5e7cc1f1321e5dd5be08d..27072a1934ca36d79bce4f17d72b06781ab0611b 100644
--- a/Simulation/ISF/ISF_FastCaloSim/ISF_PunchThroughTools/src/PunchThroughTool.h
+++ b/Simulation/ISF/ISF_FastCaloSim/ISF_PunchThroughTools/src/PunchThroughTool.h
@@ -114,7 +114,7 @@ namespace ISF {
     Amg::Vector3D propagator(double theta, double phi) const;
 
     //apply the inverse PCA transform
-    std::vector<double> inversePCA(std::vector<double> &variables) const;
+    std::vector<double> inversePCA(int pcaCdfIterator, std::vector<double> &variables) const;
 
     //apply the inverse CDF trainsform
     static double inverseCdfTransform(double variable, std::map<double, double> inverse_cdf_map) ;
@@ -131,6 +131,15 @@ namespace ISF {
     //apply eta interpolation
     double interpolateEta(const double &eta, CLHEP::HepRandomEngine* rndmEngine) const;
 
+    //helper function to convert comma separated string into vector
+    static std::vector<std::string> str_to_list(std::string str);
+
+    //get the infoMap from xml file based on the xmlpathname and also name of mainNode
+    std::vector<std::map<std::string,std::string>> getInfoMap(std::string mainNode, const std::string &xmlFilePath);
+
+    //decide the pca / cdf part to read based on pdgId and eta
+    static int passedParamIterator(int pid, double eta, std::vector<std::map<std::string,std::string>> mapvect);
+
     //load inverse quantile transformer from XML
     StatusCode initializeInverseCDF(const std::string & quantileTransformerConfigFile);
 
@@ -206,15 +215,21 @@ namespace ISF {
     /** beam pipe radius */
     DoubleProperty                                  m_beamPipe{this, "BeamPipeRadius", 500.};
 
-    std::vector<std::vector<double>> m_inverse_PCA_matrix;
-    std::vector<double> m_PCA_means;
+    /** pca vectors */
+    std::vector<std::vector<std::vector<double>>> m_inverse_PCA_matrix;
+    std::vector<std::vector<double>> m_PCA_means;
+
+    /** infoMaps */
+    std::vector<std::map<std::string, std::string>> m_xml_info_pca;
+    std::vector<std::map<std::string, std::string>> m_xml_info_cdf;
 
-    std::map<double, double>  m_variable0_inverse_cdf;
-    std::map<double, double>  m_variable1_inverse_cdf;
-    std::map<double, double>  m_variable2_inverse_cdf;
-    std::map<double, double>  m_variable3_inverse_cdf;
-    std::map<double, double>  m_variable4_inverse_cdf;
+    /** (vector of map) for CDF mappings */
+    std::vector<std::map<double, double>>  m_variable0_inverse_cdf;
+    std::vector<std::map<double, double>>  m_variable1_inverse_cdf;
+    std::vector<std::map<double, double>>  m_variable2_inverse_cdf;
+    std::vector<std::map<double, double>>  m_variable3_inverse_cdf;
+    std::vector<std::map<double, double>>  m_variable4_inverse_cdf;
   };
 }
 
-#endif
+#endif
\ No newline at end of file
diff --git a/Simulation/ISF/ISF_Fatras/ISF_FatrasToolsG4/src/G4HadIntProcessor.cxx b/Simulation/ISF/ISF_Fatras/ISF_FatrasToolsG4/src/G4HadIntProcessor.cxx
index 77831c1b5debce97dcfab24820b9c502a7f2f2bd..00633af3b5f89107344b6b34ab9a9183611459f8 100644
--- a/Simulation/ISF/ISF_Fatras/ISF_FatrasToolsG4/src/G4HadIntProcessor.cxx
+++ b/Simulation/ISF/ISF_Fatras/ISF_FatrasToolsG4/src/G4HadIntProcessor.cxx
@@ -45,7 +45,6 @@
 
 #include "globals.hh"
 #include "G4CrossSectionDataStore.hh"
-#include "G4HadronElasticDataSet.hh"
 #include "G4Element.hh"
 #include "G4ElementVector.hh"
 #include "G4IsotopeVector.hh"
diff --git a/Simulation/Overlay/OverlayConfiguration/python/OverlaySteering.py b/Simulation/Overlay/OverlayConfiguration/python/OverlaySteering.py
index c7a7b935093ea09fe2d6212cf4b99966e4c6ca9b..37c98bc985eca31596eff0ae608070dbd8ee920f 100644
--- a/Simulation/Overlay/OverlayConfiguration/python/OverlaySteering.py
+++ b/Simulation/Overlay/OverlayConfiguration/python/OverlaySteering.py
@@ -146,4 +146,8 @@ def OverlayMainContentCfg(configFlags):
         acc.merge(CopySCT_ClusterContainerCfg(configFlags))
         acc.merge(CopyTRT_DriftCircleContainerCfg(configFlags))
 
+    # Add in-file MetaData
+    from xAODMetaDataCnv.InfileMetaDataConfig import InfileMetaDataCfg
+    acc.merge(InfileMetaDataCfg(configFlags, "RDO"))
+
     return acc
diff --git a/Simulation/SimuJobTransforms/python/CommonSimulationSteering.py b/Simulation/SimuJobTransforms/python/CommonSimulationSteering.py
index cbc2e2017abfa304f117a655d8102e43a02a4cc8..dca7fd0764a148073c6f9a37e1de973395263623 100644
--- a/Simulation/SimuJobTransforms/python/CommonSimulationSteering.py
+++ b/Simulation/SimuJobTransforms/python/CommonSimulationSteering.py
@@ -141,4 +141,8 @@ def CommonSimulationCfg(flags, log):
         from PerfMonComps.PerfMonCompsConfig import PerfMonMTSvcCfg
         cfg.merge(PerfMonMTSvcCfg(flags))
 
+    # Add in-file MetaData
+    from xAODMetaDataCnv.InfileMetaDataConfig import InfileMetaDataCfg
+    cfg.merge(InfileMetaDataCfg(flags, "HITS", AcceptAlgs=AcceptAlgNames))
+
     return cfg
diff --git a/Simulation/SimuJobTransforms/python/FilterHit_Skeleton.py b/Simulation/SimuJobTransforms/python/FilterHit_Skeleton.py
index 8bb28b86266e48a56f443deb06d2064e01615ac8..0f3beba26ef703ac57a94f04a46c2f47cccd0963 100644
--- a/Simulation/SimuJobTransforms/python/FilterHit_Skeleton.py
+++ b/Simulation/SimuJobTransforms/python/FilterHit_Skeleton.py
@@ -224,6 +224,10 @@ def fromRunArgs(runArgs):
     from OutputStreamAthenaPool.OutputStreamConfig import OutputStreamCfg
     cfg.merge( OutputStreamCfg(flags, "HITS", ItemList=getStreamHITS_ItemList(flags), disableEventTag="xAOD::EventInfo#EventInfo" not in flags.Input.TypedCollections) )
 
+    # Add in-file MetaData
+    from xAODMetaDataCnv.InfileMetaDataConfig import InfileMetaDataCfg
+    cfg.merge(InfileMetaDataCfg(flags, "HITS"))
+
     # Post-include
     processPostInclude(runArgs, flags, cfg)
 
diff --git a/Simulation/SimuJobTransforms/python/HITSMerge_Skeleton.py b/Simulation/SimuJobTransforms/python/HITSMerge_Skeleton.py
index 443c03f4eb06b1ed021a8857e09ba662f4a80772..124fa65d3a558dd66310820ea402377da80c46de 100644
--- a/Simulation/SimuJobTransforms/python/HITSMerge_Skeleton.py
+++ b/Simulation/SimuJobTransforms/python/HITSMerge_Skeleton.py
@@ -70,6 +70,10 @@ def fromRunArgs(runArgs):
     cfg.merge(OutputStreamCfg(flags, 'HITS', disableEventTag="xAOD::EventInfo#EventInfo" not in flags.Input.TypedCollections))
     cfg.getEventAlgo('OutputStreamHITS').TakeItemsFromInput = True
 
+    # Add in-file MetaData
+    from xAODMetaDataCnv.InfileMetaDataConfig import InfileMetaDataCfg
+    cfg.merge(InfileMetaDataCfg(flags, "HITS"))
+
     # Post-include
     processPostInclude(runArgs, flags, cfg)
 
diff --git a/Simulation/Tools/McEventCollectionFilter/src/TruthClosureCheck.cxx b/Simulation/Tools/McEventCollectionFilter/src/TruthClosureCheck.cxx
index 11a815b49ecd5bcb8c49e7269180139838e1c9e6..dbc02fbadf30ac886b73e307c629680cb06d071e 100644
--- a/Simulation/Tools/McEventCollectionFilter/src/TruthClosureCheck.cxx
+++ b/Simulation/Tools/McEventCollectionFilter/src/TruthClosureCheck.cxx
@@ -71,8 +71,8 @@ StatusCode TruthClosureCheck::sanityCheck(const HepMC::GenEvent& event) const {
 }
 
 #ifdef HEPMC3
-void TruthClosureCheck::printGenVertex(HepMC::ConstGenVertexPtr origVertex,
-                                       HepMC::ConstGenVertexPtr resetVertex) const
+void TruthClosureCheck::printGenVertex(const HepMC::ConstGenVertexPtr& origVertex,
+                                       const HepMC::ConstGenVertexPtr& resetVertex) const
 {
   ATH_MSG_INFO("----------------------------------");
   ATH_MSG_INFO("Original Vertex:");
@@ -136,8 +136,8 @@ void TruthClosureCheck::printGenVertex(const HepMC::GenVertex& origVertex,
 #endif
 
 #ifdef HEPMC3
-StatusCode TruthClosureCheck::compareGenVertex(HepMC::ConstGenVertexPtr origVertex,
-                                               HepMC::ConstGenVertexPtr resetVertex) const
+StatusCode TruthClosureCheck::compareGenVertex(const HepMC::ConstGenVertexPtr& origVertex,
+                                               const HepMC::ConstGenVertexPtr& resetVertex) const
 {
   if (!origVertex && !resetVertex) return StatusCode::SUCCESS;
   if (!origVertex || !resetVertex) return StatusCode::FAILURE;
@@ -292,8 +292,8 @@ StatusCode TruthClosureCheck::compareMomenta(const HepMC::FourVector& origMoment
 }
 
 #ifdef HEPMC3
-StatusCode TruthClosureCheck::compareGenParticle(HepMC::ConstGenParticlePtr origParticle,
-                                                 HepMC::ConstGenParticlePtr resetParticle) const
+StatusCode TruthClosureCheck::compareGenParticle(const HepMC::ConstGenParticlePtr& origParticle,
+                                                 const HepMC::ConstGenParticlePtr& resetParticle) const
 {
   if (!origParticle && !resetParticle) return StatusCode::SUCCESS;
   if (!origParticle || !resetParticle) return StatusCode::FAILURE;
diff --git a/Simulation/Tools/McEventCollectionFilter/src/TruthClosureCheck.h b/Simulation/Tools/McEventCollectionFilter/src/TruthClosureCheck.h
index 653dcdf56eab0bf3bd3ea0ec63002d67088fbb1d..f9d4f81ecc5ea77f2461d04fc50edfc385ecb048 100644
--- a/Simulation/Tools/McEventCollectionFilter/src/TruthClosureCheck.h
+++ b/Simulation/Tools/McEventCollectionFilter/src/TruthClosureCheck.h
@@ -23,12 +23,12 @@ public:
   private:
    StatusCode sanityCheck(const HepMC::GenEvent& event) const;
 #ifdef HEPMC3
-   StatusCode compareGenVertex(HepMC::ConstGenVertexPtr origVertex,
-                               HepMC::ConstGenVertexPtr resetVertex) const;
-   StatusCode compareGenParticle(HepMC::ConstGenParticlePtr origParticle,
-                                 HepMC::ConstGenParticlePtr resetParticle) const;
-   void printGenVertex(HepMC::ConstGenVertexPtr origVertex,
-                       HepMC::ConstGenVertexPtr resetVertex) const;
+   StatusCode compareGenVertex(const HepMC::ConstGenVertexPtr& origVertex,
+                               const HepMC::ConstGenVertexPtr& resetVertex) const;
+   StatusCode compareGenParticle(const HepMC::ConstGenParticlePtr& origParticle,
+                                 const HepMC::ConstGenParticlePtr& resetParticle) const;
+   void printGenVertex(const HepMC::ConstGenVertexPtr& origVertex,
+                       const HepMC::ConstGenVertexPtr& resetVertex) const;
 #else
    StatusCode compareGenVertex(const HepMC::GenVertex& origVertex,
                                const HepMC::GenVertex& resetVertex) const;
diff --git a/TileCalorimeter/TileExample/TileRecEx/share/jobOptions_TileCalibRec.py b/TileCalorimeter/TileExample/TileRecEx/share/jobOptions_TileCalibRec.py
index 52d3edd92a857355dba0223a009d19e1de0ca1bf..5e4a3507cc3b339722fd3122d50646af4f1aca9a 100644
--- a/TileCalorimeter/TileExample/TileRecEx/share/jobOptions_TileCalibRec.py
+++ b/TileCalorimeter/TileExample/TileRecEx/share/jobOptions_TileCalibRec.py
@@ -531,7 +531,7 @@ else:
 
 
 if not 'doTileRawChannelTimeMonTool' in dir():
-    doTileRawChannelTimeMonTool = (TileRunType == 2) and TilePhysTiming and RUN2 and doTileFit
+    doTileRawChannelTimeMonTool = (TileRunType == 2) and TilePhysTiming and (RUN2 or RUN3) and doTileFit
 
 
 from IOVDbSvc.CondDB import conddb
@@ -633,7 +633,30 @@ jobproperties.print_JobProperties('tree&value')
 #=============================================================
 include( "TileConditions/TileConditions_jobOptions.py" )
 tileInfoConfigurator.OutputLevel = OutputLevel
-# use correct timing constants for different run types
+
+if RUN3 and 'SpecialDemoShape' in dir():
+    if TileRunType == 2:
+        # disable special treatment for demo in laser runs for the moment
+        SpecialDemoShape = -1
+    elif TileRunType == 8:
+        # put CIS pulse shape for Demo in laser and physics structures
+        SpecialDemoShape = 3
+        tileInfoConfigurator.filename_lo_las = "pulselo_cis_demo_100.dat"
+        tileInfoConfigurator.filename_hi_las = "pulsehi_cis_demo_100.dat"
+        tileInfoConfigurator.filename_lo_las_der = "dpulselo_cis_demo_100.dat"
+        tileInfoConfigurator.filename_hi_las_der = "dpulsehi_cis_demo_100.dat"
+        tileInfoConfigurator.filename_lo_phys = "pulselo_cis_demo_5p2.dat"
+        tileInfoConfigurator.filename_hi_phys = "pulsehi_cis_demo_5p2.dat"
+        tileInfoConfigurator.filename_lo_phys_der = "dpulselo_cis_demo_5p2.dat"
+        tileInfoConfigurator.filename_hi_phys_der = "dpulsehi_cis_demo_5p2.dat"
+    else:
+        # put physics pulse shape for Demo in laser structures
+        SpecialDemoShape = 2
+        tileInfoConfigurator.filename_lo_las = "pulselo_phys_demo.dat"
+        tileInfoConfigurator.filename_hi_las = "pulsehi_phys_demo.dat"
+        tileInfoConfigurator.filename_lo_las_der = "dpulselo_phys_demo.dat"
+        tileInfoConfigurator.filename_hi_las_der = "dpulsehi_phys_demo.dat"
+
 printfunc (tileInfoConfigurator)
 
 #============================================================
@@ -727,6 +750,8 @@ if doTileFit and tileRawChannelBuilderFitFilter:
     tileRawChannelBuilderFitFilter.MaxTimeFromPeak = 250.0; # recover behaviour of rel 13.0.30
     tileRawChannelBuilderFitFilter.RMSChannelNoise = 3;
     tileRawChannelBuilderFitFilter.UseDSPCorrection = not TileBiGainRun
+    if 'SpecialDemoShape' in dir() and SpecialDemoShape is not None:
+        tileRawChannelBuilderFitFilter.SpecialDemoShape = SpecialDemoShape
 
     printfunc (tileRawChannelBuilderFitFilter)
 
diff --git a/TileCalorimeter/TileRec/TileRec/TileAANtuple.h b/TileCalorimeter/TileRec/TileRec/TileAANtuple.h
index 8ddb3fe6baf72228a19508b528e0669277a61ffe..9d70592ea1b29b0d7c62ebe2c35c335ba1f69dd7 100644
--- a/TileCalorimeter/TileRec/TileRec/TileAANtuple.h
+++ b/TileCalorimeter/TileRec/TileRec/TileAANtuple.h
@@ -76,7 +76,7 @@
 #define N_DMUS 16
 #define N_CHANS 48
 #define N_SAMPLES 7
-#define N_RODS 65
+#define N_RODS 129
 #define N_CISPAR 110
 #define N_TMDBCHANS 8 // 4 in EB and 8 in B
 #define N_TMDBDECISIONS 4
diff --git a/TileCalorimeter/TileRec/src/TileAANtuple.cxx b/TileCalorimeter/TileRec/src/TileAANtuple.cxx
index bd275c83dd92a3d100876817ae584abcf30b59ec..13e82875d139e52bbdca307ea77a99fa9f6f5e8d 100644
--- a/TileCalorimeter/TileRec/src/TileAANtuple.cxx
+++ b/TileCalorimeter/TileRec/src/TileAANtuple.cxx
@@ -1091,9 +1091,14 @@ TileAANtuple::storeDigits(const EventContext& ctx
     }
     
     /// Store ROD header info from collection
-    /// (should be just one per ROD, i.e. 4 subsequent drawers give the same ROD number)
-    int rod = (rosL*N_MODULES + drawer) >> 2;
-    
+    /// should be just one per ROD, i.e. either 64(in RUN1)  or 128(starting from RUN2) different values
+    int rod = (rosL*N_MODULES + drawer);
+    if (N_RODS<128) {
+      rod >>= 2;
+    } else if (N_RODS<256) {
+      rod = (((rod>>2)<<1) | (rod&1));
+    }
+
     m_l1ID[rod] = (*itColl)->getLvl1Id();
     m_l1Type[rod] = (*itColl)->getLvl1Type();
     m_evType[rod] = (*itColl)->getDetEvType();
@@ -1640,10 +1645,11 @@ void TileAANtuple::TRIGGER_addBranch(void) {
   m_ntuplePtr->Branch("OFLunits",&m_rchUnit,"OFLunits/S");
   
   if (m_bsInput) {
-    m_ntuplePtr->Branch("L1ID",   m_l1ID,   "L1ID[65]/I");
-    m_ntuplePtr->Branch("L1Type", m_l1Type, "L1Type[65]/I");
-    m_ntuplePtr->Branch("EvType", m_evType, "EvType[65]/I");
-    m_ntuplePtr->Branch("EvBCID", m_evBCID, "EvBCID[65]/I");
+    std::string dim = "[" + std::to_string(N_RODS) + "]/I";
+    m_ntuplePtr->Branch("L1ID",   m_l1ID,   NAME2("L1ID",  dim));
+    m_ntuplePtr->Branch("L1Type", m_l1Type, NAME2("L1Type",dim));
+    m_ntuplePtr->Branch("EvType", m_evType, NAME2("EvType",dim));
+    m_ntuplePtr->Branch("EvBCID", m_evBCID, NAME2("EvBCID",dim));
   }
 }
 
@@ -1706,7 +1712,7 @@ void TileAANtuple::LASER_addBranch(void) {
     
     const char* gainnames[2]  = {"LG","HG"};
     const char* channames[16] = {"Diode0","Diode1","Diode2","Diode3","Diode4","Diode5","Diode6","Diode7",
-      "Diode8","Diode9","PMT1","ExtCIS0","IntCIS","DiodePhocal","PMT2","ExtCIS1"};
+      "Diode8","Diode9","ExiCIS0","IntCIS","DiodePhocal","ExtCIS1","PMT1","PMT2"};
     
     m_ntuplePtr->Branch("LASER_BCID", &m_las_BCID, "LASER_BCID/I");
     
@@ -1872,6 +1878,12 @@ void TileAANtuple::DIGI_addBranch(void)
     imax = 2;
   }
   
+  if (!m_mfRawChannelContainerKey.empty()) {
+    int size = sample_size * (imax-imin);
+    m_arrays->m_eMF = (float *) malloc(size*sizeof(float));
+    m_arrays->m_tMF = (float *) malloc(size*sizeof(float));
+  }
+
   for (int i = imin; i < imax; ++i) {
     
     std::string f_suf(suf[i]);
@@ -1892,13 +1904,15 @@ void TileAANtuple::DIGI_addBranch(void)
           
         } else {
           
+          std::string samples = "[4][64][48][" + std::to_string(m_nSamples) + "]/S";
+
           if (!m_fltDigitsContainerKey.empty()) {
             if (!m_digitsContainerKey.empty()) { // should use different names for two containers
               
-              m_ntuplePtr->Branch(NAME2("sampleFlt",f_suf),   &(m_arrays->m_sample[is]),     NAME5("sampleFlt",    f_suf,"[4][64][48][",std::to_string(m_nSamples),"]/S")); // short 
+              m_ntuplePtr->Branch(NAME2("sampleFlt",f_suf),   &(m_arrays->m_sample[is]),     NAME3("sampleFlt",    f_suf, samples)); // short
               m_ntuplePtr->Branch(NAME2("gainFlt",f_suf),     m_arrays->m_gainFlt[ir],       NAME3("gainFlt",      f_suf,"[4][64][48]/S"));    // short
             } else {
-              m_ntuplePtr->Branch(NAME2("sample",f_suf),      &(m_arrays->m_sampleFlt[is]),     NAME5("sampleFlt",    f_suf,"[4][64][48][",std::to_string(m_nSamples),"]/S")); // short 
+              m_ntuplePtr->Branch(NAME2("sample",f_suf),      &(m_arrays->m_sampleFlt[is]),  NAME3("sampleFlt",    f_suf, samples)); // short
               if (!m_rawChannelContainerKey.empty()
                   || !m_fitRawChannelContainerKey.empty()
                   || !m_fitcRawChannelContainerKey.empty()
@@ -1917,7 +1931,7 @@ void TileAANtuple::DIGI_addBranch(void)
           }
           
           if (!m_digitsContainerKey.empty()) {
-            m_ntuplePtr->Branch(NAME2("sample",f_suf),          &(m_arrays->m_sample[is]),        NAME5("sample",       f_suf,"[4][64][48][",std::to_string(m_nSamples),"]/S")); // short 
+            m_ntuplePtr->Branch(NAME2("sample",f_suf),          &(m_arrays->m_sample[is]),     NAME3("sample",       f_suf, samples)); // short
             m_ntuplePtr->Branch(NAME2("gain",f_suf),            m_arrays->m_gain[ir],          NAME3("gain",         f_suf,"[4][64][48]/S"));    // short
             
             if (m_bsInput) {
@@ -1999,8 +2013,9 @@ void TileAANtuple::DIGI_addBranch(void)
     }
     
     if (!m_mfRawChannelContainerKey.empty()) {
-      m_ntuplePtr->Branch(NAME2("eMF",f_suf),        &(m_arrays->m_eMF[is]),               NAME3("eMF",f_suf,NAME3("[4][64][48][",std::to_string(m_nSamples),"]/F"))); // float 
-      m_ntuplePtr->Branch(NAME2("tMF",f_suf),        &(m_arrays->m_tMF[is]),               NAME3("tMF",f_suf,NAME3("[4][64][48][",std::to_string(m_nSamples),"]/F"))); // float 
+      std::string f_samples = "[4][64][48][" + std::to_string(m_nSamples) + "]/F";
+      m_ntuplePtr->Branch(NAME2("eMF",f_suf),        &(m_arrays->m_eMF[is]),            NAME3("eMF",f_suf,f_samples)); // float
+      m_ntuplePtr->Branch(NAME2("tMF",f_suf),        &(m_arrays->m_tMF[is]),            NAME3("tMF",f_suf,f_samples)); // float
       m_ntuplePtr->Branch(NAME2("chi2MF",f_suf),     m_arrays->m_chi2MF[ir],         NAME3("chi2MF",f_suf,"[4][64][48]/F")); // float
       m_ntuplePtr->Branch(NAME2("pedMF",f_suf),      m_arrays->m_pedMF[ir],           NAME3("pedMF",f_suf,"[4][64][48]/F")); // float
     }
diff --git a/TileCalorimeter/TileRecUtils/TileRecUtils/TileRawChannelBuilder.h b/TileCalorimeter/TileRecUtils/TileRecUtils/TileRawChannelBuilder.h
index 3014037e72a2ee913e4b19685a4977bdb2d19067..ea9aaab2e0e14d6fc3a40324f42964396d3a8882 100644
--- a/TileCalorimeter/TileRecUtils/TileRecUtils/TileRawChannelBuilder.h
+++ b/TileCalorimeter/TileRecUtils/TileRecUtils/TileRawChannelBuilder.h
@@ -179,6 +179,11 @@ class TileRawChannelBuilder: public AthAlgTool {
     ServiceHandle<TileCablingSvc> m_cablingSvc{ this,
         "TileCablingSvc", "TileCablingSvc", "The Tile cabling service"};
 
+    const TileCablingService* m_cabling; //!< TileCabling instance
+
+    Gaudi::Property<std::vector<int>> m_demoFragIDs{this,
+          "DemoFragIDs", {}, "List of Tile frag IDs with new electronics (demonstrator)"};
+
     int m_trigType;
     bool m_idophys;   // Phys fitting
     bool m_idolas; // Laser fitting
diff --git a/TileCalorimeter/TileRecUtils/TileRecUtils/TileRawChannelBuilderFitFilter.h b/TileCalorimeter/TileRecUtils/TileRecUtils/TileRawChannelBuilderFitFilter.h
index 8f8afc1ce795ec367e3987ae5ead642c2cf80c03..9b3bdd91ed2b2e93006faabd8b3460ac54e979cf 100644
--- a/TileCalorimeter/TileRecUtils/TileRecUtils/TileRawChannelBuilderFitFilter.h
+++ b/TileCalorimeter/TileRecUtils/TileRecUtils/TileRawChannelBuilderFitFilter.h
@@ -106,6 +106,7 @@ class TileRawChannelBuilderFitFilter: public TileRawChannelBuilder {
     const TilePulseShapesStruct* m_pulseShapes;
 
     bool m_disableNegativeAmp;
+    int m_specialDemoShape;
 
     ToolHandle<TileCondToolNoiseSample> m_tileToolNoiseSample{this,
         "TileCondToolNoiseSample", "TileCondToolNoiseSample", "Tile sample noise tool"};
diff --git a/TileCalorimeter/TileRecUtils/src/TileRawChannelBuilder.cxx b/TileCalorimeter/TileRecUtils/src/TileRawChannelBuilder.cxx
index c382c85ec1a704615b9f97044fdd427d1462bcb4..03bca77f04b16eb12d91f770d71fa2379cf8f1ca 100644
--- a/TileCalorimeter/TileRecUtils/src/TileRawChannelBuilder.cxx
+++ b/TileCalorimeter/TileRecUtils/src/TileRawChannelBuilder.cxx
@@ -164,13 +164,35 @@ StatusCode TileRawChannelBuilder::initialize() {
 
   ATH_CHECK( m_cablingSvc.retrieve());
     
-  const TileCablingService* cabling = m_cablingSvc->cablingService();
-  if (!cabling) {
+  m_cabling = m_cablingSvc->cablingService();
+  if (!m_cabling) {
     ATH_MSG_ERROR( "Unable to retrieve TileCablingService" );
     return StatusCode::FAILURE;
   }
   
-  m_notUpgradeCabling = (cabling->getCablingType() != TileCablingService::UpgradeABC);
+  m_notUpgradeCabling = (m_cabling->getCablingType() != TileCablingService::UpgradeABC);
+
+  int runPeriod = m_cabling->runPeriod();
+  std::ostringstream os;
+  if (runPeriod==3) {
+    if ( m_demoFragIDs.empty() ) {
+      std::vector<int> v = { 0x10d }; // LBA14 is demonstrator in RUN3
+      m_demoFragIDs = v;
+    }
+    os << " in RUN3";
+  }
+
+  if ( !m_demoFragIDs.empty() ) {
+    std::sort(m_demoFragIDs.begin(),m_demoFragIDs.end());
+    os << " (frag IDs):";
+    for (int fragID : m_demoFragIDs) {
+      if (fragID>0)
+        os << " 0x" << std::hex << fragID << std::dec;
+      else
+        os << " " << fragID;
+    }
+    ATH_MSG_INFO("Enable special treatment for demonstrator modules" << os.str());
+  }
 
   if (m_calibrateEnergy) {
     ATH_CHECK( m_tileToolEmscale.retrieve() );
diff --git a/TileCalorimeter/TileRecUtils/src/TileRawChannelBuilderFitFilter.cxx b/TileCalorimeter/TileRecUtils/src/TileRawChannelBuilderFitFilter.cxx
index cf08b6c5bf55b230b8cc53d8ce5c2df9229842b9..bbdcd9b9624f13f92e771327291ac3be138977e0 100644
--- a/TileCalorimeter/TileRecUtils/src/TileRawChannelBuilderFitFilter.cxx
+++ b/TileCalorimeter/TileRecUtils/src/TileRawChannelBuilderFitFilter.cxx
@@ -70,6 +70,8 @@ TileRawChannelBuilderFitFilter::TileRawChannelBuilderFitFilter(const std::string
   declareProperty("MaxTimeFromPeak",m_maxTimeFromPeak = 250.0);
 
   declareProperty("DisableNegativeAmp",m_disableNegativeAmp = false);
+
+  declareProperty("SpecialDemoShape",m_specialDemoShape = -1); // if >=0 - pulse shape for Demo is stored in non-default structures
 }
 
 /**
@@ -127,6 +129,21 @@ StatusCode TileRawChannelBuilderFitFilter::initialize() {
                 << " min_tau=" << m_minTau
                 << " max_tau=" << m_maxTau );
 
+  if ( !m_demoFragIDs.empty() ) {
+    switch (m_specialDemoShape) {
+      case 1:
+        ATH_MSG_DEBUG( "Demonstrator channels use pulse shape from physics structures"); break;
+      case 2:
+        ATH_MSG_DEBUG( "Demonstrator channels use pulse shape from laser structures"); break;
+      case 3:
+        ATH_MSG_DEBUG( "Demonstrator channels use pulse shape from laser(for 100pF) and physics(for 5.2pF) structures"); break;
+      case 8:
+        ATH_MSG_DEBUG( "Demonstrator channels use pulse shape from cis structures"); break;
+      default:
+        ATH_MSG_DEBUG( "Demonstrator channels use the same pulse shape as legacy"); break;
+    }
+  }
+
   // Speedup for physics processing (max_iter=1):
   //  read initial pulse shapes into arrays
   m_fnParameters[0] = 0.0;
@@ -162,7 +179,7 @@ StatusCode TileRawChannelBuilderFitFilter::initialize() {
         break;
       case 3:
         msg(MSG::DEBUG) << " noise for all channels from Conditions DB ";
-        if (TileCablingService::getInstance()->getTestBeam()) {
+        if (m_cabling->getTestBeam()) {
           const EventContext &ctx = Gaudi::Hive::currentContext();
           msg(MSG::DEBUG) << " rmsLow(LBA01/0) = " << m_tileToolNoiseSample->getHfn(20, 0, TileID::LOWGAIN, TileRawChannelUnit::ADCcounts, ctx)
                           << " rmsHi(LBA01/0) = " << m_tileToolNoiseSample->getHfn(20, 0, TileID::HIGHGAIN, TileRawChannelUnit::ADCcounts, ctx)
@@ -281,6 +298,8 @@ void TileRawChannelBuilderFitFilter::pulseFit(const TileDigits *digit
   int drawer = m_tileHWID->drawer(adcId);
   unsigned int drawerIdx = TileCalibUtils::getDrawerIdx(ros, drawer);
 
+  bool demo = (m_specialDemoShape > 0) && std::binary_search(m_demoFragIDs.begin(), m_demoFragIDs.end(), (ros << 8) | drawer);
+
   // Estimate channel noise
   double rms = 0.0;
   int noise_channel = (ros < 3) ? channel : channel + 48;
@@ -346,7 +365,8 @@ void TileRawChannelBuilderFitFilter::pulseFit(const TileDigits *digit
                   << " idolas=" << m_idolas
                   << " idocis=" << m_idocis
                   << " CISchan=" << m_cischan
-                  << " capdaq=" << m_capdaq );
+                  << " capdaq=" << m_capdaq
+                  << " demoCh=" << ((demo)?"true":"false")  );
 
   std::vector<float> samples = digit->samples();
   samples.erase(samples.begin(),samples.begin()+m_firstSample);
@@ -461,7 +481,15 @@ void TileRawChannelBuilderFitFilter::pulseFit(const TileDigits *digit
   const std::vector<double>* tdleak = &m_dummy;
   const std::vector<double>* dleak = &m_dummy;
   
-  if (m_idocis && ((m_cischan == -1) || (channel == m_cischan))) { // CIS pulse
+
+  bool docis = m_idocis;
+  bool dolas = m_idolas;
+  if (demo) { // special treatment for Demo drawers - select different pulse shape
+    dolas = ((m_specialDemoShape == 2) || (m_specialDemoShape == 3 && m_capdaq > 10));
+    docis = (m_specialDemoShape == 8);
+  }
+
+  if (docis && ((m_cischan == -1) || (channel == m_cischan) || demo)) { // CIS pulse
     if (igain == 0) { // low gain
       if (m_capdaq > 10) { // 100 pF capacitor
         tpulse = &(m_pulseShapes->m_tlcis);
@@ -504,7 +532,7 @@ void TileRawChannelBuilderFitFilter::pulseFit(const TileDigits *digit
       }
     }
   } else {
-    if (m_idolas) { // laser pulse
+    if (dolas) { // laser pulse
       if (igain == 0) { // low gain
         tpulse = &(m_pulseShapes->m_tllas);
         ypulse = &(m_pulseShapes->m_yllas);
@@ -531,6 +559,11 @@ void TileRawChannelBuilderFitFilter::pulseFit(const TileDigits *digit
     }
   }
   
+  if (demo) {
+    docis = false;                  // never fit demo channels as CIS with signal and leakage pulses
+    dolas = (m_idocis || m_idolas); // use laser option, i.e. just single pulse without leakage pulse
+  }
+
   // Variables used for iterative fitting
   double gval, gpval, sy, syg, sygp, sg, sgp, sgg, sgpgp, sggp, serr, err2;
   double dgg0, dgg, dggp, dgpgp, dyg, dygp, dg, dc, xd;
@@ -557,7 +590,7 @@ void TileRawChannelBuilderFitFilter::pulseFit(const TileDigits *digit
     m_fnParameters[2] = 1.0;
 
     // CIS events linear fit
-    if (m_idocis && ((m_cischan == -1) || (channel == m_cischan))) {
+    if (docis && ((m_cischan == -1) || (channel == m_cischan))) {
       ATH_MSG_VERBOSE ( "Fit time with leakage" );
       // CIS Part (A): fit for time using leakage pulse
       sllp = 0.0;
@@ -810,7 +843,7 @@ void TileRawChannelBuilderFitFilter::pulseFit(const TileDigits *digit
         serr = 0.0;
 
         for (int isamp = 0; isamp < nfit; ++isamp) {
-          if (!m_idolas) {
+          if (!dolas) {
             // Use initial values for speeding up the physics events
             int jsamp = (int) xvec[isamp] - delta_peak;
             if (jsamp < 0)
@@ -891,7 +924,7 @@ void TileRawChannelBuilderFitFilter::pulseFit(const TileDigits *digit
         serr = 0.0;
 
         for (int isamp = 0; isamp < nfit; ++isamp) {
-          if ((niter == 1) && (!m_idolas)) {
+          if ((niter == 1) && (!dolas)) {
             // Use initial function values stored in array for niter=1 physics
             // XXX: double->int
             int jsamp = (int) xvec[isamp] - delta_peak;
@@ -1078,7 +1111,7 @@ void TileRawChannelBuilderFitFilter::pulseFit(const TileDigits *digit
   
 //  NGO never use the 2par fit result if non-pedestal event was detected!
 //  if ((fabs(fixchi2) <= fabs(p_chi2))
-//      && !(m_idocis && ((m_cischan == -1) || (channel == m_cischan)))) {
+//      && !(docis && ((m_cischan == -1) || (channel == m_cischan)))) {
 //    /* results from 2-par fit */
 //    p_time = fixtau;
 //    p_pedestal = fixped;
@@ -1111,7 +1144,7 @@ void TileRawChannelBuilderFitFilter::pulseFit(const TileDigits *digit
     m_fnParameters[2] = 1.0;
 
     // CIS events linear fit
-    if (m_idocis && ((m_cischan == -1) || (channel == m_cischan))) {
+    if (docis && ((m_cischan == -1) || (channel == m_cischan))) {
       if (!fixedTime) {
         ATH_MSG_VERBOSE ( "Fit time with leakage" );
         // CIS Part (A): fit for time using leakage pulse
diff --git a/TileCalorimeter/TileTBRec/src/TileTBDump.cxx b/TileCalorimeter/TileTBRec/src/TileTBDump.cxx
index 74f8e68b367261ef9fdbd5c3f5cdd4f107709eee..80393b1432268850b3529fdab0e5adc688773a96 100755
--- a/TileCalorimeter/TileTBRec/src/TileTBDump.cxx
+++ b/TileCalorimeter/TileTBRec/src/TileTBDump.cxx
@@ -1133,12 +1133,12 @@ void TileTBDump::dump_digi(unsigned int subdet_id, const uint32_t* roddata, unsi
                                       "      PhotoDiode 7",
                                       "      PhotoDiode 8",
                                       "      PhotoDiode 9",
-                                      "             PMT 0",
                                       "    External CIS 0",
                                       "      Internal CIS",
                                       "      Diode Phocal",
-                                      "             PMT 1",
                                       "    External CIS 1",
+                                      "             PMT 0",
+                                      "             PMT 1",
                                       "         TDC 1 & 0"
               };
               
diff --git a/Tools/PROCTools/data/q443_ESD_diff-exclusion-list.txt b/Tools/PROCTools/data/q443_ESD_diff-exclusion-list.txt
new file mode 100644
index 0000000000000000000000000000000000000000..96cf95550fd89a566367f42d0ea486f665bef665
--- /dev/null
+++ b/Tools/PROCTools/data/q443_ESD_diff-exclusion-list.txt
@@ -0,0 +1,8 @@
+index_ref
+(.*)_mems(.*)
+(.*)_timings(.*)
+
+# Ignore most b-tagging outside the reference tagger, DL1dv00
+xAOD::BTagging(?!.*PFlow.*DL1dv00_p.*)
+# Also ignore some b-tagging on tracking
+xAOD::TrackParticleAuxContainer.*\.btagIp_.*
diff --git a/Tracking/TrkConfig/python/TrkAmbiguityProcessorConfig.py b/Tracking/TrkConfig/python/TrkAmbiguityProcessorConfig.py
index af8276faa5ceff67fd9754c9a8224a2d577ace41..c394c40f8675b81e045a6476bdda57f58373ccad 100644
--- a/Tracking/TrkConfig/python/TrkAmbiguityProcessorConfig.py
+++ b/Tracking/TrkConfig/python/TrkAmbiguityProcessorConfig.py
@@ -254,7 +254,7 @@ def DenseEnvironmentsAmbiguityScoreProcessorToolCfg(
         kwargs.setdefault(
             "SplitProbTool",
             (acc.popToolsAndMerge(NnPixelClusterSplitProbToolCfg(flags))
-             if flags.InDet.Tracking.doPixelClusterSplitting else None))
+             if flags.Tracking.doPixelClusterSplitting else None))
 
     if "AssociationTool" not in kwargs:
         from InDetConfig.InDetAssociationToolsConfig import (
@@ -273,9 +273,9 @@ def DenseEnvironmentsAmbiguityScoreProcessorToolCfg(
 
     if flags.InDet.Tracking.ActiveConfig.useTIDE_Ambi:
         kwargs.setdefault("sharedProbCut",
-                          flags.InDet.Tracking.pixelClusterSplitProb1)
+                          flags.Tracking.pixelClusterSplitProb1)
         kwargs.setdefault("sharedProbCut2",
-                          flags.InDet.Tracking.pixelClusterSplitProb2)
+                          flags.Tracking.pixelClusterSplitProb2)
         kwargs.setdefault(
             "SplitClusterMap_new",
             f"SplitClusterAmbiguityMap{flags.InDet.Tracking.ActiveConfig.extension}")
@@ -328,7 +328,7 @@ def ITkDenseEnvironmentsAmbiguityScoreProcessorToolCfg(
         kwargs.setdefault(
             "SplitProbTool",
             (acc.popToolsAndMerge(ITkTruthPixelClusterSplitProbToolCfg(flags))
-             if flags.ITk.Tracking.doPixelClusterSplitting else None))
+             if flags.Tracking.doPixelClusterSplitting else None))
 
     if "AssociationTool" not in kwargs:
         from InDetConfig.InDetAssociationToolsConfig import (
@@ -342,10 +342,8 @@ def ITkDenseEnvironmentsAmbiguityScoreProcessorToolCfg(
         kwargs.setdefault("AssociationToolNotGanged", acc.popToolsAndMerge(
             PRDtoTrackMapToolCfg(flags)))
 
-    kwargs.setdefault("sharedProbCut",
-                      flags.ITk.Tracking.pixelClusterSplitProb1)
-    kwargs.setdefault("sharedProbCut2",
-                      flags.ITk.Tracking.pixelClusterSplitProb2)
+    kwargs.setdefault("sharedProbCut", flags.Tracking.pixelClusterSplitProb1)
+    kwargs.setdefault("sharedProbCut2", flags.Tracking.pixelClusterSplitProb2)
     kwargs.setdefault("SplitClusterMap_new", 'SplitClusterAmbiguityMap' +
                       flags.ITk.Tracking.ActiveConfig.extension)
     kwargs.setdefault("AssociationMapName", 'ITkPRDToTrackMap' +
diff --git a/Tracking/TrkConfig/python/TrkConfigFlags.py b/Tracking/TrkConfig/python/TrkConfigFlags.py
index ffa2a6e28ccba78cb7acedb557a59a03c88c9172..04f095b7807c13452f5018d3b54f0dc230f753d3 100644
--- a/Tracking/TrkConfig/python/TrkConfigFlags.py
+++ b/Tracking/TrkConfig/python/TrkConfigFlags.py
@@ -3,11 +3,13 @@
 from AthenaConfiguration.AthConfigFlags import AthConfigFlags
 from AthenaConfiguration.Enums import BeamType, LHCPeriod, FlagEnum
 
+
 class TrackFitterType(FlagEnum):
     DistributedKalmanFilter = 'DistributedKalmanFilter'
     GlobalChi2Fitter = 'GlobalChi2Fitter'
     GaussianSumFilter = 'GaussianSumFilter'
 
+
 class KalmanUpdatorType(FlagEnum):
     KalmanUpdator = 'KalmanUpdator'
     KalmanUpdator_xk = 'KalmanUpdator_xk'
@@ -55,21 +57,32 @@ def createTrackingConfigFlags():
     icf.addFlag("Tracking.doSharedHits", True)
     # Switch for running TIDE Ambi
     icf.addFlag("Tracking.doTIDE_Ambi", lambda prevFlags:
-                not(prevFlags.Beam.Type is BeamType.Cosmics))
+                not (prevFlags.Beam.Type is BeamType.Cosmics))
+    # Try to split pixel clusters
+    icf.addFlag("Tracking.doPixelClusterSplitting",
+                lambda prevFlags: not (prevFlags.Beam.Type is BeamType.Cosmics))
+    # choose splitter type: NeuralNet or AnalogClus
+    icf.addFlag("Tracking.pixelClusterSplittingType", "NeuralNet")
+    # Cut value for splitting clusters into two parts
+    icf.addFlag("Tracking.pixelClusterSplitProb1",
+                lambda prevFlags: (0.5 if prevFlags.GeoModel.Run is LHCPeriod.Run1 else 0.55))
+    # Cut value for splitting clusters into three parts
+    icf.addFlag("Tracking.pixelClusterSplitProb2",
+                lambda prevFlags: (0.5 if prevFlags.GeoModel.Run is LHCPeriod.Run1 else 0.45))
 
     # Express track parameters wrt. to : 'BeamLine','BeamSpot','Vertex' (first primary vertex)
     icf.addFlag("Tracking.perigeeExpression", lambda prevFlags:
                 "Vertex" if prevFlags.Reco.EnableHI else "BeamLine")
 
     def doLargeD0(flags):
-        if flags.GeoModel.Run<=LHCPeriod.Run3:
-           return not((flags.Beam.Type in
-                       [BeamType.SingleBeam, BeamType.Cosmics]) or
-                      flags.Reco.EnableHI or
-                      flags.Tracking.doHighPileup or
-                      flags.Tracking.doVtxLumi or
-                      flags.Tracking.doVtxBeamSpot)
-        else: # LRT disabled by default for Run4 for now
+        if flags.GeoModel.Run <= LHCPeriod.Run3:
+            return not ((flags.Beam.Type in
+                        [BeamType.SingleBeam, BeamType.Cosmics]) or
+                        flags.Reco.EnableHI or
+                        flags.Tracking.doHighPileup or
+                        flags.Tracking.doVtxLumi or
+                        flags.Tracking.doVtxBeamSpot)
+        else:  # LRT disabled by default for Run4 for now
             return False
 
     icf.addFlag("Tracking.doLargeD0", doLargeD0)
@@ -83,10 +96,10 @@ def createTrackingConfigFlags():
 
     # Toggle track slimming
     icf.addFlag("Tracking.doSlimming", lambda prevFlags:
-                not((prevFlags.Beam.Type in
+                not ((prevFlags.Beam.Type in
                      [BeamType.SingleBeam, BeamType.Cosmics]) or
-                    prevFlags.Tracking.doHighPileup or
-                    prevFlags.Tracking.doVtxLumi))
+                     prevFlags.Tracking.doHighPileup or
+                     prevFlags.Tracking.doVtxLumi))
 
     ####################################################################
 
diff --git a/Tracking/TrkConfig/python/TrkGlobalChi2FitterConfig.py b/Tracking/TrkConfig/python/TrkGlobalChi2FitterConfig.py
index 12793094aaa2e259ec8ab97a1528f718eba4f229..bc3694ddf34ca2f49fa85f8960e28c784de3ba2f 100644
--- a/Tracking/TrkConfig/python/TrkGlobalChi2FitterConfig.py
+++ b/Tracking/TrkConfig/python/TrkGlobalChi2FitterConfig.py
@@ -260,7 +260,9 @@ def MCTBFitterCfg(flags,
     result = MCTBExtrapolatorCfg(flags)
     kwargs.setdefault("GetMaterialFromTrack", True)
     kwargs.setdefault("ExtrapolationTool", result.popPrivateTools())
-    return MuonChi2TrackFitterCfg(flags, name=name, **kwargs)
+    result.setPrivateTools(result.popToolsAndMerge(
+        MuonChi2TrackFitterCfg(flags, name=name, **kwargs)))
+    return result
 
 def MCTBFitterMaterialFromTrackCfg(flags, name='MCTBFitterMaterialFromTrack', **kwargs):
     return MCTBFitterCfg(flags, name, GetMaterialFromTrack=True, **kwargs)
diff --git a/Tracking/TrkG4Components/TrkG4UserActions/src/MaterialStepRecorder.cxx b/Tracking/TrkG4Components/TrkG4UserActions/src/MaterialStepRecorder.cxx
index 2aa4864b3c3a920b75bf43241e31e2cc6bdc2e1f..0d9346a43e6d53acc33a0be47b1e9ceae0b8edf4 100644
--- a/Tracking/TrkG4Components/TrkG4UserActions/src/MaterialStepRecorder.cxx
+++ b/Tracking/TrkG4Components/TrkG4UserActions/src/MaterialStepRecorder.cxx
@@ -159,7 +159,7 @@ namespace G4UA
 
         for (size_t iel = 0; iel < elNumber; ++iel) {
 
-          G4Element*  currentEl  = (*elVector)[iel];
+          const G4Element*  currentEl  = (*elVector)[iel];
           double      currentNum = atVector ? atVector[iel] : 1.;
           double      relNbAtoms = currentNum/totAtoms;
 
diff --git a/Trigger/EFTracking/EFTrackingSim/TrigHTTMaps/src/HTTRegionMap.cxx b/Trigger/EFTracking/EFTrackingSim/TrigHTTMaps/src/HTTRegionMap.cxx
index dcc63275d998c9bffc02becdaff8a224b87282a0..df922377d264787889a22c721237d4a5bd0fb33c 100644
--- a/Trigger/EFTracking/EFTrackingSim/TrigHTTMaps/src/HTTRegionMap.cxx
+++ b/Trigger/EFTracking/EFTrackingSim/TrigHTTMaps/src/HTTRegionMap.cxx
@@ -15,7 +15,6 @@
 #include <cstdlib>
 #include <string>
 #include <iostream>
-#include <boost/foreach.hpp>
 #include <vector>
 
 using namespace std;
diff --git a/Trigger/TrigAlgorithms/TrigCaloRec/python/TrigCaloRecConfig.py b/Trigger/TrigAlgorithms/TrigCaloRec/python/TrigCaloRecConfig.py
index 9b27ff42851948a591a2d93d81c32f83bf7086e6..913f453ba7c380cccbcf076e69f42a91bb7dbfc2 100755
--- a/Trigger/TrigAlgorithms/TrigCaloRec/python/TrigCaloRecConfig.py
+++ b/Trigger/TrigAlgorithms/TrigCaloRec/python/TrigCaloRecConfig.py
@@ -334,8 +334,12 @@ if __name__ == "__main__":
     flags.Input.isMC=False
     flags.GeoModel.Run=LHCPeriod.Run3
     flags.lock()    
-    hltCaloCellSeedlessMakerCfg(flags).printConfig(withDetails=True)
-    hltCaloCellMakerCfg(flags, "SthFS").printConfig(withDetails=True)
-    hltTopoClusterMakerCfg(flags, "TrigCaloClusterMaker_topo").printConfig(withDetails=True,summariseProps=True)
-    hltCaloTopoClusterCalibratorCfg(flags,"Calibrator",
-       clustersin="clustersIn",clustersout="clustersOut").printConfig(withDetails=True, summariseProps=True)
+    CAs = [hltCaloCellSeedlessMakerCfg(flags),
+           hltCaloCellMakerCfg(flags, "SthFS"),
+           hltTopoClusterMakerCfg(flags, "TrigCaloClusterMaker_topo"),
+           hltCaloTopoClusterCalibratorCfg(flags,"Calibrator",
+                                           clustersin="clustersIn",clustersout="clustersOut")]
+
+    for ca in CAs:
+        ca.printConfig(withDetails=True, summariseProps=True)
+        ca.wasMerged()
diff --git a/Trigger/TrigAlgorithms/TrigL2MuonSA/python/TrigL2MuonSAConfig.py b/Trigger/TrigAlgorithms/TrigL2MuonSA/python/TrigL2MuonSAConfig.py
index 7d982e867d6aacf507785e70189a273c32d3f8c5..45c890374dd742f7a5c82f88b8101066cc5b84b6 100644
--- a/Trigger/TrigAlgorithms/TrigL2MuonSA/python/TrigL2MuonSAConfig.py
+++ b/Trigger/TrigAlgorithms/TrigL2MuonSA/python/TrigL2MuonSAConfig.py
@@ -384,3 +384,4 @@ if __name__ == "__main__":
 
     cfg = l2MuFastAlgCfg(flags, roisKey="MURoIs")
     cfg.printConfig(withDetails=True, summariseProps=True)
+    cfg.wasMerged()
diff --git a/Trigger/TrigAlgorithms/TrigT2BeamSpot/python/T2VertexBeamSpotConfig.py b/Trigger/TrigAlgorithms/TrigT2BeamSpot/python/T2VertexBeamSpotConfig.py
index 70e5cdd98e213200cd2eb1282ddf05f0a1eb68de..9dbcba9937de4e0d196f86d2af59e32161514807 100644
--- a/Trigger/TrigAlgorithms/TrigT2BeamSpot/python/T2VertexBeamSpotConfig.py
+++ b/Trigger/TrigAlgorithms/TrigT2BeamSpot/python/T2VertexBeamSpotConfig.py
@@ -116,3 +116,4 @@ if __name__=="__main__":
 
     cfg = MainServicesCfg(flags)
     cfg.addEventAlgo( T2VertexBeamSpot_activeAllTE(flags) )
+    cfg.wasMerged()
diff --git a/Trigger/TrigAlgorithms/TrigT2CaloCommon/python/CaloDef.py b/Trigger/TrigAlgorithms/TrigT2CaloCommon/python/CaloDef.py
index cc1d422b952c32f924f807c3dd79cf967cf3ec66..76172a7dc72b4cbd741bdfec33f02e0249eb19c8 100644
--- a/Trigger/TrigAlgorithms/TrigT2CaloCommon/python/CaloDef.py
+++ b/Trigger/TrigAlgorithms/TrigT2CaloCommon/python/CaloDef.py
@@ -2,7 +2,6 @@
 
 from AthenaCommon.CFElements import seqAND, parOR
 from AthenaConfiguration.ComponentFactory import CompFactory
-from TrigEDMConfig.TriggerEDMRun3 import recordable
 from TriggerMenuMT.HLT.Config.MenuComponents import algorithmCAToGlobalWrapper
 from TriggerMenuMT.HLT.CommonSequences.FullScanDefs import caloFSRoI
 
@@ -78,25 +77,21 @@ def _algoL2Egamma(flags, inputEDM="", ClustersName="HLT_FastCaloEMClusters", Rin
         # using jet seeds for testing. we should use EM as soon as we have EM seeds into the L1
         inputEDM = mapThresholdToL1RoICollection("EM")
 
-    from TrigT2CaloEgamma.TrigT2CaloEgammaConfig import T2CaloEgamma_ReFastAlgo
-    algo=T2CaloEgamma_ReFastAlgo(flags, "FastCaloL2EgammaAlg", doRinger=True, RingerKey=RingerKey)
-    algo.RoIs=inputEDM
+    extraInputs=[ ( 'LArMCSym', 'ConditionStore+LArMCSym'), ('LArOnOffIdMapping' , 'ConditionStore+LArOnOffIdMap' ), ('LArFebRodMapping'  , 'ConditionStore+LArFebRodMap' ), ('CaloDetDescrManager', 'ConditionStore+CaloDetDescrManager') ]
+    from TrigT2CaloEgamma.TrigT2CaloEgammaConfig import t2CaloEgamma_ReFastAlgoCfg
+    if (not doForward) and (not doAll) and (not doAllEm ) :
+       algo=algorithmCAToGlobalWrapper(t2CaloEgamma_ReFastAlgoCfg,flags, "FastCaloL2EgammaAlg", doRinger=True, RingerKey=RingerKey,RoIs=inputEDM,ExtraInputs=extraInputs, ClustersName = ClustersName)
     if doForward:
-        from TrigT2CaloEgamma.TrigT2CaloEgammaConfig import T2CaloEgamma_ReFastFWDAlgo
-        algo=T2CaloEgamma_ReFastFWDAlgo(flags, "FastCaloL2EgammaAlg_FWD", doRinger=True, RingerKey=RingerKey)
-        algo.RoIs=inputEDM
+        from TrigT2CaloEgamma.TrigT2CaloEgammaConfig import t2CaloEgamma_ReFastFWDAlgoCfg
+        algo=algorithmCAToGlobalWrapper(t2CaloEgamma_ReFastFWDAlgoCfg,flags, "FastCaloL2EgammaAlg_FWD", doRinger=True, RingerKey=RingerKey,RoIs=inputEDM,ExtraInputs=extraInputs, ClustersName = ClustersName)
     else:
         if ( doAllEm or doAll ) :
           if ( doAllEm ):
-            from TrigT2CaloEgamma.TrigT2CaloEgammaConfig import T2CaloEgamma_AllEm
-            algo=T2CaloEgamma_AllEm(flags, "L2CaloLayersEmFex")
-            algo.RoIs=inputEDM
+            from TrigT2CaloEgamma.TrigT2CaloEgammaConfig import t2CaloEgamma_AllEmCfg
+            algo=algorithmCAToGlobalWrapper(t2CaloEgamma_AllEmCfg,flags, "L2CaloLayersEmFex",RoIs=inputEDM,ExtraInputs=extraInputs, ClustersName = ClustersName)
           else : # can only be doAll
-            from TrigT2CaloEgamma.TrigT2CaloEgammaConfig import T2CaloEgamma_All
-            algo=T2CaloEgamma_All(flags, "L2CaloLayersFex")
-            algo.RoIs=inputEDM
-    algo.ExtraInputs+=[ ( 'LArBadChannelCont', 'ConditionStore+LArBadChannel'), ( 'LArMCSym', 'ConditionStore+LArMCSym'), ('LArOnOffIdMapping' , 'ConditionStore+LArOnOffIdMap' ), ('LArFebRodMapping'  , 'ConditionStore+LArFebRodMap' ), ('CaloDetDescrManager', 'ConditionStore+CaloDetDescrManager') ]
-    algo.ClustersName=recordable(ClustersName)
+            from TrigT2CaloEgamma.TrigT2CaloEgammaConfig import t2CaloEgamma_AllCfg
+            algo=algorithmCAToGlobalWrapper(t2CaloEgamma_AllCfg,flags, "L2CaloLayersFex",RoIs=inputEDM,ExtraInputs=extraInputs, ClustersName = ClustersName)
     return algo
 
 ####################################
@@ -122,7 +117,7 @@ def fastCaloRecoSequence(flags, InViewRoIs, ClustersName="HLT_FastCaloEMClusters
         name = 'fastCaloInViewSequenceAll'    
 
     fastCaloInViewSequence = seqAND( name, [fastCaloVDV, fastCaloAlg] )
-    sequenceOut = fastCaloAlg.ClustersName
+    sequenceOut = fastCaloAlg[0].ClustersName
     return (fastCaloInViewSequence, sequenceOut)
 
 
@@ -136,7 +131,7 @@ def fastCaloRecoFWDSequence(flags, InViewRoIs, ClustersName="HLT_FastCaloEMClust
     fastCaloVDV.DataObjects = [( 'CaloBCIDAverage' , 'StoreGateSvc+CaloBCIDAverage' ),
                                ( 'TrigRoiDescriptorCollection' , 'StoreGateSvc+FSJETMETCaloRoI' )]
     fastCaloInViewSequence = seqAND('fastCaloInViewSequence_FWD' , [fastCaloVDV, fastCaloAlg] )
-    sequenceOut = fastCaloAlg.ClustersName
+    sequenceOut = fastCaloAlg[0].ClustersName
     return (fastCaloInViewSequence, sequenceOut)
 
 
diff --git a/Trigger/TrigAlgorithms/TrigT2CaloEgamma/python/TrigT2CaloEgammaConfig.py b/Trigger/TrigAlgorithms/TrigT2CaloEgamma/python/TrigT2CaloEgammaConfig.py
index 5d58790e1665809e42e217decc7d933d124b4d15..f2bbbcd115032b31fb52769f451859e312805cd8 100644
--- a/Trigger/TrigAlgorithms/TrigT2CaloEgamma/python/TrigT2CaloEgammaConfig.py
+++ b/Trigger/TrigAlgorithms/TrigT2CaloEgamma/python/TrigT2CaloEgammaConfig.py
@@ -1,7 +1,9 @@
 # Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
 
 from AthenaConfiguration.ComponentFactory import CompFactory
+from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
 from AthenaMonitoringKernel.GenericMonitoringTool import GenericMonitoringTool
+from TrigEDMConfig.TriggerEDMRun3 import recordable
 from TrigT2CaloCalibration.EgammaCalibrationConfig import (EgammaHitsCalibrationBarrelConfig,
                                                            EgammaHitsCalibrationEndcapConfig,
                                                            EgammaGapCalibrationConfig,
@@ -18,6 +20,9 @@ _T2CaloEgamma_ExtraInputs = [
     ('LArBadChannelCont' , 'ConditionStore+LArBadChannel')
 ]
 
+#local variable
+from HLTSeeding.HLTSeedingConfig import mapThresholdToL1RoICollection
+inputEDM = mapThresholdToL1RoICollection("FSNOSEED")
 
 def RingerReFexConfig(flags, name="RingerReMaker", RingerKey="FastCaloRings",
                       ClustersName="HLT_FastCaloEMClusters"):
@@ -72,7 +77,8 @@ def AsymRingerReFexConfig(flags, name="AsymRingerReMaker"):
 
 #=======================================================================
 
-def T2CaloEgamma_All(flags, name="T2CaloEgamma_All"):
+def t2CaloEgamma_AllCfg(flags, name="T2CaloEgamma_All",RoIs=inputEDM,ExtraInputs=[], ClustersName="HLT_FastCaloEMClusters"):
+    acc = ComponentAccumulator()
     tool = CompFactory.EgammaAllFex("EgammaAllFex",
                                     IncludeHad=True,
                                     ExtraInputs=[('TileEMScale','ConditionStore+TileEMScale'),
@@ -82,12 +88,16 @@ def T2CaloEgamma_All(flags, name="T2CaloEgamma_All"):
                                              EtaWidth = 0.1,
                                              PhiWidth = 0.1,
                                              ExtraInputs = _T2CaloEgamma_ExtraInputs)
-    return alg
+    alg.RoIs=RoIs
+    alg.ExtraInputs+=ExtraInputs
+    alg.ClustersName = recordable(ClustersName)
+    acc.addEventAlgo(alg)
+    return acc
 
 #=======================================================================
 
-def T2CaloEgamma_AllEm(flags, name="T2CaloEgamma_AllEm"):
-
+def t2CaloEgamma_AllEmCfg(flags, name="T2CaloEgamma_AllEm", RoIs=inputEDM, ExtraInputs=[], ClustersName="HLT_FastCaloEMClusters"):
+    acc = ComponentAccumulator()
     tool = CompFactory.EgammaAllFex("EgammaAllEmFex",
                                     ExtraInputs=[('TileEMScale','ConditionStore+TileEMScale'),
                                                  ('TileBadChannels','ConditionStore+TileBadChannels')])
@@ -97,12 +107,17 @@ def T2CaloEgamma_AllEm(flags, name="T2CaloEgamma_AllEm"):
                                              EtaWidth = 0.1,
                                              PhiWidth = 0.1,
                                              ExtraInputs = _T2CaloEgamma_ExtraInputs)
-    return alg
+    alg.RoIs=RoIs
+    alg.ExtraInputs+=ExtraInputs
+    alg.ClustersName = recordable(ClustersName)
+    acc.addEventAlgo(alg)
+    return acc
 
 #=======================================================================
 
-def T2CaloEgamma_ReFastAlgo(flags, name="T2CaloEgamma_ReFastAlgo", ClustersName="HLT_FastCaloEMClusters",
-                            doRinger=False, RingerKey="HLT_FastCaloRinger"):
+def t2CaloEgamma_ReFastAlgoCfg(flags, name="T2CaloEgamma_ReFastAlgo", ClustersName="HLT_FastCaloEMClusters",
+                            doRinger=False, RingerKey="HLT_FastCaloRinger", RoIs=inputEDM, ExtraInputs=[]):
+    acc = ComponentAccumulator()
 
     samp2 = CompFactory.EgammaReSamp2Fex("ReFaAlgoSamp2FexConfig",
                                          MaxDetaHotCell=0.15, MaxDphiHotCell=0.15 )
@@ -111,6 +126,15 @@ def T2CaloEgamma_ReFastAlgo(flags, name="T2CaloEgamma_ReFastAlgo", ClustersName=
     samph = CompFactory.EgammaReHadEnFex("ReFaAlgoHadEnFexConfig",
                                          ExtraInputs=[('TileEMScale','ConditionStore+TileEMScale'),
                                                       ('TileBadChannels','ConditionStore+TileBadChannels')])
+    monTool = GenericMonitoringTool(flags, 'MonTool')
+    monTool.defineHistogram('TrigEMCluster_eT', path='EXPERT', type='TH1F', title="T2Calo Egamma E_T; E_T [ GeV ] ; Nclusters", xbins=80, xmin=0.0, xmax=80.0)
+    monTool.defineHistogram('TrigEMCluster_had1', path='EXPERT', type='TH1F', title="T2Calo Egamma had E_T samp1; had E_T samp1 [ GeV ] ; Nclusters", xbins=80, xmin=0.0, xmax=8.0)
+    monTool.defineHistogram('TrigEMCluster_eta', path='EXPERT', type='TH1F', title="T2Calo Egamma #eta; #eta ; Nclusters", xbins=100, xmin=-2.5, xmax=2.5)
+    monTool.defineHistogram('TrigEMCluster_phi', path='EXPERT', type='TH1F', title="T2Calo Egamma #phi; #phi ; Nclusters", xbins=128, xmin=-3.2, xmax=3.2)
+    monTool.defineHistogram('TrigEMCluster_eta,TrigEMCluster_phi', path='EXPERT', type='TH2F', title="T2Calo Egamma Number of Clusters; #eta ; #phi ; Number of Clusters", xbins=100, xmin=-2.5, xmax=2.5, ybins=128, ymin=-3.2, ymax=3.2)
+    monTool.defineHistogram('TrigEMCluster_rEta', path='EXPERT', type='TH1F', title="T2Calo Egamma rEta; rEta (e237/e277) ; Nclusters", xbins=140, xmin=-0.2, xmax=1.2)
+    monTool.defineHistogram('TIME_exec', path='EXPERT', type='TH1F', title="T2Calo Egamma time; time [ us ] ; Nruns", xbins=80, xmin=0.0, xmax=8000.0)
+    monTool.defineHistogram('TrigEMCluster_eta,TIME_exec', path='EXPERT', type='TH2F', title="T2Calo Egamma time vs #eta ; #eta ; time [ us ]", xbins=100, xmin=-2.5, xmax=2.5, ybins=80, ymin=0.0, ymax=8000.0)
 
     alg = CompFactory.T2CaloEgammaReFastAlgo(
         name,
@@ -118,6 +142,7 @@ def T2CaloEgamma_ReFastAlgo(flags, name="T2CaloEgamma_ReFastAlgo", ClustersName=
         ExtraInputs = _T2CaloEgamma_ExtraInputs,
         EtaWidth = 0.2,
         PhiWidth = 0.2,
+        MonTool = monTool,
         CalibListBarrel = [EgammaSshapeCalibrationBarrelConfig(),
                            EgammaHitsCalibrationBarrelConfig(),
                            EgammaGapCalibrationConfig(),
@@ -132,31 +157,29 @@ def T2CaloEgamma_ReFastAlgo(flags, name="T2CaloEgamma_ReFastAlgo", ClustersName=
                                    ClustersName = ClustersName)
         alg.IReAlgToolList += [ringer]
 
-    monTool = GenericMonitoringTool(flags, 'MonTool')
-    monTool.defineHistogram('TrigEMCluster_eT', path='EXPERT', type='TH1F', title="T2Calo Egamma E_T; E_T [ GeV ] ; Nclusters", xbins=80, xmin=0.0, xmax=80.0)
-    monTool.defineHistogram('TrigEMCluster_had1', path='EXPERT', type='TH1F', title="T2Calo Egamma had E_T samp1; had E_T samp1 [ GeV ] ; Nclusters", xbins=80, xmin=0.0, xmax=8.0)
-    monTool.defineHistogram('TrigEMCluster_eta', path='EXPERT', type='TH1F', title="T2Calo Egamma #eta; #eta ; Nclusters", xbins=100, xmin=-2.5, xmax=2.5)
-    monTool.defineHistogram('TrigEMCluster_phi', path='EXPERT', type='TH1F', title="T2Calo Egamma #phi; #phi ; Nclusters", xbins=128, xmin=-3.2, xmax=3.2)
-    monTool.defineHistogram('TrigEMCluster_eta,TrigEMCluster_phi', path='EXPERT', type='TH2F', title="T2Calo Egamma Number of Clusters; #eta ; #phi ; Number of Clusters", xbins=100, xmin=-2.5, xmax=2.5, ybins=128, ymin=-3.2, ymax=3.2)
-    monTool.defineHistogram('TrigEMCluster_rEta', path='EXPERT', type='TH1F', title="T2Calo Egamma rEta; rEta (e237/e277) ; Nclusters", xbins=140, xmin=-0.2, xmax=1.2)
-    monTool.defineHistogram('TIME_exec', path='EXPERT', type='TH1F', title="T2Calo Egamma time; time [ us ] ; Nruns", xbins=80, xmin=0.0, xmax=8000.0)
-    monTool.defineHistogram('TrigEMCluster_eta,TIME_exec', path='EXPERT', type='TH2F', title="T2Calo Egamma time vs #eta ; #eta ; time [ us ]", xbins=100, xmin=-2.5, xmax=2.5, ybins=80, ymin=0.0, ymax=8000.0)
-
-    alg.MonTool = monTool
-    return alg
+    alg.RoIs=RoIs
+    alg.ExtraInputs+=ExtraInputs
+    alg.ClustersName = recordable(ClustersName)
+    acc.addEventAlgo(alg)
+    return acc
 
 #=======================================================================
 
-def T2CaloEgamma_ReFastFWDAlgo(flags, name="T2CaloEgamma_ReFastFWDAlgo",
+def t2CaloEgamma_ReFastFWDAlgoCfg(flags,  name="T2CaloEgamma_ReFastFWDAlgo",
                                ClustersName="HLT_FWDFastCaloEMClusters",
-                               doRinger=False, RingerKey="HLT_FWDFastCaloRinger"):
+                               doRinger=False, RingerKey="HLT_FWDFastCaloRinger", RoIs=inputEDM, ExtraInputs=[]):
+    acc = ComponentAccumulator()
 
     alg = CompFactory.T2CaloEgammaForwardReFastAlgo(name,
                                                     IReAlgToolList = [],
                                                     ExtraInputs = _T2CaloEgamma_ExtraInputs,
                                                     EtaWidth = 0.2,
                                                     PhiWidth = 0.2)
-    return alg
+    alg.RoIs=RoIs
+    alg.ExtraInputs+=ExtraInputs
+    alg.ClustersName = recordable(ClustersName)
+    acc.addEventAlgo(alg)
+    return acc
 
 #=======================================================================
 
@@ -165,5 +188,8 @@ if __name__ == '__main__':
     from AthenaConfiguration.AllConfigFlags import initConfigFlags
     flags = initConfigFlags()
     flags.lock()
-    alg = T2CaloEgamma_ReFastAlgo(flags, doRinger=True)
-    print(alg)
+    t2CaloEgamma_ReFastAlgoCfg(flags, "FastCaloL2EgammaAlgo_noRinger").printConfig(withDetails=True,summariseProps=True)
+    t2CaloEgamma_ReFastAlgoCfg(flags, "FastCaloL2EgammaAlgo", doRinger=True).printConfig(withDetails=True,summariseProps=True)
+    t2CaloEgamma_AllCfg(flags).printConfig(withDetails=True,summariseProps=True)
+    t2CaloEgamma_AllEmCfg(flags).printConfig(withDetails=True,summariseProps=True)
+    t2CaloEgamma_ReFastFWDAlgoCfg(flags, ClustersName="HLT_FastCaloEMClusters", doRinger=True).printConfig(withDetails=True,summariseProps=True)
diff --git a/Trigger/TrigAnalysis/TrigDecisionTool/Root/TDTUtilities.cxx b/Trigger/TrigAnalysis/TrigDecisionTool/Root/TDTUtilities.cxx
index 48b0fb9b2bf93d2d4e4ff0a4453aa4937a1d6f9f..118631141f62e9eee0800920d1fcea99bc3904eb 100644
--- a/Trigger/TrigAnalysis/TrigDecisionTool/Root/TDTUtilities.cxx
+++ b/Trigger/TrigAnalysis/TrigDecisionTool/Root/TDTUtilities.cxx
@@ -2,8 +2,6 @@
   Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration
 */
 
-#include <boost/algorithm/string.hpp>
-
 #include "TrigConfHLTData/HLTTriggerElement.h"
 
 #include "TrigDecisionTool/TDTUtilities.h"
diff --git a/Trigger/TrigAnalysis/TrigDecisionTool/TrigDecisionTool/ChainGroupFunctions.h b/Trigger/TrigAnalysis/TrigDecisionTool/TrigDecisionTool/ChainGroupFunctions.h
index 0d58dae9e8b858ab62c2a25e6a49caeea78625dc..235519088cd6ae485f0ca53babab54948f4fccb8 100644
--- a/Trigger/TrigAnalysis/TrigDecisionTool/TrigDecisionTool/ChainGroupFunctions.h
+++ b/Trigger/TrigAnalysis/TrigDecisionTool/TrigDecisionTool/ChainGroupFunctions.h
@@ -18,7 +18,6 @@
  ***********************************************************************************/
 #include <string>
 #include <vector>
-#include <boost/algorithm/string.hpp>
 
 #include "TrigDecisionInterface/GroupProperties.h"
 
diff --git a/Trigger/TrigAnalysis/TrigEgammaMatchingTool/TrigEgammaMatchingTool/TrigEgammaMatchingToolMT.icc b/Trigger/TrigAnalysis/TrigEgammaMatchingTool/TrigEgammaMatchingTool/TrigEgammaMatchingToolMT.icc
index 04f1ec57e6db453b803d2fff08d6daea3e390004..ada3257d40a869213407b389f8f1d522c402d62e 100644
--- a/Trigger/TrigAnalysis/TrigEgammaMatchingTool/TrigEgammaMatchingTool/TrigEgammaMatchingToolMT.icc
+++ b/Trigger/TrigAnalysis/TrigEgammaMatchingTool/TrigEgammaMatchingTool/TrigEgammaMatchingToolMT.icc
@@ -1,7 +1,7 @@
 /*
   Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 */
-
+#include <boost/algorithm/string.hpp>
 
 
 // L2Calo, L2Electron, L2Photon, EFCalo, Electron and Photon trigger passed access
diff --git a/Trigger/TrigConfiguration/TrigConfMuctpi/src/MuctpiXMLParser.cxx b/Trigger/TrigConfiguration/TrigConfMuctpi/src/MuctpiXMLParser.cxx
index 28f4bf55514ea22bc5d69bd6d8efb0c3beb79a36..8e6c83881e80f400ebc2a298219271a74bd453a0 100644
--- a/Trigger/TrigConfiguration/TrigConfMuctpi/src/MuctpiXMLParser.cxx
+++ b/Trigger/TrigConfiguration/TrigConfMuctpi/src/MuctpiXMLParser.cxx
@@ -18,9 +18,6 @@
 #include <stdlib.h>
 #include <boost/lexical_cast.hpp> 
 
-// boost libraries
-#include <boost/foreach.hpp>
-
 using namespace std;
 using boost::property_tree::ptree;
 
diff --git a/Trigger/TrigMonitoring/TrigEgammaMonitoring/src/TrigEgammaMonitorTagAndProbeAlgorithm.cxx b/Trigger/TrigMonitoring/TrigEgammaMonitoring/src/TrigEgammaMonitorTagAndProbeAlgorithm.cxx
index ec1f2bcef883a56dc2d05627db2ff108286d61a2..77ebd1b54cd888242ea84fe1f8816c799eccbc8c 100644
--- a/Trigger/TrigMonitoring/TrigEgammaMonitoring/src/TrigEgammaMonitorTagAndProbeAlgorithm.cxx
+++ b/Trigger/TrigMonitoring/TrigEgammaMonitoring/src/TrigEgammaMonitorTagAndProbeAlgorithm.cxx
@@ -24,7 +24,6 @@
 #include <algorithm>
 #include "boost/algorithm/string.hpp"
 #include <boost/tokenizer.hpp>
-#include <boost/foreach.hpp>
 #include "LArRecEvent/LArEventBitInfo.h"
 #include "StoreGate/ReadHandle.h"
 
diff --git a/Trigger/TrigSteer/HLTSeeding/python/HLTSeedingConfig.py b/Trigger/TrigSteer/HLTSeeding/python/HLTSeedingConfig.py
index cc044147d98e25ac60289001c48e0249325202bf..6c335a99e7a60e016fbdaf77c7807e1f76b7203b 100644
--- a/Trigger/TrigSteer/HLTSeeding/python/HLTSeedingConfig.py
+++ b/Trigger/TrigSteer/HLTSeeding/python/HLTSeedingConfig.py
@@ -386,3 +386,4 @@ if __name__ == "__main__":
     flags.Input.Files= ["/cvmfs/atlas-nightlies.cern.ch/repo/data/data-art/TrigP1Test/data17_13TeV.00327265.physics_EnhancedBias.merge.RAW._lb0100._SFO-1._0001.1",]
     flags.lock()
     acc = HLTSeedingCfg( flags )
+    acc.wasMerged()
diff --git a/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/L1CaloFEXSim/jFEXDriver.h b/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/L1CaloFEXSim/jFEXDriver.h
index 6d4d63691c167531610098b97252994cea965c88..3db9c49554666477e66359eba1e850a148199310 100644
--- a/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/L1CaloFEXSim/jFEXDriver.h
+++ b/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/L1CaloFEXSim/jFEXDriver.h
@@ -10,22 +10,10 @@
 
 
 // Athena/Gaudi
-#include "AthenaBaseComps/AthReentrantAlgorithm.h"
 #include "AthenaBaseComps/AthAlgorithm.h"
-#include "CaloEvent/CaloCellContainer.h"
-#include "L1CaloFEXSim/jTower.h"
-#include "L1CaloFEXSim/jTowerContainer.h"
-#include "L1CaloFEXSim/jTowerBuilder.h"
-#include "L1CaloFEXSim/jSuperCellTowerMapper.h"
 #include "L1CaloFEXToolInterfaces/IjFEXSysSim.h"
-#include "xAODTrigL1Calo/TriggerTowerContainer.h"
 #include "CaloIdentifier/CaloIdManager.h"
-#include "CaloIdentifier/CaloCell_SuperCell_ID.h"
 #include "L1CaloFEXSim/jFEXOutputCollection.h"
-#include "xAODTrigger/jFexSRJetRoIContainer.h" 
-#include "xAODTrigger/jFexLRJetRoIContainer.h"
-#include "xAODTrigger/jFexTauRoIContainer.h" 
-#include "xAODTrigger/jFexFwdElRoIContainer.h"
 
 class CaloIdManager;
 
@@ -33,41 +21,19 @@ namespace LVL1 {
 
 class jFEXDriver : public AthAlgorithm
 {
- public:
-  //using AthReentrantAlgorithm::AthReentrantAlgorithm;
+    public:
+        jFEXDriver(const std::string& name, ISvcLocator* pSvcLocator);
+        virtual ~jFEXDriver();
 
-  jFEXDriver(const std::string& name, ISvcLocator* pSvcLocator);
-  virtual ~jFEXDriver();
+        virtual StatusCode initialize();
+        virtual StatusCode execute();
+        StatusCode finalize();
 
-  virtual StatusCode initialize();
-  virtual StatusCode execute(/*const EventContext& ctx*/);// const;
-  StatusCode finalize();
+    private:
 
- private: 
-
-  int m_numberOfEvents = 0;
-
-  SG::WriteHandleKey<LVL1::jTowerContainer> m_jTowerContainerSGKey {this, "MyETowers", "jTowerContainer", "MyETowers"};
-
-  SG::WriteHandleKey<jFEXOutputCollection> m_jFEXOutputCollectionSGKey {this, "MyOutputs", "jFEXOutputCollection", "MyOutputs"};
-
-  ToolHandle<IjTowerBuilder> m_jTowerBuilderTool {this, "jTowerBuilderTool", "LVL1::jTowerBuilder", "Tool that builds jTowers for simulation"};
-  ToolHandle<IjSuperCellTowerMapper> m_jSuperCellTowerMapperTool {this, "jSuperCellTowerMapperTool", "LVL1::jSuperCellTowerMapper", "Tool that maps supercells to jTowers"};
-  ToolHandle<IjFEXSysSim> m_jFEXSysSimTool {this, "jFEXSysSimTool", "LVL1::jFEXSysSim", "Tool that creates the jFEX System Simulation"};
-
-  std::unordered_map<Identifier, std::pair<int,int> > m_cell_to_tower_map;
-  std::string m_PileupWeigthFile;
-  
-  // This string is used to convert the m_PileupweigthFile file in a readable file for jFEX
-  std::string m_PileupHelperFile;
-  
-    //histograms need to set coordinates and noise subtraction
-    TH1F* m_jTowerArea_hist;
-    TH1I* m_Firmware2BitwiseID;
-    TH1I* m_BinLayer;
-    TH1F* m_EtaCoords;
-    TH1F* m_PhiCoords;
+        SG::WriteHandleKey<jFEXOutputCollection> m_jFEXOutputCollectionSGKey {this, "MyOutputs", "jFEXOutputCollection", "MyOutputs"};
 
+        ToolHandle<IjFEXSysSim> m_jFEXSysSimTool {this, "jFEXSysSimTool", "LVL1::jFEXSysSim", "Tool that creates the jFEX System Simulation"};
 
 };
 
diff --git a/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/L1CaloFEXSim/jTowerMakerFromSuperCells.h b/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/L1CaloFEXSim/jTowerMakerFromSuperCells.h
new file mode 100644
index 0000000000000000000000000000000000000000..6e63e262ed4234dccf0181f604a99f5ba67eb5c0
--- /dev/null
+++ b/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/L1CaloFEXSim/jTowerMakerFromSuperCells.h
@@ -0,0 +1,64 @@
+/*
+  Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
+*/
+
+#ifndef JTOWERMAKERFROMSUPERCELLS_H
+#define JTOWERMAKERFROMSUPERCELLS_H
+
+// STL
+#include <string>
+
+
+// Athena/Gaudi
+#include "StoreGate/WriteHandle.h"
+#include "AthenaBaseComps/AthAlgorithm.h"
+#include "CaloEvent/CaloCellContainer.h"
+#include "L1CaloFEXSim/jTower.h"
+#include "L1CaloFEXSim/jTowerContainer.h"
+#include "L1CaloFEXSim/jTowerBuilder.h"
+#include "L1CaloFEXSim/jSuperCellTowerMapper.h"
+
+#include "xAODTrigL1Calo/TriggerTowerContainer.h"
+#include "CaloIdentifier/CaloIdManager.h"
+#include "CaloIdentifier/CaloCell_SuperCell_ID.h"
+
+#include "TH1F.h"
+#include "TH1I.h"
+#include "TFile.h"
+
+class CaloIdManager;
+
+namespace LVL1 {
+
+class jTowerMakerFromSuperCells : public AthAlgorithm
+{
+    public:
+
+        jTowerMakerFromSuperCells(const std::string& name, ISvcLocator* svc);
+
+        virtual StatusCode initialize();
+        virtual StatusCode execute();
+
+    private:
+
+        SG::WriteHandleKey<LVL1::jTowerContainer> m_jTowerContainerSGKey {this, "MyJTowers", "jTowerContainer", "MyJTowers"};
+
+        ToolHandle<IjTowerBuilder> m_jTowerBuilderTool {this, "jTowerBuilderTool", "LVL1::jTowerBuilder", "Tool that builds jTowers for simulation"};
+        ToolHandle<IjSuperCellTowerMapper> m_jSuperCellTowerMapperTool {this, "jSuperCellTowerMapperTool", "LVL1::jSuperCellTowerMapper", "Tool that maps supercells to jTowers"};
+
+        //property for jFEX mapping
+        Gaudi::Property<std::string> m_PileupWeigthFile {this, "PileupWeigthFile", "Run3L1CaloSimulation/Noise/jTowerCorrection.20210308.r12406.root", "Root file for the pileup weight"};
+        Gaudi::Property<std::string> m_PileupHelperFile {this, "PileupHelperFile", "Run3L1CaloSimulation/Calibrations/jFEX_MatchedMapping.2022Mar10.r12406.root", "Root file to set the jTower coordinated (float eta/phi)"};
+        
+        //histograms need to set coordinates and noise subtraction
+        TH1F* m_jTowerArea_hist;
+        TH1I* m_Firmware2BitwiseID;
+        TH1I* m_BinLayer;
+        TH1F* m_EtaCoords;
+        TH1F* m_PhiCoords;
+
+
+};
+
+} // end of LVL1 namespace
+#endif
diff --git a/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/python/FEXReprocessingRun3.py b/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/python/FEXReprocessingRun3.py
index f8449667c676882eaffbdd60b5dbc50453e4a06e..53944c100046ebee5751d85403b890cd1a3fd6d7 100644
--- a/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/python/FEXReprocessingRun3.py
+++ b/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/python/FEXReprocessingRun3.py
@@ -154,9 +154,10 @@ if __name__ == '__main__':
         ##################################################
         # jFEX Simulated TOBs
         ##################################################    
-        jFEX = CompFactory.LVL1.jFEXDriver('jFEXDriver')
-        jFEX.jSuperCellTowerMapperTool = CompFactory.LVL1.jSuperCellTowerMapper('jSuperCellTowerMapper')
-        jFEX.jSuperCellTowerMapperTool.SCellMasking = not flags.Input.isMC
+        jFEXInputs = CompFactory.LVL1.jTowerMakerFromSuperCells('jTowerMakerFromSuperCells')
+        jFEXInputs.jSuperCellTowerMapperTool = CompFactory.LVL1.jSuperCellTowerMapper('jSuperCellTowerMapper')
+        jFEXInputs.jSuperCellTowerMapperTool.SCellMasking = not flags.Input.isMC
+        jFEX = CompFactory.LVL1.jFEXDriver('jFEXDriver')        
         jFEX.jFEXSysSimTool = CompFactory.LVL1.jFEXSysSim('jFEXSysSimTool')
         
         #TOBs
@@ -186,6 +187,7 @@ if __name__ == '__main__':
         outputEDM += addEDM('xAOD::jFexTauRoIContainer'  , 'L1_jFexTauxRoISim'   )
         outputEDM += addEDM('xAOD::jFexFwdElRoIContainer', 'L1_jFexFwdElxRoISim' )
         
+        acc.addEventAlgo(jFEXInputs, sequenceName='AthAlgSeq')
         acc.addEventAlgo(jFEX, sequenceName='AthAlgSeq')   
         
         
diff --git a/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/python/L1CaloFEXSimCfg.py b/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/python/L1CaloFEXSimCfg.py
index a28e805c268635900bd3b9bd18c342547d09bbb4..224329b6bb1ce761662f9a44fe053c591cb41961 100644
--- a/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/python/L1CaloFEXSimCfg.py
+++ b/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/python/L1CaloFEXSimCfg.py
@@ -104,10 +104,12 @@ def L1CaloFEXSimCfg(flags):
         acc.addEventAlgo(eFEX)
 
     if flags.Trigger.L1.dojFex:
+        jFEXInputs = CompFactory.LVL1.jTowerMakerFromSuperCells('jTowerMakerFromSuperCells')
+        jFEXInputs.jSuperCellTowerMapperTool = CompFactory.LVL1.jSuperCellTowerMapper('jSuperCellTowerMapper', SCell=sCellType)
+        jFEXInputs.jSuperCellTowerMapperTool.SCellMasking = not flags.Input.isMC
         jFEX = CompFactory.LVL1.jFEXDriver('jFEXDriver')
-        jFEX.jSuperCellTowerMapperTool = CompFactory.LVL1.jSuperCellTowerMapper('jSuperCellTowerMapper', SCell=sCellType)
-        jFEX.jSuperCellTowerMapperTool.SCellMasking = not flags.Input.isMC
         jFEX.jFEXSysSimTool = CompFactory.LVL1.jFEXSysSim('jFEXSysSimTool')
+        acc.addEventAlgo(jFEXInputs)
         acc.addEventAlgo(jFEX)
 
     if flags.Trigger.L1.dogFex:
diff --git a/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/share/jFEXDriverJobOptions.py b/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/share/jFEXDriverJobOptions.py
index 37f1165870c136fc515a933c7f7fdbfec113ee31..8e7bf65e046ce5d7d5b3be7dd5cba1766ee70d1b 100644
--- a/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/share/jFEXDriverJobOptions.py
+++ b/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/share/jFEXDriverJobOptions.py
@@ -91,6 +91,7 @@ StreamAOD.ItemList+=["xAOD::TauJetAuxContainer#TauJetsAux.-VertexedClusters."]
 #######################################################
 log.info("==========================================================")
 log.info("Scheduling jFEXDriver")
+athAlgSeq += CfgMgr.LVL1__jTowerMakerFromSuperCells('MyeTowerMaker')
 athAlgSeq += CfgMgr.LVL1__jFEXDriver('MyjFEXDriver')
 athAlgSeq += CfgMgr.LVL1__jFEXNtupleWriter('MyjFEXNtupleWriter')
 log.info("==========================================================")
diff --git a/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/src/components/FEXDriver_entries.cxx b/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/src/components/FEXDriver_entries.cxx
index 4ec098c7a47fce9f7c5d375b6730fc1ad3c4d9c0..535672b56cf2e35ead483e815c9fa57ac65cc714 100644
--- a/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/src/components/FEXDriver_entries.cxx
+++ b/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/src/components/FEXDriver_entries.cxx
@@ -12,6 +12,13 @@
 #include "L1CaloFEXSim/eFEXegAlgo.h"
 #include "L1CaloFEXSim/eFEXTOBEtTool.h"
 #include "L1CaloFEXSim/eFEXNtupleWriter.h"
+#include "L1CaloFEXSim/eFEXFPGATowerIdProvider.h"
+#include "L1CaloFEXSim/eTowerMakerFromSuperCells.h"
+#include "../eTowerMakerFromEfexTowers.h"
+#include "L1CaloFEXSim/eFEXSuperCellTowerIdProvider.h"
+#include "L1CaloFEXSim/eFakeTower.h"
+
+
 #include "L1CaloFEXSim/jFEXDriver.h"
 #include "L1CaloFEXSim/jFEXSysSim.h"
 #include "L1CaloFEXSim/jFEXSim.h"
@@ -24,13 +31,9 @@
 #include "L1CaloFEXSim/jFEXForwardJetsAlgo.h"
 #include "L1CaloFEXSim/jFEXForwardElecAlgo.h"
 #include "L1CaloFEXSim/jFEXNtupleWriter.h"
-#include "L1CaloFEXSim/eFEXFPGATowerIdProvider.h"
-#include "L1CaloFEXSim/eTowerMakerFromSuperCells.h"
-#include "../eTowerMakerFromEfexTowers.h"
-#include "L1CaloFEXSim/eFEXSuperCellTowerIdProvider.h"
-#include "L1CaloFEXSim/eFakeTower.h"
 #include "L1CaloFEXSim/jFEXPileupAndNoise.h"
 #include "L1CaloFEXSim/jFEXFormTOBs.h"
+#include "L1CaloFEXSim/jTowerMakerFromSuperCells.h"
 
 #include "L1CaloFEXSim/gFEXDriver.h"
 #include "L1CaloFEXSim/gFEXSysSim.h"
@@ -79,6 +82,7 @@ DECLARE_COMPONENT(jFEXForwardJetsAlgo)
 DECLARE_COMPONENT(jFEXForwardElecAlgo)
 DECLARE_COMPONENT(jFEXNtupleWriter)
 DECLARE_COMPONENT(jFEXFormTOBs)
+DECLARE_COMPONENT(jTowerMakerFromSuperCells)
 
 DECLARE_COMPONENT(gFEXDriver)
 DECLARE_COMPONENT(gFEXSysSim)
diff --git a/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/src/jFEXDriver.cxx b/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/src/jFEXDriver.cxx
index 026af5bb1b1c04b2672a5a1fcc9f81e86938cb63..06aa76463e692f0f1b71456054300e45d07b4ee9 100644
--- a/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/src/jFEXDriver.cxx
+++ b/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/src/jFEXDriver.cxx
@@ -4,62 +4,18 @@
 
 #undef NDEBUG
 
-#include "CaloEvent/CaloCellContainer.h"
-#include "CaloIdentifier/CaloIdManager.h"
-#include "CaloIdentifier/CaloCell_SuperCell_ID.h"
-
-#include "xAODTrigL1Calo/TriggerTowerContainer.h"
-
-#include "L1CaloFEXSim/jTower.h"
-#include "L1CaloFEXSim/jTowerBuilder.h"
 #include "L1CaloFEXSim/jFEXDriver.h"
-
-#include "L1CaloFEXSim/jSuperCellTowerMapper.h"
-
-#include "L1CaloFEXSim/jFEXSim.h"
 #include "L1CaloFEXSim/jFEXOutputCollection.h"
-
-#include "TROOT.h"
-#include "TH1.h"
-#include "TH1F.h"
-#include "TH1I.h"
-#include "TPad.h"
-#include "TFile.h"
-#include "TCanvas.h"
-
 #include "StoreGate/WriteHandle.h"
-#include "StoreGate/ReadHandle.h"
-
-#include "L1CaloFEXSim/jTowerContainer.h"
-
-#include "xAODTrigger/jFexSRJetRoI.h"
-#include "xAODTrigger/jFexSRJetRoIContainer.h" 
-
-#include "xAODTrigger/jFexLRJetRoI.h"
-#include "xAODTrigger/jFexLRJetRoIContainer.h"
-
-#include "xAODTrigger/jFexTauRoI.h"
-#include "xAODTrigger/jFexTauRoIContainer.h" 
-
-#include "xAODTrigger/jFexFwdElRoI.h"
-#include "xAODTrigger/jFexFwdElRoIContainer.h"
-
-#include <cassert>
 #include "SGTools/TestStore.h"
-#include "PathResolver/PathResolver.h"
-#include <ctime>
 
-#include <fstream>
 
 #define DEBUG_VHB 1
 
 
 namespace LVL1 {
 
-jFEXDriver::jFEXDriver(const std::string& name, ISvcLocator* pSvcLocator):  AthAlgorithm(name, pSvcLocator){
-    declareProperty("PileupWeigthFile", m_PileupWeigthFile = "Run3L1CaloSimulation/Noise/jTowerCorrection.20210308.r12406.root");
-    declareProperty("PileupHelperFile", m_PileupHelperFile = "Run3L1CaloSimulation/Calibrations/jFEX_MatchedMapping.2022Mar10.r12406.root");
-}
+jFEXDriver::jFEXDriver(const std::string& name, ISvcLocator* pSvcLocator):  AthAlgorithm(name, pSvcLocator){}
 
 
  jFEXDriver::~jFEXDriver()
@@ -71,42 +27,9 @@ jFEXDriver::jFEXDriver(const std::string& name, ISvcLocator* pSvcLocator):  AthA
 StatusCode jFEXDriver::initialize()
 {
 
-  m_numberOfEvents = 1;
-
-  ATH_CHECK( m_jTowerBuilderTool.retrieve() );
-  ATH_CHECK( m_jSuperCellTowerMapperTool.retrieve() );
   ATH_CHECK( m_jFEXSysSimTool.retrieve() );
-  ATH_CHECK( m_jTowerContainerSGKey.initialize() );
   ATH_CHECK( m_jFEXOutputCollectionSGKey.initialize() );
   
-    std::unique_ptr<TFile> jTowerFile(TFile::Open(PathResolver::find_calib_file(m_PileupWeigthFile).c_str()));
-    std::unique_ptr<TFile> jTowerMapFile(TFile::Open(PathResolver::find_calib_file(m_PileupHelperFile).c_str()));
-    if (!jTowerFile || jTowerFile->IsZombie()) {
-        ATH_MSG_ERROR("Failed to open cell timing file " << m_PileupWeigthFile);
-        return StatusCode::FAILURE;
-    }
-    if (!jTowerMapFile || jTowerMapFile->IsZombie()) {
-        ATH_MSG_ERROR("Failed to open cell timing file " << m_PileupHelperFile);
-        return StatusCode::FAILURE;
-    }    
-    
-    m_jTowerArea_hist    = (TH1F*) jTowerFile->Get("jTowerArea_final_hist");
-    m_Firmware2BitwiseID = (TH1I*) jTowerMapFile->Get("Firmware2BitwiseID");
-    m_BinLayer           = (TH1I*) jTowerMapFile->Get("BinLayer");
-    m_EtaCoords          = (TH1F*) jTowerMapFile->Get("EtaCoords");
-    m_PhiCoords          = (TH1F*) jTowerMapFile->Get("PhiCoords");
-    
-    //detach the Histograms from the TFiles
-    m_jTowerArea_hist->SetDirectory(0);
-    m_Firmware2BitwiseID->SetDirectory(0);
-    m_BinLayer->SetDirectory(0);
-    m_EtaCoords->SetDirectory(0);
-    m_PhiCoords->SetDirectory(0);
-    
-    jTowerFile->Close();
-    jTowerMapFile->Close();  
-  
-
   return StatusCode::SUCCESS;
 
 }
@@ -120,96 +43,26 @@ StatusCode jFEXDriver::finalize()
 
 
 StatusCode jFEXDriver::execute() {
-    ATH_MSG_DEBUG("Executing " << name() << ", processing event number " << m_numberOfEvents );
-
-    // OLD DIMA STUFF---------------------- Maybe useful in the future again
-    //if (std::fabsf((*cell)->eta()) > 2.55) continue;
-    //if (!((*cell)->provenance() & 0x40)) continue; // BCID cut
-    //// if (!((*cell)->provenance() & 0x200)) continue;
-    //// 8192 & 0x40 = 0
-    //// 8256 & 0x40 = 64
-    //// 8704 & 0x40 = 0
-    //// 8768 & 0x40 = 64
-
-    // STEP 0 - Make a fresh local jTowerContainer
-    std::unique_ptr<jTowerContainer> local_jTowerContainerRaw = std::make_unique<jTowerContainer>();
-
-
-
-    // STEP 1 TO BE REPLACED IN THE NEAR FUTURE - KEPT HERE FOR REFERENCE
-    // STEP 1 - Do some monitoring (code to exported in the future to another algorithm accessing only StoreGate and not appearing in this algorithm)
-    jFEXOutputCollection* my_jFEXOutputCollection = new jFEXOutputCollection();
-    my_jFEXOutputCollection->setdooutput(true);
-
-    // STEP 2 - Make some jTowers and fill the local container
-    m_jTowerBuilderTool->init(local_jTowerContainerRaw);
-    local_jTowerContainerRaw->clearContainerMap();
-    local_jTowerContainerRaw->fillContainerMap();
     
-    // STEP 3 - Do the supercell-tower mapping - put this information into the jTowerContainer
-    ATH_CHECK(m_jSuperCellTowerMapperTool->AssignSuperCellsToTowers(local_jTowerContainerRaw));
-    ATH_CHECK(m_jSuperCellTowerMapperTool->AssignTriggerTowerMapper(local_jTowerContainerRaw));
-    ATH_CHECK(m_jSuperCellTowerMapperTool->AssignPileupAndNoiseValues(local_jTowerContainerRaw,m_jTowerArea_hist,m_Firmware2BitwiseID,m_BinLayer,m_EtaCoords,m_PhiCoords));
-        
-    //STEP 3.5 - Set up a file mapping if necessary (should only need to be done if the mapping changes, which should never happen unless major changes to the simulation are required)
-    // Only used for simulation experts. Contact one of us first
-    // With just one event should be enough to generate the file
-    if(false) { 
-        
-        ATH_MSG_INFO("Writting the mapping for jFEX");
-        std::ofstream sc_tower_map;
-        sc_tower_map.open("./new_jfex_SCID.txt");
-        sc_tower_map << "# Simulation ID, 12 Scells (EMB or EMEC or FCAL1 layer) + 1 Scell (HEC or FCAL2/3 layer)" << "\n";
-
-        for(const auto & jtower : *local_jTowerContainerRaw) {
-            sc_tower_map << jtower->id() << " ";
-            
-            std::vector<Identifier> vEM = jtower->getEMSCIDs();
-            for(const auto& SCellID : vEM) {
-                sc_tower_map << SCellID << " ";
-            }
-            for(unsigned int i=0; i<(12-vEM.size());i++){
-                sc_tower_map << "0xffffffffffffffff" << " ";
-            }
-
-            std::vector<Identifier> vHAD = jtower->getHADSCIDs();
-            for(const auto& SCellID : vHAD) {
-                sc_tower_map << SCellID << " ";
-            }
-            if(vHAD.size()==0){
-                sc_tower_map << "0xffffffffffffffff" << " ";
-            }
-            sc_tower_map << "\n";
-        }
-        
-        sc_tower_map.close();
-    }
-
-    // STEP 4 - Write the completed jTowerContainer into StoreGate (move the local copy in memory)
-    SG::WriteHandle<LVL1::jTowerContainer> jTowerContainerSG(m_jTowerContainerSGKey/*, ctx*/);
-    ATH_CHECK(jTowerContainerSG.record(std::move(/*my_jTowerContainerRaw*/local_jTowerContainerRaw)));
-
-    // STEP 5 - Set up the jFEXSysSim
+    
+    // STEP 1 - Set up the jFEXSysSim
     m_jFEXSysSimTool->init();
-
-
-    // STEP 6 - Run THE jFEXSysSim
-    ATH_CHECK(m_jFEXSysSimTool->execute(my_jFEXOutputCollection));
     
-    // STEP 7 - Close and clean the event  
+    // STEP 2 - Do some monitoring
+    jFEXOutputCollection* my_jFEXOutputCollection = new jFEXOutputCollection();
+    my_jFEXOutputCollection->setdooutput(true);  
+    
+    // STEP 3 - Run the jFEXSysSim
+    ATH_CHECK(m_jFEXSysSimTool->execute(my_jFEXOutputCollection));      
+    
+    // STEP 4 - Close and clean the event  
     m_jFEXSysSimTool->cleanup();
-    m_jSuperCellTowerMapperTool->reset();
-    m_jTowerBuilderTool->reset();
     
-    // STEP 8 - Write the completed jFEXOutputCollection into StoreGate (move the local copy in memory)
+    // STEP 5 - Write the completed jFEXOutputCollection into StoreGate (move the local copy in memory)
     std::unique_ptr<jFEXOutputCollection> local_jFEXOutputCollection = std::unique_ptr<jFEXOutputCollection>(my_jFEXOutputCollection);
     SG::WriteHandle<LVL1::jFEXOutputCollection> jFEXOutputCollectionSG(m_jFEXOutputCollectionSGKey);
     ATH_CHECK(jFEXOutputCollectionSG.record(std::move(local_jFEXOutputCollection)));
     
-    ATH_MSG_DEBUG("Executed " << name() << ", closing event number " << m_numberOfEvents );
-    
-    m_numberOfEvents++;
-    
     return StatusCode::SUCCESS;
 }
 
diff --git a/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/src/jTowerMakerFromSuperCells.cxx b/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/src/jTowerMakerFromSuperCells.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..ee68b1111d85e800cf5b9bfcc63c30428bb2647d
--- /dev/null
+++ b/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/src/jTowerMakerFromSuperCells.cxx
@@ -0,0 +1,132 @@
+/*
+    Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
+*/
+
+#undef NDEBUG
+
+#include "CaloEvent/CaloCellContainer.h"
+#include "CaloIdentifier/CaloIdManager.h"
+#include "CaloIdentifier/CaloCell_SuperCell_ID.h"
+
+#include "xAODTrigL1Calo/TriggerTowerContainer.h"
+
+#include "L1CaloFEXSim/jTower.h"
+#include "L1CaloFEXSim/jTowerBuilder.h"
+
+#include "L1CaloFEXSim/jSuperCellTowerMapper.h"
+#include "L1CaloFEXSim/jTowerMakerFromSuperCells.h"
+
+#include "SGTools/TestStore.h"
+#include "PathResolver/PathResolver.h"
+
+#include <fstream>
+
+#define DEBUG_VHB 1
+
+
+namespace LVL1 {
+
+jTowerMakerFromSuperCells::jTowerMakerFromSuperCells(const std::string& name, ISvcLocator* svc):  AthAlgorithm(name, svc) {}
+
+StatusCode jTowerMakerFromSuperCells::initialize()
+{
+
+    ATH_CHECK( m_jTowerBuilderTool.retrieve() );
+    ATH_CHECK( m_jSuperCellTowerMapperTool.retrieve() );
+    ATH_CHECK( m_jTowerContainerSGKey.initialize() );
+
+    std::unique_ptr<TFile> jTowerFile(TFile::Open(PathResolver::find_calib_file(m_PileupWeigthFile).c_str()));
+    std::unique_ptr<TFile> jTowerMapFile(TFile::Open(PathResolver::find_calib_file(m_PileupHelperFile).c_str()));
+    if (!jTowerFile || jTowerFile->IsZombie()) {
+        ATH_MSG_ERROR("Failed to open cell timing file " << m_PileupWeigthFile);
+        return StatusCode::FAILURE;
+    }
+    if (!jTowerMapFile || jTowerMapFile->IsZombie()) {
+        ATH_MSG_ERROR("Failed to open cell timing file " << m_PileupHelperFile);
+        return StatusCode::FAILURE;
+    }
+
+    m_jTowerArea_hist    = (TH1F*) jTowerFile->Get("jTowerArea_final_hist");
+    m_Firmware2BitwiseID = (TH1I*) jTowerMapFile->Get("Firmware2BitwiseID");
+    m_BinLayer           = (TH1I*) jTowerMapFile->Get("BinLayer");
+    m_EtaCoords          = (TH1F*) jTowerMapFile->Get("EtaCoords");
+    m_PhiCoords          = (TH1F*) jTowerMapFile->Get("PhiCoords");
+
+    //detach the Histograms from the TFiles
+    m_jTowerArea_hist->SetDirectory(0);
+    m_Firmware2BitwiseID->SetDirectory(0);
+    m_BinLayer->SetDirectory(0);
+    m_EtaCoords->SetDirectory(0);
+    m_PhiCoords->SetDirectory(0);
+
+    jTowerFile->Close();
+    jTowerMapFile->Close();
+
+
+    return StatusCode::SUCCESS;
+
+}
+
+
+StatusCode jTowerMakerFromSuperCells::execute() {
+
+
+    // STEP 0 - Make a fresh local jTowerContainer
+    std::unique_ptr<jTowerContainer> local_jTowerContainerRaw = std::make_unique<jTowerContainer>();
+
+    // STEP 1 - Make some jTowers and fill the local container
+    m_jTowerBuilderTool->init(local_jTowerContainerRaw);
+    local_jTowerContainerRaw->clearContainerMap();
+    local_jTowerContainerRaw->fillContainerMap();
+
+    // STEP 2 - Do the supercell-tower mapping - put this information into the jTowerContainer
+    ATH_CHECK(m_jSuperCellTowerMapperTool->AssignSuperCellsToTowers(local_jTowerContainerRaw));
+    ATH_CHECK(m_jSuperCellTowerMapperTool->AssignTriggerTowerMapper(local_jTowerContainerRaw));
+    ATH_CHECK(m_jSuperCellTowerMapperTool->AssignPileupAndNoiseValues(local_jTowerContainerRaw,m_jTowerArea_hist,m_Firmware2BitwiseID,m_BinLayer,m_EtaCoords,m_PhiCoords));
+
+    //STEP 2.5 - Set up a file mapping if necessary (should only need to be done if the mapping changes, which should never happen unless major changes to the simulation are required)
+    // Only used for simulation experts. Contact one of us first
+    // With just one event should be enough to generate the file
+    if(false) {
+
+        ATH_MSG_INFO("Writting the mapping for jFEX");
+        std::ofstream sc_tower_map;
+        sc_tower_map.open("./new_jfex_SCID.txt");
+        sc_tower_map << "# Simulation ID, 12 Scells (EMB or EMEC or FCAL1 layer) + 1 Scell (HEC or FCAL2/3 layer)" << "\n";
+
+        for(const auto & jtower : *local_jTowerContainerRaw) {
+            sc_tower_map << jtower->id() << " ";
+
+            std::vector<Identifier> vEM = jtower->getEMSCIDs();
+            for(const auto& SCellID : vEM) {
+                sc_tower_map << SCellID << " ";
+            }
+            for(unsigned int i=0; i<(12-vEM.size()); i++) {
+                sc_tower_map << "0xffffffffffffffff" << " ";
+            }
+
+            std::vector<Identifier> vHAD = jtower->getHADSCIDs();
+            for(const auto& SCellID : vHAD) {
+                sc_tower_map << SCellID << " ";
+            }
+            if(vHAD.size()==0) {
+                sc_tower_map << "0xffffffffffffffff" << " ";
+            }
+            sc_tower_map << "\n";
+        }
+
+        sc_tower_map.close();
+    }
+
+    // STEP 3 - Write the completed jTowerContainer into StoreGate (move the local copy in memory)
+    SG::WriteHandle<LVL1::jTowerContainer> jTowerContainerSG(m_jTowerContainerSGKey /*, ctx*/);
+    ATH_CHECK(jTowerContainerSG.record(std::move( local_jTowerContainerRaw ) ) );
+
+    // STEP 4 - Close and clean the event
+    m_jSuperCellTowerMapperTool->reset();
+    m_jTowerBuilderTool->reset();
+
+    return StatusCode::SUCCESS;
+}
+
+} // end of LVL1 namespace
diff --git a/Trigger/TrigT1/L1Topo/L1TopoConfig/Root/L1TopoConfigAlg.cxx b/Trigger/TrigT1/L1Topo/L1TopoConfig/Root/L1TopoConfigAlg.cxx
index 00b09cc9e6a785204a6220605d512fb26083c72f..928113b6cfd1bfd4ccea91cfd1d52076ba117879 100644
--- a/Trigger/TrigT1/L1Topo/L1TopoConfig/Root/L1TopoConfigAlg.cxx
+++ b/Trigger/TrigT1/L1Topo/L1TopoConfig/Root/L1TopoConfigAlg.cxx
@@ -5,8 +5,6 @@
 #include "L1TopoConfig/L1TopoConfigAlg.h"
 #include "L1TopoCommon/Exception.h"
 
-#include "boost/foreach.hpp"
-
 #include <iostream>
 #include <iomanip>
 #include <algorithm>
diff --git a/Trigger/TrigT1/L1Topo/L1TopoCoreSim/Root/Connector.cxx b/Trigger/TrigT1/L1Topo/L1TopoCoreSim/Root/Connector.cxx
index abb7d657fe70f6ca751718668abc0ba10be1be32..1dacc1fec4a3978ad6ebfbd06d9e7f47fd868ed6 100644
--- a/Trigger/TrigT1/L1Topo/L1TopoCoreSim/Root/Connector.cxx
+++ b/Trigger/TrigT1/L1Topo/L1TopoCoreSim/Root/Connector.cxx
@@ -11,8 +11,6 @@
 #include "L1TopoCoreSim/SortingConnector.h"
 #include "L1TopoCoreSim/InputConnector.h"
 
-#include "boost/foreach.hpp"
-
 using namespace std;
 using namespace TCS;
  
diff --git a/Trigger/TrigValidation/TrigAnalysisTest/share/ref_RDOtoRDOTrig_v1Dev_build.ref b/Trigger/TrigValidation/TrigAnalysisTest/share/ref_RDOtoRDOTrig_v1Dev_build.ref
index 697c4b6da7d93ce54b52110220f1d376fcdf3980..b810bfdd7c867d467ff7dd7c33e854194325150c 100644
--- a/Trigger/TrigValidation/TrigAnalysisTest/share/ref_RDOtoRDOTrig_v1Dev_build.ref
+++ b/Trigger/TrigValidation/TrigAnalysisTest/share/ref_RDOtoRDOTrig_v1Dev_build.ref
@@ -5112,7 +5112,11 @@ HLT_e26_lhtight_ivarloose_tau160_mediumRNN_tracktwoMVA_probe_03dRAB_L1EM22VHI:
   eventCount: 0
   stepFeatures:
     0: 7
-HLT_e26_lhtight_ivarloose_tau160_mediumRNN_tracktwoMVA_probe_03dRAB_L1eEM26M:
+HLT_e26_lhtight_ivarloose_tau160_mediumRNN_tracktwoMVA_probe_L1TAU100_03dRAB_L1eEM26M:
+  eventCount: 0
+  stepFeatures:
+    0: 8
+HLT_e26_lhtight_ivarloose_tau160_mediumRNN_tracktwoMVA_probe_L1eTAU140_03dRAB_L1eEM26M:
   eventCount: 0
   stepCounts:
     0: 1
@@ -5134,7 +5138,11 @@ HLT_e26_lhtight_ivarloose_tau180_mediumRNN_tracktwoLLP_probe_03dRAB_L1EM22VHI:
   eventCount: 0
   stepFeatures:
     0: 7
-HLT_e26_lhtight_ivarloose_tau180_mediumRNN_tracktwoLLP_probe_03dRAB_L1eEM26M:
+HLT_e26_lhtight_ivarloose_tau180_mediumRNN_tracktwoLLP_probe_L1TAU100_03dRAB_L1eEM26M:
+  eventCount: 0
+  stepFeatures:
+    0: 8
+HLT_e26_lhtight_ivarloose_tau180_mediumRNN_tracktwoLLP_probe_L1eTAU140_03dRAB_L1eEM26M:
   eventCount: 0
   stepCounts:
     0: 1
@@ -5179,7 +5187,34 @@ HLT_e26_lhtight_ivarloose_tau20_mediumRNN_tracktwoMVA_probe_03dRAB_L1EM22VHI:
     9: 14
     10: 14
     11: 3
-HLT_e26_lhtight_ivarloose_tau20_mediumRNN_tracktwoMVA_probe_03dRAB_L1eEM26M:
+HLT_e26_lhtight_ivarloose_tau20_mediumRNN_tracktwoMVA_probe_L1TAU8_03dRAB_L1eEM26M:
+  eventCount: 0
+  stepCounts:
+    0: 8
+    1: 8
+    2: 6
+    3: 6
+    4: 6
+    5: 6
+    6: 6
+    7: 6
+    8: 6
+    9: 6
+    10: 6
+  stepFeatures:
+    0: 8
+    1: 8
+    2: 10
+    3: 6
+    4: 6
+    5: 6
+    6: 6
+    7: 17
+    8: 17
+    9: 17
+    10: 17
+    11: 4
+HLT_e26_lhtight_ivarloose_tau20_mediumRNN_tracktwoMVA_probe_L1eTAU12_03dRAB_L1eEM26M:
   eventCount: 0
   stepCounts:
     0: 8
@@ -5233,7 +5268,34 @@ HLT_e26_lhtight_ivarloose_tau25_mediumRNN_tracktwoMVA_probe_03dRAB_L1EM22VHI:
     9: 8
     10: 8
     11: 3
-HLT_e26_lhtight_ivarloose_tau25_mediumRNN_tracktwoMVA_probe_03dRAB_L1eEM26M:
+HLT_e26_lhtight_ivarloose_tau25_mediumRNN_tracktwoMVA_probe_L1TAU12IM_03dRAB_L1eEM26M:
+  eventCount: 0
+  stepCounts:
+    0: 8
+    1: 8
+    2: 6
+    3: 6
+    4: 6
+    5: 6
+    6: 6
+    7: 6
+    8: 6
+    9: 6
+    10: 6
+  stepFeatures:
+    0: 8
+    1: 8
+    2: 10
+    3: 6
+    4: 6
+    5: 6
+    6: 6
+    7: 10
+    8: 10
+    9: 10
+    10: 10
+    11: 4
+HLT_e26_lhtight_ivarloose_tau25_mediumRNN_tracktwoMVA_probe_L1cTAU20M_03dRAB_L1eEM26M:
   eventCount: 0
   stepCounts:
     0: 8
@@ -5287,7 +5349,34 @@ HLT_e26_lhtight_ivarloose_tau35_mediumRNN_tracktwoMVA_probe_03dRAB_L1EM22VHI:
     9: 8
     10: 8
     11: 3
-HLT_e26_lhtight_ivarloose_tau35_mediumRNN_tracktwoMVA_probe_03dRAB_L1eEM26M:
+HLT_e26_lhtight_ivarloose_tau35_mediumRNN_tracktwoMVA_probe_L1TAU20IM_03dRAB_L1eEM26M:
+  eventCount: 0
+  stepCounts:
+    0: 8
+    1: 8
+    2: 6
+    3: 6
+    4: 6
+    5: 6
+    6: 6
+    7: 6
+    8: 6
+    9: 6
+    10: 6
+  stepFeatures:
+    0: 8
+    1: 8
+    2: 10
+    3: 6
+    4: 6
+    5: 6
+    6: 6
+    7: 9
+    8: 9
+    9: 9
+    10: 9
+    11: 3
+HLT_e26_lhtight_ivarloose_tau35_mediumRNN_tracktwoMVA_probe_L1cTAU30M_03dRAB_L1eEM26M:
   eventCount: 0
   stepCounts:
     0: 8
@@ -5341,7 +5430,34 @@ HLT_e26_lhtight_ivarloose_tau40_mediumRNN_tracktwoMVA_probe_03dRAB_L1EM22VHI:
     9: 7
     10: 7
     11: 3
-HLT_e26_lhtight_ivarloose_tau40_mediumRNN_tracktwoMVA_probe_03dRAB_L1eEM26M:
+HLT_e26_lhtight_ivarloose_tau40_mediumRNN_tracktwoMVA_probe_L1TAU25IM_03dRAB_L1eEM26M:
+  eventCount: 0
+  stepCounts:
+    0: 8
+    1: 8
+    2: 6
+    3: 6
+    4: 6
+    5: 6
+    6: 6
+    7: 6
+    8: 6
+    9: 6
+    10: 6
+  stepFeatures:
+    0: 8
+    1: 8
+    2: 10
+    3: 6
+    4: 6
+    5: 6
+    6: 6
+    7: 8
+    8: 8
+    9: 8
+    10: 8
+    11: 3
+HLT_e26_lhtight_ivarloose_tau40_mediumRNN_tracktwoMVA_probe_L1cTAU35M_03dRAB_L1eEM26M:
   eventCount: 0
   stepCounts:
     0: 8
@@ -5395,7 +5511,34 @@ HLT_e26_lhtight_ivarloose_tau60_mediumRNN_tracktwoLLP_probe_03dRAB_L1EM22VHI:
     9: 4
     10: 4
     11: 2
-HLT_e26_lhtight_ivarloose_tau60_mediumRNN_tracktwoLLP_probe_03dRAB_L1eEM26M:
+HLT_e26_lhtight_ivarloose_tau60_mediumRNN_tracktwoLLP_probe_L1TAU40_03dRAB_L1eEM26M:
+  eventCount: 0
+  stepCounts:
+    0: 7
+    1: 7
+    2: 5
+    3: 5
+    4: 5
+    5: 5
+    6: 5
+    7: 4
+    8: 4
+    9: 4
+    10: 4
+  stepFeatures:
+    0: 8
+    1: 7
+    2: 9
+    3: 5
+    4: 5
+    5: 5
+    6: 5
+    7: 5
+    8: 5
+    9: 5
+    10: 5
+    11: 2
+HLT_e26_lhtight_ivarloose_tau60_mediumRNN_tracktwoLLP_probe_L1eTAU60_03dRAB_L1eEM26M:
   eventCount: 0
   stepCounts:
     0: 7
@@ -5449,7 +5592,34 @@ HLT_e26_lhtight_ivarloose_tau60_mediumRNN_tracktwoMVA_probe_03dRAB_L1EM22VHI:
     9: 4
     10: 4
     11: 2
-HLT_e26_lhtight_ivarloose_tau60_mediumRNN_tracktwoMVA_probe_03dRAB_L1eEM26M:
+HLT_e26_lhtight_ivarloose_tau60_mediumRNN_tracktwoMVA_probe_L1TAU40_03dRAB_L1eEM26M:
+  eventCount: 0
+  stepCounts:
+    0: 7
+    1: 7
+    2: 5
+    3: 5
+    4: 5
+    5: 5
+    6: 5
+    7: 4
+    8: 4
+    9: 4
+    10: 4
+  stepFeatures:
+    0: 8
+    1: 7
+    2: 9
+    3: 5
+    4: 5
+    5: 5
+    6: 5
+    7: 5
+    8: 5
+    9: 5
+    10: 5
+    11: 2
+HLT_e26_lhtight_ivarloose_tau60_mediumRNN_tracktwoMVA_probe_L1eTAU60_03dRAB_L1eEM26M:
   eventCount: 0
   stepCounts:
     0: 7
@@ -5503,7 +5673,34 @@ HLT_e26_lhtight_ivarloose_tau80_mediumRNN_tracktwoLLP_probe_03dRAB_L1EM22VHI:
     9: 1
     10: 1
     11: 1
-HLT_e26_lhtight_ivarloose_tau80_mediumRNN_tracktwoLLP_probe_03dRAB_L1eEM26M:
+HLT_e26_lhtight_ivarloose_tau80_mediumRNN_tracktwoLLP_probe_L1TAU60_03dRAB_L1eEM26M:
+  eventCount: 0
+  stepCounts:
+    0: 6
+    1: 6
+    2: 4
+    3: 4
+    4: 4
+    5: 4
+    6: 4
+    7: 2
+    8: 2
+    9: 2
+    10: 2
+  stepFeatures:
+    0: 8
+    1: 6
+    2: 7
+    3: 4
+    4: 4
+    5: 4
+    6: 4
+    7: 2
+    8: 2
+    9: 2
+    10: 2
+    11: 1
+HLT_e26_lhtight_ivarloose_tau80_mediumRNN_tracktwoLLP_probe_L1eTAU80_03dRAB_L1eEM26M:
   eventCount: 0
   stepCounts:
     0: 6
@@ -5557,7 +5754,34 @@ HLT_e26_lhtight_ivarloose_tau80_mediumRNN_tracktwoMVA_probe_03dRAB_L1EM22VHI:
     9: 1
     10: 1
     11: 1
-HLT_e26_lhtight_ivarloose_tau80_mediumRNN_tracktwoMVA_probe_03dRAB_L1eEM26M:
+HLT_e26_lhtight_ivarloose_tau80_mediumRNN_tracktwoMVA_probe_L1TAU60_03dRAB_L1eEM26M:
+  eventCount: 0
+  stepCounts:
+    0: 6
+    1: 6
+    2: 4
+    3: 4
+    4: 4
+    5: 4
+    6: 4
+    7: 2
+    8: 2
+    9: 2
+    10: 2
+  stepFeatures:
+    0: 8
+    1: 6
+    2: 7
+    3: 4
+    4: 4
+    5: 4
+    6: 4
+    7: 2
+    8: 2
+    9: 2
+    10: 2
+    11: 1
+HLT_e26_lhtight_ivarloose_tau80_mediumRNN_tracktwoMVA_probe_L1eTAU80_03dRAB_L1eEM26M:
   eventCount: 0
   stepCounts:
     0: 6
diff --git a/Trigger/TrigValidation/TrigP1Test/share/ref_v1Dev_decodeBS_build.ref b/Trigger/TrigValidation/TrigP1Test/share/ref_v1Dev_decodeBS_build.ref
index c07d567175fa1f511cbea84190acae6a0e6d5733..e3f5335f74439aa22a7780c292760749facf5e5a 100644
--- a/Trigger/TrigValidation/TrigP1Test/share/ref_v1Dev_decodeBS_build.ref
+++ b/Trigger/TrigValidation/TrigP1Test/share/ref_v1Dev_decodeBS_build.ref
@@ -1776,43 +1776,63 @@ HLT_e26_lhtight_ivarloose_tau100_mediumRNN_tracktwoLLP_probe_03dRAB_L1EM22VHI:
   eventCount: 0
 HLT_e26_lhtight_ivarloose_tau160_mediumRNN_tracktwoMVA_probe_03dRAB_L1EM22VHI:
   eventCount: 0
-HLT_e26_lhtight_ivarloose_tau160_mediumRNN_tracktwoMVA_probe_03dRAB_L1eEM26M:
+HLT_e26_lhtight_ivarloose_tau160_mediumRNN_tracktwoMVA_probe_L1TAU100_03dRAB_L1eEM26M:
+  eventCount: 0
+HLT_e26_lhtight_ivarloose_tau160_mediumRNN_tracktwoMVA_probe_L1eTAU140_03dRAB_L1eEM26M:
   eventCount: 0
 HLT_e26_lhtight_ivarloose_tau180_mediumRNN_tracktwoLLP_probe_03dRAB_L1EM22VHI:
   eventCount: 0
-HLT_e26_lhtight_ivarloose_tau180_mediumRNN_tracktwoLLP_probe_03dRAB_L1eEM26M:
+HLT_e26_lhtight_ivarloose_tau180_mediumRNN_tracktwoLLP_probe_L1TAU100_03dRAB_L1eEM26M:
+  eventCount: 0
+HLT_e26_lhtight_ivarloose_tau180_mediumRNN_tracktwoLLP_probe_L1eTAU140_03dRAB_L1eEM26M:
   eventCount: 0
 HLT_e26_lhtight_ivarloose_tau20_mediumRNN_tracktwoMVA_probe_03dRAB_L1EM22VHI:
   eventCount: 0
-HLT_e26_lhtight_ivarloose_tau20_mediumRNN_tracktwoMVA_probe_03dRAB_L1eEM26M:
+HLT_e26_lhtight_ivarloose_tau20_mediumRNN_tracktwoMVA_probe_L1TAU8_03dRAB_L1eEM26M:
+  eventCount: 0
+HLT_e26_lhtight_ivarloose_tau20_mediumRNN_tracktwoMVA_probe_L1eTAU12_03dRAB_L1eEM26M:
   eventCount: 0
 HLT_e26_lhtight_ivarloose_tau25_mediumRNN_tracktwoMVA_probe_03dRAB_L1EM22VHI:
   eventCount: 0
-HLT_e26_lhtight_ivarloose_tau25_mediumRNN_tracktwoMVA_probe_03dRAB_L1eEM26M:
+HLT_e26_lhtight_ivarloose_tau25_mediumRNN_tracktwoMVA_probe_L1TAU12IM_03dRAB_L1eEM26M:
+  eventCount: 0
+HLT_e26_lhtight_ivarloose_tau25_mediumRNN_tracktwoMVA_probe_L1cTAU20M_03dRAB_L1eEM26M:
   eventCount: 0
 HLT_e26_lhtight_ivarloose_tau35_mediumRNN_tracktwoMVA_probe_03dRAB_L1EM22VHI:
   eventCount: 0
-HLT_e26_lhtight_ivarloose_tau35_mediumRNN_tracktwoMVA_probe_03dRAB_L1eEM26M:
+HLT_e26_lhtight_ivarloose_tau35_mediumRNN_tracktwoMVA_probe_L1TAU20IM_03dRAB_L1eEM26M:
+  eventCount: 0
+HLT_e26_lhtight_ivarloose_tau35_mediumRNN_tracktwoMVA_probe_L1cTAU30M_03dRAB_L1eEM26M:
   eventCount: 0
 HLT_e26_lhtight_ivarloose_tau40_mediumRNN_tracktwoMVA_probe_03dRAB_L1EM22VHI:
   eventCount: 0
-HLT_e26_lhtight_ivarloose_tau40_mediumRNN_tracktwoMVA_probe_03dRAB_L1eEM26M:
+HLT_e26_lhtight_ivarloose_tau40_mediumRNN_tracktwoMVA_probe_L1TAU25IM_03dRAB_L1eEM26M:
+  eventCount: 0
+HLT_e26_lhtight_ivarloose_tau40_mediumRNN_tracktwoMVA_probe_L1cTAU35M_03dRAB_L1eEM26M:
   eventCount: 0
 HLT_e26_lhtight_ivarloose_tau60_mediumRNN_tracktwoLLP_probe_03dRAB_L1EM22VHI:
   eventCount: 0
-HLT_e26_lhtight_ivarloose_tau60_mediumRNN_tracktwoLLP_probe_03dRAB_L1eEM26M:
+HLT_e26_lhtight_ivarloose_tau60_mediumRNN_tracktwoLLP_probe_L1TAU40_03dRAB_L1eEM26M:
+  eventCount: 0
+HLT_e26_lhtight_ivarloose_tau60_mediumRNN_tracktwoLLP_probe_L1eTAU60_03dRAB_L1eEM26M:
   eventCount: 0
 HLT_e26_lhtight_ivarloose_tau60_mediumRNN_tracktwoMVA_probe_03dRAB_L1EM22VHI:
   eventCount: 0
-HLT_e26_lhtight_ivarloose_tau60_mediumRNN_tracktwoMVA_probe_03dRAB_L1eEM26M:
+HLT_e26_lhtight_ivarloose_tau60_mediumRNN_tracktwoMVA_probe_L1TAU40_03dRAB_L1eEM26M:
+  eventCount: 0
+HLT_e26_lhtight_ivarloose_tau60_mediumRNN_tracktwoMVA_probe_L1eTAU60_03dRAB_L1eEM26M:
   eventCount: 0
 HLT_e26_lhtight_ivarloose_tau80_mediumRNN_tracktwoLLP_probe_03dRAB_L1EM22VHI:
   eventCount: 0
-HLT_e26_lhtight_ivarloose_tau80_mediumRNN_tracktwoLLP_probe_03dRAB_L1eEM26M:
+HLT_e26_lhtight_ivarloose_tau80_mediumRNN_tracktwoLLP_probe_L1TAU60_03dRAB_L1eEM26M:
+  eventCount: 0
+HLT_e26_lhtight_ivarloose_tau80_mediumRNN_tracktwoLLP_probe_L1eTAU80_03dRAB_L1eEM26M:
   eventCount: 0
 HLT_e26_lhtight_ivarloose_tau80_mediumRNN_tracktwoMVA_probe_03dRAB_L1EM22VHI:
   eventCount: 0
-HLT_e26_lhtight_ivarloose_tau80_mediumRNN_tracktwoMVA_probe_03dRAB_L1eEM26M:
+HLT_e26_lhtight_ivarloose_tau80_mediumRNN_tracktwoMVA_probe_L1TAU60_03dRAB_L1eEM26M:
+  eventCount: 0
+HLT_e26_lhtight_ivarloose_tau80_mediumRNN_tracktwoMVA_probe_L1eTAU80_03dRAB_L1eEM26M:
   eventCount: 0
 HLT_e26_lhtight_ivarmedium_L1EM22VHI:
   eventCount: 0
diff --git a/Trigger/TrigValidation/TrigValAlgs/python/TrigValAlgsConfig.py b/Trigger/TrigValidation/TrigValAlgs/python/TrigValAlgsConfig.py
index 82ab07f6bf4b7765baf7314c60500738c24fe9f3..16b2ffb714027d07a74bb72a922d433af57e3693 100755
--- a/Trigger/TrigValidation/TrigValAlgs/python/TrigValAlgsConfig.py
+++ b/Trigger/TrigValidation/TrigValAlgs/python/TrigValAlgsConfig.py
@@ -57,3 +57,4 @@ if __name__ == '__main__':
     cfg = ComponentAccumulator()
     cfg.merge( TrigEDMCheckerCfg(flags) )
     cfg.merge( TrigEDMAuxCheckerCfg(flags) )
+    cfg.wasMerged()
diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Config/Validation/CheckL1HLTConsistency.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Config/Validation/CheckL1HLTConsistency.py
index 3aa099aefe49b48071d6ca23aa503a451c6049c4..fe6146b3ed5310c522432ac57d58a90c50a453b2 100644
--- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Config/Validation/CheckL1HLTConsistency.py
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Config/Validation/CheckL1HLTConsistency.py
@@ -175,8 +175,9 @@ def checkL1HLTConsistency(flags):
                 if foundLegacyCaloSeed and foundPhase1CaloSeed: # chain without L1 calo items, cannot have both legacy and phase1 seeds
                     mixedCaloSeed = True 
         if mixedCaloSeed:
-            log.error('[checkL1HLTConsistency] chain %s contains a mix of legacy and phase1 calo thresholds! L1 items: [%s] (legacy item = %s), L1 seeds: [%s] (foundPhase1CaloSeed = %s, foundLegacyCaloSeed = %s)', chain["chainName"], ",".join(l1item_vec), legacyItem,  ",".join(l1thr_vec), foundPhase1CaloSeed, foundLegacyCaloSeed )
-            raise Exception("Please fix the chain.")
+            log.warning('[checkL1HLTConsistency] chain %s contains a mix of legacy and phase1 calo thresholds! L1 items: [%s] (legacy item = %s), L1 seeds: [%s] (foundPhase1CaloSeed = %s, foundLegacyCaloSeed = %s)', chain["chainName"], ",".join(l1item_vec), legacyItem,  ",".join(l1thr_vec), foundPhase1CaloSeed, foundLegacyCaloSeed )
+            # log.error('[checkL1HLTConsistency] chain %s contains a mix of legacy and phase1 calo thresholds! L1 items: [%s] (legacy item = %s), L1 seeds: [%s] (foundPhase1CaloSeed = %s, foundLegacyCaloSeed = %s)', chain["chainName"], ",".join(l1item_vec), legacyItem,  ",".join(l1thr_vec), foundPhase1CaloSeed, foundLegacyCaloSeed )
+            # raise Exception("Please fix the chain.")
 
         # check legacy and phase1 chains have the correct groups 
         wrongLabel = False
diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Menu/Physics_pp_run3_v1.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Menu/Physics_pp_run3_v1.py
index 0bf4edbbd6d002e6e8e4db9fade4cdfbccdcef66..5be099eddb9e1e0072dba7b5f4153382c134db3d 100644
--- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Menu/Physics_pp_run3_v1.py
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Menu/Physics_pp_run3_v1.py
@@ -2003,16 +2003,30 @@ def setupMenu(menu_name):
         ChainProp(name='HLT_e26_lhtight_ivarloose_tau180_mediumRNN_tracktwoLLP_probe_03dRAB_L1EM22VHI', l1SeedThresholds=['EM22VHI','PROBETAU100'], stream=[PhysicsStream], groups=TagAndProbeLegGroup+SingleElectronGroup),
 
         # Phase-I tau+X chains with elec L1
-        ChainProp(name='HLT_e26_lhtight_ivarloose_tau20_mediumRNN_tracktwoMVA_probe_03dRAB_L1eEM26M', l1SeedThresholds=['eEM26M','PROBEeTAU12'], stream=[PhysicsStream], groups=TagAndProbePhIGroup+SingleElectronGroup),
-        ChainProp(name='HLT_e26_lhtight_ivarloose_tau25_mediumRNN_tracktwoMVA_probe_03dRAB_L1eEM26M', l1SeedThresholds=['eEM26M','PROBEcTAU20M'], stream=[PhysicsStream], groups=TagAndProbePhIGroup+SingleElectronGroup, monGroups=['tauMon:t0']),
-        ChainProp(name='HLT_e26_lhtight_ivarloose_tau35_mediumRNN_tracktwoMVA_probe_03dRAB_L1eEM26M', l1SeedThresholds=['eEM26M','PROBEcTAU30M'], stream=[PhysicsStream], groups=TagAndProbePhIGroup+SingleElectronGroup),
-        ChainProp(name='HLT_e26_lhtight_ivarloose_tau40_mediumRNN_tracktwoMVA_probe_03dRAB_L1eEM26M', l1SeedThresholds=['eEM26M','PROBEcTAU35M'], stream=[PhysicsStream], groups=TagAndProbePhIGroup+SingleElectronGroup),
-        ChainProp(name='HLT_e26_lhtight_ivarloose_tau60_mediumRNN_tracktwoMVA_probe_03dRAB_L1eEM26M', l1SeedThresholds=['eEM26M','PROBEeTAU60'], stream=[PhysicsStream], groups=TagAndProbePhIGroup+SingleElectronGroup),
-        ChainProp(name='HLT_e26_lhtight_ivarloose_tau80_mediumRNN_tracktwoMVA_probe_03dRAB_L1eEM26M', l1SeedThresholds=['eEM26M','PROBEeTAU80'], stream=[PhysicsStream], groups=TagAndProbePhIGroup+SingleElectronGroup, monGroups=['tauMon:t0']),
-        ChainProp(name='HLT_e26_lhtight_ivarloose_tau160_mediumRNN_tracktwoMVA_probe_03dRAB_L1eEM26M', l1SeedThresholds=['eEM26M','PROBEeTAU140'], stream=[PhysicsStream], groups=TagAndProbePhIGroup+SingleElectronGroup),
-        ChainProp(name='HLT_e26_lhtight_ivarloose_tau60_mediumRNN_tracktwoLLP_probe_03dRAB_L1eEM26M', l1SeedThresholds=['eEM26M','PROBEeTAU60'], stream=[PhysicsStream], groups=TagAndProbePhIGroup+SingleElectronGroup),
-        ChainProp(name='HLT_e26_lhtight_ivarloose_tau80_mediumRNN_tracktwoLLP_probe_03dRAB_L1eEM26M', l1SeedThresholds=['eEM26M','PROBEeTAU80'], stream=[PhysicsStream], groups=TagAndProbePhIGroup+SingleElectronGroup),
-        ChainProp(name='HLT_e26_lhtight_ivarloose_tau180_mediumRNN_tracktwoLLP_probe_03dRAB_L1eEM26M', l1SeedThresholds=['eEM26M','PROBEeTAU140'], stream=[PhysicsStream], groups=TagAndProbePhIGroup+SingleElectronGroup), 
+        ChainProp(name='HLT_e26_lhtight_ivarloose_tau20_mediumRNN_tracktwoMVA_probe_L1eTAU12_03dRAB_L1eEM26M', l1SeedThresholds=['eEM26M','PROBEeTAU12'], stream=[PhysicsStream], groups=TagAndProbePhIGroup+SingleElectronGroup),
+        ChainProp(name='HLT_e26_lhtight_ivarloose_tau25_mediumRNN_tracktwoMVA_probe_L1cTAU20M_03dRAB_L1eEM26M', l1SeedThresholds=['eEM26M','PROBEcTAU20M'], stream=[PhysicsStream], groups=TagAndProbePhIGroup+SingleElectronGroup, monGroups=['tauMon:t0']),
+        ChainProp(name='HLT_e26_lhtight_ivarloose_tau35_mediumRNN_tracktwoMVA_probe_L1cTAU30M_03dRAB_L1eEM26M', l1SeedThresholds=['eEM26M','PROBEcTAU30M'], stream=[PhysicsStream], groups=TagAndProbePhIGroup+SingleElectronGroup),
+        ChainProp(name='HLT_e26_lhtight_ivarloose_tau40_mediumRNN_tracktwoMVA_probe_L1cTAU35M_03dRAB_L1eEM26M', l1SeedThresholds=['eEM26M','PROBEcTAU35M'], stream=[PhysicsStream], groups=TagAndProbePhIGroup+SingleElectronGroup),
+        ChainProp(name='HLT_e26_lhtight_ivarloose_tau60_mediumRNN_tracktwoMVA_probe_L1eTAU60_03dRAB_L1eEM26M', l1SeedThresholds=['eEM26M','PROBEeTAU60'], stream=[PhysicsStream], groups=TagAndProbePhIGroup+SingleElectronGroup),
+        ChainProp(name='HLT_e26_lhtight_ivarloose_tau80_mediumRNN_tracktwoMVA_probe_L1eTAU80_03dRAB_L1eEM26M', l1SeedThresholds=['eEM26M','PROBEeTAU80'], stream=[PhysicsStream], groups=TagAndProbePhIGroup+SingleElectronGroup, monGroups=['tauMon:t0']),
+        ChainProp(name='HLT_e26_lhtight_ivarloose_tau160_mediumRNN_tracktwoMVA_probe_L1eTAU140_03dRAB_L1eEM26M', l1SeedThresholds=['eEM26M','PROBEeTAU140'], stream=[PhysicsStream], groups=TagAndProbePhIGroup+SingleElectronGroup),
+        ChainProp(name='HLT_e26_lhtight_ivarloose_tau60_mediumRNN_tracktwoLLP_probe_L1eTAU60_03dRAB_L1eEM26M', l1SeedThresholds=['eEM26M','PROBEeTAU60'], stream=[PhysicsStream], groups=TagAndProbePhIGroup+SingleElectronGroup),
+        ChainProp(name='HLT_e26_lhtight_ivarloose_tau80_mediumRNN_tracktwoLLP_probe_L1eTAU80_03dRAB_L1eEM26M', l1SeedThresholds=['eEM26M','PROBEeTAU80'], stream=[PhysicsStream], groups=TagAndProbePhIGroup+SingleElectronGroup),
+        ChainProp(name='HLT_e26_lhtight_ivarloose_tau180_mediumRNN_tracktwoLLP_probe_L1eTAU140_03dRAB_L1eEM26M', l1SeedThresholds=['eEM26M','PROBEeTAU140'], stream=[PhysicsStream], groups=TagAndProbePhIGroup+SingleElectronGroup), 
+        
+        #tau + X intermediate Phase-I tag, Legacy probe 
+        ChainProp(name='HLT_e26_lhtight_ivarloose_tau20_mediumRNN_tracktwoMVA_probe_L1TAU8_03dRAB_L1eEM26M', l1SeedThresholds=['eEM26M','PROBETAU8'], stream=[PhysicsStream], groups=TagAndProbePhIGroup+SingleElectronGroup),
+        ChainProp(name='HLT_e26_lhtight_ivarloose_tau25_mediumRNN_tracktwoMVA_probe_L1TAU12IM_03dRAB_L1eEM26M', l1SeedThresholds=['eEM26M','PROBETAU12IM'], stream=[PhysicsStream], groups=TagAndProbePhIGroup+SingleElectronGroup, monGroups=['tauMon:t0']),
+        ChainProp(name='HLT_e26_lhtight_ivarloose_tau35_mediumRNN_tracktwoMVA_probe_L1TAU20IM_03dRAB_L1eEM26M', l1SeedThresholds=['eEM26M','PROBETAU20IM'], stream=[PhysicsStream], groups=TagAndProbePhIGroup+SingleElectronGroup),
+        ChainProp(name='HLT_e26_lhtight_ivarloose_tau40_mediumRNN_tracktwoMVA_probe_L1TAU25IM_03dRAB_L1eEM26M', l1SeedThresholds=['eEM26M','PROBETAU25IM'], stream=[PhysicsStream], groups=TagAndProbePhIGroup+SingleElectronGroup),
+        ChainProp(name='HLT_e26_lhtight_ivarloose_tau60_mediumRNN_tracktwoMVA_probe_L1TAU40_03dRAB_L1eEM26M', l1SeedThresholds=['eEM26M','PROBETAU40'], stream=[PhysicsStream], groups=TagAndProbePhIGroup+SingleElectronGroup),
+        ChainProp(name='HLT_e26_lhtight_ivarloose_tau80_mediumRNN_tracktwoMVA_probe_L1TAU60_03dRAB_L1eEM26M', l1SeedThresholds=['eEM26M','PROBETAU60'], stream=[PhysicsStream], groups=TagAndProbePhIGroup+SingleElectronGroup, monGroups=['tauMon:t0']),
+        ChainProp(name='HLT_e26_lhtight_ivarloose_tau160_mediumRNN_tracktwoMVA_probe_L1TAU100_03dRAB_L1eEM26M', l1SeedThresholds=['eEM26M','PROBETAU100'], stream=[PhysicsStream], groups=TagAndProbePhIGroup+SingleElectronGroup),
+        ChainProp(name='HLT_e26_lhtight_ivarloose_tau60_mediumRNN_tracktwoLLP_probe_L1TAU40_03dRAB_L1eEM26M', l1SeedThresholds=['eEM26M','PROBETAU40'], stream=[PhysicsStream], groups=TagAndProbePhIGroup+SingleElectronGroup),
+        ChainProp(name='HLT_e26_lhtight_ivarloose_tau80_mediumRNN_tracktwoLLP_probe_L1TAU60_03dRAB_L1eEM26M', l1SeedThresholds=['eEM26M','PROBETAU60'], stream=[PhysicsStream], groups=TagAndProbePhIGroup+SingleElectronGroup),
+        ChainProp(name='HLT_e26_lhtight_ivarloose_tau180_mediumRNN_tracktwoLLP_probe_L1TAU100_03dRAB_L1eEM26M', l1SeedThresholds=['eEM26M','PROBETAU100'], stream=[PhysicsStream], groups=TagAndProbePhIGroup+SingleElectronGroup), 
+
+        
 
         # MET + tau tag and probe chains (ATR-23507)
         ChainProp(name='HLT_tau20_mediumRNN_tracktwoMVA_probe_xe65_cell_xe90_pfopufit_L1XE50', l1SeedThresholds=['PROBETAU8','FSNOSEED','FSNOSEED'],  groups=TagAndProbeLegGroup+TauMETGroup),
diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/L1/Base/Connectors.py b/Trigger/TriggerCommon/TriggerMenuMT/python/L1/Base/Connectors.py
index a8b2596e4ebd168f8bc115e0fe0edc0649ee3076..9e1a7c58204243db5e394c48359a8ea82a5e4d22 100644
--- a/Trigger/TriggerCommon/TriggerMenuMT/python/L1/Base/Connectors.py
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/L1/Base/Connectors.py
@@ -221,11 +221,8 @@ class ElectricalConnector(Connector):
                     if signal is None:
                         startbit += nbits
                         continue
-                    flatindex = 0
-                    if connDef["name"]=="LegacyTopoMerged":
-                        flatindex = 2*startbit + clock
-                    else: # AlfaCtpin
-                        flatindex = 32*clock + startbit 
+                    # use a single flatindex value for ALFA and Topo legacy boards
+                    flatindex = 2*startbit + clock
                     tl = TriggerLine( name = signal, startbit = startbit, flatindex = flatindex, nbits = nbits, fpga = None, clock = clock)
                     startbit += nbits
                     self.addTriggerLine(tl, 0, clock)