diff --git a/Digitisers/SimpleDigi/src/PlanarDigiAlg.cpp b/Digitisers/SimpleDigi/src/PlanarDigiAlg.cpp
index 113f2d8b30c5a77086bdc19ffedbe7323468c35e..482082a064e982a0452b93e4a945b5e2d35d13f7 100644
--- a/Digitisers/SimpleDigi/src/PlanarDigiAlg.cpp
+++ b/Digitisers/SimpleDigi/src/PlanarDigiAlg.cpp
@@ -91,10 +91,10 @@ StatusCode PlanarDigiAlg::initialize()
     return StatusCode::FAILURE;
   }
   
-  MarlinTrk::IMarlinTrkSystem* _trksystem =  _trackSystemSvc->getTrackSystem();
+  MarlinTrk::IMarlinTrkSystem* _trksystem =  _trackSystemSvc->getTrackSystem(this);
   _trksystem->init();
   
-  _trackSystemSvc->removeTrackSystem();
+  _trackSystemSvc->removeTrackSystem(this);
   
   return GaudiAlgorithm::initialize();
 }
@@ -338,8 +338,8 @@ StatusCode PlanarDigiAlg::execute()
     float weight = 1.0;
 
     debug() <<" Set relation between "
-            << " sim hit " << SimTHit 
-            << " to tracker hit " << trkHit
+            << " sim hit " << SimTHit.id() 
+            << " to tracker hit " << trkHit.id()
             << " with a weight of " << weight 
             << endmsg;
     trkHit.addToRawHits(SimTHit.getObjectID());
diff --git a/Reconstruction/SiliconTracking/src/ForwardTrackingAlg.cpp b/Reconstruction/SiliconTracking/src/ForwardTrackingAlg.cpp
index 6833e4041883b5bfc42ec21a9ac053bf4b5b8d70..7583b9f3453926b6231779a94e62adc1cf133fe1 100644
--- a/Reconstruction/SiliconTracking/src/ForwardTrackingAlg.cpp
+++ b/Reconstruction/SiliconTracking/src/ForwardTrackingAlg.cpp
@@ -137,7 +137,7 @@ StatusCode ForwardTrackingAlg::initialize(){
     error() << "Failed to find TrackSystemSvc ..." << endmsg;
     return StatusCode::FAILURE;
   }
-  _trkSystem =  _trackSystemSvc->getTrackSystem();
+  _trkSystem =  _trackSystemSvc->getTrackSystem(this);
 
   if( _trkSystem == 0 ){
     error() << "Cannot initialize MarlinTrkSystem of Type: KalTest" <<endmsg;
@@ -150,7 +150,7 @@ StatusCode ForwardTrackingAlg::initialize(){
   _trkSystem->setOption( MarlinTrk::IMarlinTrkSystem::CFG::useSmoothing,  _SmoothOn) ;    //smoothing
 
   // initialise the tracking system
-  //_trkSystem->init() ;
+  _trkSystem->init() ;
 
   /**********************************************************************************************/
   /*       Do a few checks, if the set parameters are right                                     */
diff --git a/Reconstruction/SiliconTracking/src/SiliconTrackingAlg.cpp b/Reconstruction/SiliconTracking/src/SiliconTrackingAlg.cpp
index 9dc2964076fb4020e1a99220e9d16839450b7e11..06822bb910b8138d387f1a85e24aebf690941e8b 100644
--- a/Reconstruction/SiliconTracking/src/SiliconTrackingAlg.cpp
+++ b/Reconstruction/SiliconTracking/src/SiliconTrackingAlg.cpp
@@ -64,7 +64,7 @@ DECLARE_COMPONENT( SiliconTrackingAlg )
 
 SiliconTrackingAlg::SiliconTrackingAlg(const std::string& name, ISvcLocator* svcLoc)
 : GaudiAlgorithm(name, svcLoc) {
-  
+
   //_description = "Pattern recognition in silicon trackers";
   
   _fastfitter = new MarlinTrk::HelixFit();
@@ -111,7 +111,7 @@ StatusCode  SiliconTrackingAlg::initialize() {
     error() << "Failed to find TrackSystemSvc ..." << endmsg;
     return StatusCode::FAILURE;
   }
-  _trksystem =  _trackSystemSvc->getTrackSystem();
+  _trksystem =  _trackSystemSvc->getTrackSystem(this);
   
   if( _trksystem == 0 ){
     error() << "Cannot initialize MarlinTrkSystem of Type: KalTest" <<endmsg;
@@ -448,12 +448,12 @@ int SiliconTrackingAlg::InitialiseFTD() {
       const float eps = 1.0e-07;
       // V must be the global z axis 
       if( fabs(V.dot(Z)) > eps ) {
-	error() << "SiliconTrackingAlg: VXD Hit measurment vectors V is not in the global X-Y plane. \n\n  exit(1) called from file " << __FILE__ << " and line " << __LINE__ << endmsg;
+	error() << "SiliconTrackingAlg: FTD Hit measurment vectors V is not in the global X-Y plane. \n\n  exit(1) called from file " << __FILE__ << " and line " << __LINE__ << endmsg;
 	exit(1);
       }
       
       if( fabs(U.dot(Z)) > eps ) {
-	error() << "SiliconTrackingAlg: VXD Hit measurment vectors U is not in the global X-Y plane. \n\n exit(1) called from file " << __FILE__ << " and line " << __LINE__ << endmsg;
+	error() << "SiliconTrackingAlg: FTD Hit measurment vectors U is not in the global X-Y plane. \n\n exit(1) called from file " << __FILE__ << " and line " << __LINE__ << endmsg;
 	exit(1);
       }
       // SJA:FIXME Here dU and dV are almost certainly dX and dY ... should test ...
@@ -491,7 +491,7 @@ int SiliconTrackingAlg::InitialiseFTD() {
 	else {
 	  layer = 2*layer + 1;
 	}
-	
+	//debug() << "_petalBasedFTDWithOverlaps = true layer->2*layer,2layer+1 according to petalIndex = " << petalIndex << endmsg;
       }
       if (layer >= _nlayersFTD) {
 	fatal() << "SiliconTrackingAlg => fatal error in FTD : layer is outside allowed range : " << layer << " number of layers = " << _nlayersFTD <<  endmsg;
@@ -509,7 +509,7 @@ int SiliconTrackingAlg::InitialiseFTD() {
       int iCode = iSemiSphere + 2*layer + 2*_nlayersFTD*iPhi;
       _sectorsFTD[iCode].push_back( hitExt );
       
-      debug() << " FTD Pixel Hit added : @ " << pos[0] << " " << pos[1] << " " << pos[2] << " drphi " << hitExt->getResolutionRPhi() << " dz " << hitExt->getResolutionZ() << "  iPhi = " << iPhi <<  " iSemiSphere "  << iSemiSphere << " iCode = " << iCode << "  layer = " << layer << endmsg;  
+      debug() << " FTD Pixel Hit added : @ " << pos[0] << " " << pos[1] << " " << pos[2] << " drphi " << hitExt->getResolutionRPhi() << " dz " << hitExt->getResolutionZ() << "  iPhi = " << iPhi << " iSemiSphere "  << iSemiSphere << " iCode = " << iCode << " layer = " << layer << " cellID = " << hit.getCellID() << endmsg;  
     }
   }
   // Reading out FTD SpacePoint Collection
@@ -579,7 +579,6 @@ int SiliconTrackingAlg::InitialiseFTD() {
       unsigned int petalIndex = static_cast<unsigned int>(getModuleID(hit));
       
       if ( _petalBasedFTDWithOverlaps == true ) {
-        
         // as we are dealing with staggered petals we will use 2*nlayers in each directions +/- z
         // the layers will follow the even odd numbering of the petals 
         if ( petalIndex % 2 == 0 ) {
@@ -588,7 +587,7 @@ int SiliconTrackingAlg::InitialiseFTD() {
         else {
           layer = 2*layer + 1;
         }
-        
+        //debug() << "_petalBasedFTDWithOverlaps = true layer->2*layer,2layer+1 according to petalIndex = " << petalIndex << endmsg;
       }
       
       if (layer >= _nlayersFTD) {
@@ -607,7 +606,7 @@ int SiliconTrackingAlg::InitialiseFTD() {
       int iCode = iSemiSphere + 2*layer + 2*_nlayersFTD*iPhi;
       _sectorsFTD[iCode].push_back( hitExt );
       
-      debug() << " FTD SpacePoint Hit added : @ " << pos[0] << " " << pos[1] << " " << pos[2] << " drphi " << hitExt->getResolutionRPhi() << " dz " << hitExt->getResolutionZ() << "  iPhi = " << iPhi <<  " iSemiSphere "  << iSemiSphere << " iCode = " << iCode << "  layer = " << layer << endmsg;  
+      debug() << " FTD SpacePoint Hit added : @ " << pos[0] << " " << pos[1] << " " << pos[2] << " drphi " << hitExt->getResolutionRPhi() << " dz " << hitExt->getResolutionZ() << "  iPhi = " << iPhi << " iSemiSphere "  << iSemiSphere << " iCode = " << iCode << " layer = " << layer << " cellID = " << hit.getCellID() << endmsg;  
       
     }
   }
@@ -677,7 +676,7 @@ int SiliconTrackingAlg::InitialiseVTX() {
         exit(1);
       }
       TrackerHitExtended * hitExt = new TrackerHitExtended(hit);
-      debug() << "Saved TrackerHit pointer in TrackerHitExtended " << ielem << ": " << hitExt->getTrackerHit() << std::endl;
+      //debug() << "Saved TrackerHit id in TrackerHitExtended " << ielem << ": " << hitExt->getTrackerHit().id() << std::endl;
             
       // SJA:FIXME: just use planar res for now
       hitExt->setResolutionRPhi(hit.getCovMatrix()[2]);
@@ -799,7 +798,7 @@ int SiliconTrackingAlg::InitialiseVTX() {
         // or a PIXEL based SIT, using 2D TrackerHitPlane like the VXD above
 	// by fucd
         //else if ( ( trkhit_P = dynamic_cast<TrackerHitPlane*>( hitCollection->getElementAt( ielem ) ) ) )  {
-	else if( UTIL::BitSet32( trkhit.getType() )[ 31 ]){
+	else if( UTIL::BitSet32( trkhit.getType() )[ 3 ]){
           // first we need to check if the measurement vectors are aligned with the global coordinates 
           //gear::Vector3D U(1.0,trkhit_P->getU()[1],trkhit_P->getU()[0],gear::Vector3D::spherical);
           //gear::Vector3D V(1.0,trkhit_P->getV()[1],trkhit_P->getV()[0],gear::Vector3D::spherical);
@@ -907,6 +906,7 @@ StatusCode  SiliconTrackingAlg::finalize(){
   //delete _trksystem ; _trksystem = 0;
   //delete _histos ; _histos = 0;
   info() << "Processed " << _nEvt << " events " << endmsg;
+  info() << lcio::ILDCellID0::encoder_string << " " << UTIL::ILDCellID0::encoder_string << endmsg;
   return GaudiAlgorithm::finalize();
 }
 
@@ -2052,7 +2052,7 @@ void SiliconTrackingAlg::AttachRemainingVTXHitsSlow() {
             // Here we are trying to find if a hits are too close i.e. closer than _minDistToDelta
 	    edm4hep::ConstTrackerHit trkhit1 = hit->getTrackerHit();
 	    edm4hep::ConstTrackerHit trkhit2 = hitVector[IHIT]->getTrackerHit();                  
-            
+	    
             if ( trkhit1.getCellID() == trkhit2.getCellID() ){ // i.e. they are in the same sensor
               
               float distance = 0.;
@@ -2691,9 +2691,9 @@ void SiliconTrackingAlg::FinalRefit(edm4hep::TrackCollection* trk_col) {
         continue ; 
       }
       //TrackImpl* Track = new TrackImpl ;
-      auto track = trk_col->create();
+      //auto track = trk_col->create();
       //fucd
-      //edm4hep::Track track;// = new edm4hep::Track;
+      edm4hep::Track track;// = new edm4hep::Track;
       // setup initial dummy covariance matrix
       //std::vector<float> covMatrix;
       //covMatrix.resize(15);
@@ -2840,7 +2840,7 @@ void SiliconTrackingAlg::FinalRefit(edm4hep::TrackCollection* trk_col) {
       
       //trk_col->addElement(Track);     
       //fucd
-      //trk_col->push_back(track);
+      trk_col->push_back(track);
       for(int i=0;i<track.trackStates_size();i++){
 	// 1 = lcio::EVENT::TrackState::AtIP
 	edm4hep::TrackState trkStateIP = track.getTrackStates(i);
diff --git a/Reconstruction/SiliconTracking/src/SpacePointBuilderAlg.cpp b/Reconstruction/SiliconTracking/src/SpacePointBuilderAlg.cpp
index e907b93acee81c58fc62febdb471e62107c5b13a..956b425122cb65927647ffa885bb3e3524b7e96e 100644
--- a/Reconstruction/SiliconTracking/src/SpacePointBuilderAlg.cpp
+++ b/Reconstruction/SiliconTracking/src/SpacePointBuilderAlg.cpp
@@ -59,10 +59,10 @@ StatusCode SpacePointBuilderAlg::initialize() {
     return StatusCode::FAILURE;
   }
 
-  MarlinTrk::IMarlinTrkSystem* _trksystem =  _trackSystemSvc->getTrackSystem();
+  MarlinTrk::IMarlinTrkSystem* _trksystem =  _trackSystemSvc->getTrackSystem(this);
   _trksystem->init();
 
-  _trackSystemSvc->removeTrackSystem();
+  _trackSystemSvc->removeTrackSystem(this);
   
   return GaudiAlgorithm::initialize();
 }
@@ -204,7 +204,8 @@ StatusCode SpacePointBuilderAlg::execute(){
 
               spacePoint.setType( UTIL::set_bit( spacePoint.getType() ,  UTIL::ILDTrkHitTypeBit::COMPOSITE_SPACEPOINT ) ) ;
 
-              spCol->push_back( spacePoint ); 
+              spCol->push_back( spacePoint );
+	      debug() << "Hit accepted id = " << spacePoint.id() << " cellID = " << spacePoint.getCellID() << endmsg;
 	      //debug() << "push_back space point's id=" << spCol->at(spCol->size()-1).id() << endmsg;
               createdSpacePoints++;
               
@@ -433,12 +434,12 @@ edm4hep::TrackerHit SpacePointBuilderAlg::createSpacePoint( edm4hep::ConstTracke
   cov_plane(1,1) = (0.5 * du2) / cos2_alpha;
   cov_plane(2,2) = (0.5 * du2) / sin2_alpha;
   
-  debug() << "\t cov_plane  = " << cov_plane << endmsg;  
-  debug() << "\tstrip_angle = " << VA.angle(VB)/(M_PI/180) / 2.0 << " degrees " << endmsg;
+  debug() << "cov_plane  = " << cov_plane << endmsg;  
+  debug() << "strip_angle = " << VA.angle(VB)/(M_PI/180) / 2.0 << " degrees " << endmsg;
   
   CLHEP::HepSymMatrix cov_xyz= cov_plane.similarity(rot_sensor_matrix);
   
-  debug() << "\t cov_xyz  = " << cov_xyz << endmsg;
+  debug() << "cov_xyz  = " << cov_xyz << endmsg;
   
   std::array<float, 6> cov;
   //EVENT::FloatVec cov( 9 )  ; 
@@ -453,9 +454,7 @@ edm4hep::TrackerHit SpacePointBuilderAlg::createSpacePoint( edm4hep::ConstTracke
   }
   
   spacePoint.setCovMatrix(cov);
-  
-  debug() << "\tHit accepted id=" << spacePoint.id() << endmsg;
-  
+    
   return spacePoint;
 }
 /*
diff --git a/Reconstruction/SiliconTracking/src/TrackSubsetAlg.cpp b/Reconstruction/SiliconTracking/src/TrackSubsetAlg.cpp
index 2a241cf569d90b1a80953f53b959014d7e937bec..2efe0f52c1fae8cbb0f154b88844469b568d4540 100644
--- a/Reconstruction/SiliconTracking/src/TrackSubsetAlg.cpp
+++ b/Reconstruction/SiliconTracking/src/TrackSubsetAlg.cpp
@@ -63,7 +63,7 @@ StatusCode TrackSubsetAlg::initialize() {
     error() << "Failed to find TrackSystemSvc ..." << endmsg;
     return StatusCode::FAILURE;
   }
-  _trkSystem =  _trackSystemSvc->getTrackSystem();
+  _trkSystem =  _trackSystemSvc->getTrackSystem(this);
 
   if( _trkSystem == 0 ){
     error() << "Cannot initialize MarlinTrkSystem of Type: KalTest" <<endmsg;
@@ -76,7 +76,7 @@ StatusCode TrackSubsetAlg::initialize() {
   _trkSystem->setOption( MarlinTrk::IMarlinTrkSystem::CFG::useSmoothing,  _SmoothOn) ;    //smoothing
   
   // initialise the tracking system
-  //_trkSystem->init() ;
+  _trkSystem->init() ;
 
   return GaudiAlgorithm::initialize();
 }
diff --git a/Service/TrackSystemSvc/TrackSystemSvc/ITrackSystemSvc.h b/Service/TrackSystemSvc/TrackSystemSvc/ITrackSystemSvc.h
index 699d26bab97dae97c77f5bf5969f5bd68631e835..88a2d31dd7a85403efdfd81c790e7f93bc876b27 100644
--- a/Service/TrackSystemSvc/TrackSystemSvc/ITrackSystemSvc.h
+++ b/Service/TrackSystemSvc/TrackSystemSvc/ITrackSystemSvc.h
@@ -13,9 +13,9 @@ class ITrackSystemSvc: virtual public IService {
   virtual ~ITrackSystemSvc() = default;
   
   //Get the track manager
-  virtual MarlinTrk::IMarlinTrkSystem* getTrackSystem() = 0;
+  virtual MarlinTrk::IMarlinTrkSystem* getTrackSystem(void* address=0) = 0;
   
-  virtual void removeTrackSystem() = 0;
+  virtual void removeTrackSystem(void* address=0) = 0;
 };
 
 #endif
diff --git a/Service/TrackSystemSvc/src/TrackSystemSvc.cpp b/Service/TrackSystemSvc/src/TrackSystemSvc.cpp
index 3f1abc0d3489f5a01c883afd613131dcf61f4433..2964fc9d8ea92e8a617fd3784684bdca03269e7f 100644
--- a/Service/TrackSystemSvc/src/TrackSystemSvc.cpp
+++ b/Service/TrackSystemSvc/src/TrackSystemSvc.cpp
@@ -8,15 +8,15 @@
 DECLARE_COMPONENT(TrackSystemSvc)
 
 TrackSystemSvc::TrackSystemSvc(const std::string& name, ISvcLocator* svc)
-  : base_class(name, svc),
-    m_trackSystem(nullptr){
+  : base_class(name, svc){
 }
 
 TrackSystemSvc::~TrackSystemSvc(){
 }
 
-MarlinTrk::IMarlinTrkSystem* TrackSystemSvc::getTrackSystem(){
-  if(!m_trackSystem){
+MarlinTrk::IMarlinTrkSystem* TrackSystemSvc::getTrackSystem(void* address){
+  std::map<void*, MarlinTrk::IMarlinTrkSystem*>::iterator it=m_trackSystems.find(address);
+  if(it==m_trackSystems.end()){
     gear::GearMgr* mgr=0; 
     auto _gear = service<IGearSvc>("GearSvc");
     if ( !_gear ) {
@@ -34,45 +34,39 @@ MarlinTrk::IMarlinTrkSystem* TrackSystemSvc::getTrackSystem(){
       fatal() << "Both GearSvc and GeoSvc invalid!" << endmsg;
       return 0;
     }
-
-    m_trackSystem = new MarlinTrk::MarlinKalTest( *mgr, _geoSvc ) ;
+    debug() << "GearMgr=" << mgr << " GeoSvc=" << _geoSvc << endmsg;
+    MarlinTrk::IMarlinTrkSystem* sys = new MarlinTrk::MarlinKalTest( *mgr, _geoSvc );
+    m_trackSystems[address] = sys;
+    debug() << "Track system created successfully for " << address << endmsg;
+    return sys;
   }
-  return m_trackSystem;
+  return it->second;
 }
 
 StatusCode TrackSystemSvc::initialize(){
-
-  auto _gear = service<IGearSvc>("GearSvc");
-  if ( !_gear ) {
-    error() << "Failed to find GearSvc ..." << endmsg;
-    return StatusCode::FAILURE;
+  for(std::map<void*, MarlinTrk::IMarlinTrkSystem*>::iterator it=m_trackSystems.begin();it!=m_trackSystems.end();it++){
+    delete it->second;
   }
-  gear::GearMgr* mgr = _gear->getGearMgr();
+  m_trackSystems.clear();
 
-  auto _geoSvc = service<IGeoSvc>("GeoSvc");
-  if ( !_geoSvc ) {
-    error() << "Failed to find GeoSvc ..." << endmsg;
-    return StatusCode::FAILURE;
-  }
-  m_trackSystem = new MarlinTrk::MarlinKalTest( *mgr, _geoSvc ) ;
+  m_trackSystems[0] = getTrackSystem(0);
   
   return StatusCode::SUCCESS;
 }
 
-void TrackSystemSvc::removeTrackSystem(){
-  if ( m_trackSystem ) {
-    delete m_trackSystem;
-    m_trackSystem = nullptr;
+void TrackSystemSvc::removeTrackSystem(void* address){
+  std::map<void*, MarlinTrk::IMarlinTrkSystem*>::iterator it=m_trackSystems.find(address);
+  if ( it!=m_trackSystems.end() ) {
+    delete it->second;
+    m_trackSystems.erase(it);
   }
   return;
 }
 
 StatusCode TrackSystemSvc::finalize(){
-  
-  // if ( m_trackSystem ) {
-  //   delete m_trackSystem;
-  //   m_trackSystem = nullptr;
-  // }
+  for(std::map<void*, MarlinTrk::IMarlinTrkSystem*>::iterator it=m_trackSystems.begin();it!=m_trackSystems.end();it++){
+    delete it->second;
+  }
   
   return StatusCode::SUCCESS;
 }
diff --git a/Service/TrackSystemSvc/src/TrackSystemSvc.h b/Service/TrackSystemSvc/src/TrackSystemSvc.h
index 45830a4f966682582a380093f22b4fd24a6d0854..b03dbd9b26d74f16c954206867ab976a26e39398 100644
--- a/Service/TrackSystemSvc/src/TrackSystemSvc.h
+++ b/Service/TrackSystemSvc/src/TrackSystemSvc.h
@@ -9,14 +9,14 @@ class TrackSystemSvc : public extends<Service, ITrackSystemSvc>{
   TrackSystemSvc(const std::string& name, ISvcLocator* svc);
   ~TrackSystemSvc();
 
-  MarlinTrk::IMarlinTrkSystem* getTrackSystem() override;
-  void removeTrackSystem() override;
+  MarlinTrk::IMarlinTrkSystem* getTrackSystem(void* address=0) override;
+  void removeTrackSystem(void* address=0) override;
 
   StatusCode initialize() override;
   StatusCode finalize() override;
 
  private:
-  MarlinTrk::IMarlinTrkSystem* m_trackSystem;
+  std::map<void*, MarlinTrk::IMarlinTrkSystem*> m_trackSystems;
 };
 
 #endif