diff --git a/Control/AthenaConfiguration/python/UnifyProperties.py b/Control/AthenaConfiguration/python/UnifyProperties.py
index 5f0a28ba5bd89c852e669e24e5ee68541f1cfe69..10bc9541d32ad78904d926351bcee9cfb8c391f1 100644
--- a/Control/AthenaConfiguration/python/UnifyProperties.py
+++ b/Control/AthenaConfiguration/python/UnifyProperties.py
@@ -80,6 +80,7 @@ _propsToUnify={"GeoModelSvc.DetectorTools":unifySet,
                "AddressRemappingSvc.TypeKeyRenameMaps": unifySet,
                "AuditorSvc.Auditors": unifySet,
                "MetaDataSvc.MetaDataTools": unifySet,
+               "ByteStreamAddressProviderSvc.TypeNames": unifySet,
                }
 
 def setUnificationFunction(key, function):
diff --git a/Control/AthenaConfiguration/share/confTool.py b/Control/AthenaConfiguration/share/confTool.py
index f4d055d83b0ff801242898b4f773ff74d15917ef..5caffd92d0d12ca7d7b580c948ec10ed28a41f69 100755
--- a/Control/AthenaConfiguration/share/confTool.py
+++ b/Control/AthenaConfiguration/share/confTool.py
@@ -304,6 +304,11 @@ def __parseIOVDbFolder(definition):
     if db_match:
         result['db'] = db_match.group(1)
         definition = definition.replace(db_match.group(0), '')
+    # key
+    key_match = re.search(r'<key>(.*)</key>', definition)
+    if key_match:
+        result['key'] = key_match.group(1)
+        definition = definition.replace(key_match.group(0), '')
     # tag
     tag_match = re.search(r'<tag>(.*)</tag>', definition)
     if tag_match:
diff --git a/Event/EventOverlay/EventOverlayJobTransforms/share/CaloOverlay_jobOptions.py b/Event/EventOverlay/EventOverlayJobTransforms/share/CaloOverlay_jobOptions.py
index dc61338496f81ee45ca607a57944faa4885303d3..ecf033ea09316635751d20c4c64d990c08a588b2 100644
--- a/Event/EventOverlay/EventOverlayJobTransforms/share/CaloOverlay_jobOptions.py
+++ b/Event/EventOverlay/EventOverlayJobTransforms/share/CaloOverlay_jobOptions.py
@@ -78,18 +78,15 @@ if DetFlags.overlay.Tile_on():
     job.TileHitVecToCnt.DigitizationTool.RndmEvtOverlay = True
     job.TileHitVecToCnt.DigitizationTool.OnlyUseContainerName = not overlayFlags.isOverlayMT()
     theTileDigitsMaker.RndmEvtOverlay = True
-    theTileDigitsMaker.OverlayTileDigitContainerName = "TileDigitsCnt"
+    theTileDigitsMaker.InputTileDigitContainer = "TileDigitsCnt"
     if overlayFlags.isOverlayMT():
-       theTileDigitsMaker.OverlayTileDigitContainerName = overlayFlags.bkgPrefix() + "TileDigitsCnt"
-       theTileDigitsMaker.OverlayTileRawChannelContainerName = overlayFlags.bkgPrefix() + "TileRawChannelCnt"
+       theTileDigitsMaker.InputTileDigitContainer = overlayFlags.bkgPrefix() + "TileDigitsCnt"
        theTileDigitsMaker.OnlyUseContainerName = False
     if overlayFlags.isDataOverlay():
        theApp.Dlls += [ "TileByteStream"]
-       ServiceMgr.ByteStreamAddressProviderSvc.TypeNames += [ "TileBeamElemContainer/TileBeamElemCnt"]
        ServiceMgr.ByteStreamAddressProviderSvc.TypeNames += [ "TileRawChannelContainer/TileRawChannelCnt"]
        ServiceMgr.ByteStreamAddressProviderSvc.TypeNames += [ "TileDigitsContainer/TileDigitsCnt"]
        ServiceMgr.ByteStreamAddressProviderSvc.TypeNames += [ "TileL2Container/TileL2Cnt"]
-       ServiceMgr.ByteStreamAddressProviderSvc.TypeNames += [ "TileLaserObject/TileLaserObj"]
        ServiceMgr.ByteStreamAddressProviderSvc.TypeNames += [ "TileRawChannelContainer/MuRcvRawChCnt"]
        ServiceMgr.ByteStreamAddressProviderSvc.TypeNames += [ "TileDigitsContainer/MuRcvDigitsCnt"]
 
diff --git a/LArCalorimeter/LArROD/python/LArDigitThinnerConfig.py b/LArCalorimeter/LArROD/python/LArDigitThinnerConfig.py
index 88681f9927a401ddcff4d990b79d37f5e24ebd88..9d71e5e273e20def4f8cca80720453f472305402 100644
--- a/LArCalorimeter/LArROD/python/LArDigitThinnerConfig.py
+++ b/LArCalorimeter/LArROD/python/LArDigitThinnerConfig.py
@@ -13,7 +13,7 @@ def LArDigitThinnerCfg(flags, **kwargs):
     # based on DefaultLArDigitThinner
     acc = ComponentAccumulator()
 
-    if (not flags.Input.isMC) and (not flags.Overlay.DataOverlay) and flags.Input.Format == "bytestream":
+    if (not flags.Input.isMC) and (not flags.Overlay.DataOverlay) and flags.Input.Format == "BS":
         acc.merge(LArRawDataReadingAlg(InputContainerName="FREE"))
 
     acc.merge(LArOnOffIdMappingCfg(flags))
diff --git a/Simulation/Overlay/OverlayConfiguration/python/OverlaySteering.py b/Simulation/Overlay/OverlayConfiguration/python/OverlaySteering.py
index ceb7857a91b6c978ee2081a567aa96b484e65d24..5bfc2e455947cdaa4901098a9e8c28ce08bced32 100644
--- a/Simulation/Overlay/OverlayConfiguration/python/OverlaySteering.py
+++ b/Simulation/Overlay/OverlayConfiguration/python/OverlaySteering.py
@@ -20,6 +20,7 @@ from MuonConfig.TgcOverlayConfig import TgcOverlayCfg
 from OverlayCopyAlgs.OverlayCopyAlgsConfig import \
     CopyCaloCalibrationHitContainersCfg, CopyJetTruthInfoCfg, CopyMcEventCollectionCfg, \
     CopyTimingsCfg, CopyTrackRecordCollectionsCfg
+from TileSimAlgs.TileDigitizationConfig import TileDigitizationCfg
 from xAODEventInfoCnv.xAODEventInfoCnvConfig import EventInfoOverlayCfg
 
 
@@ -67,6 +68,8 @@ def OverlayMainCfg(configFlags):
     # Calorimeters
     if configFlags.Detector.OverlayLAr:
         acc.merge(LArOverlayCfg(configFlags))
+    if configFlags.Detector.OverlayTile:
+        acc.merge(TileDigitizationCfg(configFlags))
 
     # Muon system
     if configFlags.Detector.OverlayCSC:
diff --git a/Simulation/Overlay/OverlayConfiguration/python/OverlayTestHelpers.py b/Simulation/Overlay/OverlayConfiguration/python/OverlayTestHelpers.py
index e991ecd637961adaa2e340cf8844257aae3c8ae6..59844f867979a2aed85366ce52e0a56a14106ffa 100644
--- a/Simulation/Overlay/OverlayConfiguration/python/OverlayTestHelpers.py
+++ b/Simulation/Overlay/OverlayConfiguration/python/OverlayTestHelpers.py
@@ -87,6 +87,9 @@ def defaultTestFlags(configFlags, args):
     configFlags.LAr.ROD.nSamples = 4
     configFlags.LAr.ROD.NumberOfCollisions = 20
     configFlags.LAr.ROD.UseHighestGainAutoCorr = True
+    configFlags.Tile.BestPhaseFromCOOL = False
+    configFlags.Tile.correctTime = False
+    configFlags.Tile.zeroAmplitudeWithoutDigits = False
 
     from AthenaConfiguration.TestDefaults import defaultTestFiles
     if args.data:
diff --git a/Simulation/Tests/OverlayTests/test/test_DataOverlay_ConfigTest_Zmumu_Tile.sh b/Simulation/Tests/OverlayTests/test/test_DataOverlay_ConfigTest_Zmumu_Tile.sh
new file mode 100755
index 0000000000000000000000000000000000000000..3b499d428ba60ad197d09c2cbea0c214d57d53ba
--- /dev/null
+++ b/Simulation/Tests/OverlayTests/test/test_DataOverlay_ConfigTest_Zmumu_Tile.sh
@@ -0,0 +1,80 @@
+#!/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 \
+--samplingFractionDbTag FTFP_BERT_BIRK \
+--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.TileOnlyConfig.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 \
+--samplingFractionDbTag FTFP_BERT_BIRK \
+--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.TileOnlyConfig.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 Tile -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_Tile.sh b/Simulation/Tests/OverlayTests/test/test_MCOverlay_ConfigTest_ttbar_Tile.sh
new file mode 100755
index 0000000000000000000000000000000000000000..e65aa301c9c236b63a6b7a4254442f13d93abeb9
--- /dev/null
+++ b/Simulation/Tests/OverlayTests/test/test_MCOverlay_ConfigTest_ttbar_Tile.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.TileOnlyConfig.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.TileOnlyConfig.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 Tile -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/TileCalorimeter/TileConditions/python/TileInfoLoaderConfig.py b/TileCalorimeter/TileConditions/python/TileInfoLoaderConfig.py
index e06644279e5fb58c0e5adc0f8d1802ff2cef41ee..be971c6d2dbbd03a084683119ab651ce7e30f61d 100644
--- a/TileCalorimeter/TileConditions/python/TileInfoLoaderConfig.py
+++ b/TileCalorimeter/TileConditions/python/TileInfoLoaderConfig.py
@@ -31,7 +31,7 @@ def TileInfoLoaderCfg(flags, **kwargs):
             kwargs['NoiseScaleIndex'] = 1 # Noise for Optimal Filter without iterations
 
 
-    if flags.Input.isMC and 'TileHitVec' in flags.Input.Collections:
+    if (flags.Input.isMC or flags.Detector.OverlayTile) and ('TileHitVec' in flags.Input.Collections or 'TileHitVec' in flags.Input.SecondaryCollections):
 
         G4Version = flags.Sim.G4Version
         G4VersionMajor, G4VersionMinor = G4Version.split(".")[1:3]
diff --git a/TileCalorimeter/TileConfiguration/python/TileConfigFlags.py b/TileCalorimeter/TileConfiguration/python/TileConfigFlags.py
index e92a911f3ad95f8f1ffd16338ee03656310e467b..de5fb89110167ac206b10c5a3b59f4502c82b2ba 100644
--- a/TileCalorimeter/TileConfiguration/python/TileConfigFlags.py
+++ b/TileCalorimeter/TileConfiguration/python/TileConfigFlags.py
@@ -144,7 +144,10 @@ def _getRawChannelContainer(prevFlags):
      if prevFlags.Tile.doOpt2:
           rawChannelContainer = 'TileRawChannelOpt2'
      if prevFlags.Tile.doOptATLAS:
-          rawChannelContainer = 'TileRawChannelCnt' if prevFlags.Input.isMC else 'TileRawChannelFixed'
+          if not (prevFlags.Input.isMC or prevFlags.Overlay.DataOverlay) and prevFlags.Input.Format == 'BS':
+               rawChannelContainer = 'TileRawChannelFixed'                                                   
+          else:                               
+               rawChannelContainer = 'TileRawChannelCnt'
 
      return rawChannelContainer
 
diff --git a/TileCalorimeter/TileRecUtils/python/TileDQstatusConfig.py b/TileCalorimeter/TileRecUtils/python/TileDQstatusConfig.py
index 8cdc595d414327c1f72104bb00e226fd8e3746d7..9c1f93474c26e2a9f8c5dfabdbbc31ecd7a0ff77 100644
--- a/TileCalorimeter/TileRecUtils/python/TileDQstatusConfig.py
+++ b/TileCalorimeter/TileRecUtils/python/TileDQstatusConfig.py
@@ -62,6 +62,11 @@ def TileDQstatusAlgCfg(flags, **kwargs):
 
         rawChannelContainer = 'TileRawChannelCnt'
 
+    elif flags.Overlay.DataOverlay and flags.Detector.OverlayTile:
+        beamElemContainer = ''
+        digitsContainer = flags.Overlay.BkgPrefix + 'TileDigitsCnt'
+        rawChannelContainer = flags.Overlay.BkgPrefix + 'TileRawChannelCnt'
+
     else:
         beamElemContainer = ""
         digitsContainer = ""
diff --git a/TileCalorimeter/TileSimAlgs/TileSimAlgs/TileDigitsMaker.h b/TileCalorimeter/TileSimAlgs/TileSimAlgs/TileDigitsMaker.h
index a349cad473bb0c5baa43f8d7c1e8f01dea1f0851..437f126367069c8fe3021f8dd1d4cc26144ecb76 100644
--- a/TileCalorimeter/TileSimAlgs/TileSimAlgs/TileDigitsMaker.h
+++ b/TileCalorimeter/TileSimAlgs/TileSimAlgs/TileDigitsMaker.h
@@ -36,7 +36,6 @@
 #include "TileConditions/TileCondToolNoiseSample.h"
 #include "TileConditions/ITileBadChanTool.h"
 #include "TileConditions/TileCablingSvc.h"
-#include "TileRecUtils/ITileDQstatusTool.h"
 
 // Atlas includes
 #include "AthenaBaseComps/AthAlgorithm.h"
@@ -96,11 +95,8 @@ class TileDigitsMaker: public AthAlgorithm {
                                                           "input Tile hit container key"};
 
     Gaudi::Property<bool> m_onlyUseContainerName{this, "OnlyUseContainerName", true, "Don't use the ReadHandleKey directly. Just extract the container name from it."};
-    SG::ReadHandleKey<TileDigitsContainer> m_overlayDigitContainerKey{this, "OverlayTileDigitContainerName","",""};
-    std::string m_overlayDigitContainerName{""};
-
-    SG::ReadHandleKey<TileRawChannelContainer> m_overlayRawChannelContainerKey{this, "OverlayTileRawChannelContainerName","TileRawChannelCnt",""};
-    std::string m_overlayRawChannelContainerName{""};
+    SG::ReadHandleKey<TileDigitsContainer> m_inputDigitContainerKey{this, "InputTileDigitContainer","",""};
+    std::string m_inputDigitContainerName{""};
 
     SG::WriteHandleKey<TileDigitsContainer> m_digitsContainerKey{this,"TileDigitsContainer",
                                                                  "TileDigitsCnt",
@@ -131,7 +127,6 @@ class TileDigitsMaker: public AthAlgorithm {
     const TileHWID* m_tileHWID;
     const TileInfo* m_tileInfo;
     const TileCablingService* m_cabling; //!< TileCabling instance
-    const TileDQstatus* m_DQstatus;
 
     std::vector<HWIdentifier *> m_all_ids;
     std::vector<double *> m_drawerBufferHi; //!< Vector used to store pointers to digits for a single drawer (high gain)
@@ -187,11 +182,8 @@ class TileDigitsMaker: public AthAlgorithm {
     ToolHandle<ITileBadChanTool> m_tileBadChanTool{this,
         "TileBadChanTool", "TileBadChanTool", "Tile bad channel tool"};
 
-    ToolHandle<ITileDQstatusTool> m_DQstatusTool { this,
-        "TileDQstatusTool", "TileDQstatusTool", "Tool to create TileDQstatus" };
-
-    SG::WriteHandleKey<TileDQstatus> m_DQstatusKey {this,
-        "TileDQstatus", "TileDQstatus", "Output TileDQstatus key" };
+    SG::ReadHandleKey<TileDQstatus> m_DQstatusKey {this,
+        "TileDQstatus", "", "Input TileDQstatus key" };
 
 };
 
diff --git a/TileCalorimeter/TileSimAlgs/python/TileDigitizationConfig.py b/TileCalorimeter/TileSimAlgs/python/TileDigitizationConfig.py
index 82c6d01c96261314f7414cce491de090d7787663..242bf9cda2a7c42568f6c3f25ac7183c077e1c41 100644
--- a/TileCalorimeter/TileSimAlgs/python/TileDigitizationConfig.py
+++ b/TileCalorimeter/TileSimAlgs/python/TileDigitizationConfig.py
@@ -16,8 +16,9 @@ def TileTriggerDigitizationCfg(flags):
         from TileSimAlgs.TileMuonReceiverDecisionConfig import TileMuonReceiverDecisionOutputCfg
         acc.merge( TileMuonReceiverDecisionOutputCfg(flags) )
 
-        from TileL2Algs.TileL2Config import TileRawChannelToL2OutputCfg
-        acc.merge( TileRawChannelToL2OutputCfg(flags, streamName = 'RDO') )
+        if flags.Output.doWriteRDO:
+            from TileL2Algs.TileL2Config import TileRawChannelToL2OutputCfg
+            acc.merge( TileRawChannelToL2OutputCfg(flags, streamName = 'RDO') )
 
     return acc
 
@@ -27,7 +28,7 @@ def TileDigitizationCfg(flags):
     from TileSimAlgs.TileDigitsMakerConfig import TileDigitsMakerOutputCfg
     acc = TileDigitsMakerOutputCfg(flags)
 
-    if not flags.Digitization.PileUpPremixing:
+    if not flags.Digitization.PileUpPremixing and flags.Output.doWriteRDO:
         from TileRecUtils.TileRawChannelMakerConfig import TileRawChannelMakerOutputCfg
         acc.merge( TileRawChannelMakerOutputCfg(flags, streamName = 'RDO') )
 
diff --git a/TileCalorimeter/TileSimAlgs/python/TileDigitsMakerConfig.py b/TileCalorimeter/TileSimAlgs/python/TileDigitsMakerConfig.py
index 49140fb887f62d07108da36913097eb374ff423a..2bf339e22b494daaf023c7c14002b14fdd6a65b6 100644
--- a/TileCalorimeter/TileSimAlgs/python/TileDigitsMakerConfig.py
+++ b/TileCalorimeter/TileSimAlgs/python/TileDigitsMakerConfig.py
@@ -22,6 +22,7 @@ def TileDigitsMakerCfg(flags, **kwargs):
     kwargs.setdefault('UseCoolPulseShapes', True)
     kwargs.setdefault('MaskBadChannels', False)
     kwargs.setdefault('RndmEvtOverlay', flags.Detector.OverlayTile)
+    kwargs.setdefault('OnlyUseContainerName', not flags.Detector.OverlayTile)
 
     acc = TileHitVecToCntCfg(flags)
 
@@ -54,18 +55,21 @@ def TileDigitsMakerCfg(flags, **kwargs):
         kwargs['TileCondToolEmscale'] = acc.popToolsAndMerge(TileCondToolEmscaleCfg(flags))
 
     if kwargs['RndmEvtOverlay']:
-
         tileNoise = False
         tileCoherNoise = False
 
-        PileUpMergeSvc=CompFactory.PileUpMergeSvc
-        acc.addService( PileUpMergeSvc() )
+        if flags.Overlay.DataOverlay:
+            from ByteStreamCnvSvc.ByteStreamConfig import ByteStreamReadCfg
+            acc.merge(ByteStreamReadCfg(flags, typeNames=[
+                'TileDigitsContainer/' + flags.Overlay.BkgPrefix + 'TileDigitsCnt',
+                'TileRawChannelContainer/' + flags.Overlay.BkgPrefix + 'TileRawChannelCnt']
+            ))
 
-        from TileRecUtils.TileDQstatusConfig import TileDQstatusToolCfg
-        kwargs['TileDQstatusTool'] = acc.popToolsAndMerge(TileDQstatusToolCfg(flags))
-    else:
-        kwargs['TileDQstatusTool'] = None
-        kwargs['TileDQstatus'] = ''
+        from TileRecUtils.TileDQstatusConfig import TileDQstatusAlgCfg
+        acc.merge(TileDQstatusAlgCfg(flags))
+
+        kwargs['InputTileDigitContainer'] = flags.Overlay.BkgPrefix + 'TileDigitsCnt'
+        kwargs['TileDQstatus'] = 'TileDQstatus'
 
     if tileNoise or tileCoherNoise or kwargs['RndmEvtOverlay']:
         if 'RndmSvc' not in kwargs:
@@ -146,8 +150,9 @@ def TileDigitsMakerOutputCfg(flags, **kwargs):
     tileDigitsContainer = tileDigitsContainer.split('+').pop()
     outputItemList = ['TileDigitsContainer#' + tileDigitsContainer]
 
-    from OutputStreamAthenaPool.OutputStreamConfig import OutputStreamCfg
-    acc.merge(  OutputStreamCfg(flags, streamName = 'RDO', ItemList = outputItemList) )
+    if flags.Output.doWriteRDO:
+        from OutputStreamAthenaPool.OutputStreamConfig import OutputStreamCfg
+        acc.merge(  OutputStreamCfg(flags, streamName = 'RDO', ItemList = outputItemList) )
 
     return acc
 
diff --git a/TileCalorimeter/TileSimAlgs/python/TileHitToTTL1Config.py b/TileCalorimeter/TileSimAlgs/python/TileHitToTTL1Config.py
index ef146b95f822d7f3b0fd7aa7b09284ec11448a94..2bce9f4d49f43a70ce5a58425c9d7d04e0546cd9 100644
--- a/TileCalorimeter/TileSimAlgs/python/TileHitToTTL1Config.py
+++ b/TileCalorimeter/TileSimAlgs/python/TileHitToTTL1Config.py
@@ -81,8 +81,9 @@ def TileTTL1OutputCfg(flags, TileHitToTTL1):
     mbtsTTL1Container = mbtsTTL1Container.split('+').pop()
     outputItemList += ['TileTTL1Container#' + mbtsTTL1Container]
 
-    from OutputStreamAthenaPool.OutputStreamConfig import OutputStreamCfg
-    acc = OutputStreamCfg(flags, streamName = 'RDO', ItemList = outputItemList)
+    if flags.Output.doWriteRDO:
+        from OutputStreamAthenaPool.OutputStreamConfig import OutputStreamCfg
+        acc = OutputStreamCfg(flags, streamName = 'RDO', ItemList = outputItemList)
 
     return acc
 
diff --git a/TileCalorimeter/TileSimAlgs/python/TileHitVecToCntConfig.py b/TileCalorimeter/TileSimAlgs/python/TileHitVecToCntConfig.py
index 475ce807e51f59f45e326655a30d9321fd9104f7..7dddb2e0c23ea4a9a3d6148b723df481a62c626b 100644
--- a/TileCalorimeter/TileSimAlgs/python/TileHitVecToCntConfig.py
+++ b/TileCalorimeter/TileSimAlgs/python/TileHitVecToCntConfig.py
@@ -35,6 +35,7 @@ def TileHitVecToCntToolCfg(flags, **kwargs):
 
     kwargs.setdefault('name', 'TileHitVecToCntTool')
     kwargs.setdefault('RndmEvtOverlay', flags.Detector.OverlayTile)
+    kwargs.setdefault('OnlyUseContainerName', not flags.Detector.OverlayTile)
 
     acc = ComponentAccumulator()
 
@@ -63,7 +64,7 @@ def TileHitVecToCntToolCfg(flags, **kwargs):
     else:
         kwargs.setdefault('PileUp', flags.Digitization.Pileup)
 
-    if kwargs['RndmEvtOverlay'] or kwargs['PileUp']:
+    if kwargs['PileUp']:
         PileUpMergeSvc=CompFactory.PileUpMergeSvc
         acc.addService( PileUpMergeSvc() )
 
@@ -98,7 +99,7 @@ def TileHitVecToCntCfg(flags, **kwargs):
         kwargs.setdefault('DigitizationTool', tool)
 
     # choose which alg to attach to, following PileUpToolsCfg
-    if flags.Digitization.DoXingByXingPileUp:
+    if flags.Digitization.DoXingByXingPileUp or flags.Detector.OverlayTile:
         Alg = CompFactory.TileHitVecToCnt
     else:
         Alg = CompFactory.DigitizationAlg
@@ -117,7 +118,10 @@ def TileHitOutputCfg(flags, **kwargs):
         flags  -- Athena configuration flags (ConfigFlags)
     """
 
-    acc = OutputStreamCfg(flags, 'RDO', ['TileHitContainer#*'])
+    if flags.Output.doWriteRDO:
+        acc = OutputStreamCfg(flags, 'RDO', ['TileHitContainer#*'])
+    else:
+        acc = ComponentAccumulator()
 
     return acc
 
diff --git a/TileCalorimeter/TileSimAlgs/python/TileMuonReceiverConfig.py b/TileCalorimeter/TileSimAlgs/python/TileMuonReceiverConfig.py
index af4aefb284fb323baa20cd33119918ebf911ecac..470a27593dc3d72608e2705a38ebcf3cc6b43a75 100644
--- a/TileCalorimeter/TileSimAlgs/python/TileMuonReceiverConfig.py
+++ b/TileCalorimeter/TileSimAlgs/python/TileMuonReceiverConfig.py
@@ -115,8 +115,9 @@ def TilePulseForTileMuonReceiverOutputCfg(flags, **kwargs):
         muRcvRawChCnt = muRcvRawChCnt.split('+').pop()
         outputItemList += ['TileRawChannelContainer#' + muRcvRawChCnt]
 
-    from OutputStreamAthenaPool.OutputStreamConfig import OutputStreamCfg
-    acc.merge( OutputStreamCfg(flags, streamName = 'RDO', ItemList = outputItemList) )
+    if flags.Output.doWriteRDO:
+        from OutputStreamAthenaPool.OutputStreamConfig import OutputStreamCfg
+        acc.merge( OutputStreamCfg(flags, streamName = 'RDO', ItemList = outputItemList) )
 
     return acc
 
diff --git a/TileCalorimeter/TileSimAlgs/python/TileMuonReceiverDecisionConfig.py b/TileCalorimeter/TileSimAlgs/python/TileMuonReceiverDecisionConfig.py
index 8cf3d66bce7861d070cd28780cd0f45c55e30c81..981389ea38f75b573e204e3527e37349e6dc386c 100644
--- a/TileCalorimeter/TileSimAlgs/python/TileMuonReceiverDecisionConfig.py
+++ b/TileCalorimeter/TileSimAlgs/python/TileMuonReceiverDecisionConfig.py
@@ -61,8 +61,9 @@ def TileMuonReceiverDecisionOutputCfg(flags, **kwargs):
     muRcvContainer = muRcvContainer.split('+').pop()
     outputItemList = ['TileMuonReceiverContainer#' + muRcvContainer]
 
-    from OutputStreamAthenaPool.OutputStreamConfig import OutputStreamCfg
-    acc.merge( OutputStreamCfg(flags, streamName = 'RDO', ItemList = outputItemList) )
+    if flags.Output.doWriteRDO:
+        from OutputStreamAthenaPool.OutputStreamConfig import OutputStreamCfg
+        acc.merge( OutputStreamCfg(flags, streamName = 'RDO', ItemList = outputItemList) )
 
     return acc
 
diff --git a/TileCalorimeter/TileSimAlgs/share/TileDigiCommon_jobOptions.py b/TileCalorimeter/TileSimAlgs/share/TileDigiCommon_jobOptions.py
index a9b71236c635f58163c96345f6d6459991dc6199..7f4997c3b43b6ce5e066aa7c59d5bfb3776c37ae 100644
--- a/TileCalorimeter/TileSimAlgs/share/TileDigiCommon_jobOptions.py
+++ b/TileCalorimeter/TileSimAlgs/share/TileDigiCommon_jobOptions.py
@@ -42,7 +42,25 @@ if doTileHitToRawChannelDirect:
 
 
 if doTileHitToDigit:
-    
+    # Change default parameters for TileDQstatusAlg.
+    from AthenaCommon.GlobalFlags import globalflags
+    if globalflags.isOverlay():
+        from TileRecUtils.TileDQstatusAlgDefault import TileDQstatusAlgDefault
+        dqstatus = TileDQstatusAlgDefault()
+        dqstatus.TileBeamElemContainer=""; # disable reading of trigger type from BeamElem container
+
+        from OverlayCommonAlgs.OverlayFlags import overlayFlags
+        if overlayFlags.isDataOverlay():
+            if overlayFlags.isOverlayMT():
+                dqstatus.TileDigitsContainer = overlayFlags.bkgPrefix() + "TileDigitsCnt"
+                dqstatus.TileRawChannelContainer = overlayFlags.bkgPrefix() + "TileRawChannelCnt"
+            else:
+                dqstatus.TileDigitsContainer = overlayFlags.dataStore() + "+TileDigitsCnt"
+                dqstatus.TileRawChannelContainer = overlayFlags.dataStore() + "+TileRawChannelCnt"
+        else:
+            dqstatus.TileDigitsContainer="";   # disable checking of Digits container size for bi-gain mode
+            dqstatus.TileRawChannelContainer=""; # disable checking of DQstatus for simulated data
+
     from TileSimAlgs.TileDigitsGetter import *
     theTileDigitsGetter=TileDigitsGetter()
     
@@ -53,7 +71,9 @@ if doTileHitToDigit:
     theTileDigitsMaker.RndmEvtOverlay=False
     from Digitization.DigitizationFlags import digitizationFlags
     theTileDigitsMaker.DoHSTruthReconstruction = digitizationFlags.doDigiTruth()
-    
+    if globalflags.isOverlay():
+        theTileDigitsMaker.TileDQstatus = 'TileDQstatus'
+
 if doTileDigitsFromPulse:
     
     import traceback
diff --git a/TileCalorimeter/TileSimAlgs/src/TileDigitsMaker.cxx b/TileCalorimeter/TileSimAlgs/src/TileDigitsMaker.cxx
index a1914a863a670ce587141e53c0ec5b0818055157..d1369ce38fb80888d0b7bbad5f867f1725dd116f 100644
--- a/TileCalorimeter/TileSimAlgs/src/TileDigitsMaker.cxx
+++ b/TileCalorimeter/TileSimAlgs/src/TileDigitsMaker.cxx
@@ -72,7 +72,6 @@ TileDigitsMaker::TileDigitsMaker(std::string name, ISvcLocator* pSvcLocator)
     m_tileHWID(nullptr),
     m_tileInfo(nullptr),
     m_cabling(nullptr),
-    m_DQstatus(nullptr),
     m_nSamples(0),
     m_iTrig(0),
     m_tileNoise(false),
@@ -210,10 +209,8 @@ StatusCode TileDigitsMaker::initialize() {
   m_binTime0Lo = m_tileInfo->digitsTime0BinLo();
   m_timeStepLo = 25.0 / m_nBinsPerXLo;
 
-  m_overlayDigitContainerName = m_overlayDigitContainerKey.key();
-  ATH_CHECK( m_overlayDigitContainerKey.initialize(!m_onlyUseContainerName && m_rndmEvtOverlay) );
-  m_overlayRawChannelContainerName = m_overlayRawChannelContainerKey.key();
-  ATH_CHECK( m_overlayRawChannelContainerKey.initialize(!m_onlyUseContainerName && m_rndmEvtOverlay) );
+  m_inputDigitContainerName = m_inputDigitContainerKey.key();
+  ATH_CHECK( m_inputDigitContainerKey.initialize(!m_onlyUseContainerName && m_rndmEvtOverlay) );
 
   if (m_rndmEvtOverlay) {
     m_tileNoise = false;
@@ -231,12 +228,10 @@ StatusCode TileDigitsMaker::initialize() {
       ATH_MSG_INFO( "PileUpMergeSvc successfully initialized");
     }
 
-    ATH_CHECK( m_DQstatusTool.retrieve() );
     ATH_CHECK( m_DQstatusKey.initialize() );
 
   } else {
-    m_DQstatusTool.disable();
-    m_DQstatusKey = "";
+    ATH_CHECK( m_DQstatusKey.initialize(!m_DQstatusKey.empty()) );
 
     if (m_allChannels<0) m_allChannels = 0;                 // do not create all channels by default
     if (m_tileNoise || m_tileCoherNoise) m_allChannels = 2; // unless noise is set to True
@@ -518,12 +513,10 @@ StatusCode TileDigitsMaker::execute() {
                                                                             TileRawChannelUnit::ADCcounts);
     ATH_CHECK( backgroundDigitContainer->status() );
 
-    const TileRawChannelContainer* rndm_rawchan_container{};
-    auto dqStatus = std::make_unique<TileDQstatus>();
     if (m_onlyUseContainerName) {
       typedef PileUpMergeSvc::TimedList<TileDigitsContainer>::type TimedDigitContList;
       TimedDigitContList digitContList;
-      ATH_CHECK( m_mergeSvc->retrieveSubEvtsData(m_overlayDigitContainerName, digitContList));
+      ATH_CHECK( m_mergeSvc->retrieveSubEvtsData(m_inputDigitContainerName, digitContList));
       ATH_MSG_DEBUG( "TileDigitsCnt successfully retrieved ");
 
 
@@ -539,26 +532,9 @@ StatusCode TileDigitsMaker::execute() {
           ATH_CHECK(backgroundDigitContainer->push_back(std::move(pDigits)));
         }
       }
-      typedef PileUpMergeSvc::TimedList<TileRawChannelContainer>::type TimedRawChanContList;
-      TimedRawChanContList rawchanContList;
-      if (!(m_mergeSvc->retrieveSubEvtsData(m_overlayRawChannelContainerName, rawchanContList).isSuccess())) {
-        ATH_MSG_ERROR( "Cannot retrieve TileRawChannelContainer for DQ check");
-      } else {
-        ATH_MSG_DEBUG( "TileRawChannelContainer for DQ check retrieved");
-      }
-
-      if (!rawchanContList.empty()) {
-        TimedRawChanContList::iterator iTzeroRawChanCont(rawchanContList.begin());
-        rndm_rawchan_container = iTzeroRawChanCont->second;
-      }
-      ATH_CHECK( m_DQstatusTool->makeStatus (ctx,
-                                             rndm_rawchan_container,
-                                             backgroundDigitContainer.get(),
-                                             nullptr, // TileBeamElemContainer
-                                             *dqStatus) );
     }
     else {
-      SG::ReadHandle<TileDigitsContainer> tileDigitsContainerHandle(m_overlayDigitContainerKey);
+      SG::ReadHandle<TileDigitsContainer> tileDigitsContainerHandle(m_inputDigitContainerKey);
       if (tileDigitsContainerHandle.isValid()) {
         for (const auto* digitCollection : *tileDigitsContainerHandle) {
           for (const auto* digit : *digitCollection) {
@@ -569,23 +545,10 @@ StatusCode TileDigitsMaker::execute() {
       }
       else {
         ATH_MSG_ERROR("ReadHandle to Background Digits is invalid.");
+        return StatusCode::FAILURE;
       }
-      SG::ReadHandle<TileRawChannelContainer> tileRawChannelContainerHandle(m_overlayRawChannelContainerKey);
-      if (tileRawChannelContainerHandle.isValid()) {
-        rndm_rawchan_container = &*tileRawChannelContainerHandle;
-      }
-      else {
-        ATH_MSG_WARNING("ReadHandle to Background Raw Channels is invalid.");
-      }
-      ATH_CHECK( m_DQstatusTool->makeStatus (ctx,
-                                             rndm_rawchan_container,
-                                             backgroundDigitContainer.get(),
-                                             nullptr, // TileBeamElemContainer
-                                           *dqStatus) );
     }
-    m_DQstatus = dqStatus.get();
 
-    ATH_CHECK( SG::makeHandle (m_DQstatusKey, ctx).record (std::move (dqStatus)) );
     collItrRndm = backgroundDigitContainer->begin();
     lastCollRndm = backgroundDigitContainer->end();
   }
@@ -1380,6 +1343,9 @@ StatusCode TileDigitsMaker::overlayBackgroundDigits( const TileDigitsCollection
     return StatusCode::FAILURE;
   }
 
+  SG::ReadHandle<TileDQstatus> DQstatus(m_DQstatusKey);
+  ATH_CHECK( DQstatus.isValid() );
+
   // iterate over all digits in a collection
   for (const auto* bkgDigit : *bkgDigitCollection) {
 
@@ -1391,7 +1357,7 @@ StatusCode TileDigitsMaker::overlayBackgroundDigits( const TileDigitsCollection
     igain[channel] = gain;
 
     // get channel status
-    bool good_dq = m_DQstatus->isAdcDQgood(ros, drawer, channel, gain);
+    bool good_dq = DQstatus->isAdcDQgood(ros, drawer, channel, gain);
     bool good_ch = (!m_tileBadChanTool->getAdcStatus(drawerIdx, channel, gain).isBad());
 
     // get digits