diff --git a/Control/AthenaServices/src/AthenaOutputStream.cxx b/Control/AthenaServices/src/AthenaOutputStream.cxx
index 51d84cba12d00a0263c54a954e14efe2798d5e76..c47282de49101d131a744561293e7e1af678a99b 100644
--- a/Control/AthenaServices/src/AthenaOutputStream.cxx
+++ b/Control/AthenaServices/src/AthenaOutputStream.cxx
@@ -318,6 +318,7 @@ StatusCode AthenaOutputStream::initialize() {
 StatusCode AthenaOutputStream::stop()
 {
    ATH_MSG_DEBUG("AthenaOutputStream " << this->name() << " ::stop()");
+/*
    for (std::vector<ToolHandle<IAthenaOutputTool> >::iterator iter = m_helperTools.begin();
         iter != m_helperTools.end(); iter++) {
       if (!(*iter)->preFinalize().isSuccess()) {
@@ -369,6 +370,7 @@ StatusCode AthenaOutputStream::stop()
       }
       ATH_MSG_INFO("Records written: " << m_events);
    }
+*/
    return StatusCode::SUCCESS;
 }
 
@@ -377,6 +379,60 @@ void AthenaOutputStream::handle(const Incident& inc) {
    if (inc.type() == "MetaDataStop") {
       // Moved preFinalize of helper tools to stop - want to optimize the
       // output file in finalize RDS 12/2009
+      for (std::vector<ToolHandle<IAthenaOutputTool> >::iterator iter = m_helperTools.begin();
+           iter != m_helperTools.end(); iter++) {
+         if (!(*iter)->preFinalize().isSuccess()) {
+            ATH_MSG_ERROR("Cannot finalize helper tool");
+         }
+      }
+      // Make sure the metadata tools finalize their output
+      ServiceHandle<MetaDataSvc> mdsvc("MetaDataSvc", name());
+      if (mdsvc.retrieve().isFailure()) {
+         ATH_MSG_ERROR("Could not retrieve MetaDataSvc for stop actions");
+      }
+      else {
+         if (mdsvc->prepareOutput().isFailure()) {
+            ATH_MSG_ERROR("Failed on MetaDataSvc prepareOutput");
+         }
+      }
+      // Always force a final commit in stop - mainly applies to AthenaPool
+      if (m_writeOnFinalize) {
+         if (write().isFailure()) {  // true mean write AND commit
+            ATH_MSG_ERROR("Cannot write on finalize");
+         }
+         ATH_MSG_INFO("Records written: " << m_events);
+      }
+
+      if (!m_metadataItemList.value().empty()) {
+         m_currentStore = &m_metadataStore;
+         StatusCode status = m_streamer->connectServices(m_metadataStore.type(), m_persName, false);
+         if (status.isFailure()) {
+            throw GaudiException("Unable to connect metadata services", name(), StatusCode::FAILURE);
+         }
+         m_checkNumberOfWrites = false;
+         m_outputAttributes = "[OutputCollection=MetaDataHdr][PoolContainerPrefix=MetaData][AttributeListKey=][DataHeaderSatellites=]";
+         m_p2BWritten->clear();
+         IProperty *pAsIProp(nullptr);
+         if ((m_p2BWritten.retrieve()).isFailure() ||
+            nullptr == (pAsIProp = dynamic_cast<IProperty*>(&*m_p2BWritten)) ||
+            (pAsIProp->setProperty("ItemList", m_metadataItemList.toString())).isFailure()) {
+            throw GaudiException("Folder property [metadataItemList] not found", name(), StatusCode::FAILURE);
+         }
+         if (write().isFailure()) {  // true mean write AND commit
+            ATH_MSG_ERROR("Cannot write metadata");
+         }
+         m_outputAttributes.clear();
+         m_currentStore = &m_dataStore;
+         status = m_streamer->connectServices(m_dataStore.type(), m_persName, m_extendProvenanceRecord);
+         if (status.isFailure()) {
+            throw GaudiException("Unable to re-connect services", name(), StatusCode::FAILURE);
+         }
+         m_p2BWritten->clear();
+         if ((pAsIProp->setProperty(m_itemList)).isFailure()) {
+            throw GaudiException("Folder property [itemList] not found", name(), StatusCode::FAILURE);
+         }
+         ATH_MSG_INFO("Records written: " << m_events);
+      }
    } else if (inc.type() == "UpdateOutputFile") {
      const FileIncident* fileInc  = dynamic_cast<const FileIncident*>(&inc);
      if(fileInc!=nullptr) {
@@ -862,6 +918,8 @@ StatusCode AthenaOutputStream::io_reinit() {
    }
    return StatusCode::SUCCESS;
 }
+
+
 StatusCode AthenaOutputStream::io_finalize() {
    ATH_MSG_INFO("I/O finalization...");
    for (std::vector<ToolHandle<IAthenaOutputTool> >::iterator iter = m_helperTools.begin();
diff --git a/Control/AthenaServices/src/MetaDataSvc.cxx b/Control/AthenaServices/src/MetaDataSvc.cxx
index d9bd7e42f1a1aa689f679872dabf70a65865fc31..10f6f88bea6d570a6382ad7d759160ff5d49fec1 100644
--- a/Control/AthenaServices/src/MetaDataSvc.cxx
+++ b/Control/AthenaServices/src/MetaDataSvc.cxx
@@ -185,6 +185,7 @@ StatusCode MetaDataSvc::finalize() {
 }
 //__________________________________________________________________________
 StatusCode MetaDataSvc::stop() {
+   ATH_MSG_INFO("MetaDataSvc::stop()");
    ServiceHandle<IJobOptionsSvc> joSvc("JobOptionsSvc", name());
    if (!joSvc.retrieve().isSuccess()) {
       ATH_MSG_WARNING("Cannot get JobOptionsSvc.");
@@ -205,6 +206,10 @@ StatusCode MetaDataSvc::stop() {
       }
    }
 
+   // Set to be listener for end of event
+   Incident metaDataStopIncident(name(), "MetaDataStop");
+   m_incSvc->fireIncident(metaDataStopIncident);
+   
    // finalizing tools via metaDataStop
    ATH_CHECK(this->prepareOutput());
        
@@ -318,6 +323,7 @@ StatusCode MetaDataSvc::retireMetadataSource(const Incident& inc)
 
 StatusCode MetaDataSvc::prepareOutput()
 {
+   ATH_MSG_DEBUG("prepareOutput");
    StatusCode rc(StatusCode::SUCCESS);
    for (auto it = m_metaDataTools.begin(); it != m_metaDataTools.end(); ++it) {
       ATH_MSG_DEBUG(" calling metaDataStop for " << (*it)->name());
@@ -397,6 +403,9 @@ StatusCode MetaDataSvc::transitionMetaDataFile(bool ignoreInputFile) {
       return(StatusCode::FAILURE);
    }
 
+   Incident metaDataStopIncident(name(), "MetaDataStop");
+   m_incSvc->fireIncident(metaDataStopIncident);
+
    // Set to be listener for end of event
    ATH_CHECK(this->prepareOutput());