diff --git a/InnerDetector/InDetRecTools/SiSpacePointsSeedTool_xk/SiSpacePointsSeedTool_xk/SiSpacePointsSeedMaker_Cosmic.h b/InnerDetector/InDetRecTools/SiSpacePointsSeedTool_xk/SiSpacePointsSeedTool_xk/SiSpacePointsSeedMaker_Cosmic.h
index a50b440fef7669bb8eddbd804f2ff4b4dd89bebd..1ba707c0a9e2f5196c0fc9c304f17eba7a3759fb 100644
--- a/InnerDetector/InDetRecTools/SiSpacePointsSeedTool_xk/SiSpacePointsSeedTool_xk/SiSpacePointsSeedMaker_Cosmic.h
+++ b/InnerDetector/InDetRecTools/SiSpacePointsSeedTool_xk/SiSpacePointsSeedTool_xk/SiSpacePointsSeedMaker_Cosmic.h
@@ -32,6 +32,7 @@
 #include <iosfwd>
 #include <list>
 #include <map>
+#include <mutex>
 #include <vector>
 
 class MsgStream;
@@ -118,83 +119,97 @@ namespace InDet {
     ServiceHandle<MagField::IMagFieldSvc>  m_fieldServiceHandle{this, "MagFieldSvc", "AtlasFieldSvc"};
     PublicToolHandle<Trk::IPRD_AssociationTool> m_assoTool{this, "AssociationTool", "InDet::InDetPRD_AssociationToolGangedPixels"};
 
+    ///////////////////////////////////////////////////////////////////
+    // Space points container
+    ///////////////////////////////////////////////////////////////////
+    SG::ReadHandleKey<SpacePointContainer> m_spacepointsSCT{this, "SpacePointsSCTName", "SCT_SpacePoints"};
+    SG::ReadHandleKey<SpacePointContainer> m_spacepointsPixel{this, "SpacePointsPixelName", "PixelSpacePoints"};
+    SG::ReadHandleKey<SpacePointOverlapCollection> m_spacepointsOverlap{this, "SpacePointsOverlapName", "OverlapSpacePoints"};
+
+    // Properties, which will not be changed after construction
     BooleanProperty m_pixel{this, "usePixel", true};
     BooleanProperty m_sct{this, "useSCT", true};
-    bool m_endlist{true};
     BooleanProperty m_useOverlap{this, "useOverlapSpCollection", false};
     BooleanProperty m_useassoTool{this, "UseAssociationTool", false};
-    BooleanProperty m_checketa{this, "checkEta", false};
-    int                         m_outputlevel {};
-    int                         m_nprint {};
-    bool m_state{0};
-    int m_nspoint{2};
-    int m_mode{0};
-    int m_nlist{0};
     IntegerProperty m_maxsize{this, "maxSize", 100};
-    int                         m_nseeds {};
-    FloatProperty m_ptmin{this, "pTmin", 500.};
+    IntegerProperty m_maxsizeSP{this, "maxSizeSP", 1500};
     FloatProperty m_drmin{this, "mindRadius", 5.};
     FloatProperty m_drmax{this, "maxdRadius", 1000.};
+    FloatProperty m_r_rmax{this, "radMax", 600.};
+    FloatProperty m_r_rstep{this, "radStep", 5.};
+
+    // Properties, which can be updated in initialize
+    FloatProperty m_ptmin{this, "pTmin", 500.};
     FloatProperty m_rapcut{this, "RapidityCut", 2.3};
-    float                       m_dzdrmin {};
-    float                       m_dzdrmax {};
+
+    // Properties, which are not used in this implementation of SiSpacePointsSeedMaker_Cosmic class
+    BooleanProperty m_checketa{this, "checkEta", false};
     FloatProperty m_zmin{this, "minZ", -10000.};
     FloatProperty m_zmax{this, "maxZ", +10000.};
-    FloatProperty m_r_rmax{this, "radMax", 600.};
-    FloatProperty m_r_rstep{this, "radStep", 5.};
     FloatProperty m_diver{this, "maxdImpact", 10.};
-    float                       m_dazmax  {};
     FloatProperty m_diverpps{this, "maxdImpactPPS", 0.};
     FloatProperty m_diversss{this, "maxdImpactSSS", 0.};
     FloatProperty m_etamin{this, "etaMin", 0.};
     FloatProperty m_etamax{this, "etaMax", 0.};
-    int m_r_size {};
-    int m_rf_size {};
-    int m_rfz_size {};
-    std::vector<std::list<InDet::SiSpacePointForSeed*>> m_r_Sorted;
-    std::list<InDet::SiSpacePointForSeed*>  m_rf_Sorted[SizeRF];
-    std::list<InDet::SiSpacePointForSeed*>  m_rfz_Sorted[SizeRFZ];
-    std::list<InDet::SiSpacePointForSeed> m_l_spforseed;
-    std::list<InDet::SiSpacePointForSeed>::iterator m_i_spforseed;
-    std::list<InDet::SiSpacePointForSeed*>::iterator m_rMin;
-
-    int m_ns{} ,m_nsaz {};
-    int m_fNmax  {};
-    int m_fNmin{};
-    int m_zMin {};
-    int  m_nr{};
-    std::vector<int> m_r_index;
-    std::vector<int> m_r_map;
-    int  m_nrf{}     , m_rf_index[SizeRF], m_rf_map[SizeRF];
-    int  m_nrfz{}    , m_rfz_index[SizeRFZ], m_rfz_map[SizeRFZ];
-    int m_rfz_b[SizeRFZ],m_rfz_t[SizeRFZ],m_rfz_ib[SizeRFZ][SizeI],m_rfz_it[SizeRFZ][SizeI];
-    float m_sF {};
-
-    ///////////////////////////////////////////////////////////////////
-    // Tables for 3 space points seeds search
-    ///////////////////////////////////////////////////////////////////
-     
-    IntegerProperty m_maxsizeSP{this, "maxSizeSP", 1500};
-    std::vector<InDet::SiSpacePointForSeed*> m_SP;
-    std::vector<float> m_R;
-    std::vector<float> m_Tz;
-    std::vector<float> m_Er;
-    std::vector<float> m_U;
-    std::vector<float> m_V;
-    std::vector<float> m_Zo;
 
-    std::multimap<float,InDet::SiSpacePointsSeed*>           m_l_seeds;
-    std::multimap<float,InDet::SiSpacePointsSeed*>::iterator m_i_seed;
-    std::multimap<float,InDet::SiSpacePointsSeed*>::iterator m_i_seede;
-    std::vector<InDet::SiSpacePointsSeed> m_seeds;
-
-    ///////////////////////////////////////////////////////////////////
-    // Space points container
-    ///////////////////////////////////////////////////////////////////
-      
-    SG::ReadHandleKey<SpacePointContainer>         m_spacepointsSCT{this, "SpacePointsSCTName", "SCT_SpacePoints"};
-    SG::ReadHandleKey<SpacePointContainer>         m_spacepointsPixel{this, "SpacePointsPixelName", "PixelSpacePoints"};
-    SG::ReadHandleKey<SpacePointOverlapCollection> m_spacepointsOverlap{this, "SpacePointsOverlapName", "OverlapSpacePoints"};
+    // Updated in only initialize
+    bool m_initialized{false};
+    int m_outputlevel{};
+    int m_r_size{};
+    int m_fNmax{};
+    int m_rfz_b[SizeRFZ];
+    int m_rfz_t[SizeRFZ];
+    int m_rfz_ib[SizeRFZ][SizeI];
+    int m_rfz_it[SizeRFZ][SizeI];
+    float m_dzdrmin{};
+    float m_dzdrmax{};
+    float m_sF{};
+
+    mutable std::mutex m_mutex;
+    mutable std::vector<EventContext::ContextEvt_t> m_cache ATLAS_THREAD_SAFE; // Guarded by m_mutex
+    struct EventData { // To hold event dependent data
+      bool endlist{true};
+      int state{0};
+      int nprint{0};
+      int nspoint{2};
+      int mode{0};
+      int nlist{0};
+      int nseeds{0};
+      int ns{0};
+      int nsaz{0};
+      int nr{0};
+      int nrf{0};
+      int nrfz{0};
+      int fNmin{0};
+      int zMin{0};
+      int rf_index[SizeRF];
+      int rf_map[SizeRF];
+      int rfz_index[SizeRFZ];
+      int rfz_map[SizeRFZ];
+      std::vector<std::list<InDet::SiSpacePointForSeed*>> r_Sorted;
+      std::vector<int> r_index;
+      std::vector<int> r_map;
+      std::vector<InDet::SiSpacePointsSeed> seeds;
+      std::multimap<float,InDet::SiSpacePointsSeed*> l_seeds;
+      std::multimap<float,InDet::SiSpacePointsSeed*>::iterator i_seed;
+      std::multimap<float,InDet::SiSpacePointsSeed*>::iterator i_seede;
+      std::list<InDet::SiSpacePointForSeed*> rf_Sorted[SizeRF];
+      std::list<InDet::SiSpacePointForSeed*> rfz_Sorted[SizeRFZ];
+      std::list<InDet::SiSpacePointForSeed> l_spforseed;
+      std::list<InDet::SiSpacePointForSeed>::iterator i_spforseed;
+      std::list<InDet::SiSpacePointForSeed*>::iterator rMin;
+      ///////////////////////////////////////////////////////////////////
+      // Tables for 3 space points seeds search
+      ///////////////////////////////////////////////////////////////////
+      std::vector<InDet::SiSpacePointForSeed*> SP;
+      std::vector<float> R;
+      std::vector<float> Tz;
+      std::vector<float> Er;
+      std::vector<float> U;
+      std::vector<float> V;
+      std::vector<float> Zo;
+    };
+    mutable std::vector<EventData> m_eventData ATLAS_THREAD_SAFE; // Guarded by m_mutex
 
     ///////////////////////////////////////////////////////////////////
     // Private methods
@@ -206,41 +221,47 @@ namespace InDet {
     SiSpacePointsSeedMaker_Cosmic &operator=(const SiSpacePointsSeedMaker_Cosmic&) = delete;
     //@}
 
-    MsgStream&    dumpConditions(MsgStream   & out) const;
-    MsgStream&    dumpEvent     (MsgStream   & out) const;
+    MsgStream& dumpConditions(MsgStream& out) const;
+    MsgStream& dumpEvent(EventData& data, MsgStream& out) const;
 
     void buildFrameWork();
 
     SiSpacePointForSeed* newSpacePoint
-    (const Trk::SpacePoint*const&);
+    (EventData& data, const Trk::SpacePoint*const&) const;
     SiSpacePointForSeed* newSpacePoint
-    (const Trk::SpacePoint*const&,const float*);
+    (EventData& data, const Trk::SpacePoint*const&, const float*) const;
     void newSeed
-    (const Trk::SpacePoint*&,const Trk::SpacePoint*&,
-     const float&);
+    (EventData& data,
+     const Trk::SpacePoint*&,const Trk::SpacePoint*&,
+     const float&) const;
     void newSeed
-    (const Trk::SpacePoint*&,const Trk::SpacePoint*&,
-     const Trk::SpacePoint*&,const float&);
-    void fillLists     ();
-    void erase         ();
-    void production2Sp ();
-    void production3Sp ();
+    (EventData& data,
+     const Trk::SpacePoint*&,const Trk::SpacePoint*&,
+     const Trk::SpacePoint*&,const float&) const;
+    void fillLists(EventData& data) const;
+    void erase(EventData& data) const;
+    void production2Sp(EventData& data) const;
+    void production3Sp(EventData& data) const;
     void production3Sp
-    (std::list<InDet::SiSpacePointForSeed*>::iterator*,
+    (EventData& data,
      std::list<InDet::SiSpacePointForSeed*>::iterator*,
      std::list<InDet::SiSpacePointForSeed*>::iterator*,
      std::list<InDet::SiSpacePointForSeed*>::iterator*,
-     int,int,float,float);
+     std::list<InDet::SiSpacePointForSeed*>::iterator*,
+     int,int,float,float) const;
 
-    void production3SpWithoutField();
+    void production3SpWithoutField(EventData& data) const;
     void production3SpWithoutField
-    (std::list<InDet::SiSpacePointForSeed*>::iterator*,
+    (EventData& data,
+     std::list<InDet::SiSpacePointForSeed*>::iterator*,
      std::list<InDet::SiSpacePointForSeed*>::iterator*,
      std::list<InDet::SiSpacePointForSeed*>::iterator*,
      std::list<InDet::SiSpacePointForSeed*>::iterator*,
-     int,int,float);
+     int,int,float) const;
+
+    bool isUsed(const Trk::SpacePoint*) const;
 
-    bool isUsed(const Trk::SpacePoint*);
+    EventData& getEventData() const;
   };
 
   MsgStream&    operator << (MsgStream&   ,const SiSpacePointsSeedMaker_Cosmic&);
diff --git a/InnerDetector/InDetRecTools/SiSpacePointsSeedTool_xk/src/SiSpacePointsSeedMaker_Cosmic.cxx b/InnerDetector/InDetRecTools/SiSpacePointsSeedTool_xk/src/SiSpacePointsSeedMaker_Cosmic.cxx
index 8bc826d9843a16f63a0229a7a3bcaef2201d8783..28eb9d852168a05d609033baede906c0529eb13a 100644
--- a/InnerDetector/InDetRecTools/SiSpacePointsSeedTool_xk/src/SiSpacePointsSeedMaker_Cosmic.cxx
+++ b/InnerDetector/InDetRecTools/SiSpacePointsSeedTool_xk/src/SiSpacePointsSeedMaker_Cosmic.cxx
@@ -72,10 +72,13 @@ StatusCode InDet::SiSpacePointsSeedMaker_Cosmic::initialize()
   //
   m_outputlevel = msg().level()-MSG::DEBUG;
   if (m_outputlevel<=0) {
-    m_nprint=0;
+    EventData& data{getEventData()};
+    data.nprint=0;
     ATH_MSG_DEBUG(*this);
   }
 
+  m_initialized = true;
+  
   return sc;
 }
 
@@ -92,11 +95,13 @@ StatusCode InDet::SiSpacePointsSeedMaker_Cosmic::finalize()
 // Initialize tool for new event 
 ///////////////////////////////////////////////////////////////////
 
-void InDet::SiSpacePointsSeedMaker_Cosmic::newEvent (int)
+void InDet::SiSpacePointsSeedMaker_Cosmic::newEvent(int)
 {
+  EventData& data{getEventData()};
+
   if (!m_pixel && !m_sct) return;
-  erase();
-  m_i_spforseed = m_l_spforseed.begin();
+  erase(data);
+  data.i_spforseed = data.l_spforseed.begin();
 
   float irstep = 1./m_r_rstep;
   float errorsc[4] = {16.,16.,100.,16.};
@@ -113,15 +118,15 @@ void InDet::SiSpacePointsSeedMaker_Cosmic::newEvent (int)
 	  
 	  float r = sp->r();
           if (r<0. || r>=m_r_rmax) continue;
-	  if (m_useassoTool &&  isUsed(sp)) continue;
+	  if (m_useassoTool && isUsed(sp)) continue;
 
 	  int   ir = static_cast<int>((sp->globalPosition().y()+m_r_rmax)*irstep);
 
-	  InDet::SiSpacePointForSeed* sps = newSpacePoint(sp, errorsc);
-	  m_r_Sorted[ir].push_back(sps);
-          ++m_r_map[ir];
-	  if (m_r_map[ir]==1) m_r_index[m_nr++] = ir;
-	  ++m_ns;
+	  InDet::SiSpacePointForSeed* sps = newSpacePoint(data, sp, errorsc);
+	  data.r_Sorted[ir].push_back(sps);
+          ++data.r_map[ir];
+	  if (data.r_map[ir]==1) data.r_index[data.nr++] = ir;
+	  ++data.ns;
 	}
       }
     }
@@ -143,11 +148,11 @@ void InDet::SiSpacePointsSeedMaker_Cosmic::newEvent (int)
 	  
 	  int   ir = static_cast<int>((sp->globalPosition().y()+m_r_rmax)*irstep);
 
-	  InDet::SiSpacePointForSeed* sps = newSpacePoint(sp, errorsc);
-	  m_r_Sorted[ir].push_back(sps);
-          ++m_r_map[ir];
-	  if (m_r_map[ir]==1) m_r_index[m_nr++] = ir;
-	  ++m_ns;
+	  InDet::SiSpacePointForSeed* sps = newSpacePoint(data, sp, errorsc);
+	  data.r_Sorted[ir].push_back(sps);
+          ++data.r_map[ir];
+	  if (data.r_map[ir]==1) data.r_index[data.nr++] = ir;
+	  ++data.ns;
 	}
       }
     }
@@ -167,16 +172,16 @@ void InDet::SiSpacePointsSeedMaker_Cosmic::newEvent (int)
 
 	  int   ir = static_cast<int>((sp->globalPosition().y()+m_r_rmax)*irstep);
 
-	  InDet::SiSpacePointForSeed* sps = newSpacePoint(sp, errorsc);
-	  m_r_Sorted[ir].push_back(sps);
-          ++m_r_map[ir];
-	  if (m_r_map[ir]==1) m_r_index[m_nr++] = ir;
-	  ++m_ns;
+	  InDet::SiSpacePointForSeed* sps = newSpacePoint(data, sp, errorsc);
+	  data.r_Sorted[ir].push_back(sps);
+          ++data.r_map[ir];
+	  if (data.r_map[ir]==1) data.r_index[data.nr++] = ir;
+	  ++data.ns;
 	}
       }
     }
   }
-  fillLists();
+  fillLists(data);
 }
 
 ///////////////////////////////////////////////////////////////////
@@ -186,10 +191,11 @@ void InDet::SiSpacePointsSeedMaker_Cosmic::newEvent (int)
 void InDet::SiSpacePointsSeedMaker_Cosmic::newRegion
 (const std::vector<IdentifierHash>& vPixel, const std::vector<IdentifierHash>& vSCT)
 {
+  EventData& data{getEventData()};
 
   if (!m_pixel && !m_sct) return;
-  erase();
-  m_i_spforseed = m_l_spforseed.begin();
+  erase(data);
+  data.i_spforseed = data.l_spforseed.begin();
 
   float irstep = 1./m_r_rstep;
   float errorsc[4] = {16.,16.,100.,16.};
@@ -213,11 +219,11 @@ void InDet::SiSpacePointsSeedMaker_Cosmic::newRegion
 	  if (m_useassoTool && isUsed(sp)) continue;
 
 	  int   ir = static_cast<int>((sp->globalPosition().y()+m_r_rmax)*irstep);
-	  InDet::SiSpacePointForSeed* sps = newSpacePoint(sp, errorsc);
-	  m_r_Sorted[ir].push_back(sps);
-          ++m_r_map[ir];
-	  if (m_r_map[ir]==1) m_r_index[m_nr++] = ir;
-	  ++m_ns;
+	  InDet::SiSpacePointForSeed* sps = newSpacePoint(data, sp, errorsc);
+	  data.r_Sorted[ir].push_back(sps);
+          ++data.r_map[ir];
+	  if (data.r_map[ir]==1) data.r_index[data.nr++] = ir;
+	  ++data.ns;
 	}
       }
     }
@@ -242,16 +248,16 @@ void InDet::SiSpacePointsSeedMaker_Cosmic::newRegion
 	  if (m_useassoTool && isUsed(sp)) continue;
 
 	  int ir = static_cast<int>((sp->globalPosition().y()+m_r_rmax)*irstep);
-	  InDet::SiSpacePointForSeed* sps = newSpacePoint(sp, errorsc);
-	  m_r_Sorted[ir].push_back(sps);
-          ++m_r_map[ir];
-	  if (m_r_map[ir]==1) m_r_index[m_nr++] = ir;
-	  ++m_ns;
+	  InDet::SiSpacePointForSeed* sps = newSpacePoint(data, sp, errorsc);
+	  data.r_Sorted[ir].push_back(sps);
+          ++data.r_map[ir];
+	  if (data.r_map[ir]==1) data.r_index[data.nr++] = ir;
+	  ++data.ns;
 	}
       }
     }
   }
-  fillLists();
+  fillLists(data);
 }
 
 ///////////////////////////////////////////////////////////////////
@@ -261,7 +267,7 @@ void InDet::SiSpacePointsSeedMaker_Cosmic::newRegion
 void InDet::SiSpacePointsSeedMaker_Cosmic::newRegion
 (const std::vector<IdentifierHash>& vPixel,const std::vector<IdentifierHash>& vSCT,const IRoiDescriptor&) 
 {
-  newRegion(vPixel,vSCT);
+  newRegion(vPixel, vSCT);
 }
 
 ///////////////////////////////////////////////////////////////////
@@ -271,29 +277,31 @@ void InDet::SiSpacePointsSeedMaker_Cosmic::newRegion
 
 void InDet::SiSpacePointsSeedMaker_Cosmic::find2Sp(const std::list<Trk::Vertex>& lv) 
 {
-  int mode;
-  lv.begin()!=lv.end() ?  mode = 1 : mode = 0;
+  EventData& data{getEventData()};
 
-  m_nseeds = 0;
-  m_l_seeds.erase(m_l_seeds.begin(),m_l_seeds.end());
+  int mode = 0;
+  if (lv.begin()!=lv.end()) mode = 1;
+
+  data.nseeds = 0;
+  data.l_seeds.erase(data.l_seeds.begin(),data.l_seeds.end());
   
-  if ( !m_state || m_nspoint!=2 || m_mode!=mode || m_nlist) {
-
-    m_state   = 1   ;
-    m_nspoint = 2   ;
-    m_nlist   = 0   ;
-    m_mode    = mode;
-    m_endlist = true;
-    m_fNmin   = 0   ;
-    m_zMin    = 0   ;
-    production2Sp ();
+  if ( !data.state || data.nspoint!=2 || data.mode!=mode || data.nlist) {
+
+    data.state   = 1   ;
+    data.nspoint = 2   ;
+    data.nlist   = 0   ;
+    data.mode    = mode;
+    data.endlist = true;
+    data.fNmin   = 0   ;
+    data.zMin    = 0   ;
+    production2Sp(data);
   }
 
-  m_i_seed  = m_l_seeds.begin();
-  m_i_seede = m_l_seeds.end  ();
+  data.i_seed  = data.l_seeds.begin();
+  data.i_seede = data.l_seeds.end  ();
 
   if (m_outputlevel<=0) {
-    m_nprint=1;
+    data.nprint=1;
     ATH_MSG_DEBUG(*this);
   }
 }
@@ -305,29 +313,31 @@ void InDet::SiSpacePointsSeedMaker_Cosmic::find2Sp(const std::list<Trk::Vertex>&
 
 void InDet::SiSpacePointsSeedMaker_Cosmic::find3Sp(const std::list<Trk::Vertex>& lv) 
 {
-  int mode;
-  lv.begin()!=lv.end() ? mode = 3 : mode = 2;
-
-  m_nseeds = 0;
-  m_l_seeds.erase(m_l_seeds.begin(),m_l_seeds.end());
-
-  if (!m_state || m_nspoint!=3 || m_mode!=mode || m_nlist) {
-
-    m_state   = 1               ;
-    m_nspoint = 3               ;
-    m_nlist   = 0               ;
-    m_mode    = mode            ;
-    m_endlist = true            ;
-    m_fNmin   = 0               ;
-    m_zMin    = 0               ;
-    production3Sp();
+  EventData& data{getEventData()};
+
+  int mode = 2;
+  if (lv.begin()!=lv.end())mode = 3;
+
+  data.nseeds = 0;
+  data.l_seeds.erase(data.l_seeds.begin(),data.l_seeds.end());
+
+  if (!data.state || data.nspoint!=3 || data.mode!=mode || data.nlist) {
+
+    data.state   = 1               ;
+    data.nspoint = 3               ;
+    data.nlist   = 0               ;
+    data.mode    = mode            ;
+    data.endlist = true            ;
+    data.fNmin   = 0               ;
+    data.zMin    = 0               ;
+    production3Sp(data);
   }
 
-  m_i_seed  = m_l_seeds.begin();
-  m_i_seede = m_l_seeds.end  ();
+  data.i_seed  = data.l_seeds.begin();
+  data.i_seede = data.l_seeds.end  ();
 
   if (m_outputlevel<=0) {
-    m_nprint=1;
+    data.nprint=1;
     ATH_MSG_DEBUG(*this);
   }
 }
@@ -345,26 +355,28 @@ void InDet::SiSpacePointsSeedMaker_Cosmic::find3Sp(const std::list<Trk::Vertex>&
 
 void InDet::SiSpacePointsSeedMaker_Cosmic::findVSp (const std::list<Trk::Vertex>& lv)
 {
-  int mode;
-  lv.begin()!=lv.end() ? mode = 6 : mode = 5;
+  EventData& data{getEventData()};
+
+  int mode = 5;
+  if (lv.begin()!=lv.end()) mode = 6;
   
-  if (!m_state || m_nspoint!=4 || m_mode!=mode || m_nlist) {
-
-    m_state   = 1               ;
-    m_nspoint = 4               ;
-    m_nlist   = 0               ;
-    m_mode    = mode            ;
-    m_endlist = true            ;
-    m_fNmin   = 0               ;
-    m_zMin    = 0               ;
-    production3Sp();
+  if (!data.state || data.nspoint!=4 || data.mode!=mode || data.nlist) {
+
+    data.state   = 1               ;
+    data.nspoint = 4               ;
+    data.nlist   = 0               ;
+    data.mode    = mode            ;
+    data.endlist = true            ;
+    data.fNmin   = 0               ;
+    data.zMin    = 0               ;
+    production3Sp(data);
   }
 
-  m_i_seed  = m_l_seeds.begin();
-  m_i_seede = m_l_seeds.end  ();
+  data.i_seed  = data.l_seeds.begin();
+  data.i_seede = data.l_seeds.end  ();
 
   if (m_outputlevel<=0) {
-    m_nprint=1;
+    data.nprint=1;
     ATH_MSG_DEBUG(*this);
   }
 }
@@ -375,7 +387,8 @@ void InDet::SiSpacePointsSeedMaker_Cosmic::findVSp (const std::list<Trk::Vertex>
 
 MsgStream& InDet::SiSpacePointsSeedMaker_Cosmic::dump( MsgStream& out ) const
 {
-  if (m_nprint)  return dumpEvent(out);
+  EventData& data{getEventData()};
+  if (data.nprint) return dumpEvent(data, out);
   return dumpConditions(out);
 }
 
@@ -383,7 +396,7 @@ MsgStream& InDet::SiSpacePointsSeedMaker_Cosmic::dump( MsgStream& out ) const
 // Dumps conditions information into the MsgStream
 ///////////////////////////////////////////////////////////////////
 
-MsgStream& InDet::SiSpacePointsSeedMaker_Cosmic::dumpConditions( MsgStream& out ) const
+MsgStream& InDet::SiSpacePointsSeedMaker_Cosmic::dumpConditions(MsgStream& out) const
 {
   int n = 42-m_spacepointsPixel.key().size();
   std::string s2; for (int i=0; i<n; ++i) s2.append(" "); s2.append("|");
@@ -449,18 +462,18 @@ MsgStream& InDet::SiSpacePointsSeedMaker_Cosmic::dumpConditions( MsgStream& out
 // Dumps event information into the MsgStream
 ///////////////////////////////////////////////////////////////////
 
-MsgStream& InDet::SiSpacePointsSeedMaker_Cosmic::dumpEvent( MsgStream& out ) const
+MsgStream& InDet::SiSpacePointsSeedMaker_Cosmic::dumpEvent(EventData& data, MsgStream& out) const
 {
   out<<"|---------------------------------------------------------------------|"
      <<endmsg;
-  out<<"| m_ns                    | "
-     <<std::setw(12)<<m_ns
+  out<<"| data.ns                    | "
+     <<std::setw(12)<<data.ns
      <<"                              |"<<endmsg;
-  out<<"| m_nsaz                  | "
-     <<std::setw(12)<<m_nsaz
+  out<<"| data.nsaz                  | "
+     <<std::setw(12)<<data.nsaz
      <<"                              |"<<endmsg;
   out<<"| seeds                   | "
-     <<std::setw(12)<<m_l_seeds.size()
+     <<std::setw(12)<<data.l_seeds.size()
      <<"                              |"<<endmsg;
   out<<"|---------------------------------------------------------------------|"
      <<endmsg;
@@ -502,19 +515,13 @@ std::ostream& InDet::operator <<
 
 void InDet::SiSpacePointsSeedMaker_Cosmic::buildFrameWork() 
 {
-  m_rapcut    = fabs(m_rapcut)                 ;
-  m_dzdrmax   = 1./tan(2.*atan(exp(-m_rapcut)));
-  m_dzdrmin   =-m_dzdrmax                      ;
-
-  m_ns = m_nsaz = m_nr = m_nrf = m_nrfz = 0;
+  m_rapcut  = fabs(m_rapcut);
+  m_dzdrmax = 1./tan(2.*atan(exp(-m_rapcut)));
+  m_dzdrmin = -m_dzdrmax;
 
   // Build radius sorted containers
   //
   m_r_size = static_cast<int>((m_r_rmax+.1)/m_r_rstep)*2;
-  m_r_Sorted.resize(m_r_size);
-  m_r_index.resize(m_r_size, 0);
-  m_r_map.resize(m_r_size, 0);
-  m_nr = 0;
 
   // Build radius-azimuthal sorted containers
   //
@@ -526,23 +533,9 @@ void InDet::SiSpacePointsSeedMaker_Cosmic::buildFrameWork()
   m_sF = 50./60.;
   if (m_sF    >sFmax ) m_sF    = sFmax  ;
   else if (m_sF < sFmin) m_sF = sFmin;
-  m_fNmax     = static_cast<int>(pi2*m_sF);
+  m_fNmax = static_cast<int>(pi2*m_sF);
   if (m_fNmax >=NFmax) m_fNmax = NFmax-1;
 
-  m_nrf = 0;
-  for (int i=0; i<SizeRF; ++i) {
-    m_rf_index[i]=0;
-    m_rf_map[i]=0;
-  }
-
-  // Build radius-azimuthal-Z sorted containers
-  //
-  m_nrfz = 0;
-  for (int i=0; i!=SizeRFZ; ++i) {
-    m_rfz_index[i]=0;
-    m_rfz_map[i]=0;
-  }
-
   // Build maps for radius-azimuthal-Z sorted collections 
   //
   for (int f=0; f<=m_fNmax; ++f) {
@@ -613,31 +606,23 @@ void InDet::SiSpacePointsSeedMaker_Cosmic::buildFrameWork()
       }
     }
   }
-  
-  m_SP.resize(m_maxsizeSP, nullptr);
-  m_R.resize(m_maxsizeSP, 0.);
-  m_Tz.resize(m_maxsizeSP, 0.);
-  m_Er.resize(m_maxsizeSP, 0.);
-  m_U.resize(m_maxsizeSP, 0.);
-  m_V.resize(m_maxsizeSP, 0.);
-  m_seeds.resize(m_maxsize+5);
 }
    
 ///////////////////////////////////////////////////////////////////
 // Initiate space points seed maker
 ///////////////////////////////////////////////////////////////////
 
-void InDet::SiSpacePointsSeedMaker_Cosmic::fillLists() 
+void InDet::SiSpacePointsSeedMaker_Cosmic::fillLists(EventData& data) const
 {
   constexpr float pi2 = 2.*M_PI;
   std::list<InDet::SiSpacePointForSeed*>::iterator r;
   
   for (int i=0; i!= m_r_size;  ++i) {
 
-    if (!m_r_map[i]) continue;
-    r = m_r_Sorted[i].begin();
+    if (!data.r_map[i]) continue;
+    r = data.r_Sorted[i].begin();
 
-    while (r!=m_r_Sorted[i].end()) {
+    while (r!=data.r_Sorted[i].end()) {
       
       // Azimuthal angle sort
       //
@@ -646,8 +631,8 @@ void InDet::SiSpacePointsSeedMaker_Cosmic::fillLists()
 
       //int   f = static_cast<int>(F*m_sF); f<0 ? f = m_fNmax : f>m_fNmax ? f = 0 : f=f;
       int f = 1;
-      m_rf_Sorted[f].push_back(*r);
-      if (!m_rf_map[f]++) m_rf_index[m_nrf++] = f;
+      data.rf_Sorted[f].push_back(*r);
+      if (!data.rf_map[f]++) data.rf_index[data.nrf++] = f;
 
       int z;
       float Z = (*r)->z();
@@ -660,65 +645,65 @@ void InDet::SiSpacePointsSeedMaker_Cosmic::fillLists()
 	Z>-250.?z=5:Z>-450.?z=4:Z>-925.?z=3:Z>-1400.?z=2:Z>-2500.?z=1:z= 0;
       }
       int n = f*SizeZ+z;
-      ++m_nsaz;
-      m_rfz_Sorted[n].push_back(*r);
-      if (!m_rfz_map[n]++) m_rfz_index[m_nrfz++] = n;
-      m_r_Sorted[i].erase(r++);
+      ++data.nsaz;
+      data.rfz_Sorted[n].push_back(*r);
+      if (!data.rfz_map[n]++) data.rfz_index[data.nrfz++] = n;
+      data.r_Sorted[i].erase(r++);
     }
-    m_r_map[i] = 0;
+    data.r_map[i] = 0;
   }
-  m_nr    = 0;
-  m_state = 0;
+  data.nr    = 0;
+  data.state = 0;
 }
  
 ///////////////////////////////////////////////////////////////////
 // Erase space point information
 ///////////////////////////////////////////////////////////////////
 
-void InDet::SiSpacePointsSeedMaker_Cosmic::erase()
+void InDet::SiSpacePointsSeedMaker_Cosmic::erase(EventData& data) const
 {
-  for (int i=0; i!=m_nr;    ++i) {
-    int n = m_r_index[i];
-    m_r_map[n] = 0;
-    m_r_Sorted[n].erase(m_r_Sorted[n].begin(),m_r_Sorted[n].end());
+  for (int i=0; i!=data.nr;    ++i) {
+    int n = data.r_index[i];
+    data.r_map[n] = 0;
+    data.r_Sorted[n].erase(data.r_Sorted[n].begin(), data.r_Sorted[n].end());
   }
 
-  for (int i=0; i!=m_nrf;   ++i) {
-    int n = m_rf_index[i];
-    m_rf_map[n] = 0;
-    m_rf_Sorted[n].erase(m_rf_Sorted[n].begin(),m_rf_Sorted[n].end());
+  for (int i=0; i!=data.nrf;   ++i) {
+    int n = data.rf_index[i];
+    data.rf_map[n] = 0;
+    data.rf_Sorted[n].erase(data.rf_Sorted[n].begin(), data.rf_Sorted[n].end());
   }
 
-  for (int i=0; i!=m_nrfz;  ++i) {
-    int n = m_rfz_index[i];
-    m_rfz_map[n] = 0;
-    m_rfz_Sorted[n].erase(m_rfz_Sorted[n].begin(),m_rfz_Sorted[n].end());
+  for (int i=0; i!=data.nrfz;  ++i) {
+    int n = data.rfz_index[i];
+    data.rfz_map[n] = 0;
+    data.rfz_Sorted[n].erase(data.rfz_Sorted[n].begin(), data.rfz_Sorted[n].end());
   }
 
-  m_state = 0;
-  m_ns    = 0;
-  m_nsaz  = 0;
-  m_nr    = 0;
-  m_nrf   = 0;
-  m_nrfz  = 0;
+  data.state = 0;
+  data.ns    = 0;
+  data.nsaz  = 0;
+  data.nr    = 0;
+  data.nrf   = 0;
+  data.nrfz  = 0;
 }
 
 ///////////////////////////////////////////////////////////////////
 // 2 space points seeds production
 ///////////////////////////////////////////////////////////////////
 
-void InDet::SiSpacePointsSeedMaker_Cosmic::production2Sp()
+void InDet::SiSpacePointsSeedMaker_Cosmic::production2Sp(EventData& data) const
 {
-  m_endlist = true;
+  data.endlist = true;
 }
 
 ///////////////////////////////////////////////////////////////////
 // Production 3 space points seeds 
 ///////////////////////////////////////////////////////////////////
 
-void InDet::SiSpacePointsSeedMaker_Cosmic::production3Sp()
+void InDet::SiSpacePointsSeedMaker_Cosmic::production3Sp(EventData& data) const
 { 
-  if (m_nsaz<3) return;
+  if (data.nsaz<3) return;
 
   float K   = 0.;
 
@@ -728,7 +713,7 @@ void InDet::SiSpacePointsSeedMaker_Cosmic::production3Sp()
     m_fieldServiceHandle->getFieldZR(gP,f);
     K = 2./(300.*f[2]);
   }
-  if (!K) return production3SpWithoutField();
+  if (!K) return production3SpWithoutField(data);
 
   float ipt = 100000000.;
   if (m_ptmin!=0.) ipt= 1./fabs(.9*m_ptmin);
@@ -738,44 +723,44 @@ void InDet::SiSpacePointsSeedMaker_Cosmic::production3Sp()
 
   // Loop thorugh all azimuthal regions
   //
-  for (int f=m_fNmin; f<=m_fNmax; ++f) {
+  for (int f=data.fNmin; f<=m_fNmax; ++f) {
     
     // For each azimuthal region loop through all Z regions
     //
     int z = 0;
-    if (!m_endlist) z = m_zMin;
+    if (!data.endlist) z = data.zMin;
 
     for (; z<SizeZ; ++z) {
 
       int a = f *SizeZ+ZI[z];
-      if (!m_rfz_map[a]) continue;
+      if (!data.rfz_map[a]) continue;
       int NB = 0, NT = 0;
       for (int i=0; i!=m_rfz_b[a]; ++i) {
 	
 	int an =  m_rfz_ib[a][i];
-	if (!m_rfz_map[an]) continue;
-	rb [NB] = m_rfz_Sorted[an].begin();
-        rbe[NB++] = m_rfz_Sorted[an].end();
+	if (!data.rfz_map[an]) continue;
+	rb [NB] = data.rfz_Sorted[an].begin();
+        rbe[NB++] = data.rfz_Sorted[an].end();
       } 
       for (int i=0; i!=m_rfz_t[a]; ++i) {
 	
 	int an =  m_rfz_it[a][i];
-	if (!m_rfz_map[an]) continue;
-	rt [NT] = m_rfz_Sorted[an].begin();
-        rte[NT++] = m_rfz_Sorted[an].end();
+	if (!data.rfz_map[an]) continue;
+	rt [NT] = data.rfz_Sorted[an].begin();
+        rte[NT++] = data.rfz_Sorted[an].end();
       } 
-      production3Sp(rb,rbe,rt,rte,NB,NT,K,ipt);
-      if (!m_endlist) {m_fNmin=f; m_zMin = z; return;} 
+      production3Sp(data, rb, rbe, rt, rte, NB, NT, K, ipt);
+      if (!data.endlist) {data.fNmin=f; data.zMin = z; return;} 
     }
   }
-  m_endlist = true;
+  data.endlist = true;
 }
 
 ///////////////////////////////////////////////////////////////////
 // Production 3 space points seeds without magnetic field
 ///////////////////////////////////////////////////////////////////
 
-void InDet::SiSpacePointsSeedMaker_Cosmic::production3SpWithoutField()
+void InDet::SiSpacePointsSeedMaker_Cosmic::production3SpWithoutField(EventData& data) const
 { 
 
   float ipt = 100000000.;
@@ -785,37 +770,37 @@ void InDet::SiSpacePointsSeedMaker_Cosmic::production3SpWithoutField()
 
   // Loop thorugh all azimuthal regions
   //
-  for (int f=m_fNmin; f<=m_fNmax; ++f) {
+  for (int f=data.fNmin; f<=m_fNmax; ++f) {
     
     // For each azimuthal region loop through all Z regions
     //
     int z = 0;
-    if (!m_endlist) z = m_zMin;
+    if (!data.endlist) z = data.zMin;
 
     for (; z<SizeZ; ++z) {
 
       int a  = f *SizeZ+ZI[z];
-      if (!m_rfz_map[a]) continue;
+      if (!data.rfz_map[a]) continue;
       int NB = 0, NT = 0;
       for (int i=0; i!=m_rfz_b[a]; ++i) {
 	
 	int an =  m_rfz_ib[a][i];
-	if (!m_rfz_map[an]) continue;
-	rb [NB] = m_rfz_Sorted[an].begin();
-        rbe[NB++] = m_rfz_Sorted[an].end();
+	if (!data.rfz_map[an]) continue;
+	rb [NB] = data.rfz_Sorted[an].begin();
+        rbe[NB++] = data.rfz_Sorted[an].end();
       } 
       for (int i=0; i!=m_rfz_t[a]; ++i) {
 	
 	int an =  m_rfz_it[a][i];
-	if (!m_rfz_map[an]) continue;
-	rt [NT] = m_rfz_Sorted[an].begin();
-        rte[NT++] = m_rfz_Sorted[an].end();
+	if (!data.rfz_map[an]) continue;
+	rt [NT] = data.rfz_Sorted[an].begin();
+        rte[NT++] = data.rfz_Sorted[an].end();
       } 
-      production3SpWithoutField(rb,rbe,rt,rte,NB,NT,ipt);
-      if (!m_endlist) {m_fNmin=f; m_zMin = z; return;} 
+      production3SpWithoutField(data, rb, rbe, rt, rte, NB, NT, ipt);
+      if (!data.endlist) {data.fNmin=f; data.zMin = z; return;} 
     }
   }
-  m_endlist = true;
+  data.endlist = true;
 }
 
 ///////////////////////////////////////////////////////////////////
@@ -823,16 +808,17 @@ void InDet::SiSpacePointsSeedMaker_Cosmic::production3SpWithoutField()
 ///////////////////////////////////////////////////////////////////
 
 void InDet::SiSpacePointsSeedMaker_Cosmic::production3Sp
-( std::list<InDet::SiSpacePointForSeed*>::iterator* rb ,
-  std::list<InDet::SiSpacePointForSeed*>::iterator* rbe,
-  std::list<InDet::SiSpacePointForSeed*>::iterator* rt ,
-  std::list<InDet::SiSpacePointForSeed*>::iterator* rte,
-  int NB, int NT, float K, float ipt) 
+(EventData& data,
+ std::list<InDet::SiSpacePointForSeed*>::iterator* rb ,
+ std::list<InDet::SiSpacePointForSeed*>::iterator* rbe,
+ std::list<InDet::SiSpacePointForSeed*>::iterator* rt ,
+ std::list<InDet::SiSpacePointForSeed*>::iterator* rte,
+ int NB, int NT, float K, float ipt) const
 {
   const float COF = 134*.05*9.;
 
   std::list<InDet::SiSpacePointForSeed*>::iterator r0=rb[0],r;
-  if (!m_endlist) {r0 = m_rMin; m_endlist = true;}
+  if (!data.endlist) {r0 = data.rMin; data.endlist = true;}
 
   // Loop through all trigger space points
   //
@@ -872,16 +858,16 @@ void InDet::SiSpacePointsSeedMaker_Cosmic::production3Sp
 	float x  = dx*ax+dy*ay ;
 	float y  =-dx*ay+dy*ax ;
 	float r2 = 1./(x*x+y*y);
-	float dr = sqrt(r2)    ;
-	m_Tz[Nb]  =-dz*dr       ;
+	float dr = sqrt(r2);
+	data.Tz[Nb] = -dz*dr;
         
-	if (m_Tz[Nb]<m_dzdrmin || m_Tz[Nb]>m_dzdrmax) continue;
+	if (data.Tz[Nb]<m_dzdrmin || data.Tz[Nb]>m_dzdrmax) continue;
 	
-	m_SP[Nb] = (*r);
-	m_U [Nb] = x*r2;
-	m_V [Nb] = y*r2;
-	m_Er[Nb] = (covz0+m_SP[Nb]->covz()+m_Tz[Nb]*m_Tz[Nb]*(covr0+m_SP[Nb]->covr()))*r2;
-	m_R [Nb] = dr  ;
+	data.SP[Nb] = (*r);
+	data.U [Nb] = x*r2;
+	data.V [Nb] = y*r2;
+	data.Er[Nb] = (covz0+data.SP[Nb]->covz()+data.Tz[Nb]*data.Tz[Nb]*(covr0+data.SP[Nb]->covr()))*r2;
+	data.R [Nb] = dr  ;
 	if (++Nb==m_maxsizeSP) goto breakb;
       }
     }
@@ -904,21 +890,21 @@ void InDet::SiSpacePointsSeedMaker_Cosmic::production3Sp
 	if ( pix &&  (*r)->spacepoint->clusterList().second) continue;
 	if (!pix && !(*r)->spacepoint->clusterList().second) continue;
 
-	float dx = (*r)->x()-X ;
-	float dz = (*r)->z()-Z ;
+	float dx = (*r)->x()-X;
+	float dz = (*r)->z()-Z;
 
-	float x  = dx*ax+dy*ay ;
-	float y  =-dx*ay+dy*ax ;
+	float x  = dx*ax+dy*ay;
+	float y  =-dx*ay+dy*ax;
 	float r2 = 1./(x*x+y*y);
-	float dr = sqrt(r2)    ;
-	m_Tz[Nt]  = dz*dr       ;
-	if (m_Tz[Nt]<m_dzdrmin || m_Tz[Nt]>m_dzdrmax) continue;
+	float dr = sqrt(r2);
+	data.Tz[Nt] = dz*dr;
+	if (data.Tz[Nt]<m_dzdrmin || data.Tz[Nt]>m_dzdrmax) continue;
 	
-	m_SP[Nt] = (*r);
-	m_U [Nt] = x*r2;
-	m_V [Nt] = y*r2;
-	m_Er[Nt] = (covz0+m_SP[Nt]->covz()+m_Tz[Nt]*m_Tz[Nt]*(covr0+m_SP[Nt]->covr()))*r2;
-	m_R [Nt] = dr;
+	data.SP[Nt] = (*r);
+	data.U [Nt] = x*r2;
+	data.V [Nt] = y*r2;
+	data.Er[Nt] = (covz0+data.SP[Nt]->covz()+data.Tz[Nt]*data.Tz[Nt]*(covr0+data.SP[Nt]->covr()))*r2;
+	data.R [Nt] = dr;
 	if (++Nt==m_maxsizeSP) goto breakt;
       }
     }
@@ -931,26 +917,26 @@ void InDet::SiSpacePointsSeedMaker_Cosmic::production3Sp
     //
     for (int b=Nb-1; b>=0; --b) {
       
-      float SA  = 1.+m_Tz[b]*m_Tz[b];
+      float SA  = 1.+data.Tz[b]*data.Tz[b];
       
       for (int t=Nb;  t!=Nt; ++t) {
 
-	float Ts = .5*(m_Tz[b]+m_Tz[t]);
-	float dt =  m_Tz[b]-m_Tz[t]    ;
-	float dT = dt*dt-m_Er[b]-m_Er[t]-2.*m_R[b]*m_R[t]*(Ts*Ts*covr0+covz0);
+	float Ts = .5*(data.Tz[b]+data.Tz[t]);
+	float dt =  data.Tz[b]-data.Tz[t]    ;
+	float dT = dt*dt-data.Er[b]-data.Er[t]-2.*data.R[b]*data.R[t]*(Ts*Ts*covr0+covz0);
 	if ( dT > 0. && dT > (ipt*ipt)*COF*SA ) continue;
-	float dU = m_U[t]-m_U[b]; if (dU == 0.) continue;
-	float A  = (m_V[t]-m_V[b])/dU                  ;
-	float B  =  m_V[t]-A*m_U[t]                    ;
+	float dU = data.U[t]-data.U[b]; if (dU == 0.) continue;
+	float A  = (data.V[t]-data.V[b])/dU                  ;
+	float B  =  data.V[t]-A*data.U[t]                    ;
 	float S2 = 1.+A*A                              ;
 	float S  = sqrt(S2)                            ;
 	float BK = fabs(B*K)                           ;
 	if (BK > ipt*S) continue                       ; // Momentum    cut
 	dT       -= ((BK*BK)*COF*SA/S2)                ;
 	if (dT > 0.) continue                          ; // Polar angle cut
-	dT*= ((m_R[b]*m_R[t])/(m_R[b]+m_R[t]));
+	dT*= ((data.R[b]*data.R[t])/(data.R[b]+data.R[t]));
 
-	newSeed(m_SP[b]->spacepoint,(*r0)->spacepoint,m_SP[t]->spacepoint,dT);
+	newSeed(data, data.SP[b]->spacepoint,(*r0)->spacepoint,data.SP[t]->spacepoint,dT);
       }
     }
   }
@@ -961,17 +947,18 @@ void InDet::SiSpacePointsSeedMaker_Cosmic::production3Sp
 ///////////////////////////////////////////////////////////////////
 
 void InDet::SiSpacePointsSeedMaker_Cosmic::production3SpWithoutField
-( std::list<InDet::SiSpacePointForSeed*>::iterator* rb ,
-  std::list<InDet::SiSpacePointForSeed*>::iterator* rbe,
-  std::list<InDet::SiSpacePointForSeed*>::iterator* rt ,
-  std::list<InDet::SiSpacePointForSeed*>::iterator* rte,
-  int NB, int NT,float ipt) 
+(EventData& data,
+ std::list<InDet::SiSpacePointForSeed*>::iterator* rb ,
+ std::list<InDet::SiSpacePointForSeed*>::iterator* rbe,
+ std::list<InDet::SiSpacePointForSeed*>::iterator* rt ,
+ std::list<InDet::SiSpacePointForSeed*>::iterator* rte,
+ int NB, int NT,float ipt) const
 {
   const float COF    = 134*.05*9.;
   const float dFcut  = .96       ;
 
   std::list<InDet::SiSpacePointForSeed*>::iterator r0=rb[0],r;
-  if (!m_endlist) {r0 = m_rMin; m_endlist = true;}
+  if (!data.endlist) {r0 = data.rMin; data.endlist = true;}
 
   // Loop through all trigger space points
   //
@@ -1002,19 +989,18 @@ void InDet::SiSpacePointsSeedMaker_Cosmic::production3SpWithoutField
 	if (!pix && !(*r)->spacepoint->clusterList().second) continue;
 	if ( pix &&  (*r)->spacepoint->clusterList().second) continue;
 
-	float dx = X-(*r)->x()     ;
-	float dz = Z-(*r)->z()     ;
+	float dx = X-(*r)->x();
+	float dz = Z-(*r)->z();
 	float r2 = 1./(dx*dx+dy*dy);
-	float dr = sqrt(r2)        ;
-	m_Tz[Nb]  = dz*dr           ;
-	
-	if (m_Tz[Nb]<m_dzdrmin || m_Tz[Nb]>m_dzdrmax) continue;
-
-	m_SP[Nb] = (*r) ;
-	m_U [Nb] = dx*dr;
-	m_V [Nb] = dy*dr;
-	m_Er[Nb] = (covz0+m_SP[Nb]->covz()+m_Tz[Nb]*m_Tz[Nb]*(covr0+m_SP[Nb]->covr()))*r2;
-	m_R [Nb] = dr   ;
+	float dr = sqrt(r2);
+	data.Tz[Nb]  = dz*dr;
+	if (data.Tz[Nb]<m_dzdrmin || data.Tz[Nb]>m_dzdrmax) continue;
+
+	data.SP[Nb] = (*r) ;
+	data.U [Nb] = dx*dr;
+	data.V [Nb] = dy*dr;
+	data.Er[Nb] = (covz0+data.SP[Nb]->covz()+data.Tz[Nb]*data.Tz[Nb]*(covr0+data.SP[Nb]->covr()))*r2;
+	data.R [Nb] = dr   ;
 	if (++Nb==m_maxsizeSP) goto breakb;
       }
     }
@@ -1037,19 +1023,18 @@ void InDet::SiSpacePointsSeedMaker_Cosmic::production3SpWithoutField
 	if ( pix &&  (*r)->spacepoint->clusterList().second) continue;
 	if (!pix && !(*r)->spacepoint->clusterList().second) continue;
 
-	float dx = (*r)->x()-X     ;
-	float dz = (*r)->z()-Z     ;
+	float dx = (*r)->x()-X;
+	float dz = (*r)->z()-Z;
 	float r2 = 1./(dx*dx+dy*dy);
-	float dr = sqrt(r2)        ;
-	m_Tz[Nt]  = dz*dr           ;
-
-	if (m_Tz[Nt]<m_dzdrmin || m_Tz[Nt]>m_dzdrmax) continue;
-
-	m_SP[Nt] = (*r) ;
-	m_U [Nt] = dx*dr;
-	m_V [Nt] = dy*dr;
-	m_Er[Nt] = (covz0+m_SP[Nt]->covz()+m_Tz[Nt]*m_Tz[Nt]*(covr0+m_SP[Nt]->covr()))*r2;
-	m_R [Nt] = dr   ;
+	float dr = sqrt(r2);
+	data.Tz[Nt]  = dz*dr;
+	if (data.Tz[Nt]<m_dzdrmin || data.Tz[Nt]>m_dzdrmax) continue;
+
+	data.SP[Nt] = (*r) ;
+	data.U [Nt] = dx*dr;
+	data.V [Nt] = dy*dr;
+	data.Er[Nt] = (covz0+data.SP[Nt]->covz()+data.Tz[Nt]*data.Tz[Nt]*(covr0+data.SP[Nt]->covr()))*r2;
+	data.R [Nt] = dr   ;
 	if (++Nt==m_maxsizeSP) goto breakt;
       }
     }
@@ -1062,26 +1047,26 @@ void InDet::SiSpacePointsSeedMaker_Cosmic::production3SpWithoutField
     //
     for (int b=Nb-1; b>=0; --b) {
       
-      float SA  = 1.+m_Tz[b]*m_Tz[b];
+      float SA  = 1.+data.Tz[b]*data.Tz[b];
 
       for (int t=Nb;  t!=Nt; ++t) {
 
 	// Azimuth angle cut
 	//
-	float dF = m_U[b]*m_U[t]+m_V[b]*m_V[t];
+	float dF = data.U[b]*data.U[t]+data.V[b]*data.V[t];
 	if (dF < dFcut) continue;
 	
 	// Polar angle cut
 	//
-	float Ts = .5*(m_Tz[b]+m_Tz[t]);
-	float dT =  m_Tz[b]-m_Tz[t]    ;
-	dT        = dT*dT-m_Er[b]-m_Er[t]-2.*m_R[b]*m_R[t]*(Ts*Ts*covr0+covz0);
+	float Ts = .5*(data.Tz[b]+data.Tz[t]);
+	float dT =  data.Tz[b]-data.Tz[t]    ;
+	dT        = dT*dT-data.Er[b]-data.Er[t]-2.*data.R[b]*data.R[t]*(Ts*Ts*covr0+covz0);
 	dT       -= (ipt*ipt)*COF*SA    ;
 	if ( dT > 0. ) continue          ;
 
-	dT*= ((m_R[b]*m_R[t])/(m_R[b]+m_R[t]));
+	dT*= ((data.R[b]*data.R[t])/(data.R[b]+data.R[t]));
 
-	newSeed(m_SP[b]->spacepoint,(*r0)->spacepoint,m_SP[t]->spacepoint,dT);
+	newSeed(data, data.SP[b]->spacepoint,(*r0)->spacepoint,data.SP[t]->spacepoint,dT);
       }
     }
   }
@@ -1091,7 +1076,7 @@ void InDet::SiSpacePointsSeedMaker_Cosmic::production3SpWithoutField
 // Test is space point used
 ///////////////////////////////////////////////////////////////////
 
-bool InDet::SiSpacePointsSeedMaker_Cosmic::isUsed(const Trk::SpacePoint* sp)
+bool InDet::SiSpacePointsSeedMaker_Cosmic::isUsed(const Trk::SpacePoint* sp) const
 {
   const Trk::PrepRawData* d = sp->clusterList().first;
   if (!d || !m_assoTool->isUsed(*d)) return false;
@@ -1104,9 +1089,11 @@ bool InDet::SiSpacePointsSeedMaker_Cosmic::isUsed(const Trk::SpacePoint* sp)
 
 const InDet::SiSpacePointsSeed* InDet::SiSpacePointsSeedMaker_Cosmic::next()
 {
-  if (m_i_seed==m_i_seede) return nullptr;
-  InDet::SiSpacePointsSeed* sp = (*m_i_seed).second;
-  ++m_i_seed;
+  EventData& data{getEventData()};
+
+  if (data.i_seed==data.i_seede) return nullptr;
+  InDet::SiSpacePointsSeed* sp = (*data.i_seed).second;
+  ++data.i_seed;
   return(sp);
 }
     
@@ -1115,7 +1102,7 @@ const InDet::SiSpacePointsSeed* InDet::SiSpacePointsSeedMaker_Cosmic::next()
 ///////////////////////////////////////////////////////////////////
 
 InDet::SiSpacePointForSeed* InDet::SiSpacePointsSeedMaker_Cosmic::newSpacePoint
-(const Trk::SpacePoint*const& sp) 
+(EventData& data, const Trk::SpacePoint*const& sp) const
 {
   InDet::SiSpacePointForSeed* sps = nullptr;
 
@@ -1123,13 +1110,13 @@ InDet::SiSpacePointForSeed* InDet::SiSpacePointsSeedMaker_Cosmic::newSpacePoint
                 static_cast<float>(sp->globalPosition().y()),
                 static_cast<float>(sp->globalPosition().z())};
 
-  if (m_i_spforseed!=m_l_spforseed.end()) {
-    sps = &(*m_i_spforseed++);
+  if (data.i_spforseed!=data.l_spforseed.end()) {
+    sps = &(*data.i_spforseed++);
     sps->set(sp, r);
   } else {
-    m_l_spforseed.push_back(InDet::SiSpacePointForSeed(sp, r));
-    sps = &(m_l_spforseed.back());
-    m_i_spforseed = m_l_spforseed.end();
+    data.l_spforseed.push_back(InDet::SiSpacePointForSeed(sp, r));
+    sps = &(data.l_spforseed.back());
+    data.i_spforseed = data.l_spforseed.end();
   }
       
   return sps;
@@ -1140,7 +1127,7 @@ InDet::SiSpacePointForSeed* InDet::SiSpacePointsSeedMaker_Cosmic::newSpacePoint
 ///////////////////////////////////////////////////////////////////
 
 InDet::SiSpacePointForSeed* InDet::SiSpacePointsSeedMaker_Cosmic::newSpacePoint
-(const Trk::SpacePoint*const& sp,const float* sc) 
+(EventData& data, const Trk::SpacePoint*const& sp,const float* sc) const
 {
   InDet::SiSpacePointForSeed* sps = nullptr;
 
@@ -1149,13 +1136,13 @@ InDet::SiSpacePointForSeed* InDet::SiSpacePointsSeedMaker_Cosmic::newSpacePoint
   r[1]=sp->globalPosition().y();
   r[2]=sp->globalPosition().z();
 
-  if (m_i_spforseed!=m_l_spforseed.end()) {
-    sps = &(*m_i_spforseed++);
+  if (data.i_spforseed!=data.l_spforseed.end()) {
+    sps = &(*data.i_spforseed++);
     sps->set(sp, r, sc);
   } else {
-    m_l_spforseed.push_back(InDet::SiSpacePointForSeed(sp, r, sc));
-    sps = &(m_l_spforseed.back());
-    m_i_spforseed = m_l_spforseed.end();
+    data.l_spforseed.push_back(InDet::SiSpacePointForSeed(sp, r, sc));
+    sps = &(data.l_spforseed.back());
+    data.i_spforseed = data.l_spforseed.end();
   }
       
   return sps;
@@ -1166,27 +1153,28 @@ InDet::SiSpacePointForSeed* InDet::SiSpacePointsSeedMaker_Cosmic::newSpacePoint
 ///////////////////////////////////////////////////////////////////
 
 void InDet::SiSpacePointsSeedMaker_Cosmic::newSeed
-(const Trk::SpacePoint*& p1,const Trk::SpacePoint*& p2, 
- const float& z) 
+(EventData& data,
+ const Trk::SpacePoint*& p1,const Trk::SpacePoint*& p2, 
+ const float& z) const
 {
-  if (m_nseeds < m_maxsize) {
-    m_seeds[m_nseeds].erase     (  );
-    m_seeds[m_nseeds].add       (p1);
-    m_seeds[m_nseeds].add       (p2);
-    m_seeds[m_nseeds].setZVertex(0.);
-    m_l_seeds.insert(std::make_pair(z, &(m_seeds[m_nseeds])));
-    ++m_nseeds;
+  if (data.nseeds < m_maxsize) {
+    data.seeds[data.nseeds].erase     (  );
+    data.seeds[data.nseeds].add       (p1);
+    data.seeds[data.nseeds].add       (p2);
+    data.seeds[data.nseeds].setZVertex(0.);
+    data.l_seeds.insert(std::make_pair(z, &(data.seeds[data.nseeds])));
+    ++data.nseeds;
   } else {
-    std::multimap<float,InDet::SiSpacePointsSeed*>::reverse_iterator l = m_l_seeds.rbegin();
+    std::multimap<float,InDet::SiSpacePointsSeed*>::reverse_iterator l = data.l_seeds.rbegin();
     if ((*l).first <= z) return;
     InDet::SiSpacePointsSeed* s = (*l).second;
-    m_l_seeds.erase((*l).first);
+    data.l_seeds.erase((*l).first);
 
     s->erase     (  );
     s->add       (p1);
     s->add       (p2);
     s->setZVertex(0.);
-    m_l_seeds.insert(std::make_pair(z,s));
+    data.l_seeds.insert(std::make_pair(z,s));
   }
 }
 
@@ -1195,28 +1183,74 @@ void InDet::SiSpacePointsSeedMaker_Cosmic::newSeed
 ///////////////////////////////////////////////////////////////////
 
 void InDet::SiSpacePointsSeedMaker_Cosmic::newSeed
-(const Trk::SpacePoint*& p1,const Trk::SpacePoint*& p2, 
- const Trk::SpacePoint*& p3,const float& z) 
+(EventData& data,
+ const Trk::SpacePoint*& p1,const Trk::SpacePoint*& p2, 
+ const Trk::SpacePoint*& p3,const float& z) const
 {
-  if (m_nseeds < m_maxsize) {
-    m_seeds[m_nseeds].erase     (  );
-    m_seeds[m_nseeds].add       (p1);
-    m_seeds[m_nseeds].add       (p2);
-    m_seeds[m_nseeds].add       (p3);
-    m_seeds[m_nseeds].setZVertex(0.);
-    m_l_seeds.insert(std::make_pair(z, &(m_seeds[m_nseeds])));
-    ++m_nseeds;
+  if (data.nseeds < m_maxsize) {
+    data.seeds[data.nseeds].erase     (  );
+    data.seeds[data.nseeds].add       (p1);
+    data.seeds[data.nseeds].add       (p2);
+    data.seeds[data.nseeds].add       (p3);
+    data.seeds[data.nseeds].setZVertex(0.);
+    data.l_seeds.insert(std::make_pair(z, &(data.seeds[data.nseeds])));
+    ++data.nseeds;
   } else {
-    std::multimap<float,InDet::SiSpacePointsSeed*>::reverse_iterator l = m_l_seeds.rbegin();
+    std::multimap<float,InDet::SiSpacePointsSeed*>::reverse_iterator l = data.l_seeds.rbegin();
     if ((*l).first <= z) return;
     InDet::SiSpacePointsSeed* s = (*l).second;
-    m_l_seeds.erase((*l).first);
+    data.l_seeds.erase((*l).first);
 
     s->erase     (  );
     s->add       (p1);
     s->add       (p2);
     s->add       (p3);
     s->setZVertex(0.);
-    m_l_seeds.insert(std::make_pair(z,s));
+    data.l_seeds.insert(std::make_pair(z,s));
   }
 }
+
+InDet::SiSpacePointsSeedMaker_Cosmic::EventData&
+InDet::SiSpacePointsSeedMaker_Cosmic::getEventData() const {
+  const EventContext& ctx{Gaudi::Hive::currentContext()};
+  EventContext::ContextID_t slot{ctx.slot()};
+  EventContext::ContextEvt_t evt{ctx.evt()};
+  if (not m_initialized) slot = 0;
+  std::lock_guard<std::mutex> lock{m_mutex};
+  if (slot>=m_cache.size()) { // Need to extend vectors
+    static const EventContext::ContextEvt_t invalidValue{EventContext::INVALID_CONTEXT_EVT};
+    m_cache.resize(slot+1, invalidValue); // Store invalid values in order to go to the next IF statement
+    m_eventData.resize(slot+1);
+  }
+  if (m_cache[slot]!=evt) { // New event
+    m_cache[slot] = evt;
+    // Initialization
+    m_eventData[slot] = EventData{}; // This will be improved later.
+
+    // Build radius sorted containers
+    m_eventData[slot].r_Sorted.resize(m_r_size);
+    m_eventData[slot].r_index.resize(m_r_size, 0);
+    m_eventData[slot].r_map.resize(m_r_size, 0);
+    // Build radius-azimuthal sorted containers
+    for (int i=0; i<SizeRF; ++i) {
+      m_eventData[slot].rf_index[i]=0;
+      m_eventData[slot].rf_map[i]=0;
+    }
+    // Build radius-azimuthal-Z sorted containers
+    for (int i=0; i!=SizeRFZ; ++i) {
+      m_eventData[slot].rfz_index[i]=0;
+      m_eventData[slot].rfz_map[i]=0;
+    }
+
+    m_eventData[slot].SP.resize(m_maxsizeSP, nullptr);
+    m_eventData[slot].R.resize(m_maxsizeSP, 0.);
+    m_eventData[slot].Tz.resize(m_maxsizeSP, 0.);
+    m_eventData[slot].Er.resize(m_maxsizeSP, 0.);
+    m_eventData[slot].U.resize(m_maxsizeSP, 0.);
+    m_eventData[slot].V.resize(m_maxsizeSP, 0.);
+
+    m_eventData[slot].seeds.resize(m_maxsize+5);
+  }
+
+  return m_eventData[slot]; 
+}