diff --git a/Tracking/TrkEvent/TrkTrack/TrkTrack/Track.h b/Tracking/TrkEvent/TrkTrack/TrkTrack/Track.h
index 665e4764272c38615e746d7171687e454f33b5ed..1a9922544c06bbb80fe56cb86612f25973a12acb 100755
--- a/Tracking/TrkEvent/TrkTrack/TrkTrack/Track.h
+++ b/Tracking/TrkEvent/TrkTrack/TrkTrack/Track.h
@@ -95,14 +95,20 @@ namespace Trk
       public:
        friend class TrackSlimmingTool;  					     	    
  
-       Track (); //!<needed by POOL. DO NOT USE YOURSELF!			            
+       /**
+        * Default constructor
+        * Here for POOL and simple tests.
+        * The track will return isValid() == false.
+        * It is not expected to be used in
+        * production.
+        */
+       Track (); 		 
+
        /**									            
         * Full constructor							            
         *									            
-        * Pass everything possible to form a track, including			            
-        * As usual, since the FitQuality and the vectors are passed by  	            
-        * pointer, they will be owned by the Track (i.e. the Track will 	            
-        * delete them)  							            
+        * Pass everything possible to form a track.
+        * The Track assumes ownership of the pointers. 							            
         *									            
         * <b>PLEASE NOTE!</b>							            
         * if there is more than one Perigee in trackStateOnSurfaces		            
@@ -128,16 +134,25 @@ namespace Trk
 
        virtual ~Track (); //!< destructor					            
 
+       /**
+        * returns true if the track has non-nullptr 
+        * fitQuality  and  DataVector<const TrackStateOnSurface>*
+        */
+       bool isValid() const;
+
        /**									            
-        * return fit quality. this pointer is NULL (==0) if no FitQuality	            
+        * return fit quality pointer.  It will be nullptr if no FitQuality	            
         * is assigned to the Track						            
         */									            
-       const FitQuality* fitQuality () const	{ 
-         return m_fitQuality;
-       }
+       const FitQuality* fitQuality () const;
 
+       /**
+        * set FitQuality. The Track takes ownership.
+        */
+       void setFitQuality(const FitQuality* quality);
+       
        /**									            
-        * return Perigee. this pointer is NULL (==0) if no perigee parameters	            
+        * return Perigee. Can be nullptr if no perigee parameters	            
         * were assigned to the Track.
         *
         * This method performs lazy initialization and caches the result.						            
@@ -151,8 +166,8 @@ namespace Trk
         * Return a pointer to a vector of TrackParameters.
         * It is created Lazily by this method	and then cached.
         * 							            
-        * The pointer will be NULL (==0) if the track was created		            
-        * without parameters.							            
+        * The pointer will be nullptr if the track was created		            
+        * without parameters. 							            
         *									            
         * In general, it will be defined and will have at least one entry	            
         *									            
@@ -272,7 +287,7 @@ namespace Trk
         * for example, TrackParameter, RIO_OnTrack and FitQualityOnSurface	   
         */									   
        DataVector<const TrackStateOnSurface>* m_trackStateVector{nullptr};		   
- 
+
         /**									   
         * A vector of TrackParameters: these can be any of the classes that	   
         * derive from Trk::TrackParameters, for example, Perigee, MeasuredPerigee, 
@@ -302,7 +317,6 @@ namespace Trk
         */									   
        CxxUtils::CachedValue<DataVector<const MeasurementBase>> m_cachedOutlierVector;	   
         									     
-   
        /**									   
         * A pointer to the Track's Perigee parameters.  			   
         *									   
@@ -310,7 +324,7 @@ namespace Trk
         * or MeasuredPerigee parameter  					   
         */									   
        CxxUtils::CachedValue<const Perigee*> m_perigeeParameters;				   
-        									     
+       									     
        
        /**
         * A pointer to the Track's FitQuality. This is guaranteed to		   
diff --git a/Tracking/TrkEvent/TrkTrack/TrkTrack/Track.icc b/Tracking/TrkEvent/TrkTrack/TrkTrack/Track.icc
index 251dca1c813187b2251289377544673e58259091..474b2acd1a1cb368bbfb262fd38dccea1946f588 100644
--- a/Tracking/TrkEvent/TrkTrack/TrkTrack/Track.icc
+++ b/Tracking/TrkEvent/TrkTrack/TrkTrack/Track.icc
@@ -4,13 +4,24 @@
 
 namespace Trk {
 
+inline bool
+Track::isValid() const
+{
+  return (m_fitQuality && m_trackStateVector);
+}
+
+inline const FitQuality*
+Track::fitQuality() const
+{
+  return m_fitQuality;
+}
+
 inline const DataVector<const TrackStateOnSurface>*
 Track::trackStateOnSurfaces() const
 {
   return m_trackStateVector;
 }
 
-
 inline DataVector<const TrackStateOnSurface>*
 Track::trackStateOnSurfaces()
 {
diff --git a/Tracking/TrkEvent/TrkTrack/src/Track.cxx b/Tracking/TrkEvent/TrkTrack/src/Track.cxx
index a5340b1a11912a16d7dc0a04912855b93ea9f87b..399ff0c55eb1eaf31101d0efe92e84466c8ef33b 100755
--- a/Tracking/TrkEvent/TrkTrack/src/Track.cxx
+++ b/Tracking/TrkEvent/TrkTrack/src/Track.cxx
@@ -194,6 +194,10 @@ Trk::Track::~Track()
 
 const DataVector<const Trk::TrackParameters>* Trk::Track::trackParameters() const
 {
+
+  if(!m_trackStateVector){
+    return nullptr;
+  }
   // Do work only if it is not valid.
   if ( !m_cachedParameterVector.isValid()){
     // create cached parameter vector (which DOES NOT OWN ELEMENTS ...
@@ -255,16 +259,15 @@ void Trk::Track::findPerigeeImpl() const
 const Trk::Perigee*
 Trk::Track::perigeeParameters() const
 {
-
   if (!m_perigeeParameters.isValid()) {
     // findPerigee performs the setting of the parameters
     // i.e does the CachedValue set
     findPerigeeImpl();
   }
 
-  //Return payload if valid
-  if(m_perigeeParameters.isValid()){
-    return  *(m_perigeeParameters.ptr());
+  // Return payload if valid
+  if (m_perigeeParameters.isValid()) {
+    return *(m_perigeeParameters.ptr());
   }
 
   return nullptr;
@@ -272,9 +275,12 @@ Trk::Track::perigeeParameters() const
 
 const DataVector<const Trk::MeasurementBase>* Trk::Track::measurementsOnTrack() const
 {
+  if (!m_trackStateVector) {
+    return nullptr;
+  }
 
   // We only need to do work if not valid.
-  if ( m_trackStateVector and !m_cachedMeasurementVector.isValid()){
+  if (!m_cachedMeasurementVector.isValid()){
     // create new DataVector which DOES NOT OWN ELEMENTS .
     DataVector< const Trk::MeasurementBase> tmpMeasurementVector(SG::VIEW_ELEMENTS);
     // for measurements on track it is very likely that #(meas) ~ #(TSOS)-> reserve(#(TSOS))
@@ -299,6 +305,9 @@ const DataVector<const Trk::MeasurementBase>* Trk::Track::measurementsOnTrack()
 
 const DataVector<const Trk::MeasurementBase>* Trk::Track::outliersOnTrack() const
 {
+  if (!m_trackStateVector) {
+    return nullptr;
+  }
   //We only need to do work if not valid
   if ( !m_cachedOutlierVector.isValid()){
     // create new DataVector which DOES NOT OWN ELEMENTS .
@@ -318,7 +327,14 @@ const DataVector<const Trk::MeasurementBase>* Trk::Track::outliersOnTrack() cons
   return m_cachedOutlierVector.ptr();
 }
 
-void Trk::Track::setTrackStateOnSurfaces(DataVector<const Trk::TrackStateOnSurface>*  input)
+void Trk::Track::setFitQuality(const FitQuality* quality)
+{
+  delete m_fitQuality;
+  m_fitQuality = quality;
+}
+
+void Trk::Track::setTrackStateOnSurfaces(
+  DataVector<const Trk::TrackStateOnSurface>* input)
 {
   delete m_trackStateVector;  // delete existing
   m_trackStateVector = input; // add new