diff --git a/MuonSpectrometer/MuonTruthAlgs/MuonTruthAlgs/MuonDetailedTrackTruthMaker.h b/MuonSpectrometer/MuonTruthAlgs/MuonTruthAlgs/MuonDetailedTrackTruthMaker.h
index d89160dc40d450f4b1a937d4e8f604ff1ae86742..32866939b3eeff59e6eaa28231fea3c2e8a3592c 100755
--- a/MuonSpectrometer/MuonTruthAlgs/MuonTruthAlgs/MuonDetailedTrackTruthMaker.h
+++ b/MuonSpectrometer/MuonTruthAlgs/MuonTruthAlgs/MuonDetailedTrackTruthMaker.h
@@ -11,9 +11,15 @@
 #include "AthenaBaseComps/AthAlgorithm.h"
 #include "GaudiKernel/ToolHandle.h"
 #include "StoreGate/StoreGateSvc.h"
+#include "StoreGate/WriteHandleKeyArray.h"
+#include "StoreGate/ReadHandleKeyArray.h"
 
 #include "TrkToolInterfaces/IDetailedTrackTruthBuilder.h"
 
+#include "TrkTrack/TrackCollection.h"
+#include "TrkTruthData/PRD_MultiTruthCollection.h"
+#include "TrkTruthData/DetailedTrackTruthCollection.h"
+
 /**
  * This algorithm produces track truth data using Muon PRD truth collections.
  * Calls a DetailedTrackTruthBuilder tool that does the actual job.
@@ -32,13 +38,13 @@ public:
   
 private:
   // PRD truth maps in any order
-  std::vector<std::string> m_PRD_TruthNames;
+  SG::ReadHandleKeyArray<PRD_MultiTruthCollection> m_PRD_TruthNames;
 
   // Track input
-  std::vector<std::string> m_trackCollectionNames;
+  SG::ReadHandleKeyArray<TrackCollection> m_trackCollectionNames;
 
   // DetailedTrackTruthCollection output
-  std::vector<std::string> m_detailedTrackTruthNames;
+  SG::WriteHandleKeyArray<DetailedTrackTruthCollection> m_detailedTrackTruthNames;
 
   // Tool Handle for truth tool
   ToolHandle<Trk::IDetailedTrackTruthBuilder> m_truthTool;
diff --git a/MuonSpectrometer/MuonTruthAlgs/src/MuonDetailedTrackTruthMaker.cxx b/MuonSpectrometer/MuonTruthAlgs/src/MuonDetailedTrackTruthMaker.cxx
index 92b3374f5264a47ffc71f9d3d1cc028f3384a6a8..ad88b6e545abb7220f430305bc8515ccc232cf42 100755
--- a/MuonSpectrometer/MuonTruthAlgs/src/MuonDetailedTrackTruthMaker.cxx
+++ b/MuonSpectrometer/MuonTruthAlgs/src/MuonDetailedTrackTruthMaker.cxx
@@ -6,9 +6,6 @@
 // A. Gaponenko, 2006
 
 #include "MuonTruthAlgs/MuonDetailedTrackTruthMaker.h"
-#include "TrkTruthData/PRD_MultiTruthCollection.h"
-#include "TrkTruthData/DetailedTrackTruthCollection.h"
-#include "TrkTrack/TrackCollection.h"
 #include <iterator>
 
 //================================================================
@@ -21,24 +18,24 @@ MuonDetailedTrackTruthMaker::MuonDetailedTrackTruthMaker(const std::string &name
   // Inputs
   declareProperty("TrackCollectionNames",     m_trackCollectionNames );
   m_trackCollectionNames.reserve(9);
-  m_trackCollectionNames.push_back("MuonSpectrometerTracks");
-  m_trackCollectionNames.push_back("MooreTracks");
-  m_trackCollectionNames.push_back("ConvertedMBoyMuonSpectroOnlyTracks");
-  m_trackCollectionNames.push_back("ConvertedMBoyTracks");
-  m_trackCollectionNames.push_back("MuidExtrapolatedTracks");
-  m_trackCollectionNames.push_back("ExtrapolatedMuonSpectrometerTracks");
-  m_trackCollectionNames.push_back("Combined_Tracks");
-  m_trackCollectionNames.push_back("CombinedFitMuonTracks");
-  m_trackCollectionNames.push_back("ConvertedMuIdCBTracks");
-  m_trackCollectionNames.push_back("ConvertedMuIdExtrTracks");
-  m_trackCollectionNames.push_back("ConvertedStacoTracks");
-  m_trackCollectionNames.push_back("MuGirlRefittedTracks");
+  m_trackCollectionNames.emplace_back("MuonSpectrometerTracks");
+  m_trackCollectionNames.emplace_back("MooreTracks");
+  m_trackCollectionNames.emplace_back("ConvertedMBoyMuonSpectroOnlyTracks");
+  m_trackCollectionNames.emplace_back("ConvertedMBoyTracks");
+  m_trackCollectionNames.emplace_back("MuidExtrapolatedTracks");
+  m_trackCollectionNames.emplace_back("ExtrapolatedMuonSpectrometerTracks");
+  m_trackCollectionNames.emplace_back("Combined_Tracks");
+  m_trackCollectionNames.emplace_back("CombinedFitMuonTracks");
+  m_trackCollectionNames.emplace_back("ConvertedMuIdCBTracks");
+  m_trackCollectionNames.emplace_back("ConvertedMuIdExtrTracks");
+  m_trackCollectionNames.emplace_back("ConvertedStacoTracks");
+  m_trackCollectionNames.emplace_back("MuGirlRefittedTracks");
 
   declareProperty("PRD_TruthNames",          m_PRD_TruthNames);
-  m_PRD_TruthNames.push_back("CSC_TruthMap");
-  m_PRD_TruthNames.push_back("RPC_TruthMap");
-  m_PRD_TruthNames.push_back("TGC_TruthMap");
-  m_PRD_TruthNames.push_back("MDT_TruthMap");
+  m_PRD_TruthNames.emplace_back("CSC_TruthMap");
+  m_PRD_TruthNames.emplace_back("RPC_TruthMap");
+  m_PRD_TruthNames.emplace_back("TGC_TruthMap");
+  m_PRD_TruthNames.emplace_back("MDT_TruthMap");
 
 
   // Output
@@ -60,16 +57,14 @@ StatusCode MuonDetailedTrackTruthMaker::initialize()
   }
 
   m_detailedTrackTruthNames.reserve ( m_trackCollectionNames.size());
-  std::vector<std::string >::const_iterator it = m_trackCollectionNames.begin(), itEnd = m_trackCollectionNames.end();
-  for ( ; it!=itEnd ; ++it)
-    m_detailedTrackTruthNames.push_back(*it+"Truth");
-  
-  msg(MSG::INFO) << " processing: ";
-  std::vector<std::string>::const_iterator ikeyt = m_detailedTrackTruthNames.begin();
-  for(std::vector<std::string>::const_iterator ikey = m_trackCollectionNames.begin(); ikey != m_trackCollectionNames.end(); ikey++,++ikeyt) {
-    msg(MSG::INFO) << "  " << *ikey << "  " << *ikeyt;
+  for(unsigned int i=0;i<m_trackCollectionNames.size();i++){
+    m_detailedTrackTruthNames.emplace_back(m_trackCollectionNames.at(i).key()+"Truth");
+    ATH_MSG_INFO("process "<<m_trackCollectionNames.at(i).key()<<" for detailed truth collection "<<m_detailedTrackTruthNames.at(i).key());
   }
-  msg(MSG::INFO) << endmsg;
+
+  ATH_CHECK(m_trackCollectionNames.initialize());
+  ATH_CHECK(m_PRD_TruthNames.initialize());
+  ATH_CHECK(m_detailedTrackTruthNames.initialize());
   
   //----------------
   return StatusCode::SUCCESS;
@@ -86,49 +81,36 @@ StatusCode MuonDetailedTrackTruthMaker::finalize()
 StatusCode MuonDetailedTrackTruthMaker::execute() {
   ATH_MSG_DEBUG( "MuonDetailedTrackTruthMaker::execute()");
 
-  StatusCode sc;
-
   //----------------------------------------------------------------
   // Retrieve prep raw data truth
   std::vector<const PRD_MultiTruthCollection*> prdCollectionVector;
-  for(std::vector<std::string>::const_iterator ikey = m_PRD_TruthNames.begin(); ikey != m_PRD_TruthNames.end(); ikey++) {
-    prdCollectionVector.push_back(0);
-    sc = evtStore()->retrieve(*prdCollectionVector.rbegin(), *ikey);
-    if (!sc.isSuccess()){
-      ATH_MSG_WARNING(  "PRD_MultiTruthCollection "<<*ikey<<" NOT found");
-    } else {
-      ATH_MSG_DEBUG( "Got PRD_MultiTruthCollection "<<*ikey);
+  for(SG::ReadHandle<PRD_MultiTruthCollection>& col : m_PRD_TruthNames.makeHandles()){
+    if(!col.isValid()){
+      ATH_MSG_WARNING("invalid PRD_MultiTruthCollection "<<col.name());
+      return StatusCode::FAILURE;
     }
+    if(!col.isPresent()) continue;
+    prdCollectionVector.push_back(col.cptr());
   }
 
   //----------------------------------------------------------------
   // Retrieve track collections
-  unsigned int i=0;
-  std::vector<std::string>::const_iterator it = m_trackCollectionNames.begin(), itEnd = m_trackCollectionNames.end();
-  for ( ; it!=itEnd ; ++it, ++i) {
-
-    const TrackCollection *tracks = 0;
-    if (evtStore()->contains<TrackCollection>(*it) && evtStore()->retrieve(tracks, *it).isSuccess()){
-      ATH_MSG_DEBUG( "Got TrackCollection "<<*it );
-    } else {
-      ATH_MSG_VERBOSE( "TrackCollection "<<*it<<" NOT found");
-      continue;
+  int i=0;
+  for(SG::ReadHandle<TrackCollection>& tcol : m_trackCollectionNames.makeHandles()){
+    if(!tcol.isValid()){
+      ATH_MSG_WARNING("invalid TrackCollection "<<tcol.name());
+      return StatusCode::FAILURE;
     }
+    if(!tcol.isPresent()) continue;
 
     //----------------------------------------------------------------
     // Produce and store the output.
 
-    DetailedTrackTruthCollection *dttc = new DetailedTrackTruthCollection(tracks);
-    m_truthTool->buildDetailedTrackTruth(dttc, *tracks, prdCollectionVector);
-
-    sc=evtStore()->record(dttc, m_detailedTrackTruthNames[i], false);
-    if (sc.isFailure()) {
-      ATH_MSG_WARNING( "DetailedTrackTruthCollection '" << m_detailedTrackTruthNames[i] << "' could not be registered in StoreGate !" );
-      return StatusCode::SUCCESS;
-    } else {
-      ATH_MSG_DEBUG("DetailedTrackTruthCollection '" << m_detailedTrackTruthNames[i]
-        << "' is registered in StoreGate, size="<<dttc->size() );
-    }
+    SG::WriteHandle<DetailedTrackTruthCollection> dttc(m_detailedTrackTruthNames.at(i));
+    ATH_CHECK(dttc.record(std::make_unique<DetailedTrackTruthCollection>()));
+    dttc->setTrackCollection(tcol.cptr());
+    m_truthTool->buildDetailedTrackTruth(dttc.ptr(), *(tcol.cptr()), prdCollectionVector);
+    i++;
   }
   return StatusCode::SUCCESS;
 }
diff --git a/Tracking/TrkEvent/TrkTruthData/TrkTruthData/DetailedTrackTruthCollection.h b/Tracking/TrkEvent/TrkTruthData/TrkTruthData/DetailedTrackTruthCollection.h
index 4584e4a2fd3316863dfe4ee5c48dce57bc64ab5e..238eaff92365a94fa4b70886991aa381a8692639 100755
--- a/Tracking/TrkEvent/TrkTruthData/TrkTruthData/DetailedTrackTruthCollection.h
+++ b/Tracking/TrkEvent/TrkTruthData/TrkTruthData/DetailedTrackTruthCollection.h
@@ -23,6 +23,7 @@ class DetailedTrackTruthCollection : public std::multimap<Trk::TrackTruthKey, De
  public:
   DetailedTrackTruthCollection(const DataLink<TrackCollection> tracks) : m_trackCollection(tracks) {}
   DataLink<TrackCollection> trackCollectionLink() const { return m_trackCollection; }
+  void setTrackCollection(const DataLink<TrackCollection> tracks){m_trackCollection=tracks;}
 
   // for POOL
   DetailedTrackTruthCollection() {}