diff --git a/InnerDetector/InDetExample/InDetRecExample/python/InDetRecExampleConfig.py b/InnerDetector/InDetExample/InDetRecExample/python/InDetRecExampleConfig.py
index 8f2b310003e4ce6b54df8c6476da54c6b57d7d15..d4968cf69d368df1653b95da87cab84a80a5c3b6 100644
--- a/InnerDetector/InDetExample/InDetRecExample/python/InDetRecExampleConfig.py
+++ b/InnerDetector/InDetExample/InDetRecExample/python/InDetRecExampleConfig.py
@@ -110,7 +110,7 @@ def InDetKOL(name='InDetKOL',**kwargs) :
 def InDetMeasRecalibST(name='InDetMeasRecalibST',**kwargs) :
     from TrkKalmanFitter.TrkKalmanFitterConf import Trk__MeasRecalibSteeringTool
 
-    pix_cluster_on_track_args = stripArgs(kwargs,['SplitClusterMapExtension','ClusterSplitProbabilityName','RenounceInputHandles','nameSuffix'])
+    pix_cluster_on_track_args = stripArgs(kwargs,['SplitClusterMapExtension','ClusterSplitProbabilityName','nameSuffix'])
 
     from InDetRecExample import TrackingCommon as TrackingCommon
     if 'BroadPixelClusterOnTrackTool' not in kwargs :
@@ -132,7 +132,7 @@ def InDetKalmanTrackFitterBase(name='InDetKalmanTrackFitterBase',**kwargs) :
     from AthenaCommon.AppMgr import ToolSvc
 
     nameSuffix=kwargs.pop('nameSuffix','')
-    pix_cluster_on_track_args = stripArgs(kwargs,['SplitClusterMapExtension','ClusterSplitProbabilityName','RenounceInputHandles'])
+    pix_cluster_on_track_args = stripArgs(kwargs,['SplitClusterMapExtension','ClusterSplitProbabilityName'])
     if len(pix_cluster_on_track_args)>0 and len(nameSuffix)>0 :
         pix_cluster_on_track_args['nameSuffix']=nameSuffix
 
@@ -194,7 +194,7 @@ def KalmanDNAFitter(name='KalmanDNAFitter',**kwargs) :
     return InDetKalmanTrackFitterBase(name,**kwargs)
 
 def DistributedKalmanFilter(name="DistributedKalmanFilter", **kwargs) :
-    pix_cluster_on_track_args = stripArgs(kwargs,['SplitClusterMapExtension','ClusterSplitProbabilityName','RenounceInputHandles','nameSuffix'])
+    pix_cluster_on_track_args = stripArgs(kwargs,['SplitClusterMapExtension','ClusterSplitProbabilityName','nameSuffix'])
 
     from InDetRecExample.TrackingCommon          import setDefaults
     if 'ExtrapolatorTool' not in kwargs :
@@ -241,7 +241,7 @@ def InDetGlobalChi2FitterBase(name='GlobalChi2FitterBase', **kwargs) :
     return Trk__GlobalChi2Fitter(name, **kwargs)
 
 def InDetGlobalChi2Fitter(name='InDetGlobalChi2Fitter', **kwargs) :
-    pix_cluster_on_track_args = stripArgs(kwargs,['SplitClusterMapExtension','ClusterSplitProbabilityName','RenounceInputHandles','nameSuffix'])
+    pix_cluster_on_track_args = stripArgs(kwargs,['SplitClusterMapExtension','ClusterSplitProbabilityName','nameSuffix'])
 
     from InDetRecExample import TrackingCommon as TrackingCommon
 
@@ -305,7 +305,7 @@ def InDetGlobalChi2FitterBT(name='InDetGlobalChi2FitterBT', **kwargs):
 def InDetGlobalChi2FitterLowPt(name='InDetGlobalChi2FitterLowPt', **kwargs) :
     # @TODO TrackingGeometrySvc was not set but is set now
     #       RotCreatorTool and BroadRotCreatorTool not set
-    pix_cluster_on_track_args = stripArgs(kwargs,['SplitClusterMapExtension','ClusterSplitProbabilityName','RenounceInputHandles','nameSuffix'])
+    pix_cluster_on_track_args = stripArgs(kwargs,['SplitClusterMapExtension','ClusterSplitProbabilityName','nameSuffix'])
 
     from InDetRecExample import TrackingCommon as TrackingCommon
     if 'RotCreatorTool' not in kwargs :
@@ -329,7 +329,7 @@ def InDetGlobalChi2FitterTRT(name='InDetGlobalChi2FitterTRT', **kwargs) :
     '''
     Global Chi2 Fitter for TRT segments with different settings
     '''
-    pix_cluster_on_track_args = stripArgs(kwargs,['SplitClusterMapExtension','ClusterSplitProbabilityName','RenounceInputHandles','nameSuffix'])
+    pix_cluster_on_track_args = stripArgs(kwargs,['SplitClusterMapExtension','ClusterSplitProbabilityName','nameSuffix'])
 
     if 'RotCreatorTool' not in kwargs :
         from InDetRecExample import TrackingCommon as TrackingCommon
@@ -357,7 +357,7 @@ def InDetGlobalChi2FitterTRT(name='InDetGlobalChi2FitterTRT', **kwargs) :
        ))
 
 def InDetGlobalChi2FitterDBM(name='InDetGlobalChi2FitterDBM', **kwargs) :
-    pix_cluster_on_track_args = stripArgs(kwargs,['SplitClusterMapExtension','ClusterSplitProbabilityName','RenounceInputHandles','nameSuffix'])
+    pix_cluster_on_track_args = stripArgs(kwargs,['SplitClusterMapExtension','ClusterSplitProbabilityName','nameSuffix'])
     if 'RotCreatorTool' not in kwargs :
         from InDetRecExample import TrackingCommon as TrackingCommon
         kwargs=setDefaults(kwargs, RotCreatorTool = TrackingCommon.getInDetRotCreatorDBM(**pix_cluster_on_track_args))
@@ -373,7 +373,7 @@ def InDetGlobalChi2FitterDBM(name='InDetGlobalChi2FitterDBM', **kwargs) :
                                                           Momentum              = 1000.*Units.MeV))
 
 def GaussianSumFitter(name='GaussianSumFitter', **kwargs) :
-    pix_cluster_on_track_args = stripArgs(kwargs,['SplitClusterMapExtension','ClusterSplitProbabilityName','RenounceInputHandles','nameSuffix'])
+    pix_cluster_on_track_args = stripArgs(kwargs,['SplitClusterMapExtension','ClusterSplitProbabilityName','nameSuffix'])
 
     from InDetRecExample import TrackingCommon as TrackingCommon
     if 'ToolForROTCreation' not in kwargs :
diff --git a/InnerDetector/InDetExample/InDetRecExample/python/TrackingCommon.py b/InnerDetector/InDetExample/InDetRecExample/python/TrackingCommon.py
index 738553396c400e807b91fedea40c632b943ac930..90142d7220a34b3ba9d815ab657ad53945d8b4c6 100644
--- a/InnerDetector/InDetExample/InDetRecExample/python/TrackingCommon.py
+++ b/InnerDetector/InDetExample/InDetRecExample/python/TrackingCommon.py
@@ -513,7 +513,7 @@ def getInDetTRT_DriftCircleOnTrackUniversalToolCosmics(name='TRT_DriftCircleOnTr
 
 @makePublicTool
 def getInDetRotCreator(name='InDetRotCreator', **kwargs) :
-    strip_args=['SplitClusterMapExtension','ClusterSplitProbabilityName','RenounceInputHandles','nameSuffix']
+    strip_args=['SplitClusterMapExtension','ClusterSplitProbabilityName','nameSuffix']
     pix_cluster_on_track_args = copyArgs(kwargs,strip_args)
     # note nameSuffix is strupped by makeName
     the_name = makeName( name, kwargs)
@@ -548,7 +548,7 @@ def getInDetRotCreator(name='InDetRotCreator', **kwargs) :
 
 def getInDetRotCreatorPattern(name='InDetRotCreatorPattern', **kwargs) :
     if 'ToolPixelCluster' not in kwargs :
-        pix_cluster_on_track_args = copyArgs(kwargs,['SplitClusterMapExtension','ClusterSplitProbabilityName','RenounceInputHandles','nameSuffix'])
+        pix_cluster_on_track_args = copyArgs(kwargs,['SplitClusterMapExtension','ClusterSplitProbabilityName','nameSuffix'])
         kwargs = setDefaults(kwargs,
                              ToolPixelCluster = getInDetPixelClusterOnTrackToolPattern(**pix_cluster_on_track_args))
     return getInDetRotCreator(name=name, **kwargs)
@@ -556,7 +556,7 @@ def getInDetRotCreatorPattern(name='InDetRotCreatorPattern', **kwargs) :
 
 def getInDetRotCreatorDBM(name='InDetRotCreatorDBM', **kwargs) :
     if 'ToolPixelCluster' not in kwargs :
-        pix_cluster_on_track_args = copyArgs(kwargs,['SplitClusterMapExtension','ClusterSplitProbabilityName','RenounceInputHandles','nameSuffix'])
+        pix_cluster_on_track_args = copyArgs(kwargs,['SplitClusterMapExtension','ClusterSplitProbabilityName','nameSuffix'])
         from InDetRecExample.InDetJobProperties import InDetFlags
         from AthenaCommon.DetFlags              import DetFlags
         if InDetFlags.loadRotCreator() and DetFlags.haveRIO.pixel_on():
@@ -569,7 +569,7 @@ def getInDetRotCreatorDBM(name='InDetRotCreatorDBM', **kwargs) :
 
 def getInDetRotCreatorDigital(name='InDetRotCreatorDigital', **kwargs) :
     if 'ToolPixelCluster' not in kwargs :
-        pix_cluster_on_track_args = copyArgs(kwargs,['SplitClusterMapExtension','ClusterSplitProbabilityName','RenounceInputHandles','nameSuffix'])
+        pix_cluster_on_track_args = copyArgs(kwargs,['SplitClusterMapExtension','ClusterSplitProbabilityName','nameSuffix'])
         kwargs = setDefaults(kwargs,
                              ToolPixelCluster = getInDetPixelClusterOnTrackToolDigital(**pix_cluster_on_track_args))
     return getInDetRotCreator(name=name, **kwargs)
@@ -577,7 +577,7 @@ def getInDetRotCreatorDigital(name='InDetRotCreatorDigital', **kwargs) :
 # @TODO rename to InDetBroadRotCreator
 def getInDetBroadRotCreator(name='InDetBroadInDetRotCreator', **kwargs) :
     if 'ToolPixelCluster' not in kwargs :
-        pix_cluster_on_track_args = copyArgs(kwargs,['SplitClusterMapExtension','ClusterSplitProbabilityName','RenounceInputHandles','nameSuffix'])
+        pix_cluster_on_track_args = copyArgs(kwargs,['SplitClusterMapExtension','ClusterSplitProbabilityName','nameSuffix'])
         kwargs = setDefaults(kwargs,
                              ToolPixelCluster    = getInDetBroadPixelClusterOnTrackTool(**pix_cluster_on_track_args))
     if 'ToolSCT_Cluster' not in kwargs :
@@ -1069,9 +1069,8 @@ def getInDetSummaryHelperSharedHits(name='InDetSummaryHelperSharedHits',**kwargs
 def getInDetTrackSummaryTool(name='InDetTrackSummaryTool',**kwargs) :
     # makeName will remove the namePrefix in suffix from kwargs, so copyArgs has to be first
     hlt_args = copyArgs(kwargs,['isHLT','namePrefix'])
-    id_helper_args = copyArgs(kwargs,['ClusterSplitProbabilityName','RenounceInputHandles','namePrefix','nameSuffix']) if 'ClusterSplitProbabilityName' in kwargs else {}
+    id_helper_args = copyArgs(kwargs,['ClusterSplitProbabilityName','namePrefix','nameSuffix']) if 'ClusterSplitProbabilityName' in kwargs else {}
     kwargs.pop('ClusterSplitProbabilityName',None)
-    kwargs.pop('RenounceInputHandles',None)
     kwargs.pop('isHLT',None)
     the_name = makeName( name, kwargs)
     do_holes=kwargs.get("doHolesInDet",True)
@@ -1097,13 +1096,12 @@ def getInDetTrackSummaryToolNoHoleSearch(name='InDetTrackSummaryToolNoHoleSearch
 def getInDetTrackSummaryToolSharedHits(name='InDetTrackSummaryToolSharedHits',**kwargs) :
 
     if 'InDetSummaryHelperTool' not in kwargs :
-        copy_args=['ClusterSplitProbabilityName','RenounceInputHandles','namePrefix','nameSuffix']
+        copy_args=['ClusterSplitProbabilityName','namePrefix','nameSuffix']
         do_holes=kwargs.get("doHolesInDet",True)
         if do_holes :
             copy_args += ['isHLT']
         id_helper_args = copyArgs(kwargs,copy_args) if 'ClusterSplitProbabilityName' in kwargs else {}
         kwargs.pop('ClusterSplitProbabilityName',None)
-        kwargs.pop('RenounceInputHandles',None)
         kwargs = setDefaults( kwargs, InDetSummaryHelperTool = getInDetSummaryHelperSharedHits(**id_helper_args))
 
     if 'TRT_ElectronPidTool' not in kwargs :
diff --git a/InnerDetector/InDetExample/InDetRecExample/share/ConfiguredNewTrackingSiPattern.py b/InnerDetector/InDetExample/InDetRecExample/share/ConfiguredNewTrackingSiPattern.py
index 4f2a7cbdc3c8c3e2b23000ed0bf8a8596f80b2a4..64b02d8db7904188de6f18f391deb15ecb961391 100644
--- a/InnerDetector/InDetExample/InDetRecExample/share/ConfiguredNewTrackingSiPattern.py
+++ b/InnerDetector/InDetExample/InDetRecExample/share/ConfiguredNewTrackingSiPattern.py
@@ -501,8 +501,7 @@ class  ConfiguredNewTrackingSiPattern:
          # @TODO is the cluster split probability container needed here ?
          ambi_track_summary_tool = TrackingCommon.getInDetTrackSummaryTool(namePrefix                 = 'InDetAmbiguityProcessorSplitProb',
                                                                            nameSuffix                 = NewTrackingCuts.extension(),
-                                                                           ClusterSplitProbabilityName= 'InDetAmbiguityProcessorSplitProb'+NewTrackingCuts.extension(),
-                                                                           RenounceInputHandles       = ['InDetAmbiguityProcessorSplitProb'+NewTrackingCuts.extension()])
+                                                                           ClusterSplitProbabilityName= 'InDetAmbiguityProcessorSplitProb'+NewTrackingCuts.extension())
          if InDetFlags.doTIDE_Ambi() and not (NewTrackingCuts.mode() == "ForwardSLHCTracks" or NewTrackingCuts.mode() == "ForwardTracks" or NewTrackingCuts.mode() == "DBM"):
            # DenseEnvironmentsAmbiguityScoreProcessorTool
            from TrkAmbiguityProcessor.TrkAmbiguityProcessorConf import Trk__DenseEnvironmentsAmbiguityScoreProcessorTool as ScoreProcessorTool
@@ -524,8 +523,7 @@ class  ConfiguredNewTrackingSiPattern:
            fitter_args = setDefaults({},
                                      nameSuffix                   = 'Ambi'+NewTrackingCuts.extension(),
                                      SplitClusterMapExtension     = NewTrackingCuts.extension(),
-                                     ClusterSplitProbabilityName  = 'InDetAmbiguityProcessorSplitProb'+NewTrackingCuts.extension(),
-                                     RenounceInputHandles         = ['InDetAmbiguityProcessorSplitProb'+NewTrackingCuts.extension()])
+                                     ClusterSplitProbabilityName  = 'InDetAmbiguityProcessorSplitProb'+NewTrackingCuts.extension())
            if InDetFlags.holeSearchInGX2Fit():
                fitter_args = setDefaults(fitter_args,
                DoHoleSearch                 = True,
diff --git a/InnerDetector/InDetRecTools/InDetTrackSummaryHelperTool/InDetTrackSummaryHelperTool/InDetTrackSummaryHelperTool.h b/InnerDetector/InDetRecTools/InDetTrackSummaryHelperTool/InDetTrackSummaryHelperTool/InDetTrackSummaryHelperTool.h
index 788a389a4bb8d507f73c61710002a08f5fe8f727..5d44f38c256e00de31e589a3f5ac63eb58e247ac 100755
--- a/InnerDetector/InDetRecTools/InDetTrackSummaryHelperTool/InDetTrackSummaryHelperTool/InDetTrackSummaryHelperTool.h
+++ b/InnerDetector/InDetRecTools/InDetTrackSummaryHelperTool/InDetTrackSummaryHelperTool/InDetTrackSummaryHelperTool.h
@@ -186,9 +186,6 @@ namespace InDet {
     SG::ReadHandleKey<Trk::ClusterSplitProbabilityContainer>   m_clusterSplitProbContainer
        {this, "ClusterSplitProbabilityName", "",""};
 
-    Gaudi::Property<std::vector<std::string> >                 m_renounce
-       {this, "RenounceInputHandles", {},""};
-
     BooleanProperty m_usePixel{this, "usePixel", true};
     BooleanProperty m_useSCT{this, "useSCT", true};
     BooleanProperty m_useTRT{this, "useTRT", true};
diff --git a/InnerDetector/InDetRecTools/InDetTrackSummaryHelperTool/src/InDetTrackSummaryHelperTool.cxx b/InnerDetector/InDetRecTools/InDetTrackSummaryHelperTool/src/InDetTrackSummaryHelperTool.cxx
index c576278b54deb170a924010cedb7db5748be62bb..e9482a0348b14f289dc948ee2e4495f662ed735a 100755
--- a/InnerDetector/InDetRecTools/InDetTrackSummaryHelperTool/src/InDetTrackSummaryHelperTool.cxx
+++ b/InnerDetector/InDetRecTools/InDetTrackSummaryHelperTool/src/InDetTrackSummaryHelperTool.cxx
@@ -33,13 +33,6 @@ InDet::InDetTrackSummaryHelperTool::InDetTrackSummaryHelperTool(const std::strin
 }
 
 //==========================================================================
-namespace {
-   std::string_view stripStoreName(const std::string &name) {
-      std::string::size_type pos = name.find("+");
-      pos =  (pos!=std::string::npos ? pos + 1 : 0);
-      return std::string_view( &(name.c_str()[pos]),name.size()-pos);
-   }
-}
 
 StatusCode InDet::InDetTrackSummaryHelperTool::initialize()
 {
@@ -72,18 +65,6 @@ StatusCode InDet::InDetTrackSummaryHelperTool::initialize()
 
   ATH_CHECK(m_clusterSplitProbContainer.initialize( !m_clusterSplitProbContainer.key().empty()));
 
-  if (!m_renounce.empty()) {
-     for (Gaudi::DataHandle* input_handle : inputHandles()) {
-        std::string_view base_name(stripStoreName(input_handle->objKey()));
-        for (const std::string &renounce_input : m_renounce) {
-           if (base_name==renounce_input) {
-              renounce(*input_handle);
-              ATH_MSG_INFO("Renounce : " << name() << " . " << input_handle->objKey() );
-           }
-        }
-     }
-  }
-
   ATH_MSG_INFO("initialize() successful in " << name());
 
   return StatusCode::SUCCESS;
diff --git a/InnerDetector/InDetRecTools/SiClusterOnTrackTool/SiClusterOnTrackTool/PixelClusterOnTrackTool.h b/InnerDetector/InDetRecTools/SiClusterOnTrackTool/SiClusterOnTrackTool/PixelClusterOnTrackTool.h
index b0a7c8cd837a6c34bae49478f319e9ddf30fad85..ea222bcf6ecbef90281c043d06964e95578d655b 100755
--- a/InnerDetector/InDetRecTools/SiClusterOnTrackTool/SiClusterOnTrackTool/PixelClusterOnTrackTool.h
+++ b/InnerDetector/InDetRecTools/SiClusterOnTrackTool/SiClusterOnTrackTool/PixelClusterOnTrackTool.h
@@ -175,8 +175,6 @@ private:
 
   SG::ReadHandleKey<Trk::ClusterSplitProbabilityContainer>   m_clusterSplitProbContainer
      {this, "ClusterSplitProbabilityName", "",""};
-  Gaudi::Property<std::vector<std::string> >                 m_renounce
-     {this, "RenounceInputHandles", {},""};
 
   //moved from static to member variable
   static constexpr int s_nbinphi=9;
diff --git a/InnerDetector/InDetRecTools/SiClusterOnTrackTool/src/PixelClusterOnTrackTool.cxx b/InnerDetector/InDetRecTools/SiClusterOnTrackTool/src/PixelClusterOnTrackTool.cxx
index cf4b8c13f703c8d94e6a7b6843d6b12ae610cb1e..22b3ef7726514ed56e540fec2d8420ecbc365506 100755
--- a/InnerDetector/InDetRecTools/SiClusterOnTrackTool/src/PixelClusterOnTrackTool.cxx
+++ b/InnerDetector/InDetRecTools/SiClusterOnTrackTool/src/PixelClusterOnTrackTool.cxx
@@ -91,13 +91,6 @@ InDet::PixelClusterOnTrackTool::~PixelClusterOnTrackTool() {
 ///////////////////////////////////////////////////////////////////
 // Initialisation
 ///////////////////////////////////////////////////////////////////
-namespace {
-   std::string_view stripStoreName(const std::string &name) {
-      std::string::size_type pos = name.find("+");
-      pos =  (pos!=std::string::npos ? pos + 1 : 0);
-      return std::string_view( &(name.c_str()[pos]),name.size()-pos);
-   }
-}
 
 StatusCode
 InDet::PixelClusterOnTrackTool::initialize() {
@@ -154,18 +147,6 @@ InDet::PixelClusterOnTrackTool::initialize() {
   ///
 
   ATH_CHECK(m_lorentzAngleTool.retrieve());
-
-  if (!m_renounce.empty()) {
-     for (Gaudi::DataHandle* input_handle : inputHandles()) {
-        std::string_view base_name(stripStoreName(input_handle->objKey()));
-        for (const std::string &renounce_input : m_renounce) {
-           if (base_name==renounce_input) {
-              renounce(*input_handle);
-              ATH_MSG_INFO("Renounce : " << name() << " . " << input_handle->objKey() );
-           }
-        }
-     }
-  }
   return StatusCode::SUCCESS;
 }
 
diff --git a/Tracking/TrkTools/TrkAmbiguityProcessor/src/AmbiguityProcessorBase.cxx b/Tracking/TrkTools/TrkAmbiguityProcessor/src/AmbiguityProcessorBase.cxx
index a29225e6e389d3364906aceb719f374af6f8eca1..0324fc0095c95e491af704af12dee6b9f04f7aa0 100644
--- a/Tracking/TrkTools/TrkAmbiguityProcessor/src/AmbiguityProcessorBase.cxx
+++ b/Tracking/TrkTools/TrkAmbiguityProcessor/src/AmbiguityProcessorBase.cxx
@@ -6,7 +6,8 @@
 #include "TrackScoringTool.h"
 #include "AmbiguityProcessorUtility.h"
 
-
+#include "GaudiKernel/ToolVisitor.h"
+#include "GaudiKernel/RenounceToolInputsVisitor.h"
 
 namespace Trk {
   AmbiguityProcessorBase::AmbiguityProcessorBase(const std::string& t, const std::string& n, const IInterface*  p ):
@@ -23,7 +24,74 @@ namespace Trk {
       (track.trackParameters()->front()->pT() > m_pTminBrem) and 
       ((not m_caloSeededBrem) or track.info().patternRecoInfo(Trk::TrackInfo::TrackInCaloROI));
   }
-  
+
+  StatusCode
+  AmbiguityProcessorBase::initializeClusterSplitProbContainer() {
+    // init ClusterSplitProb input and output container handles and renounce the output handle from its tools.
+    // the latter works because the ClusterSplitProb output container is created and recorded before the tools
+    // are called.
+    ATH_CHECK(m_clusterSplitProbContainerIn.initialize(!m_clusterSplitProbContainerIn.key().empty()));
+    ATH_CHECK(m_clusterSplitProbContainerOut.initialize(!m_clusterSplitProbContainerOut.key().empty()));
+    if (!m_clusterSplitProbContainerOut.key().empty()) {
+      auto visitor=[this](const IAlgTool *tool) {
+         const AlgTool *alg_tool = dynamic_cast<const AlgTool *>(tool);
+         for ( Gaudi::DataHandle* handle : alg_tool->inputHandles() ) {
+            this->msg(MSG::DEBUG)  << " input Handle "
+                                   << tool->name() << " . "
+                                   << handle->objKey() << endmsg;
+         }
+         for (auto elm : alg_tool->inputDataObjs()) {
+            this->msg(MSG::DEBUG) << " input object "
+                                  << tool->name() << " . "
+                                  << elm.key()  << endmsg;
+         }
+      };
+      if (msgLvl(MSG::DEBUG)) {
+         ToolVisitor::visit(tools(), visitor);
+      }
+      /// usage:
+      ATH_MSG_DEBUG(  " Renounce " << m_clusterSplitProbContainerOut.objKey() );
+      auto logger=RenounceToolInputsVisitor::createLogger( [this](const std::string_view& tool_name, const std::string_view& key) {
+         this->msg(MSG::INFO) << " Renounce " << tool_name << " . " << key << endmsg;
+      });
+      RenounceToolInputsVisitor renounce(std::vector<DataObjID>{m_clusterSplitProbContainerOut.fullKey()}, logger);
+      ToolVisitor::visit(tools(), renounce);
+      ATH_MSG_DEBUG(" renounced " << m_clusterSplitProbContainerOut.objKey() );
+      if (msgLvl(MSG::DEBUG)) {
+        ToolVisitor::visit(tools(), visitor);
+     }
+    }
+    return StatusCode::SUCCESS;
+  }
+
+  AmbiguityProcessorBase::UniqueClusterSplitProbabilityContainerPtr
+  AmbiguityProcessorBase::createAndRecordClusterSplitProbContainer(const EventContext& ctx) const {
+    SG::ReadHandle<Trk::ClusterSplitProbabilityContainer> splitProbContainerIn;
+    if (!m_clusterSplitProbContainerIn.key().empty()) {
+      splitProbContainerIn = SG::ReadHandle( m_clusterSplitProbContainerIn, ctx);
+      if (!splitProbContainerIn.isValid()) {
+        ATH_MSG_ERROR( "Failed to get input cluster split probability container "  << m_clusterSplitProbContainerIn.key());
+      }
+    }
+    std::unique_ptr<Trk::ClusterSplitProbabilityContainer>
+       newSplitProbContainer(!m_clusterSplitProbContainerIn.key().empty()
+                             ? std::make_unique<Trk::ClusterSplitProbabilityContainer>(*splitProbContainerIn)
+                             : std::make_unique<Trk::ClusterSplitProbabilityContainer>());
+    SG::WriteHandle<Trk::ClusterSplitProbabilityContainer> splitProbContainerHandle;
+    if (!m_clusterSplitProbContainerOut.key().empty()) {
+      splitProbContainerHandle=SG::WriteHandle<Trk::ClusterSplitProbabilityContainer>( m_clusterSplitProbContainerOut, ctx);
+      if (splitProbContainerHandle.record(std::move(newSplitProbContainer)).isFailure()) {
+        ATH_MSG_FATAL( "Failed to record output cluster split probability container "  << m_clusterSplitProbContainerOut.key());
+      }
+      // newSplitProbContainer owned by storegate -> no cleanup
+      return UniqueClusterSplitProbabilityContainerPtr(splitProbContainerHandle.ptr(), [](Trk::ClusterSplitProbabilityContainer *) {});
+    }
+    else {
+      // when not recording the split prob container in storegate the container must be deleted once going out of scope
+      return UniqueClusterSplitProbabilityContainerPtr(newSplitProbContainer.release(), [](Trk::ClusterSplitProbabilityContainer *ptr) { delete ptr;});
+    }
+  }
+
   bool
   AmbiguityProcessorBase::shouldTryBremRecovery(const Trk::Track & track, const TrackParameters * pPar) const{
     return m_tryBremFit and
@@ -167,4 +235,4 @@ namespace Trk {
   }
   
 
-}
\ No newline at end of file
+}
diff --git a/Tracking/TrkTools/TrkAmbiguityProcessor/src/AmbiguityProcessorBase.h b/Tracking/TrkTools/TrkAmbiguityProcessor/src/AmbiguityProcessorBase.h
index 4c9fec21d7c9ec61a44ee170b1a1bef2ac46fdcc..9c41f16cb4653f4cade90dee2716689b2b2c3649 100644
--- a/Tracking/TrkTools/TrkAmbiguityProcessor/src/AmbiguityProcessorBase.h
+++ b/Tracking/TrkTools/TrkAmbiguityProcessor/src/AmbiguityProcessorBase.h
@@ -13,6 +13,7 @@
 
 #include "TrackPtr.h"
 #include "TrkEventPrimitives/TrackScore.h"
+#include "TrkEventUtils/ClusterSplitProbabilityContainer.h"
 
 #include <vector>
 #include <map> //multimap
@@ -95,7 +96,26 @@ namespace Trk {
                                                  
     const TrackParameters *
     getTrackParameters(const Trk::Track* track) const;
-    
+
+    /** Initialize read and write handles for ClusterSplitProbabilityContainers.
+     * If a write handle key is specified for the new ClusterSplitProbabilityContainer, read handles
+     * for this key are "renounced" in all child tools.
+     */
+    StatusCode
+    initializeClusterSplitProbContainer();
+
+    // special pointer type for the ClusterSplitProbabilityContainerPtr to allow to use a single "pointer" for
+    // ClusterSplitProbabilityContainer which need to be deleted and those owned by storegate
+    using UniqueClusterSplitProbabilityContainerPtr = std::unique_ptr<Trk::ClusterSplitProbabilityContainer,void(*)(Trk::ClusterSplitProbabilityContainer*) >;
+
+    /** Create a new cluster splitting probability container and (optionally) record it in storegate
+     * The new container may be populated from an already existing container, and might be stored in StoreGate.
+     * The ownersip, which might be either storegate or the calling scope, is taken into account by the
+     * UniqueClusterSplitProbabilityContainerPtr and must not be touched i.e. unique_ptr::release must not be called.
+     */
+    AmbiguityProcessorBase::UniqueClusterSplitProbabilityContainerPtr
+    createAndRecordClusterSplitProbContainer(const EventContext& ctx) const;
+
     //variables accessible to derived classes
     std::vector<float>     m_etaBounds;           //!< eta intervals for internal monitoring
     mutable std::mutex m_statMutex;
@@ -105,6 +125,16 @@ namespace Trk {
        @todo The actual tool that is used should be configured through job options*/
     ToolHandle<ITrackScoringTool> m_scoringTool;
     ToolHandle<Trk::IExtendedTrackSummaryTool> m_trackSummaryTool{this, "TrackSummaryTool", "InDetTrackSummaryToolNoHoleSearch"};
+
+  private:
+    // the handles should not be used directly instead the methods initializeClusterSplitProbContainer
+    // and createAndRecordClusterSplitProbContainer should be used.
+    SG::ReadHandleKey<Trk::ClusterSplitProbabilityContainer> m_clusterSplitProbContainerIn
+        {this, "InputClusterSplitProbabilityName", "",""};
+    SG::WriteHandleKey<Trk::ClusterSplitProbabilityContainer> m_clusterSplitProbContainerOut
+       {this, "OutputClusterSplitProbabilityName", "",""};
+
+  protected:
      /** brem recovery mode with brem fit ? */
     bool  m_tryBremFit{};
     bool  m_caloSeededBrem{};
diff --git a/Tracking/TrkTools/TrkAmbiguityProcessor/src/DenseEnvironmentsAmbiguityProcessorTool.cxx b/Tracking/TrkTools/TrkAmbiguityProcessor/src/DenseEnvironmentsAmbiguityProcessorTool.cxx
index 48891f91622b34462337e841902a4f1b63d16312..9982fc9356a425a219dfe7d4f710867b94de9ec1 100644
--- a/Tracking/TrkTools/TrkAmbiguityProcessor/src/DenseEnvironmentsAmbiguityProcessorTool.cxx
+++ b/Tracking/TrkTools/TrkAmbiguityProcessor/src/DenseEnvironmentsAmbiguityProcessorTool.cxx
@@ -88,9 +88,9 @@ Trk::DenseEnvironmentsAmbiguityProcessorTool::initialize(){
 
   ATH_CHECK( m_extrapolatorTool.retrieve());
 
-  ATH_CHECK(m_clusterSplitProbContainerIn.initialize(!m_clusterSplitProbContainerIn.key().empty()));
-  ATH_CHECK(m_clusterSplitProbContainerOut.initialize(!m_clusterSplitProbContainerOut.key().empty()));
-
+  if (initializeClusterSplitProbContainer().isFailure()) {
+     sc=StatusCode::FAILURE;
+  }
   // Configuration of the material effects
   Trk::ParticleSwitcher particleSwitch;
   m_particleHypothesis = particleSwitch.particle[m_matEffects];
@@ -110,7 +110,6 @@ Trk::DenseEnvironmentsAmbiguityProcessorTool::initialize(){
   }
   return sc;
 }
-//==================================================================================================
 
 StatusCode 
 Trk::DenseEnvironmentsAmbiguityProcessorTool::finalize(){
@@ -177,28 +176,7 @@ Trk::DenseEnvironmentsAmbiguityProcessorTool::solveTracks(const TracksScores &tr
      stat.incrementCounterByRegion(CounterIndex::kNcandidates,scoreTrack.first);
   }
   const EventContext& ctx = Gaudi::Hive::currentContext();
-  SG::ReadHandle<Trk::ClusterSplitProbabilityContainer> splitProbContainerIn;
-  if (!m_clusterSplitProbContainerIn.key().empty()) {
-     splitProbContainerIn = SG::ReadHandle( m_clusterSplitProbContainerIn, ctx);
-     if (!splitProbContainerIn.isValid()) {
-        ATH_MSG_ERROR( "Failed to get input cluster split probability container "  << m_clusterSplitProbContainerIn.key());
-     }
-  }
-  std::unique_ptr<Trk::ClusterSplitProbabilityContainer> splitProbContainerCleanup(!m_clusterSplitProbContainerIn.key().empty()
-                                                                                      ? std::make_unique<ClusterSplitProbabilityContainer>(*splitProbContainerIn)
-                                                                                      : std::make_unique<ClusterSplitProbabilityContainer>());
-  SG::WriteHandle<Trk::ClusterSplitProbabilityContainer> splitProbContainerHandle;
-  Trk::ClusterSplitProbabilityContainer *splitProbContainer;
-  if (!m_clusterSplitProbContainerOut.key().empty()) {
-     splitProbContainerHandle=SG::WriteHandle<Trk::ClusterSplitProbabilityContainer>( m_clusterSplitProbContainerOut, ctx);
-     if (splitProbContainerHandle.record(std::move(splitProbContainerCleanup)).isFailure()) {
-        ATH_MSG_FATAL( "Failed to record output cluster split probability container "  << m_clusterSplitProbContainerOut.key());
-     }
-     splitProbContainer = splitProbContainerHandle.ptr();
-  }
-  else {
-     splitProbContainer = splitProbContainerCleanup.get();
-  }
+  UniqueClusterSplitProbabilityContainerPtr splitProbContainer(createAndRecordClusterSplitProbContainer(ctx));
   ATH_MSG_DEBUG ("Starting to solve tracks");
   // now loop as long as map is not empty
   while ( !scoreTrackFitflagMap.empty() ){
diff --git a/Tracking/TrkTools/TrkAmbiguityProcessor/src/DenseEnvironmentsAmbiguityProcessorTool.h b/Tracking/TrkTools/TrkAmbiguityProcessor/src/DenseEnvironmentsAmbiguityProcessorTool.h
index 9b51c9f920fad6c3bacf3e4d7be16818386a768d..114504e4d093fe8d17909c4455703c17df6d458c 100644
--- a/Tracking/TrkTools/TrkAmbiguityProcessor/src/DenseEnvironmentsAmbiguityProcessorTool.h
+++ b/Tracking/TrkTools/TrkAmbiguityProcessor/src/DenseEnvironmentsAmbiguityProcessorTool.h
@@ -12,7 +12,6 @@
 
 #include "TrkToolInterfaces/IPRDtoTrackMapTool.h"
 #include "TrkEventUtils/PRDtoTrackMap.h"
-#include "TrkEventUtils/ClusterSplitProbabilityContainer.h"
 
 //need to include the following, since its a typedef and can't be forward declared.
 #include "TrkTrack/TrackCollection.h"
@@ -83,8 +82,7 @@ namespace Trk {
     std::unique_ptr<Trk::Track>
     fit(const std::vector<const Trk::MeasurementBase*> &measurements,
           const TrackParameters &param, bool flag, Trk::ParticleHypothesis hypo) const;
-          
-    
+
     std::unique_ptr<Trk::Track>
     fit(const Track &track, bool flag, Trk::ParticleHypothesis hypo) const override final;
     bool 
@@ -108,11 +106,6 @@ namespace Trk {
         which are removed are made */
     ToolHandle<IAmbiTrackSelectionTool> m_selectionTool;
 
-    SG::ReadHandleKey<Trk::ClusterSplitProbabilityContainer> m_clusterSplitProbContainerIn
-       {this, "InputClusterSplitProbabilityName", "",""};
-    SG::WriteHandleKey<Trk::ClusterSplitProbabilityContainer> m_clusterSplitProbContainerOut
-       {this, "OutputClusterSplitProbabilityName", "",""};
-
     bool m_rejectInvalidTracks;
     /// If enabled, this flag will make the tool restore the hole information from the input track after a refit. 
     /// This is used when we want to use holes from the pattern recognition instead of repeating the hole search
diff --git a/Tracking/TrkTools/TrkAmbiguityProcessor/src/SimpleAmbiguityProcessorTool.cxx b/Tracking/TrkTools/TrkAmbiguityProcessor/src/SimpleAmbiguityProcessorTool.cxx
index cde397de640ddf4a3ed4a9b9323ae4cda4a40aaf..acd3a08ba9ea6825869a4ea2a09052288617aa04 100644
--- a/Tracking/TrkTools/TrkAmbiguityProcessor/src/SimpleAmbiguityProcessorTool.cxx
+++ b/Tracking/TrkTools/TrkAmbiguityProcessor/src/SimpleAmbiguityProcessorTool.cxx
@@ -9,6 +9,7 @@
 #include "TrkToolInterfaces/IPRD_AssociationTool.h"
 #include "TrkTrack/TrackCollection.h"
 #include "TrkTrack/TrackInfo.h"
+
 #include <map>
 #include <memory>
 #include "AmbiguityProcessorUtility.h"
@@ -77,19 +78,19 @@ StatusCode Trk::SimpleAmbiguityProcessorTool::initialize(){
      ATH_MSG_INFO( "Try brem fit and recovery for electron like tracks.");
   }
 
-  ATH_CHECK(m_clusterSplitProbContainerIn.initialize(!m_clusterSplitProbContainerIn.key().empty()));
-  ATH_CHECK(m_clusterSplitProbContainerOut.initialize(!m_clusterSplitProbContainerOut.key().empty()));
   // statistics
   if (m_etaBounds.size() != Counter::nRegions) {
      ATH_MSG_ERROR( "There must be exactly " << Counter::nRegions
                     << " etaBounds: barrel end, transition region end, end-cap end, DBM start, DBM end." );
      return StatusCode::FAILURE;
   }
+  if (initializeClusterSplitProbContainer().isFailure()) {
+     sc=StatusCode::FAILURE;
+  }
   return sc;
 }
-//==================================================================================================
-
 
+//==================================================================================================
 StatusCode Trk::SimpleAmbiguityProcessorTool::finalize(){
   return StatusCode::SUCCESS;
 }
@@ -197,28 +198,7 @@ Trk::SimpleAmbiguityProcessorTool::solveTracks(TrackScoreMap& trackScoreTrackMap
                                                                 std::vector<std::unique_ptr<const Trk::Track> >& trackDustbin,
                                                                 Counter &stat) const{
   const EventContext& ctx = Gaudi::Hive::currentContext();
-  SG::ReadHandle<Trk::ClusterSplitProbabilityContainer> splitProbContainerIn;
-  if (!m_clusterSplitProbContainerIn.key().empty()) {
-     splitProbContainerIn = SG::ReadHandle( m_clusterSplitProbContainerIn, ctx);
-     if (!splitProbContainerIn.isValid()) {
-        ATH_MSG_ERROR( "Failed to get input cluster split probability container "  << m_clusterSplitProbContainerIn.key());
-     }
-  }
-  std::unique_ptr<Trk::ClusterSplitProbabilityContainer> splitProbContainerCleanup(!m_clusterSplitProbContainerIn.key().empty()
-                                                                                      ? std::make_unique<ClusterSplitProbabilityContainer>(*splitProbContainerIn)
-                                                                                      : std::make_unique<ClusterSplitProbabilityContainer>());
-  SG::WriteHandle<Trk::ClusterSplitProbabilityContainer> splitProbContainerHandle;
-  Trk::ClusterSplitProbabilityContainer *splitProbContainer;
-  if (!m_clusterSplitProbContainerOut.key().empty()) {
-     splitProbContainerHandle = SG::WriteHandle<Trk::ClusterSplitProbabilityContainer>( m_clusterSplitProbContainerOut, ctx);
-     if (splitProbContainerHandle.record(std::move(splitProbContainerCleanup)).isFailure()) {
-        ATH_MSG_FATAL( "Failed to record output cluster split probability container "  << m_clusterSplitProbContainerOut.key());
-     }
-     splitProbContainer=splitProbContainerHandle.ptr();
-  }
-  else {
-     splitProbContainer=splitProbContainerCleanup.get();
-  }
+  UniqueClusterSplitProbabilityContainerPtr splitProbContainer(createAndRecordClusterSplitProbContainer(ctx));
 
   std::unique_ptr<TrackCollection> finalTracks(std::make_unique<TrackCollection>());
 
diff --git a/Tracking/TrkTools/TrkAmbiguityProcessor/src/SimpleAmbiguityProcessorTool.h b/Tracking/TrkTools/TrkAmbiguityProcessor/src/SimpleAmbiguityProcessorTool.h
index 958b33bb4fdac1ed5c3c0dd3a04f6b6e77ec9e4d..532d2f3f1554de573b3a6df12ebf4f5379c6f495 100644
--- a/Tracking/TrkTools/TrkAmbiguityProcessor/src/SimpleAmbiguityProcessorTool.h
+++ b/Tracking/TrkTools/TrkAmbiguityProcessor/src/SimpleAmbiguityProcessorTool.h
@@ -14,7 +14,6 @@
 
 #include "TrkToolInterfaces/IPRDtoTrackMapTool.h"
 #include "TrkEventUtils/PRDtoTrackMap.h"
-#include "TrkEventUtils/ClusterSplitProbabilityContainer.h"
 #include "TrkToolInterfaces/IExtendedTrackSummaryTool.h"
 
 //need to include the following, since its a typedef and can't be forward declared.
@@ -119,10 +118,6 @@ namespace Trk {
       ToolHandle<Trk::IPRDtoTrackMapTool>         m_assoTool{this, "AssociationTool", "Trk::PRDtoTrackMapTool" };
       /** selection tool - here the decision which hits remain on a track and which are removed are made */
       ToolHandle<IAmbiTrackSelectionTool> m_selectionTool;
-      SG::ReadHandleKey<Trk::ClusterSplitProbabilityContainer> m_clusterSplitProbContainerIn
-         {this, "InputClusterSplitProbabilityName", "",""};
-      SG::WriteHandleKey<Trk::ClusterSplitProbabilityContainer> m_clusterSplitProbContainerOut
-         {this, "OutputClusterSplitProbabilityName", "",""};
 
     };
 } //end ns