diff --git a/InnerDetector/InDetRecTools/InDetIncSecVxFinderTool/src/InDetIterativeSecVtxFinderTool.cxx b/InnerDetector/InDetRecTools/InDetIncSecVxFinderTool/src/InDetIterativeSecVtxFinderTool.cxx
index 26f62835e079065b34612582accc7f2f25ab5d4c..413f9870baf2e1d4dd7599f04a760376a13357c4 100644
--- a/InnerDetector/InDetRecTools/InDetIncSecVxFinderTool/src/InDetIterativeSecVtxFinderTool.cxx
+++ b/InnerDetector/InDetRecTools/InDetIncSecVxFinderTool/src/InDetIterativeSecVtxFinderTool.cxx
@@ -479,7 +479,7 @@ std::pair<xAOD::VertexContainer*, xAOD::VertexAuxContainer*> InDetIterativeSecVt
         double distance=0.;
         try
         {
-          Trk::PlaneSurface* mySurface=m_ImpactPoint3dEstimator->Estimate3dIP(*perigeeListIter,&seedVertex);
+          Trk::PlaneSurface* mySurface=m_ImpactPoint3dEstimator->Estimate3dIP(*perigeeListIter,&seedVertex, distance);
           delete mySurface;
           isOK=true;
           ATH_MSG_VERBOSE( " ImpactPoint3dEstimator done " );
@@ -489,9 +489,9 @@ std::pair<xAOD::VertexContainer*, xAOD::VertexAuxContainer*> InDetIterativeSecVt
           ATH_MSG_WARNING( " ImpactPoint3dEstimator failed to find minimum distance between track and vertex seed: " << err.p );
         }
         
-        if (isOK)
+        if (not isOK)
         {
-          distance=m_ImpactPoint3dEstimator->getDistance();
+          distance=0.;
         }
         
         if (distance<0)
@@ -1268,7 +1268,7 @@ std::pair<xAOD::VertexContainer*, xAOD::VertexAuxContainer*> InDetIterativeSecVt
             try
             {
               Trk::PlaneSurface* mySurface= 
-                   m_ImpactPoint3dEstimator->Estimate3dIP( (*tracksIter).initialPerigee(), &((*vxIter)->position()) );
+                m_ImpactPoint3dEstimator->Estimate3dIP( (*tracksIter).initialPerigee(), &((*vxIter)->position()), distance);
               delete mySurface;
               isOK=true;
             }
@@ -1277,7 +1277,7 @@ std::pair<xAOD::VertexContainer*, xAOD::VertexAuxContainer*> InDetIterativeSecVt
               ATH_MSG_WARNING( " ImpactPoint3dEstimator failed  " << err.p );
             }
         
-            if (isOK) distance=m_ImpactPoint3dEstimator->getDistance();
+            if (not isOK) distance=0.;
 
             double error= 1. ;
 	
diff --git a/InnerDetector/InDetRecTools/InDetPriVxFinderTool/src/InDetIterativePriVxFinderTool.cxx b/InnerDetector/InDetRecTools/InDetPriVxFinderTool/src/InDetIterativePriVxFinderTool.cxx
index 3e38b32849dce17aba84fcb6a7004cb97c14291e..80b72185a5fc54d39006b4faf60f7031cdddd4c8 100755
--- a/InnerDetector/InDetRecTools/InDetPriVxFinderTool/src/InDetIterativePriVxFinderTool.cxx
+++ b/InnerDetector/InDetRecTools/InDetPriVxFinderTool/src/InDetIterativePriVxFinderTool.cxx
@@ -430,7 +430,7 @@ InDetIterativePriVxFinderTool::findVertex(const Trk::TrackParticleBaseCollection
           double distance = 0.;
           try
           {
-            Trk::PlaneSurface* mySurface = m_ImpactPoint3dEstimator->Estimate3dIP(*perigeeListIter, &actualVertex);
+            Trk::PlaneSurface* mySurface = m_ImpactPoint3dEstimator->Estimate3dIP(*perigeeListIter, &actualVertex, distance);
             delete mySurface;
             isOK = true;
           }
@@ -442,8 +442,8 @@ InDetIterativePriVxFinderTool::findVertex(const Trk::TrackParticleBaseCollection
           }
 
 
-          if (isOK) {
-            distance = m_ImpactPoint3dEstimator->getDistance();
+          if (not isOK) {
+            distance = 0.;
           }
 
           if (distance < 0) {
diff --git a/InnerDetector/InDetRecTools/InDetPriVxFinderTool/src/InDetMultiPriVxFinderTool.cxx b/InnerDetector/InDetRecTools/InDetPriVxFinderTool/src/InDetMultiPriVxFinderTool.cxx
index 9b21e38ba10dcafcda7fd36d5646862bb329e9f1..053bb69a453cef8cab760e44ae4c6d6099513d88 100755
--- a/InnerDetector/InDetRecTools/InDetPriVxFinderTool/src/InDetMultiPriVxFinderTool.cxx
+++ b/InnerDetector/InDetRecTools/InDetPriVxFinderTool/src/InDetMultiPriVxFinderTool.cxx
@@ -619,7 +619,7 @@ namespace InDet
     bool isOK = false;
     double distance = 0.;
     try {
-      Trk::PlaneSurface* mySurface = m_ImpactPoint3dEstimator->Estimate3dIP(params, vertex);
+      Trk::PlaneSurface* mySurface = m_ImpactPoint3dEstimator->Estimate3dIP(params, vertex, distance);
       delete mySurface;
       isOK = true;
     }
@@ -628,8 +628,8 @@ namespace InDet
       err.p << endmsg;
     }
 
-    if (isOK) {
-      distance = m_ImpactPoint3dEstimator->getDistance();
+    if (not isOK) {
+      distance = 0.;
     }
     if (distance < 0) {
       msg(MSG::WARNING) << " Distance between track and seed vtx is negative: " << distance << endmsg;
diff --git a/Tracking/TrkVertexFitter/TrkVertexFitterInterfaces/TrkVertexFitterInterfaces/IImpactPoint3dEstimator.h b/Tracking/TrkVertexFitter/TrkVertexFitterInterfaces/TrkVertexFitterInterfaces/IImpactPoint3dEstimator.h
index 4d1d6b197d4402db2c3ddbf35474ee04435b1f5b..1efb236f69db35853447a5c7670d13fed331917d 100755
--- a/Tracking/TrkVertexFitter/TrkVertexFitterInterfaces/TrkVertexFitterInterfaces/IImpactPoint3dEstimator.h
+++ b/Tracking/TrkVertexFitter/TrkVertexFitterInterfaces/TrkVertexFitterInterfaces/IImpactPoint3dEstimator.h
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
 */
 
 #ifndef TRKVERTEXFITTERINTERFACES_IIMPACTPOINT3DESTIMATOR_H
@@ -43,18 +43,8 @@ namespace Trk
    /**
     * method calculating the surface (returned), distance and point of closest approach
     */
-    virtual PlaneSurface* Estimate3dIP(const Trk::TrackParameters* trackPerigee, const Amg::Vector3D* theVertex) const = 0;
-    virtual PlaneSurface* Estimate3dIP(const Trk::NeutralParameters* neutralPerigee, const Amg::Vector3D* theVertex) const = 0;
-
-    /**
-     * Access to the 3D impact point
-     */
-    virtual Amg::Vector3D* get3dIP() const = 0;
-
-    /**
-     * Access to the IP 3D distance
-     */
-    virtual double getDistance() const = 0;
+    virtual PlaneSurface* Estimate3dIP(const Trk::TrackParameters* trackPerigee, const Amg::Vector3D* theVertex, double& distance) const = 0;
+    virtual PlaneSurface* Estimate3dIP(const Trk::NeutralParameters* neutralPerigee, const Amg::Vector3D* theVertex, double& distance) const = 0;
 
     /**
       * Actual estimate method, changing the state of Trk::VxTrackAtVertex
diff --git a/Tracking/TrkVertexFitter/TrkVertexFitterUtils/src/ImpactPoint3dEstimator.cxx b/Tracking/TrkVertexFitter/TrkVertexFitterUtils/src/ImpactPoint3dEstimator.cxx
index 3ac955e8684ec6c820a4c103b6cfe0b9acc59794..c1f57273ad6afc35d3c48eb1d01c6e8acbaf3885 100755
--- a/Tracking/TrkVertexFitter/TrkVertexFitterUtils/src/ImpactPoint3dEstimator.cxx
+++ b/Tracking/TrkVertexFitter/TrkVertexFitterUtils/src/ImpactPoint3dEstimator.cxx
@@ -29,10 +29,7 @@ namespace Trk
     m_extrapolator("Trk::Extrapolator"),
     m_magFieldSvc("AtlasFieldSvc", n),
     m_maxiterations(20),
-    m_precision(1e-10),//DeltaPhi
-//    m_planeSurface(0),
-    m_vertex(0),
-    m_distance(0.)
+    m_precision(1e-10)//DeltaPhi
   {   
     declareProperty("Extrapolator",m_extrapolator);
     declareProperty("MagFieldSvc",     m_magFieldSvc);
@@ -42,8 +39,6 @@ namespace Trk
   }
   
   ImpactPoint3dEstimator::~ImpactPoint3dEstimator() {
-//    if (m_planeSurface!=0) delete m_planeSurface;
-    if (m_vertex!=0) delete m_vertex;
   }
   
   StatusCode ImpactPoint3dEstimator::initialize() 
@@ -69,7 +64,7 @@ namespace Trk
   }
 
 
-  template<typename T> PlaneSurface* ImpactPoint3dEstimator::_Estimate3dIPNoCurvature(const T* thePerigee,const Amg::Vector3D* theVertex) const  {
+  template<typename T> PlaneSurface* ImpactPoint3dEstimator::_Estimate3dIPNoCurvature(const T* thePerigee,const Amg::Vector3D* theVertex, double& distance) const  {
 
       const Amg::Vector3D  momentumUnit = thePerigee->momentum().unit();
       double pathLength  =  ( *theVertex  - thePerigee->position() ).dot( momentumUnit )
@@ -79,7 +74,7 @@ namespace Trk
 
       Amg::Vector3D POCA   =  thePerigee->position()  + pathLength * momentumUnit;// Position of closest approach
       Amg::Vector3D DeltaR =  *theVertex  - POCA;
-      m_distance=DeltaR.mag();
+      distance=DeltaR.mag();
       DeltaR=DeltaR.unit();
 
 
@@ -95,12 +90,7 @@ namespace Trk
 
       Amg::Vector3D YDir=momentumUnit.cross(DeltaRcorrected);
 
-      //store the impact 3d point
-      m_vertex=new Amg::Vector3D( POCA );
-
-      ATH_MSG_VERBOSE( "final minimal distance is: " << m_distance);
-
-      ATH_MSG_DEBUG( "POCA in 3D is: " << *m_vertex );
+      ATH_MSG_VERBOSE( "final minimal distance is: " << distance);
 
       //store the plane...
       ATH_MSG_VERBOSE( "plane to which to extrapolate X " << DeltaRcorrected << " Y " << YDir << " Z " << momentumUnit);
@@ -115,30 +105,18 @@ namespace Trk
 
   }
 
-  PlaneSurface* ImpactPoint3dEstimator::Estimate3dIP(const NeutralParameters* neutralPerigee,const Amg::Vector3D* theVertex) const {
-    // clean up before any sanity checks so a return 0 corresponds to internal members reset too
-    if (m_vertex!=0) {
-      delete m_vertex;
-      m_vertex=0;
-    }
-
+  PlaneSurface* ImpactPoint3dEstimator::Estimate3dIP(const NeutralParameters* neutralPerigee,const Amg::Vector3D* theVertex, double& distance) const {
     ATH_MSG_DEBUG("Neutral particle --  propagate like a straight line");
-    return _Estimate3dIPNoCurvature(neutralPerigee, theVertex);
+    return _Estimate3dIPNoCurvature(neutralPerigee, theVertex, distance);
   }
 
   PlaneSurface* 
-  ImpactPoint3dEstimator::Estimate3dIP(const TrackParameters* trackPerigee,const Amg::Vector3D* theVertex) const{
-    // clean up before any sanity checks so a return 0 corresponds to internal members reset too
-    if (m_vertex!=0) {
-      delete m_vertex;
-      m_vertex=0;
-    }
-
+  ImpactPoint3dEstimator::Estimate3dIP(const TrackParameters* trackPerigee,const Amg::Vector3D* theVertex, double& distance) const{
     double magnFieldVect[3];
     m_magFieldSvc->getField(trackPerigee->associatedSurface().center().data(),magnFieldVect);
     if(magnFieldVect[2] == 0 ){
       ATH_MSG_DEBUG("Magnetic field in the Z direction is 0 --  propagate like a straight line");
-      return _Estimate3dIPNoCurvature(trackPerigee, theVertex);
+      return _Estimate3dIPNoCurvature(trackPerigee, theVertex, distance);
     }
 
 
@@ -256,8 +234,8 @@ namespace Trk
     //first vector at 3d impact point
     Amg::Vector3D MomentumDir(std::cos(phiactual)*std::sin(theta),std::sin(phiactual)*std::sin(theta),std::cos(theta));
     Amg::Vector3D DeltaR(x0-xc+Rt*cosphiactual,y0-yc+Rt*sinphiactual,z0-zc-Rt*cottheta*phiactual);
-    m_distance=DeltaR.mag();
-    if (m_distance==0.){
+    distance=DeltaR.mag();
+    if (distance==0.){
       ATH_MSG_WARNING("DeltaR is zero in ImpactPoint3dEstimator::Estimate3dIP, returning nullptr");
       return nullptr;
     }
@@ -276,9 +254,6 @@ namespace Trk
 
     Amg::Vector3D YDir=MomentumDir.cross(DeltaRcorrected);
 
-    //store the impact 3d point
-    m_vertex=new Amg::Vector3D(x0+Rt*cosphiactual,y0+Rt*sinphiactual,z0-Rt*cottheta*phiactual);
-
     if(msgLvl(MSG::VERBOSE))
     {
 
@@ -287,12 +262,6 @@ namespace Trk
                                                                      std::pow(z0-zc-Rt*cottheta*phiactual,2)) << endmsg;
     }
 
-    if(msgLvl(MSG::DEBUG))
-    {
-      msg(MSG::DEBUG) << "POCA in 3D is: " << *m_vertex << endmsg;
-    }
-
-
     //store the plane...
     if (msgLvl(MSG::VERBOSE))
         msg(MSG::VERBOSE)<< "plane to which to extrapolate X " << DeltaRcorrected << " Y " << YDir << " Z " << MomentumDir << endmsg;
@@ -307,11 +276,6 @@ namespace Trk
 
   }//end of estimate 3dIP method
 
-  Amg::Vector3D* ImpactPoint3dEstimator::get3dIP() const
-  {
-    return m_vertex;
-  }
-
   bool ImpactPoint3dEstimator::addIP3dAtaPlane(VxTrackAtVertex & vtxTrack,const Amg::Vector3D & vertex) const
   {
     if (vtxTrack.initialPerigee()) {
@@ -340,9 +304,11 @@ namespace Trk
 
     const PlaneSurface* theSurfaceAtIP(0);
 
+    double distance = 0.;
+
     try
     {
-      theSurfaceAtIP = Estimate3dIP(vtxTrack.initialPerigee(),&vertex);
+      theSurfaceAtIP = Estimate3dIP(vtxTrack.initialPerigee(),&vertex, distance);
     }
     catch (error::ImpactPoint3dEstimatorProblem err)
     {
@@ -367,10 +333,11 @@ namespace Trk
   Trk::NeutralAtaPlane * ImpactPoint3dEstimator::IP3dNeutralAtaPlane(const NeutralParameters * initNeutPerigee,const Amg::Vector3D & vertex) const
   {
     const PlaneSurface* theSurfaceAtIP(0);
+    double distance = 0.;
 
     try
     {
-        theSurfaceAtIP = Estimate3dIP(initNeutPerigee,&vertex);
+      theSurfaceAtIP = Estimate3dIP(initNeutPerigee,&vertex, distance);
     }
     catch (error::ImpactPoint3dEstimatorProblem err)
     {
diff --git a/Tracking/TrkVertexFitter/TrkVertexFitterUtils/src/ImpactPoint3dEstimator.h b/Tracking/TrkVertexFitter/TrkVertexFitterUtils/src/ImpactPoint3dEstimator.h
index a49e12109e92dc3a59701521bd7765a0fea79a2f..c7fed47432a24daf3964c508ba0f7f2ad16db911 100755
--- a/Tracking/TrkVertexFitter/TrkVertexFitterUtils/src/ImpactPoint3dEstimator.h
+++ b/Tracking/TrkVertexFitter/TrkVertexFitterUtils/src/ImpactPoint3dEstimator.h
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
 */
 
 #ifndef TRKVERTEXFITTERUTILS_IMPACTPOINT3DESTIMATOR_H
@@ -52,36 +52,15 @@ namespace Trk
     */
     ~ImpactPoint3dEstimator();
     
-   /**
-    * Actual estimate method
-    */
-//    void Estimate3dIP(const ParametersBase* trackPerigee,const Vertex* theVertex);
-    
-   /**
-    * Access to the plane through 3D impact point
-    */  
- //   PlaneSurface* getPlaneThrough3dIP() const;
-   
-   
    /**
     * New method implementing the features of two above methods at once
     */
-    template<typename T> PlaneSurface* _Estimate3dIPNoCurvature(const T*, const Amg::Vector3D* theVertex) const;
+    template<typename T> PlaneSurface* _Estimate3dIPNoCurvature(const T*, const Amg::Vector3D* theVertex, double& distance) const;
 
-    PlaneSurface* Estimate3dIP(const Trk::TrackParameters* trackPerigee, const Amg::Vector3D* theVertex) const;
+    PlaneSurface* Estimate3dIP(const Trk::TrackParameters* trackPerigee, const Amg::Vector3D* theVertex, double& distance) const;
 
-    PlaneSurface* Estimate3dIP(const Trk::NeutralParameters* neutralPerigee, const Amg::Vector3D* theVertex) const;
+    PlaneSurface* Estimate3dIP(const Trk::NeutralParameters* neutralPerigee, const Amg::Vector3D* theVertex, double& distance) const;
    
-    /**
-     * Access to the 3D impact point
-     */
-    Amg::Vector3D* get3dIP() const;
-
-    /**
-     * Access to the IP 3D distance
-     */
-    double getDistance() const;
- 
     /**
       * Actual estimate method, changing the state of Trk::VxTrackAtVertex
       */
@@ -108,18 +87,8 @@ namespace Trk
     int m_maxiterations;
     double m_precision;
     
-    mutable Amg::Vector3D* m_vertex;
-    
-    mutable double m_distance;
-    
-
   };
 
-
-  inline double ImpactPoint3dEstimator::getDistance() const
-  {
-    return m_distance;
-  }
 }
 
 #endif
diff --git a/Tracking/TrkVertexFitter/TrkVertexFitterUtils/test/ImpactPoint3dEstimator_test.cxx b/Tracking/TrkVertexFitter/TrkVertexFitterUtils/test/ImpactPoint3dEstimator_test.cxx
index 6acc39752fded27b018e482ecdad9580c67dc1fe..fb4831e590c8ef15561c40e9a129d2b9946d4238 100644
--- a/Tracking/TrkVertexFitter/TrkVertexFitterUtils/test/ImpactPoint3dEstimator_test.cxx
+++ b/Tracking/TrkVertexFitter/TrkVertexFitterUtils/test/ImpactPoint3dEstimator_test.cxx
@@ -89,14 +89,15 @@ void test1 (Trk::IImpactPoint3dEstimator& tool)
   Amg::Vector3D vert { 1.2*mm, 0.8*mm, -7*mm };
 
   Trk::Perigee p1 (pos1, mom1, 1, pos1, cov5().release());
-  std::unique_ptr<Trk::PlaneSurface> s1 (tool.Estimate3dIP (&p1, &vert));
+  double distance = 0.;
+  std::unique_ptr<Trk::PlaneSurface> s1 (tool.Estimate3dIP (&p1, &vert, distance));
   checkPlaneSurface (*s1, vert, {0.53466, 0.801692, 0.267261});
-  assert( Athena_test::isEqual (tool.getDistance(), 3.10391, 1e-5) );
+  assert( Athena_test::isEqual (distance, 3.10391, 1e-5) );
   
   Trk::NeutralPerigee p2 (pos1, mom1, 1, pos1, cov5().release());
-  std::unique_ptr<Trk::PlaneSurface> s2 (tool.Estimate3dIP (&p2, &vert));
+  std::unique_ptr<Trk::PlaneSurface> s2 (tool.Estimate3dIP (&p2, &vert, distance));
   checkPlaneSurface (*s2, vert, {0.534522, 0.801784, 0.267261});
-  assert( Athena_test::isEqual (tool.getDistance(), 3.10391, 1e-5) );
+  assert( Athena_test::isEqual (distance, 3.10391, 1e-5) );
 
   // Other methods require full Extrapolator / TrackingGeometry machinery;
   // not tested here.
diff --git a/Tracking/TrkVertexFitter/TrkVertexSeedFinderUtils/src/ImagingSeedTuningAlg.cxx b/Tracking/TrkVertexFitter/TrkVertexSeedFinderUtils/src/ImagingSeedTuningAlg.cxx
index 0ca01b875292cc9f094b271df0d5bda851ff209b..92fe5430816479e701318cb48d48d4ddba4b291d 100644
--- a/Tracking/TrkVertexFitter/TrkVertexSeedFinderUtils/src/ImagingSeedTuningAlg.cxx
+++ b/Tracking/TrkVertexFitter/TrkVertexSeedFinderUtils/src/ImagingSeedTuningAlg.cxx
@@ -586,7 +586,7 @@ double ImagingSeedTuningAlg::distanceAndError(const Trk::TrackParameters* params
     bool isOK=false;
     double distance=0.;
     try {
-      Trk::PlaneSurface* mySurface=m_impactPoint3dEstimator->Estimate3dIP(params,vertex);
+      Trk::PlaneSurface* mySurface=m_impactPoint3dEstimator->Estimate3dIP(params,vertex, distance);
       delete mySurface;
       isOK=true;
     }
@@ -594,8 +594,8 @@ double ImagingSeedTuningAlg::distanceAndError(const Trk::TrackParameters* params
       msg(MSG::WARNING) << " ImpactPoin3dEstimator failed to find minimum distance between track and vertex seed: " << 
         err.p << endmsg;
     }
-    if (isOK) {
-      distance=m_impactPoint3dEstimator->getDistance();
+    if (not isOK) {
+      distance=0.;
     }  
     if (distance<0) {
       msg(MSG::WARNING) << " Distance between track and seed vtx is negative: " << distance << endmsg;