diff --git a/Reconstruction/RecJobTransforms/share/skeleton.RDOtoRDOtriggerLegacy.py b/Reconstruction/RecJobTransforms/share/skeleton.RDOtoRDOtriggerLegacy.py
index 91f41f9df1424ae6736c06dde157cb9d7c367ecf..e0c49adb64615745d03ad7629ab073549a4f5514 100644
--- a/Reconstruction/RecJobTransforms/share/skeleton.RDOtoRDOtriggerLegacy.py
+++ b/Reconstruction/RecJobTransforms/share/skeleton.RDOtoRDOtriggerLegacy.py
@@ -198,6 +198,9 @@ if _streamRDO:
     _streamRDO.ItemList +=["2927#*"]
     _streamRDO.ItemList +=["2934#*"]
     _streamRDO.ItemList += [ "xAOD::EventInfo#*", "xAOD::EventAuxInfo#*" ]
+    # Never store wildcarded legacy EventInfo
+    if "EventInfo#*" in _streamRDO.ItemList:
+        _streamRDO.ItemList.remove("EventInfo#*")
 
 condSeq = AthSequencer("AthCondSeq")
 if not hasattr( condSeq, "LumiBlockMuWriter" ):
diff --git a/Simulation/Digitization/python/DigitizationReadMetaData.py b/Simulation/Digitization/python/DigitizationReadMetaData.py
index 539ad9ff71ee1dd3ae2a5149ac4be55aaf6acf17..ceaeeecfb25fea335ca6bcfcaa8fdcbc7059bb53 100644
--- a/Simulation/Digitization/python/DigitizationReadMetaData.py
+++ b/Simulation/Digitization/python/DigitizationReadMetaData.py
@@ -4,6 +4,18 @@ from __future__ import print_function
 from AthenaCommon.Logging import logging
 logDigitizationReadMetadata = logging.getLogger( 'DigitizationReadMetadata' )
 
+def checkLegacyEventInfo(inputlist):
+    """ Check for legacy EventInfo """
+    present = False
+    for entry in inputlist:
+        if entry[0] != 'EventInfo':
+            continue
+
+        print(entry)
+        present = True
+
+    return present
+
 def hitColls2SimulatedDetectors(inputlist):
     """Build a dictionary from the list of containers in the metadata"""
     simulatedDetectors = []
@@ -194,6 +206,11 @@ def buildDict(inputtype, inputfile):
         else :
             from Digitization.DigitizationFlags import digitizationFlags
             digitizationFlags.experimentalDigi += ['OldTileCalibHitContainers']
+        ## Check for legacy EventInfo
+        if 'eventdata_items' in f.infos.keys():
+            metadatadict['LegacyEventInfo'] = checkLegacyEventInfo(f.infos['eventdata_items'])
+        else:
+            metadatadict['LegacyEventInfo'] = False
         ##End of Patch for older hit files
         logDigitizationReadMetadata.debug("%s Simulation MetaData Dictionary Successfully Created.",inputtype)
         logDigitizationReadMetadata.debug("Found %s KEY:VALUE pairs in %s Simulation MetaData." , Nkvp,inputtype)
@@ -302,6 +319,12 @@ def signalMetaDataCheck(metadatadict):
                 logDigitizationReadMetadata.info("All sub-detectors were simulated, so none needed to be switched off in digitization.")
             DetFlags.Print()
 
+    # Check for legacy EventInfo presence
+    if not skipCheck('LegacyEventInfo'):
+        if metadatadict['LegacyEventInfo']:
+            from Digitization.DigitizationFlags import digitizationFlags
+            digitizationFlags.experimentalDigi += ['LegacyEventInfo']
+
     ## Any other checks here
     logDigitizationReadMetadata.info("Completed checks of Digitization properties against Signal Simulation MetaData.")
 
diff --git a/Simulation/Digitization/share/DetectorDigitization.py b/Simulation/Digitization/share/DetectorDigitization.py
index bc96f48b528eae6096bfebed6a94a8ea37ff619d..820e1b04ac2a6a49480c5da7f50e342cf6cf4fa2 100755
--- a/Simulation/Digitization/share/DetectorDigitization.py
+++ b/Simulation/Digitization/share/DetectorDigitization.py
@@ -33,7 +33,14 @@ if jobproperties.Beam.beamType == "cosmics" :
 
 from AthenaCommon.AlgSequence import AlgSequence
 job = AlgSequence()
+
+# Convert old legacy EventInfo if needed
 from Digitization.DigitizationFlags import digitizationFlags
+if 'LegacyEventInfo' in digitizationFlags.experimentalDigi() and \
+    not (DetFlags.pileup.any_on() or digitizationFlags.doXingByXingPileUp()):
+    from xAODEventInfoCnv.xAODEventInfoCnvAlgDefault import xAODEventInfoCnvAlgDefault
+    xAODEventInfoCnvAlgDefault (sequence = job)
+
 job += CfgGetter.getAlgorithm(digitizationFlags.digiSteeringConf.get_Value(), tryDefaultConfigurable=True)
 if 'doFastPixelDigi' in digitizationFlags.experimentalDigi() or 'doFastSCT_Digi' in digitizationFlags.experimentalDigi() or 'doFastTRT_Digi' in digitizationFlags.experimentalDigi():
     print ("WARNING  Setting doFastPixelDigi ,doFastSCT_Digi or doFastTRT_Digi in digitizationFlags.experimentalDigi no longer overrides digitizationFlags.digiSteeringConf.")
diff --git a/Simulation/Digitization/share/Digitization.py b/Simulation/Digitization/share/Digitization.py
index 534c8748992405951dd05311a346eb26a406f90b..342346ac376860e39bf2c02b730a2523a01ab11c 100755
--- a/Simulation/Digitization/share/Digitization.py
+++ b/Simulation/Digitization/share/Digitization.py
@@ -123,7 +123,7 @@ if DetFlags.writeRDOPool.any_on():
         eventInfoKey = overlayFlags.bkgPrefix() + "EventInfo"
     else:
         eventInfoKey = "EventInfo"
-    streamRDO = AthenaPoolOutputStream("StreamRDO", athenaCommonFlags.PoolRDOOutput.get_Value(), asAlg=True, noTag=not premixing, eventInfoKey=eventInfoKey)
+    streamRDO = AthenaPoolOutputStream("StreamRDO", athenaCommonFlags.PoolRDOOutput.get_Value(), asAlg=True, eventInfoKey=eventInfoKey)
     from Digitization.DigiOutput import getStreamRDO_ItemList
     streamRDO.ItemList = getStreamRDO_ItemList(logDigitization_flags)
     streamRDO.AcceptAlgs += [ digitizationFlags.digiSteeringConf.get_Value() ]
diff --git a/Trigger/TrigMonitoring/TrigMuonMonitoring/src/CommonMon.cxx b/Trigger/TrigMonitoring/TrigMuonMonitoring/src/CommonMon.cxx
index 1e054c510fcb1a0609dd999da0fc2b5ffad57911..c597198892fec86f1eb4613cf97dc0b197d69d39 100644
--- a/Trigger/TrigMonitoring/TrigMuonMonitoring/src/CommonMon.cxx
+++ b/Trigger/TrigMonitoring/TrigMuonMonitoring/src/CommonMon.cxx
@@ -9,14 +9,11 @@
  */
 
 #include "GaudiKernel/IJobOptionsSvc.h"
+#include "GaudiKernel/ThreadLocalContext.h"
+#include "GaudiKernel/EventIDBase.h"
 #include "AthenaMonitoring/AthenaMonManager.h"
 #include "AthenaMonitoring/ManagedMonitorToolTest.h"
 
-#include "EventInfo/EventInfo.h"
-#include "EventInfo/EventID.h"
-#include "EventInfo/EventType.h"
-#include "EventInfo/TriggerInfo.h"
-
 #include "TrigSteeringEvent/TrigOperationalInfo.h"
 #include "TrigSteeringEvent/TrigOperationalInfoCollection.h"
 #include "TrigSteeringEvent/TrigRoiDescriptorCollection.h"
@@ -42,6 +39,8 @@
 //#include "muonEvent/MuonContainer.h"
 #include "muonEvent/MuonParamDefs.h"
 
+#include "xAODEventInfo/EventInfo.h"
+
 #include "xAODTrigger/MuonRoIContainer.h"
 #include "xAODTrigger/MuonRoI.h"
 
@@ -1346,31 +1345,17 @@ StatusCode HLTMuonMonTool::fillCommonDQA()
     }
   }
 
-  //get Event Info
-  const DataHandle<EventInfo> evt;
-  StatusCode sc = evtStore()->retrieve(evt);
-  if ( sc.isFailure() ) {
-    ATH_MSG_ERROR(" Cannot retrieve EventInfo ");
-    hist("Number_Of_Events", m_histdirrate )->Fill( m_lumiblock );
-    return StatusCode::FAILURE;
-  }
+  // Get EventID
+  const EventIDBase& evtid = Gaudi::Hive::currentContext().eventID();
 
-  if( !evt.isValid() ){
-    ATH_MSG_FATAL(" Could not find event");
+  if(! evtid.isValid() ){
+    ATH_MSG_FATAL(" Invalid EventID object");
     hist("Number_Of_Events", m_histdirrate )->Fill( m_lumiblock );
     return StatusCode::FAILURE;
   }
 
-  const EventID* evtid = evt->event_ID();
-
-  if(! evtid ){
-    ATH_MSG_FATAL(" no evtid object");
-    hist("Number_Of_Events", m_histdirrate )->Fill( m_lumiblock );
-    return StatusCode::FAILURE;
-  }
-
-  m_lumiblock = evtid->lumi_block() ;
-  m_event     = evtid->event_number() ;
+  m_lumiblock = evtid.lumi_block() ;
+  m_event     = evtid.event_number() ;
 
   hist("Number_Of_Events", m_histdirrate )->Fill( m_lumiblock );
 
@@ -1536,8 +1521,7 @@ StatusCode HLTMuonMonTool::fillCommonDQA()
   fillTriggerOverlap();
 
   //new check L1 flag
-  sc = fillL1MuRoI();
-  if ( sc.isFailure() ) {
+  if ( fillL1MuRoI().isFailure() ) {
     ATH_MSG_ERROR(" Cannot retrieve MuonRoIInfo ");
     return StatusCode::FAILURE;
   }
@@ -2626,12 +2610,6 @@ StatusCode HLTMuonMonTool::fillChainDQA_standard(const std::string& chainName, c
 
       }
     }
-    const DataHandle<EventInfo> evt;
-    sc = evtStore()->retrieve(evt);
-    if ( sc.isFailure() ) {
-      ATH_MSG_ERROR(" Cannot retrieve EventInfo ");
-      return StatusCode::FAILURE;
-    }
     float mean_mu = lbAverageInteractionsPerCrossing();
     // start to dump the probe muon information //
     if(tag_muon_index > -1){
@@ -4315,32 +4293,18 @@ std::vector<std::string> HLTMuonMonTool::getESbits()
   //
   // Process current event
   //
-	   
-  const EventInfo* event_handle(nullptr);
-  if(StatusCode::FAILURE==evtStore() -> retrieve(event_handle)){
-    if (errcnt < 1) {
-      ATH_MSG_DEBUG("Failed to read EventInfo");
-      errcnt++;
-    }
-    return retvect;
-  }
 
-  //
-  // Print EventInfo and stream tags
-  //
-  const TriggerInfo *trig = event_handle->trigger_info();
-  if(!trig) {
+  const xAOD::EventInfo* eventInfo = nullptr;
+  if (evtStore()->retrieve(eventInfo, "EventInfo").isFailure()) {
     if (errcnt < 1) {
-      ATH_MSG_DEBUG("Failed to get TriggerInfo");
+      ATH_MSG_DEBUG("Failed to read EventInfo");
       errcnt++;
     }
     return retvect;
   }
-  const std::vector<TriggerInfo::StreamTag> &streams = trig->streamTags();
 
   bool found_express_stream = false;
-  for(unsigned i = 0; i < streams.size(); ++i) {
-    const TriggerInfo::StreamTag &stag = streams.at(i);
+  for (const xAOD::EventInfo::StreamTag& stag : eventInfo->streamTags()) {
     if(stag.type() == "express" && stag.name() == "express") {
       found_express_stream = true;
       break;
@@ -4355,12 +4319,6 @@ std::vector<std::string> HLTMuonMonTool::getESbits()
     return retvect;
   }
 
-  /*  ATH_MSG_INFO (">>>>>>>>>>>>>>>>"
-      << " run #" << event_handle->event_ID()->run_number()
-      << " lumi #" << event_handle->event_ID()->lumi_block()
-      << " event #" << event_handle->event_ID()->event_number() 
-      << " has express stream tag");  */
-
   //const std::string key = "HLT_EXPRESS_OPI_HLT";
   const std::string key = "HLT_TrigOperationalInfoCollection_EXPRESS_OPI_HLT";
 
@@ -4526,16 +4484,7 @@ StatusCode HLTMuonMonTool::fillL1MuRoI()
     return StatusCode::FAILURE;
   }
 
-
-  const DataHandle<EventInfo> eventInfo;
-  sc = evtStore()->retrieve(eventInfo);
-  if ( sc.isFailure() ) {
-    ATH_MSG_ERROR(" Cannot retrieve EventInfo ");
-    hist("Number_Of_Events", m_histdirrate )->Fill( m_lumiblock );
-    return StatusCode::FAILURE;
-  }
-
-  EventID::number_type bcid = eventInfo->event_ID()->bunch_crossing_id();
+  EventIDBase::number_type bcid = Gaudi::Hive::currentContext().eventID().bunch_crossing_id();
 
   bool filled = m_bunchTool->isFilled(bcid);
   bool unpaired = m_bunchTool->isUnpaired(bcid);
diff --git a/Trigger/TrigSteer/TrigSteering/CMakeLists.txt b/Trigger/TrigSteer/TrigSteering/CMakeLists.txt
index 6ecf729df5d10e7f4dbe8a4e137ce15be309d3f5..73a50b5d879ca2b9403a8f924d95ef825cdd420d 100644
--- a/Trigger/TrigSteer/TrigSteering/CMakeLists.txt
+++ b/Trigger/TrigSteer/TrigSteering/CMakeLists.txt
@@ -15,7 +15,7 @@ atlas_add_library( TrigSteeringLib
                    PUBLIC_HEADERS TrigSteering
                    PRIVATE_INCLUDE_DIRS ${ROOT_INCLUDE_DIRS} ${Boost_INCLUDE_DIRS} ${TDAQ-COMMON_INCLUDE_DIRS} ${CLHEP_INCLUDE_DIRS}
                    PRIVATE_DEFINITIONS ${CLHEP_DEFINITIONS}
-                   LINK_LIBRARIES AthContainers AthenaBaseComps AthenaKernel AthenaMonitoringLib ByteStreamCnvSvcBaseLib EventInfo GaudiKernel L1TopoAlgorithms L1TopoCoreSim L1TopoEvent L1TopoSimulationLib TrigConfBase TrigConfHLTData TrigConfInterfaces TrigNavigationLib TrigSteeringEvent TrigT1CaloEventLib TrigT1CaloToolInterfaces TrigT1Result TrigTimeAlgsLib xAODEventInfo TrigInterfacesLib
+                   LINK_LIBRARIES AthContainers AthenaBaseComps AthenaKernel AthenaMonitoringLib ByteStreamCnvSvcBaseLib EventInfo EventInfoUtils GaudiKernel L1TopoAlgorithms L1TopoCoreSim L1TopoEvent L1TopoSimulationLib TrigConfBase TrigConfHLTData TrigConfInterfaces TrigNavigationLib TrigSteeringEvent TrigT1CaloEventLib TrigT1CaloToolInterfaces TrigT1Result TrigTimeAlgsLib xAODEventInfo TrigInterfacesLib
                    PRIVATE_LINK_LIBRARIES ${Boost_LIBRARIES} ${CLHEP_LIBRARIES} ${ROOT_LIBRARIES} ${TDAQ-COMMON_LIBRARIES} AthenaMonitoringKernelLib L1TopoCommon L1TopoConfig TrigConfL1Data TrigMonitorBaseLib TrigSerializeResultLib TrigStorageDefinitions TrigT1Interfaces xAODTrigger )
 
 atlas_add_component( TrigSteering
diff --git a/Trigger/TrigSteer/TrigSteering/src/ResultBuilder.cxx b/Trigger/TrigSteer/TrigSteering/src/ResultBuilder.cxx
index 67341734852d9491fe450acc9b8e34cd7fba0f32..fc5a02b646631164495909222cbddbda5073ea0d 100755
--- a/Trigger/TrigSteer/TrigSteering/src/ResultBuilder.cxx
+++ b/Trigger/TrigSteer/TrigSteering/src/ResultBuilder.cxx
@@ -13,6 +13,7 @@
 #include "TrigSteeringEvent/PartialEventBuildingInfo.h"
 #include "TrigConfHLTData/HLTTriggerType.h"
 #include "EventInfo/EventInfo.h"
+#include "EventInfoUtils/EventInfoFromxAOD.h"
 #include "TrigSteeringEvent/ScoutingInfo.h"
 #include "eformat/SourceIdentifier.h"
 
@@ -511,16 +512,36 @@ ErrorCode ResultBuilder::fillTriggerInfo(const std::vector<SteeringChain*>& acti
    // recording
    ////////////////////////////////////////////////////////////////////
 
+   // Retrieve xAOD::EventInfo
+   const xAOD::EventInfo* constxEventInfo(0);
+   if (evtStore()->retrieve(constxEventInfo).isFailure()) {
+      ATH_MSG_FATAL("Can't get xAOD::EventInfo object");
+      return HLT::FATAL;
+   }
+
+   // Create old EventInfo if not present in the event store
+   StatusCode sc = StatusCode::SUCCESS;
+   const EventInfo* constEventInfo{nullptr};
+   if (evtStore()->retrieve(constEventInfo).isFailure()) {
+      sc = evtStore()->record<EventInfo>(
+         std::make_unique<EventInfo>(
+            new EventID(eventIDFromxAOD(constxEventInfo)),
+            new EventType(eventTypeFromxAOD(constxEventInfo))
+         ), "EventInfo"
+      );
+      if (sc.isFailure()) {
+         ATH_MSG_FATAL("Can't record EventInfo created from xAOD::EventInfo");
+         return HLT::FATAL;
+      }
+      ATH_MSG_DEBUG("Recorded EventInfo created from xAOD::EventInfo");
+   }
 
-   // put it all to SG EventInfo object
-   // get EventInfo
-   const EventInfo* constEventInfo(0);
-   StatusCode sc = evtStore()->retrieve(constEventInfo);
-   if(sc.isFailure()){
+   // Get the EventInfo to update StreamTag and TriggerInfo
+   if(!constEventInfo && evtStore()->retrieve(constEventInfo).isFailure()){
       ATH_MSG_FATAL("Can't get EventInfo object for update of the StreamTag and TriggerInfo");
       return HLT::FATAL;
    }
-
+   ATH_MSG_DEBUG("Retrieved EventInfo for updating with EventID " << *(constEventInfo->event_ID()));
    ATH_MSG_VERBOSE("Updating TriggerInfo");
 
    EventInfo* eventInfo = const_cast<EventInfo*>(constEventInfo);
@@ -603,14 +624,6 @@ ErrorCode ResultBuilder::fillTriggerInfo(const std::vector<SteeringChain*>& acti
   //// Recording in xAODEventInfo
   ////////////////////////////////
   // put it all to SG xAOD::EventInfo object
- 
-  const xAOD::EventInfo* constxEventInfo(0);
-  sc = evtStore()->retrieve(constxEventInfo);
-  
-  if (sc.isFailure()) {   
-    ATH_MSG_FATAL("Can't get xAOD::EventInfo object for update of the StreamTag");
-    return HLT::FATAL;
-  }
   
 
 #if 0
diff --git a/Trigger/TrigSteer/TrigSteering/src/TrigSteer.cxx b/Trigger/TrigSteer/TrigSteering/src/TrigSteer.cxx
index b0515f0b78e7d868bb5cb6c2b8bce20329a5b725..06eaf63eeff0900ea4a6390d4393f7f314a9254a 100755
--- a/Trigger/TrigSteer/TrigSteering/src/TrigSteer.cxx
+++ b/Trigger/TrigSteer/TrigSteering/src/TrigSteer.cxx
@@ -67,6 +67,8 @@
 #include "TrigTimeAlgs/TrigTimer.h"
 
 #include "GaudiKernel/StatusCode.h"
+#include "GaudiKernel/EventContext.h"
+#include "GaudiKernel/ThreadLocalContext.h"
 
 #include "TrigSteeringEvent/TrigOperationalInfo.h"
 
@@ -1290,21 +1292,22 @@ bool TrigSteer::canContinueJob() {
 
 HLT::ErrorCode TrigSteer::setEvent() {
 
-  const EventInfo* einfo(0);
-  StatusCode sc =  m_config->getStoreGate()->retrieve(einfo);
-  if(sc.isFailure()){
-    ATH_MSG_FATAL("Can't get EventInfo object for update event information" );
+  const EventContext& ctx = Gaudi::Hive::currentContext();
+  if (!ctx.valid()) {
+    ATH_MSG_FATAL("No valid EventContext to update event information" );
     return HLT::ErrorCode(Action::ABORT_EVENT, Reason::USERDEF_1, SteeringInternalReason::UNKNOWN);
   } else {
-    if ( einfo->event_ID() ) {
-      m_config->setLumiBlockNumber( einfo->event_ID()->lumi_block() );
+    if ( ctx.eventID().isValid() ) {
+      ATH_MSG_DEBUG("Setting event information from eventID " << ctx.eventID());
+
+      m_config->setLumiBlockNumber( ctx.eventID().lumi_block() );
       
       ITrigLBNHist::set_lbn( m_config->getLumiBlockNumber() ); // this is setting LBN for all trigger monitoring tools
 
-      m_config->setLvl1Id( einfo->event_ID()->event_number() );
+      m_config->setLvl1Id(ctx.eventID().event_number() );
 
       // request the config service to set the correct prescales for the lumiblock
-      StatusCode sc = m_configSvc->assignPrescalesToChains( einfo->event_ID()->lumi_block() );
+      StatusCode sc = m_configSvc->assignPrescalesToChains( ctx.eventID().lumi_block() );
       if (sc.isFailure()) {
         ATH_MSG_FATAL("ConfigSvc failed to assign HLT prescales to chains.");
         return HLT::ErrorCode(Action::ABORT_JOB, Reason::USERDEF_1, SteeringInternalReason::BAD_JOB_SETUP);        
@@ -1318,7 +1321,7 @@ HLT::ErrorCode TrigSteer::setEvent() {
       m_lvlCnvTool->setConfigurationKeys(m_configSvc->masterKey(), m_configSvc->hltPrescaleKey());
       
     } else {
-      ATH_MSG_ERROR("EventNumber&LBN not possible because missing event_ID");
+      ATH_MSG_ERROR("EventNumber&LBN not possible because missing eventID");
       return HLT::ErrorCode(Action::ABORT_EVENT, Reason::USERDEF_2, SteeringInternalReason::UNKNOWN);
     }
   }