diff --git a/MuonSpectrometer/MuonReconstruction/MuonRIO_OnTrackCreators/MdtDriftCircleOnTrackCreator/src/MdtDriftCircleOnTrackCreator.cxx b/MuonSpectrometer/MuonReconstruction/MuonRIO_OnTrackCreators/MdtDriftCircleOnTrackCreator/src/MdtDriftCircleOnTrackCreator.cxx
index 832872863f906696c1144300cdbaca749a9b7676..0116974f965eefdfd00b784dee7b1881484b4db2 100644
--- a/MuonSpectrometer/MuonReconstruction/MuonRIO_OnTrackCreators/MdtDriftCircleOnTrackCreator/src/MdtDriftCircleOnTrackCreator.cxx
+++ b/MuonSpectrometer/MuonReconstruction/MuonRIO_OnTrackCreators/MdtDriftCircleOnTrackCreator/src/MdtDriftCircleOnTrackCreator.cxx
@@ -460,8 +460,10 @@ Muon::MdtDriftCircleOnTrack* Muon::MdtDriftCircleOnTrackCreator::correct(
     ATH_MSG_WARNING( " Incorrect hit type:  Trk::PrepRawData not a Muon::MdtPrepData!! No rot created " );
     return 0;
   }
-  
-  return createRIO_OnTrack(*mdtPrd,tp.position(),&tp.momentum(),0,strategy,beta,tTrack);
+
+  Amg::Vector3D momentum = tp.momentum();
+
+  return createRIO_OnTrack(*mdtPrd,tp.position(),&momentum,0,strategy,beta,tTrack);
 }
 
 
@@ -474,8 +476,10 @@ Muon::MdtDriftCircleOnTrack* Muon::MdtDriftCircleOnTrackCreator::correct(
     ATH_MSG_WARNING( " Incorrect hit type:  Trk::PrepRawData not a Muon::MdtPrepData!! No rot created " );
     return 0;
   }
-  
-  return createRIO_OnTrack(*mdtPrd,tp.position(),&tp.momentum());
+
+  Amg::Vector3D momentum = tp.momentum();
+
+  return createRIO_OnTrack(*mdtPrd,tp.position(),&momentum);
 }
 
 
diff --git a/MuonSpectrometer/MuonReconstruction/MuonTrackMakers/MuonTrackMakerTools/MuonTrackFinderTools/src/MuonChamberHoleRecoveryTool.cxx b/MuonSpectrometer/MuonReconstruction/MuonTrackMakers/MuonTrackMakerTools/MuonTrackFinderTools/src/MuonChamberHoleRecoveryTool.cxx
index 270031fe0f6a87b51126b4b88e40f8c5a4d0b5be..57c2b91b4fd2999349cb437bf88890b8f01807b7 100644
--- a/MuonSpectrometer/MuonReconstruction/MuonTrackMakers/MuonTrackMakerTools/MuonTrackFinderTools/src/MuonChamberHoleRecoveryTool.cxx
+++ b/MuonSpectrometer/MuonReconstruction/MuonTrackMakers/MuonTrackMakerTools/MuonTrackFinderTools/src/MuonChamberHoleRecoveryTool.cxx
@@ -1014,9 +1014,11 @@ namespace Muon {
 	  }
 	  parsToBeDeleted.push_back(exPars);
 	}
-	
+
+    Amg::Vector3D momentum = exPars->momentum();
+
 	// calibrate Mdt PRD
-        MdtDriftCircleOnTrack* mdtROT = m_mdtRotCreator->createRIO_OnTrack(mdtPrd, exPars->position(), &(exPars->momentum()));
+        MdtDriftCircleOnTrack* mdtROT = m_mdtRotCreator->createRIO_OnTrack(mdtPrd, exPars->position(), &momentum);
 	// sanity check
 	if ( !mdtROT ) {
 	  ATH_MSG_DEBUG(" failed to calibrate MdtPrepData " << m_idHelperSvc->toString(id) );
diff --git a/MuonSpectrometer/MuonReconstruction/MuonTrackMakers/MuonTrackMakerTools/MuonTrackFinderTools/src/MuonSeededSegmentFinder.cxx b/MuonSpectrometer/MuonReconstruction/MuonTrackMakers/MuonTrackMakerTools/MuonTrackFinderTools/src/MuonSeededSegmentFinder.cxx
index 2198a0e2e3363f13f7d219c4517d262e53f5eb3a..fd7f7566a6cc7a1c388e6fe145fed67840990ea5 100644
--- a/MuonSpectrometer/MuonReconstruction/MuonTrackMakers/MuonTrackMakerTools/MuonTrackFinderTools/src/MuonSeededSegmentFinder.cxx
+++ b/MuonSpectrometer/MuonReconstruction/MuonTrackMakers/MuonTrackMakerTools/MuonTrackFinderTools/src/MuonSeededSegmentFinder.cxx
@@ -524,8 +524,10 @@ namespace Muon {
     // update hole search flag, set to false if we are close to the tube edge
     if ( doHoleSearch && fabs(posAlongWire) < halfTubeLength + roadWidthZ ) doHoleSearch = false;
 
+    Amg::Vector3D momentum = exPars->momentum();
+
     // pointer to ROT
-    const MdtDriftCircleOnTrack* mdtROT = m_mdtRotCreator->createRIO_OnTrack(mdtPrd, exPars->position(), &(exPars->momentum()));
+    const MdtDriftCircleOnTrack* mdtROT = m_mdtRotCreator->createRIO_OnTrack(mdtPrd, exPars->position(), &momentum);
 
     // clean up pointers
     delete exPars;
diff --git a/MuonSpectrometer/MuonReconstruction/MuonTrackMakers/MuonTrackMakerTools/MuonTrackSteeringTools/src/MooTrackFitter.cxx b/MuonSpectrometer/MuonReconstruction/MuonTrackMakers/MuonTrackMakerTools/MuonTrackSteeringTools/src/MooTrackFitter.cxx
index 7312cbb6cafc88c7b98267210af047fb5d9843fc..494bdac4fbc5a33f0ff865709784863a153b2ecc 100644
--- a/MuonSpectrometer/MuonReconstruction/MuonTrackMakers/MuonTrackMakerTools/MuonTrackSteeringTools/src/MooTrackFitter.cxx
+++ b/MuonSpectrometer/MuonReconstruction/MuonTrackMakers/MuonTrackMakerTools/MuonTrackSteeringTools/src/MooTrackFitter.cxx
@@ -665,7 +665,8 @@ namespace Muon {
         const Trk::TrackParameters* exPars1 = m_propagator->propagate(segPars1,fitterData.measurements.front()->associatedSurface(),
                                                                       Trk::anyDirection,false,m_magFieldProperties);
         if( exPars1 ){
-          const Trk::MeasurementBase* fake = createFakePhiForMeasurement(*fitterData.measurements.front(),&exPars1->position(),0,10.,garbage);
+          Amg::Vector3D position = exPars1->position();
+          const Trk::MeasurementBase* fake = createFakePhiForMeasurement(*fitterData.measurements.front(),&position,0,10.,garbage);
           delete exPars1;
           if( fake ) {
             fitterData.phiHits.push_back(fake);
@@ -683,7 +684,8 @@ namespace Muon {
         const Trk::TrackParameters* exPars2 = m_propagator->propagate(segPars2,fitterData.measurements.back()->associatedSurface(),
                                                                        Trk::anyDirection,false,m_magFieldProperties);
         if( exPars2 ){
-          const Trk::MeasurementBase* fake = createFakePhiForMeasurement(*fitterData.measurements.back(),&exPars2->position(),0,10.,garbage);
+          Amg::Vector3D position = exPars2->position();
+          const Trk::MeasurementBase* fake = createFakePhiForMeasurement(*fitterData.measurements.back(),&position,0,10.,garbage);
           delete exPars2;
           if( fake ){
             fitterData.phiHits.push_back(fake);
@@ -2581,8 +2583,9 @@ namespace Muon {
             ATH_MSG_DEBUG(" Using error of parameters " << fakeError );
           }
 
+          Amg::Vector3D position = positionFirstFake->trackParameters()->position();
           const Trk::MeasurementBase* fake = createFakePhiForMeasurement( *(positionFirstFake->measurementOnTrack()), 
-                                                                          &(positionFirstFake->trackParameters()->position()),
+                                                                          &position,
                                                                           0, fakeError, garbage );
           if( fake ) {
             // need to clone as fake is already added to garbage collection
@@ -2599,8 +2602,10 @@ namespace Muon {
             fakeError = Amg::error( *positionSecondFake->trackParameters()->covariance(),Trk::loc2);
             ATH_MSG_DEBUG(" Using error of parameters " << fakeError );
           }
+
+          Amg::Vector3D position = positionSecondFake->trackParameters()->position();
           const Trk::MeasurementBase* fake = createFakePhiForMeasurement( *(positionSecondFake->measurementOnTrack()), 
-                                                                          &(positionSecondFake->trackParameters()->position()),
+                                                                          &position,
                                                                           0, fakeError, garbage );
           if( fake ) {
             // need to clone as fake is already added to garbage collection
diff --git a/Tracking/TrkEvent/TrkParametersBase/TrkParametersBase/CurvilinearParametersT.h b/Tracking/TrkEvent/TrkParametersBase/TrkParametersBase/CurvilinearParametersT.h
index e363d9a6741bde5ebb82173a905d9fbe68606543..99684f573f54186803f36a8d08517f9c12865e76 100644
--- a/Tracking/TrkEvent/TrkParametersBase/TrkParametersBase/CurvilinearParametersT.h
+++ b/Tracking/TrkEvent/TrkParametersBase/TrkParametersBase/CurvilinearParametersT.h
@@ -100,10 +100,10 @@ public:
   virtual double charge() const override final;
 
   /** Access method for the position */
-  virtual const Amg::Vector3D& position() const override final;
+  virtual Amg::Vector3D position() const override final;
 
   /** Access method for the momentum */
-  virtual const Amg::Vector3D& momentum() const override final;
+  virtual Amg::Vector3D momentum() const override final;
 
   /** Test to see if there's a surface there. */
   virtual bool hasSurface() const override final;
diff --git a/Tracking/TrkEvent/TrkParametersBase/TrkParametersBase/CurvilinearParametersT.icc b/Tracking/TrkEvent/TrkParametersBase/TrkParametersBase/CurvilinearParametersT.icc
index c7a2aaa58c08c22e93084443fba894fb8317ae24..0bef24bdb4dbbe0846c7180101a8e245217bb9f7 100644
--- a/Tracking/TrkEvent/TrkParametersBase/TrkParametersBase/CurvilinearParametersT.icc
+++ b/Tracking/TrkEvent/TrkParametersBase/TrkParametersBase/CurvilinearParametersT.icc
@@ -175,14 +175,14 @@ CurvilinearParametersT<DIM, T, S>::charge() const
 }
 
 template<int DIM, class T, class S>
-const Amg::Vector3D&
+Amg::Vector3D
 CurvilinearParametersT<DIM, T, S>::position() const
 {
   return m_position;
 }
 
 template<int DIM, class T, class S>
-const Amg::Vector3D&
+Amg::Vector3D
 CurvilinearParametersT<DIM, T, S>::momentum() const
 {
   return m_momentum;
diff --git a/Tracking/TrkEvent/TrkParametersBase/TrkParametersBase/ParametersBase.h b/Tracking/TrkEvent/TrkParametersBase/TrkParametersBase/ParametersBase.h
index 59f6816e1f42ff77492220e7bc5f63a0c10c064b..700ea2f4f76d4d28b8afa3863c601708ee390cd2 100644
--- a/Tracking/TrkEvent/TrkParametersBase/TrkParametersBase/ParametersBase.h
+++ b/Tracking/TrkEvent/TrkParametersBase/TrkParametersBase/ParametersBase.h
@@ -117,10 +117,10 @@ public:
   virtual double charge() const = 0;
 
   /** Access method for the position */
-  virtual const Amg::Vector3D& position() const = 0;
+  virtual Amg::Vector3D position() const = 0;
 
   /** Access method for the momentum */
-  virtual const Amg::Vector3D& momentum() const = 0;
+  virtual Amg::Vector3D momentum() const = 0;
 
   //** equality operator */
   virtual bool operator==(const ParametersBase<DIM, T>&) const;
diff --git a/Tracking/TrkEvent/TrkParametersBase/TrkParametersBase/ParametersT.h b/Tracking/TrkEvent/TrkParametersBase/TrkParametersBase/ParametersT.h
index 19b38245dfae88af6bce46134e4089fa0bc78c3b..d0bb0c51506e1532ed6e4ea8394593a1cdf70d25 100644
--- a/Tracking/TrkEvent/TrkParametersBase/TrkParametersBase/ParametersT.h
+++ b/Tracking/TrkEvent/TrkParametersBase/TrkParametersBase/ParametersT.h
@@ -112,10 +112,10 @@ public:
   virtual double charge() const override final;
 
   /** Access method for the position */
-  virtual const Amg::Vector3D& position() const override final;
+  virtual Amg::Vector3D position() const override final;
 
   /** Access method for the momentum */
-  virtual const Amg::Vector3D& momentum() const override final;
+  virtual Amg::Vector3D momentum() const override final;
 
   /** Test to see if there's a surface there. */
   virtual bool hasSurface() const override final;
diff --git a/Tracking/TrkEvent/TrkParametersBase/TrkParametersBase/ParametersT.icc b/Tracking/TrkEvent/TrkParametersBase/TrkParametersBase/ParametersT.icc
index d9a8fbed89285a3852a11273b2b4dcb24f215b31..7a4dae0911bdf2d921a763a1d47a1fbb6031e1f6 100644
--- a/Tracking/TrkEvent/TrkParametersBase/TrkParametersBase/ParametersT.icc
+++ b/Tracking/TrkEvent/TrkParametersBase/TrkParametersBase/ParametersT.icc
@@ -201,14 +201,14 @@ ParametersT<DIM, T, S>::charge() const
 }
 
 template<int DIM, class T, class S>
-const Amg::Vector3D&
+Amg::Vector3D
 ParametersT<DIM, T, S>::position() const
 {
   return m_position;
 }
 
 template<int DIM, class T, class S>
-const Amg::Vector3D&
+Amg::Vector3D
 ParametersT<DIM, T, S>::momentum() const
 {
   return m_momentum;
diff --git a/Tracking/TrkEvent/TrkPatternParameters/TrkPatternParameters/PatternTrackParameters.h b/Tracking/TrkEvent/TrkPatternParameters/TrkPatternParameters/PatternTrackParameters.h
index 054efd4bd0e1c9d5e196ca75256673625ffdae67..3411edeb473bacd96f86930f7ced56478ab21f06 100755
--- a/Tracking/TrkEvent/TrkPatternParameters/TrkPatternParameters/PatternTrackParameters.h
+++ b/Tracking/TrkEvent/TrkPatternParameters/TrkPatternParameters/PatternTrackParameters.h
@@ -59,8 +59,8 @@ namespace Trk {
       double           cotTheta          ()     const;
       void             changeDirection   ()          ;
 
-      virtual const Amg::Vector3D& position() const override final;
-      virtual const Amg::Vector3D& momentum() const override final;
+      virtual Amg::Vector3D position() const override final;
+      virtual Amg::Vector3D momentum() const override final;
       virtual double charge() const override final;
       virtual bool hasSurface() const override final;
       virtual Amg::RotationMatrix3D measurementFrame() const override final;
@@ -403,7 +403,7 @@ namespace Trk {
       return (1./tan(m_parameters[3]));
     }
 
-  inline const Amg::Vector3D& PatternTrackParameters::momentum      () const
+  inline Amg::Vector3D PatternTrackParameters::momentum      () const
     {
       if (!m_pmomentum.isValid()) {
         updateMomentumCache();
diff --git a/Tracking/TrkEvent/TrkPatternParameters/src/PatternTrackParameters.cxx b/Tracking/TrkEvent/TrkPatternParameters/src/PatternTrackParameters.cxx
index f9a07447372fb07b09c99f0354e6526ae424965a..0d4351e608e8db63a64dc29d5eb62b79801b1bcd 100755
--- a/Tracking/TrkEvent/TrkPatternParameters/src/PatternTrackParameters.cxx
+++ b/Tracking/TrkEvent/TrkPatternParameters/src/PatternTrackParameters.cxx
@@ -138,7 +138,7 @@ AmgSymMatrix(5) Trk::PatternTrackParameters::newCovarianceMatrix
 // Global position of simple track parameters
 ///////////////////////////////////////////////////////////////////
 
-const Amg::Vector3D& Trk::PatternTrackParameters::position() const
+Amg::Vector3D Trk::PatternTrackParameters::position() const
 {
   if (!m_pposition.isValid()) {
     updatePositionCache();
diff --git a/Tracking/TrkFitter/TrkGlobalChi2Fitter/TrkGlobalChi2Fitter/GXFTrackState.h b/Tracking/TrkFitter/TrkGlobalChi2Fitter/TrkGlobalChi2Fitter/GXFTrackState.h
index 581eb4a25610d63c40a8ea59b8623e5bf885c0ba..c92fd711c83e45a219e037d0ab83a50df62c5703 100755
--- a/Tracking/TrkFitter/TrkGlobalChi2Fitter/TrkGlobalChi2Fitter/GXFTrackState.h
+++ b/Tracking/TrkFitter/TrkGlobalChi2Fitter/TrkGlobalChi2Fitter/GXFTrackState.h
@@ -78,7 +78,7 @@ namespace Trk {
     bool isRecalibrated();
     void setRecalibrated(bool);
 
-    const Amg::Vector3D & position();
+    Amg::Vector3D position();
     void setPosition(Amg::Vector3D &);
 
     bool measuresPhi();
diff --git a/Tracking/TrkFitter/TrkGlobalChi2Fitter/src/GXFTrackState.cxx b/Tracking/TrkFitter/TrkGlobalChi2Fitter/src/GXFTrackState.cxx
index 973b803de05da09e4d73b3af40995e553ad08f2a..6920de6867eff7dcb0d9bfe5ed3f48c3cf09f6bf 100644
--- a/Tracking/TrkFitter/TrkGlobalChi2Fitter/src/GXFTrackState.cxx
+++ b/Tracking/TrkFitter/TrkGlobalChi2Fitter/src/GXFTrackState.cxx
@@ -198,7 +198,7 @@ namespace Trk {
     return nmeas;
   }
 
-  const Amg::Vector3D & GXFTrackState::position() {
+  Amg::Vector3D GXFTrackState::position() {
     if (m_trackpar != nullptr) {
       return m_trackpar->position();
     } if (m_measurement != nullptr) {
diff --git a/graphics/VP1/VP1Systems/VP1TrackSystems/VP1TrackSystems/TrackHandleBase.h b/graphics/VP1/VP1Systems/VP1TrackSystems/VP1TrackSystems/TrackHandleBase.h
index 7136304bfb7c8ea09bebed55b86578a12dd6c34b..b7ccd109b44f319f679fcf344b0b97f85d1c0a84 100644
--- a/graphics/VP1/VP1Systems/VP1TrackSystems/VP1TrackSystems/TrackHandleBase.h
+++ b/graphics/VP1/VP1Systems/VP1TrackSystems/VP1TrackSystems/TrackHandleBase.h
@@ -74,8 +74,8 @@ public:
   virtual QStringList clicked() const = 0;
 
   virtual Amg::Vector3D momentum() const { return Amg::Vector3D(0,0,0); }
-  virtual const Amg::Vector3D * startPoint() const;//!< returns 0 if can't find start point.
-  virtual const Amg::Vector3D * endPoint() const;//!< returns 0 if can't find start point.
+  virtual std::optional<Amg::Vector3D> startPoint() const;//!< returns 0 if can't find start point.
+  virtual std::optional<Amg::Vector3D> endPoint() const;//!< returns 0 if can't find start point.
   virtual int pdgCode() const { return 0; }//!< 0 means unknown
 
   //Default implementation of the following two methods will based on
diff --git a/graphics/VP1/VP1Systems/VP1TrackSystems/src/TrackHandleBase.cxx b/graphics/VP1/VP1Systems/VP1TrackSystems/src/TrackHandleBase.cxx
index 267dae53a3ee4171b19c74c518b805cec978e979..be15ef8314f9e9cc892c5b24ad84ec62fb0168ef 100644
--- a/graphics/VP1/VP1Systems/VP1TrackSystems/src/TrackHandleBase.cxx
+++ b/graphics/VP1/VP1Systems/VP1TrackSystems/src/TrackHandleBase.cxx
@@ -1556,7 +1556,7 @@ QStringList TrackHandleBase::baseInfo() const
 }
 
 //____________________________________________________________________
-const Amg::Vector3D * TrackHandleBase::startPoint() const
+std::optional<Amg::Vector3D> TrackHandleBase::startPoint() const
 {
   m_d->ensureLoadPathInfo();
   if (m_d->pathInfo_TrkTrack) {
@@ -1566,17 +1566,17 @@ const Amg::Vector3D * TrackHandleBase::startPoint() const
       if (common()->trackSanityHelper()->isSafe(*tsos_iter)) {
         const Trk::TrackParameters* trackParam = (*tsos_iter)->trackParameters();
         if (common()->trackSanityHelper()->isSafe(trackParam))
-          return &(trackParam->position());
+          return trackParam->position();
       }
     }
   } else if (m_d->pathInfo_Points&&!m_d->pathInfo_Points->empty()) {
-    return &(m_d->pathInfo_Points->at(0));
+    return m_d->pathInfo_Points->at(0);
   }
-  return 0;
+  return {};
 }
 
 //____________________________________________________________________
-const Amg::Vector3D * TrackHandleBase::endPoint() const
+std::optional<Amg::Vector3D> TrackHandleBase::endPoint() const
 {
   m_d->ensureLoadPathInfo();
   if (m_d->pathInfo_TrkTrack) {
@@ -1586,18 +1586,18 @@ const Amg::Vector3D * TrackHandleBase::endPoint() const
       if (common()->trackSanityHelper()->isSafe(*tsos_iter)) {
         const Trk::TrackParameters* trackParam = (*tsos_iter)->trackParameters();
         if (common()->trackSanityHelper()->isSafe(trackParam))
-          return &(trackParam->position());
+          return trackParam->position();
       }
     }
   } else if (m_d->pathInfo_Points&&!m_d->pathInfo_Points->empty()) {
-    return &(m_d->pathInfo_Points->back());
+    return m_d->pathInfo_Points->back();
   }
-  return 0;
+  return {};
 }
 
 bool TrackHandleBase::isIDTrack() const 
 {
-  const Amg::Vector3D * start = startPoint();
+  std::optional<Amg::Vector3D> start = startPoint();
   if (!start) return false;
   return start->perp()<1100 &&fabs( start->z())>3500;  
 }
diff --git a/graphics/VP1/VP1Systems/VP1TrackSystems/src/VP1TrackSystem.cxx b/graphics/VP1/VP1Systems/VP1TrackSystems/src/VP1TrackSystem.cxx
index e4ed3633e90397ecd54348cca1cd560b2df8f536..91eb346e5955ad32f9aab87c82883e21732189c2 100644
--- a/graphics/VP1/VP1Systems/VP1TrackSystems/src/VP1TrackSystem.cxx
+++ b/graphics/VP1/VP1Systems/VP1TrackSystems/src/VP1TrackSystem.cxx
@@ -672,7 +672,7 @@ unsigned VP1TrackSystem::Imp::calcTotalMomentumOfSelectedHandles(Amg::Vector3D&
     if (mom.mag2()==0.0)
       continue;
     //Fixme: Get actual position of perigee!!
-    const Amg::Vector3D * pos = handle->startPoint();
+    std::optional<Amg::Vector3D> pos = handle->startPoint();
     if (!pos)
       continue;
     ++nused;