diff --git a/Control/PileUpComps/src/PileUpEventLoopMgr.cxx b/Control/PileUpComps/src/PileUpEventLoopMgr.cxx
index e6a3fae1c4803717100b3f7ee5f8363fd0a089ce..457b86bc90b7e055cc9c00d4f27c6b7ff0e6936f 100644
--- a/Control/PileUpComps/src/PileUpEventLoopMgr.cxx
+++ b/Control/PileUpComps/src/PileUpEventLoopMgr.cxx
@@ -86,6 +86,7 @@ PileUpEventLoopMgr::PileUpEventLoopMgr(const std::string& name,
   declareProperty("AllowSubEvtsEOF", m_allowSubEvtsEOF, "if true(default) an EOF condition in the BkgStreamsCaches is not considered to be an error IF maxevt=-1 (loop over all available events)");
   declareProperty("XingByXing", m_xingByXing, "if set to true we will not cache bkg events from one xing to then next. This greatly increases the amount of I/O and greatly reduces the memory required to run a job");
   declareProperty("IsEventOverlayJob", m_isEventOverlayJob, "if set to true will prevent the BCID from being overridden.");
+  declareProperty("IsEventOverlayJobMC", m_isEventOverlayJobMC, "if set to true events will be marked as simulation");
   declareProperty("mcRunNumber", m_mcRunNumber=99, "the run number from an EVNT file, used to set the mc_channel_number, for overlay");
   declareProperty("FailureMode", m_failureMode,
                   "Controls behaviour of event loop depending on return code of"
@@ -333,6 +334,10 @@ StatusCode PileUpEventLoopMgr::nextEvent(int maxevt)
         {
           pOvrEt->set_mc_channel_number(m_mcRunNumber);
           ATH_MSG_DEBUG ( "pOvrEt set_mc_channel_number: " << m_mcRunNumber );
+
+          if (m_isEventOverlayJobMC){
+            pOvrEt->add_type(EventType::IS_SIMULATION);
+          }
         }
       else
         {
@@ -342,7 +347,7 @@ StatusCode PileUpEventLoopMgr::nextEvent(int maxevt)
         }
 
       PileUpEventInfo *pOverEvent = new PileUpEventInfo(pOvrID, pOvrEt);
-      if(m_isEmbedding)
+      if(m_isEmbedding || m_isEventOverlayJobMC)
         {
           pOverEvent->setActualInteractionsPerCrossing(pEvent->actualInteractionsPerCrossing());
           pOverEvent->setAverageInteractionsPerCrossing(pEvent->averageInteractionsPerCrossing());
@@ -350,7 +355,7 @@ StatusCode PileUpEventLoopMgr::nextEvent(int maxevt)
       ATH_MSG_VERBOSE ( "BCID =" << pOverEvent->event_ID()->bunch_crossing_id() );
       //  register as sub event of the overlaid
       bool addpEvent(true);
-      if(m_isEmbedding)
+      if(m_isEmbedding || m_isEventOverlayJobMC)
         {
           const PileUpEventInfo* pOldEvent(dynamic_cast<const PileUpEventInfo*>(pEvent));
           if(pOldEvent)
@@ -388,7 +393,7 @@ StatusCode PileUpEventLoopMgr::nextEvent(int maxevt)
       bool needupdate;
       float sf = m_beamLumi->scaleFactor(pEvent->event_ID()->run_number(), pEvent->event_ID()->lumi_block(), needupdate );
       float currentaveragemu(sf*m_maxCollPerXing);
-      if(!m_isEmbedding)
+      if(!m_isEmbedding && !m_isEventOverlayJobMC)
         {
           pOverEvent->setAverageInteractionsPerCrossing(currentaveragemu);
           //FIXME check whether actualInteractionsPerCrossing should be set
diff --git a/Control/PileUpComps/src/PileUpEventLoopMgr.h b/Control/PileUpComps/src/PileUpEventLoopMgr.h
index 516418d85c07789534f7c6f0c3c5ce389bf6f251..01380ec4cb0dcc80a4329306462123fcd7ac4262 100644
--- a/Control/PileUpComps/src/PileUpEventLoopMgr.h
+++ b/Control/PileUpComps/src/PileUpEventLoopMgr.h
@@ -142,6 +142,9 @@ private:
   /// property: is this job running RDO+RDO overlay.
   BooleanProperty m_isEventOverlayJob;
 
+  /// property: is this job running MC RDO+RDO overlay.
+  BooleanProperty m_isEventOverlayJobMC;
+
   /// property: the run number from an EVNT file, used to set the mc_channel_number, for overlay
   IntegerProperty m_mcRunNumber;
 
diff --git a/Event/EventOverlay/EventOverlayJobTransforms/share/CaloOverlay_jobOptions.py b/Event/EventOverlay/EventOverlayJobTransforms/share/CaloOverlay_jobOptions.py
index 4975e4fe39e3110372f719bc381a144951baeb90..20318d8a41e731c22423e41298ed55f06e7a3068 100644
--- a/Event/EventOverlay/EventOverlayJobTransforms/share/CaloOverlay_jobOptions.py
+++ b/Event/EventOverlay/EventOverlayJobTransforms/share/CaloOverlay_jobOptions.py
@@ -66,7 +66,9 @@ if DetFlags.overlay.Tile_on():
     include( "TileIdCnv/TileIdCnv_jobOptions.py" )
     include( "TileConditions/TileConditions_jobOptions.py" )        
 
-    include("TileSimAlgs/TileDigitization_jobOptions.py")
+    include( "TileSimAlgs/TileDigitization_jobOptions.py" )
+    include( "TileL2Algs/TileL2Algs_jobOptions.py" )
+
     job.TileHitVecToCnt.DigitizationTool.RndmEvtOverlay = True
     theTileDigitsMaker.RndmEvtOverlay = True
     if readBS and isRealData:
diff --git a/Event/EventOverlay/EventOverlayJobTransforms/share/ConfiguredOverlay_jobOptions.py b/Event/EventOverlay/EventOverlayJobTransforms/share/ConfiguredOverlay_jobOptions.py
index d3c2402b10bc7e0247e2690e93f86efec8f62017..04aeded00b9d54cccdc957d31490c2b184249d42 100644
--- a/Event/EventOverlay/EventOverlayJobTransforms/share/ConfiguredOverlay_jobOptions.py
+++ b/Event/EventOverlay/EventOverlayJobTransforms/share/ConfiguredOverlay_jobOptions.py
@@ -9,6 +9,10 @@ from AthenaCommon.AlgSequence import AlgSequence
 job = AlgSequence()
 topSequence = job
 
+if not isRealData:
+    from OverlayCommonAlgs.OverlayCommonAlgsConf import CopyTimings
+    job += CopyTimings()
+
 #=======================================================================
 from AthenaCommon.AppMgr import ServiceMgr
 from PileUpComps.PileUpCompsConf import PileUpEventLoopMgr
@@ -58,6 +62,7 @@ pileUpEventLoopMgr.OrigSelector="EventSelector"
 pileUpEventLoopMgr.firstXing=0
 pileUpEventLoopMgr.lastXing=0
 pileUpEventLoopMgr.IsEventOverlayJob=True
+pileUpEventLoopMgr.IsEventOverlayJobMC=not isRealData
 ServiceMgr.EventSelector.SkipEvents = athenaCommonFlags.SkipEvents()
 
 # Set up MC input
diff --git a/Event/EventOverlay/EventOverlayJobTransforms/share/Level1Overlay_jobOptions.py b/Event/EventOverlay/EventOverlayJobTransforms/share/Level1Overlay_jobOptions.py
index 5697d8f93a73aa2fae90d8b386543ac5c51dd886..6ea3bda4b3c950b867f4a4501c8ec264637a6c01 100644
--- a/Event/EventOverlay/EventOverlayJobTransforms/share/Level1Overlay_jobOptions.py
+++ b/Event/EventOverlay/EventOverlayJobTransforms/share/Level1Overlay_jobOptions.py
@@ -36,6 +36,7 @@ if DetFlags.overlay.LVL1_on():
     
     if DetFlags.simulateLVL1.Tile_on():
         include( "TileSimAlgs/TileTTL1_jobOptions.py" )
+        include( "TileSimAlgs/TileMuonReceiver_jobOptions.py" )
 
     if DetFlags.digitize.LVL1_on():
        #--------------------------------------------------------------
diff --git a/Event/EventOverlay/EventOverlayJobTransforms/share/OverlayOutputItemList_jobOptions.py b/Event/EventOverlay/EventOverlayJobTransforms/share/OverlayOutputItemList_jobOptions.py
index cc48257919af8210e888fa498dfa9cde35502cf7..c40590b7924e0eae935a24964d5821a102f238fa 100644
--- a/Event/EventOverlay/EventOverlayJobTransforms/share/OverlayOutputItemList_jobOptions.py
+++ b/Event/EventOverlay/EventOverlayJobTransforms/share/OverlayOutputItemList_jobOptions.py
@@ -2,6 +2,7 @@ include.block ( "EventOverlayJobTransforms/OverlayOutputItemList_jobOptions.py"
 
 from AthenaCommon.AppMgr import ServiceMgr
 from AthenaCommon.DetFlags import DetFlags
+from Digitization.DigitizationFlags import digitizationFlags
 
 # The output - overlay
 from AthenaPoolCnvSvc.WriteAthenaPool import AthenaPoolOutputStream
@@ -13,11 +14,17 @@ print "ACH123 new OverlayOutputItemList_jobOptions.py"
 outStream.ItemList += [ "EventInfo#*", "PileUpEventInfo#*" ]
 outStream.ItemList += [ "LumiBlockCollection#*" ]
 
+# timings
+if not isRealData:
+    outStream.ItemList += ["RecoTimingObj#EVNTtoHITS_timings"]
+    outStream.ItemList += ["RecoTimingObj#HITStoRDO_timings"]
+
 if DetFlags.overlay.Truth_on():
-   outStream.ItemList += [
-                             "McEventCollection#*",
-                             "TrackRecordCollection#*"
-                           ]
+   outStream.ItemList += [ "McEventCollection#*", "TrackRecordCollection#*" ]
+   outStream.ItemList += [ "xAOD::JetContainer#InTimeAntiKt4TruthJets" ]
+   outStream.ItemList += [ "xAOD::JetAuxContainer#InTimeAntiKt4TruthJetsAux." ]
+   outStream.ItemList += [ "xAOD::JetContainer#OutOfTimeAntiKt4TruthJets" ]
+   outStream.ItemList += [ "xAOD::JetAuxContainer#OutOfTimeAntiKt4TruthJetsAux." ]
    if DetFlags.overlay.CSC_on():
       outStream.ItemList += [ "CscSimDataCollection#CSC_SDO" ]
    if DetFlags.overlay.MDT_on():
@@ -42,7 +49,6 @@ if DetFlags.overlay.pixel_on():
    outStream.ItemList += ["InDetBSErrContainer#*"]
 if DetFlags.overlay.SCT_on():
    outStream.ItemList += ["SCT_RDO_Container#*"]
-   outStream.ItemList += ["SCT_RDO_Container#*"]
 if DetFlags.overlay.TRT_on():
    outStream.ItemList += ["TRT_RDO_Container#*"]
    outStream.ItemList += ["TRT_BSIdErrContainer#*"]
@@ -50,14 +56,18 @@ if DetFlags.overlay.TRT_on():
 
 if DetFlags.overlay.LAr_on():
    outStream.ItemList+=["LArRawChannelContainer#*"]
-   outStream.ItemList+=["LArDigitContainer#LArDigitContainer_MC_Thinned"]
+   if 'AddCaloDigi' in digitizationFlags.experimentalDigi():
+       outStream.ItemList+=["LArDigitContainer#*"]
+   else:
+       outStream.ItemList+=["LArDigitContainer#LArDigitContainer_MC_Thinned"]
    outStream.ItemList+=["LArFebErrorSummary#*"]
 if DetFlags.overlay.Tile_on():
-   if isRealData:
-      outStream.ItemList += [ "TileDigitsContainer#*" ]
-   else:
-      outStream.ItemList += [ "TileDigitsContainer#TileDigitsFlt" ]
    outStream.ItemList += [ "TileRawChannelContainer#*" ]
+   if isRealData or 'AddCaloDigi' in digitizationFlags.experimentalDigi():
+       outStream.ItemList += [ "TileDigitsContainer#*" ]
+   else:
+       outStream.ItemList += [ "TileDigitsContainer#TileDigitsFlt" ]
+   outStream.ItemList += [ "TileL2Container#TileL2Cnt" ]
 
 if DetFlags.overlay.CSC_on():
    outStream.ItemList += [ "CscRawDataContainer#*" ]
@@ -76,9 +86,15 @@ if DetFlags.overlay.BCM_on():
    outStream.ItemList+=["BCM_RDO_Container#*"]
 
 if DetFlags.overlay.LVL1_on():
-   outStream.ItemList+=["LArTTL1Container#*"]
-   outStream.ItemList+=["TileTTL1Container#*"]
-   outStream.ItemList+=[
+   if DetFlags.simulateLVL1.LAr_on():
+      outStream.ItemList += [ "LArTTL1Container#*" ]
+   if DetFlags.simulateLVL1.Tile_on():
+      outStream.ItemList += [ "TileTTL1Container#*" ]
+      outStream.ItemList += [ "TileDigitsContainer#MuRcvDigitsCnt" ]
+      outStream.ItemList += [ "TileRawChannelContainer#MuRcvRawChCnt" ]
+      outStream.ItemList += [ "TileMuonReceiverContainer#*" ]
+   if DetFlags.digitize.LVL1_on():
+      outStream.ItemList += [
                            "ROIB::RoIBResult#*",
                            "MuCTPI_RDO#*",
                            "CTP_RDO#*",
diff --git a/Event/EventOverlay/EventOverlayJobTransforms/share/TruthOverlay_jobOptions.py b/Event/EventOverlay/EventOverlayJobTransforms/share/TruthOverlay_jobOptions.py
index 935de91318ba6c1f0861e7d7801bc0ef763784da..7aaa8f8515b832bab24d2c9a6da4d34e2b11d57e 100644
--- a/Event/EventOverlay/EventOverlayJobTransforms/share/TruthOverlay_jobOptions.py
+++ b/Event/EventOverlay/EventOverlayJobTransforms/share/TruthOverlay_jobOptions.py
@@ -18,3 +18,6 @@ job += CopyMcEventCollection()
 if readBS and isRealData:
     job.CopyMcEventCollection.RealData = True
 
+if not isRealData:
+    from OverlayCommonAlgs.OverlayCommonAlgsConf import CopyTruthInfo
+    job += CopyTruthInfo()
diff --git a/Event/EventOverlay/EventOverlayJobTransforms/share/skeleton.OverlayPool_tf.py b/Event/EventOverlay/EventOverlayJobTransforms/share/skeleton.OverlayPool_tf.py
index aca0d70a91b4e7823d2f0b2c3059559b32e24c86..c4741c84030847d503a7086c4350dde6915309e0 100644
--- a/Event/EventOverlay/EventOverlayJobTransforms/share/skeleton.OverlayPool_tf.py
+++ b/Event/EventOverlay/EventOverlayJobTransforms/share/skeleton.OverlayPool_tf.py
@@ -16,19 +16,22 @@ if hasattr(runArgs, "preExec") and runArgs.preExec != 'NONE':
 import AthenaCommon.AtlasUnixStandardJob
 
 if hasattr(runArgs, 'preInclude'):
-for cf in runArgs.preInclude:
-    include(cf)
+    for cf in runArgs.preInclude:
+        include(cf)
 
 #==============================================================
 # Job definition parameters:
 #==============================================================
+from AthenaCommon.AppMgr import ServiceMgr
 from AthenaCommon.GlobalFlags  import globalflags
+from AthenaCommon.AthenaCommonFlags  import athenaCommonFlags
+from AthenaCommon.DetFlags import DetFlags
+from OverlayCommonAlgs.OverlayFlags import overlayFlags
 
 globalflags.isOverlay.set_Value_and_Lock(True)
 
-if hasattr(runArgs,"maxEvents"): from AthenaCommon.AthenaCommonFlags  import athenaCommonFlags
-athenaCommonFlags.EvtMax = runArgs.maxEvents
-if hasattr(runArgs,"skipEvents"): athenaCommonFlags.SkipEvents= runArgs.skipEvents
+if hasattr(runArgs,"skipEvents"): athenaCommonFlags.SkipEvents.set_Value_and_Lock( runArgs.skipEvents )
+if hasattr(runArgs,"maxEvents"): athenaCommonFlags.EvtMax.set_Value_and_Lock( runArgs.maxEvents )
 
 if hasattr(runArgs,"inputHITSFile"):
     athenaCommonFlags.PoolHitsInput.set_Value_and_Lock( runArgs.inputHITSFile )
@@ -39,31 +42,32 @@ else:
 if hasattr(runArgs,"outputRDOFile"): 
     athenaCommonFlags.PoolRDOOutput.set_Value_and_Lock( runArgs.outputRDOFile )
     OverlayCollection = runArgs.outputRDOFile
+    
+if not hasattr(runArgs, 'outputRDO_SGNLFile') or runArgs.outputRDO_SGNLFile=="NONE":
+    overlayFlags.doSignal=False
+    SignalCollection = "NONE"
+else:
+    overlayFlags.doSignal=True
+    SignalCollection = runArgs.outputRDO_SGNLFile
 
-if hasattr(runArgs,"geometryVersion"): globalFlags.DetDescrVersion=runArgs.geometryVersion
+if hasattr(runArgs,"geometryVersion"): globalflags.DetDescrVersion.set_Value_and_Lock( runArgs.geometryVersion )
+if hasattr(runArgs,"conditionsTag"): globalflags.ConditionsTag.set_Value_and_Lock( runArgs.conditionsTag )
 
 from Digitization.DigitizationFlags import digitizationFlags
 if hasattr(runArgs,"digiSeedOffset1"): digitizationFlags.rndmSeedOffset1=int(runArgs.digiSeedOffset1)
 if hasattr(runArgs,"digiSeedOffset2"): digitizationFlags.rndmSeedOffset2=int(runArgs.digiSeedOffset2)
 if hasattr(runArgs,"samplingFractionDbTag"): digitizationFlags.physicsList=runArgs.samplingFractionDbTag
 if hasattr(runArgs,"digiRndmSvc"): digitizationFlags.rndmSvc=runArgs.digiRndmSvc
-
-from AthenaCommon.DetFlags import DetFlags
-if not hasattr(runArgs, 'outputRDO_SGNLFile') or runArgs.outputRDO_SGNLFile=="NONE":
-   overlayFlags.doSignal=False
-   SignalCollection = "NONE"
-else:
-    overlayFlags.doSignal=True
-    SignalCollection = runArgs.outputRDO_SGNLFile
-
-DetFlags.overlay.BCM_setOff()
-DetFlags.overlay.Lucid_setOff()
+if hasattr(runArgs, "AddCaloDigi"): digitizationFlags.experimentalDigi+=["AddCaloDigi"]
 
 readBS = False
 if hasattr(runArgs, 'ReadByteStream'):
     readBS = runArgs.ReadByteStream
 isRealData = False
 
+from RecExConfig.RecFlags import rec
+rec.projectName = 'IS_SIMULATION'
+
 if readBS:
    globalflags.InputFormat.set_Value_and_Lock('bytestream')
    DataInputCollections=runArgs.inputPileUpBSFile
@@ -71,10 +75,12 @@ else:
    DataInputCollections=runArgs.inputRDO_BKGFile
    athenaCommonFlags.PoolRDOInput=runArgs.inputRDO_BKGFile
 
+
+from IOVDbSvc.CondDB import conddb
+
 if hasattr(runArgs, 'conditionsTag') and runArgs.conditionsTag!='NONE' and runArgs.conditionsTag!='':
    globalflags.ConditionsTag=runArgs.conditionsTag
    if len(globalflags.ConditionsTag())!=0:
-      from IOVDbSvc.CondDB import conddb
       conddb.setGlobalTag(globalflags.ConditionsTag())
 
 DetFlags.Print()
@@ -95,44 +101,51 @@ if hasattr(runArgs, "triggerConfig") and runArgs.triggerConfig!="NONE":
     from TriggerJobOpts.TriggerConfigGetter import TriggerConfigGetter
     cfg = TriggerConfigGetter("HIT2RDO")
 
-from AthenaCommon.DetFlags import DetFlags
 DetFlags.ID_setOn()
 DetFlags.Muon_setOn()
 DetFlags.LAr_setOn()
 DetFlags.Tile_setOn()
-if hasattr(runArgs, "triggerConfig") and runArgs.triggerConfig=="NONE":
-  DetFlags.LVL1_setOff()
+
+if not hasattr(runArgs, "triggerConfig") or runArgs.triggerConfig=="NONE":
+    DetFlags.LVL1_setOff()
 else:
-  DetFlags.LVL1_setOn()
+    DetFlags.LVL1_setOn()
 
-DetFlags.BCM_setOn()
-DetFlags.Lucid_on()
+DetFlags.digitize.LVL1_setOff()
 
-DetFlags.simulateLVL1.Lucid_setOff()
+DetFlags.BCM_setOn()
+DetFlags.Lucid_setOn()
+DetFlags.Truth_setOn()
+DetFlags.simulateLVL1.Lucid_setOn()
+DetFlags.simulateLVL1.LAr_setOn()
+DetFlags.simulateLVL1.Tile_setOn()
 
 print "================ DetFlags ================ "
 DetFlags.Print()
 
-# Geometry, controlled by DetFlags
-#GlobalFlags.DetGeo.set_atlas()
-#GlobalFlags.DataSource.set_geant4()
 globalflags.DataSource.set_Value_and_Lock('geant4')
 
-#from AtlasGeoModel import SetGeometryVersion
-#from AtlasGeoModel import GeoModelInit
 
-include ( "RecExCond/AllDet_detDescr.py" )
+print "================ Start ================= "
+from AthenaCommon.AlgSequence import AlgSequence
+topSeq = AlgSequence()
+## Set Overall per-Algorithm time-limit on the AlgSequence
+topSeq.TimeOut = 43200 * Units.s
 
-#from AtlasGeoModel import SetGeometryVersion
-#from AtlasGeoModel import GeoModelInit
-#from AtlasGeoModel import SetupRecoGeometry
+# Timings
+try:
+    from RecAlgs.RecAlgsConf import TimingAlg
+    topSeq += TimingAlg("OverlayTimerBegin", TimingObjOutputName = "HITStoRDO_timings")
+except:
+    overlaylog.warning('Could not add TimingAlg, no timing info will be written out.')
 
-#include( "BFieldAth/BFieldAth_jobOptions.py" )
 
-#--------
+include ( "RecExCond/AllDet_detDescr.py" )
+
 from AthenaCommon.AppMgr import theApp
 theApp.EventLoop = "PileUpEventLoopMgr"
-if hasattr(runArgs,"maxEvents"): theApp.EvtMax = runArgs.maxEvents
+if hasattr( runArgs, 'maxEvents'):
+    theApp.EvtMax = runArgs.maxEvents
 
 include ( "EventOverlayJobTransforms/ConfiguredOverlay_jobOptions.py" )
 
@@ -167,9 +180,6 @@ ServiceMgr += getConfigurable(digitizationFlags.rndmSvc.get_Value())()
 digitizationFlags.rndmSeedList.addtoService()
 digitizationFlags.rndmSeedList.printSeeds()
 
-# To not overwrite the BCID
-#from AthenaCommon.AppMgr import ServiceMgr
-#ServiceMgr.PileUpEventLoopMgr.IsEventOverlayJob=True
 
 #================================================================
 print "overlay_trf: final outStream = ", outStream
@@ -181,8 +191,6 @@ print "overlay_trf: final outStream = ", outStream
 ServiceMgr.MessageSvc.OutputLevel = INFO
 ServiceMgr.MessageSvc.Format = "% F%45W%S%7W%R%T %0W%M"
 
-print "overlay_trf: at the end. job=\n", job
-print "\n\noverlay_trf: at the end. ServiceMgr=\n", ServiceMgr
 
 # Post-include
 if hasattr(runArgs,"postInclude"):
@@ -192,3 +200,6 @@ if hasattr(runArgs,"postInclude"):
 if hasattr(runArgs, "postExec") and runArgs.postExec != 'NONE':
     for cmd in runArgs.postExec:
         exec(cmd)
+
+#print "OverlayPool_tf.py: at the end. job=\n", job
+print "\nOverlayPool_tf.py: at the end. ServiceMgr=\n", ServiceMgr
diff --git a/Event/EventOverlay/OverlayCommonAlgs/CMakeLists.txt b/Event/EventOverlay/OverlayCommonAlgs/CMakeLists.txt
index a4f49b2a721ff56c9e2f8529cc1b1725b04b6ee9..ecd8fdd559c3460fb52e4475775f4d926fe5c01e 100644
--- a/Event/EventOverlay/OverlayCommonAlgs/CMakeLists.txt
+++ b/Event/EventOverlay/OverlayCommonAlgs/CMakeLists.txt
@@ -11,6 +11,7 @@ atlas_depends_on_subdirs( PUBLIC
                           PRIVATE
                           Event/xAOD/xAODEventInfo
                           Event/xAOD/xAODCnvInterfaces
+                          Event/xAOD/xAODJet
                           Calorimeter/CaloSimEvent
                           Control/AthenaBaseComps
                           Control/AthenaKernel
@@ -32,6 +33,7 @@ atlas_depends_on_subdirs( PUBLIC
                           MuonSpectrometer/MuonRDO
                           MuonSpectrometer/MuonSimData
                           MuonSpectrometer/MuonSimEvent
+                          Reconstruction/RecEvent
                           Simulation/G4Sim/TrackRecord
                           TileCalorimeter/TileEvent
                           TileCalorimeter/TileSimEvent
@@ -50,8 +52,7 @@ atlas_add_component( OverlayCommonAlgs
                      src/*.cxx
                      src/components/*.cxx
                      INCLUDE_DIRS ${ROOT_INCLUDE_DIRS}
-                     LINK_LIBRARIES ${ROOT_LIBRARIES} GaudiKernel CaloSimEvent AthenaBaseComps AthenaKernel PileUpToolsLib StoreGateLib SGtests PersistentDataModel Identifier ByteStreamCnvSvcLib EventInfo OverlayAlgBase GeneratorObjects InDetBCM_RawData InDetRawData InDetSimData InDetSimEvent LArRawEvent LArSimEvent MuonDigitContainer MuonRDO MuonSimData MuonSimEvent TileEvent TileSimEvent TrigConfHLTData TrigSteeringEvent TrigT1CaloEventLib TrigT1Interfaces TrigT1Result )
+                     LINK_LIBRARIES ${ROOT_LIBRARIES} GaudiKernel CaloSimEvent AthenaBaseComps AthenaKernel PileUpToolsLib StoreGateLib SGtests PersistentDataModel Identifier ByteStreamCnvSvcLib EventInfo OverlayAlgBase GeneratorObjects InDetBCM_RawData InDetRawData InDetSimData InDetSimEvent LArRawEvent LArSimEvent MuonDigitContainer MuonRDO MuonSimData MuonSimEvent RecEvent TileEvent TileSimEvent TrigConfHLTData TrigSteeringEvent TrigT1CaloEventLib TrigT1Interfaces TrigT1Result xAODJet )
 
 # Install files from the package:
 atlas_install_python_modules( python/__init__.py python/OverlayFlags.py )
-
diff --git a/Event/EventOverlay/OverlayCommonAlgs/src/CopyTimings.cxx b/Event/EventOverlay/OverlayCommonAlgs/src/CopyTimings.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..afd1ace19848ce00fe28ac83330a9de021d2dcba
--- /dev/null
+++ b/Event/EventOverlay/OverlayCommonAlgs/src/CopyTimings.cxx
@@ -0,0 +1,45 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+
+#include "CopyTimings.h"
+
+#include "RecEvent/RecoTimingObj.h"
+
+#include <iostream>
+#include <typeinfo>
+
+//================================================================
+CopyTimings::CopyTimings(const std::string &name, ISvcLocator *pSvcLocator) :
+  OverlayAlgBase(name, pSvcLocator) {}
+
+//================================================================
+StatusCode CopyTimings::overlayInitialize()
+{
+  return StatusCode::SUCCESS;
+}
+
+//================================================================
+StatusCode CopyTimings::overlayFinalize()
+{
+  return StatusCode::SUCCESS;
+}
+
+//================================================================
+StatusCode CopyTimings::overlayExecute() {
+  MsgStream log(msgSvc(), name());
+  log << MSG::DEBUG << "CopyTimings::execute() begin"<< endreq;
+
+  std::auto_ptr<RecoTimingObj> ap(m_storeGateData->retrievePrivateCopy<RecoTimingObj>("EVNTtoHITS_timings"));
+  if (!m_storeGateOutput->record(ap, "EVNTtoHITS_timings").isSuccess()) {
+    log << MSG::ERROR << "problem recording object p=" << ap.get() << ", key=" << "EVNTtoHITS_timings" << endreq;
+    return StatusCode::FAILURE;
+  }
+
+  log << MSG::DEBUG << "CopyTimings::execute() end"<< endreq;
+  return StatusCode::SUCCESS;
+}
+
+//================================================================
+//EOF
diff --git a/Event/EventOverlay/OverlayCommonAlgs/src/CopyTimings.h b/Event/EventOverlay/OverlayCommonAlgs/src/CopyTimings.h
new file mode 100644
index 0000000000000000000000000000000000000000..fa9124bb5e09d0a403246a379cd2264a3e95d1c9
--- /dev/null
+++ b/Event/EventOverlay/OverlayCommonAlgs/src/CopyTimings.h
@@ -0,0 +1,23 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+#ifndef OVERLAYCOMMONALGS_COPYTIMINGS_H
+#define OVERLAYCOMMONALGS_COPYTIMINGS_H
+
+
+#include <string>
+
+#include "OverlayAlgBase/OverlayAlgBase.h"
+
+class CopyTimings : public OverlayAlgBase {
+public:
+
+  CopyTimings(const std::string &name,ISvcLocator *pSvcLocator);
+
+  virtual StatusCode overlayInitialize();
+  virtual StatusCode overlayExecute();
+  virtual StatusCode overlayFinalize();
+};
+
+#endif/*OVERLAYCOMMONALGS_COPYTIMINGS_H*/
diff --git a/Event/EventOverlay/OverlayCommonAlgs/src/CopyTruthInfo.cxx b/Event/EventOverlay/OverlayCommonAlgs/src/CopyTruthInfo.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..3842834ceecb98bcb4291b05e1b2aaa35e2d1331
--- /dev/null
+++ b/Event/EventOverlay/OverlayCommonAlgs/src/CopyTruthInfo.cxx
@@ -0,0 +1,59 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+
+#include "CopyTruthInfo.h"
+
+#include "xAODJet/JetAuxContainer.h"
+#include "xAODJet/JetContainer.h"
+
+#include <iostream>
+#include <typeinfo>
+
+//================================================================
+CopyTruthInfo::CopyTruthInfo(const std::string &name, ISvcLocator *pSvcLocator) :
+  OverlayAlgBase(name, pSvcLocator) {}
+
+//================================================================
+StatusCode CopyTruthInfo::overlayInitialize()
+{
+  return StatusCode::SUCCESS;
+}
+
+//================================================================
+StatusCode CopyTruthInfo::overlayFinalize()
+{
+  return StatusCode::SUCCESS;
+}
+
+//================================================================
+StatusCode CopyTruthInfo::overlayExecute() {
+  MsgStream log(msgSvc(), name());
+  log << MSG::DEBUG << "CopyTruthInfo::execute() begin"<< endreq;
+
+  typedef std::vector<std::string> KeyList;
+  KeyList keys = m_storeGateData->keys<xAOD::JetContainer>();
+  for(KeyList::const_iterator k=keys.begin(); k!=keys.end(); ++k) {
+    std::auto_ptr<xAOD::JetContainer> ap(m_storeGateData->retrievePrivateCopy<xAOD::JetContainer>(*k));
+    log << MSG::DEBUG << "Working on p="<<ap.get()<<", key="<<*k << endreq;
+    if(!m_storeGateOutput->record(ap, *k).isSuccess()) {
+      log << MSG::WARNING << "Problem recording object p="<<ap.get()<<", key="<<*k << endreq;
+    }
+  }
+
+  keys = m_storeGateData->keys<xAOD::JetAuxContainer>();
+  for(KeyList::const_iterator k=keys.begin(); k!=keys.end(); ++k) {
+    std::auto_ptr<xAOD::JetAuxContainer> ap(m_storeGateData->retrievePrivateCopy<xAOD::JetAuxContainer>(*k));
+    log << MSG::DEBUG << "Working on p="<<ap.get()<<", key="<<*k << endreq;
+    if(!m_storeGateOutput->record(ap, *k).isSuccess()) {
+      log << MSG::WARNING << "Problem recording object p="<<ap.get()<<", key="<<*k << endreq;
+    }
+  }
+
+  log << MSG::DEBUG << "CopyObjects::execute() end"<< endreq;
+  return StatusCode::SUCCESS;
+}
+
+//================================================================
+//EOF
diff --git a/Event/EventOverlay/OverlayCommonAlgs/src/CopyTruthInfo.h b/Event/EventOverlay/OverlayCommonAlgs/src/CopyTruthInfo.h
new file mode 100644
index 0000000000000000000000000000000000000000..e6748e51b60ef06f51820b66305f9283d89e1ce8
--- /dev/null
+++ b/Event/EventOverlay/OverlayCommonAlgs/src/CopyTruthInfo.h
@@ -0,0 +1,23 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+#ifndef OVERLAYCOMMONALGS_COPYTRUTHINFO_H
+#define OVERLAYCOMMONALGS_COPYTRUTHINFO_H
+
+
+#include <string>
+
+#include "OverlayAlgBase/OverlayAlgBase.h"
+
+class CopyTruthInfo : public OverlayAlgBase {
+public:
+
+  CopyTruthInfo(const std::string &name,ISvcLocator *pSvcLocator);
+
+  virtual StatusCode overlayInitialize();
+  virtual StatusCode overlayExecute();
+  virtual StatusCode overlayFinalize();
+};
+
+#endif/*OVERLAYCOMMONALGS_COPYTRUTHINFO_H*/
diff --git a/Event/EventOverlay/OverlayCommonAlgs/src/components/OverlayCommonAlgs_entries.cxx b/Event/EventOverlay/OverlayCommonAlgs/src/components/OverlayCommonAlgs_entries.cxx
index 6487e2353afce61db9de851c6df6382dd30b1185..fb235854222066056bdc4a4521969e71bd2613d8 100644
--- a/Event/EventOverlay/OverlayCommonAlgs/src/components/OverlayCommonAlgs_entries.cxx
+++ b/Event/EventOverlay/OverlayCommonAlgs/src/components/OverlayCommonAlgs_entries.cxx
@@ -1,6 +1,8 @@
 #include "GaudiKernel/DeclareFactoryEntries.h"
 #include "../CopyMcEventCollection.h"
 #include "../CopyObjects.h"
+#include "../CopyTimings.h"
+#include "../CopyTruthInfo.h"
 #include "../SaveInDetObjects.h"
 #include "../RemoveObjects.h"
 #include "../UpdateEventInfo.h"
@@ -12,6 +14,8 @@
 
 DECLARE_ALGORITHM_FACTORY( CopyMcEventCollection )
 DECLARE_ALGORITHM_FACTORY( CopyObjects )
+DECLARE_ALGORITHM_FACTORY( CopyTimings )
+DECLARE_ALGORITHM_FACTORY( CopyTruthInfo )
 DECLARE_ALGORITHM_FACTORY( SaveInDetObjects )
 DECLARE_ALGORITHM_FACTORY( RemoveObjects )
 DECLARE_ALGORITHM_FACTORY( UpdateEventInfo )
@@ -25,6 +29,8 @@ DECLARE_TOOL_FACTORY( ByteStreamMultipleOutputStreamCopyTool )
 DECLARE_FACTORY_ENTRIES( OverlayCommonAlgs ) {
   DECLARE_ALGORITHM( CopyMcEventCollection )
   DECLARE_ALGORITHM( CopyObjects )
+  DECLARE_ALGORITHM( CopyTimings )
+  DECLARE_ALGORITHM( CopyTruthInfo )
   DECLARE_ALGORITHM( SaveInDetObjects )
   DECLARE_ALGORITHM( RemoveObjects )
   DECLARE_ALGORITHM( UpdateEventInfo )