diff --git a/MuonSpectrometer/MuonCnv/MuonCSC_CnvTools/src/CscRDO_Decoder.cxx b/MuonSpectrometer/MuonCnv/MuonCSC_CnvTools/src/CscRDO_Decoder.cxx
index 06d5acf038ee8943acc6e268e6c83214ea9fcc2b..052c33c2a5813d540a39ec400c0a57cd5c923207 100644
--- a/MuonSpectrometer/MuonCnv/MuonCSC_CnvTools/src/CscRDO_Decoder.cxx
+++ b/MuonSpectrometer/MuonCnv/MuonCSC_CnvTools/src/CscRDO_Decoder.cxx
@@ -10,11 +10,8 @@
 /** constructor */ 
 Muon::CscRDO_Decoder::CscRDO_Decoder
 ( const std::string& type, const std::string& name,const IInterface* parent )
-  :  base_class(type,name,parent),
-     m_cabling( "CSCcablingSvc" ,name),
-     m_cscCalibTool( "CscCalibTool") {
-  
-  declareProperty("CscCalibTool",        m_cscCalibTool );
+  : base_class(type,name,parent)
+{  
 }
 
 StatusCode Muon::CscRDO_Decoder::initialize()
diff --git a/MuonSpectrometer/MuonCnv/MuonCSC_CnvTools/src/CscRDO_Decoder.h b/MuonSpectrometer/MuonCnv/MuonCSC_CnvTools/src/CscRDO_Decoder.h
index e2ecf3ec9417ffd56a74c492f04ffabc05b96b61..510483137dbfb6b7c0f70725c48fce099a42c4bf 100644
--- a/MuonSpectrometer/MuonCnv/MuonCSC_CnvTools/src/CscRDO_Decoder.h
+++ b/MuonSpectrometer/MuonCnv/MuonCSC_CnvTools/src/CscRDO_Decoder.h
@@ -58,8 +58,8 @@ namespace Muon {
     std::string m_detdescr;
     ToolHandle<Muon::MuonIdHelperTool> m_muonIdHelperTool{this, "idHelper", 
       "Muon::MuonIdHelperTool/MuonIdHelperTool", "Handle to the MuonIdHelperTool"};
-    ServiceHandle<CSCcablingSvc>      m_cabling;
-    ToolHandle<ICscCalibTool>         m_cscCalibTool;
+    ServiceHandle<CSCcablingSvc>       m_cabling{this, "CSCcablingSvc", "CSCcablingSvc", "CSC cabling service handle"};
+    ToolHandle<ICscCalibTool>          m_cscCalibTool{this, "cscCalibTool", "CscCalibTool", "CSC calibration tool handle"};
     double   m_timeOffset   ;
     double   m_samplingTime ;
     double   m_signalWidth  ;
diff --git a/MuonSpectrometer/MuonConfig/python/CSC_DigitizationConfig.py b/MuonSpectrometer/MuonConfig/python/CSC_DigitizationConfig.py
index 800e8751c3f03dbb9b319646f5263e9aabde9830..86ebbc9504648436bb5134b1fc98a3227fb5a0b7 100644
--- a/MuonSpectrometer/MuonConfig/python/CSC_DigitizationConfig.py
+++ b/MuonSpectrometer/MuonConfig/python/CSC_DigitizationConfig.py
@@ -7,9 +7,7 @@ from AthenaConfiguration.ComponentFactory import CompFactory
 from OutputStreamAthenaPool.OutputStreamConfig import OutputStreamCfg
 from MuonConfig.MuonGeometryConfig import MuonGeoModelCfg
 from MuonConfig.MuonCondAlgConfig import CscCondDbAlgCfg
-CscDigitizationTool, CscDigitBuilder=CompFactory.getComps("CscDigitizationTool","CscDigitBuilder",)
-PileUpXingFolder=CompFactory.PileUpXingFolder
-from MuonConfig.MuonByteStreamCnvTestConfig import CscDigitToCscRDOCfg, CscOverlayDigitToCscRDOCfg
+from MuonConfig.MuonByteStreamCnvTestConfig import CscDigitToCscRDOCfg
 from MuonConfig.MuonCablingConfig import CSCCablingConfigCfg
 from Digitization.TruthDigitizationOutputConfig import TruthDigitizationOutputCfg
 from Digitization.PileUpToolsConfig import PileUpToolsCfg
@@ -31,21 +29,16 @@ def CSC_RangeToolCfg(flags, name="CSC_Range", **kwargs):
     kwargs.setdefault("LastXing",  CSC_LastXing())
     kwargs.setdefault("CacheRefreshFrequency", 1.0)
     kwargs.setdefault("ItemList", ["CSCSimHitCollection#CSC_Hits"])
+    PileUpXingFolder = CompFactory.PileUpXingFolder
     return PileUpXingFolder(name, **kwargs)
 
 
-def CSC_DigitizationToolCfg(flags, name="CSC_DigitizationTool", **kwargs):
+def CSC_DigitizationToolCommonCfg(flags, name="CSC_DigitizationTool", **kwargs):
     """Return a ComponentAccumulator with configured CscDigitizationTool"""
     acc = ComponentAccumulator()
     if flags.Digitization.DoXingByXingPileUp:
         kwargs.setdefault("FirstXing", CSC_FirstXing())
         kwargs.setdefault("LastXing",  CSC_LastXing())
-    kwargs.setdefault("InputObjectName", "CSC_Hits")
-    kwargs.setdefault("OutputObjectName", "CSC_DIGITS")
-    if flags.Digitization.PileUpPremixing:
-        kwargs.setdefault("CSCSimDataCollectionOutputName", flags.Overlay.BkgPrefix + "CSC_SDO")
-    else:
-        kwargs.setdefault("CSCSimDataCollectionOutputName", "CSC_SDO")
     kwargs.setdefault("pedestal", 0.0)
     kwargs.setdefault("WindowLowerOffset", -25.0)
     kwargs.setdefault("WindowUpperOffset",  25.0)
@@ -54,19 +47,32 @@ def CSC_DigitizationToolCfg(flags, name="CSC_DigitizationTool", **kwargs):
     kwargs.setdefault("NewDigitEDM", True)
     kwargs.setdefault("DriftVelocity", 39)
     kwargs.setdefault("ElectronEnergy", 66) # eV
+
+    from MuonConfig.MuonCalibConfig import CscCalibToolCfg
+    kwargs.setdefault("cscCalibTool", acc.popToolsAndMerge(CscCalibToolCfg(flags)))
+
+    CscDigitizationTool = CompFactory.CscDigitizationTool
     acc.setPrivateTools(CscDigitizationTool(name, **kwargs))
     return acc
 
 
-def CSC_OverlayDigitizationToolCfg(flags, name="CSC_OverlayDigitizationTool",**kwargs):
+def CSC_DigitizationToolCfg(flags, name="CSC_DigitizationTool", **kwargs):
+    """Return a ComponentAccumulator with configured CscDigitizationTool"""
+    kwargs.setdefault("InputObjectName", "CSC_Hits")
+    kwargs.setdefault("OutputObjectName", "CSC_DIGITS")
+    if flags.Digitization.PileUpPremixing:
+        kwargs.setdefault("CSCSimDataCollectionOutputName", flags.Overlay.BkgPrefix + "CSC_SDO")
+    else:
+        kwargs.setdefault("CSCSimDataCollectionOutputName", "CSC_SDO")
+    return CSC_DigitizationToolCommonCfg(flags, name, **kwargs)
+
+
+def CSC_OverlayDigitizationToolCfg(flags, name="CscOverlayDigitizationTool", **kwargs):
     """Return a ComponentAccumulator with CscDigitizationTool configured for Overlay"""
-    acc = ComponentAccumulator()
     kwargs.setdefault("OnlyUseContainerName", False)
-    kwargs.setdefault("OutputObjectName", "StoreGateSvc+" + flags.Overlay.SigPrefix + "CSC_DIGITS")
-    if not flags.Overlay.DataOverlay:
-        kwargs.setdefault("CSCSimDataCollectionOutputName", "StoreGateSvc+" + flags.Overlay.SigPrefix + "CSC_SDO")
-    acc.setPrivateTools(CscDigitizationTool(name, **kwargs))
-    return acc
+    kwargs.setdefault("OutputObjectName", flags.Overlay.SigPrefix + "CSC_DIGITS")
+    kwargs.setdefault("CSCSimDataCollectionOutputName", flags.Overlay.SigPrefix + "CSC_SDO")
+    return CSC_DigitizationToolCommonCfg(flags, name, **kwargs)
 
 
 def CSC_OutputCfg(flags):
@@ -98,7 +104,12 @@ def CSC_OverlayDigitizationBasicCfg(flags, **kwargs):
     if "DigitizationTool" not in kwargs:
         tool = acc.popToolsAndMerge(CSC_OverlayDigitizationToolCfg(flags))
         kwargs["DigitizationTool"] = tool
-    acc.addEventAlgo(CscDigitBuilder(**kwargs))
+
+    if flags.Concurrency.NumThreads > 0:
+        kwargs.setdefault("Cardinality", flags.Concurrency.NumThreads)
+
+    CscDigitBuilder = CompFactory.CscDigitBuilder
+    acc.addEventAlgo(CscDigitBuilder(name="CscOverlayDigitBuilder", **kwargs))
     return acc
 
 
@@ -110,24 +121,9 @@ def CSC_DigitizationCfg(flags, **kwargs):
     return acc
 
 
-def CSC_OverlayDigitizationCfg(flags, **kwargs):
-    """Return ComponentAccumulator with CSC Overlay digitization and Output"""
-    acc = CSC_OverlayDigitizationBasicCfg(flags, **kwargs)
-    acc.merge(CSC_OutputCfg(flags))
-    return acc
-
-
 def CSC_DigitizationDigitToRDOCfg(flags):
     """Return ComponentAccumulator with CSC Digitization and Digit to CSCRDO"""
     acc = CSC_DigitizationCfg(flags)
     acc.merge(CSCCablingConfigCfg(flags))
     acc.merge(CscDigitToCscRDOCfg(flags))
     return acc
-
-
-def CSC_OverlayDigitizationDigitToRDOCfg(flags):
-    """Return ComponentAccumulator with CSC Overlay Digitization and Digit to CSCRDO"""
-    acc = CSC_OverlayDigitizationCfg(flags)
-    acc.merge(CSCCablingConfigCfg(flags))
-    acc.merge(CscOverlayDigitToCscRDOCfg(flags))
-    return acc
diff --git a/MuonSpectrometer/MuonConfig/python/CscOverlayConfig.py b/MuonSpectrometer/MuonConfig/python/CscOverlayConfig.py
new file mode 100644
index 0000000000000000000000000000000000000000..55073cb5543f6b9fc7fb84460a2b9295f1e69814
--- /dev/null
+++ b/MuonSpectrometer/MuonConfig/python/CscOverlayConfig.py
@@ -0,0 +1,99 @@
+
+"""Define methods to construct configured CSC overlay algorithms
+
+Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
+"""
+
+from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
+from AthenaConfiguration.ComponentFactory import CompFactory
+
+
+def CSCDataOverlayExtraCfg(flags, **kwargs):
+    """Return a ComponentAccumulator with CSC data overlay specifics"""
+    acc = ComponentAccumulator()
+
+    # We need to convert BS to RDO for data overlay
+    from MuonConfig.MuonBytestreamDecodeConfig import CscBytestreamDecodeCfg
+    acc.merge(CscBytestreamDecodeCfg(flags))
+
+    return acc
+
+
+def CscOverlayAlgCfg(flags, name="CscOverlay", **kwargs):
+    """Return a ComponentAccumulator for CSCOverlay algorithm"""
+    from MuonConfig.MuonCalibConfig import CscCalibToolCfg
+    acc = CscCalibToolCfg(flags)
+    kwargs.setdefault("CalibTool", acc.popPrivateTools())
+
+    from MuonConfig.MuonCSC_CnvToolsConfig import MuonCscRDODecoderCfg
+    kwargs.setdefault("CscRdoDecoderTool", acc.popToolsAndMerge(MuonCscRDODecoderCfg(flags)))
+
+    kwargs.setdefault("BkgInputKey", flags.Overlay.BkgPrefix + "CSCRDO")
+    kwargs.setdefault("SignalInputKey", flags.Overlay.SigPrefix + "CSCRDO")
+    kwargs.setdefault("OutputKey", "CSCRDO")
+
+    kwargs.setdefault("isDataOverlay", flags.Overlay.DataOverlay)
+
+    # Do CSC overlay
+    CscOverlay = CompFactory.CscOverlay
+    alg = CscOverlay(name, **kwargs)
+    acc.addEventAlgo(alg)
+
+    # Setup output
+    from OutputStreamAthenaPool.OutputStreamConfig import OutputStreamCfg
+    acc.merge(OutputStreamCfg(flags, "RDO", ItemList=[
+        "CscRawDataContainer#CSCRDO"
+    ]))
+
+    return acc
+
+
+def CscTruthOverlayCfg(flags, name="CscTruthOverlay", **kwargs):
+    """Return a ComponentAccumulator for the CSC SDO overlay algorithm"""
+    acc = ComponentAccumulator()
+
+    # We do not need background CSC SDOs
+    if flags.Overlay.DataOverlay:
+        kwargs.setdefault("BkgInputKey", "")
+    else:
+        kwargs.setdefault("BkgInputKey",
+                          flags.Overlay.BkgPrefix + "CSC_SDO")
+
+    kwargs.setdefault("SignalInputKey",
+                      flags.Overlay.SigPrefix + "CSC_SDO")
+    kwargs.setdefault("OutputKey", "CSC_SDO")
+
+    # Do CSC truth overlay
+    CscSimDataOverlay = CompFactory.CscSimDataOverlay
+    alg = CscSimDataOverlay(name, **kwargs)
+    acc.addEventAlgo(alg)
+
+    # Setup output
+    from OutputStreamAthenaPool.OutputStreamConfig import OutputStreamCfg
+    acc.merge(OutputStreamCfg(flags, "RDO", ItemList=[
+        "CscSimDataCollection#CSC_SDO"
+    ]))
+
+    return acc
+
+
+def CscOverlayCfg(flags):
+    """Configure and return a ComponentAccumulator for CSC overlay"""
+    acc = ComponentAccumulator()
+
+    # Add data overlay specifics
+    if flags.Overlay.DataOverlay:
+        acc.merge(CSCDataOverlayExtraCfg(flags))
+
+    # Add CSC overlay digitization algorithm
+    from MuonConfig.CSC_DigitizationConfig import CSC_OverlayDigitizationBasicCfg
+    acc.merge(CSC_OverlayDigitizationBasicCfg(flags))
+    # Add CSC digit to RDO config
+    from MuonConfig.MuonByteStreamCnvTestConfig import CscDigitToCscRDOCfg
+    acc.merge(CscDigitToCscRDOCfg(flags))
+    # Add CSC overlay algorithm
+    acc.merge(CscOverlayAlgCfg(flags))
+    # Add CSC truth overlay
+    acc.merge(CscTruthOverlayCfg(flags))
+
+    return acc
diff --git a/MuonSpectrometer/MuonConfig/python/MDT_DigitizationConfig.py b/MuonSpectrometer/MuonConfig/python/MDT_DigitizationConfig.py
index 350fb82977af1a382cc791affd049e17a4ae13e9..3c2875333e122e445c570c342606bac43c86f06f 100644
--- a/MuonSpectrometer/MuonConfig/python/MDT_DigitizationConfig.py
+++ b/MuonSpectrometer/MuonConfig/python/MDT_DigitizationConfig.py
@@ -1,16 +1,12 @@
 """Define methods to construct configured MDT Digitization tools and algorithms
 
-Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 """
 from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
 from AthenaConfiguration.ComponentFactory import CompFactory
 from OutputStreamAthenaPool.OutputStreamConfig import OutputStreamCfg
 from MuonConfig.MuonGeometryConfig import MuonGeoModelCfg
-from MDT_Digitization.MDT_DigitizationConf import (
-    MdtDigitizationTool, MDT_Response_DigiTool, RT_Relation_DB_DigiTool, MDT_Digitizer
-)
-PileUpXingFolder=CompFactory.PileUpXingFolder
-from MuonConfig.MuonByteStreamCnvTestConfig import MdtDigitToMdtRDOCfg, MdtOverlayDigitToMdtRDOCfg
+from MuonConfig.MuonByteStreamCnvTestConfig import MdtDigitToMdtRDOCfg
 from MuonConfig.MuonCablingConfig import MDTCablingConfigCfg
 from Digitization.TruthDigitizationOutputConfig import TruthDigitizationOutputCfg
 from Digitization.PileUpToolsConfig import PileUpToolsCfg
@@ -33,11 +29,13 @@ def MDT_RangeToolCfg(flags, name="MDT_Range", **kwargs):
     kwargs.setdefault("LastXing",  MDT_LastXing())
     kwargs.setdefault("CacheRefreshFrequency", 1.0)
     kwargs.setdefault("ItemList", ["MDTSimHitCollection#MDT_Hits"])
+    PileUpXingFolder=CompFactory.PileUpXingFolder
     return PileUpXingFolder(name, **kwargs)
 
 
 def RT_Relation_DB_DigiToolCfg(flags, name="RT_Relation_DB_DigiTool", **kwargs):
     """Return an RT_Relation_DB_DigiTool"""
+    RT_Relation_DB_DigiTool = CompFactory.RT_Relation_DB_DigiTool
     return RT_Relation_DB_DigiTool(name, **kwargs)
 
 
@@ -45,11 +43,12 @@ def MDT_Response_DigiToolCfg(flags, name="MDT_Response_DigiTool",**kwargs):
     """Return a configured MDT_Response_DigiTool"""
     QballConfig = (flags.Digitization.SpecialConfiguration.get("MDT_QballConfig") == "True")
     kwargs.setdefault("DoQballGamma", QballConfig)
+    MDT_Response_DigiTool = CompFactory.MDT_Response_DigiTool
     return MDT_Response_DigiTool(name, **kwargs)
 
 
-def MDT_DigitizationToolCfg(flags, name="MDT_DigitizationTool", **kwargs):
-    """Return ComponentAccumulator with configured MdtDigitizationTool"""
+def MDT_DigitizationToolCommonCfg(flags, name="MDT_DigitizationTool", **kwargs):
+    """Return ComponentAccumulator with common MdtDigitizationTool config"""
     from MuonConfig.MuonCondAlgConfig import MdtCondDbAlgCfg # MT-safe conditions access
     acc = MdtCondDbAlgCfg(flags)
     kwargs.setdefault("MaskedStations", [])
@@ -63,24 +62,28 @@ def MDT_DigitizationToolCfg(flags, name="MDT_DigitizationTool", **kwargs):
     if flags.Digitization.DoXingByXingPileUp:
         kwargs.setdefault("FirstXing", MDT_FirstXing())
         kwargs.setdefault("LastXing", MDT_LastXing())
+    MdtDigitizationTool = CompFactory.MdtDigitizationTool
+    acc.setPrivateTools(MdtDigitizationTool(name, **kwargs))
+    return acc
+
+
+def MDT_DigitizationToolCfg(flags, name="MDT_DigitizationTool", **kwargs):
+    """Return ComponentAccumulator with configured MdtDigitizationTool"""
     kwargs.setdefault("OutputObjectName", "MDT_DIGITS")
     if flags.Digitization.PileUpPremixing:
         kwargs.setdefault("OutputSDOName", flags.Overlay.BkgPrefix + "MDT_SDO")
     else:
         kwargs.setdefault("OutputSDOName", "MDT_SDO")
-    acc.setPrivateTools(MdtDigitizationTool(name, **kwargs))
-    return acc
+    return MDT_DigitizationToolCommonCfg(flags, name, **kwargs)
 
 
-def MDT_OverlayDigitizationToolCfg(flags, name="MDT_OverlayDigitizationTool",**kwargs):
+def MDT_OverlayDigitizationToolCfg(flags, name="Mdt_OverlayDigitizationTool", **kwargs):
     """Return ComponentAccumulator with MdtDigitizationTool configured for Overlay"""
-    acc = ComponentAccumulator()
     kwargs.setdefault("OnlyUseContainerName", False)
-    kwargs.setdefault("OutputObjectName", "StoreGateSvc+" + flags.Overlay.SigPrefix + "MDT_DIGITS")
-    kwargs.setdefault("GetT0FromBD", flags.Detector.Overlay)
-    if not flags.Overlay.DataOverlay:
-        kwargs.setdefault("OutputSDOName", "StoreGateSvc+" + flags.Overlay.SigPrefix + "MDT_SDO")
-    return acc
+    kwargs.setdefault("OutputObjectName", flags.Overlay.SigPrefix + "MDT_DIGITS")
+    kwargs.setdefault("OutputSDOName", flags.Overlay.SigPrefix + "MDT_SDO")
+    kwargs.setdefault("GetT0FromBD", flags.Detector.OverlayMDT and not flags.Input.isMC)
+    return MDT_DigitizationToolCommonCfg(flags, name, **kwargs)
 
 
 def MDT_OutputCfg(flags):
@@ -110,7 +113,12 @@ def MDT_OverlayDigitizationBasicCfg(flags, **kwargs):
     if "DigitizationTool" not in kwargs:
         tool = acc.popToolsAndMerge(MDT_OverlayDigitizationToolCfg(flags))
         kwargs["DigitizationTool"] = tool
-    acc.addEventAlgo(MDT_Digitizer(**kwargs))
+
+    if flags.Concurrency.NumThreads > 0:
+       kwargs.setdefault("Cardinality", flags.Concurrency.NumThreads)
+
+    MDT_Digitizer = CompFactory.MDT_Digitizer
+    acc.addEventAlgo(MDT_Digitizer(name="MDT_OverlayDigitizer", **kwargs))
     return acc
 
 
@@ -122,24 +130,9 @@ def MDT_DigitizationCfg(flags, **kwargs):
     return acc
 
 
-def MDT_OverlayDigitizationCfg(flags, **kwargs):
-    """Return ComponentAccumulator with MDT Overlay digitization and Output"""
-    acc = MDT_OverlayDigitizationBasicCfg(flags, **kwargs)
-    acc.merge(MDT_OutputCfg(flags))
-    return acc
-
-
 def MDT_DigitizationDigitToRDOCfg(flags):
     """Return ComponentAccumulator with MDT digitization and Digit to MDTCSM RDO"""
     acc = MDT_DigitizationCfg(flags)
     acc.merge(MDTCablingConfigCfg(flags))
     acc.merge(MdtDigitToMdtRDOCfg(flags))
     return acc
-
-
-def MDT_OverlayDigitizationDigitToRDOCfg(flags):
-    """Return ComponentAccumulator with MDT Overlay digitization and Digit to MDTCSM RDO"""
-    acc = MDT_OverlayDigitizationCfg(flags)
-    acc.merge(MDTCablingConfigCfg(flags))
-    acc.merge(MdtOverlayDigitToMdtRDOCfg(flags))
-    return acc
diff --git a/MuonSpectrometer/MuonConfig/python/MdtOverlayConfig.py b/MuonSpectrometer/MuonConfig/python/MdtOverlayConfig.py
new file mode 100644
index 0000000000000000000000000000000000000000..ebffac04842d87e74d3d18595a2c22354772f45f
--- /dev/null
+++ b/MuonSpectrometer/MuonConfig/python/MdtOverlayConfig.py
@@ -0,0 +1,97 @@
+
+"""Define methods to construct configured MDT overlay algorithms
+
+Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
+"""
+
+from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
+from AthenaConfiguration.ComponentFactory import CompFactory
+
+
+def MDTDataOverlayExtraCfg(flags, **kwargs):
+    """Return a ComponentAccumulator with MDT data overlay specifics"""
+    acc = ComponentAccumulator()
+
+    # We need to convert BS to RDO for data overlay
+    from MuonConfig.MuonBytestreamDecodeConfig import MdtBytestreamDecodeCfg
+    acc.merge(MdtBytestreamDecodeCfg(flags))
+
+    return acc
+
+
+def MdtOverlayAlgCfg(flags, name="MdtOverlay", **kwargs):
+    """Return a ComponentAccumulator for MDTOverlay algorithm"""
+    acc = ComponentAccumulator()
+
+    kwargs.setdefault("BkgInputKey", flags.Overlay.BkgPrefix + "MDT_DIGITS")
+    kwargs.setdefault("SignalInputKey", flags.Overlay.SigPrefix + "MDT_DIGITS")
+    kwargs.setdefault("OutputKey", "MDT_DIGITS")
+
+    kwargs.setdefault("IntegrationWindow", 20) # in ns
+
+    # Do MDT overlay
+    MdtOverlay = CompFactory.MdtOverlay
+    alg = MdtOverlay(name, **kwargs)
+    acc.addEventAlgo(alg)
+
+    # Setup output
+    from OutputStreamAthenaPool.OutputStreamConfig import OutputStreamCfg
+    acc.merge(OutputStreamCfg(flags, "RDO", ItemList=[
+        "MdtCsmContainer#MDTCSM"
+    ]))
+
+    return acc
+
+
+def MdtTruthOverlayCfg(flags, name="MdtTruthOverlay", **kwargs):
+    """Return a ComponentAccumulator for the MDT SDO overlay algorithm"""
+    acc = ComponentAccumulator()
+
+    # We do not need background MDT SDOs
+    if flags.Overlay.DataOverlay:
+        kwargs.setdefault("BkgInputKey", "")
+    else:
+        kwargs.setdefault("BkgInputKey",
+                          flags.Overlay.BkgPrefix + "MDT_SDO")
+
+    kwargs.setdefault("SignalInputKey",
+                      flags.Overlay.SigPrefix + "MDT_SDO")
+    kwargs.setdefault("OutputKey", "MDT_SDO")
+
+    # Do MDT truth overlay
+    MuonSimDataOverlay = CompFactory.MuonSimDataOverlay
+    alg = MuonSimDataOverlay(name, **kwargs)
+    acc.addEventAlgo(alg)
+
+    # Setup output
+    from OutputStreamAthenaPool.OutputStreamConfig import OutputStreamCfg
+    acc.merge(OutputStreamCfg(flags, "RDO", ItemList=[
+        "MuonSimDataCollection#MDT_SDO"
+    ]))
+
+    return acc
+
+
+def MdtOverlayCfg(flags):
+    """Configure and return a ComponentAccumulator for MDT overlay"""
+    acc = ComponentAccumulator()
+
+    # Add data overlay specifics
+    if flags.Overlay.DataOverlay:
+        acc.merge(MDTDataOverlayExtraCfg(flags))
+
+    # Add MDT RDO to digit config
+    from MuonConfig.MuonByteStreamCnvTestConfig import MdtRdoToMdtDigitCfg
+    acc.merge(MdtRdoToMdtDigitCfg(flags))
+    # Add MDT overlay digitization algorithm
+    from MuonConfig.MDT_DigitizationConfig import MDT_OverlayDigitizationBasicCfg
+    acc.merge(MDT_OverlayDigitizationBasicCfg(flags))
+    # Add MDT overlay algorithm
+    acc.merge(MdtOverlayAlgCfg(flags))
+    # Add MDT truth overlay
+    acc.merge(MdtTruthOverlayCfg(flags))
+    # Add MDT digit to RDO config
+    from MuonConfig.MuonByteStreamCnvTestConfig import MdtDigitToMdtRDOCfg
+    acc.merge(MdtDigitToMdtRDOCfg(flags))
+
+    return acc
diff --git a/MuonSpectrometer/MuonConfig/python/MuonByteStreamCnvTestConfig.py b/MuonSpectrometer/MuonConfig/python/MuonByteStreamCnvTestConfig.py
index 43482003af004034edfc75c4e2c485fe6d786bf7..3607db8f187f454c559abfbd7ac97f4eef9a80db 100644
--- a/MuonSpectrometer/MuonConfig/python/MuonByteStreamCnvTestConfig.py
+++ b/MuonSpectrometer/MuonConfig/python/MuonByteStreamCnvTestConfig.py
@@ -1,22 +1,22 @@
 """Define ComponentAccumulator functions for configuration of muon data conversions
 
-Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 """
 from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
 from AthenaConfiguration.ComponentFactory import CompFactory
-from MuonByteStreamCnvTest.MuonByteStreamCnvTestConf import (
-    MdtRdoToMdtDigit, RpcRdoToRpcDigit, TgcRdoToTgcDigit, STGC_RdoToDigit, MM_RdoToDigit, 
-    MdtDigitToMdtRDO, RpcDigitToRpcRDO, TgcDigitToTgcRDO, STGC_DigitToRDO, MM_DigitToRDO, CscDigitToCscRDO
-)
-CscDigitToCscRDOTool=CompFactory.CscDigitToCscRDOTool
-from MuonConfig.MuonCalibConfig import CscCalibToolCfg
+
 
 def MdtRdoToMdtDigitCfg(flags, name="MdtRdoToMdtDigitAlg", **kwargs):
     """Return ComponentAccumulator with configured MdtRdoToMdtDigit algorithm"""
     acc = ComponentAccumulator()
-    if flags.Detector.Overlay:
+    from MuonConfig.MuonCablingConfig import MDTCablingConfigCfg
+    from MuonConfig.MuonCalibConfig import MdtCalibDbAlgCfg
+    acc.merge(MDTCablingConfigCfg(flags))
+    acc.merge(MdtCalibDbAlgCfg(flags))
+    if flags.Detector.OverlayMDT:
         kwargs.setdefault("MdtRdoContainer", flags.Overlay.BkgPrefix + "MDTCSM")
         kwargs.setdefault("MdtDigitContainer", flags.Overlay.BkgPrefix + "MDT_DIGITS")
+    MdtRdoToMdtDigit = CompFactory.MdtRdoToMdtDigit
     acc.addEventAlgo(MdtRdoToMdtDigit(name, **kwargs))
     return acc
 
@@ -24,9 +24,12 @@ def MdtRdoToMdtDigitCfg(flags, name="MdtRdoToMdtDigitAlg", **kwargs):
 def RpcRdoToRpcDigitCfg(flags, name="RpcRdoToRpcDigitAlg", **kwargs):
     """Return ComponentAccumulator with configured RpcRdoToRpcDigit algorithm"""
     acc = ComponentAccumulator()
-    if flags.Detector.Overlay:
+    from MuonConfig.MuonCablingConfig import RPCCablingConfigCfg
+    acc.merge(RPCCablingConfigCfg(flags))
+    if flags.Detector.OverlayRPC:
         kwargs.setdefault("RpcRdoContainer", flags.Overlay.BkgPrefix + "RPCPAD")
         kwargs.setdefault("RpcDigitContainer", flags.Overlay.BkgPrefix + "RPC_DIGITS")
+    RpcRdoToRpcDigit = CompFactory.RpcRdoToRpcDigit
     acc.addEventAlgo(RpcRdoToRpcDigit(name, **kwargs))
     return acc
 
@@ -34,9 +37,12 @@ def RpcRdoToRpcDigitCfg(flags, name="RpcRdoToRpcDigitAlg", **kwargs):
 def TgcRdoToTgcDigitCfg(flags, name="TgcRdoToTgcDigitAlg", **kwargs):
     """Return ComponentAccumulator with configured TgcRdoToTgcDigit algorithm"""
     acc = ComponentAccumulator()
-    if flags.Detector.Overlay:
+    from MuonConfig.MuonCablingConfig import TGCCablingConfigCfg
+    acc.merge(TGCCablingConfigCfg(flags))
+    if flags.Detector.OverlayTGC:
         kwargs.setdefault("TgcRdoContainer", flags.Overlay.BkgPrefix + "TGCRDO")
         kwargs.setdefault("TgcDigitContainer", flags.Overlay.BkgPrefix + "TGC_DIGITS")
+    TgcRdoToTgcDigit = CompFactory.TgcRdoToTgcDigit
     acc.addEventAlgo(TgcRdoToTgcDigit(name, **kwargs))
     return acc
 
@@ -44,9 +50,10 @@ def TgcRdoToTgcDigitCfg(flags, name="TgcRdoToTgcDigitAlg", **kwargs):
 def STGC_RdoToDigitCfg(flags, name="STGC_RdoToDigitAlg", **kwargs):
     """Return ComponentAccumulator with configured STGC_RdoToDigit algorithm"""
     acc = ComponentAccumulator()
-    if flags.Detector.Overlay:
+    if flags.Detector.OverlaysTGC:
         kwargs.setdefault("sTgcRdoContainer", flags.Overlay.BkgPrefix + "sTGCRDO")
         kwargs.setdefault("sTgcDigitContainer", flags.Overlay.BkgPrefix + "sTGC_DIGITS")
+    STGC_RdoToDigit = CompFactory.STGC_RdoToDigit
     acc.addEventAlgo(STGC_RdoToDigit(name, **kwargs))
     return acc
 
@@ -54,9 +61,10 @@ def STGC_RdoToDigitCfg(flags, name="STGC_RdoToDigitAlg", **kwargs):
 def MM_RdoToDigitCfg(flags, name="MM_RdoToDigitAlg", **kwargs):
     """Return ComponentAccumulator with configured MM_RdoToDigit algorithm"""
     acc = ComponentAccumulator()
-    if flags.Detector.Overlay:
+    if flags.Detector.OverlayMM:
         kwargs.setdefault("MmRdoContainer", flags.Overlay.BkgPrefix + "MMRDO")
         kwargs.setdefault("MmDigitContainer", flags.Overlay.BkgPrefix + "MM_DIGITS")
+    MM_RdoToDigit = CompFactory.MM_RdoToDigit
     acc.addEventAlgo(MM_RdoToDigit(name, **kwargs))
     return acc
 
@@ -68,15 +76,7 @@ def MdtDigitToMdtRDOCfg(flags, name="MdtDigitToMdtRDO", **kwargs):
         kwargs.setdefault("OutputObjectName", flags.Overlay.BkgPrefix + "MDTCSM")
     else:
         kwargs.setdefault("OutputObjectName", "MDTCSM")
-    acc.addEventAlgo(MdtDigitToMdtRDO(name, **kwargs))
-    return acc
-
-
-def MdtOverlayDigitToMdtRDOCfg(flags, name="MdtOverlayDigitToMdtRDO", **kwargs):
-    """Return ComponentAccumulator with Overlay configured MdtDigitToMdtRDO algorithm"""
-    acc = ComponentAccumulator()
-    kwargs.setdefault("InputObjectName", flags.Overlay.SigPrefix + "MDT_DIGITS")
-    kwargs.setdefault("OutputObjectName", flags.Overlay.SigPrefix + "MDTCSM")
+    MdtDigitToMdtRDO = CompFactory.MdtDigitToMdtRDO
     acc.addEventAlgo(MdtDigitToMdtRDO(name, **kwargs))
     return acc
 
@@ -88,15 +88,7 @@ def RpcDigitToRpcRDOCfg(flags, name="RpcDigitToRpcRDO", **kwargs):
         kwargs.setdefault("OutputObjectName", flags.Overlay.BkgPrefix + "RPCPAD")
     else:
         kwargs.setdefault("OutputObjectName", "RPCPAD")
-    acc.addEventAlgo(RpcDigitToRpcRDO(name, **kwargs))
-    return acc
-
-
-def RpcOverlayDigitToRpcRDOCfg(flags, name="RpcOverlayDigitToRpcRDO", **kwargs):
-    """Return ComponentAccumulator with Overlay configured RpcDigitToRpcRDO algorithm"""
-    acc = ComponentAccumulator()
-    kwargs.setdefault("InputObjectName", flags.Overlay.SigPrefix + "RPC_DIGITS")
-    kwargs.setdefault("OutputObjectName", flags.Overlay.SigPrefix + "RPCPAD")
+    RpcDigitToRpcRDO = CompFactory.RpcDigitToRpcRDO
     acc.addEventAlgo(RpcDigitToRpcRDO(name, **kwargs))
     return acc
 
@@ -108,49 +100,38 @@ def TgcDigitToTgcRDOCfg(flags, name="TgcDigitToTgcRDO", **kwargs):
         kwargs.setdefault("OutputObjectName", flags.Overlay.BkgPrefix + "TGCRDO")
     else:
         kwargs.setdefault("OutputObjectName", "TGCRDO")
+    TgcDigitToTgcRDO = CompFactory.TgcDigitToTgcRDO
     acc.addEventAlgo(TgcDigitToTgcRDO(name, **kwargs))
     return acc
 
 
-def TgcOverlayDigitToTgcRDOCfg(flags, name="TgcOverlayDigitToTgcRDO", **kwargs):
-    """Return ComponentAccumulator with Overlay configured TgcDigitToTgcRDO algorithm"""
-    acc = ComponentAccumulator()
-    kwargs.setdefault("InputObjectName", flags.Overlay.SigPrefix + "TGC_DIGITS")
-    kwargs.setdefault("OutputObjectName", flags.Overlay.SigPrefix + "TGCRDO")
-    acc.addEventAlgo(TgcDigitToTgcRDO(name, **kwargs))
-    return acc
-
-
-def CscDigitToCscRDOCfg(flags, name="CscDigitToCscRDO", **kwargs):
+def CscDigitToCscRDOCfg(flags, name="CscDigitToCscRDO4", **kwargs):
     """Return ComponentAccumulator with configured CscDigitToCscRDO algorithm"""
     # for Csc, configuration is in the tool CscDigitToCscRDOTool
     # configure dependency
+    from MuonConfig.MuonCalibConfig import CscCalibToolCfg
     acc = CscCalibToolCfg(flags)
     CscCalibTool = acc.popPrivateTools()
     # configure basic parameters
     kwargs.setdefault("cscCalibTool", CscCalibTool)
     kwargs.setdefault("NumSamples", 4)
     kwargs.setdefault("Latency", 0)
-    kwargs.setdefault("addNoise", True) # doMuonNoise flag not migrated
-    if flags.Digitization.PileUpPremixing:
+    kwargs.setdefault("addNoise", not flags.Detector.OverlayCSC) # doMuonNoise flag not migrated
+    if flags.Detector.OverlayCSC:
+        kwargs.setdefault("InputObjectName", flags.Overlay.SigPrefix + "CSC_DIGITS")
+        kwargs.setdefault("OutputObjectName", flags.Overlay.SigPrefix + "CSCRDO")
+    elif flags.Digitization.PileUpPremixing:
         kwargs.setdefault("OutputObjectName", flags.Overlay.BkgPrefix + "CSCRDO")
     else:
         kwargs.setdefault("OutputObjectName", "CSCRDO")
     # tool and container algorithm
-    tool = CscDigitToCscRDOTool(name + "Tool", **kwargs)
+    CscDigitToCscRDOTool = CompFactory.CscDigitToCscRDOTool
+    tool = CscDigitToCscRDOTool("CscDigitToCscRDOTool4", **kwargs)
+    CscDigitToCscRDO = CompFactory.CscDigitToCscRDO
     acc.addEventAlgo(CscDigitToCscRDO(name, CscDigitToRDOTool=tool))
     return acc
 
 
-def CscOverlayDigitToCscRDOCfg(flags, name="CscOverlayDigitToCscRDO", **kwargs):
-    """Return ComponentAccumulator with Overlay configured CscDigitToCscRDO algorithm"""
-    kwargs.setdefault("NumSamples", 4)
-    kwargs.setdefault("addNoise", False)
-    kwargs.setdefault("InputObjectName", flags.Overlay.SigPrefix + "CSC_DIGITS")
-    kwargs.setdefault("OutputObjectName", flags.Overlay.SigPrefix + "CSCRDO")
-    return CscDigitToCscRDOCfg(flags, name, **kwargs)
-
-
 def STGC_DigitToRDOCfg(flags, name="STGC_DigitToRDO", **kwargs):
     """Return ComponentAccumulator with configured STGC_DigitToRDO algorithm"""
     acc = ComponentAccumulator()
@@ -158,15 +139,7 @@ def STGC_DigitToRDOCfg(flags, name="STGC_DigitToRDO", **kwargs):
         kwargs.setdefault("OutputObjectName", flags.Overlay.BkgPrefix + "sTGCRDO")
     else:
         kwargs.setdefault("OutputObjectName", "sTGCRDO")
-    acc.addEventAlgo(STGC_DigitToRDO(name, **kwargs))
-    return acc
-
-
-def STGC_OverlayDigitToRDOCfg(flags, name="STGC_OverlayDigitToRDO", **kwargs):
-    """Return ComponentAccumulator with Overlay configured STGC_DigitToRDO algorithm"""
-    acc = ComponentAccumulator()
-    kwargs.setdefault("InputObjectName", flags.Overlay.SigPrefix + "sTGC_DIGITS")
-    kwargs.setdefault("OutputObjectName", flags.Overlay.SigPrefix + "STGCRDO")
+    STGC_DigitToRDO = CompFactory.STGC_DigitToRDO
     acc.addEventAlgo(STGC_DigitToRDO(name, **kwargs))
     return acc
 
@@ -178,15 +151,7 @@ def MM_DigitToRDOCfg(flags, name="MM_DigitToRDO", **kwargs):
         kwargs.setdefault("OutputObjectName", flags.Overlay.BkgPrefix + "MMRDO")
     else:
         kwargs.setdefault("OutputObjectName", "MMRDO")
-    acc.addEventAlgo(MM_DigitToRDO(name, **kwargs))
-    return acc
-
-
-def MM_OverlayDigitToRDOCfg(flags, name="MM_OverlayDigitToRDO", **kwargs):
-    """Return ComponentAccumulator with Overlay configured MM_DigitToRDO algorithm"""
-    acc = ComponentAccumulator()
-    kwargs.setdefault("InputObjectName", flags.Overlay.SigPrefix + "MM_DIGITS")
-    kwargs.setdefault("OutputObjectName", flags.Overlay.SigPrefix + "MMRDO")
+    MM_DigitToRDO = CompFactory.MM_DigitToRDO
     acc.addEventAlgo(MM_DigitToRDO(name, **kwargs))
     return acc
 
@@ -194,8 +159,9 @@ def MM_OverlayDigitToRDOCfg(flags, name="MM_OverlayDigitToRDO", **kwargs):
 def SigMdtDigitToMdtRDOCfg(flags, name="SigMdtDigitToMdtRDO", **kwargs):
     """Return ComponentAccumulator with configured MdtDigitToMdtRDO algorithm"""
     acc = ComponentAccumulator()
-    kwargs.setdefault("InputObjectName", flags.Overlay.Legacy.EventStore + "+MDT_DIGITS")
-    kwargs.setdefault("OutputObjectName", flags.Overlay.Legacy.EventStore + "+MDTCSM")
+    kwargs.setdefault("InputObjectName", flags.Overlay.SigPrefix + "MDT_DIGITS")
+    kwargs.setdefault("OutputObjectName", flags.Overlay.SigPrefix + "MDTCSM")
+    MdtDigitToMdtRDO = CompFactory.MdtDigitToMdtRDO
     acc.addEventAlgo(MdtDigitToMdtRDO(name, **kwargs))
     return acc
 
@@ -203,8 +169,9 @@ def SigMdtDigitToMdtRDOCfg(flags, name="SigMdtDigitToMdtRDO", **kwargs):
 def SigRpcDigitToRpcRDOCfg(flags, name="SigRpcDigitToRpcRDO", **kwargs):
     """Return ComponentAccumulator with configured RpcDigitToRpcRDO algorithm"""
     acc = ComponentAccumulator()
-    kwargs.setdefault("InputObjectName", flags.Overlay.Legacy.EventStore + "+RPC_DIGITS")
-    kwargs.setdefault("OutputObjectName", flags.Overlay.Legacy.EventStore + "+RPCPAD")
+    kwargs.setdefault("InputObjectName", flags.Overlay.SigPrefix + "RPC_DIGITS")
+    kwargs.setdefault("OutputObjectName", flags.Overlay.SigPrefix + "RPCPAD")
+    RpcDigitToRpcRDO = CompFactory.RpcDigitToRpcRDO
     acc.addEventAlgo(RpcDigitToRpcRDO(name, **kwargs))
     return acc
 
@@ -212,8 +179,9 @@ def SigRpcDigitToRpcRDOCfg(flags, name="SigRpcDigitToRpcRDO", **kwargs):
 def SigTgcDigitToTgcRDOCfg(flags, name="SigTgcDigitToTgcRDO", **kwargs):
     """Return ComponentAccumulator with configured TgcDigitToTgcRDO algorithm"""
     acc = ComponentAccumulator()
-    kwargs.setdefault("InputObjectName", flags.Overlay.Legacy.EventStore + "+TGC_DIGITS")
-    kwargs.setdefault("OutputObjectName", flags.Overlay.Legacy.EventStore + "+TGCRDO")
+    kwargs.setdefault("InputObjectName", flags.Overlay.SigPrefix + "TGC_DIGITS")
+    kwargs.setdefault("OutputObjectName", flags.Overlay.SigPrefix + "TGCRDO")
+    TgcDigitToTgcRDO = CompFactory.TgcDigitToTgcRDO
     acc.addEventAlgo(TgcDigitToTgcRDO(name, **kwargs))
     return acc
 
diff --git a/MuonSpectrometer/MuonConfig/python/MuonBytestreamDecodeConfig.py b/MuonSpectrometer/MuonConfig/python/MuonBytestreamDecodeConfig.py
index ae447293546755d151adba7ad8e4fa3281c0e9fe..b61d1ecc61c4a4717679d2319079eb784a3747b3 100644
--- a/MuonSpectrometer/MuonConfig/python/MuonBytestreamDecodeConfig.py
+++ b/MuonSpectrometer/MuonConfig/python/MuonBytestreamDecodeConfig.py
@@ -52,9 +52,11 @@ def RpcBytestreamDecodeCfg(flags, forTrigger=False):
     acc.addService( robDPSvc )
 
     # Setup the RAW data provider tool
+    keyName = flags.Overlay.BkgPrefix + "RPCPAD" if flags.Detector.OverlayRPC else "RPCPAD"
     Muon__RPC_RawDataProviderToolMT=CompFactory.Muon__RPC_RawDataProviderToolMT
     MuonRpcRawDataProviderTool = Muon__RPC_RawDataProviderToolMT(name    = "RPC_RawDataProviderToolMT",
-                                                               Decoder = RPCRodDecoder )
+                                                                 Decoder = RPCRodDecoder,
+                                                                 RdoLocation = keyName )
     if forTrigger:
         MuonRpcRawDataProviderTool.RpcContainerCacheKey   = MuonCacheNames.RpcCache
         MuonRpcRawDataProviderTool.WriteOutRpcSectorLogic = False
@@ -95,9 +97,11 @@ def TgcBytestreamDecodeCfg(flags, forTrigger=False):
     acc.addService( robDPSvc )
 
     # Setup the RAW data provider tool
+    keyName = flags.Overlay.BkgPrefix + "TGCRDO" if flags.Detector.OverlayTGC else "TGCRDO"
     Muon__TGC_RawDataProviderToolMT=CompFactory.Muon__TGC_RawDataProviderToolMT
     MuonTgcRawDataProviderTool = Muon__TGC_RawDataProviderToolMT(name    = "TGC_RawDataProviderToolMT",
-                                                               Decoder = TGCRodDecoder )
+                                                                 Decoder = TGCRodDecoder,
+                                                                 RdoLocation = keyName )
 
     if forTrigger:
         MuonTgcRawDataProviderTool.TgcContainerCacheKey   = MuonCacheNames.TgcCache
@@ -138,9 +142,11 @@ def MdtBytestreamDecodeCfg(flags, forTrigger=False):
     acc.addService( robDPSvc )
 
     # Setup the RAW data provider tool
+    keyName = flags.Overlay.BkgPrefix + "MDTCSM" if flags.Detector.OverlayMDT else "MDTCSM"
     Muon__MDT_RawDataProviderToolMT=CompFactory.Muon__MDT_RawDataProviderToolMT
     MuonMdtRawDataProviderTool = Muon__MDT_RawDataProviderToolMT(name    = "MDT_RawDataProviderToolMT",
-                                                                 Decoder = MDTRodDecoder)
+                                                                 Decoder = MDTRodDecoder,
+                                                                 RdoLocation = keyName)
 
     if forTrigger:
         MuonMdtRawDataProviderTool.CsmContainerCacheKey = MuonCacheNames.MdtCsmCache
@@ -177,9 +183,11 @@ def CscBytestreamDecodeCfg(flags, forTrigger=False):
     acc.addService( robDPSvc )
 
     # Setup the RAW data provider tool
+    keyName = flags.Overlay.BkgPrefix + "CSCRDO" if flags.Detector.OverlayCSC else "CSCRDO"
     Muon__CSC_RawDataProviderToolMT=CompFactory.Muon__CSC_RawDataProviderToolMT
     MuonCscRawDataProviderTool = Muon__CSC_RawDataProviderToolMT(name    = "CSC_RawDataProviderToolMT",
-                                                               Decoder = CSCRodDecoder)
+                                                                 Decoder = CSCRodDecoder,
+                                                                 RdoLocation = keyName)
     if forTrigger:
         MuonCscRawDataProviderTool.CscContainerCacheKey = MuonCacheNames.CscCache
 
diff --git a/MuonSpectrometer/MuonConfig/python/MuonCSC_CnvToolsConfig.py b/MuonSpectrometer/MuonConfig/python/MuonCSC_CnvToolsConfig.py
new file mode 100644
index 0000000000000000000000000000000000000000..147f852dc56f8c87c7f0d198059aeafd06b73c22
--- /dev/null
+++ b/MuonSpectrometer/MuonConfig/python/MuonCSC_CnvToolsConfig.py
@@ -0,0 +1,13 @@
+# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
+
+from AthenaConfiguration.ComponentFactory import CompFactory
+
+
+def MuonCscRDODecoderCfg(flags, **kwargs):
+    from MuonConfig.MuonCalibConfig import CscCalibToolCfg
+    acc = CscCalibToolCfg(flags)
+    kwargs.setdefault("cscCalibTool", acc.popPrivateTools())
+
+    CscRDO_Decoder = CompFactory.Muon__CscRDO_Decoder
+    acc.setPrivateTools(CscRDO_Decoder(**kwargs))
+    return acc
diff --git a/MuonSpectrometer/MuonConfig/python/MuonCablingConfig.py b/MuonSpectrometer/MuonConfig/python/MuonCablingConfig.py
index ee3ecd36349af50b87daf99f3a344713f91c0fc4..8a76674e39fdbaa7f26813ffe49e03affce36aaf 100644
--- a/MuonSpectrometer/MuonConfig/python/MuonCablingConfig.py
+++ b/MuonSpectrometer/MuonConfig/python/MuonCablingConfig.py
@@ -31,7 +31,7 @@ def RPCCablingConfigCfg(flags):
     rpcCablingSvc.CorrFileName = 'LVL1confAtlas.corr' 
     rpcCablingSvc.ConfFilePath = 'MuonRPC_Cabling/'
     rpcCablingSvc.RPCTriggerRoadsfromCool = True
-    rpcCablingSvc.CosmicConfiguration     = True  # this was set to true by the modifier openThresholdRPCCabling in runHLT_standalone.py
+    rpcCablingSvc.CosmicConfiguration     = 'HLT' in flags.IOVDb.GlobalTag  # this was set to true by the modifier openThresholdRPCCabling in runHLT_standalone.py
 
     from IOVDbSvc.IOVDbSvcConfig import addFolders
     dbName = 'RPC_OFL' if flags.Input.isMC else 'RPC'
diff --git a/MuonSpectrometer/MuonConfig/python/MuonCalibConfig.py b/MuonSpectrometer/MuonConfig/python/MuonCalibConfig.py
index 76498e383568d2f4477f92c15f3c2a4f3f133523..4bd925e36864cc07e5d9b36c3cda7e25ee8d1dc2 100644
--- a/MuonSpectrometer/MuonConfig/python/MuonCalibConfig.py
+++ b/MuonSpectrometer/MuonConfig/python/MuonCalibConfig.py
@@ -68,7 +68,6 @@ def _setupMdtCondDB(flags):
 # end of function setupMdtCondDB()
 
 def MdtCalibrationToolCfg(flags, **kwargs):
-    from MdtCalibSvc.MdtCalibSvcConf import MdtCalibrationTool    
     result=MdtCalibrationDbToolCfg(flags, **kwargs)
     mdt_calibibration_db_tool = result.getPrimary()
     
@@ -83,12 +82,12 @@ def MdtCalibrationToolCfg(flags, **kwargs):
     result.merge(acc)
     kwargs.setdefault("MagFieldSvc",  mag_field_svc )
     
+    MdtCalibrationTool = CompFactory.MdtCalibrationTool
     mdt_calibration_tool = MdtCalibrationTool(**kwargs)
     result.setPrivateTools(mdt_calibration_tool)
     return result
 
 def MdtCalibrationDbToolCfg(flags, **kwargs):
-    from MdtCalibSvc.MdtCalibSvcConf import MdtCalibrationDbTool    
     # We need the conditions objects to have been created.
     result = MdtCalibDbAlgCfg(flags, **kwargs)
         
@@ -96,6 +95,7 @@ def MdtCalibrationDbToolCfg(flags, **kwargs):
     kwargs.setdefault("CreateWireSagFunctions", flags.Muon.Calib.correctMdtRtWireSag)
     kwargs.setdefault("CreateSlewingFunctions", flags.Muon.Calib.correctMdtRtForTimeSlewing)
     
+    MdtCalibrationDbTool = CompFactory.MdtCalibrationDbTool
     mdt_calibration_db_tool = MdtCalibrationDbTool(**kwargs)
     result.setPrivateTools(mdt_calibration_db_tool)
     return result
diff --git a/MuonSpectrometer/MuonConfig/python/MuonConfigFlags.py b/MuonSpectrometer/MuonConfig/python/MuonConfigFlags.py
index 9713600b03fe03e35f97d567caea63804e36b733..479b78149b6e73b0129c0205a806ba33ced4b3f9 100644
--- a/MuonSpectrometer/MuonConfig/python/MuonConfigFlags.py
+++ b/MuonSpectrometer/MuonConfig/python/MuonConfigFlags.py
@@ -92,7 +92,7 @@ def createMuonConfigFlags():
     mcf.addFlag("Muon.Calib.applyRtScaling", False) # TODO - apparently not needed, but currently used in MuonCalibConfig. Set false to match https://acode-browser1.usatlas.bnl.gov/lxr/source/athena/MuonSpectrometer/MuonCnv/MuonCnvExample/python/MuonCalibFlags.py#0072
     mcf.addFlag("Muon.Calib.correctMdtRtWireSag", False) # Apply RT wiresag correction
     mcf.addFlag("Muon.Calib.mdtCalibrationSource", "MDT") # Source for MDT t0s and rts
-    mcf.addFlag("Muon.Calib.mdtPropagationSpeedBeta", 0.85) #
+    mcf.addFlag("Muon.Calib.mdtPropagationSpeedBeta", lambda prevFlags : 1.0 if prevFlags.Input.isMC else 0.85) #
      
     mcf.addFlag("Muon.Calib.CscPedFromLocalFile", False)  
     mcf.addFlag("Muon.Calib.CscNoiseFromLocalFile", False)  
diff --git a/MuonSpectrometer/MuonConfig/python/MuonConfigUtils.py b/MuonSpectrometer/MuonConfig/python/MuonConfigUtils.py
index f843eff1428157842b25f47c151f4d498a15a1ff..0581a31abf81101f0ccefc29e069a77610bd11fc 100644
--- a/MuonSpectrometer/MuonConfig/python/MuonConfigUtils.py
+++ b/MuonSpectrometer/MuonConfig/python/MuonConfigUtils.py
@@ -2,6 +2,7 @@
 
 # This file is just for shared functions etc used by this package.
 from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
+from AthenaConfiguration.ComponentFactory import CompFactory
 
 def SetupMuonStandaloneArguments():
     from argparse import ArgumentParser
@@ -71,7 +72,7 @@ def SetupMuonStandaloneOutput(cfg, ConfigFlags, itemsToRecord):
     outstream.ForceRead = True
 
     # Fix for ATLASRECTS-5151
-    from  TrkEventCnvTools.TrkEventCnvToolsConf import Trk__EventCnvSuperTool
+    Trk__EventCnvSuperTool = CompFactory.Trk__EventCnvSuperTool
     cnvTool = Trk__EventCnvSuperTool(name = 'EventCnvSuperTool')
     cnvTool.MuonCnvTool.FixTGCs = True 
-    cfg.addPublicTool(cnvTool)
\ No newline at end of file
+    cfg.addPublicTool(cnvTool)
diff --git a/MuonSpectrometer/MuonConfig/python/MuonGeometryConfig.py b/MuonSpectrometer/MuonConfig/python/MuonGeometryConfig.py
index b733d3873960acc599ee9bf5ad2d1d13034c1bce..d6fac1734e4ab26771ba9cb9c8633b231f65bfb3 100644
--- a/MuonSpectrometer/MuonConfig/python/MuonGeometryConfig.py
+++ b/MuonSpectrometer/MuonConfig/python/MuonGeometryConfig.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 
 from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
 from AthenaConfiguration.ComponentFactory import CompFactory
@@ -24,7 +24,9 @@ def MuonGeoModelCfg(flags):
     detTool.UseConditionDb = 1
     detTool.UseIlinesFromGM = 1
     detTool.BuildFromNova = 0
-    if ( ( not flags.Detector.SimulateMuon or flags.Detector.OverlayMuon ) and flags.Common.Project != "AthSimulation" ):
+
+    enableAlignment = flags.Common.Project != 'AthSimulation' and not flags.Detector.SimulateMuon and not flags.Detector.OverlayMuon
+    if enableAlignment:
         # This is all migrated from MuonSpectrometer/MuonReconstruction/MuonRecExample/python/MuonAlignConfig.py
 
         from IOVDbSvc.IOVDbSvcConfig import addFolders
@@ -121,10 +123,11 @@ def MuonGeoModelCfg(flags):
     # turn on/off caching of MdtReadoutElement surfaces
     detTool.CachingFlag = 1
 
-    from MuonGeoModel.MuonGeoModelConf import MuonDetectorCondAlg
-    MuonDetectorManagerCond = MuonDetectorCondAlg()
-    MuonDetectorManagerCond.MuonDetectorTool = detTool
-    acc.addCondAlgo(MuonDetectorManagerCond)
+    if enableAlignment:
+        MuonDetectorCondAlg = CompFactory.MuonDetectorCondAlg
+        MuonDetectorManagerCond = MuonDetectorCondAlg()
+        MuonDetectorManagerCond.MuonDetectorTool = detTool
+        acc.addCondAlgo(MuonDetectorManagerCond)
 
     gms.DetectorTools += [ detTool ]
     
diff --git a/MuonSpectrometer/MuonConfig/python/MuonReconstructionConfig.py b/MuonSpectrometer/MuonConfig/python/MuonReconstructionConfig.py
index ab194938790bd6dea312322f289bb57080b8d9c4..913a945491846edee5fb03e82ce7883ec55bc17b 100644
--- a/MuonSpectrometer/MuonConfig/python/MuonReconstructionConfig.py
+++ b/MuonSpectrometer/MuonConfig/python/MuonReconstructionConfig.py
@@ -33,15 +33,16 @@ if __name__=="__main__":
         from AthenaCommon.Logging import log
         log.info('Forcing track building cardinality to be equal to '+str(args.threads))
         # We want to force the algorithms to run in parallel (eventually the algorithm will be marked as cloneable in the source code)
-        from GaudiHive.GaudiHiveConf import AlgResourcePool
+        AlgResourcePool = CompFactory.AlgResourcePool
         cfg.addService(AlgResourcePool( OverrideUnClonable=True ) )
         track_builder = acc.getPrimary()
         track_builder.Cardinality=args.threads
             
     # This is a temporary fix - it should go someplace central as it replaces the functionality of addInputRename from here:
     # https://gitlab.cern.ch/atlas/athena/blob/master/Control/SGComps/python/AddressRemappingSvc.py
-    from SGComps.SGCompsConf import AddressRemappingSvc, ProxyProviderSvc
+    ProxyProviderSvc = CompFactory.ProxyProviderSvc
     pps = ProxyProviderSvc()
+    AddressRemappingSvc = CompFactory.AddressRemappingSvc
     ars=AddressRemappingSvc()
     pps.ProviderNames += [ 'AddressRemappingSvc' ]
     ars.TypeKeyRenameMaps += [ '%s#%s->%s' % ("TrackCollection", "MuonSpectrometerTracks", "MuonSpectrometerTracks_old") ]
diff --git a/MuonSpectrometer/MuonConfig/python/MuonSegmentFindingConfig.py b/MuonSpectrometer/MuonConfig/python/MuonSegmentFindingConfig.py
index a81b16422c1377a0aec869dd9059e94911053b98..6001317af28aec61d0c95075f5cfd97d381bebba 100644
--- a/MuonSpectrometer/MuonConfig/python/MuonSegmentFindingConfig.py
+++ b/MuonSpectrometer/MuonConfig/python/MuonSegmentFindingConfig.py
@@ -29,7 +29,7 @@ from MuonConfig.MuonCalibConfig import MdtCalibDbAlgCfg
 from MuonConfig.MuonRecToolsConfig import MCTBFitterCfg, MuonAmbiProcessorCfg, MuonStationIntersectSvcCfg, MuonTrackCleanerCfg
 
 def MuonHoughPatternFinderTool(flags, **kwargs):
-    # Taken from https://gitlab.cern.ch/atlas/athena/blob/master/MuonSpectrometer/MuonReconstruction/MuonRecExample/python/MuonRecTools.py#L173     from MuonHoughPatternTools/MuonHoughPatternToolsConf import Muon__MuonHoughPatternFinderTool
+    # Taken from https://gitlab.cern.ch/atlas/athena/blob/master/MuonSpectrometer/MuonReconstruction/MuonRecExample/python/MuonRecTools.py#L173
 
     Muon__MuonHoughPatternFinderTool=CompFactory.Muon__MuonHoughPatternFinderTool
     
diff --git a/MuonSpectrometer/MuonConfig/python/RPC_DigitizationConfig.py b/MuonSpectrometer/MuonConfig/python/RPC_DigitizationConfig.py
index bec08779483e07422b70a1998d7687dda492655a..e941cfcf3b7f13b054104d153c872927a7f3ac0e 100644
--- a/MuonSpectrometer/MuonConfig/python/RPC_DigitizationConfig.py
+++ b/MuonSpectrometer/MuonConfig/python/RPC_DigitizationConfig.py
@@ -1,14 +1,12 @@
 """Define methods to construct configured RPC Digitization tools and algorithms
 
-Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 """
 from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
 from AthenaConfiguration.ComponentFactory import CompFactory
 from OutputStreamAthenaPool.OutputStreamConfig import OutputStreamCfg
 from MuonConfig.MuonGeometryConfig import MuonGeoModelCfg
-RpcDigitizationTool, RPC_Digitizer=CompFactory.getComps("RpcDigitizationTool","RPC_Digitizer",)
-PileUpXingFolder=CompFactory.PileUpXingFolder
-from MuonConfig.MuonByteStreamCnvTestConfig import RpcDigitToRpcRDOCfg, RpcOverlayDigitToRpcRDOCfg
+from MuonConfig.MuonByteStreamCnvTestConfig import RpcDigitToRpcRDOCfg
 from MuonConfig.MuonCablingConfig import RPCCablingConfigCfg
 from Digitization.TruthDigitizationOutputConfig import TruthDigitizationOutputCfg
 from Digitization.PileUpToolsConfig import PileUpToolsCfg
@@ -30,10 +28,11 @@ def RPC_RangeToolCfg(flags, name="RPC_Range", **kwargs):
     kwargs.setdefault("LastXing", RPC_LastXing())
     kwargs.setdefault("CacheRefreshFrequency", 1.0)
     kwargs.setdefault("ItemList", ["RPCSimHitCollection#RPC_Hits"])
+    PileUpXingFolder = CompFactory.PileUpXingFolder
     return PileUpXingFolder(name, **kwargs)
 
 
-def RPC_DigitizationToolCfg(flags, name="RPC_DigitizationTool", **kwargs):
+def RPC_DigitizationToolCommonCfg(flags, name="RPC_DigitizationTool", **kwargs):
     """Return ComponentAccumulator with configured RpcDigitizationTool"""
     from MuonConfig.MuonCondAlgConfig import RpcCondDbAlgCfg # MT-safe conditions access
     acc = RpcCondDbAlgCfg(flags)
@@ -78,19 +77,27 @@ def RPC_DigitizationToolCfg(flags, name="RPC_DigitizationTool", **kwargs):
     kwargs.setdefault("FracClusterSize2_C",   [0.259986, 0.259986, 0.259986, 0.259986, 0.259986, 0.259986, 0.259986, 0.259986, 0.259986, 0.259986, 0.259986, 0.259986, 0.259986, 0.259986, 0.259986, 0.259986, 0.259986, 0.259986])
     kwargs.setdefault("FracClusterSizeTail_C",[0.13035,  0.13035,  0.13035,  0.13035,  0.13035,  0.13035,  0.13035,  0.13035,  0.13035, 0.13035,  0.13035,  0.13035,  0.13035,  0.13035,  0.13035,  0.13035,  0.13035,  0.13035 ])
     kwargs.setdefault("MeanClusterSizeTail_C",[0.548598, 0.548598, 0.548598, 0.548598, 0.548598, 0.548598, 0.548598, 0.548598, 0.548598, 0.548598, 0.548598, 0.548598, 0.548598, 0.548598, 0.548598, 0.548598, 0.548598, 0.548598])
+    RpcDigitizationTool = CompFactory.RpcDigitizationTool
     acc.setPrivateTools(RpcDigitizationTool(name, **kwargs))
     return acc
 
 
-def RPC_OverlayDigitizationToolCfg(flags, name="RPC_DigitizationTool", **kwargs):
+def RPC_DigitizationToolCfg(flags, name="RPC_DigitizationTool", **kwargs):
+    """Return ComponentAccumulator with configured RpcDigitizationTool"""
+    kwargs.setdefault("OutputObjectName", "RPC_DIGITS")
+    if flags.Digitization.PileUpPremixing:
+        kwargs.setdefault("OutputSDOName", flags.Overlay.BkgPrefix + "RPC_SDO")
+    else:
+        kwargs.setdefault("OutputSDOName", "RPC_SDO")
+    return RPC_DigitizationToolCommonCfg(flags, name, **kwargs)
+
+
+def RPC_OverlayDigitizationToolCfg(flags, name="Rpc_OverlayDigitizationTool", **kwargs):
     """Return ComponentAccumulator with RpcDigitizationTool configured for Overlay"""
-    acc = ComponentAccumulator()
     kwargs.setdefault("OnlyUseContainerName", False)
-    kwargs.setdefault("OutputObjectName", "StoreGateSvc+" + flags.Overlay.SigPrefix + "RPC_DIGITS")
-    if not flags.Overlay.DataOverlay:
-        kwargs.setdefault("OutputSDOName", "StoreGateSvc+" + flags.Overlay.SigPrefix + "RPC_SDO")
-    acc.setPrivateTools(RpcDigitizationTool(name, **kwargs))
-    return acc
+    kwargs.setdefault("OutputObjectName", flags.Overlay.SigPrefix + "RPC_DIGITS")
+    kwargs.setdefault("OutputSDOName", flags.Overlay.SigPrefix + "RPC_SDO")
+    return RPC_DigitizationToolCommonCfg(flags, name, **kwargs)
 
 
 def RPC_OutputCfg(flags):
@@ -120,7 +127,12 @@ def RPC_OverlayDigitizationBasicCfg(flags, **kwargs):
     if "DigitizationTool" not in kwargs:
         tool = acc.popToolsAndMerge(RPC_OverlayDigitizationToolCfg(flags))
         kwargs["DigitizationTool"] = tool
-    acc.addEventAlgo(RPC_Digitizer(**kwargs))
+
+    if flags.Concurrency.NumThreads > 0:
+        kwargs.setdefault("Cardinality", flags.Concurrency.NumThreads)
+
+    RPC_Digitizer = CompFactory.RPC_Digitizer
+    acc.addEventAlgo(RPC_Digitizer(name="RPC_OverlayDigitizer", **kwargs))
     return acc
 
 
@@ -132,25 +144,9 @@ def RPC_DigitizationCfg(flags, **kwargs):
     return acc
 
 
-def RPC_OverlayDigitizationCfg(flags, **kwargs):
-    """Return ComponentAccumulator with RPC Overlay digitization and Output"""
-    acc = RPC_OverlayDigitizationBasicCfg(flags, **kwargs)
-    acc.merge(RPC_OutputCfg(flags))
-    return acc
-
-
 def RPC_DigitizationDigitToRDOCfg(flags):
     """Return ComponentAccumulator with RPC digitization and Digit to RPCPAD RDO"""
     acc = RPC_DigitizationCfg(flags)
     acc.merge(RPCCablingConfigCfg(flags))
     acc.merge(RpcDigitToRpcRDOCfg(flags))
     return acc
-
-
-def RPC_OverlayDigitizationDigitToRDOCfg(flags):
-    """Return ComponentAccumulator with RPC Overlay digitization and Digit to RPCPAD RDO"""
-    acc = RPC_OverlayDigitizationCfg(flags)
-    acc.merge(RPCCablingConfigCfg(flags))
-    acc.merge(RpcOverlayDigitToRpcRDOCfg(flags))
-    return acc
-
diff --git a/MuonSpectrometer/MuonConfig/python/RpcOverlayConfig.py b/MuonSpectrometer/MuonConfig/python/RpcOverlayConfig.py
new file mode 100644
index 0000000000000000000000000000000000000000..ccedcadf798250cd70b794c6db9e5dfafea70a4e
--- /dev/null
+++ b/MuonSpectrometer/MuonConfig/python/RpcOverlayConfig.py
@@ -0,0 +1,95 @@
+
+"""Define methods to construct configured RPC overlay algorithms
+
+Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
+"""
+
+from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
+from AthenaConfiguration.ComponentFactory import CompFactory
+
+
+def RPCDataOverlayExtraCfg(flags, **kwargs):
+    """Return a ComponentAccumulator with RPC data overlay specifics"""
+    acc = ComponentAccumulator()
+
+    # We need to convert BS to RDO for data overlay
+    from MuonConfig.MuonBytestreamDecodeConfig import RpcBytestreamDecodeCfg
+    acc.merge(RpcBytestreamDecodeCfg(flags))
+
+    return acc
+
+
+def RpcOverlayAlgCfg(flags, name="RpcOverlay", **kwargs):
+    """Return a ComponentAccumulator for RPCOverlay algorithm"""
+    acc = ComponentAccumulator()
+
+    kwargs.setdefault("BkgInputKey", flags.Overlay.BkgPrefix + "RPC_DIGITS")
+    kwargs.setdefault("SignalInputKey", flags.Overlay.SigPrefix + "RPC_DIGITS")
+    kwargs.setdefault("OutputKey", "RPC_DIGITS")
+
+    # Do RPC overlay
+    RpcOverlay = CompFactory.RpcOverlay
+    alg = RpcOverlay(name, **kwargs)
+    acc.addEventAlgo(alg)
+
+    # Setup output
+    from OutputStreamAthenaPool.OutputStreamConfig import OutputStreamCfg
+    acc.merge(OutputStreamCfg(flags, "RDO", ItemList=[
+        "RpcPadContainer#RPCPAD"
+    ]))
+
+    return acc
+
+
+def RpcTruthOverlayCfg(flags, name="RpcTruthOverlay", **kwargs):
+    """Return a ComponentAccumulator for the RPC SDO overlay algorithm"""
+    acc = ComponentAccumulator()
+
+    # We do not need background RPC SDOs
+    if flags.Overlay.DataOverlay:
+        kwargs.setdefault("BkgInputKey", "")
+    else:
+        kwargs.setdefault("BkgInputKey",
+                          flags.Overlay.BkgPrefix + "RPC_SDO")
+
+    kwargs.setdefault("SignalInputKey",
+                      flags.Overlay.SigPrefix + "RPC_SDO")
+    kwargs.setdefault("OutputKey", "RPC_SDO")
+
+    # Do RPC truth overlay
+    MuonSimDataOverlay = CompFactory.MuonSimDataOverlay
+    alg = MuonSimDataOverlay(name, **kwargs)
+    acc.addEventAlgo(alg)
+
+    # Setup output
+    from OutputStreamAthenaPool.OutputStreamConfig import OutputStreamCfg
+    acc.merge(OutputStreamCfg(flags, "RDO", ItemList=[
+        "MuonSimDataCollection#RPC_SDO"
+    ]))
+
+    return acc
+
+
+def RpcOverlayCfg(flags):
+    """Configure and return a ComponentAccumulator for RPC overlay"""
+    acc = ComponentAccumulator()
+
+    # Add data overlay specifics
+    if flags.Overlay.DataOverlay:
+        acc.merge(RPCDataOverlayExtraCfg(flags))
+
+    # Add RPC RDO to digit config
+    from MuonConfig.MuonByteStreamCnvTestConfig import RpcRdoToRpcDigitCfg
+    acc.merge(RpcRdoToRpcDigitCfg(flags))
+    # Add RPC overlay digitization algorithm
+    from MuonConfig.RPC_DigitizationConfig import RPC_OverlayDigitizationBasicCfg
+    acc.merge(RPC_OverlayDigitizationBasicCfg(flags))
+    # Add RPC overlay algorithm
+    acc.merge(RpcOverlayAlgCfg(flags))
+    # Add RPC truth overlay
+    acc.merge(RpcTruthOverlayCfg(flags))
+    # Add RPC digit to RDO config
+    from MuonConfig.MuonByteStreamCnvTestConfig import RpcDigitToRpcRDOCfg
+    acc.merge(RpcDigitToRpcRDOCfg(flags))
+
+    return acc
diff --git a/MuonSpectrometer/MuonConfig/python/TGC_DigitizationConfig.py b/MuonSpectrometer/MuonConfig/python/TGC_DigitizationConfig.py
index 0eb8779e6236ed0f7a89dedc20b7fa274e340f6c..dcf3178a509db12840083734e3ce0079930f7fb6 100644
--- a/MuonSpectrometer/MuonConfig/python/TGC_DigitizationConfig.py
+++ b/MuonSpectrometer/MuonConfig/python/TGC_DigitizationConfig.py
@@ -1,14 +1,12 @@
 """Define methods to construct configured TGC Digitization tools and algorithms
 
-Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 """
 from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
 from AthenaConfiguration.ComponentFactory import CompFactory
 from OutputStreamAthenaPool.OutputStreamConfig import OutputStreamCfg
 from MuonConfig.MuonGeometryConfig import MuonGeoModelCfg
-TgcDigitizationTool, TGCDigitizer=CompFactory.getComps("TgcDigitizationTool","TGCDigitizer",)
-PileUpXingFolder=CompFactory.PileUpXingFolder
-from MuonConfig.MuonByteStreamCnvTestConfig import TgcDigitToTgcRDOCfg, TgcOverlayDigitToTgcRDOCfg
+from MuonConfig.MuonByteStreamCnvTestConfig import TgcDigitToTgcRDOCfg
 from MuonConfig.MuonCablingConfig import TGCCablingConfigCfg
 from Digitization.TruthDigitizationOutputConfig import TruthDigitizationOutputCfg
 from Digitization.PileUpToolsConfig import PileUpToolsCfg
@@ -30,6 +28,7 @@ def TGC_RangeToolCfg(flags, name="TGC_Range", **kwargs):
     kwargs.setdefault("LastXing", TGC_LastXing())
     kwargs.setdefault("CacheRefreshFrequency", 1.0)
     kwargs.setdefault("ItemList", ["TGCSimHitCollection#TGC_Hits"])
+    PileUpXingFolder = CompFactory.PileUpXingFolder
     return PileUpXingFolder(name, **kwargs)
 
 
@@ -44,17 +43,18 @@ def TGC_DigitizationToolCfg(flags, name="TGC_DigitizationTool", **kwargs):
         kwargs.setdefault("OutputSDOName", flags.Overlay.BkgPrefix + "TGC_SDO")
     else:
         kwargs.setdefault("OutputSDOName", "TGC_SDO")
+        TgcDigitizationTool = CompFactory.TgcDigitizationTool
     acc.setPrivateTools(TgcDigitizationTool(name, **kwargs))
     return acc
 
 
-def TGC_OverlayDigitizationToolCfg(flags, name="TGC_OverlayDigitizationTool", **kwargs):
+def TGC_OverlayDigitizationToolCfg(flags, name="Tgc_OverlayDigitizationTool", **kwargs):
     """Return ComponentAccumulator with TgcDigitizationTool configured for Overlay"""
     acc = ComponentAccumulator()
     kwargs.setdefault("OnlyUseContainerName", False)
-    kwargs.setdefault("OutputObjectName", "StoreGateSvc+" + flags.Overlay.SigPrefix + "TGC_DIGITS")
-    if not flags.Overlay.DataOverlay:
-        kwargs.setdefault("OutputSDOName", "StoreGateSvc+" + flags.Overlay.SigPrefix + "TGC_SDO")
+    kwargs.setdefault("OutputObjectName", flags.Overlay.SigPrefix + "TGC_DIGITS")
+    kwargs.setdefault("OutputSDOName", flags.Overlay.SigPrefix + "TGC_SDO")
+    TgcDigitizationTool = CompFactory.TgcDigitizationTool
     acc.setPrivateTools(TgcDigitizationTool(name, **kwargs))
     return acc
 
@@ -86,7 +86,12 @@ def TGC_OverlayDigitizationBasicCfg(flags, **kwargs):
     if "DigitizationTool" not in kwargs:
         tool = acc.popToolsAndMerge(TGC_OverlayDigitizationToolCfg(flags))
         kwargs["DigitizationTool"] = tool
-    acc.addEventAlgo(TGCDigitizer(**kwargs))
+
+    if flags.Concurrency.NumThreads > 0:
+        kwargs.setdefault("Cardinality", flags.Concurrency.NumThreads)
+
+    TGCDigitizer = CompFactory.TGCDigitizer
+    acc.addEventAlgo(TGCDigitizer(name="TGC_OverlayDigitizer", **kwargs))
     return acc
 
 
@@ -98,25 +103,9 @@ def TGC_DigitizationCfg(flags, **kwargs):
     return acc
 
 
-def TGC_OverlayDigitizationCfg(flags, **kwargs):
-    """Return ComponentAccumulator with TGC Overlay digitization and Output"""
-    acc = TGC_OverlayDigitizationBasicCfg(flags, **kwargs)
-    acc.merge(TGC_OutputCfg(flags))
-    return acc
-
-
 def TGC_DigitizationDigitToRDOCfg(flags):
     """Return ComponentAccumulator with TGC digitization and Digit to TGCRDO"""
     acc = TGC_DigitizationCfg(flags)
     acc.merge(TGCCablingConfigCfg(flags))
     acc.merge(TgcDigitToTgcRDOCfg(flags))
     return acc
-
-
-def TGC_OverlayDigitizationDigitToRDOCfg(flags):
-    """Return ComponentAccumulator with TGC Overlay digitization and Digit to TGCRDO"""
-    acc = TGC_OverlayDigitizationCfg(flags)
-    acc.merge(TGCCablingConfigCfg(flags))
-    acc.merge(TgcOverlayDigitToTgcRDOCfg(flags))
-    return acc
-
diff --git a/MuonSpectrometer/MuonConfig/python/TgcOverlayConfig.py b/MuonSpectrometer/MuonConfig/python/TgcOverlayConfig.py
new file mode 100644
index 0000000000000000000000000000000000000000..dfceb435bf37292cabbcd7e18330cb490de383ab
--- /dev/null
+++ b/MuonSpectrometer/MuonConfig/python/TgcOverlayConfig.py
@@ -0,0 +1,95 @@
+
+"""Define methods to construct configured TGC overlay algorithms
+
+Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
+"""
+
+from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
+from AthenaConfiguration.ComponentFactory import CompFactory
+
+
+def TGCDataOverlayExtraCfg(flags, **kwargs):
+    """Return a ComponentAccumulator with TGC data overlay specifics"""
+    acc = ComponentAccumulator()
+
+    # We need to convert BS to RDO for data overlay
+    from MuonConfig.MuonBytestreamDecodeConfig import TgcBytestreamDecodeCfg
+    acc.merge(TgcBytestreamDecodeCfg(flags))
+
+    return acc
+
+
+def TgcOverlayAlgCfg(flags, name="TgcOverlay", **kwargs):
+    """Return a ComponentAccumulator for TGCOverlay algorithm"""
+    acc = ComponentAccumulator()
+
+    kwargs.setdefault("BkgInputKey", flags.Overlay.BkgPrefix + "TGC_DIGITS")
+    kwargs.setdefault("SignalInputKey", flags.Overlay.SigPrefix + "TGC_DIGITS")
+    kwargs.setdefault("OutputKey", "TGC_DIGITS")
+
+    # Do TGC overlay
+    TgcOverlay = CompFactory.TgcOverlay
+    alg = TgcOverlay(name, **kwargs)
+    acc.addEventAlgo(alg)
+
+    # Setup output
+    from OutputStreamAthenaPool.OutputStreamConfig import OutputStreamCfg
+    acc.merge(OutputStreamCfg(flags, "RDO", ItemList=[
+        "TgcRdoContainer#TGCRDO"
+    ]))
+
+    return acc
+
+
+def TgcTruthOverlayCfg(flags, name="TgcTruthOverlay", **kwargs):
+    """Return a ComponentAccumulator for the TGC SDO overlay algorithm"""
+    acc = ComponentAccumulator()
+
+    # We do not need background TGC SDOs
+    if flags.Overlay.DataOverlay:
+        kwargs.setdefault("BkgInputKey", "")
+    else:
+        kwargs.setdefault("BkgInputKey",
+                          flags.Overlay.BkgPrefix + "TGC_SDO")
+
+    kwargs.setdefault("SignalInputKey",
+                      flags.Overlay.SigPrefix + "TGC_SDO")
+    kwargs.setdefault("OutputKey", "TGC_SDO")
+
+    # Do TGC truth overlay
+    MuonSimDataOverlay = CompFactory.MuonSimDataOverlay
+    alg = MuonSimDataOverlay(name, **kwargs)
+    acc.addEventAlgo(alg)
+
+    # Setup output
+    from OutputStreamAthenaPool.OutputStreamConfig import OutputStreamCfg
+    acc.merge(OutputStreamCfg(flags, "RDO", ItemList=[
+        "MuonSimDataCollection#TGC_SDO"
+    ]))
+
+    return acc
+
+
+def TgcOverlayCfg(flags):
+    """Configure and return a ComponentAccumulator for TGC overlay"""
+    acc = ComponentAccumulator()
+
+    # Add data overlay specifics
+    if flags.Overlay.DataOverlay:
+        acc.merge(TGCDataOverlayExtraCfg(flags))
+
+    # Add TGC RDO to digit config
+    from MuonConfig.MuonByteStreamCnvTestConfig import TgcRdoToTgcDigitCfg
+    acc.merge(TgcRdoToTgcDigitCfg(flags))
+    # Add TGC overlay digitization algorithm
+    from MuonConfig.TGC_DigitizationConfig import TGC_OverlayDigitizationBasicCfg
+    acc.merge(TGC_OverlayDigitizationBasicCfg(flags))
+    # Add TGC overlay algorithm
+    acc.merge(TgcOverlayAlgCfg(flags))
+    # Add TGC truth overlay
+    acc.merge(TgcTruthOverlayCfg(flags))
+    # Add TGC digit to RDO config
+    from MuonConfig.MuonByteStreamCnvTestConfig import TgcDigitToTgcRDOCfg
+    acc.merge(TgcDigitToTgcRDOCfg(flags))
+
+    return acc
diff --git a/MuonSpectrometer/MuonConfig/test/MDT_DigitizationConfig_test.py b/MuonSpectrometer/MuonConfig/test/MDT_DigitizationConfig_test.py
index 7e89dd880eeaf2e5e70feec74b2d1f740c658332..6aa3821368fc9ca832e06a50239688e8c9391acf 100755
--- a/MuonSpectrometer/MuonConfig/test/MDT_DigitizationConfig_test.py
+++ b/MuonSpectrometer/MuonConfig/test/MDT_DigitizationConfig_test.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 """Run tests on MDT_DigitizationConfigNew.py
 
-Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 """
 import sys
 from AthenaCommon.Logging import log
@@ -11,7 +11,7 @@ from AthenaConfiguration.TestDefaults import defaultTestFiles
 from AthenaConfiguration.MainServicesConfig import MainServicesSerialCfg
 from AthenaPoolCnvSvc.PoolReadConfig import PoolReadCfg
 from AthenaConfiguration.AllConfigFlags import ConfigFlags
-from MuonConfig.MDT_DigitizationConfig import MDT_DigitizerDigitToRDOCfg
+from MuonConfig.MDT_DigitizationConfig import MDT_DigitizationCfg
 
 # Set up logging and new style config
 log.setLevel(DEBUG)
@@ -24,7 +24,7 @@ ConfigFlags.lock()
 # Construct our accumulator to run
 acc = MainServicesSerialCfg()
 acc.merge(PoolReadCfg(ConfigFlags))
-acc.merge(MDT_DigitizerDigitToRDOCfg(ConfigFlags))
+acc.merge(MDT_DigitizationCfg(ConfigFlags))
 # Dump config
 acc.getService("StoreGateSvc").Dump = True
 acc.getService("ConditionStore").Dump = True
diff --git a/MuonSpectrometer/MuonConfig/test/MdtIntersectGeometry_test.py b/MuonSpectrometer/MuonConfig/test/MdtIntersectGeometry_test.py
index 8116c96c0dde07debc92840a24c015c345f090cf..02771d73b8c37b3d8dc72ae67721e3a50628b2ac 100644
--- a/MuonSpectrometer/MuonConfig/test/MdtIntersectGeometry_test.py
+++ b/MuonSpectrometer/MuonConfig/test/MdtIntersectGeometry_test.py
@@ -1,5 +1,5 @@
 #
-# Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration.
+# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration.
 #
 # File: MuonStationIntersectSvc/share/MdtIntersectGeometry_test.py
 # Author: scott snyder
@@ -12,6 +12,7 @@
 from __future__ import print_function
 
 from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
+from AthenaConfiguration.ComponentFactory import CompFactory
 from AthenaPython.PyAthenaComps import Alg, StatusCode
 import ROOT
 
@@ -41,7 +42,7 @@ def testCfg (configFlags):
     from MagFieldServices.MagFieldServicesConfig import MagneticFieldSvcCfg
     result.merge (MagneticFieldSvcCfg(configFlags, UseDCS = False))
 
-    from MuonStationIntersectSvc.MuonStationIntersectSvcConf import MuonStationIntersectSvc
+    MuonStationIntersectSvc = CompFactory.MuonStationIntersectSvc
     result.addService (MuonStationIntersectSvc ('MuonStationIntersectSvc',
                                                 OutputLevel = 1))
     
diff --git a/MuonSpectrometer/MuonConfig/test/MdtRdoToPrepDataTool_test.py b/MuonSpectrometer/MuonConfig/test/MdtRdoToPrepDataTool_test.py
index aac52de592941b7293d4fb33eba8e4ff173fde6c..a5911c4aafa118a11be0b04cbc3ed6c57f9b5c7b 100644
--- a/MuonSpectrometer/MuonConfig/test/MdtRdoToPrepDataTool_test.py
+++ b/MuonSpectrometer/MuonConfig/test/MdtRdoToPrepDataTool_test.py
@@ -1,5 +1,5 @@
 #
-# Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration.
+# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration.
 #
 # File: MuonMDT_CnvTools/share/MdtRdoToPrepDataTool_test.py
 # Author: scott snyder
@@ -12,6 +12,7 @@
 from __future__ import print_function
 
 from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
+from AthenaConfiguration.ComponentFactory import CompFactory
 from AthenaPython.PyAthenaComps import Alg, StatusCode
 import ROOT
 
@@ -43,7 +44,7 @@ def testCfg (configFlags):
     from MagFieldServices.MagFieldServicesConfig import MagneticFieldSvcCfg
     result.merge (MagneticFieldSvcCfg(configFlags, UseDCS = False))
 
-    from MuonMDT_CnvTools.MuonMDT_CnvToolsConf import Muon__MdtRdoToPrepDataTool
+    Muon__MdtRdoToPrepDataTool = CompFactory.Muon__MdtRdoToPrepDataTool
     result.addPublicTool (Muon__MdtRdoToPrepDataTool ('Muon__MdtRdoToPrepDataTool', OutputLevel = 1))
     
     result.addEventAlgo (TestAlg ('TestAlg'))
diff --git a/MuonSpectrometer/MuonDigitization/CSC_Digitization/CSC_Digitization/CscDigitizationTool.h b/MuonSpectrometer/MuonDigitization/CSC_Digitization/CSC_Digitization/CscDigitizationTool.h
index 9151ec77c61b93209ff96df29c338bcd83901f0c..2de2b90ef3cfe62adb9d067a200d24a6f5459749 100644
--- a/MuonSpectrometer/MuonDigitization/CSC_Digitization/CSC_Digitization/CscDigitizationTool.h
+++ b/MuonSpectrometer/MuonDigitization/CSC_Digitization/CSC_Digitization/CscDigitizationTool.h
@@ -83,7 +83,7 @@ public: //possibly these should be private?
 
 private:
 
-  PublicToolHandle<ICscCalibTool> m_pcalib{this, "cscCalibTool", "CscCalibTool", ""};
+  ToolHandle<ICscCalibTool> m_pcalib{this, "cscCalibTool", "CscCalibTool", "CSC calibration tool"};
 
   BooleanProperty m_onlyUseContainerName{this, "OnlyUseContainerName", true, "Don't use the ReadHandleKey directly. Just extract the container name from it."};
   SG::ReadHandleKey<CSCSimHitCollection> m_hitsContainerKey{this, "InputObjectName", "CSC_Hits", "name of the input objects"}; // name of the input objects
diff --git a/MuonSpectrometer/MuonDigitization/CSC_Digitization/python/CSC_DigitizationConfig.py b/MuonSpectrometer/MuonDigitization/CSC_Digitization/python/CSC_DigitizationConfig.py
index 8022118349ad6ee58802954ede5e3dd0620d20d7..7768892374359ed092734379dc89addc88820628 100644
--- a/MuonSpectrometer/MuonDigitization/CSC_Digitization/python/CSC_DigitizationConfig.py
+++ b/MuonSpectrometer/MuonDigitization/CSC_Digitization/python/CSC_DigitizationConfig.py
@@ -26,20 +26,12 @@ def getCscRange(name="CscRange", **kwargs):
     return CfgMgr.PileUpXingFolder(name, **kwargs)
 
 
-def getCscDigitizationTool(name="CscDigitizationTool", **kwargs):
+def getCscDigitizationToolBase(name, **kwargs):
     if jobproperties.Digitization.doXingByXingPileUp(): # PileUpTool approach
         # This should match the range for the CSC in Simulation/Digitization/share/MuonDigitization.py 
         kwargs.setdefault("FirstXing", CSC_FirstXing() ) 
         kwargs.setdefault("LastXing",  CSC_LastXing() ) 
 
-    kwargs.setdefault("InputObjectName", "CSC_Hits")
-    kwargs.setdefault("OutputObjectName", "CSC_DIGITS")
-    if jobproperties.Digitization.PileUpPremixing and 'OverlayMT' in jobproperties.Digitization.experimentalDigi():
-        from OverlayCommonAlgs.OverlayFlags import overlayFlags
-        kwargs.setdefault("CSCSimDataCollectionOutputName", overlayFlags.bkgPrefix() + "CSC_SDO")
-    else:
-        kwargs.setdefault("CSCSimDataCollectionOutputName", "CSC_SDO")
-
     kwargs.setdefault("pedestal", 0.0) 	 
     kwargs.setdefault("WindowLowerOffset", -25.0) #-50.0,	 
     kwargs.setdefault("WindowUpperOffset",  25.0) #50.0  	 
@@ -51,6 +43,18 @@ def getCscDigitizationTool(name="CscDigitizationTool", **kwargs):
 
     return CfgMgr.CscDigitizationTool(name, **kwargs)
 
+
+def getCscDigitizationTool(name="CscDigitizationTool", **kwargs):
+    kwargs.setdefault("InputObjectName", "CSC_Hits")
+    kwargs.setdefault("OutputObjectName", "CSC_DIGITS")
+    if jobproperties.Digitization.PileUpPremixing and 'OverlayMT' in jobproperties.Digitization.experimentalDigi():
+        from OverlayCommonAlgs.OverlayFlags import overlayFlags
+        kwargs.setdefault("CSCSimDataCollectionOutputName", overlayFlags.bkgPrefix() + "CSC_SDO")
+    else:
+        kwargs.setdefault("CSCSimDataCollectionOutputName", "CSC_SDO")
+    return getCscDigitizationToolBase(name, **kwargs)
+
+
 def getCscOverlayDigitizationTool(name="CscOverlayDigitizationTool",**kwargs):
     from OverlayCommonAlgs.OverlayFlags import overlayFlags
     if overlayFlags.isOverlayMT():
@@ -62,7 +66,8 @@ def getCscOverlayDigitizationTool(name="CscOverlayDigitizationTool",**kwargs):
         kwargs.setdefault("OutputObjectName", overlayFlags.evtStore() +  "+CSC_DIGITS")
         if not overlayFlags.isDataOverlay():
             kwargs.setdefault("CSCSimDataCollectionOutputName", overlayFlags.evtStore() + "+CSC_SDO")
-    return CfgMgr.CscDigitizationTool(name,**kwargs)
+    return getCscDigitizationToolBase(name, **kwargs)
+
 
 def getCscOverlayDigitBuilder(name="CscOverlayDigitBuilder", **kwargs):
     kwargs.setdefault("DigitizationTool","CscOverlayDigitizationTool")
diff --git a/MuonSpectrometer/MuonOverlay/CscOverlay/CscOverlay/CscOverlay.h b/MuonSpectrometer/MuonOverlay/CscOverlay/CscOverlay/CscOverlay.h
index 2bb8c59437d2370c0bf2d68392c4493da39e94d1..7012d0fdfefcdfed2f71df86136933bec3f3d526 100644
--- a/MuonSpectrometer/MuonOverlay/CscOverlay/CscOverlay/CscOverlay.h
+++ b/MuonSpectrometer/MuonOverlay/CscOverlay/CscOverlay/CscOverlay.h
@@ -97,7 +97,7 @@ private:
   ToolHandle<Muon::MuonIdHelperTool> m_muonIdHelperTool{this, "idHelper", 
     "Muon::MuonIdHelperTool/MuonIdHelperTool", "Handle to the MuonIdHelperTool"};
   ToolHandle<ICscCalibTool> m_cscCalibTool{this, "CalibTool", "CscCalibTool", ""};
-  PublicToolHandle<Muon::ICSC_RDO_Decoder> m_cscRdoDecoderTool{this, "CscRdoDecoderTool", "Muon::CscRDO_Decoder", ""};
+  ToolHandle<Muon::ICSC_RDO_Decoder> m_cscRdoDecoderTool{this, "CscRdoDecoderTool", "Muon::CscRDO_Decoder", ""};
 
   ServiceHandle <IAthRNGSvc> m_rndmSvc{this, "RndmSvc", "AthRNGSvc", "Random Number Service"};      // Random number service
 };
diff --git a/Simulation/Overlay/OverlayConfiguration/python/OverlaySteering.py b/Simulation/Overlay/OverlayConfiguration/python/OverlaySteering.py
index c48554e826d3229f424ce25188244962e2fc0740..389f208f3a55737b4c0c62e5723a7a59e99c108f 100644
--- a/Simulation/Overlay/OverlayConfiguration/python/OverlaySteering.py
+++ b/Simulation/Overlay/OverlayConfiguration/python/OverlaySteering.py
@@ -12,6 +12,10 @@ from AthenaPoolCnvSvc.PoolWriteConfig import PoolWriteCfg
 from InDetOverlay.PixelOverlayConfig import PixelOverlayCfg
 from InDetOverlay.SCTOverlayConfig import SCTOverlayCfg
 from InDetOverlay.TRTOverlayConfig import TRTOverlayCfg
+from MuonConfig.CscOverlayConfig import CscOverlayCfg
+from MuonConfig.MdtOverlayConfig import MdtOverlayCfg
+from MuonConfig.RpcOverlayConfig import RpcOverlayCfg
+from MuonConfig.TgcOverlayConfig import TgcOverlayCfg
 from OverlayCopyAlgs.OverlayCopyAlgsConfig import \
     CopyCaloCalibrationHitContainersCfg, CopyJetTruthInfoCfg, CopyMcEventCollectionCfg, \
     CopyTimingsCfg, CopyTrackRecordCollectionsCfg
@@ -59,4 +63,14 @@ def OverlayMainCfg(configFlags):
     if configFlags.Detector.OverlayTRT:
         acc.merge(TRTOverlayCfg(configFlags))
 
+    # Muon system
+    if configFlags.Detector.OverlayCSC:
+        acc.merge(CscOverlayCfg(configFlags))
+    if configFlags.Detector.OverlayMDT:
+        acc.merge(MdtOverlayCfg(configFlags))
+    if configFlags.Detector.OverlayRPC:
+        acc.merge(RpcOverlayCfg(configFlags))
+    if configFlags.Detector.OverlayTGC:
+        acc.merge(TgcOverlayCfg(configFlags))
+
     return acc
diff --git a/Simulation/Overlay/OverlayConfiguration/python/OverlayTestHelpers.py b/Simulation/Overlay/OverlayConfiguration/python/OverlayTestHelpers.py
index 1387bbfb99b6ff1011ff6fcb4109df4b9a666b1f..8f34a948d4c63c1cf1d58832c68c06ef12de982e 100644
--- a/Simulation/Overlay/OverlayConfiguration/python/OverlayTestHelpers.py
+++ b/Simulation/Overlay/OverlayConfiguration/python/OverlayTestHelpers.py
@@ -6,7 +6,16 @@ Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 
 from argparse import ArgumentParser
 
-from AthenaConfiguration.TestDefaults import defaultTestFiles
+from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
+from AthenaConfiguration.ComponentFactory import CompFactory
+
+
+def JobOptsDumperCfg(flags):
+    """Configure event loop for overlay"""
+    JobOptsDumperAlg = CompFactory.JobOptsDumperAlg
+    acc = ComponentAccumulator()
+    acc.addEventAlgo(JobOptsDumperAlg(FileName="OverlayTestConfig.txt"))
+    return acc
 
 
 def CommonTestArgumentParser(prog):
@@ -59,6 +68,7 @@ def setupOverlayTestDetectorFlags(configFlags, detectors):
 
 def defaultTestFlags(configFlags, args):
     """Fill default overlay flags for testing"""
+    from AthenaConfiguration.TestDefaults import defaultTestFiles
     configFlags.GeoModel.Align.Dynamic = False
     configFlags.Digitization.DoInnerDetectorNoise = False
     if args.data:
diff --git a/Simulation/Overlay/OverlayConfiguration/test/OverlayTest.py b/Simulation/Overlay/OverlayConfiguration/test/OverlayTest.py
index 76ee571a78ddc6486d756c34292e18881d673718..73ba5785953b2da1c00ffb5397c1270fd18a29ac 100755
--- a/Simulation/Overlay/OverlayConfiguration/test/OverlayTest.py
+++ b/Simulation/Overlay/OverlayConfiguration/test/OverlayTest.py
@@ -12,7 +12,7 @@ from AthenaConfiguration.AllConfigFlags import ConfigFlags
 
 from OverlayConfiguration.OverlaySteering import OverlayMainCfg
 from OverlayConfiguration.OverlayTestHelpers import \
-    CommonTestArgumentParser, defaultTestFlags, postprocessAndLockFlags, printAndRun
+    CommonTestArgumentParser, JobOptsDumperCfg, defaultTestFlags, postprocessAndLockFlags, printAndRun
 
 # Set up logging and new style config
 Configurable.configurableRun3Behavior = True
@@ -38,6 +38,7 @@ postprocessAndLockFlags(ConfigFlags, args)
 
 # Construct our accumulator to run
 acc = OverlayMainCfg(ConfigFlags)
+acc.merge(JobOptsDumperCfg(ConfigFlags))
 
 # dump pickle
 with open("ConfigOverlay.pkl", "wb") as f:
diff --git a/Simulation/Tests/OverlayTests/test/test_DataOverlay_ConfigTest_Zmumu_Muon.sh b/Simulation/Tests/OverlayTests/test/test_DataOverlay_ConfigTest_Zmumu_Muon.sh
new file mode 100755
index 0000000000000000000000000000000000000000..d71b116cdf3fa5cfcd6217b33a62a4a29ae13f70
--- /dev/null
+++ b/Simulation/Tests/OverlayTests/test/test_DataOverlay_ConfigTest_Zmumu_Muon.sh
@@ -0,0 +1,78 @@
+#!/bin/sh
+
+# art-description: MC+data Overlay with MT support, config test
+# art-type: grid
+# art-include: master/Athena
+
+# art-output: legacyDataOverlayRDO.pool.root
+# art-output: dataOverlayRDO.pool.root
+# art-output: log.*
+# art-output: mem.summary.*
+# art-output: mem.full.*
+# art-output: runargs.*
+# art-output: *.pkl
+# art-output: *Config.txt
+
+set -o pipefail
+
+events=2
+
+OverlayBS_tf.py \
+--inputBS_SKIMFile /cvmfs/atlas-nightlies.cern.ch/repo/data/data-art/OverlayMonitoringRTT/mc15_valid.00200010.overlay_streamsAll_2016_pp_1.skim.DRAW.r8381/DRAW.09331084._000146.pool.root.1 \
+--inputHITSFile /cvmfs/atlas-nightlies.cern.ch/repo/data/data-art/OverlayMonitoringRTT/mc16_13TeV.361107.PowhegPythia8EvtGen_AZNLOCTEQ6L1_Zmumu.OverlaySim/HITS.pool.root \
+--outputRDOFile legacyDataOverlayRDO.pool.root \
+--maxEvents $events \
+--conditionsTag CONDBR2-BLKPA-2016-12 \
+--fSampltag LARElecCalibMCfSampl-G496-19213- \
+--preExec 'from LArROD.LArRODFlags import larRODFlags;larRODFlags.nSamples.set_Value_and_Lock(4);from LArConditionsCommon.LArCondFlags import larCondFlags; larCondFlags.OFCShapeFolder.set_Value_and_Lock("4samples1phase")' \
+--postExec 'outStream.ItemList.remove("xAOD::EventInfoContainer#*"); outStream.ItemList.remove("xAOD::EventInfoAuxContainer#*");' \
+--preInclude 'SimulationJobOptions/preInclude.MuonOnlyConfig.py,SimulationJobOptions/preInclude.TruthOnlyConfig.py' \
+--postInclude 'EventOverlayJobTransforms/Rt_override_CONDBR2-BLKPA-2015-12.py' \
+--ignorePatterns "L1TopoMenuLoader.+ERROR." \
+--imf False \
+--athenaopts '"--config-only=ConfigLegacy.pkl"'
+
+OverlayBS_tf.py \
+--inputBS_SKIMFile /cvmfs/atlas-nightlies.cern.ch/repo/data/data-art/OverlayMonitoringRTT/mc15_valid.00200010.overlay_streamsAll_2016_pp_1.skim.DRAW.r8381/DRAW.09331084._000146.pool.root.1 \
+--inputHITSFile /cvmfs/atlas-nightlies.cern.ch/repo/data/data-art/OverlayMonitoringRTT/mc16_13TeV.361107.PowhegPythia8EvtGen_AZNLOCTEQ6L1_Zmumu.OverlaySim/HITS.pool.root \
+--outputRDOFile legacyDataOverlayRDO.pool.root \
+--maxEvents $events \
+--conditionsTag CONDBR2-BLKPA-2016-12 \
+--fSampltag LARElecCalibMCfSampl-G496-19213- \
+--preExec 'from LArROD.LArRODFlags import larRODFlags;larRODFlags.nSamples.set_Value_and_Lock(4);from LArConditionsCommon.LArCondFlags import larCondFlags; larCondFlags.OFCShapeFolder.set_Value_and_Lock("4samples1phase")' \
+--postExec 'job+=CfgMgr.JobOptsDumperAlg(FileName="OverlayLegacyConfig.txt"); outStream.ItemList.remove("xAOD::EventInfoContainer#*"); outStream.ItemList.remove("xAOD::EventInfoAuxContainer#*");' \
+--preInclude 'SimulationJobOptions/preInclude.MuonOnlyConfig.py,SimulationJobOptions/preInclude.TruthOnlyConfig.py' \
+--postInclude 'EventOverlayJobTransforms/Rt_override_CONDBR2-BLKPA-2015-12.py' \
+--ignorePatterns "L1TopoMenuLoader.+ERROR." \
+--imf False
+
+rc=$?
+echo "art-result: $rc configLegacy"
+mv log.OverlayBS log.OverlayLegacy
+
+rc2=-9999
+if [ $rc -eq 0 ]
+then
+    OverlayTest.py Muon -d -t 1 -n $events 2>&1 | tee log.OverlayTest
+    rc2=$?
+fi
+echo  "art-result: $rc2 configNew"
+
+rc3=-9999
+if [ $rc2 -eq 0 ]
+then
+    acmd.py diff-root legacyDataOverlayRDO.pool.root dataOverlayRDO.pool.root \
+        --error-mode resilient --mode=semi-detailed \
+        --ignore-leaves RecoTimingObj_p1_EVNTtoHITS_timings RecoTimingObj_p1_HITStoRDO_timings index_ref \
+            xAOD::EventAuxInfo_v1_EventInfoAuxDyn.subEventIndex \
+            xAOD::EventAuxInfo_v1_EventInfoAuxDyn.subEventTime \
+            xAOD::EventAuxInfo_v1_EventInfoAuxDyn.subEventType \
+            xAOD::EventAuxInfo_v1_EventInfoAux.detectorMask0 \
+            xAOD::EventAuxInfo_v1_EventInfoAux.detectorMask1 \
+            xAOD::EventAuxInfo_v1_EventInfoAux.detectorMask2 \
+            xAOD::EventAuxInfo_v1_EventInfoAux.detectorMask3 \
+            xAOD::EventAuxInfo_v1_EventInfoAux.actualInteractionsPerCrossing \
+            xAOD::EventAuxInfo_v1_EventInfoAux.averageInteractionsPerCrossing
+    rc3=$?
+fi
+echo  "art-result: $rc3 comparison"
diff --git a/Simulation/Tests/OverlayTests/test/test_MCOverlay_ConfigTest_ttbar_Muon.sh b/Simulation/Tests/OverlayTests/test/test_MCOverlay_ConfigTest_ttbar_Muon.sh
new file mode 100755
index 0000000000000000000000000000000000000000..7690e142d31afd85f9193f968cf91d82a2affa04
--- /dev/null
+++ b/Simulation/Tests/OverlayTests/test/test_MCOverlay_ConfigTest_ttbar_Muon.sh
@@ -0,0 +1,62 @@
+#!/bin/sh
+
+# art-description: MC+MC Overlay with MT support, config test
+# art-type: grid
+# art-include: master/Athena
+
+# art-output: legacyMcOverlayRDO.pool.root
+# art-output: mcOverlayRDO.pool.root
+# art-output: log.*
+# art-output: mem.summary.*
+# art-output: mem.full.*
+# art-output: runargs.*
+# art-output: *.pkl
+# art-output: *Config.txt
+
+set -o pipefail
+
+events=2
+
+Overlay_tf.py \
+--inputHITSFile /cvmfs/atlas-nightlies.cern.ch/repo/data/data-art/Tier0ChainTests/valid1.410000.PowhegPythiaEvtGen_P2012_ttbar_hdamp172p5_nonallhad.simul.HITS.e4993_s3091/HITS.10504490._000425.pool.root.1 \
+--inputRDO_BKGFile /cvmfs/atlas-nightlies.cern.ch/repo/data/data-art/OverlayMonitoringRTT/PileupPremixing/22.0/v4/RDO.merged-pileup-MT.100events.pool.root \
+--outputRDOFile legacyMcOverlayRDO.pool.root \
+--maxEvents $events \
+--conditionsTag OFLCOND-MC16-SDR-20 \
+--geometryVersion ATLAS-R2-2016-01-00-01 \
+--preExec 'from LArROD.LArRODFlags import larRODFlags;larRODFlags.NumberOfCollisions.set_Value_and_Lock(20);larRODFlags.nSamples.set_Value_and_Lock(4);larRODFlags.doOFCPileupOptimization.set_Value_and_Lock(True);larRODFlags.firstSample.set_Value_and_Lock(0);larRODFlags.useHighestGainAutoCorr.set_Value_and_Lock(True); from LArDigitization.LArDigitizationFlags import jobproperties;jobproperties.LArDigitizationFlags.useEmecIwHighGain.set_Value_and_Lock(False);' \
+--preInclude 'Overlay:SimulationJobOptions/preInclude.MuonOnlyConfig.py,SimulationJobOptions/preInclude.TruthOnlyConfig.py' \
+--imf False \
+--athenaopts '"--config-only=ConfigLegacy.pkl"'
+
+Overlay_tf.py \
+--inputHITSFile /cvmfs/atlas-nightlies.cern.ch/repo/data/data-art/OverlayMonitoringRTT/valid1.410000.PowhegPythiaEvtGen_P2012_ttbar_hdamp172p5_nonallhad.simul.HITS.e4993_s3091/HITS.10504490._000425.pool.root.1 \
+--inputRDO_BKGFile /cvmfs/atlas-nightlies.cern.ch/repo/data/data-art/OverlayMonitoringRTT/PileupPremixing/22.0/v4/RDO.merged-pileup-MT.100events.pool.root \
+--outputRDOFile legacyMcOverlayRDO.pool.root \
+--maxEvents $events \
+--conditionsTag OFLCOND-MC16-SDR-20 \
+--geometryVersion ATLAS-R2-2016-01-00-01 \
+--preExec 'from LArROD.LArRODFlags import larRODFlags;larRODFlags.NumberOfCollisions.set_Value_and_Lock(20);larRODFlags.nSamples.set_Value_and_Lock(4);larRODFlags.doOFCPileupOptimization.set_Value_and_Lock(True);larRODFlags.firstSample.set_Value_and_Lock(0);larRODFlags.useHighestGainAutoCorr.set_Value_and_Lock(True); from LArDigitization.LArDigitizationFlags import jobproperties;jobproperties.LArDigitizationFlags.useEmecIwHighGain.set_Value_and_Lock(False);' \
+--postExec 'job+=CfgMgr.JobOptsDumperAlg(FileName="OverlayLegacyConfig.txt");' \
+--preInclude 'Overlay:SimulationJobOptions/preInclude.MuonOnlyConfig.py,SimulationJobOptions/preInclude.TruthOnlyConfig.py' \
+--imf False
+
+rc=$?
+echo "art-result: $rc configLegacy"
+mv log.Overlay log.OverlayLegacy
+
+rc2=-9999
+if [ $rc -eq 0 ]
+then
+    OverlayTest.py Muon -t 1 -n $events 2>&1 | tee log.OverlayTest
+    rc2=$?
+fi
+echo  "art-result: $rc2 configNew"
+
+rc3=-9999
+if [ $rc2 -eq 0 ]
+then
+    acmd.py diff-root legacyMcOverlayRDO.pool.root mcOverlayRDO.pool.root --error-mode resilient --mode=semi-detailed --ignore-leaves RecoTimingObj_p1_EVNTtoHITS_timings RecoTimingObj_p1_HITStoRDO_timings index_ref
+    rc3=$?
+fi
+echo  "art-result: $rc3 comparison"
diff --git a/Tools/PROCTools/python/RunTier0TestsTools.py b/Tools/PROCTools/python/RunTier0TestsTools.py
index da458f5c6e8e541bbec676179e10b585c1f94872..3483331c3f0169f37e0f774d5832cf2c12f43124 100644
--- a/Tools/PROCTools/python/RunTier0TestsTools.py
+++ b/Tools/PROCTools/python/RunTier0TestsTools.py
@@ -28,7 +28,7 @@ ciRefFileMap = {
                 's3505-22.0'           : 'v2',
                 # OverlayTier0Test_required-test
                 'overlay-d1498-21.0'   : 'v2',
-                'overlay-d1498-22.0'   : 'v26',
+                'overlay-d1498-22.0'   : 'v27',
                 'overlay-bkg-21.0'     : 'v1',
                 'overlay-bkg-22.0'     : 'v4',
                }