diff --git a/MuonSpectrometer/MuonReconstruction/MuonTrackMakers/MuonTrackMakerTools/MuonTrackSteeringTools/src/MooTrackFitter.cxx b/MuonSpectrometer/MuonReconstruction/MuonTrackMakers/MuonTrackMakerTools/MuonTrackSteeringTools/src/MooTrackFitter.cxx
index 494bdac4fbc5a33f0ff865709784863a153b2ecc..51e5b6e7142bde9bc3d68ddd7bcc1f9fa8049952 100644
--- a/MuonSpectrometer/MuonReconstruction/MuonTrackMakers/MuonTrackMakerTools/MuonTrackSteeringTools/src/MooTrackFitter.cxx
+++ b/MuonSpectrometer/MuonReconstruction/MuonTrackMakers/MuonTrackMakerTools/MuonTrackSteeringTools/src/MooTrackFitter.cxx
@@ -204,6 +204,8 @@ namespace Muon {
   std::unique_ptr<Trk::Track> MooTrackFitter::fit( const MuPatCandidateBase& entry1, const MuPatCandidateBase& entry2, const PrepVec* externalPhiHits ) const {
 
     GarbageCan localGarbage;
+    MuPatHitTool::HitGarbage hitsToBeDeleted;
+    MuPatHitTool::ParGarbage parsToBeDeleted;
 
     ++m_nfits;
 
@@ -211,7 +213,7 @@ namespace Muon {
     FitterData fitterData;
 
     // extract hits and geometrical information
-    if( !extractData(entry1,entry2,fitterData, localGarbage) ) {
+    if( !extractData(entry1,entry2,fitterData, localGarbage, parsToBeDeleted ) ) {
       ATH_MSG_DEBUG(" Failed to extract data for initial fit" );
       localGarbage.cleanUp();
       return std::unique_ptr<Trk::Track>();
@@ -238,7 +240,8 @@ namespace Muon {
     ++m_nfailedParsInital;
 
     // clean phi hits and reevaluate hits. Do not run for cosmics
-    bool hasCleaned = m_cleanPhiHits ? cleanPhiHits( startPars->momentum().mag(), fitterData, externalPhiHits, localGarbage ) : true;
+    bool hasCleaned = m_cleanPhiHits ? cleanPhiHits( startPars->momentum().mag(), fitterData, externalPhiHits,
+                                                     localGarbage, hitsToBeDeleted, parsToBeDeleted ) : true;
     if( hasCleaned ){
       ATH_MSG_DEBUG(" Cleaned phi hits, re-extracting hits" );
       bool usePrecise = m_usePreciseHits ? true : (fitterData.firstHasMomentum || fitterData.secondHasMomentum);
@@ -361,12 +364,12 @@ namespace Muon {
     if( track ) ++m_nsuccess;
     
     localGarbage.cleanUp();
-    m_hitHandler->cleanUp();
     if( msgLvl(MSG::DEBUG) && track ) msg(MSG::DEBUG) << MSG::DEBUG << " Track found " << endmsg;
     return track;
   }
 
-  bool MooTrackFitter::extractData( const MuPatCandidateBase& entry1, const MuPatCandidateBase& entry2 , MooTrackFitter::FitterData& fitterData, GarbageCan& garbage ) const {
+  bool MooTrackFitter::extractData( const MuPatCandidateBase& entry1, const MuPatCandidateBase& entry2 , MooTrackFitter::FitterData& fitterData, GarbageCan& garbage,
+                                    MuPatHitTool::ParGarbage& parsToBeDeleted) const {
     // sanity checks on the entries
     if( corruptEntry( entry1 ) ) {
       ATH_MSG_DEBUG(" corrupt first entry,  cannot perform fit: eta hits " << entry1.etaHits().size() );
@@ -410,7 +413,7 @@ namespace Muon {
     copyHitList(entry1.hitList(),fitterData.copyHitList1,garbage);
     copyHitList(entry2.hitList(),fitterData.copyHitList2,garbage);
 
-    if( !m_hitHandler->merge(fitterData.copyHitList1,fitterData.copyHitList2,hitList) ) return false;
+    if( !m_hitHandler->merge(fitterData.copyHitList1,fitterData.copyHitList2,hitList, parsToBeDeleted) ) return false;
 
     bool usePrecise = m_usePreciseHits ? true : (fitterData.firstHasMomentum || fitterData.secondHasMomentum);
     if( msgLvl(MSG::DEBUG) ){
@@ -1929,7 +1932,9 @@ namespace Muon {
   } 
 
   bool MooTrackFitter::cleanPhiHits( double momentum, MooTrackFitter::FitterData& fitterData, 
-				     const std::vector<const Trk::PrepRawData*>* patternPhiHits, GarbageCan& garbage ) const {
+				     const std::vector<const Trk::PrepRawData*>* patternPhiHits, GarbageCan& garbage,
+                                     MuPatHitTool::HitGarbage& hitsToBeDeleted,
+                                     MuPatHitTool::ParGarbage& parsToBeDeleted) const {
 
     ATH_MSG_VERBOSE(" cleaning phi hits " );
 
@@ -2096,8 +2101,8 @@ namespace Muon {
     if( !measurementsToBeAdded.empty() ){
       if( msgLvl(MSG::VERBOSE) ) msg(MSG::VERBOSE) << " adding measurements " << std::endl;
       MuPatHitList newHitList;
-      m_hitHandler->create(fitterData.firstEntry->entryPars(),measurementsToBeAdded,newHitList);
-      m_hitHandler->merge(newHitList,fitterData.hitList);
+      m_hitHandler->create(fitterData.firstEntry->entryPars(),measurementsToBeAdded,newHitList, hitsToBeDeleted, parsToBeDeleted);
+      m_hitHandler->merge(newHitList,fitterData.hitList, parsToBeDeleted);
     }
 
     ATH_MSG_VERBOSE(" done cleaning " );
diff --git a/MuonSpectrometer/MuonReconstruction/MuonTrackMakers/MuonTrackMakerTools/MuonTrackSteeringTools/src/MooTrackFitter.h b/MuonSpectrometer/MuonReconstruction/MuonTrackMakers/MuonTrackMakerTools/MuonTrackSteeringTools/src/MooTrackFitter.h
index 70edaf1e8d5285ba9b91d08e0e79c3156b856261..28b9b5cff253950dcc0cd3f2c70e2fba01886c5b 100644
--- a/MuonSpectrometer/MuonReconstruction/MuonTrackMakers/MuonTrackMakerTools/MuonTrackSteeringTools/src/MooTrackFitter.h
+++ b/MuonSpectrometer/MuonReconstruction/MuonTrackMakers/MuonTrackMakerTools/MuonTrackSteeringTools/src/MooTrackFitter.h
@@ -219,7 +219,8 @@ namespace Muon {
 
     
     /** extract all information needed for the fit from the track */
-    bool extractData( const MuPatCandidateBase& entry1, const MuPatCandidateBase& entry2, FitterData& fitterData, GarbageCan& garbage ) const;
+    bool extractData( const MuPatCandidateBase& entry1, const MuPatCandidateBase& entry2, FitterData& fitterData, GarbageCan& garbage,
+                      MuPatHitTool::ParGarbage& parsToBeDeleted) const;
 
     /** extract all information from the HitList of a FitterData object */
     bool extractData( FitterData& fitterData, bool usePreciseHits ) const;
@@ -262,7 +263,9 @@ namespace Muon {
     double thetaSeeding( const MuPatCandidateBase& entry, MeasVec& etaHits ) const;
 
     /** clean phi hits, returns true if anything happened during the cleaning */
-    bool cleanPhiHits( double momentum, FitterData& phiHits, const PrepVec* patternPhiHits, GarbageCan& garbage ) const;
+    bool cleanPhiHits( double momentum, FitterData& phiHits, const PrepVec* patternPhiHits, GarbageCan& garbage,
+                       MuPatHitTool::HitGarbage& hitsToBeDeleted,
+                       MuPatHitTool::ParGarbage& parsToBeDeleted) const;
 
     /** check whether mometum of start parameter is ok */
     bool validMomentum( const Trk::TrackParameters& pars ) const;
diff --git a/MuonSpectrometer/MuonReconstruction/MuonTrackMakers/MuonTrackMakerTools/MuonTrackSteeringTools/src/MuPatCandidateTool.cxx b/MuonSpectrometer/MuonReconstruction/MuonTrackMakers/MuonTrackMakerTools/MuonTrackSteeringTools/src/MuPatCandidateTool.cxx
index b3364b7abc584959de22c58bb0a61d4d1be7c6f1..086c1b5be455e0765c219ecc14468ad53db5893b 100644
--- a/MuonSpectrometer/MuonReconstruction/MuonTrackMakers/MuonTrackMakerTools/MuonTrackSteeringTools/src/MuPatCandidateTool.cxx
+++ b/MuonSpectrometer/MuonReconstruction/MuonTrackMakers/MuonTrackMakerTools/MuonTrackSteeringTools/src/MuPatCandidateTool.cxx
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 */
 
 #include "MuPatCandidateTool.h"
@@ -63,6 +63,8 @@ namespace Muon {
 
   MuPatSegment* MuPatCandidateTool::createSegInfo( const MuonSegment& segment ) const
   {
+    CacheEntry& ent = getCache();
+
     Identifier chid = m_edmHelperSvc->chamberId(segment);
     if( m_idHelperSvc->isTrigger(chid) ){
       ATH_MSG_WARNING("Trigger hit only segments not supported " << m_idHelperSvc->toStringChamber(chid) );
@@ -100,7 +102,8 @@ namespace Muon {
 
     updateHits(*info,info->segment->containedMeasurements(),m_doMdtRecreation,m_doCscRecreation, true );
     MuPatHitList& hitList = info->hitList();
-    m_hitHandler->create( segment, hitList );
+    m_hitHandler->create( segment, hitList,
+                          ent.m_hitsToBeDeleted, ent.m_parsToBeDeleted );
 
     return info;
   }
@@ -156,13 +159,7 @@ namespace Muon {
   void MuPatCandidateTool::updateHits( MuPatCandidateBase& entry, const MuPatCandidateTool::MeasVec& measurements, 
 				     bool recreateMDT, bool recreateCSC, bool createComp ) const {
 
-    std::lock_guard<std::mutex> lock{m_mutex};    
-    const EventContext& ctx = Gaudi::Hive::currentContext();
-    CacheEntry* ent{m_cache.get(ctx)};
-    if (ent->m_evt != ctx.evt()) {
-      ent->m_evt = ctx.evt();
-      ent->cleanUp();
-    }
+    CacheEntry& ent = getCache();
 
     MeasVec etaHits;
     MeasVec phiHits;
@@ -239,7 +236,7 @@ namespace Muon {
 	    }
 	    ATH_MSG_DEBUG(" recreating MdtDriftCircleOnTrack " );
 	    const MdtDriftCircleOnTrack* newMdt = m_mdtRotCreator->createRIO_OnTrack(*mdt->prepRawData(),mdt->globalPosition());
-	    ent->m_measurementsToBeDeleted.push_back(newMdt);
+	    ent.m_measurementsToBeDeleted.push_back(newMdt);
 	    meas = newMdt;
 	  }
 	}
@@ -282,7 +279,7 @@ namespace Muon {
 	    }
 	    ATH_MSG_DEBUG(" recreating CscClusterOnTrack " );
 	    const MuonClusterOnTrack* newCsc = m_cscRotCreator->createRIO_OnTrack(*csc->prepRawData(),csc->globalPosition());
-	    ent->m_measurementsToBeDeleted.push_back(newCsc);
+	    ent.m_measurementsToBeDeleted.push_back(newCsc);
 	    meas = newCsc;
 
 	  }
@@ -313,8 +310,8 @@ namespace Muon {
     }
     
     if( createComp ){
-      if( m_createCompetingROTsEta && !triggerHitsEta.empty() ) createAndAddCompetingROTs(triggerHitsEta, etaHits, allHits, ent->m_measurementsToBeDeleted);
-      if( m_createCompetingROTsPhi && !triggerHitsPhi.empty() ) createAndAddCompetingROTs(triggerHitsPhi, phiHits, allHits, ent->m_measurementsToBeDeleted);
+      if( m_createCompetingROTsEta && !triggerHitsEta.empty() ) createAndAddCompetingROTs(triggerHitsEta, etaHits, allHits, ent.m_measurementsToBeDeleted);
+      if( m_createCompetingROTsPhi && !triggerHitsPhi.empty() ) createAndAddCompetingROTs(triggerHitsPhi, phiHits, allHits, ent.m_measurementsToBeDeleted);
     }
 
     entry.nmdtHitsMl1 = nmdtHitsMl1;
@@ -435,6 +432,8 @@ namespace Muon {
 
   bool MuPatCandidateTool::recalculateCandidateSegmentContent( MuPatTrack& candidate ) const {
 
+    CacheEntry& ent = getCache();
+
     // loop over track and get the chambers on the track
     const DataVector<const Trk::TrackStateOnSurface>* states = candidate.track().trackStateOnSurfaces();
     if( !states ) return false;
@@ -485,7 +484,8 @@ namespace Muon {
 
     // recalculate hit list
     candidate.hitList().clear();
-    m_hitHandler->create( candidate.track(),candidate.hitList() ); 	  
+    m_hitHandler->create( candidate.track(),candidate.hitList(),
+                          ent.m_hitsToBeDeleted );
     // update the hit summary
     updateHits(candidate,candidate.track().measurementsOnTrack()->stdcont());
 
@@ -528,14 +528,8 @@ namespace Muon {
   
   void MuPatCandidateTool::cleanUp() const {
     // delete segments and clear vector
-    std::lock_guard<std::mutex> lock{m_mutex};
-    const EventContext& ctx = Gaudi::Hive::currentContext();
-    CacheEntry* ent{m_cache.get(ctx)};
-    if (ent->m_evt != ctx.evt()) {
-      ent->m_evt = ctx.evt();
-    }
-    m_hitHandler->cleanUp();
-    ent->cleanUp();
+    CacheEntry& ent = getCache();
+    ent.cleanUp();
   }
 
   std::string MuPatCandidateTool::print( const MuPatSegment& segment, int level ) const {
@@ -595,5 +589,16 @@ namespace Muon {
     return "Unknown candidate type";
   }
 
+  MuPatCandidateTool::CacheEntry& MuPatCandidateTool::getCache() const
+  {
+    const EventContext& ctx = Gaudi::Hive::currentContext();
+    CacheEntry* ent{m_cache.get(ctx)};
+    if (ent->m_evt != ctx.evt()) {
+      ent->m_evt = ctx.evt();
+      ent->cleanUp();
+    }
+    return *ent;
+  }
+
 } // namespace Muon
 
diff --git a/MuonSpectrometer/MuonReconstruction/MuonTrackMakers/MuonTrackMakerTools/MuonTrackSteeringTools/src/MuPatCandidateTool.h b/MuonSpectrometer/MuonReconstruction/MuonTrackMakers/MuonTrackMakerTools/MuonTrackSteeringTools/src/MuPatCandidateTool.h
index d4943d12c82b8d46b7fed6a05bb36bb60b735beb..9408b03df006abd7444dad72da8a6ba1340789d7 100644
--- a/MuonSpectrometer/MuonReconstruction/MuonTrackMakers/MuonTrackMakerTools/MuonTrackSteeringTools/src/MuPatCandidateTool.h
+++ b/MuonSpectrometer/MuonReconstruction/MuonTrackMakers/MuonTrackMakerTools/MuonTrackSteeringTools/src/MuPatCandidateTool.h
@@ -180,11 +180,14 @@ namespace Muon {
     Gaudi::Property<bool>  m_doCscRecreation {this,"DoCscRecreation" , true };
 
     // Mutex to protect the contents.
-    mutable std::mutex m_mutex{};
     struct CacheEntry {
       EventContext::ContextEvt_t m_evt{EventContext::INVALID_CONTEXT_EVT};
       MeasVec m_measurementsToBeDeleted{}; //<! vector to store measurements owned by the track maker
+      MuPatHitTool::HitGarbage m_hitsToBeDeleted;
+      MuPatHitTool::ParGarbage m_parsToBeDeleted;
       void cleanUp() { // Delete measurements to be deleted now
+        m_hitsToBeDeleted.clear();
+        m_parsToBeDeleted.clear();
         std::for_each( m_measurementsToBeDeleted.begin(), m_measurementsToBeDeleted.end(), MuonDeleteObject<const Trk::MeasurementBase>() );
         m_measurementsToBeDeleted.clear();
       };      
@@ -193,7 +196,7 @@ namespace Muon {
       }
     };
     mutable SG::SlotSpecificObj<CacheEntry> m_cache ATLAS_THREAD_SAFE; // Guarded by m_mutex
-
+    CacheEntry& getCache() const;
   };
 
 }
diff --git a/MuonSpectrometer/MuonReconstruction/MuonTrackMakers/MuonTrackMakerTools/MuonTrackSteeringTools/src/MuPatHit.cxx b/MuonSpectrometer/MuonReconstruction/MuonTrackMakers/MuonTrackMakerTools/MuonTrackSteeringTools/src/MuPatHit.cxx
index fa46e1a6402d01fb75f1e070dc650c34dc7e1ba9..b2c20352cb4dd05f2e212057c42da3b9eb2fa355 100644
--- a/MuonSpectrometer/MuonReconstruction/MuonTrackMakers/MuonTrackMakerTools/MuonTrackSteeringTools/src/MuPatHit.cxx
+++ b/MuonSpectrometer/MuonReconstruction/MuonTrackMakers/MuonTrackMakerTools/MuonTrackSteeringTools/src/MuPatHit.cxx
@@ -13,9 +13,9 @@ namespace Muon {
 
 
   // Static members
-  unsigned int MuPatHit::s_maxNumberOfInstantiations = 0;
-  unsigned int MuPatHit::s_numberOfInstantiations = 0;
-  unsigned int MuPatHit::s_numberOfCopies = 0;
+  std::atomic<unsigned int> MuPatHit::s_maxNumberOfInstantiations;
+  std::atomic<unsigned int> MuPatHit::s_numberOfInstantiations = 0;
+  std::atomic<unsigned int> MuPatHit::s_numberOfCopies = 0;
 
   // Static functions
 
@@ -44,7 +44,6 @@ namespace Muon {
 
   MuPatHit& MuPatHit::operator=( const MuPatHit& hit ) {
     if( &hit != this ){
-      cleanUp();
       copy(hit);
 #ifdef MCTB_OBJECT_COUNTERS
       ++s_numberOfCopies;
@@ -55,7 +54,6 @@ namespace Muon {
 
   MuPatHit::~MuPatHit() {
 //     std::cout << " delete MuPatHit  " << this << std::endl;
-    cleanUp();
 #ifdef MCTB_OBJECT_COUNTERS
     removeInstance();
 #endif
@@ -64,14 +62,10 @@ namespace Muon {
   void MuPatHit::copy( const MuPatHit& hit ){
     m_pars = hit.m_pars;
     m_precisionMeas = hit.m_precisionMeas;
-    m_broadMeas = hit.m_broadMeas->clone();
+    m_broadMeas.reset (hit.m_broadMeas->clone());
     m_info = hit.m_info;
   }
 
-  void MuPatHit::cleanUp(){
-    delete m_broadMeas;
-  }
-
   void MuPatHit::updateParameters( const Trk::TrackParameters* pars ) {
 //     if( pars ) std::cout << " update pars " << this << " theta " << pars->momentum().theta() << " phi " << pars->momentum().phi() << std::endl;
     m_pars = pars;
diff --git a/MuonSpectrometer/MuonReconstruction/MuonTrackMakers/MuonTrackMakerTools/MuonTrackSteeringTools/src/MuPatHit.h b/MuonSpectrometer/MuonReconstruction/MuonTrackMakers/MuonTrackMakerTools/MuonTrackSteeringTools/src/MuPatHit.h
index 88334379a838a20d4b71edb6180565a895e47638..72b412af5fc7386f5eb2bf585ade62e6708773b9 100644
--- a/MuonSpectrometer/MuonReconstruction/MuonTrackMakers/MuonTrackMakerTools/MuonTrackSteeringTools/src/MuPatHit.h
+++ b/MuonSpectrometer/MuonReconstruction/MuonTrackMakers/MuonTrackMakerTools/MuonTrackSteeringTools/src/MuPatHit.h
@@ -7,6 +7,7 @@
 
 #include "Identifier/Identifier.h"
 #include "TrkParameters/TrackParameters.h"
+#include "CxxUtils/atomic_fetch_minmax.h"
 
 #include <list>
 #include <mutex>
@@ -82,18 +83,12 @@ namespace Muon {
     /** @brief update the track parameters and residual of a MuPatHit */
     void updateParameters( const Trk::TrackParameters* pars );
 
-    /** @brief reset the maximum number of objects counter */
-    static void resetMaxNumberOfInstantiations();
-
     /** @brief maximum number of objects of this type in memory */
     static unsigned int maxNumberOfInstantiations();
 
     /** current number of objects of this type in memory */
     static unsigned int numberOfInstantiations();
 
-    /** @brief reset the copy constructor counter */
-    static void resetNumberOfCopies();
-
     /** @brief number of times the copy constructor was called since last reset */
     static unsigned int numberOfCopies();
 
@@ -110,21 +105,15 @@ namespace Muon {
     //
     // private static data members
     //
-    static unsigned int s_numberOfInstantiations ATLAS_THREAD_SAFE;    //<! current number of objects of this type in memory
-    static unsigned int s_maxNumberOfInstantiations ATLAS_THREAD_SAFE; //<! maximum number of objects of this type in memory
-    static unsigned int s_numberOfCopies ATLAS_THREAD_SAFE;            //<! number of times the copy constructor was called since last reset
-
-    static std::mutex s_mutex; //<! to remove race condition
+    static std::atomic<unsigned int> s_numberOfInstantiations;    //<! current number of objects of this type in memory
+    static std::atomic<unsigned int> s_maxNumberOfInstantiations; //<! maximum number of objects of this type in memory
+    static std::atomic<unsigned int> s_numberOfCopies;            //<! number of times the copy constructor was called since last reset
 
     //
     // private member functions
     //
     /** no default constructor */
-    MuPatHit() : m_pars(0),m_precisionMeas(0),m_broadMeas(0) { }
-
-    /** @brief clean memory */
-    void cleanUp();
-
+    MuPatHit() = delete;
 
     /** @brief copy hit */
     void copy( const MuPatHit& hit );
@@ -132,7 +121,7 @@ namespace Muon {
     // private member data
     const Trk::TrackParameters* m_pars;
     const Trk::MeasurementBase* m_precisionMeas;
-    const Trk::MeasurementBase* m_broadMeas;
+    std::unique_ptr<const Trk::MeasurementBase> m_broadMeas;
     Info m_info;
 
   }; // class MuPatHit
@@ -151,48 +140,25 @@ namespace Muon {
   // static inline functions implementations
   //
   inline unsigned int MuPatHit::numberOfInstantiations() {
-    const std::lock_guard<std::mutex> lock(s_mutex);
-
     return s_numberOfInstantiations;
   }
 
   inline unsigned int MuPatHit::maxNumberOfInstantiations() {
-    const std::lock_guard<std::mutex> lock(s_mutex);
-
     return s_maxNumberOfInstantiations;
   }
 
   inline unsigned int MuPatHit::numberOfCopies() {
-    const std::lock_guard<std::mutex> lock(s_mutex);
-
     return s_numberOfCopies;
   }
 
   inline void MuPatHit::addInstance() {
-    const std::lock_guard<std::mutex> lock(s_mutex);
-
     ++s_numberOfInstantiations;
-    if ( s_numberOfInstantiations > s_maxNumberOfInstantiations ) {
-      s_maxNumberOfInstantiations = s_numberOfInstantiations;
-    }
+    CxxUtils::atomic_fetch_max (&s_maxNumberOfInstantiations,
+                                s_numberOfInstantiations.load());
   }
 
   inline void MuPatHit::removeInstance() {
-    const std::lock_guard<std::mutex> lock(s_mutex);
-
-    if ( s_numberOfInstantiations > 0 ) --s_numberOfInstantiations;
-  }
-
-  inline  void MuPatHit::resetMaxNumberOfInstantiations() {
-    const std::lock_guard<std::mutex> lock(s_mutex);
-
-    s_maxNumberOfInstantiations = 0;
-  }
-
-  inline void MuPatHit::resetNumberOfCopies() {
-    const std::lock_guard<std::mutex> lock(s_mutex);
-
-    s_numberOfCopies = 0;
+    --s_numberOfInstantiations;
   }
 
   //
diff --git a/MuonSpectrometer/MuonReconstruction/MuonTrackMakers/MuonTrackMakerTools/MuonTrackSteeringTools/src/MuPatHitTool.cxx b/MuonSpectrometer/MuonReconstruction/MuonTrackMakers/MuonTrackMakerTools/MuonTrackSteeringTools/src/MuPatHitTool.cxx
index 5e9e715ad98748e22c77aef6b24930b57b6957a5..1d6169030993e211695740f424506b53858237bd 100644
--- a/MuonSpectrometer/MuonReconstruction/MuonTrackMakers/MuonTrackMakerTools/MuonTrackSteeringTools/src/MuPatHitTool.cxx
+++ b/MuonSpectrometer/MuonReconstruction/MuonTrackMakers/MuonTrackMakerTools/MuonTrackSteeringTools/src/MuPatHitTool.cxx
@@ -55,10 +55,6 @@ MuPatHitTool::initialize()
     ATH_CHECK(m_pullCalculator.retrieve());
     ATH_CHECK(m_propagator.retrieve());
 
-    // reserve space to store hits
-    m_hitsToBeDeleted.reserve(1000);
-    m_parsToBeDeleted.reserve(1000);
-
     return StatusCode::SUCCESS;
 }
 
@@ -69,28 +65,6 @@ MuPatHitTool::finalize()
     return StatusCode::SUCCESS;
 }
 
-void
-MuPatHitTool::cleanUp() const
-{
-    {
-        const std::lock_guard<std::mutex> lock(m_hitsMutex);
-
-	for (auto ptr : m_hitsToBeDeleted) {
-	  delete ptr;
-	}
-        m_hitsToBeDeleted.clear();
-    }
-
-    {
-        const std::lock_guard<std::mutex> lock(m_parsMutex);
-
-	for (auto ptr : m_parsToBeDeleted) {
-	  delete ptr;
-	}
-        m_parsToBeDeleted.clear();
-    }
-}
-
 bool
 MuPatHitTool::insert(MuPatHit* /*hit*/, MuPatHitList& /*hitList*/) const
 {
@@ -98,7 +72,9 @@ MuPatHitTool::insert(MuPatHit* /*hit*/, MuPatHitList& /*hitList*/) const
 }
 
 bool
-MuPatHitTool::create(const MuonSegment& seg, MuPatHitList& hitList) const
+MuPatHitTool::create(const MuonSegment& seg, MuPatHitList& hitList,
+                     HitGarbage& hitsToBeDeleted,
+                     ParGarbage& parsToBeDeleted) const
 {
     ATH_MSG_DEBUG(" creating hit list from segment " << std::endl << m_printer->print(seg));
 
@@ -111,7 +87,8 @@ MuPatHitTool::create(const MuonSegment& seg, MuPatHitList& hitList) const
         return false;
     }
 
-    bool result = create(*pars, seg.containedMeasurements(), hitList);
+    bool result = create(*pars, seg.containedMeasurements(), hitList,
+                         hitsToBeDeleted, parsToBeDeleted);
 
     // clean up pars
     delete pars;
@@ -121,7 +98,9 @@ MuPatHitTool::create(const MuonSegment& seg, MuPatHitList& hitList) const
 
 bool
 MuPatHitTool::create(const Trk::TrackParameters& pars, const std::vector<const Trk::MeasurementBase*>& measVec,
-                     MuPatHitList& hitList) const
+                     MuPatHitList& hitList,
+                     HitGarbage& hitsToBeDeleted,
+                     ParGarbage& parsToBeDeleted) const
 {
     // store position of the current hit to speed up insertion
     MuPatHitIt currentHitIt = hitList.begin();
@@ -171,25 +150,22 @@ MuPatHitTool::create(const Trk::TrackParameters& pars, const std::vector<const T
         }
 
         if (exPars) {
-            const std::lock_guard<std::mutex> lock(m_parsMutex);
-            m_parsToBeDeleted.push_back(exPars);
+            parsToBeDeleted.emplace_back (exPars);
         }
 
         // create hit and insert it into list
-        MuPatHit* hit = new MuPatHit(exPars, *sit, broadMeas, hitInfo);
-        {
-            const std::lock_guard<std::mutex> lock(m_hitsMutex);
-            m_hitsToBeDeleted.push_back(hit);
-        }
+        auto hit = std::make_unique<MuPatHit>(exPars, *sit, broadMeas, hitInfo);
         ATH_MSG_VERBOSE(" inserting hit " << m_idHelperSvc->toString(id) << " " << m_printer->print(*exPars));
-        currentHitIt = insert(hitList, currentHitIt, hit);
+        currentHitIt = insert(hitList, currentHitIt, hit.get());
+        hitsToBeDeleted.push_back (std::move (hit));
     }
 
     return true;
 }
 
 bool
-MuPatHitTool::create(const Trk::Track& track, MuPatHitList& hitList) const
+MuPatHitTool::create(const Trk::Track& track, MuPatHitList& hitList,
+                     HitGarbage& hitsToBeDeleted) const
 {
     // store position of the current hit to speed up insertion
     MuPatHitIt currentHitIt = hitList.begin();
@@ -238,34 +214,33 @@ MuPatHitTool::create(const Trk::Track& track, MuPatHitList& hitList) const
 
 
         // create hit and insert it into list
-        MuPatHit* hit = new MuPatHit(pars, meas, broadMeas, hitInfo);
-        {
-            const std::lock_guard<std::mutex> lock(m_hitsMutex);
-            m_hitsToBeDeleted.push_back(hit);
-        }
+        auto hit = std::make_unique<MuPatHit>(pars, meas, broadMeas, hitInfo);
         if (msgLvl(MSG::VERBOSE)) {
             msg(MSG::VERBOSE) << " inserting hit " << m_printer->print(*meas);
             if (hitInfo.status == MuPatHit::Outlier) msg(MSG::VERBOSE) << " Outlier";
             msg(MSG::VERBOSE) << endmsg;
         }
 
-        currentHitIt = insert(hitList, currentHitIt, hit);
+        currentHitIt = insert(hitList, currentHitIt, hit.get());
+        hitsToBeDeleted.push_back (std::move (hit));
     }
 
     return true;
 }
 
 bool
-MuPatHitTool::merge(const MuPatHitList& hitList1, const MuPatHitList& hitList2, MuPatHitList& outList) const
+MuPatHitTool::merge(const MuPatHitList& hitList1, const MuPatHitList& hitList2, MuPatHitList& outList,
+                    ParGarbage& parsToBeDeleted) const
 {
     // copy first list into outList
     outList = hitList1;
 
-    return merge(hitList2, outList);
+    return merge(hitList2, outList, parsToBeDeleted);
 }
 
 bool
-MuPatHitTool::merge(const MuPatHitList& hitList1, MuPatHitList& hitList2) const
+MuPatHitTool::merge(const MuPatHitList& hitList1, MuPatHitList& hitList2,
+                    ParGarbage& parsToBeDeleted) const
 {
     // The hits in the first list are most likely expressed with respect to a different set of track parameters
     // as the ones in the second list. They cannot be merged. To allow merging a new set of track parameters is
@@ -347,11 +322,8 @@ MuPatHitTool::merge(const MuPatHitList& hitList1, MuPatHitList& hitList2) const
                         }
                     }
 
-                    {
-                        const std::lock_guard<std::mutex> lock(m_parsMutex);
-                        m_parsToBeDeleted.push_back(exPars);
-                    }
                     hit->updateParameters(exPars);
+                    parsToBeDeleted.emplace_back (exPars);
                 }
             }
         }
diff --git a/MuonSpectrometer/MuonReconstruction/MuonTrackMakers/MuonTrackMakerTools/MuonTrackSteeringTools/src/MuPatHitTool.h b/MuonSpectrometer/MuonReconstruction/MuonTrackMakers/MuonTrackMakerTools/MuonTrackSteeringTools/src/MuPatHitTool.h
index 4c732d8fb16d99a190faee00a732fdde5948d883..a0894be056326f154815b0ff0bc457fa3f33c9e4 100644
--- a/MuonSpectrometer/MuonReconstruction/MuonTrackMakers/MuonTrackMakerTools/MuonTrackSteeringTools/src/MuPatHitTool.h
+++ b/MuonSpectrometer/MuonReconstruction/MuonTrackMakers/MuonTrackMakerTools/MuonTrackSteeringTools/src/MuPatHitTool.h
@@ -38,6 +38,9 @@ static const InterfaceID IID_MuPatHitTool("Muon::MuPatHitTool", 1, 0);
 
 class MuPatHitTool : public AthAlgTool {
   public:
+    using HitGarbage = std::vector<std::unique_ptr<MuPatHit> >;
+    using ParGarbage = std::vector<std::unique_ptr<const Trk::TrackParameters> >;
+
     /** default AlgTool constructor */
     MuPatHitTool(const std::string&, const std::string&, const IInterface*);
 
@@ -68,14 +71,17 @@ class MuPatHitTool : public AthAlgTool {
         @param hitList the list to be filled
         @return true if creation succeded
     */
-    bool create(const MuonSegment& seg, MuPatHitList& hitList) const;
+    bool create(const MuonSegment& seg, MuPatHitList& hitList,
+                HitGarbage& hitsToBeDeleted,
+                ParGarbage& parsToBeDeleted) const;
 
     /** @brief create a MuPatHitList from a Track
         @param track the input track
         @param hitList the list to be filled
         @return true if creation succeded
     */
-    bool create(const Trk::Track& track, MuPatHitList& hitList) const;
+    bool create(const Trk::Track& track, MuPatHitList& hitList,
+                HitGarbage& hitsToBeDeleted) const;
 
     /** @brief create a MuPatHitList from a Track
         @param pars the input parameters
@@ -84,7 +90,9 @@ class MuPatHitTool : public AthAlgTool {
         @return true if creation succeded
     */
     bool create(const Trk::TrackParameters& pars, const std::vector<const Trk::MeasurementBase*>& measVec,
-                MuPatHitList& hitList) const;
+                MuPatHitList& hitList,
+                HitGarbage& hitsToBeDeleted,
+                ParGarbage& parsToBeDeleted) const;
 
     /** @brief merge two MuPatHitLists into a new one
         @param hitList1 the first  list
@@ -92,14 +100,16 @@ class MuPatHitTool : public AthAlgTool {
         @param outList  the resulting list
         @return true if merge succeded
     */
-    bool merge(const MuPatHitList& hitList1, const MuPatHitList& hitList2, MuPatHitList& outList) const;
+    bool merge(const MuPatHitList& hitList1, const MuPatHitList& hitList2, MuPatHitList& outList,
+               ParGarbage& parsToBeDeleted) const;
 
     /** @brief merge two MuPatHitLists into a new one. The first list will be added to the second
         @param hitList1 the first  list
         @param hitList2 the second list
         @return true if merge succeded
     */
-    bool merge(const MuPatHitList& hitList1, MuPatHitList& hitList2) const;
+    bool merge(const MuPatHitList& hitList1, MuPatHitList& hitList2,
+               ParGarbage& parsToBeDeleted) const;
 
     /** @brief extract a sorted vector of MeasurementBase objects
         @param hitList the input  list
@@ -127,9 +137,6 @@ class MuPatHitTool : public AthAlgTool {
     /** update hit list for a give track */
     bool update(const Trk::Track& track, MuPatHitList& hitList) const;
 
-    /** clean up MCTB hits allocated up to now */
-    void cleanUp() const;
-
     /** @brief print data part of Muon MeasurementBase to string.
      *
      * This really belongs in MuonEDMPrinterTool in package MuonRecHelperTools.
@@ -211,11 +218,6 @@ class MuPatHitTool : public AthAlgTool {
     };  //<! multipurpose helper tool
 
     Trk::MagneticFieldProperties m_magFieldProperties;  //!< magnetic field properties
-
-    mutable std::vector<MuPatHit*> m_hitsToBeDeleted                   ATLAS_THREAD_SAFE;
-    mutable std::vector<const Trk::TrackParameters*> m_parsToBeDeleted ATLAS_THREAD_SAFE;
-    mutable std::mutex                                                 m_hitsMutex;
-    mutable std::mutex                                                 m_parsMutex;
 };
 
 }  // namespace Muon