diff --git a/Event/EventPacker/src/lib/PackedTrack.cpp b/Event/EventPacker/src/lib/PackedTrack.cpp
index 4e84cd584cefea91a5586ecc64189d9e4a34ac7f..8a4de92b4cf121ab1edd7fcad1c555b603d3952d 100644
--- a/Event/EventPacker/src/lib/PackedTrack.cpp
+++ b/Event/EventPacker/src/lib/PackedTrack.cpp
@@ -39,7 +39,7 @@ void TrackPacker::pack( const Data & track,
 
     //== Handle the states in the track
     ptrack.firstState = ptracks.states().size();
-    for ( const auto* S : track.states() ) { convertState( *S, ptracks ); }
+    for ( const auto& S : track.states() ) { convertState( S, ptracks ); }
     ptrack.lastState = ptracks.states().size();
     if ( UNLIKELY( parent().msgLevel(MSG::DEBUG) ) )
     {
@@ -442,7 +442,7 @@ StatusCode TrackPacker::check( const Data & dataA,
 
   for ( kk = 0; (dataA.nStates() > kk) && (dataB.nStates() > kk); ++kk )
   {
-    compareStates( *dataA.states()[kk], *dataB.states()[kk] );
+    compareStates( dataA.states()[kk], dataB.states()[kk] );
   }
 
   return ( isOK ? StatusCode::SUCCESS : StatusCode::FAILURE );
diff --git a/Event/TrackEvent/Event/TrackFunctor.h b/Event/TrackEvent/Event/TrackFunctor.h
index 9cfd5e1e39d2305d6e3e0b28056158ba71cbbeec..23f63a3f2e37fddcd36f15b32c026abc02528519 100644
--- a/Event/TrackEvent/Event/TrackFunctor.h
+++ b/Event/TrackEvent/Event/TrackFunctor.h
@@ -187,7 +187,7 @@ constexpr auto decreasingByZ = []() {
     if ( iter == allstates.end() )
       throw GaudiException( "No states","TrackFunctor.h",
                             StatusCode::FAILURE );
-    return *(*iter);
+    return *iter;
   }
 
 //=============================================================================
@@ -201,7 +201,7 @@ constexpr auto decreasingByZ = []() {
     if ( iter == allstates.end() )
       throw GaudiException( "No states","TrackFunctor.h",
                             StatusCode::FAILURE );
-    return *(*iter);
+    return *iter;
   }
 
 //=============================================================================
diff --git a/Event/TrackEvent/src/Track.cpp b/Event/TrackEvent/src/Track.cpp
index 089059edfe583f0c3152f513a66fdb3bc265625c..701fb91b294b1f77a542b3e5dd4ef460724a28f3 100644
--- a/Event/TrackEvent/src/Track.cpp
+++ b/Event/TrackEvent/src/Track.cpp
@@ -167,7 +167,7 @@ State & Track::closestState( double z )
   if ( iter == m_states.end() )
     throw GaudiException( "No state closest to z","Track.cpp",
                           StatusCode::FAILURE );
-  return *(*iter);
+  return *iter;
 }
 
 //=============================================================================
@@ -176,7 +176,8 @@ State & Track::closestState( double z )
 const State & Track::closestState( double z ) const
 {
   if ( m_fitResult && !m_fitResult->nodes().empty() ) {
-    auto iter = std::min_element( m_fitResult->nodes().begin(),m_fitResult->nodes().end(),
+    auto iter = std::min_element( m_fitResult->nodes().begin(),
+                                  m_fitResult->nodes().end(),
                                   TrackFunctor::distanceAlongZ(z) );
     if ( iter == m_fitResult->nodes().end() )
       throw GaudiException( "No state closest to z","Track.cpp",
@@ -188,7 +189,7 @@ const State & Track::closestState( double z ) const
     if ( iter == m_states.end() )
       throw GaudiException( "No state closest to z","Track.cpp",
                             StatusCode::FAILURE );
-    return *(*iter);
+    return *iter;
   }
 }
 
@@ -198,7 +199,8 @@ const State & Track::closestState( double z ) const
 const State & Track::closestState( const Gaudi::Plane3D& plane ) const
 {
   if ( m_fitResult && !m_fitResult->nodes().empty() ) {
-    auto iter = std::min_element( m_fitResult->nodes().begin(),m_fitResult->nodes().end(),
+    auto iter = std::min_element( m_fitResult->nodes().begin(),
+                                  m_fitResult->nodes().end(),
                                   TrackFunctor::distanceToPlane(plane) );
     if ( iter == m_fitResult->nodes().end() )
       throw GaudiException( "No state closest to z","Track.cpp",
@@ -210,7 +212,7 @@ const State & Track::closestState( const Gaudi::Plane3D& plane ) const
     if ( iter == m_states.end() )
       throw GaudiException( "No state closest to plane","Track.cpp",
                             StatusCode::FAILURE );
-    return *(*iter);
+    return *iter;
   }
 }
 
@@ -228,9 +230,9 @@ bool Track::hasStateAt( const LHCb::State::Location& location ) const
 State* Track::stateAt( const LHCb::State::Location& location )
 {
   auto iter = std::find_if( m_states.begin(),m_states.end(),
-                            [&](const LHCb::State* s)
-                            { return s->checkLocation(location); } );
-  return iter != m_states.end() ? *iter : nullptr;
+                            [&](const LHCb::State& s)
+                            { return s.checkLocation(location); } );
+  return iter != m_states.end() ? &(*iter) : nullptr;
 }
 
 //=============================================================================
@@ -239,9 +241,9 @@ State* Track::stateAt( const LHCb::State::Location& location )
 const State* Track::stateAt( const LHCb::State::Location& location ) const
 {
   auto iter = std::find_if( m_states.begin(),m_states.end(),
-                            [&](const LHCb::State* s)
-                            { return s->checkLocation(location); } );
-  return iter != m_states.end() ? *iter : nullptr;
+                            [&](const LHCb::State& s)
+                            { return s.checkLocation(location); } );
+  return iter != m_states.end() ? &(*iter) : nullptr;
 }
 
 //=============================================================================
@@ -249,19 +251,18 @@ const State* Track::stateAt( const LHCb::State::Location& location ) const
 //=============================================================================
 void Track::addToStates( const State& state )
 {
-  auto local = state.clone();
   const int order = ( checkFlag(Track::Flags::Backward) ? -1 : 1 );
   auto ipos = std::upper_bound(m_states.begin(),
                                m_states.end(),
-                               local,
+                               state,
                                TrackFunctor::orderByZ(order));
-  m_states.insert(ipos,local);
+  m_states.emplace(ipos, state);
 }
 
 //=============================================================================
 // Add a list of states to the list associated to the Track. This takes ownership.
 //=============================================================================
-void Track::addToStates( span<State* const> states, LHCb::Tag::State::AssumeUnordered_tag)
+void Track::addToStates( span<const State> states, LHCb::Tag::State::AssumeUnordered_tag)
 {
   auto pivot = m_states.insert(m_states.end(), states.begin(), states.end()) ;
   // do not assumme that the incoming states are properly sorted.
@@ -279,7 +280,7 @@ void Track::addToStates( span<State* const> states, LHCb::Tag::State::AssumeUnor
 //=============================================================================
 // Add a set of sorted states by increasing Z to the track. Track takes ownership
 //=============================================================================
-void Track::addToStates( span<State* const> states, LHCb::Tag::State::AssumeSorted_tag)
+void Track::addToStates( span<const State> states, LHCb::Tag::State::AssumeSorted_tag)
 {
   // debug assert checking whether it's correctly sorted or not
   assert( ( checkFlag(Track::Flags::Backward) ?
@@ -306,14 +307,6 @@ void Track::removeFromLhcbIDs( const LHCbID& value )
   if (pos!=m_lhcbIDs.end() && *pos==value) m_lhcbIDs.erase( pos ) ;
 }
 
-//=============================================================================
-// Remove a State from the list of States associated to the Track
-//=============================================================================
-void Track::removeFromStates( State* state )
-{
-  TrackFunctor::deleteFromList(m_states,state);
-}
-
 //=============================================================================
 // Add LHCbIDs to track
 //=============================================================================
@@ -390,33 +383,12 @@ void Track::reset()
   setLikelihood ( 999 );
 
   m_lhcbIDs.clear();
-  std::for_each( m_states.begin(), m_states.end(), TrackFunctor::deleteObject() );
   m_states.clear();
   m_ancestors.clear();
   m_extraInfo.clear();
   m_fitResult.reset();
 }
 
-//=============================================================================
-// Clone the track keeping the key
-//=============================================================================
-Track* Track::cloneWithKey( ) const
-{
-  Track* tr = new Track( this -> key() );
-  tr -> copy( *this );
-  return tr;
-}
-
-//=============================================================================
-// Clone the track
-//=============================================================================
-Track* Track::clone() const
-{
-  Track* tr = new Track();
-  tr -> copy( *this );
-  return tr;
-}
-
 //=============================================================================
 // Copy the info from the argument track into this track
 //=============================================================================
@@ -430,11 +402,7 @@ void Track::copy( const Track& track )
   m_lhcbIDs = track.lhcbIDs();
 
   // copy the states
-  clearStates();
-  m_states.reserve( track.states().size() ) ;
-  std::transform( track.states().begin(), track.states().end(),
-                  std::back_inserter(m_states),
-                  [](const LHCb::State* s) { return s->clone(); });
+  m_states = track.states();
 
   // copy the track fit info
   m_fitResult.reset( track.m_fitResult ? track.m_fitResult->clone()
@@ -451,8 +419,6 @@ void Track::copy( const Track& track )
 //=============================================================================
 void Track::clearStates()
 {
-  std::for_each( m_states.begin(),
-                 m_states.end(),TrackFunctor::deleteObject() );
   m_states.clear();
 }
 
@@ -604,11 +570,11 @@ std::ostream& LHCb::Track::fillStream(std::ostream& os) const
        << " pt : " << (float) firstState().pt() <<std::endl
        << " " << nStates() << " states at z =";
     for ( const auto& s : states() ) {
-      if (s) os << " " << s->z();
+      os << " " << s.z();
     }
     os << "  :-" << std::endl;
     for ( const auto& s : states() ) {
-      os << " " << *s;
+      os << " " << s;
     }
     os << std::endl;
   } else {
diff --git a/Event/TrackEvent/xml/Track.xml b/Event/TrackEvent/xml/Track.xml
index e7122c0dc20ad0bbce86c04158c27d62293a22a6..9cc74bfda61cd77474f7072418dfcc4a18f26cd6 100644
--- a/Event/TrackEvent/xml/Track.xml
+++ b/Event/TrackEvent/xml/Track.xml
@@ -10,6 +10,7 @@
       author      = 'Jose Hernando, Eduardo Rodrigues'
       desc        = 'Track is the base class for offline and online tracks.'
       final       = 'TRUE'
+      defaultdestructor = "FALSE"
       id          = '10010'
       location    = 'Rec/Track/Best'
       keyedContTypeDef = "TRUE"
@@ -244,7 +245,7 @@
    />
 
    <typedef
-        type   = "std::vector&lt;LHCb::State*&gt;"
+        type   = "std::vector&lt;LHCb::State&gt;"
         def    = "StateContainer"
         desc   = "Container for LHCb::States on track"
         access = "PUBLIC"
@@ -268,8 +269,6 @@
        desc     = "Move constructor"
        initList = "KeyedObject&lt;int&gt;(), m_chi2PerDoF(track.m_chi2PerDoF), m_nDoF(track.m_nDoF), m_likelihood(track.m_likelihood), m_ghostProbability(track.m_ghostProbability), m_flags(track.m_flags), m_lhcbIDs(std::move(track.m_lhcbIDs)), m_states(std::move(track.m_states)), m_fitResult(std::exchange(track.m_fitResult, nullptr)), m_extraInfo{std::move(track.m_extraInfo)},m_ancestors(std::move(track.m_ancestors))">
      <arg const="FALSE" name="track" type="LHCb::Track&amp;"/>
-     <code>
-     </code>
    </constructor>
 
   <constructor
@@ -311,19 +310,22 @@
 
     <constructor
        desc     = "Copy constructor"
-       initList = "KeyedObject&lt;int&gt;(), m_chi2PerDoF(0.0), m_nDoF(0), m_likelihood(999), m_ghostProbability(999), m_flags(0)">
+       initList = "KeyedObject&lt;int&gt;(), m_chi2PerDoF(0.0), m_nDoF(0), m_likelihood(999), m_ghostProbability(999), m_flags(0), m_fitResult(nullptr), m_ancestors()">
          <arg const="TRUE" name="track" type="LHCb::Track"/>
        <code>
          this -&gt; copy( track );
        </code>
     </constructor>
 
-      <destructor
-        desc = 'Track destructor'>
-        <code>
-         std::for_each( m_states.begin(), m_states.end(), [](auto&amp; i) { delete i; } );
-        </code>
-      </destructor>
+    <constructor
+       desc     = "Copy constructor"
+       initList = "KeyedObject&lt;int&gt;(key), m_chi2PerDoF(0.0), m_nDoF(0), m_likelihood(999), m_ghostProbability(999), m_flags(0), m_lhcbIDs(), m_states(), m_fitResult(), m_ancestors()">
+         <arg const="TRUE" name="track" type="LHCb::Track"/>
+         <arg const="TRUE" name="key" type="int"/>
+       <code>
+         this -&gt; copy( track );
+       </code>
+    </constructor>
 
       <attribute
         type   = 'double'
@@ -422,11 +424,12 @@
         setMeth   = 'FALSE' />
 
       <attribute
-        type      = 'std::vector&lt;LHCb::State*&gt;'
+        type      = 'std::vector&lt;LHCb::State&gt;'
         name      = 'states'
         desc      = 'Container with pointers to all the states'
         access    = 'PRIVATE'
-        setMeth   = 'FALSE' />
+        setMeth   = 'FALSE'
+	nonconstaccessor = 'TRUE' />
 
       <attribute
 	type    = 'std::unique_ptr&lt;TrackFitResult&gt;'
@@ -617,7 +620,7 @@
     throw GaudiException( &quot;first state not defined!&quot;,
                           &quot;Track.h&quot;,
                           StatusCode::FAILURE );
-  return *m_states[0];
+  return m_states[0];
         </code>
       </method>
       <method
@@ -631,7 +634,7 @@
     throw GaudiException( &quot;first state not defined!&quot;,
                           &quot;Track.h&quot;,
                           StatusCode::FAILURE );
-  return *m_states[0];
+  return m_states[0];
         </code>
       </method>
 
@@ -685,6 +688,30 @@
         </code>
       </method>
 
+      <method
+        type    = 'void'
+        name    = 'setQOverPInAllStates'
+        desc    = 'Sets POverQ for all states'>
+        <arg type = 'const float' name='qop' />
+        <code>
+  for (auto&amp; state : m_states) state.setQOverP(qop);
+        </code>
+      </method>
+
+      <method
+        type    = 'void'
+        name    = 'setQOverPAndErrInAllStates'
+        desc    = 'Sets POverQ adn ErrQOverP2 for all states'>
+        <arg type = 'const float' name='qop' />
+        <arg type = 'const float' name='err' />
+        <code>
+  for (auto&amp; state : m_states) {
+    state.setQOverP(qop);
+    state.setErrQOverP2(err);
+  }
+        </code>
+      </method>
+
       <method
         type    = 'MeasurementContainer'
         name    = 'measurements'
@@ -708,23 +735,17 @@
      <method
         name    = 'addToStates'
         desc    = 'Add a set of states to the track. Track takes ownership. (note: const refers to the pointer, not the State!)'>
-        <arg type = 'span&lt;State* const&gt;' inout='BYVALUE' name='states' />
+        <arg type = 'span&lt;const State&gt;' inout='BYVALUE' name='states' />
         <arg type = ' LHCb::Tag::State::AssumeUnordered_tag = { } ' inout='BYVALUE' name=' '/>
       </method>
 
       <method
         name    = 'addToStates'
         desc    = 'Add a set of sorted states by increasing Z to the track. Track takes ownership. (note: const refers to the pointer, not the State!)'>
-        <arg type = 'span&lt;State* const&gt;' inout= 'BYVALUE' name='states' />
+        <arg type = 'span&lt;const State&gt;' inout= 'BYVALUE' name='states' />
         <arg type = ' LHCb::Tag::State::AssumeSorted_tag ' inout='BYVALUE' name=' '/>
       </method>
 
-      <method
-        name    = 'removeFromStates'
-        desc    = 'Remove a State from the list of states associated to the track'
-        argList = 'LHCb::State* value'>
-      </method>
-
       <method
         type    = 'void'
         name    = 'clearStates'
@@ -916,18 +937,6 @@
         desc    = 'Clear the track before re-use' >
       </method>
 
-      <method
-        type    = 'LHCb::Track*'
-        name    = 'cloneWithKey'
-        desc    = 'Clone the track keeping the key (you take ownership of the pointer)'
-	const   = 'TRUE' />
-
-      <method
-        type    = 'LHCb::Track*'
-        name    = 'clone'
-        desc    = 'Clone the track (you take ownership of the pointer)'
-	const   = 'TRUE' />
-
       <method
         type    = 'void'
         name    = 'copy'
diff --git a/Hlt/HltDAQ/src/component/ReportConvertTool.cpp b/Hlt/HltDAQ/src/component/ReportConvertTool.cpp
index 770823b27c1868591489cb8cfaa4422923a4115c..3e53795d356dd9f434981b1529ba788bfa0cb22b 100644
--- a/Hlt/HltDAQ/src/component/ReportConvertTool.cpp
+++ b/Hlt/HltDAQ/src/component/ReportConvertTool.cpp
@@ -1436,69 +1436,59 @@ void ReportConvertTool::TrackObject2Summary( HltObjectSummary::Info* info, const
   const auto& used_map = (turbo ? s_track_unordered_map2_Turbo
                                 : s_track_unordered_map2 );
 
-  LHCb::State first, last;
+  const LHCb::State *first = &object->states().front();
+  const LHCb::State *last = &object->states().back();
   if( object->type() == LHCb::Track::Types::Long ){
-    if( object->hasStateAt(LHCb::State::Location::ClosestToBeam) ) first = *(object->stateAt(LHCb::State::Location::ClosestToBeam));
-    else first = *(object->states().front());
-    //
-    if( object->hasStateAt(LHCb::State::Location::BegRich2) ) last = *(object->stateAt(LHCb::State::Location::BegRich2));
-    else last = *(object->states().back());
-  }
-  else if( object->type() == LHCb::Track::Types::Downstream ){
-    if( object->hasStateAt(LHCb::State::Location::FirstMeasurement) ) first = *(object->stateAt(LHCb::State::Location::FirstMeasurement));
-    else first = *(object->states().front());
-    //
-    if( object->hasStateAt(LHCb::State::Location::BegRich2) ) last = *(object->stateAt(LHCb::State::Location::BegRich2));
-    else last = *(object->states().back());
-  }
-  else{
-    first = *(object->states().front());
-    last = *(object->states().back());
+    if( object->hasStateAt(LHCb::State::Location::ClosestToBeam) ) first = object->stateAt(LHCb::State::Location::ClosestToBeam);
+    if( object->hasStateAt(LHCb::State::Location::BegRich2) ) last = object->stateAt(LHCb::State::Location::BegRich2);
+  } else if( object->type() == LHCb::Track::Types::Downstream ){
+    if( object->hasStateAt(LHCb::State::Location::FirstMeasurement) ) first = object->stateAt(LHCb::State::Location::FirstMeasurement);
+    if( object->hasStateAt(LHCb::State::Location::BegRich2) ) last = object->stateAt(LHCb::State::Location::BegRich2);
   }
 
   for(const auto& track : used_map.at( findBestPrevious( used_map, m_version ) )) {
     switch( track.second.second )
     {
-      case 0: info->insert( track.first, float( first.z() ) ); break;
-      case 1: info->insert( track.first, float( first.x() ) ); break;
-      case 2: info->insert( track.first, float( first.y() ) ); break;
-      case 3: info->insert( track.first, float( first.tx() ) ); break;
-      case 4: info->insert( track.first, float( first.ty() ) ); break;
-      case 5: info->insert( track.first, float( first.qOverP() ) ); break;
+      case 0: info->insert( track.first, float( first->z() ) ); break;
+      case 1: info->insert( track.first, float( first->x() ) ); break;
+      case 2: info->insert( track.first, float( first->y() ) ); break;
+      case 3: info->insert( track.first, float( first->tx() ) ); break;
+      case 4: info->insert( track.first, float( first->ty() ) ); break;
+      case 5: info->insert( track.first, float( first->qOverP() ) ); break;
       case 6: info->insert( track.first, float( object->chi2PerDoF() ) ); break;
       case 7: info->insert( track.first, float( object->nDoF() ) ); break;
       case 8: info->insert( track.first, float( object->likelihood() ) ); break;
       case 9: info->insert( track.first, float( object->ghostProbability() ) ); break;
       case 10: info->insert( track.first, float( object->flags() ) ); break;
-      case 11: info->insert( track.first, float( last.z() ) ); break;
-      case 12: info->insert( track.first, float( last.x() ) ); break;
-      case 13: info->insert( track.first, float( last.y() ) ); break;
-      case 14: info->insert( track.first, float( last.tx() ) ); break;
-      case 15: info->insert( track.first, float( last.ty() ) ); break;
-      case 16: info->insert( track.first, float( last.qOverP() ) ); break;
+      case 11: info->insert( track.first, float( last->z() ) ); break;
+      case 12: info->insert( track.first, float( last->x() ) ); break;
+      case 13: info->insert( track.first, float( last->y() ) ); break;
+      case 14: info->insert( track.first, float( last->tx() ) ); break;
+      case 15: info->insert( track.first, float( last->ty() ) ); break;
+      case 16: info->insert( track.first, float( last->qOverP() ) ); break;
       case 17: info->insert( track.first, float( object->info( LHCb::Track::AdditionalInfo::CloneDist, -1000) ) ); break;
       case 18: info->insert( track.first, float( object->info( LHCb::Track::AdditionalInfo::FitMatchChi2, -1000) ) ); break;
       case 19: info->insert( track.first, float( object->info( LHCb::Track::AdditionalInfo::FitVeloChi2, -1000) ) ); break;
       case 20: info->insert( track.first, float( object->info( LHCb::Track::AdditionalInfo::FitTChi2, -1000) ) ); break;
       case 21: info->insert( track.first, float( object->info( LHCb::Track::AdditionalInfo::FitVeloNDoF, -1000) ) ); break;
       case 22: info->insert( track.first, float( object->info( LHCb::Track::AdditionalInfo::FitTNDoF, -1000) ) ); break;
-      case 23: info->insert( track.first, float( first.flags() ) ); break;
-      case 24: info->insert( track.first, float( last.flags() ) ); break;
-      case 25: info->insert( track.first, float( first.covariance()(0,0) ) ); break;
-      case 26: info->insert( track.first, float( first.covariance()(1,1) ) ); break;
-      case 27: info->insert( track.first, float( first.covariance()(2,2) ) ); break;
-      case 28: info->insert( track.first, float( first.covariance()(3,3) ) ); break;
-      case 29: info->insert( track.first, float( first.covariance()(4,4) ) ); break;
-      case 30: info->insert( track.first, float( first.covariance()(0,1) ) ); break;
-      case 31: info->insert( track.first, float( first.covariance()(0,2) ) ); break;
-      case 32: info->insert( track.first, float( first.covariance()(0,3) ) ); break;
-      case 33: info->insert( track.first, float( first.covariance()(0,4) ) ); break;
-      case 34: info->insert( track.first, float( first.covariance()(1,2) ) ); break;
-      case 35: info->insert( track.first, float( first.covariance()(1,3) ) ); break;
-      case 36: info->insert( track.first, float( first.covariance()(1,4) ) ); break;
-      case 37: info->insert( track.first, float( first.covariance()(2,3) ) ); break;
-      case 38: info->insert( track.first, float( first.covariance()(2,4) ) ); break;
-      case 39: info->insert( track.first, float( first.covariance()(3,4) ) ); break;
+      case 23: info->insert( track.first, float( first->flags() ) ); break;
+      case 24: info->insert( track.first, float( last->flags() ) ); break;
+      case 25: info->insert( track.first, float( first->covariance()(0,0) ) ); break;
+      case 26: info->insert( track.first, float( first->covariance()(1,1) ) ); break;
+      case 27: info->insert( track.first, float( first->covariance()(2,2) ) ); break;
+      case 28: info->insert( track.first, float( first->covariance()(3,3) ) ); break;
+      case 29: info->insert( track.first, float( first->covariance()(4,4) ) ); break;
+      case 30: info->insert( track.first, float( first->covariance()(0,1) ) ); break;
+      case 31: info->insert( track.first, float( first->covariance()(0,2) ) ); break;
+      case 32: info->insert( track.first, float( first->covariance()(0,3) ) ); break;
+      case 33: info->insert( track.first, float( first->covariance()(0,4) ) ); break;
+      case 34: info->insert( track.first, float( first->covariance()(1,2) ) ); break;
+      case 35: info->insert( track.first, float( first->covariance()(1,3) ) ); break;
+      case 36: info->insert( track.first, float( first->covariance()(1,4) ) ); break;
+      case 37: info->insert( track.first, float( first->covariance()(2,3) ) ); break;
+      case 38: info->insert( track.first, float( first->covariance()(2,4) ) ); break;
+      case 39: info->insert( track.first, float( first->covariance()(3,4) ) ); break;
     }
   }
 }
diff --git a/Hlt/HltDAQ/src/lib/HltTrackingCoder.cpp b/Hlt/HltDAQ/src/lib/HltTrackingCoder.cpp
index a78995687f1c4f3513e9470fbb253f0dd54d70af..16ad88e8a11fbbf84e10b4d1b758c41a1b3c836c 100644
--- a/Hlt/HltDAQ/src/lib/HltTrackingCoder.cpp
+++ b/Hlt/HltDAQ/src/lib/HltTrackingCoder.cpp
@@ -60,7 +60,7 @@ void encodeTracks( const LHCb::Tracks& tracks, std::vector<unsigned int>& rawBan
                               [](const LHCb::LHCbID& id) { return id.lhcbID(); } );
         // write states
         // check number of states on track
-        const std::vector<LHCb::State*>& states = Tr->states();
+        const std::vector<LHCb::State>& states = Tr->states();
 
         if (!writeStates) {
           // Do not write states to save disk space
@@ -71,17 +71,17 @@ void encodeTracks( const LHCb::Tracks& tracks, std::vector<unsigned int>& rawBan
         *out++ =  states.size();
 
         // loop over states and encode locations, parameters and covs
-        for ( const LHCb::State* state : states ) {
+        for ( const LHCb::State& state : states ) {
             // store the state location -- a bit of overkill to store this as 32 bit int...
-            *out++ = state->location();
-            *out++ = pac.position( state->z() );
-            const Gaudi::TrackVector& par = state->stateVector();
+            *out++ = state.location();
+            *out++ = pac.position( state.z() );
+            const Gaudi::TrackVector& par = state.stateVector();
             *out++ = pac.position( par[0] );
             *out++ = pac.position( par[1] );
             *out++ = pac.slope( par[2] );
             *out++ = pac.slope( par[3] );
 
-            double p = state->qOverP();
+            double p = state.qOverP();
             if (p!=0) p = 1./p;
             auto pp = pac.energy(p);
             *out++ =  pp;
@@ -98,9 +98,9 @@ void encodeTracks( const LHCb::Tracks& tracks, std::vector<unsigned int>& rawBan
 
             // get errors for scaling
             std::array<double, 5> err { {
-                std::sqrt( state->errX2() ),     std::sqrt( state->errY2() ),
-                std::sqrt( state->errTx2() ),    std::sqrt( state->errTy2() ),
-                std::sqrt( state->errQOverP2() ) } };
+                std::sqrt( state.errX2() ),     std::sqrt( state.errY2() ),
+                std::sqrt( state.errTx2() ),    std::sqrt( state.errTy2() ),
+                std::sqrt( state.errQOverP2() ) } };
             // first store the diagonal then row wise the rest
             *out++ = pac.position( err[0] );
             *out++ = pac.position( err[1] );
@@ -108,7 +108,7 @@ void encodeTracks( const LHCb::Tracks& tracks, std::vector<unsigned int>& rawBan
             *out++ = pac.slope( err[3] );
             *out++ = pac.energy( 1.e5 * fabs( p ) * err[4] ); //== 1.e5 * dp/p (*1.e2)
             for ( unsigned i = 1; i < 5; ++i ) for ( unsigned j = 0; j < i; ++j ) {
-                *out++ = pac.fraction( state->covariance()( i, j ) / err[i] / err[j] );
+                *out++ = pac.fraction( state.covariance()( i, j ) / err[i] / err[j] );
             }
         }//  end loop over states
     }
diff --git a/Hlt/HltDAQ/src/utest/utestTrackingCoder.cpp b/Hlt/HltDAQ/src/utest/utestTrackingCoder.cpp
index cd3d81a25602975f126a38447988bbdb839246c7..3612d246c7573aeb14b2b16eade9faa84fcc5770 100644
--- a/Hlt/HltDAQ/src/utest/utestTrackingCoder.cpp
+++ b/Hlt/HltDAQ/src/utest/utestTrackingCoder.cpp
@@ -51,25 +51,25 @@ equalStates(const LHCb::Tracks& tracks, const LHCb::Tracks& reftracks){
       auto states = Tr->states();
       auto refstates = refTr->states();
       for(unsigned int i=0;i<nstates;++i) {
-        bool result = (states[i]->location() == refstates[i]->location());
+        bool result = (states[i].location() == refstates[i].location());
         if(!result){
-          std::cout << states[i]->location() << std::endl;
-          std::cout << refstates[i]->location() << std::endl;
+          std::cout << states[i].location() << std::endl;
+          std::cout << refstates[i].location() << std::endl;
         }
-        result &= (states[i]->stateVector() == refstates[i]->stateVector());
+        result &= (states[i].stateVector() == refstates[i].stateVector());
         if(!result){
-          std::cout << states[i]->stateVector() << std::endl;
-          std::cout << refstates[i]->stateVector() << std::endl;
+          std::cout << states[i].stateVector() << std::endl;
+          std::cout << refstates[i].stateVector() << std::endl;
         }
         // check for approximate equivalence of covariance matrix
-        double* cov = states[i]->covariance().Array();
-        double* refcov = refstates[i]->covariance().Array();
+        double* cov = states[i].covariance().Array();
+        double* refcov = refstates[i].covariance().Array();
         for(unsigned int ic=0;ic<15;++ic){
           result &= (fabs(cov[ic]-refcov[ic]) < 0.001*fabs(refcov[ic]));
         }
         if(!result){
-          std::cout << states[i]->covariance() << std::endl;
-          std::cout << refstates[i]->covariance() << std::endl;
+          std::cout << states[i].covariance() << std::endl;
+          std::cout << refstates[i].covariance() << std::endl;
         }
         if (!result) return result;
       } // end loop over states
diff --git a/Kernel/LHCbAlgs/src/TESMerger.cpp b/Kernel/LHCbAlgs/src/TESMerger.cpp
index a64e54ac72fca2550775ae2906ff351e42796819..d5d8c95706ac3ba2b177f5e8dd169cfc7ec22805 100644
--- a/Kernel/LHCbAlgs/src/TESMerger.cpp
+++ b/Kernel/LHCbAlgs/src/TESMerger.cpp
@@ -64,7 +64,5 @@ StatusCode TESMerger<T>::execute()
 
 typedef TESMerger<LHCb::ProtoParticle> TESMergerProtoParticle;
 DECLARE_COMPONENT( TESMergerProtoParticle )
-typedef TESMerger<LHCb::Track> TESMergerTrack;
-DECLARE_COMPONENT( TESMergerTrack )
 typedef TESMerger<LHCb::Particle> TESMergerParticle;
 DECLARE_COMPONENT( TESMergerParticle )