diff --git a/Trigger/TrigAlgorithms/TrigFastTrackFinder/TrigFastTrackFinder/TrigFastTrackFinder.h b/Trigger/TrigAlgorithms/TrigFastTrackFinder/TrigFastTrackFinder/TrigFastTrackFinder.h
index 0db766ada675d7445d03cd0a4f05eda652b4f308..910dbb5002bd780a85a3151e2f60276d51027dfd 100644
--- a/Trigger/TrigAlgorithms/TrigFastTrackFinder/TrigFastTrackFinder/TrigFastTrackFinder.h
+++ b/Trigger/TrigAlgorithms/TrigFastTrackFinder/TrigFastTrackFinder/TrigFastTrackFinder.h
@@ -75,6 +75,8 @@ class TrigFastTrackFinder : public HLT::FexAlgo {
   HLT::ErrorCode hltExecute(const HLT::TriggerElement* inputTE,
 			    HLT::TriggerElement* outputTE);
 
+  StatusCode findTracks(const TrigRoiDescriptor& roi, TrackCollection& outputTracks);
+
   double trackQuality(const Trk::Track* Tr);
   void filterSharedTracks(std::vector<std::tuple<bool, double, Trk::Track*>>& QT);
 
diff --git a/Trigger/TrigAlgorithms/TrigFastTrackFinder/src/TrigFastTrackFinder.cxx b/Trigger/TrigAlgorithms/TrigFastTrackFinder/src/TrigFastTrackFinder.cxx
index 6f9e5478f74d590035bd41e56aefe95fb4237a6e..b11ca85e3bd1a914716b80cc2d1c82f4921e2097 100644
--- a/Trigger/TrigAlgorithms/TrigFastTrackFinder/src/TrigFastTrackFinder.cxx
+++ b/Trigger/TrigAlgorithms/TrigFastTrackFinder/src/TrigFastTrackFinder.cxx
@@ -413,17 +413,30 @@ HLT::ErrorCode TrigFastTrackFinder::hltBeginRun()
 }
 
 //-------------------------------------------------------------------------
-
 HLT::ErrorCode TrigFastTrackFinder::hltExecute(const HLT::TriggerElement* /*inputTE*/,
     HLT::TriggerElement* outputTE) {
+  const IRoiDescriptor* internalRoI;
+  HLT::ErrorCode ec = getRoI(outputTE, internalRoI);
+  if(ec != HLT::OK) {
+    return ec;
+  }
+  TrackCollection* outputTracks = new TrackCollection();
+  StatusCode sc = findTracks(*internalRoI, *outputTracks);
+  if (sc != StatusCode::SUCCESS) {
+    return HLT::ERROR;
+  }
+  HLT::ErrorCode code = attachFeature(outputTE, outputTracks, m_attachedFeatureName);
+  if (code != HLT::OK) {
+    return code;
+  }
+  return HLT::OK;
+}
 
-  ATH_MSG_VERBOSE("TrigFastTrackFinder::execHLTAlgorithm()");
 
+StatusCode TrigFastTrackFinder::findTracks(const TrigRoiDescriptor& roi,
+                                      TrackCollection& outputTracks) {
   clearMembers();
 
-  // 2. Retrieve beam spot and magnetic field information 
-  //
-
   m_shift_x=0.0;
   m_shift_y=0.0;
   if(m_useBeamSpot && m_iBeamCondSvc) {
@@ -435,92 +448,42 @@ HLT::ErrorCode TrigFastTrackFinder::hltExecute(const HLT::TriggerElement* /*inpu
   }
   
 
+  ATH_MSG_INFO("Debug: " << roi);
   
   if ( timerSvc() ) m_SpacePointConversionTimer->start();
   
-  // 4. RoI preparation/update 
-  const IRoiDescriptor* internalRoI;
-  HLT::ErrorCode ec = getRoI(outputTE, internalRoI);
-  if (ec!=HLT::OK) {
-    return ec;
-  }
   
   m_currentStage = 1;
-  m_countTotalRoI++;
 
   if(m_ftkMode) {
     if ( timerSvc() ) m_TrackFitterTimer->start();
-    TrackCollection* ftkTracks = m_ftkDataProviderSvc->getTracksInRoi(*internalRoI, m_ftkRefit);//This is a view container
+    outputTracks = *(m_ftkDataProviderSvc->getTracksInRoi(roi, m_ftkRefit));//This is a view container
     if ( timerSvc() ) { 
-      m_TrackFitterTimer->propVal(ftkTracks->size() );
+      m_TrackFitterTimer->propVal(outputTracks.size() );
       m_TrackFitterTimer->stop();
     }
-    HLT::ErrorCode code = attachFeature(outputTE, ftkTracks, m_attachedFeatureName);
-
-    if ( code != HLT::OK ) {
-      ATH_MSG_ERROR("REGTEST/ Write into outputTE failed");
-      delete ftkTracks;
-      return code;
-    }
     if ( m_ftkRefit ) { 
-      ATH_MSG_DEBUG("FTK_DataProviderSvc returned " << ftkTracks->size() << " refitted tracks");
+      ATH_MSG_DEBUG("FTK_DataProviderSvc returned " << outputTracks.size() << " refitted tracks");
     } else {
-      ATH_MSG_DEBUG("FTK_DataProviderSvc returned " << ftkTracks->size() << " raw tracks");
+      ATH_MSG_DEBUG("FTK_DataProviderSvc returned " << outputTracks.size() << " raw tracks");
     }
-    if (ftkTracks->size()> 0) {
+    if (outputTracks.size()> 0) {
       m_countRoIwithEnoughHits++;
       m_countRoIwithTracks++;
       // fill vectors of quantities to be monitored
-      fillMon(*ftkTracks);
+      fillMon(outputTracks);
     }
-    m_nTracks=ftkTracks->size();
+    m_nTracks=outputTracks.size();
 
-    return HLT::OK;
+    return StatusCode::SUCCESS;
   }
   else {
-    StatusCode sc(StatusCode::SUCCESS);
-    m_tcs.roiDescriptor = internalRoI;
+    m_tcs.roiDescriptor = &roi;
   
     std::vector<TrigSiSpacePointBase> convertedSpacePoints;
     convertedSpacePoints.reserve(5000);
-    sc = m_spacePointTool->getSpacePoints( *internalRoI, convertedSpacePoints, m_nPixSPsInRoI, m_nSCTSPsInRoI);
-    
-    ////Record spacepoint x and y
-    //for(std::vector<TrigSiSpacePointBase>::const_iterator spIt = convertedSpacePoints.begin(); spIt != convertedSpacePoints.end(); ++spIt) {
-    //  m_sp_x.push_back((*spIt).original_x());
-    //  m_sp_y.push_back((*spIt).original_y());
-    //  m_sp_z.push_back((*spIt).z());
-    //  m_sp_r.push_back((*spIt).r());
-    //}
-    /*    
-    std::vector<int> lCounter;
-    for(int l=0;l<50;l++) lCounter.push_back(0);
-    for(std::vector<TrigSiSpacePointBase>::const_iterator spIt = convertedSpacePoints.begin(); spIt != convertedSpacePoints.end(); ++spIt) {
-      if((*spIt).layer()>31 || (*spIt).layer()<0) {
-	std::cout<<"Wrong layer "<<(*spIt).layer()<<" z="<<(*spIt).z()<<" r="<<(*spIt).r()<<std::endl;
-      }
-      else lCounter[(*spIt).layer()]++;
-    }
-    int nTotal=0;
-    for(int l=0;l<50;l++) {
-      nTotal+=lCounter[l];
-      std::cout<<"L="<<l<<" nSP="<<lCounter[l]<<std::endl;
-    }
-    std::cout<<"Total "<<nTotal<<" spacepoints out of "<<convertedSpacePoints.size()<<std::endl;
-
-    //  m_sp_x.push_back((*spIt).original_x());
-    //  m_sp_y.push_back((*spIt).original_y());
-    //  m_sp_z.push_back((*spIt).z());
-    //  m_sp_r.push_back((*spIt).r());
-    //}
-    */
+    ATH_CHECK(m_spacePointTool->getSpacePoints( roi, convertedSpacePoints, m_nPixSPsInRoI, m_nSCTSPsInRoI));
 
-    if(sc.isFailure()) { 
-      ATH_MSG_WARNING("REGTEST / Failed to retrieve offline spacepoints ");
-      return HLT::TOOL_FAILURE;
-    }
-    
-    
     m_roi_nSPs = convertedSpacePoints.size();    
     if ( timerSvc() ) m_SpacePointConversionTimer->stop();
     
@@ -530,35 +493,31 @@ HLT::ErrorCode TrigFastTrackFinder::hltExecute(const HLT::TriggerElement* /*inpu
     }
     else {
       ATH_MSG_DEBUG("No tracks found - too few hits in ROI to run " << m_roi_nSPs);
-      HLT::ErrorCode code = attachFeature(outputTE, new TrackCollection, m_attachedFeatureName);
-      if (code != HLT::OK) {
-        return code;
-      }
-      return code;
+      return StatusCode::SUCCESS;
     }
 
     m_currentStage = 2;
     
     std::unique_ptr<TrigRoiDescriptor> superRoi = CxxUtils::make_unique<TrigRoiDescriptor>();
-    
+
     if (m_doZFinder) {
-     if (m_doFTKZFinder ) {
-      if ( timerSvc() ) m_ZFinderTimer->start();
-      m_tcs.m_vZv.clear();
-      superRoi->setComposite(true);
-
-	xAOD::VertexContainer* vertexCollection = new xAOD::VertexContainer();
-	xAOD::VertexAuxContainer    theVertexAux;
-	vertexCollection->setStore(&theVertexAux);
-	bool useRefittedTracks=false;
-	if (m_doFTKFastVtxFinder) {
-	  vertexCollection = m_ftkDataProviderSvc->getFastVertices(ftk::RawTrack);
-	} else {
-	  StatusCode sc = m_ftkDataProviderSvc->getVertexContainer( vertexCollection, useRefittedTracks);
-	  if (sc != StatusCode::SUCCESS) {
-	    ATH_MSG_DEBUG (" Error getting VertexContainer StatusCode is " << sc );
-	  }
-	}
+      if (m_doFTKZFinder ) {
+        if ( timerSvc() ) m_ZFinderTimer->start();
+        m_tcs.m_vZv.clear();
+        superRoi->setComposite(true);
+
+        xAOD::VertexContainer* vertexCollection = new xAOD::VertexContainer();
+        xAOD::VertexAuxContainer    theVertexAux;
+        vertexCollection->setStore(&theVertexAux);
+        bool useRefittedTracks=false;
+        if (m_doFTKFastVtxFinder) {
+          vertexCollection = m_ftkDataProviderSvc->getFastVertices(ftk::RawTrack);
+        } else {
+          StatusCode sc = m_ftkDataProviderSvc->getVertexContainer( vertexCollection, useRefittedTracks);
+          if (sc != StatusCode::SUCCESS) {
+            ATH_MSG_DEBUG (" Error getting VertexContainer StatusCode is " << sc );
+          }
+        }
 
       ATH_MSG_DEBUG("vertexCollection->size(): " << vertexCollection->size());
 
@@ -572,67 +531,67 @@ HLT::ErrorCode TrigFastTrackFinder::hltExecute(const HLT::TriggerElement* /*inpu
       for (auto vertex : *vertexCollection) {
         if (m_zVertices.size() == MaxNumVertex) continue;
         ATH_MSG_DEBUG("REGTEST / FTK ZFinder vertex: x,y,z, nTrack  type"   << vertex->x()  << " " <<  vertex->y() << " "  << vertex->z() << "  " << vertex->vxTrackAtVertex().size() << "  " << vertex->vertexType() );
-	// test to compare with Tyler's numbers
-	if (vertex->vxTrackAtVertex().size() < 3 ) continue;
+        // test to compare with Tyler's numbers
+        if (vertex->vxTrackAtVertex().size() < 3 ) continue;
 
         float z      = vertex->z();
         float zMinus = z - 7.0;
         float zPlus  = z + 7.0;
         ATH_MSG_DEBUG("REGTEST / FTK ZFinder vertex: z,zplus,zminus  " << z << " "  << zPlus  << " "  << zMinus );
-        TrigRoiDescriptor* roi =  new TrigRoiDescriptor(internalRoI->eta(), internalRoI->etaMinus(), internalRoI->etaPlus(), 
-            internalRoI->phi(), internalRoI->phiMinus(), internalRoI->phiPlus(), z, zMinus, zPlus);
-        superRoi->push_back(roi);
+        TrigRoiDescriptor* newRoi =  new TrigRoiDescriptor(roi.eta(), roi.etaMinus(), roi.etaPlus(), 
+            roi.phi(), roi.phiMinus(), roi.phiPlus(), z, zMinus, zPlus);
+        superRoi->push_back(newRoi);
         m_zVertices.push_back(z);
         m_nTrk_zVtx.push_back( vertex->vxTrackAtVertex().size());
-	m_tcs.m_vZv.push_back(z);
+        m_tcs.m_vZv.push_back(z);
 
       } // end loop over vertices
       m_tcs.roiDescriptor = superRoi.get();
       ATH_MSG_DEBUG("REGTEST / superRoi: " << *superRoi);
       delete vertexCollection;
       if ( timerSvc() ) m_ZFinderTimer->stop();
-     } else {
-      if ( timerSvc() ) m_ZFinderTimer->start();
-      m_tcs.m_vZv.clear();
-      superRoi->setComposite(true);
-
-      TrigVertexCollection* vertexCollection = m_trigZFinder->findZ( convertedSpacePoints, *internalRoI);
-
-      ATH_MSG_DEBUG("vertexCollection->size(): " << vertexCollection->size());
-
-      for (auto vertex : *vertexCollection) {
-        ATH_MSG_DEBUG("REGTEST / ZFinder vertex: " << *vertex);
-        float z      = vertex->z();
-        float zMinus = z - 7.0;
-        float zPlus  = z + 7.0;
-        TrigRoiDescriptor* roi =  new TrigRoiDescriptor(internalRoI->eta(), internalRoI->etaMinus(), internalRoI->etaPlus(), 
-            internalRoI->phi(), internalRoI->phiMinus(), internalRoI->phiPlus(), z, zMinus, zPlus);
-        superRoi->push_back(roi);
-        m_zVertices.push_back(z);
-	m_tcs.m_vZv.push_back(z);
+      } else {
+        if ( timerSvc() ) m_ZFinderTimer->start();
+        m_tcs.m_vZv.clear();
+        superRoi->setComposite(true);
+
+        TrigVertexCollection* vertexCollection = m_trigZFinder->findZ( convertedSpacePoints, roi);
+
+        ATH_MSG_DEBUG("vertexCollection->size(): " << vertexCollection->size());
+
+        for (auto vertex : *vertexCollection) {
+          ATH_MSG_DEBUG("REGTEST / ZFinder vertex: " << *vertex);
+          float z      = vertex->z();
+          float zMinus = z - 7.0;
+          float zPlus  = z + 7.0;
+          TrigRoiDescriptor* newRoi =  new TrigRoiDescriptor(roi.eta(), roi.etaMinus(), roi.etaPlus(), 
+              roi.phi(), roi.phiMinus(), roi.phiPlus(), z, zMinus, zPlus);
+          superRoi->push_back(newRoi);
+          m_zVertices.push_back(z);
+          m_tcs.m_vZv.push_back(z);
+        }
+        m_tcs.roiDescriptor = superRoi.get();
+        ATH_MSG_DEBUG("REGTEST / superRoi: " << *superRoi);
+        delete vertexCollection;
+        if ( timerSvc() ) m_ZFinderTimer->stop();
       }
-      m_tcs.roiDescriptor = superRoi.get();
-      ATH_MSG_DEBUG("REGTEST / superRoi: " << *superRoi);
-      delete vertexCollection;
-      if ( timerSvc() ) m_ZFinderTimer->stop();
-     }
     }
-    
+
     m_currentStage = 3;
-        
+
     if (m_retrieveBarCodes) {
       std::vector<int> vBar;
       m_TrigL2SpacePointTruthTool->getBarCodes(convertedSpacePoints,vBar);
-      
+
       //for(auto barCode : vBar) std::cout<<"SP bar code = "<<barCode<<std::endl;
     } 
-    
+
     m_tcs.m_tripletPtMin = m_tripletMinPtFrac*m_pTmin;
     ATH_MSG_VERBOSE("m_tcs.m_tripletPtMin: " << m_tcs.m_tripletPtMin);
     ATH_MSG_VERBOSE("m_pTmin: " << m_pTmin);
-    
+
     if ( timerSvc() ) m_PatternRecoTimer->start();
-    
+
     std::map<int, int> nGoodRejected;
     std::map<int, int> nGoodAccepted;
     std::map<int, int> nGoodTotal;
@@ -643,65 +602,65 @@ HLT::ErrorCode TrigFastTrackFinder::hltExecute(const HLT::TriggerElement* /*inpu
         nGoodTotal.insert(std::pair<int,int>(barCode,0));
       }
     }
-    
+
     int iSeed=0;
 
-    
+
     if ( timerSvc() ) m_TripletMakingTimer->start();
-    
+
     TRIG_TRACK_SEED_GENERATOR seedGen(m_tcs);
 
     seedGen.loadSpacePoints(convertedSpacePoints);
 
     if (m_doZFinder && m_doFastZVseeding) seedGen.createSeedsZv();
     else seedGen.createSeeds();
-    
+
     std::vector<TrigInDetTriplet*> triplets;
     seedGen.getSeeds(triplets);
-    
+
     ATH_MSG_DEBUG("number of triplets: " << triplets.size());
-    
+
     if ( timerSvc() ) {
       m_TripletMakingTimer->stop();
       m_TripletMakingTimer->propVal(m_roi_nSPs);
     }
     m_currentStage = 4;
-    
+
     if ( timerSvc() ) m_CombTrackingTimer->start();
-    
+
     // 8. Combinatorial tracking
-    
+
     std::vector<int> vTBarCodes(triplets.size(),-1);
-    
+
     if(m_retrieveBarCodes) {
       assignTripletBarCodes(triplets, vTBarCodes);
     }
-    
+
     std::vector<std::tuple<bool, double,Trk::Track*>> qualityTracks; //bool used for later filtering
     qualityTracks.reserve(triplets.size());
-    
+
     m_nSeeds  = 0;
     iSeed=0;
-    
+
     long int trackIndex=0;
-    
+
     if(m_checkSeedRedundancy) m_siClusterMap.clear();
-    
+
     bool PIX = true;
     bool SCT = true;
-    
+
     m_trackMaker->newTrigEvent(PIX,SCT);
-    
+
     for(unsigned int tripletIdx=0;tripletIdx!=triplets.size();tripletIdx++) {
-      
+
       TrigInDetTriplet* seed = triplets[tripletIdx];
-      
+
       const Trk::SpacePoint* osp1 = seed->s1().offlineSpacePoint();
       const Trk::SpacePoint* osp2 = seed->s2().offlineSpacePoint();
       const Trk::SpacePoint* osp3 = seed->s3().offlineSpacePoint();
-      
+
       if(m_checkSeedRedundancy) {
-      //check if clusters do not belong to any track
+        //check if clusters do not belong to any track
         std::vector<Identifier> clusterIds;
         extractClusterIds(osp1, clusterIds);
         extractClusterIds(osp2, clusterIds);
@@ -710,15 +669,15 @@ HLT::ErrorCode TrigFastTrackFinder::hltExecute(const HLT::TriggerElement* /*inpu
           continue;
         }
       }
-      
+
       std::list<const Trk::SpacePoint*> spList = {osp1, osp2, osp3};
-      
+
       bool trackFound=false;
-      
+
       ++m_nSeeds;
-      
+
       const std::list<Trk::Track*>& tracks = m_trackMaker->getTracks(spList);
-      
+
       for(std::list<Trk::Track*>::const_iterator t=tracks.begin(); t!=tracks.end(); ++t) {
         if((*t)) {
           float d0 = (*t)->perigeeParameters()==0 ? 10000.0 : (*t)->perigeeParameters()->parameters()[Trk::d0]; 
@@ -805,26 +764,26 @@ HLT::ErrorCode TrigFastTrackFinder::hltExecute(const HLT::TriggerElement* /*inpu
 
     if ( timerSvc() ) m_TrackFitterTimer->start();
 
-    TrackCollection* fittedTracks = m_trigInDetTrackFitter->fit(*initialTracks, m_particleHypothesis);
+    outputTracks = *(m_trigInDetTrackFitter->fit(*initialTracks, m_particleHypothesis));
     delete initialTracks;
 
-    if( fittedTracks->empty() ) {
+    if( outputTracks.empty() ) {
       ATH_MSG_DEBUG("REGTEST / No tracks fitted");
     }
 
-    for (auto fittedTrack = fittedTracks->begin(); fittedTrack!=fittedTracks->end(); ++fittedTrack) {
+    for (auto fittedTrack = outputTracks.begin(); fittedTrack!=outputTracks.end(); ++fittedTrack) {
       (*fittedTrack)->info().setPatternRecognitionInfo(Trk::TrackInfo::FastTrackFinderSeed);
-      ATH_MSG_VERBOSE("Updating fitted track: " << **fittedTrack);
+      ATH_MSG_VERBOSE("Updating fitted track: " << *fittedTrack);
       m_trackSummaryTool->updateTrack(**fittedTrack);
       ATH_MSG_VERBOSE("Updated track: " << **fittedTrack);
     }
 
     if ( timerSvc() ) { 
-      m_TrackFitterTimer->propVal(fittedTracks->size() );
+      m_TrackFitterTimer->propVal(outputTracks.size() );
       m_TrackFitterTimer->stop();
     }
 
-    if( fittedTracks->empty() ) {
+    if( outputTracks.empty() ) {
       ATH_MSG_DEBUG("REGTEST / No tracks reconstructed");
     }
     m_currentStage = 6;
@@ -834,27 +793,19 @@ HLT::ErrorCode TrigFastTrackFinder::hltExecute(const HLT::TriggerElement* /*inpu
     m_nZvertices=m_zVertices.size();
 
     //monitor number of tracks
-    m_nTracks=fittedTracks->size();
+    m_nTracks=outputTracks.size();
     ATH_MSG_DEBUG("REGTEST / Found " << m_nTracks << " tracks");
-    if( !fittedTracks->empty() )
+    if( !outputTracks.empty() )
       m_countRoIwithTracks++;
 
     ///////////// fill vectors of quantities to be monitored
-    fillMon(*fittedTracks);
-
-
-    HLT::ErrorCode code = attachFeature(outputTE, fittedTracks, m_attachedFeatureName);
-    if ( code != HLT::OK ) {
-      ATH_MSG_ERROR("REGTEST/ Write into outputTE failed");
-      delete fittedTracks;
-      return code;
-    }
+    fillMon(outputTracks);
 
     m_currentStage = 7;
 
-    return HLT::OK;
-  }
+    return StatusCode::SUCCESS;
   }
+}
 
 double TrigFastTrackFinder::trackQuality(const Trk::Track* Tr) {