diff --git a/Trigger/TrigAlgorithms/TrigT2BeamSpot/TrigT2BeamSpot/IT2VertexBeamSpotTool.h b/Trigger/TrigAlgorithms/TrigT2BeamSpot/TrigT2BeamSpot/IT2VertexBeamSpotTool.h
deleted file mode 100644
index 19887b59eb5da0e516b7691bfd2c10cb5c0acc40..0000000000000000000000000000000000000000
--- a/Trigger/TrigAlgorithms/TrigT2BeamSpot/TrigT2BeamSpot/IT2VertexBeamSpotTool.h
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
-  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
-*/
-#ifndef TRIGT2BEAMSPOT_IT2VERTEXBEAMSPOTTOOL_H
-#define TRIGT2BEAMSPOT_IT2VERTEXBEAMSPOTTOOL_H
-/// Local tools
-#include "../src/T2Track.h"
-#include "../src/T2Vertex.h"
-//Athena tools
-#include "AthContainers/DataVector.h"
-#include "AthContainers/ConstDataVector.h"
-#include "TrkTrack/TrackCollection.h"
-#include <string>
-#include <vector>
-#include "GaudiKernel/IAlgTool.h"
-
-class TrigVertexCollection;
-
-/// Event statistics
-// When this changes, adjust T2VertexBeamSpotMonitoring.py: EventStatistics histogram
-enum Statistics
-{ 
-   allInput      = 0,
-   hasTE         = 1,
-   hasROI        = 2,
-   hasTracks     = 3,
-   hasSeedTrack  = 4,
-   enoughTracks  = 5,
-   hasCluster    = 6,
-   hasVertex     = 7,
-   hasGoodVertex = 8,
-   numStatistics /// Leave this entry at the end
-};
-
-
-
-namespace PESA {
-   class T2TrackClusterer;
-
-   class IT2VertexBeamSpotTool : virtual public IAlgTool {
-      public:
-         DeclareInterfaceID (IT2VertexBeamSpotTool, 1, 0);
-
-         virtual bool isGoodTrack     ( const T2Track & track  ) const = 0;
-
-
-         virtual bool isGoodVertex    ( const T2Vertex& vertex ) const = 0;
-
-
-         virtual  bool isGoodVertexBCID( const T2Vertex& vertex ) const =0;
-
-
-         virtual  bool isHighPTTrack( unsigned &nTracks ) const =0;
-
-
-         virtual  bool notEnoughTracks(unsigned &nTracks) const =0;
-
-
-         virtual void selectTracks( const TrackCollection*  trackCollection,
-               ConstDataVector<TrackCollection>& mySelectedTrackCollection, std::vector<unsigned> &trackCounter ) = 0;
-
-         virtual void reconstructVertices( ConstDataVector<TrackCollection>& mySelectedTrackCollection,
-               TrigVertexCollection& myVertexCollection,
-               DataVector< TrigVertexCollection >&  mySplitVertexCollections) = 0;
-
-         virtual void reconstructSplitVertices( ConstDataVector<TrackCollection>& mySelectedTrackCollection,
-               DataVector< TrigVertexCollection >& mySplitVertexCollections, T2TrackClusterer& trackClusterer ) = 0;
-
-
-         virtual void resetMonitoredVariables() = 0;
-
-         //Monitoring variables, need to be reset every event in resetMonitored variables
-         std::vector<bool>     m_eventStageFlag;
-         std::vector<unsigned> m_eventStage;
-
-         //Event info variables 
-         unsigned int m_EventID = 0;
-
-         //This might not have to be a member of the tool at all
-         //But need this in the tool as it is used in both tool and the alg
-         virtual bool eventStage( Statistics stage ) = 0;
-
-         //Keep the track of how many vertices passed the selection
-         unsigned int m_NvtxPass;
-
-         std::string m_vertexCollName;
-
-
-         bool m_passNpvTrigCuts;
-
-         std::vector<T2Vertex> m_vertex;
-
-
-   };
-
-} // end namespace
-
-#endif
diff --git a/Trigger/TrigAlgorithms/TrigT2BeamSpot/TrigT2BeamSpot/T2VertexBeamSpot.h b/Trigger/TrigAlgorithms/TrigT2BeamSpot/TrigT2BeamSpot/T2VertexBeamSpot.h
index 66b394a62deeba81b0bb3d02faea843e8a6e215b..dbcc132a6552c64ea12f016b9c41ebd12d89003a 100644
--- a/Trigger/TrigAlgorithms/TrigT2BeamSpot/TrigT2BeamSpot/T2VertexBeamSpot.h
+++ b/Trigger/TrigAlgorithms/TrigT2BeamSpot/TrigT2BeamSpot/T2VertexBeamSpot.h
@@ -29,7 +29,7 @@
 /// trigger EDM
 #include "TrigInterfaces/AllTEAlgo.h"
 //Interface for the beam spot tool
-#include "IT2VertexBeamSpotTool.h"
+#include "T2VertexBeamSpotTool.h"
 
 namespace HLT {
   class TriggerElement;
@@ -86,6 +86,11 @@ namespace PESA {
       /** Function which attaches splitted vertex collections to the trigger element output */
       HLT::ErrorCode attachFeatureSplitVertex(DataVector< TrigVertexCollection > &mySplitVertexCollections,  HLT::TEVec &allTEs, unsigned int type_out );
 
+      //Until HLT::Algo inherits from AthReentrantAlgorithm or we can drop Run-2 setup
+      virtual bool isClonable() const override { return true; }
+      virtual unsigned int cardinality() const override { return 0; }//Mark as re-entrant
+
+
       //Only for Run2 settings
       bool m_activateTE; /*If true to be added */
       bool m_activateAllTE;/*If true to be added */
@@ -116,7 +121,7 @@ namespace PESA {
       SG::ReadHandleKey<xAOD::EventInfo> m_eventInfoKey  { this, "EventInfo", "EventInfo", "" };
 
       //Tools
-      ToolHandle<IT2VertexBeamSpotTool> m_beamSpotTool {this, "BeamSpotTool", "PESA::T2VertexBeamSpotTool/T2VertexBeamSpotTool" };
+      ToolHandle<T2VertexBeamSpotTool> m_beamSpotTool {this, "BeamSpotTool", "PESA::T2VertexBeamSpotTool/T2VertexBeamSpotTool" };
       ToolHandle<GenericMonitoringTool> m_monTool{this,"MonTool","","Monitoring tool"};
 
 
diff --git a/Trigger/TrigAlgorithms/TrigT2BeamSpot/TrigT2BeamSpot/T2VertexBeamSpotTool.h b/Trigger/TrigAlgorithms/TrigT2BeamSpot/TrigT2BeamSpot/T2VertexBeamSpotTool.h
index af8af7b0e92847c79c1d5b2108bccd8f93e19a08..795429cd4fc27921dedd86e053b3c34e002778ff 100644
--- a/Trigger/TrigAlgorithms/TrigT2BeamSpot/TrigT2BeamSpot/T2VertexBeamSpotTool.h
+++ b/Trigger/TrigAlgorithms/TrigT2BeamSpot/TrigT2BeamSpot/T2VertexBeamSpotTool.h
@@ -27,6 +27,7 @@
 #include <memory>
 // Local tools
 #include "../src/T2TrackManager.h"
+#include "../src/T2Track.h"
 #include "../src/T2BeamSpot.h"
 #include "../src/T2SplitVertex.h"
 //Athena tools
@@ -37,8 +38,6 @@
 //Tracking
 #include "TrkTrack/TrackCollection.h"
 #include "TrigInDetToolInterfaces/ITrigPrimaryVertexFitter.h"
-//BeamSpotTool interface
-#include "IT2VertexBeamSpotTool.h"
 //Data handles
 #include "StoreGate/ReadCondHandleKey.h"
 //Beam data
@@ -68,7 +67,7 @@ namespace PESA {
     *   @author David W. Miller     <David.W.Miller@cern.ch>
     *   
     */
-   class T2VertexBeamSpotTool :  public AthAlgTool, virtual public IT2VertexBeamSpotTool{
+   class T2VertexBeamSpotTool :  public AthAlgTool {
       public:
 
          T2VertexBeamSpotTool( const std::string& type, const std::string& name, const IInterface* parent );
@@ -100,20 +99,14 @@ namespace PESA {
 
 
          void selectTracks( const TrackCollection* trackCollection,
-               ConstDataVector<TrackCollection>& mySelectedTrackCollection, std::vector<unsigned> &trackCounter   );
-
-         void reconstructVertices( ConstDataVector<TrackCollection>& mySelectedTrackCollection,
-               TrigVertexCollection& myVertexCollection,
-               DataVector< TrigVertexCollection >& mySplitVertexCollections );
+               ConstDataVector<TrackCollection>& mySelectedTrackCollection, std::vector<unsigned> &trackCounter ) const;
 
+         unsigned int reconstructVertices( ConstDataVector<TrackCollection>& mySelectedTrackCollection,
+                      TrigVertexCollection& myVertexCollection,
+                      DataVector< TrigVertexCollection >& mySplitVertexCollections, const EventContext& ) const;
 
          void reconstructSplitVertices( ConstDataVector<TrackCollection>& mySelectedTrackCollection,
-               DataVector< TrigVertexCollection >& mySplitVertexCollections, T2TrackClusterer& trackClusterer );
-
-
-         bool eventStage( Statistics stage );
-
-         void resetMonitoredVariables();
+               DataVector< TrigVertexCollection >& mySplitVertexCollections, T2TrackClusterer& trackClusterer, const EventContext& ) const;
 
          bool m_passNpvTrigCuts;
 
@@ -170,20 +163,24 @@ namespace PESA {
          unsigned int m_maxNpvTrigger;
 
          /* Monitor track parameters */
-         void monitor_tracks(std::string prefix, std::string suffix, std::vector<const T2Track*> tracks );
+         void monitor_tracks(const std::string& prefix, const std::string& suffix, const std::vector<T2Track>& tracks ) const;
 
          /* Monitor cluster parameters */
-         void monitor_cluster( const T2TrackClusterer& clusterer  );
+         void monitor_cluster( const T2TrackClusterer& clusterer  ) const;
 
          /* Monitor  parameters of tracks inside the cluster */
-         void monitor_cluster_tracks(T2TrackClusterer& clusterer, const Trk::Track & track  );
+         void monitor_cluster_tracks(T2TrackClusterer& clusterer, const Trk::Track & track  ) const;
 
          /* Monitor  vertex parameters  */
-         void monitor_vertex(std::string prefix, std::string suffix, const T2Vertex &vertex );
+         void monitor_vertex(const std::string& prefix, const std::string& suffix, const T2Vertex &vertex ) const;
+
+         std::string m_vertexCollName;
 
       private:
          ToolHandle<GenericMonitoringTool> m_monTool{this,"MonTool","","Monitoring tool"};
 
+         
+
 
    };
 
diff --git a/Trigger/TrigAlgorithms/TrigT2BeamSpot/src/T2Track.cxx b/Trigger/TrigAlgorithms/TrigT2BeamSpot/src/T2Track.cxx
index 61fff1f119d36e2a0e744dc78e3ccaf4f8924340..7dd0bfef22f3514c6eb390438247220bfe06f838 100644
--- a/Trigger/TrigAlgorithms/TrigT2BeamSpot/src/T2Track.cxx
+++ b/Trigger/TrigAlgorithms/TrigT2BeamSpot/src/T2Track.cxx
@@ -12,19 +12,6 @@
 
 namespace PESA
 {
-  double trackChi2Prob( const T2Track& track )
-  {
-    // FIXME: unify with vertexChi2Prob()
-    double chi2Prob = 0.;
-    const int    ndf  = track.NDF();
-    const double chi2 = track.Qual() * track.NDF();
-    if ( ndf  > 0  &&  chi2 > 0. && ! std::isinf( chi2 ) )
-      {
-        chi2Prob = TMath::Prob(chi2,ndf);
-      }
-    return chi2Prob;
-  }
-
 
   std::ostream& operator<<( std::ostream& os, const T2Track& track )
   {
diff --git a/Trigger/TrigAlgorithms/TrigT2BeamSpot/src/T2Track.h b/Trigger/TrigAlgorithms/TrigT2BeamSpot/src/T2Track.h
index 082d937fd6abb97c33785160956f005362ba51f1..08a9f9f9e50189e5a69f3ff7caff93b6acc2e2fe 100644
--- a/Trigger/TrigAlgorithms/TrigT2BeamSpot/src/T2Track.h
+++ b/Trigger/TrigAlgorithms/TrigT2BeamSpot/src/T2Track.h
@@ -16,7 +16,7 @@
 #ifndef TRIGT2BEAMSPOT_T2TRACK_H
 #define TRIGT2BEAMSPOT_T2TRACK_H
 /// Externals
-#include "TrkTrack/Track.h" 
+#include "TrkTrack/Track.h"
 #include "TrkTrackSummary/TrackSummary.h"
 #include "TrigInterfaces/IMonitoredAlgo.h"
 #include "GaudiKernel/SystemOfUnits.h"
@@ -26,86 +26,87 @@
 #include <vector>
 #include <cmath>
 #include <iostream>
-
+#include "TMath.h"
 
 namespace PESA {
 
   class T2Track;
 
-  double trackChi2Prob( const T2Track& track );
-
   class T2Track
   {
   public:
 
     // Constructor
     T2Track( const Trk::Track& track )
-      : m_Chi2Prob( -1.                           ) // lazy evaluation
-      {
-        
-        const Trk::TrackParameters* trackPars = track.perigeeParameters();
-        if (trackPars) {
-          m_D0 = trackPars->parameters()[Trk::d0]; 
-          m_Z0 = trackPars->parameters()[Trk::z0]; 
-          if (trackPars->covariance()) {
-            m_D0err = Amg::error(*(trackPars->covariance()),Trk::d0);
-            m_Z0err = Amg::error(*(trackPars->covariance()),Trk::z0);
+    {
+
+      const Trk::TrackParameters* trackPars = track.perigeeParameters();
+      if (trackPars) {
+        m_D0 = trackPars->parameters()[Trk::d0];
+        m_Z0 = trackPars->parameters()[Trk::z0];
+        if (trackPars->covariance()) {
+          m_D0err = Amg::error(*(trackPars->covariance()),Trk::d0);
+          m_Z0err = Amg::error(*(trackPars->covariance()),Trk::z0);
+        }
+        m_Phi = trackPars->parameters()[Trk::phi0];
+        float theta = trackPars->parameters()[Trk::theta];
+        m_Eta = -log(tan(0.5*theta));
+        float qOverP = trackPars->parameters()[Trk::qOverP];
+        m_Pt = std::abs(std::sin(theta)/qOverP)/Gaudi::Units::GeV;
+
+        const Trk::FitQuality* fq = track.fitQuality();
+        m_Qual = 1e8;
+        if (fq) {
+          if(fq->numberDoF()!=0) {
+            m_Qual = fq->chiSquared()/fq->numberDoF();
           }
-          m_Phi = trackPars->parameters()[Trk::phi0]; 
-          float theta = trackPars->parameters()[Trk::theta]; 
-          m_Eta = -log(tan(0.5*theta)); 
-          float qOverP = trackPars->parameters()[Trk::qOverP]; 
-          m_Pt = std::abs(std::sin(theta)/qOverP)/Gaudi::Units::GeV;
-
-          const Trk::FitQuality* fq = track.fitQuality();
-          m_Qual = 1e8;
-          //m_NDF = 0;
-          if (fq) {
-            if(fq->numberDoF()!=0) {
-              m_Qual = fq->chiSquared()/fq->numberDoF();
-              //m_NDF = fq->numberDoF() - 5;//Remove 5 helix parameters
+        }
+        int nPix=0;
+        int nSct=0;
+        if( track.trackSummary() != nullptr){
+          nPix =    track.trackSummary()->get(Trk::numberOfPixelHits);
+          nSct =  track.trackSummary()->get(Trk::numberOfSCTHits);
+        } else {
+          for(auto tSOS = track.trackStateOnSurfaces()->begin();
+              tSOS!=track.trackStateOnSurfaces()->end(); ++tSOS) {
+            if ((*tSOS)->type(Trk::TrackStateOnSurface::Perigee) == false) {
+              const Trk::FitQualityOnSurface* fq =  (*tSOS)->fitQualityOnSurface();
+              if(!fq) continue;
+              int nd = fq->numberDoF();
+              if(nd==2) nPix++;
+              if(nd==1) nSct++;
             }
           }
-          int nPix=0;
-          int nSct=0;
-	  if( track.trackSummary() != nullptr){
-	    nPix =    track.trackSummary()->get(Trk::numberOfPixelHits);
-	    nSct =  track.trackSummary()->get(Trk::numberOfSCTHits);
-	  } else {
-	    for(auto tSOS = track.trackStateOnSurfaces()->begin();  
-		tSOS!=track.trackStateOnSurfaces()->end(); ++tSOS) { 
-	      if ((*tSOS)->type(Trk::TrackStateOnSurface::Perigee) == false) {
-		const Trk::FitQualityOnSurface* fq =  (*tSOS)->fitQualityOnSurface(); 
-		if(!fq) continue; 
-		int nd = fq->numberDoF(); 
-		if(nd==2) nPix++;
-		if(nd==1) nSct++;
-	      }
-	    }
-	  }
-          m_PIXHits = nPix; 
-          m_SCTHits = nSct/2; 
-          m_SiHits = m_PIXHits + m_SCTHits; 
-          m_NDF = (m_PIXHits + m_SCTHits)*2 - 5;
-          m_TRTHits = 0; //for now: FTF tracks have no TRT extension in any case
         }
+        m_PIXHits = nPix;
+        m_SCTHits = nSct/2;
+        m_SiHits = m_PIXHits + m_SCTHits;
+        m_NDF = (m_PIXHits + m_SCTHits)*2 - 5;
+        m_TRTHits = 0; //for now: FTF tracks have no TRT extension in any case
       }
+      m_Chi2Prob = -1;
+      const double chi2 = m_Qual * m_NDF;
+      if ( m_NDF  > 0  &&  chi2 > 0. && ! std::isinf( chi2 ) )
+        {
+          m_Chi2Prob = TMath::Prob(chi2,m_NDF);
+        }
+    }
 
     // Accessors
-    double Pt      () const { return m_Pt     ; }
-    double Eta     () const { return m_Eta    ; }
-    double Phi     () const { return m_Phi    ; }
-    double Z0      () const { return m_Z0     ; }
-    double D0      () const { return m_D0     ; }
-    double Z0err   () const { return m_Z0err  ; }
-    double D0err   () const { return m_D0err  ; }
-    double NDF     () const { return m_NDF    ; }
-    double Qual    () const { return m_Qual   ; }
-    double Chi2Prob() const { if ( m_Chi2Prob < 0. ) m_Chi2Prob = trackChi2Prob( *this ); return m_Chi2Prob  ; }
-    int    SiHits  () const { return m_SiHits ; }
-    int    PIXHits () const { return m_PIXHits; }
-    int    SCTHits () const { return m_SCTHits; }
-    int    TRTHits () const { return m_TRTHits; }
+    double Pt      () const { return m_Pt      ; }
+    double Eta     () const { return m_Eta     ; }
+    double Phi     () const { return m_Phi     ; }
+    double Z0      () const { return m_Z0      ; }
+    double D0      () const { return m_D0      ; }
+    double Z0err   () const { return m_Z0err   ; }
+    double D0err   () const { return m_D0err   ; }
+    double NDF     () const { return m_NDF     ; }
+    double Qual    () const { return m_Qual    ; }
+    double Chi2Prob() const { return m_Chi2Prob; }
+    int    SiHits  () const { return m_SiHits  ; }
+    int    PIXHits () const { return m_PIXHits ; }
+    int    SCTHits () const { return m_SCTHits ; }
+    int    TRTHits () const { return m_TRTHits ; }
 
   private:
     // Data members
@@ -118,7 +119,7 @@ namespace PESA {
     double m_D0err;
     double m_NDF;
     double m_Qual;
-    mutable std::atomic<double> m_Chi2Prob;
+    double m_Chi2Prob;
     int    m_SiHits;
     int    m_PIXHits;
     int    m_SCTHits;
@@ -147,8 +148,8 @@ namespace PESA {
       m_D0      .push_back( track.D0      () );
       m_Z0err   .push_back( track.Z0err   () );
       m_D0err   .push_back( track.D0err   () );
-      m_NDF     .push_back( track.NDF     () );    
-      m_Qual    .push_back( track.Qual    () );    
+      m_NDF     .push_back( track.NDF     () );
+      m_Qual    .push_back( track.Qual    () );
       m_Chi2Prob.push_back( track.Chi2Prob() );
       m_SiHits  .push_back( track.SiHits  () );
       m_PIXHits .push_back( track.PIXHits () );
diff --git a/Trigger/TrigAlgorithms/TrigT2BeamSpot/src/T2TrackManager.cxx b/Trigger/TrigAlgorithms/TrigT2BeamSpot/src/T2TrackManager.cxx
index eb52dabe40b5318365c5743b929fa09e02244f43..f4d3d44de7d12a53da2810551dcfa9985dee898a 100644
--- a/Trigger/TrigAlgorithms/TrigT2BeamSpot/src/T2TrackManager.cxx
+++ b/Trigger/TrigAlgorithms/TrigT2BeamSpot/src/T2TrackManager.cxx
@@ -29,26 +29,11 @@ using std::abs;
 using namespace PESA;
 
 
-// Not much to do here now, will eventually init the config parameters
-T2TrackManager::T2TrackManager( int nSplit, Algorithm alg )
-  // Fill the defaults
-  : m_nSplit      ( nSplit )
-  , m_alg         ( alg    )
-  , m_altKey      ( -1     )
-  //, m_ordKey      ( 0      )
-{
-}
-
-
-// Will have to clean up after myself here
-T2TrackManager::~T2TrackManager()
-{
-}
-
 // The meat of the class, return a vector of split clusters
 std::vector< ConstDataVector<TrackCollection> >
-T2TrackManager::split( const TrackCollection& cluster )
+T2TrackManager::split( const TrackCollection& cluster, const EventContext& ctx ) const
 {
+  int key = ctx.eventID().event_number() %2 -1;
   const int nEntries = cluster.size();
 
   //std::cout << "Reserve space" << std::endl;
@@ -69,9 +54,9 @@ T2TrackManager::split( const TrackCollection& cluster )
     // tracks in the 1st collection
     int nPos = 0;
     if (m_alg == Alternating)
-      nPos = alternatingSplit();
+      nPos = alternatingSplit(key);
     else if (m_alg == Pt)
-      nPos = orderedSplit(nEntries);
+      nPos = orderedSplit(key, nEntries);
 
     // Add the track to the appropriate collection
     trackCollections[nPos].push_back(*c_itr);
@@ -82,18 +67,16 @@ T2TrackManager::split( const TrackCollection& cluster )
 }
 
 
-int
-T2TrackManager::alternatingSplit()
+constexpr int T2TrackManager::alternatingSplit(int key) const
 {
-  ++m_altKey;
-  m_altKey %= m_nSplit;
-  return m_altKey;
+  ++key;
+  key %= m_nSplit;
+  return key;
 }
 
 
-int
-T2TrackManager::orderedSplit(const int nEntries)
+constexpr int T2TrackManager::orderedSplit(int key, const int nEntries) const
 {
-  ++m_altKey;
-  return m_altKey * m_nSplit / nEntries;
+  ++key;
+  return key * m_nSplit / nEntries;
 }
diff --git a/Trigger/TrigAlgorithms/TrigT2BeamSpot/src/T2TrackManager.h b/Trigger/TrigAlgorithms/TrigT2BeamSpot/src/T2TrackManager.h
index 1a2c44aa5a8d5813ebb5c0736216a50cf5c45857..d7a238629b9087652050809e440ebaeb479e2a11 100644
--- a/Trigger/TrigAlgorithms/TrigT2BeamSpot/src/T2TrackManager.h
+++ b/Trigger/TrigAlgorithms/TrigT2BeamSpot/src/T2TrackManager.h
@@ -37,34 +37,18 @@ namespace PESA
     // List of the splitter algorithms
     enum Algorithm { Alternating, Pt, Phi, NorthSouth, Charge };
 
-    // Constructor/Destructor
-    T2TrackManager( int nSplit = 2, Algorithm alg = Alternating );
-
-    ~T2TrackManager();
-
     // Return a vector of sub-clusters
-    std::vector< ConstDataVector<TrackCollection> >          split( const TrackCollection& cluster);
+    std::vector< ConstDataVector<TrackCollection> > split(const TrackCollection& cluster, const EventContext& ctx) const;
 
-    // Get and Set parameters
-    //    int GetNSplit() {return m_nSplit;}
-    //    int GetAlg() {return m_alg;}
-    //    void SetNSplit(int nSplit) {m_nSplit = nSplit;}
-    //    void SetAlg(int alg) {m_alg = alg;}
-    void ResetKey(int key = -1) { m_altKey = key;}
-    
   private:
     
     // The splitter algorithms
-    int alternatingSplit();         // 1 for me, 1 for you, 2 for me, ...
-    int orderedSplit(int nEntries); // 1, 2, 3 for me, 1, 2, 3 for you ...
+    constexpr int alternatingSplit(int key) const;         // 1 for me, 1 for you, 2 for me, ...
+    constexpr int orderedSplit(int key, int nEntries) const; // 1, 2, 3 for me, 1, 2, 3 for you ...
     
     /// Data members
-    int m_nSplit;      // How many output clusters
-    int m_alg;         // Which algorithm to use
-    
-    /// Algorithm helper objects
-    int m_altKey;     // Alternating split key
-    //int m_ordKey;     // Ordered split key
+    int m_nSplit = 2;      // How many output clusters
+    int m_alg = Alternating;         // Which algorithm to use
   };
 
 } //PESA
diff --git a/Trigger/TrigAlgorithms/TrigT2BeamSpot/src/T2VertexBeamSpot.cxx b/Trigger/TrigAlgorithms/TrigT2BeamSpot/src/T2VertexBeamSpot.cxx
index b64d686df2874d185416c142e3618648d6e94e9c..0ed455d0a96ba7c7a161ba52530945b532a66198 100644
--- a/Trigger/TrigAlgorithms/TrigT2BeamSpot/src/T2VertexBeamSpot.cxx
+++ b/Trigger/TrigAlgorithms/TrigT2BeamSpot/src/T2VertexBeamSpot.cxx
@@ -104,19 +104,14 @@ HLT::ErrorCode T2VertexBeamSpot::hltExecute( std::vector< HLT::TEVec >& tes_in,
   // Start the overall timer
   auto tTotal = Monitored::Timer("TIME_TotalTime");
 
-  //Reset monitored variables from previous event 
-  m_beamSpotTool->resetMonitoredVariables();
-  // Initialize booleans for event stats
-  m_beamSpotTool->m_eventStageFlag = std::vector<bool>( numStatistics, false );
-  m_beamSpotTool->eventStage( allInput );
-
   // Initialize vertex collections
   TrigVertexCollection myVertexCollection;
   DataVector< TrigVertexCollection > mySplitVertexCollections;
 
   // Be optimistic
   HLT::ErrorCode errorCode = HLT::OK;
-
+  unsigned int nPassVtx = 0;
+  const EventContext& ctx = Algorithm::getContext();
   // Process event - break to do cleanup before returning
   do 
     {
@@ -128,8 +123,6 @@ HLT::ErrorCode T2VertexBeamSpot::hltExecute( std::vector< HLT::TEVec >& tes_in,
       }
       else ATH_MSG_DEBUG( "Number of input TEs = " << tes_in.size() );
   
-      m_beamSpotTool->eventStage( hasTE );
-      
       //-----------------
       // Track selection
 
@@ -225,20 +218,16 @@ HLT::ErrorCode T2VertexBeamSpot::hltExecute( std::vector< HLT::TEVec >& tes_in,
 
 
 
-      m_beamSpotTool->eventStage( hasSeedTrack );
-
       // Check for the total number of available tracks
       if( m_beamSpotTool->notEnoughTracks( nSelectedTracks ) ){
          ATH_MSG_DEBUG( " Not enough total passed tracks to vertex");
          break;
       }
 
-      m_beamSpotTool->eventStage( enoughTracks );
-
       //-----------------------
       // Vertex reconstruction
       // Cluster tracks in z around seed track and reconstruct vertices
-      m_beamSpotTool->reconstructVertices( mySelectedTrackCollection, myVertexCollection, mySplitVertexCollections );
+      nPassVtx = m_beamSpotTool->reconstructVertices( mySelectedTrackCollection, myVertexCollection, mySplitVertexCollections, ctx );
 
     } while (false);
 
@@ -258,9 +247,6 @@ HLT::ErrorCode T2VertexBeamSpot::hltExecute( std::vector< HLT::TEVec >& tes_in,
    HLT::TEVec allTEs =  getAllTEs(tes_in);
    ATH_MSG_DEBUG( "n of all TEs: " << allTEs.size() );
 
-   //Check how many vertices passed the selection
-   unsigned int nPassedVtx = m_beamSpotTool->m_NvtxPass;
-
    //Save all events, or only those events which pass the Npv cuts (if activated)!
    if ( m_activateAllTE ) {
       ATH_MSG_DEBUG( "Activate all TEs" );
@@ -270,10 +256,10 @@ HLT::ErrorCode T2VertexBeamSpot::hltExecute( std::vector< HLT::TEVec >& tes_in,
    }
 
 
-   if ( ! m_activateAllTE && m_activateTE && nPassedVtx > 0 ) {
-      ATH_MSG_DEBUG( "Activate TE with "<< nPassedVtx << " vertices" );
+   if ( ! m_activateAllTE && m_activateTE && nPassVtx > 0 ) {
+      ATH_MSG_DEBUG( "Activate TE with "<< nPassVtx << " vertices" );
       // FIXME: Why do we need one TE per vertex?
-      for ( unsigned i=0; i < nPassedVtx; ++i ) {
+      for ( unsigned i=0; i < nPassVtx; ++i ) {
          // Create an output TE seeded by the inputs
          HLT::TriggerElement* outputTE = config()->getNavigation()->addNode(allTEs, type_out);
          outputTE->setActiveState(true);
@@ -299,10 +285,6 @@ HLT::ErrorCode T2VertexBeamSpot::hltExecute( std::vector< HLT::TEVec >& tes_in,
 
 
 
-   //Monitoring eventStatistics
-   auto eventStatistics = Monitored::Collection("EventStatistics", m_beamSpotTool->m_eventStage );
-   auto mon = Monitored::Group(m_monTool,  eventStatistics, timeToCreateOutput );
-
   // Return cause you're done!
   return errorCode;
 }
@@ -418,25 +400,10 @@ StatusCode T2VertexBeamSpot::execute(){
 
    ATH_MSG_DEBUG( "Beam spot algorithm execute method" );
 
-
-
-   //Reset monitored variables from previous event
-   m_beamSpotTool->resetMonitoredVariables();
-   // Initialize booleans for event stats
-   m_beamSpotTool->m_eventStageFlag = std::vector<bool>( numStatistics, false );
-   m_beamSpotTool->eventStage( allInput );
-
    const EventContext& ctx = Algorithm::getContext();
-   ATH_MSG_DEBUG( "Run: " << ctx.eventID().run_number() <<
-         " Event Number: " << ctx.eventID().event_number() <<
-         " Lumi Block: " << ctx.eventID().lumi_block() <<
-         " Bunch Crossing ID " << ctx.eventID().bunch_crossing_id() );
-
-   //Pass event ID for vertex splitting alg, TODO: need to revisit 
-   m_beamSpotTool->m_EventID = ctx.eventID().event_number() ;
 
    //// Initialize vertex collections
-   SG::WriteHandle<TrigVertexCollection> myVertexCollection(m_outputVertexCollectionKey);
+   SG::WriteHandle<TrigVertexCollection> myVertexCollection(m_outputVertexCollectionKey, ctx);
    myVertexCollection = std::make_unique<TrigVertexCollection>();
 
    //Need to convert to the write handles
@@ -452,7 +419,6 @@ StatusCode T2VertexBeamSpot::execute(){
    unsigned nHighPtTracks = 0;
 
    ATH_MSG_DEBUG( "Selecting tracks" );
-   //Loop over trackCollections
    {
       //Monitor how long does it take to loop over all collections
       auto tSelectingTracks = Monitored::Timer("TIME_SelectingTracks");
@@ -462,7 +428,7 @@ StatusCode T2VertexBeamSpot::execute(){
       auto nTotalPassedTracks = Monitored::Scalar<unsigned>("nTotalPassedTracks");
       auto nTotalHighPTTracks = Monitored::Scalar<unsigned>("nTotalHighPTTracks");
       //Loop over track collections and select tracks
-      SG::ReadHandle<TrackCollection> trackCollection (m_trackCollectionKey);
+      SG::ReadHandle<TrackCollection> trackCollection (m_trackCollectionKey, ctx);
       ATH_CHECK(trackCollection.isValid());
 
       //Dereference tracks
@@ -494,37 +460,28 @@ StatusCode T2VertexBeamSpot::execute(){
       return StatusCode::SUCCESS;
    }
 
-   m_beamSpotTool->eventStage( hasSeedTrack );
-
    // Check for the total number of available tracks
    if (  ( m_beamSpotTool->notEnoughTracks(nSelectedTracks)) ) {
       ATH_MSG_DEBUG( "Not enough total passed tracks to vertex");
       return StatusCode::SUCCESS;
    }
 
-   m_beamSpotTool->eventStage( enoughTracks );
-
    ATH_MSG_DEBUG( "Reconstruct vertices" );
    //Reconstruct vertices if passed track selection
    {
       //Monitor how long does it take to loop over all collections
       auto tReconstructVertices = Monitored::Timer("TIME_ReconstructVertices");
-      m_beamSpotTool->reconstructVertices( mySelectedTrackCollection, *myVertexCollection, mySplitVertexCollections );
+      m_beamSpotTool->reconstructVertices( mySelectedTrackCollection, *myVertexCollection, mySplitVertexCollections, ctx );
       //Monitor total number of tracks
       auto monitor = Monitored::Group(m_monTool, tReconstructVertices);
    }
 
-   //Do i want to call createOutputTEs even if the conditions are not fulfilled?
    ATH_MSG_DEBUG( "Number of track collection containers: " << mySelectedTrackCollection.size() );
 
    //What should go as an output? SelectedTrackCollection and Vertices?
    //Atm just try add vertex
    //TODO: adding split vertices as well, will need an array
 
-
-   //Monitoring eventStatistics
-   auto eventStatistics = Monitored::Collection("EventStatistics", m_beamSpotTool->m_eventStage );
-   auto monitor = Monitored::Group(m_monTool, eventStatistics, tTotal);
    return StatusCode::SUCCESS;
 } 
 
diff --git a/Trigger/TrigAlgorithms/TrigT2BeamSpot/src/T2VertexBeamSpotTool.cxx b/Trigger/TrigAlgorithms/TrigT2BeamSpot/src/T2VertexBeamSpotTool.cxx
index e0e9a225143bfc6df2a9cb1e4f4dbde114558186..81e8fda7e0e0204d5b6cb99acfb800d5167c2ee1 100644
--- a/Trigger/TrigAlgorithms/TrigT2BeamSpot/src/T2VertexBeamSpotTool.cxx
+++ b/Trigger/TrigAlgorithms/TrigT2BeamSpot/src/T2VertexBeamSpotTool.cxx
@@ -42,16 +42,6 @@ using std::abs;
 using namespace PESA;
 
 
-//Delete a vector of dynamically created objects
-template<typename T>
-void deleteVector(std::vector<T*> &v){
-   while(!v.empty()){
-      delete v.back();
-      v.pop_back();
-   }
-   v.clear();
-}
-
 namespace Beamspot
 { 
   class TrackPTSort{
@@ -81,7 +71,6 @@ PESA::T2VertexBeamSpotTool::T2VertexBeamSpotTool( const std::string& type, const
    : AthAlgTool( type, name, parent),
    m_primaryVertexFitterTool("TrigInDetToolInterfaces/ITrigPrimaryVertexFitter", this){
 
-   declareInterface<IT2VertexBeamSpotTool>(this);
    //Declare properties in here
    declareProperty( "BeamSpotData",  m_beamSpotKey   );
    declareProperty( "PrimaryVertexFitter",  m_primaryVertexFitterTool);
@@ -165,7 +154,7 @@ StatusCode T2VertexBeamSpotTool::initialize(){
 *  Detailed description of the select track function
  ***********************************************/
 void T2VertexBeamSpotTool::selectTracks( const TrackCollection* trackCollection,
-      ConstDataVector<TrackCollection>& mySelectedTrackCollection, std::vector<unsigned> &trackCounter ) {
+      ConstDataVector<TrackCollection>& mySelectedTrackCollection, std::vector<unsigned> &trackCounter ) const {
 
    ATH_MSG_DEBUG( "Selecting tracks for the beamSpot algorithm" );
 
@@ -177,7 +166,7 @@ void T2VertexBeamSpotTool::selectTracks( const TrackCollection* trackCollection,
    auto nHiPTTracksPassedPerROI = Monitored::Scalar<unsigned>("SelectedHiPTTracksPerROI", 0);
 
    //T2Track with easily accesable parameters
-   std::vector<const T2Track*> myTracks; myTracks.reserve(trackCollection->size() );
+   std::vector<T2Track> myTracks; myTracks.reserve(trackCollection->size() );
 
    // Loop over all tracks in the given track collections
    for ( TrackCollection::const_iterator trackIter = trackCollection->begin();
@@ -186,13 +175,12 @@ void T2VertexBeamSpotTool::selectTracks( const TrackCollection* trackCollection,
       const Trk::Track& track = **trackIter;
 
       // Make sure that the event has tracks
-      eventStage( hasTracks );
       //Counter for all input tracks
       nTracksPerROI++;
 
-      const T2Track *myTrack = new T2Track( track );
+      T2Track myTrack( track );
       // Check for passed track
-      if ( isGoodTrack( *myTrack ) ) {
+      if ( isGoodTrack( myTrack ) ) {
          // Add this track to the set used to find a vertex
          mySelectedTrackCollection.push_back( *trackIter );
 
@@ -203,22 +191,22 @@ void T2VertexBeamSpotTool::selectTracks( const TrackCollection* trackCollection,
          nTracksPassedPerROI++;
 
          // Check for high-pT track
-         if ( myTrack->Pt() > m_trackSeedPt ){
+         if ( myTrack.Pt() > m_trackSeedPt ){
             //Counter for high pT tracks
             nHiPTTracksPassedPerROI++;
          }
-         else ATH_MSG_DEBUG( "Track->pt: " << myTrack->Pt()*GeV );
+         else ATH_MSG_DEBUG( "Track.pt: " << myTrack.Pt()*GeV );
       }
       else {
-         ATH_MSG_DEBUG( "Track->failed selection: d0: " << myTrack->D0() <<
-               " z0: " << myTrack->Z0() <<
-               " phi0: " << myTrack->Phi() <<
-               " eta: " << myTrack->Eta() <<
-               " pT: " << myTrack->Pt()*GeV <<
-               " chi2: " << myTrack->Qual() <<
-               " NpixSPs: " << myTrack->PIXHits() <<
-               " NsctSPs: " << myTrack->SCTHits() <<
-               " NstrawHits: " << myTrack->TRTHits() );
+         ATH_MSG_DEBUG( "Track.failed selection: d0: " << myTrack.D0() <<
+               " z0: " << myTrack.Z0() <<
+               " phi0: " << myTrack.Phi() <<
+               " eta: " << myTrack.Eta() <<
+               " pT: " << myTrack.Pt()*GeV <<
+               " chi2: " << myTrack.Qual() <<
+               " NpixSPs: " << myTrack.PIXHits() <<
+               " NsctSPs: " << myTrack.SCTHits() <<
+               " NstrawHits: " << myTrack.TRTHits() );
       }
    } //end for loop over tracks in a collection
 
@@ -236,14 +224,12 @@ void T2VertexBeamSpotTool::selectTracks( const TrackCollection* trackCollection,
       //Monitor counters per track collection and time to select tracks
       auto mon = Monitored::Group(m_monTool, nTracksPerROI, nTracksPassedPerROI, nHiPTTracksPassedPerROI,
                  timerTrackSelection ); //timers
-      //clear tracks
-      deleteVector( myTracks );
 }
 
 
-void T2VertexBeamSpotTool::reconstructVertices( ConstDataVector<TrackCollection>& mySelectedTrackCollection,
+unsigned int T2VertexBeamSpotTool::reconstructVertices( ConstDataVector<TrackCollection>& mySelectedTrackCollection,
                                            TrigVertexCollection& myVertexCollection,
-                                           DataVector< TrigVertexCollection >&  mySplitVertexCollections) {
+                                           DataVector< TrigVertexCollection >&  mySplitVertexCollections, const EventContext& ctx) const {
     ATH_MSG_DEBUG( "Reconstructing vertices" );
 
    //Monitoring counters and timers
@@ -309,7 +295,6 @@ void T2VertexBeamSpotTool::reconstructVertices( ConstDataVector<TrackCollection>
       }
 
       // Event has a good cluster
-      eventStage( hasCluster );
       nClusters++;
 
       // Monitor properties of of the cluster
@@ -339,14 +324,11 @@ void T2VertexBeamSpotTool::reconstructVertices( ConstDataVector<TrackCollection>
          continue; 
       }
 
-      // Event has a vertex!
-      eventStage( hasVertex );
-
       // Update vertex counter
       nVtx++;
 
       // Extract beam spot parameters
-      SG::ReadCondHandle<InDet::BeamSpotData> beamSpotHandle { m_beamSpotKey };
+      SG::ReadCondHandle<InDet::BeamSpotData> beamSpotHandle { m_beamSpotKey, ctx };
 
       T2BeamSpot beamSpot(*beamSpotHandle);
 
@@ -369,10 +351,7 @@ void T2VertexBeamSpotTool::reconstructVertices( ConstDataVector<TrackCollection>
       // Add primary vertex to collection
       myVertexCollection.push_back( primaryVertex ); // passes ownership to vertex collection
 
-      // Event has good vertex
-      eventStage( hasGoodVertex );
-
-      //Monito parameters of the  passed vertex 
+      //Monitor parameters of the  passed vertex 
       monitor_vertex( "Vertex", "Pass", myVertex ); 
 
       //Update good vertex counter
@@ -405,7 +384,7 @@ void T2VertexBeamSpotTool::reconstructVertices( ConstDataVector<TrackCollection>
          {
             // Split, optinally re-cluster, and fit separate vertices
             ATH_MSG_DEBUG( "Reconstruct split vertices");
-            reconstructSplitVertices( mySplitTrackCollection, mySplitVertexCollections, trackClusterer );
+            reconstructSplitVertices( mySplitTrackCollection, mySplitVertexCollections, trackClusterer, ctx );
          }
          // Alternative 3: Split all the tracks and iterate with the remaining tracks
          //          mySplitTrackCollection = mySelectedTrackCollection;
@@ -426,19 +405,15 @@ void T2VertexBeamSpotTool::reconstructVertices( ConstDataVector<TrackCollection>
 
     }//End looping over tracks
 
-  //Store flag whether the nvtx passed trig cuts
-  m_passNpvTrigCuts =  (m_minNpvTrigger <= nPassVtx) && (nPassVtx <= m_maxNpvTrigger); 
-  //Keep the track of how many vertices passed the selection
-  m_NvtxPass  = nPassVtx;
-
   //monitor number of (passed) vertices, clusters, etc
   auto mon = Monitored::Group(m_monTool,  nVtx, nPassVtx, nPassBCIDVtx, nClusters, timerVertexRec );
+  return static_cast<unsigned int>(nPassVtx);
 }
 
 
 void T2VertexBeamSpotTool::reconstructSplitVertices( ConstDataVector<TrackCollection>& myFullTrackCollection,
                                                 DataVector< TrigVertexCollection >& mySplitVertexCollections,
-                                                T2TrackClusterer& trackClusterer ) {
+                                                T2TrackClusterer& trackClusterer, const EventContext& ctx ) const {
   auto timerVertexRec = Monitored::Timer("TIME_SplitVertexReconstruction");
 
 
@@ -449,10 +424,8 @@ void T2VertexBeamSpotTool::reconstructSplitVertices( ConstDataVector<TrackCollec
      auto mon = Monitored::Group(m_monTool,  timeToSortTracks ); 
   }
 
-  // Split the track collection (typically into halves)
   // This returns m_nSplitVertices (ideally) or fewer (if clustering fails) track collections
-  m_trackManager.ResetKey( m_EventID % 2 - 1 );
-  vector< ConstDataVector<TrackCollection> > splitTrackCollections = m_trackManager.split( *myFullTrackCollection.asDataVector() );
+  vector< ConstDataVector<TrackCollection> > splitTrackCollections = m_trackManager.split( *myFullTrackCollection.asDataVector(), ctx );
 
   // Add a new track collection for the split vertices corresponding to this primary vertex
   // There can be anywhere between zero and m_nSplitVertices entries in the collection
@@ -582,38 +555,29 @@ bool T2VertexBeamSpotTool::isGoodVertexBCID( const T2Vertex& vertex ) const {
      );
 }
 
-void T2VertexBeamSpotTool::resetMonitoredVariables() {
-   if(m_eventStageFlag.size() != 0 ) m_eventStageFlag.clear();
-   if(m_eventStage.size() != 0 ) m_eventStage.clear();
-   //Reset all variables just in case
-   m_NvtxPass = 0;
-   m_passNpvTrigCuts = false;
-
-}
-
 
 //Monitoring track variables
-void T2VertexBeamSpotTool::monitor_tracks(std::string prefix, std::string suffix, std::vector<const T2Track*> tracks ){
-   auto  trackPt      = Monitored::Collection(  prefix + "Pt"       + suffix, tracks, [](const T2Track *t){ return t->Pt()      ;});
-   auto  trackEta     = Monitored::Collection(  prefix + "Eta"      + suffix, tracks, [](const T2Track *t){ return t->Eta()     ;});
-   auto  trackPhi     = Monitored::Collection(  prefix + "Phi"      + suffix, tracks, [](const T2Track *t){ return t->Phi()     ;});
-   auto  trackZ0      = Monitored::Collection(  prefix + "Z0"       + suffix, tracks, [](const T2Track *t){ return t->Z0()      ;});
-   auto  trackD0      = Monitored::Collection(  prefix + "D0"       + suffix, tracks, [](const T2Track *t){ return t->D0()      ;});
-   auto  trackZ0err   = Monitored::Collection(  prefix + "Z0err"    + suffix, tracks, [](const T2Track *t){ return t->Z0err()   ;});
-   auto  trackD0err   = Monitored::Collection(  prefix + "D0err"    + suffix, tracks, [](const T2Track *t){ return t->D0err()   ;});
-   auto  trackNDF     = Monitored::Collection(  prefix + "NDF"      + suffix, tracks, [](const T2Track *t){ return t->NDF()     ;});
-   auto  trackQual    = Monitored::Collection(  prefix + "Qual"     + suffix, tracks, [](const T2Track *t){ return t->Qual()    ;});
-   auto  trackChi2Prob= Monitored::Collection(  prefix + "Chi2Prob" + suffix, tracks, [](const T2Track *t){ return t->Chi2Prob();});
-   auto  trackSiHits  = Monitored::Collection(  prefix + "SiHits"   + suffix, tracks, [](const T2Track *t){ return t->SiHits()  ;});
-   auto  trackPiHits  = Monitored::Collection(  prefix + "PIXHits"  + suffix, tracks, [](const T2Track *t){ return t->PIXHits() ;});
-   auto  trackSCTHits = Monitored::Collection(  prefix + "SCTHits"  + suffix, tracks, [](const T2Track *t){ return t->SCTHits() ;});
-   auto  trackTRTHits = Monitored::Collection(  prefix + "TRTHits"  + suffix, tracks, [](const T2Track *t){ return t->TRTHits() ;});
+void T2VertexBeamSpotTool::monitor_tracks(const std::string& prefix, const std::string& suffix, const std::vector<T2Track>& tracks ) const {
+   auto  trackPt      = Monitored::Collection(  prefix + "Pt"       + suffix, tracks, [](const T2Track t){ return t.Pt()      ;});
+   auto  trackEta     = Monitored::Collection(  prefix + "Eta"      + suffix, tracks, [](const T2Track t){ return t.Eta()     ;});
+   auto  trackPhi     = Monitored::Collection(  prefix + "Phi"      + suffix, tracks, [](const T2Track t){ return t.Phi()     ;});
+   auto  trackZ0      = Monitored::Collection(  prefix + "Z0"       + suffix, tracks, [](const T2Track t){ return t.Z0()      ;});
+   auto  trackD0      = Monitored::Collection(  prefix + "D0"       + suffix, tracks, [](const T2Track t){ return t.D0()      ;});
+   auto  trackZ0err   = Monitored::Collection(  prefix + "Z0err"    + suffix, tracks, [](const T2Track t){ return t.Z0err()   ;});
+   auto  trackD0err   = Monitored::Collection(  prefix + "D0err"    + suffix, tracks, [](const T2Track t){ return t.D0err()   ;});
+   auto  trackNDF     = Monitored::Collection(  prefix + "NDF"      + suffix, tracks, [](const T2Track t){ return t.NDF()     ;});
+   auto  trackQual    = Monitored::Collection(  prefix + "Qual"     + suffix, tracks, [](const T2Track t){ return t.Qual()    ;});
+   auto  trackChi2Prob= Monitored::Collection(  prefix + "Chi2Prob" + suffix, tracks, [](const T2Track t){ return t.Chi2Prob();});
+   auto  trackSiHits  = Monitored::Collection(  prefix + "SiHits"   + suffix, tracks, [](const T2Track t){ return t.SiHits()  ;});
+   auto  trackPiHits  = Monitored::Collection(  prefix + "PIXHits"  + suffix, tracks, [](const T2Track t){ return t.PIXHits() ;});
+   auto  trackSCTHits = Monitored::Collection(  prefix + "SCTHits"  + suffix, tracks, [](const T2Track t){ return t.SCTHits() ;});
+   auto  trackTRTHits = Monitored::Collection(  prefix + "TRTHits"  + suffix, tracks, [](const T2Track t){ return t.TRTHits() ;});
    auto mon = Monitored::Group(m_monTool, trackPt, trackEta, trackPhi, trackZ0, trackD0, trackZ0err, trackD0err,
                                trackNDF, trackQual, trackChi2Prob, trackSiHits, trackPiHits, trackSCTHits, trackTRTHits );
 }
 
 
-void T2VertexBeamSpotTool::monitor_cluster( const T2TrackClusterer& clusterer  ){
+void T2VertexBeamSpotTool::monitor_cluster( const T2TrackClusterer& clusterer  ) const {
    auto  clusterZ                = Monitored::Scalar<double>("ClusterZ", clusterer.seedZ0()            );
    auto  clusterNtracks          = Monitored::Scalar<int>("ClusterZ", clusterer.cluster().size()       );
    auto  clusterNUnusedTracks    = Monitored::Scalar<int>("ClusterZ", clusterer.unusedTracks().size()  );
@@ -622,7 +586,7 @@ void T2VertexBeamSpotTool::monitor_cluster( const T2TrackClusterer& clusterer  )
 }
 
 
-void T2VertexBeamSpotTool::monitor_cluster_tracks(T2TrackClusterer &clusterer, const Trk::Track &track  ){
+void T2VertexBeamSpotTool::monitor_cluster_tracks(T2TrackClusterer &clusterer, const Trk::Track &track  ) const {
    const double deltaZ0 = track.perigeeParameters()->parameters()[Trk::z0] - clusterer.seedZ0();
    const AmgSymMatrix(5)& perigeeCov = *track.perigeeParameters()->covariance();
    const double z0Error = std::sqrt(perigeeCov(Trk::z0,Trk::z0));
@@ -635,7 +599,7 @@ void T2VertexBeamSpotTool::monitor_cluster_tracks(T2TrackClusterer &clusterer, c
 
 
 
-void T2VertexBeamSpotTool::monitor_vertex(std::string prefix, std::string suffix, const T2Vertex &vertex ){
+void T2VertexBeamSpotTool::monitor_vertex(const std::string& prefix, const std::string& suffix, const T2Vertex &vertex ) const {
 
    auto ntrk      = Monitored::Scalar<int>   ( prefix + "NTrks"      + suffix, vertex.NTrks()      ); 
    auto sumpt     = Monitored::Scalar<double>( prefix + "SumPt"      + suffix, vertex.SumPt()      ); 
@@ -662,13 +626,4 @@ void T2VertexBeamSpotTool::monitor_vertex(std::string prefix, std::string suffix
   
 
 
-bool T2VertexBeamSpotTool::eventStage( Statistics stage ) {
-   if ( ! m_eventStageFlag[ stage ] )
-   {
-      m_eventStageFlag[ stage ] = true;
-      m_eventStage.push_back( stage );
-      return true;
-   }
-   return false;
-}
 
diff --git a/Trigger/TrigAlgorithms/TrigT2BeamSpot/src/components/TrigT2BeamSpot_entries.cxx b/Trigger/TrigAlgorithms/TrigT2BeamSpot/src/components/TrigT2BeamSpot_entries.cxx
index 37ef18d64c355899d1e85bd409ef5ee4980ceb3f..e096e800861ba4ff758ff19abf5026221f0d2ddf 100644
--- a/Trigger/TrigAlgorithms/TrigT2BeamSpot/src/components/TrigT2BeamSpot_entries.cxx
+++ b/Trigger/TrigAlgorithms/TrigT2BeamSpot/src/components/TrigT2BeamSpot_entries.cxx
@@ -1,4 +1,3 @@
-#include "TrigT2BeamSpot/IT2VertexBeamSpotTool.h"
 #include "TrigT2BeamSpot/T2VertexBeamSpotTool.h"
 #include "TrigT2BeamSpot/T2VertexBeamSpot.h"