diff --git a/Trigger/TrigAlgorithms/TrigL2MuonSA/src/MuFastPatternFinder.cxx b/Trigger/TrigAlgorithms/TrigL2MuonSA/src/MuFastPatternFinder.cxx
index 1b70f6312da74ac71695a1d6ac1bd2cbe8cbe161..743f13929934ad5767b6dc7972d4e50c5eb613a8 100644
--- a/Trigger/TrigAlgorithms/TrigL2MuonSA/src/MuFastPatternFinder.cxx
+++ b/Trigger/TrigAlgorithms/TrigL2MuonSA/src/MuFastPatternFinder.cxx
@@ -113,12 +113,12 @@ StatusCode TrigL2MuonSA::MuFastPatternFinder::findPatterns(const TrigL2MuonSA::M
   ATH_CHECK( findPatterns(muonRoad, mdtHits, v_trackPatterns) );
   ATH_CHECK( m_nswPatternFinder->findPatterns(muonRoad, stgcHits, mmHits, v_trackPatterns.back()) );
 
-  for(unsigned int i_hit=0; i_hit<v_trackPatterns.at(0).stgcSegment.size(); i_hit++) {
-    ATH_MSG_DEBUG("PatternFinder: output sTGC hits global eta/phi/r/z/layer/channelType/isOutlier " << v_trackPatterns.at(0).stgcSegment[i_hit].eta << "/" << v_trackPatterns.at(0).stgcSegment[i_hit].phi << "/" << v_trackPatterns.at(0).stgcSegment[i_hit].r << "/" << v_trackPatterns.at(0).stgcSegment[i_hit].z << "/" << v_trackPatterns.at(0).stgcSegment[i_hit].layerNumber << "/" << v_trackPatterns.at(0).stgcSegment[i_hit].channelType << "/" << v_trackPatterns.at(0).stgcSegment[i_hit].isOutlier);
+  for(unsigned int i_hit=0; i_hit<v_trackPatterns.back().stgcSegment.size(); i_hit++) {
+    ATH_MSG_DEBUG("PatternFinder: output sTGC hits global eta/phi/r/z/layer/channelType/isOutlier " << v_trackPatterns.back().stgcSegment[i_hit].eta << "/" << v_trackPatterns.back().stgcSegment[i_hit].phi << "/" << v_trackPatterns.back().stgcSegment[i_hit].r << "/" << v_trackPatterns.back().stgcSegment[i_hit].z << "/" << v_trackPatterns.back().stgcSegment[i_hit].layerNumber << "/" << v_trackPatterns.back().stgcSegment[i_hit].channelType << "/" << v_trackPatterns.back().stgcSegment[i_hit].isOutlier);
   }
 
-  for(unsigned int i_hit=0; i_hit<v_trackPatterns.at(0).mmSegment.size(); i_hit++) {
-    ATH_MSG_DEBUG("PatternFinder: output MM hits global eta/phi/r/z/layer/isOutlier " << v_trackPatterns.at(0).mmSegment[i_hit].eta << "/" << v_trackPatterns.at(0).mmSegment[i_hit].phi << "/" << v_trackPatterns.at(0).mmSegment[i_hit].r << "/" << v_trackPatterns.at(0).mmSegment[i_hit].z << "/" << v_trackPatterns.at(0).mmSegment[i_hit].layerNumber << "/" << v_trackPatterns.at(0).mmSegment[i_hit].isOutlier);
+  for(unsigned int i_hit=0; i_hit<v_trackPatterns.back().mmSegment.size(); i_hit++) {
+    ATH_MSG_DEBUG("PatternFinder: output MM hits global eta/phi/r/z/layer/isOutlier " << v_trackPatterns.back().mmSegment[i_hit].eta << "/" << v_trackPatterns.back().mmSegment[i_hit].phi << "/" << v_trackPatterns.back().mmSegment[i_hit].r << "/" << v_trackPatterns.back().mmSegment[i_hit].z << "/" << v_trackPatterns.back().mmSegment[i_hit].layerNumber << "/" << v_trackPatterns.back().mmSegment[i_hit].isOutlier);
   }
 
   return StatusCode::SUCCESS;
diff --git a/Trigger/TrigAlgorithms/TrigL2MuonSA/src/MuFastStationFitter.cxx b/Trigger/TrigAlgorithms/TrigL2MuonSA/src/MuFastStationFitter.cxx
index 130cd73bf37e8bc2c3a08dd1fcb41baf0ed53d0e..65c597d24bfd356fc409c91344fe07a85e5c3605 100644
--- a/Trigger/TrigAlgorithms/TrigL2MuonSA/src/MuFastStationFitter.cxx
+++ b/Trigger/TrigAlgorithms/TrigL2MuonSA/src/MuFastStationFitter.cxx
@@ -119,7 +119,7 @@ StatusCode TrigL2MuonSA::MuFastStationFitter::findSuperPointsSimple(const LVL1::
 								    std::vector<TrigL2MuonSA::TrackPattern>& v_trackPatterns)
 {
   const double ZERO_LIMIT = 1e-5;
-  
+
   for (TrigL2MuonSA::TrackPattern& itTrack : v_trackPatterns) { // loop for track candidates
 
     if (tgcFitResult.isSuccess) {
diff --git a/Trigger/TrigAlgorithms/TrigL2MuonSA/src/MuFastSteering.cxx b/Trigger/TrigAlgorithms/TrigL2MuonSA/src/MuFastSteering.cxx
index b646c6da7c792f6c5ecead88590306aec82c0d25..25b440bc3443e5d95fa6ecff12f4ebd0db4802d2 100644
--- a/Trigger/TrigAlgorithms/TrigL2MuonSA/src/MuFastSteering.cxx
+++ b/Trigger/TrigAlgorithms/TrigL2MuonSA/src/MuFastSteering.cxx
@@ -385,7 +385,7 @@ StatusCode MuFastSteering::execute()
     }
 
     ATH_CHECK(findMuonSignatureIO(*tracks, internalRoI, recRoIVector,
-				  *muonCBColl, *muFastContainer, *muIdContainer, *muMsContainer ));
+				  *muonCBColl, *muFastContainer ));
 
     ATH_MSG_DEBUG("REGTEST: xAOD::L2CombinedMuonContainer key:" << m_outputCBmuonCollKey.key() << " size = " << muonCBColl->size());
     xAOD::L2CombinedMuonContainer::const_iterator p_CBmuon = (*muonCBColl).begin();
@@ -689,7 +689,7 @@ StatusCode MuFastSteering::findMuonSignature(const std::vector<const TrigRoiDesc
         	            m_rpcFitResult, m_tgcFitResult, m_mdtHits_normal, m_cscHits, 
 			    m_stgcHits, m_mmHits,
                             trackPatterns, outputTracks, outputID, outputMS);
-        return StatusCode::SUCCESS;
+	continue;
       }
       if (m_use_timer) m_timingTimers[ITIMER_DATA_PREPARATOR]->pause();
       prepTimer.stop();
@@ -703,7 +703,7 @@ StatusCode MuFastSteering::findMuonSignature(const std::vector<const TrigRoiDesc
         	            m_rpcFitResult, m_tgcFitResult, m_mdtHits_normal, m_cscHits, 
 			    m_stgcHits, m_mmHits,
                             trackPatterns, outputTracks, outputID, outputMS);
-        return StatusCode::FAILURE;
+	continue;
       }
 
       // Pattern finding
@@ -719,7 +719,7 @@ StatusCode MuFastSteering::findMuonSignature(const std::vector<const TrigRoiDesc
         	            m_rpcFitResult, m_tgcFitResult, m_mdtHits_normal, m_cscHits, 
 			    m_stgcHits, m_mmHits,
                             trackPatterns, outputTracks, outputID, outputMS);
-        return StatusCode::SUCCESS;
+	continue;
       }
       if (m_use_timer) m_timingTimers[ITIMER_PATTERN_FINDER]->pause();
       patternTimer.stop();
@@ -738,7 +738,7 @@ StatusCode MuFastSteering::findMuonSignature(const std::vector<const TrigRoiDesc
         	            m_rpcFitResult, m_tgcFitResult, m_mdtHits_normal, m_cscHits, 
 			    m_stgcHits, m_mmHits,
                             trackPatterns, outputTracks, outputID, outputMS);
-        return StatusCode::SUCCESS;
+	continue;
       }
       if (m_use_timer) m_timingTimers[ITIMER_STATION_FITTER]->pause();
       stationFitterTimer.stop();
@@ -757,7 +757,7 @@ StatusCode MuFastSteering::findMuonSignature(const std::vector<const TrigRoiDesc
         	            m_rpcFitResult, m_tgcFitResult, m_mdtHits_normal, m_cscHits, 
 			    m_stgcHits, m_mmHits,
                             trackPatterns, outputTracks, outputID, outputMS);
-        return StatusCode::SUCCESS;
+	continue;
       }
       if (m_use_timer) m_timingTimers[ITIMER_TRACK_FITTER]->pause();
       trackFitterTimer.stop();
@@ -790,7 +790,7 @@ StatusCode MuFastSteering::findMuonSignature(const std::vector<const TrigRoiDesc
         	            m_rpcFitResult, m_tgcFitResult, m_mdtHits_normal, m_cscHits, 
 			    m_stgcHits, m_mmHits,
                             trackPatterns, outputTracks, outputID, outputMS);
-        return StatusCode::SUCCESS;
+	continue;
       }
       if (m_use_timer) m_timingTimers[ITIMER_DATA_PREPARATOR]->pause();
       prepTimer.stop();
@@ -813,7 +813,7 @@ StatusCode MuFastSteering::findMuonSignature(const std::vector<const TrigRoiDesc
         	            m_rpcFitResult, m_tgcFitResult, m_mdtHits_normal, m_cscHits, 
 			    m_stgcHits, m_mmHits,
                             trackPatterns, outputTracks, outputID, outputMS);
-        return StatusCode::SUCCESS;
+	continue;
       }
       if (m_use_timer) m_timingTimers[ITIMER_PATTERN_FINDER]->pause();
       patternTimer.stop();
@@ -842,7 +842,7 @@ StatusCode MuFastSteering::findMuonSignature(const std::vector<const TrigRoiDesc
         	            m_rpcFitResult, m_tgcFitResult, m_mdtHits_normal, m_cscHits, 
 			    m_stgcHits, m_mmHits,
                             trackPatterns, outputTracks, outputID, outputMS);
-        return StatusCode::SUCCESS;
+	continue;
       }
 
       if (m_use_timer) m_timingTimers[ITIMER_STATION_FITTER]->pause();
@@ -863,7 +863,7 @@ StatusCode MuFastSteering::findMuonSignature(const std::vector<const TrigRoiDesc
         	            m_rpcFitResult, m_tgcFitResult, m_mdtHits_normal, m_cscHits, 
 			    m_stgcHits, m_mmHits,
                             trackPatterns, outputTracks, outputID, outputMS);
-        return StatusCode::SUCCESS;
+	continue;
         }
       if (m_use_timer) m_timingTimers[ITIMER_TRACK_FITTER]->pause();
       trackFitterTimer.stop();
@@ -894,7 +894,7 @@ StatusCode MuFastSteering::findMuonSignature(const std::vector<const TrigRoiDesc
       	                  m_rpcFitResult, m_tgcFitResult, m_mdtHits_normal, m_cscHits, 
 			  m_stgcHits, m_mmHits,
                           trackPatterns, outputTracks, outputID, outputMS);
-      return StatusCode::SUCCESS;
+      continue;
     }
     if (m_use_timer) m_timingTimers[ITIMER_TRACK_EXTRAPOLATOR]->pause();
     trackExtraTimer.stop();
@@ -908,7 +908,7 @@ StatusCode MuFastSteering::findMuonSignature(const std::vector<const TrigRoiDesc
        	                  m_rpcFitResult, m_tgcFitResult, m_mdtHits_normal, m_cscHits, 
 			  m_stgcHits, m_mmHits,
                           trackPatterns, outputTracks, outputID, outputMS);
-      return StatusCode::SUCCESS;
+      continue;
     }
 
     // Update output trigger element
@@ -993,13 +993,11 @@ StatusCode MuFastSteering::findMuonSignatureIO(const xAOD::TrackParticleContaine
 					       const std::vector<const TrigRoiDescriptor*> roids,
 					       const std::vector<const LVL1::RecMuonRoI*>  muonRoIs,
 					       DataVector<xAOD::L2CombinedMuon>&           outputCBs,
-					       DataVector<xAOD::L2StandAloneMuon>&         outputSAs,
-					       TrigRoiDescriptorCollection&                outputID,
-					       TrigRoiDescriptorCollection&                outputMS
-					       )
+					       DataVector<xAOD::L2StandAloneMuon>&         outputSAs)
 {
   ATH_MSG_DEBUG("StatusCode MuFastSteering::findMuonSignatureIO start");
   StatusCode sc = StatusCode::SUCCESS;
+  const float ZERO_LIMIT = 1.e-5;
 
   auto prepTimer           = Monitored::Timer( "TIME_Data_Preparator" );
   auto patternTimer        = Monitored::Timer( "TIME_Pattern_Finder" );
@@ -1028,6 +1026,8 @@ StatusCode MuFastSteering::findMuonSignatureIO(const xAOD::TrackParticleContaine
   // muonRoIs = RecMURoIs, roids = MURoIs
   p_roids = roids.begin();
   for (p_roi=(muonRoIs).begin(); p_roi!=(muonRoIs).end(); ++p_roi) {
+    sc = StatusCode::SUCCESS;
+
     //p_roi = (muonRoIs.begin());
     ATH_MSG_DEBUG("roi eta/phi: " << (*p_roi)->eta() << "/" << (*p_roi)->phi());
 
@@ -1040,6 +1040,11 @@ StatusCode MuFastSteering::findMuonSignatureIO(const xAOD::TrackParticleContaine
       ATH_MSG_DEBUG("IO TEST: FTF track key:" << m_FTFtrackKey.key() << " pt = " << idtrack->pt()/1000 << " GeV");
       ATH_MSG_DEBUG("IO TEST: FTF track key:" << m_FTFtrackKey.key() << " eta/phi = " << idtrack->eta() << "/" << idtrack->phi());
 
+      if(idtrack->pt() < m_ftfminPt) {
+	ATH_MSG_DEBUG("IO TEST: skip FTF track due to pT threshold: " << m_ftfminPt << " MeV");
+	continue;
+      }
+
       prepTimer.start();
       m_mdtHits_normal.clear();
       m_mdtHits_overlap.clear();
@@ -1048,15 +1053,16 @@ StatusCode MuFastSteering::findMuonSignatureIO(const xAOD::TrackParticleContaine
       m_mmHits.clear();
       m_rpcFitResult.Clear();
       m_tgcFitResult.Clear();
+      m_rpcHits.clear();
+      m_tgcHits.clear();
 
       m_muonRoad.Clear();
+      bool hasSP = false;
 
       sc = m_ftfRoadDefiner->defineRoad(idtrack, m_muonRoad);
       if (!sc.isSuccess()) {
 	ATH_MSG_WARNING("FtfRoadDefiner failed");
-	TrigL2MuonSA::TrackPattern trackPattern;
-	trackPatterns.push_back(trackPattern);
-	return StatusCode::SUCCESS;
+	continue;
       } else {
 	ATH_MSG_DEBUG("FtfRoadDefiner::defineRoad success");
       }
@@ -1077,8 +1083,6 @@ StatusCode MuFastSteering::findMuonSignatureIO(const xAOD::TrackParticleContaine
 			     m_scaleRoadBarrelOuter);
 
 	// Data preparation
-	m_rpcHits.clear();
-	m_tgcHits.clear();
 	sc = m_dataPreparator->prepareData(*p_roi,
 					   *p_roids,
 					   m_insideOut,
@@ -1090,32 +1094,13 @@ StatusCode MuFastSteering::findMuonSignatureIO(const xAOD::TrackParticleContaine
 					   m_mdtHits_overlap);
 	if (!sc.isSuccess()) {
 	  ATH_MSG_WARNING("Data preparation failed");
-	  TrigL2MuonSA::TrackPattern trackPattern;
-	  trackPatterns.push_back(trackPattern);
-	  // Update output trigger element
-	  updateOutputObjects(*p_roi, *p_roids, m_muonRoad, m_mdtRegion, m_rpcHits, m_tgcHits,
-			      m_rpcFitResult, m_tgcFitResult, m_mdtHits_normal, m_cscHits,
-			      m_stgcHits, m_mmHits,
-			      trackPatterns, outputSAs, outputID, outputMS);
-	  return StatusCode::SUCCESS;
+	  continue;
 	} else {
 	  ATH_MSG_DEBUG("Data preparation success");
 	}
 	if (m_use_timer) m_timingTimers[ITIMER_DATA_PREPARATOR]->pause();
 	prepTimer.stop();
 
-	// if ( m_rpcErrToDebugStream && m_dataPreparator->isRpcFakeRoi() ) {
-	//   ATH_MSG_ERROR("Invalid RoI in RPC data found: event to debug stream");
-	//   TrigL2MuonSA::TrackPattern trackPattern;
-	//   trackPatterns.push_back(trackPattern);
-	//   // Update output trigger element
-	//   updateOutputObjects(*p_roi, *p_roids, m_muonRoad, m_mdtRegion, m_rpcHits, m_tgcHits,
-	// 		      m_rpcFitResult, m_tgcFitResult, m_mdtHits_normal, m_cscHits,
-			      // m_stgcHits, m_mmHits,
-	// 		      trackPatterns, outputSAs, outputID, outputMS);
-	//   return StatusCode::FAILURE;
-	// }
-
 	// Pattern finding
 	if (m_use_timer) m_timingTimers[ITIMER_PATTERN_FINDER]->resume();
 	patternTimer.start();
@@ -1124,12 +1109,7 @@ StatusCode MuFastSteering::findMuonSignatureIO(const xAOD::TrackParticleContaine
 					   trackPatterns);
 	if (!sc.isSuccess()) {
 	  ATH_MSG_WARNING("Pattern finder failed");
-	  // Update output trigger element
-	  updateOutputObjects(*p_roi, *p_roids, m_muonRoad, m_mdtRegion, m_rpcHits, m_tgcHits,
-			      m_rpcFitResult, m_tgcFitResult, m_mdtHits_normal, m_cscHits,
-			      m_stgcHits, m_mmHits,
-			      trackPatterns, outputSAs, outputID, outputMS);
-	  return StatusCode::SUCCESS;
+	  continue;
 	}
 	if (m_use_timer) m_timingTimers[ITIMER_PATTERN_FINDER]->pause();
 	patternTimer.stop();
@@ -1143,16 +1123,18 @@ StatusCode MuFastSteering::findMuonSignatureIO(const xAOD::TrackParticleContaine
 					      trackPatterns);
 	if (!sc.isSuccess()) {
 	  ATH_MSG_WARNING("Super point fitter failed");
-	  // Update output trigger element
-	  updateOutputObjects(*p_roi, *p_roids, m_muonRoad, m_mdtRegion, m_rpcHits, m_tgcHits,
-			      m_rpcFitResult, m_tgcFitResult, m_mdtHits_normal, m_cscHits,
-			      m_stgcHits, m_mmHits,
-			      trackPatterns, outputSAs, outputID, outputMS);
-	  return StatusCode::SUCCESS;
+	  continue;
 	}
 	if (m_use_timer) m_timingTimers[ITIMER_STATION_FITTER]->pause();
 	stationFitterTimer.stop();
 
+	// Check if at least 1 SP
+	for (size_t i=0; i<std::extent<decltype(trackPatterns.back().superPoints), 0>::value; i++) {
+	  if ( std::abs(trackPatterns.back().superPoints[i].R) > ZERO_LIMIT && std::abs(trackPatterns.back().superPoints[i].Z) > ZERO_LIMIT ) { // if R and Z exist
+	    hasSP = true;
+	  }
+	}
+
 	// Track fitting
 	if (m_use_timer) m_timingTimers[ITIMER_TRACK_FITTER]->resume();
 	trackFitterTimer.start();
@@ -1161,12 +1143,24 @@ StatusCode MuFastSteering::findMuonSignatureIO(const xAOD::TrackParticleContaine
 				       trackPatterns);
 	if (!sc.isSuccess()) {
 	  ATH_MSG_WARNING("Track fitter failed");
-	  // Update output trigger element
-	  updateOutputObjects(*p_roi, *p_roids, m_muonRoad, m_mdtRegion, m_rpcHits, m_tgcHits,
-			      m_rpcFitResult, m_tgcFitResult, m_mdtHits_normal, m_cscHits,
-			      m_stgcHits, m_mmHits,
-			      trackPatterns, outputSAs, outputID, outputMS);
-	  return StatusCode::SUCCESS;
+	  if(hasSP) {
+	    storeMuonSA(*p_roi, *p_roids, m_muonRoad, m_mdtRegion, m_rpcHits, m_tgcHits,
+	    		m_rpcFitResult, m_tgcFitResult, m_mdtHits_normal, m_cscHits,
+	    		m_stgcHits, m_mmHits,
+	    		trackPatterns.back(), outputSAs);
+	    float cbpt = (idtrack->charge() > 0) ? idtrack->pt() : -1.*idtrack->pt();
+	    xAOD::L2CombinedMuon* muonCB = new xAOD::L2CombinedMuon();
+	    muonCB->makePrivateStore();
+	    muonCB->setStrategy(-9);
+	    muonCB->setErrorFlag(-9);
+	    muonCB->setPt(cbpt);
+	    muonCB->setEta(idtrack->eta());
+	    muonCB->setPhi(idtrack->phi());
+	    ElementLink<xAOD::L2StandAloneMuonContainer> muonSAEL(outputSAs, outputSAs.size()-1);
+	    muonCB->setMuSATrackLink(muonSAEL);
+	    outputCBs.push_back(muonCB);
+	  }
+	  continue;
         }
 	if (m_use_timer) m_timingTimers[ITIMER_TRACK_FITTER]->pause();
         trackFitterTimer.stop();
@@ -1177,8 +1171,6 @@ StatusCode MuFastSteering::findMuonSignatureIO(const xAOD::TrackParticleContaine
 
 	prepTimer.start();
 	// Data preparation
-	m_rpcHits.clear();
-	m_tgcHits.clear();
 	sc = m_dataPreparator->prepareData(*p_roi,
 					   *p_roids,
 					   m_insideOut,
@@ -1193,14 +1185,7 @@ StatusCode MuFastSteering::findMuonSignatureIO(const xAOD::TrackParticleContaine
 					   m_mmHits);
 	if (!sc.isSuccess()) {
 	  ATH_MSG_WARNING("Data preparation failed");
-	  TrigL2MuonSA::TrackPattern trackPattern;
-	  trackPatterns.push_back(trackPattern);
-	  // Update output trigger element
-	  updateOutputObjects(*p_roi, *p_roids, m_muonRoad, m_mdtRegion, m_rpcHits, m_tgcHits,
-			      m_rpcFitResult, m_tgcFitResult, m_mdtHits_normal, m_cscHits,
-			      m_stgcHits, m_mmHits,
-			      trackPatterns, outputSAs, outputID, outputMS);
-	  return StatusCode::SUCCESS;
+	  continue;
 	} else{
 	  ATH_MSG_DEBUG("Data preparation success");
 	}
@@ -1217,12 +1202,7 @@ StatusCode MuFastSteering::findMuonSignatureIO(const xAOD::TrackParticleContaine
 					   trackPatterns);
 	if (!sc.isSuccess()) {
 	  ATH_MSG_WARNING("Pattern finder failed");
-	  // Update output trigger element
-          updateOutputObjects(*p_roi, *p_roids, m_muonRoad, m_mdtRegion, m_rpcHits, m_tgcHits,
-			      m_rpcFitResult, m_tgcFitResult, m_mdtHits_normal, m_cscHits,
-			      m_stgcHits, m_mmHits,
-			      trackPatterns, outputSAs, outputID, outputMS);
-	  return StatusCode::SUCCESS;
+	  continue;
 	}
 	if (m_use_timer) m_timingTimers[ITIMER_PATTERN_FINDER]->pause();
 	patternTimer.stop();
@@ -1238,16 +1218,18 @@ StatusCode MuFastSteering::findMuonSignatureIO(const xAOD::TrackParticleContaine
 	m_cscsegmaker->FindSuperPointCsc(m_cscHits,trackPatterns,m_tgcFitResult,m_muonRoad);
 	if (!sc.isSuccess()) {
 	  ATH_MSG_WARNING("Super point fitter failed");
-	  // Update output trigger element
-          updateOutputObjects(*p_roi, *p_roids, m_muonRoad, m_mdtRegion, m_rpcHits, m_tgcHits,
-			      m_rpcFitResult, m_tgcFitResult, m_mdtHits_normal, m_cscHits,
-			      m_stgcHits, m_mmHits,
-			      trackPatterns, outputSAs, outputID, outputMS);
-	  return StatusCode::SUCCESS;
+	  continue;
 	}
 	if (m_use_timer) m_timingTimers[ITIMER_STATION_FITTER]->pause();
 	stationFitterTimer.stop();
 
+	// Check if at least 1 SP
+	for (size_t i=0; i<std::extent<decltype(trackPatterns.back().superPoints), 0>::value; i++) {
+	  if ( std::abs(trackPatterns.back().superPoints[i].R) > ZERO_LIMIT && std::abs(trackPatterns.back().superPoints[i].Z) > ZERO_LIMIT ) { // if R and Z exist
+	    hasSP = true;
+	  }
+	}
+
 	// Track fittingh
         if (m_use_timer) m_timingTimers[ITIMER_TRACK_FITTER]->resume();
 	trackFitterTimer.start();
@@ -1257,12 +1239,24 @@ StatusCode MuFastSteering::findMuonSignatureIO(const xAOD::TrackParticleContaine
 				       m_muonRoad);
         if (!sc.isSuccess()) {
           ATH_MSG_WARNING("Track fitter failed");
-          // Update output trigger element
-	  updateOutputObjects(*p_roi, *p_roids, m_muonRoad, m_mdtRegion, m_rpcHits, m_tgcHits,
-			      m_rpcFitResult, m_tgcFitResult, m_mdtHits_normal, m_cscHits,
-			      m_stgcHits, m_mmHits,
-			      trackPatterns, outputSAs, outputID, outputMS);
-          return StatusCode::SUCCESS;
+	  if(hasSP) {
+	    storeMuonSA(*p_roi, *p_roids, m_muonRoad, m_mdtRegion, m_rpcHits, m_tgcHits,
+	    		m_rpcFitResult, m_tgcFitResult, m_mdtHits_normal, m_cscHits,
+	    		m_stgcHits, m_mmHits,
+	    		trackPatterns.back(), outputSAs);
+	    float cbpt = (idtrack->charge() > 0) ? idtrack->pt() : -1.*idtrack->pt();
+	    xAOD::L2CombinedMuon* muonCB = new xAOD::L2CombinedMuon();
+	    muonCB->makePrivateStore();
+	    muonCB->setStrategy(-9);
+	    muonCB->setErrorFlag(-9);
+	    muonCB->setPt(cbpt);
+	    muonCB->setEta(idtrack->eta());
+	    muonCB->setPhi(idtrack->phi());
+	    ElementLink<xAOD::L2StandAloneMuonContainer> muonSAEL(outputSAs, outputSAs.size()-1);
+	    muonCB->setMuSATrackLink(muonSAEL);
+	    outputCBs.push_back(muonCB);
+	  }
+	  continue;
 	}
 	if (m_use_timer) m_timingTimers[ITIMER_TRACK_FITTER]->pause();
 	trackFitterTimer.stop();
@@ -1275,73 +1269,75 @@ StatusCode MuFastSteering::findMuonSignatureIO(const xAOD::TrackParticleContaine
 	const float ETA_LIMIT       = 2.8;
 	const float DELTA_ETA_LIMIT = 1.0;
 	float roiEta = (*p_roi)->eta();
-	const float ZERO_LIMIT = 1.e-5;
 	if (fabs(track.pt) > ZERO_LIMIT
 	    && ( fabs(track.etaMap) > ETA_LIMIT || fabs(track.etaMap-roiEta) > DELTA_ETA_LIMIT ) ) {
           trackPatterns[i].etaMap = roiEta;
         }
       }
 
-      // // Track extrapolation for ID combined
-      // if (m_use_timer) m_timingTimers[ITIMER_TRACK_EXTRAPOLATOR]->resume();
-      // trackExtraTimer.start();
-      // sc = m_trackExtrapolator->extrapolateTrack(trackPatterns, m_winPt);
-      // if (sc != StatusCode::SUCCESS) {
-      // 	ATH_MSG_WARNING("Track extrapolator failed");
-      // 	// Update output trigger element
-      // 	updateOutputObjects(*p_roi, *p_roids, m_muonRoad, m_mdtRegion, m_rpcHits, m_tgcHits,
-      // 			    m_rpcFitResult, m_tgcFitResult, m_mdtHits_normal, m_cscHits,
-      // 			    m_stgcHits, m_mmHits,
-      // 			    trackPatterns, outputSAs, outputID, outputMS);
-      // 	return StatusCode::SUCCESS;
-      // }
-      // if (m_use_timer) m_timingTimers[ITIMER_TRACK_EXTRAPOLATOR]->pause();
-      // trackExtraTimer.stop();
-
       // Update monitoring variables
       sc = updateMonitor(*p_roi, m_mdtHits_normal, trackPatterns );
       if (sc != StatusCode::SUCCESS) {
 	ATH_MSG_WARNING("Failed to update monitoring variables");
-	// Update output trigger element
-        updateOutputObjects(*p_roi, *p_roids, m_muonRoad, m_mdtRegion, m_rpcHits, m_tgcHits,
-			    m_rpcFitResult, m_tgcFitResult, m_mdtHits_normal, m_cscHits,
-			    m_stgcHits, m_mmHits,
-			    trackPatterns, outputSAs, outputID, outputMS);
-	return StatusCode::SUCCESS;
       }
 
       // Update output trigger element
-      updateOutputObjects(*p_roi, *p_roids, m_muonRoad, m_mdtRegion, m_rpcHits, m_tgcHits,
-			  m_rpcFitResult, m_tgcFitResult, m_mdtHits_normal, m_cscHits,
-			  m_stgcHits, m_mmHits,
-			  trackPatterns, outputSAs, outputID, outputMS);
-
+      if(hasSP) {
+	storeMuonSA(*p_roi, *p_roids, m_muonRoad, m_mdtRegion, m_rpcHits, m_tgcHits,
+		    m_rpcFitResult, m_tgcFitResult, m_mdtHits_normal, m_cscHits,
+		    m_stgcHits, m_mmHits,
+		    trackPatterns.back(), outputSAs);
+	float cbpt = (idtrack->charge() > 0) ? idtrack->pt() : -1.*idtrack->pt();
+	xAOD::L2CombinedMuon* muonCB = new xAOD::L2CombinedMuon();
+	muonCB->makePrivateStore();
+	muonCB->setStrategy(-9);
+	muonCB->setErrorFlag(-9);
+	muonCB->setPt(cbpt);
+	muonCB->setEta(idtrack->eta());
+	muonCB->setPhi(idtrack->phi());
+	ElementLink<xAOD::L2StandAloneMuonContainer> muonSAEL(outputSAs, outputSAs.size()-1);
+	muonCB->setMuSATrackLink(muonSAEL);
+	outputCBs.push_back(muonCB);
+      }
 
     }
 
-    ATH_MSG_DEBUG("trackPatterns->size(): " << trackPatterns.size());
-    for (unsigned int i = 0; i< trackPatterns.size(); i++){
-      TrigL2MuonSA::TrackPattern trackPattern = trackPatterns[i];
-      ATH_MSG_DEBUG("trackPattern pt/eta/phi: " << trackPattern.pt << "/" << trackPattern.etaVtx << "/" << trackPattern.phiVtx);
+    if(outputSAs.size()==0) {
+      ATH_MSG_DEBUG("outputSAs size = 0 -> push_back dummy");
+      m_muonRoad.Clear();
+      TrigL2MuonSA::MdtRegion mdtRegion;
+      m_rpcHits.clear();
+      m_tgcHits.clear();
+      m_rpcFitResult.Clear();
+      m_tgcFitResult.Clear();
+      m_mdtHits_normal.clear();
+      m_cscHits.clear();
+      m_stgcHits.clear();
+      m_mmHits.clear();
+      trackPatterns.clear();
+      TrigL2MuonSA::TrackPattern trackPattern;
+      storeMuonSA(*p_roi, *p_roids, m_muonRoad, mdtRegion, m_rpcHits, m_tgcHits,
+      		  m_rpcFitResult, m_tgcFitResult, m_mdtHits_normal, m_cscHits,
+      		  m_stgcHits, m_mmHits,
+      		  trackPattern, outputSAs);
+      xAOD::L2CombinedMuon* muonCB = new xAOD::L2CombinedMuon();
+      muonCB->makePrivateStore();
+      muonCB->setStrategy(-9);
+      muonCB->setErrorFlag(-9);
+      muonCB->setPt(0);
+      muonCB->setEta(0);
+      muonCB->setPhi(0);
+      ElementLink<xAOD::L2StandAloneMuonContainer> muonSAEL(outputSAs, outputSAs.size()-1);
+      muonCB->setMuSATrackLink(muonSAEL);
+      outputCBs.push_back(muonCB);
     }
 
+
     ATH_MSG_DEBUG("outputSAs size: " << outputSAs.size());
     ATH_MSG_DEBUG("idtracks size: " << idtracks.size());
     for (unsigned int i = 0; i< outputSAs.size(); i++){
       xAOD::L2StandAloneMuon* outputSA = outputSAs[i];
       ATH_MSG_DEBUG("outputSA pt/eta/phi: " << outputSA->pt() << "/" << outputSA->eta() << "/" << outputSA->phi());
-      ATH_MSG_DEBUG("idtrack pt/eta/phi: " << (idtracks[i]->pt())/1000. << "/" << idtracks[i]->eta() << "/" << idtracks[i]->phi());
-      xAOD::L2CombinedMuon* muonCB = new xAOD::L2CombinedMuon();
-      muonCB->makePrivateStore();
-      muonCB->setStrategy(-9);
-      muonCB->setErrorFlag(-9);
-      muonCB->setPt((idtracks[i]->pt())/1000.);
-      muonCB->setEta(idtracks[i]->eta());
-      muonCB->setPhi(idtracks[i]->phi());
-      ElementLink<xAOD::L2StandAloneMuonContainer> muonSAEL(outputSAs, i);
-      muonCB->setMuSATrackLink(muonSAEL);
-
-      outputCBs.push_back(muonCB);
     }
 
     ATH_MSG_DEBUG("outputCBs size: " << outputCBs.size());
@@ -1387,7 +1383,7 @@ bool MuFastSteering::updateOutputObjects(const LVL1::RecMuonRoI*
   
   if( trackPatterns.size() > 0 ) {
 
-    const TrigL2MuonSA::TrackPattern& pattern = trackPatterns[0];
+    const TrigL2MuonSA::TrackPattern& pattern = trackPatterns.back();
 
     // Update output trigger element
     storeMuonSA(roi, roids, muonRoad, mdtRegion, rpcHits, tgcHits,
diff --git a/Trigger/TrigAlgorithms/TrigL2MuonSA/src/MuFastSteering.h b/Trigger/TrigAlgorithms/TrigL2MuonSA/src/MuFastSteering.h
index e61add892ec8fd8de12b0183e49fa950bbd94705..d18c6c34ba9319a9b7769f7843d8eeeed05937f4 100644
--- a/Trigger/TrigAlgorithms/TrigL2MuonSA/src/MuFastSteering.h
+++ b/Trigger/TrigAlgorithms/TrigL2MuonSA/src/MuFastSteering.h
@@ -91,9 +91,7 @@ class MuFastSteering : public HLT::FexAlgo,
 				 const std::vector<const TrigRoiDescriptor*>    roids,
 				 const std::vector<const LVL1::RecMuonRoI*>     muonRoIs,
 				 DataVector<xAOD::L2CombinedMuon>&              outputCBs,
-				 DataVector<xAOD::L2StandAloneMuon>&            outputSAs,
-				 TrigRoiDescriptorCollection&                   outputID,
-				 TrigRoiDescriptorCollection&                   outputMS );
+				 DataVector<xAOD::L2StandAloneMuon>&            outputSAs );
 
   int L2MuonAlgoMap(const std::string& name);
 
@@ -245,6 +243,7 @@ class MuFastSteering : public HLT::FexAlgo,
   Gaudi::Property< double > m_winPt { this, "WinPt", 4.0 };
 
   Gaudi::Property< bool > m_insideOut { this, "InsideOutMode", false, "" };
+  Gaudi::Property< float > m_ftfminPt { this, "FTFminPt", 3500, "pT [MeV] threshold to FTF tracks for L2Muon Inside-out mode" };
   Gaudi::Property< bool > m_topoRoad { this, "topoRoad", false, "create road in barrel not to highly overlap surrounding L1 RoIs" };
   Gaudi::Property< float > m_dPhisurrRoI { this, "dPhisurrRoI", 99, "phi range to find surrounding L1 RoIs" };
   Gaudi::Property< float > m_dEtasurrRoI { this, "dEtasurrRoI", 99, "eta range to find surrounding L1 RoIs" };
diff --git a/Trigger/TrigHypothesis/TrigMuonHypoMT/python/TrigMuonHypoMTConfig.py b/Trigger/TrigHypothesis/TrigMuonHypoMT/python/TrigMuonHypoMTConfig.py
index b9b828cecc8e399fcda815ea6f84cc13d2aa9a3f..7799576285c8f14cd7a19a99b816685fba7aef81 100755
--- a/Trigger/TrigHypothesis/TrigMuonHypoMT/python/TrigMuonHypoMTConfig.py
+++ b/Trigger/TrigHypothesis/TrigMuonHypoMT/python/TrigMuonHypoMTConfig.py
@@ -402,6 +402,36 @@ def TrigmuCombHypoToolwORFromDict( chainDict ):
     return tool
 
 
+
+def Trigl2IOHypoToolwORFromDict( chainDict ):
+
+    thresholds = getThresholdsFromDict( chainDict )
+
+    config = TrigmuCombHypoConfig()
+
+    tight = False # can be probably decoded from some of the proprties of the chain, expert work
+
+    acceptAll = False
+
+    tool=config.ConfigurationHypoTool( chainDict['chainName'], thresholds, tight, acceptAll )
+
+    # Overlap Removal
+    tool.ApplyOR = True
+    tool.RequireDR       = True
+    tool.RequireMufastDR = False
+    tool.RequireMass     = True
+    tool.RequireSameSign = True
+    tool.EtaBins         = [0, 0.9, 1.1, 1.9, 2.1, 9.9]
+    tool.DRThres         = [0.002, 0.001, 0.002, 0.002, 0.002]
+    tool.MufastDRThres   = [0]
+    tool.MassThres       = [0.004, 0.002, 0.006, 0.006, 0.006]
+
+    # addMonitoring( tool, TrigL2MuonOverlapRemoverMonitoringMucomb, "TrigmuCombHypoTool", chainDict['chainName'] )
+
+    return tool
+
+
+
 class TrigmuCombHypoConfig(object):
 
     log = logging.getLogger('TrigmuCombHypoConfig')
diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Muon/MuonSequenceSetup.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Muon/MuonSequenceSetup.py
index d7c9336515dcb78c59925b448fc47867b973bc98..b2def1d49154c3016ed6f6115f5ec0e83a933b0e 100644
--- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Muon/MuonSequenceSetup.py
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Muon/MuonSequenceSetup.py
@@ -219,18 +219,13 @@ def mul2IOOvlpRmSequence():
     trigmuCombHypo = TrigmuCombHypoAlg("TrigL2MuCBIOHypoAlg")
     trigmuCombHypo.MuonL2CBInfoFromMuCombAlg = muNames.L2CBName+"IOmode"
 
-    ### set up L2muOverlapRemoval ###
-    # from TrigMuonHypoMT.TrigMuonHypoMTConfig import TrigL2MuonOverlapRemoverMucombAlg
-    # trigL2MuonOverlapRemover = TrigL2MuonOverlapRemoverMucombAlg("TrigL2MuonIOOverlapRemoverMucombAlg")
-    # trigL2MuonOverlapRemover.L2MuonOverlapInfoFromMuCombAlg = muNames.L2CBName+"IOmode"
-
     # from TrigMuonHypoMT.TrigMuonHypoMTConfig import TrigL2MuonOverlapRemoverMucombToolFromDict
-    from TrigMuonHypoMT.TrigMuonHypoMTConfig import TrigmuCombHypoToolwORFromDict
+    from TrigMuonHypoMT.TrigMuonHypoMTConfig import Trigl2IOHypoToolwORFromDict
 
     return MenuSequence( Sequence    = l2muCombSequence,
                          Maker       = l2muCombViewsMaker,
                          Hypo        = trigmuCombHypo,
-                         HypoToolGen = TrigmuCombHypoToolwORFromDict )
+                         HypoToolGen = Trigl2IOHypoToolwORFromDict )