diff --git a/Trigger/TrigHypothesis/TrigBphysHypo/python/TrigBphysMuonCounterConfig.py b/Trigger/TrigHypothesis/TrigBphysHypo/python/TrigBphysMuonCounterConfig.py
new file mode 100644
index 0000000000000000000000000000000000000000..13ed7a6415d3b9a413b35d115a9dde78b3ab7c37
--- /dev/null
+++ b/Trigger/TrigHypothesis/TrigBphysHypo/python/TrigBphysMuonCounterConfig.py
@@ -0,0 +1,47 @@
+# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+
+# include the python fragment to set up the default bphysics vertex fitter
+from TrigBphysHypo import TrigBphysVertexingConfig
+
+from TrigBphysHypo.TrigBphysHypoConf import TrigBphysMuonCounter
+
+from AthenaCommon.AppMgr import ToolSvc
+
+from TrigTimeMonitor.TrigTimeHistToolConfig import TrigTimeHistToolConfig
+from TrigBphysHypo.TrigBphysMuonCounterMonitoring import TrigBphysMuonCounterValidationMonitoring
+from TrigBphysHypo.TrigBphysMuonCounterMonitoring import TrigBphysMuonCounterOnlineMonitoring
+
+
+class TrigBphysMuonCounterPy (TrigBphysMuonCounter):
+    __slots__ = []
+    def __init__(self, name = "MultiTrkFexPy"):
+        super( TrigBphysMuonCounterPy, self ).__init__( name )
+            
+    def setEFMuonThresholds(self, thresholds) :
+        self.ptMuonMin = []  # reset, use thresholds from trigger name
+        for thr in sorted(thresholds)  : # should should have lowest pt first, which is what we want
+            if len(self.ptMuonMin) < self.nEfMuon :
+                self.ptMuonMin.append( thr )
+        while len(self.ptMuonMin) < self.nEfMuon  :
+            self.ptMuonMin.append(2000.)  # lower pt cut makes no sense at trigger
+
+
+
+###################################################################################
+class TrigBphysMuonCounter_bNmu (TrigBphysMuonCounterPy):
+    __slots__ = []
+    # lets force name setting, as it needs to match pt cuts
+    def __init__(self, name, ptMuonMin ):
+        super( TrigBphysMuonCounter_bNmu, self ).__init__( name )
+ 
+        self.nEfMuon = len(ptMuonMin)
+        self.ptMuonMin = []
+        for thr in ptMuonMin :
+            self.ptMuonMin.append(thr)
+
+        time = TrigTimeHistToolConfig("Time")
+        validation = TrigBphysMuonCounterValidationMonitoring()
+        online = TrigBphysMuonCounterOnlineMonitoring()
+                                
+        self.AthenaMonTools = [ validation, online, time ]
+
diff --git a/Trigger/TrigHypothesis/TrigBphysHypo/python/TrigBphysMuonCounterMonitoring.py b/Trigger/TrigHypothesis/TrigBphysHypo/python/TrigBphysMuonCounterMonitoring.py
new file mode 100644
index 0000000000000000000000000000000000000000..82cd0f12e923e3ec0012bf9deac98a41cb170e7e
--- /dev/null
+++ b/Trigger/TrigHypothesis/TrigBphysHypo/python/TrigBphysMuonCounterMonitoring.py
@@ -0,0 +1,32 @@
+# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+
+from TrigMonitorBase.TrigGenericMonitoringToolConfig import defineHistogram, TrigGenericMonitoringToolConfig 
+
+ACCEPTANCE_labels = ' HltExecute : PassNEFMuons'
+ACCEPTANCE_number = 2
+
+class TrigBphysMuonCounterValidationMonitoring(TrigGenericMonitoringToolConfig):
+    def __init__ (self, name="TrigBphysMuonCounterValidationMonitoring"):
+        super(TrigBphysMuonCounterValidationMonitoring, self).__init__(name)
+        self.defineTarget("Validation")
+        self.Histograms += [ defineHistogram ( 'Acceptance', type = 'TH1F',
+                                               title = 'BphysMuonCounter - Reached steps - acceptance ; # Events ; step',
+                                               xbins = ACCEPTANCE_number , xmin = -0.5, xmax = ACCEPTANCE_number - 0.5,
+                                               labels = ACCEPTANCE_labels ) ]
+        self.Histograms += [ defineHistogram('nEFMuons', type='TH1F', title="Number of EF muons",
+                                           xbins=100, xmin=0., xmax=13.) ]
+        
+
+
+
+class TrigBphysMuonCounterOnlineMonitoring(TrigGenericMonitoringToolConfig):
+    def __init__ (self, name="TrigBphysMuonCounterOnlineMonitoring"):
+        super(TrigBphysMuonCounterOnlineMonitoring, self).__init__(name)
+        self.defineTarget("Online")
+        self.Histograms += [ defineHistogram ( 'Acceptance', type = 'TH1F',
+                                               title = 'BphysMuonCounter - Reached steps - acceptance ; # Events ; step',
+                                               xbins = ACCEPTANCE_number , xmin = -0.5, xmax = ACCEPTANCE_number - 0.5,
+                                               labels = ACCEPTANCE_labels ) ]
+        self.Histograms += [ defineHistogram('nEFMuons', type='TH1F', title="Number of EF muons",
+                                           xbins=100, xmin=0., xmax=13.) ]
+        
diff --git a/Trigger/TrigHypothesis/TrigBphysHypo/python/TrigMultiTrkFexConfig.py b/Trigger/TrigHypothesis/TrigBphysHypo/python/TrigMultiTrkFexConfig.py
index 70977304c8cbc88cba53f5863e5a3689530ec6b0..31c89865baa2a18e9d0df0fa15a39c684c4ba40a 100644
--- a/Trigger/TrigHypothesis/TrigBphysHypo/python/TrigMultiTrkFexConfig.py
+++ b/Trigger/TrigHypothesis/TrigBphysHypo/python/TrigMultiTrkFexConfig.py
@@ -69,7 +69,7 @@ class TrigMultiTrkFex_trkPhi (TrigMultiTrkFexPy):
         self.nTrkCharge = 0
         self.nTrkMassMin = [840.]  
         self.nTrkMassMax = [1240.] 
-        self.ptTrkMin = [4000., 4000. ] # set minimal pt of tracks for Phi+Pi
+        self.ptTrkMin = [3750., 3750. ] # set minimal pt of tracks for Phi+Pi
         self.diTrkMassMin = []   # phi window
         self.diTrkMassMax = []
         self.diTrkCharge = -1
@@ -98,7 +98,7 @@ class TrigMultiTrkFex_trkPhiX (TrigMultiTrkFexPy):
         self.nTrk = 3
         self.trkMass = 105.6583745  # looking for di-muon resonances       
         self.nTrkCharge = 1
-        self.ptTrkMin = [4000., 4000., 1000. ] # set minimal pt of tracks for Phi+Pi
+        self.ptTrkMin = [3750., 3750., 1000. ] # set minimal pt of tracks for Phi+Pi
         self.diTrkMassMin = [840.]   # phi window
         self.diTrkMassMax = [1240.]
         self.diTrkCharge = 0
@@ -130,7 +130,7 @@ class TrigMultiTrkFex_trkPhiXTight (TrigMultiTrkFexPy):
         self.nTrkCharge = 1
         self.nTrkMassMin = [1500.]
         self.nTrkMassMax = [2500.] 
-        self.ptTrkMin = [4000., 4000., 1000. ] # set minimal pt of tracks for Phi+Pi
+        self.ptTrkMin = [3750., 3750., 1000. ] # set minimal pt of tracks for Phi+Pi
         self.diTrkMassMin = [840.]   # phi window
         self.diTrkMassMax = [1240.]
         self.diTrkCharge = 0
@@ -148,6 +148,7 @@ class TrigMultiTrkFex_trkPhiXTight (TrigMultiTrkFexPy):
                                 
         self.AthenaMonTools = [ validation, online, time ]
         
+###################################################################################
 
 class TrigMultiTrkFex_trkTau (TrigMultiTrkFexPy):
     __slots__ = []
@@ -159,11 +160,11 @@ class TrigMultiTrkFex_trkTau (TrigMultiTrkFexPy):
 
         #self.trackCollectionKey = "'
         self.trkMass = 105.6583745  # looking for di-muon resonances       
-        self.nTrk = 3
+        self.nTrk = 2
         self.nTrkMassMin = [0.]
         self.nTrkMassMax = [2900.] # cut away J/psi
-        self.nTrkCharge = 1
-        self.ptTrkMin = [4000., 4000., 1000. ] # set minimal pt of tracks for Phi+Pi
+        self.nTrkCharge = -1
+        self.ptTrkMin = [3750., 1000. ] # set minimal pt of tracks for Phi+Pi
         self.diTrkMassMin = []   # no sub-resonances
         self.diTrkMassMax = []
         # muons are not matched to tracks, but still require to be present in TE
@@ -180,6 +181,41 @@ class TrigMultiTrkFex_trkTau (TrigMultiTrkFexPy):
                                 
         self.AthenaMonTools = [ validation, online, time ]
 
+###################################################################################
+class TrigMultiTrkFex_bNmu (TrigMultiTrkFexPy):
+    __slots__ = []
+    # lets force name setting, as it needs to match pt cuts
+    def __init__(self, name, ptMuonMin ):
+        super( TrigMultiTrkFex_bNmu, self ).__init__( name )
+
+        # AcceptAll flag: if true take events regardless of cuts
+        self.AcceptAll = False
+
+        #self.trackCollectionKey = "'
+        self.trkMass = 105.6583745  # looking for di-muon resonances       
+        self.nTrk = -1  # no cut
+        self.nTrkMassMin = []
+        self.nTrkMassMax = [] # cut away J/psi
+        self.nTrkCharge = -1
+        self.ptTrkMin = [] # set minimal pt of tracks for Phi+Pi
+        self.diTrkMassMin = []   # no sub-resonances
+        self.diTrkMassMax = []
+        # muons are not matched to tracks, but still could be required to be present in TE
+        self.nL2CombMuon = 0
+        self.nL2SAMuon = 0
+
+        # these are 2 cuts that matters. Set to the softest 
+        self.nEfMuon = len(ptMuonMin)
+        self.ptMuonMin = []
+        for thr in ptMuonMin :
+            self.ptMuonMin.append(thr)
+
+        time = TrigTimeHistToolConfig("Time")
+        validation = TrigMultiTrkFexValidationMonitoring()
+        online = TrigMultiTrkFexOnlineMonitoring()
+                                
+        self.AthenaMonTools = [ validation, online, time ]
+
 
 
 ###################################################################################
@@ -277,7 +313,7 @@ class TrigMultiTrkFex_DiMu (TrigMultiTrkFexPy):
         self.nTrkCharge = 0
         self.nTrkMassMin = [100.]
         self.nTrkMassMax = [15000.] 
-        self.ptTrkMin = [4000., 4000. ] # set minimal pt of tracks for 2mu passing L1
+        self.ptTrkMin = [3750., 3750. ] # set minimal pt of tracks for 2mu passing L1
         self.diTrkMassMin = []   # phi window
         self.diTrkMassMax = []
         self.diTrkCharge = -1
@@ -321,3 +357,33 @@ class TrigMultiTrkFex_DiMu_noVtx_noM_SS (TrigMultiTrkFex_DiMu):
         self.nTrkVertexChi2 = -1
         self.nTrkMassMin = [0.]  # OI not sure if this will work...
         self.nTrkMassMax = [1e+8] # should be safe at LHC, no? 
+
+
+#############################################################################
+class TrigMultiTrkFex_Jpsi (TrigMultiTrkFexPy):
+    __slots__ = []
+    def __init__(self, name = "MultiTrkFex_Jpsi"):
+        super( TrigMultiTrkFex_Jpsi, self ).__init__( name )
+        self.nTrk = 2
+        self.trkMass = 105.6583745  # looking for di-muon resonances       
+        self.nTrkVertexChi2 = 20
+        self.nTrkCharge = 0
+        self.nTrkMassMin = [2600.]
+        self.nTrkMassMax = [3600.] 
+        self.ptTrkMin = [3500., 3500. ] # set minimal pt of tracks for 2mu passing L1
+        self.diTrkMassMin = []   # phi window
+        self.diTrkMassMax = []
+        self.diTrkCharge = -1
+
+        # muons are not matched to tracks, but still require to be present in TE
+        self.nEfMuon = 0
+        self.nL2CombMuon = 0
+        self.nL2SAMuon = 0  # as we run on muon RoIs all necessary muons are already requested.
+        self.ptMuonMin = [] #[3600.]
+        #self.overlapdR  = 0.005 
+
+        time = TrigTimeHistToolConfig("Time")
+        validation = TrigMultiTrkFexValidationMonitoring()
+        online = TrigMultiTrkFexOnlineMonitoring()
+                                
+        self.AthenaMonTools = [ validation, online, time ]
diff --git a/Trigger/TrigHypothesis/TrigBphysHypo/src/TrigBphysMuonCounter.cxx b/Trigger/TrigHypothesis/TrigBphysHypo/src/TrigBphysMuonCounter.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..6b1839b2b5c911ca1d60fe470957987d5a67aa19
--- /dev/null
+++ b/Trigger/TrigHypothesis/TrigBphysHypo/src/TrigBphysMuonCounter.cxx
@@ -0,0 +1,141 @@
+// -*- C++ -*-
+
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+/**************************************************************************
+ **
+ **   File: Trigger/TrigHypothesis/TrigBphysHypo/TrigBphysMuonCounter
+ **
+ **   Description: algo to count muons in whole event
+ ** 
+ **  author Olya Igonkina 
+ **             
+ **************************************************************************/ 
+ 
+#include "TrigBphysMuonCounter.h"
+
+#include "xAODMuon/MuonContainer.h"
+#include "TrigTimeAlgs/TrigTimerSvc.h"
+#include "FourMomUtils/P4Helpers.h"
+
+
+// Define the bins for acceptance-monitoring histogram
+#define ACCEPT_hltExecute             0
+#define ACCEPT_PassNEFMuons           1	
+
+
+TrigBphysMuonCounter::TrigBphysMuonCounter(const std::string & name, ISvcLocator* pSvcLocator):
+  HLT::AllTEAlgo(name, pSvcLocator)
+  ,m_BmmHypTot(0)
+  
+  , m_nEfMuon(0)
+  , m_ptMuonMin()
+  , m_mindR(0.005)
+				  //counters
+  , m_countTotalEvents(0)
+  , m_countPassedEvents(0)
+
+{
+
+  // Read cuts
+
+  declareProperty("nEfMuon"        , m_nEfMuon    = 0 );
+  declareProperty("ptMuonMin"     , m_ptMuonMin      );
+  declareProperty("overlapdR"     , m_mindR    = 0.01  );  
+
+  declareMonitoredStdContainer("Acceptance" , m_mon_Acceptance   , AutoClear);
+  declareMonitoredVariable(    "nEFMuons",  m_mon_nEFMuons);
+}
+
+TrigBphysMuonCounter::~TrigBphysMuonCounter()
+{ }
+
+
+
+
+HLT::ErrorCode TrigBphysMuonCounter::hltInitialize()
+{
+    m_countTotalEvents = 0;
+    m_countPassedEvents = 0;
+
+    std::sort(m_ptMuonMin.begin(),m_ptMuonMin.end(), std::greater<float>());
+    
+   if (msgLvl() <= MSG::INFO) {
+
+      msg() << MSG::INFO << "require at least "<< m_nEfMuon <<" EF Muons" << endmsg;
+      msg() << MSG::INFO << " Muons should have  pts ";	
+      for(float pt :  m_ptMuonMin)  msg() << MSG::INFO << pt <<", ";
+      msg() << MSG::INFO << endmsg;
+     
+   }
+   if (msgLvl() <= MSG::INFO) {
+     msg() << MSG::INFO << " Overlap removal dR<"<<m_mindR<< endmsg;
+   }
+
+  if ( timerSvc() ) {
+    m_BmmHypTot = addTimer("TrigBphysMuonCounter");
+  }
+    
+  return HLT::OK;
+}
+
+HLT::ErrorCode TrigBphysMuonCounter::hltFinalize()
+{
+  msg() << MSG::INFO << "in finalize()" << endmsg;
+  MsgStream log(msgSvc(), name());
+  
+  msg() << MSG::INFO << "|----------------------- SUMMARY FROM TrigBphysMuonCounter -------------|" << endmsg;
+  msg() << MSG::INFO << "Run on events " << m_countTotalEvents <<  endmsg;
+  msg() << MSG::INFO << "Passed events " << m_countPassedEvents<<  endmsg;
+
+  return HLT::OK;
+}
+
+
+
+HLT::ErrorCode TrigBphysMuonCounter::hltExecute(std::vector<std::vector<HLT::TriggerElement*> >& inputTE, unsigned int output)
+{
+  // start monitoring
+  beforeExecMonitors().ignore();
+  m_countTotalEvents++;  
+  m_mon_Acceptance.clear();
+
+  m_mon_Acceptance.push_back( ACCEPT_hltExecute );
+  if ( msgLvl() <= MSG::DEBUG ) msg() << MSG::DEBUG << " In TrigBphysMuonCounter hltExecute" << endmsg;
+
+
+  //========  check if we have enough EF muons :  =====================
+  std::vector<ElementLink<xAOD::MuonContainer> > efmuons; // just a collection of pointers, not copies
+  bool passMuon = passNObjects<xAOD::MuonContainer, 
+			  std::vector<ElementLink<xAOD::MuonContainer> > >( m_nEfMuon, m_ptMuonMin, 
+									      inputTE, efmuons, "", m_mindR);
+  if( !passMuon ){
+    if ( timerSvc() )  m_BmmHypTot->stop();
+    if(msgLvl() <= MSG::DEBUG) msg() << MSG::DEBUG << "Found "<<efmuons.size() <<" EF muons - fail (either number or pts are insufficient)"<<  endmsg; 
+    afterExecMonitors().ignore();   
+    return HLT::OK;
+  }else{
+    if(msgLvl() <= MSG::DEBUG) msg() << MSG::DEBUG << "Found "<<efmuons.size() <<" EF muons, require "<<m_nEfMuon<<" - accept "<<  endmsg; 
+  }
+  m_mon_Acceptance.push_back( ACCEPT_PassNEFMuons );
+  m_mon_nEFMuons = m_nEfMuon;
+
+
+  // record collection now
+  if ( timerSvc() )  m_BmmHypTot->stop();
+    
+  HLT::TriggerElement* outputTE = addRoI(output);     
+  outputTE->setActiveState(true);
+  m_countPassedEvents++;
+
+
+  // stop monitoring
+  afterExecMonitors().ignore();   
+  return HLT::OK;
+}
+
+
+
+
diff --git a/Trigger/TrigHypothesis/TrigBphysHypo/src/TrigBphysMuonCounter.h b/Trigger/TrigHypothesis/TrigBphysHypo/src/TrigBphysMuonCounter.h
new file mode 100644
index 0000000000000000000000000000000000000000..6782e70f806495880da0030035908af4a4356898
--- /dev/null
+++ b/Trigger/TrigHypothesis/TrigBphysHypo/src/TrigBphysMuonCounter.h
@@ -0,0 +1,144 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+/**************************************************************************
+ **
+ **   File: Trigger/TrigHypothesis/TrigBphysHypo/TrigBphysMuonCounter.h
+ **
+ **   this algo just counts number of (EF) muons in the whole event and rejects if insufficient
+ **
+ **   Author:Olya Igonkina
+ **
+ **   Created:   28/03/2017
+ **   Modified:     
+ **
+ **************************************************************************/ 
+
+#ifndef TRIG_TrigBphysMuonCounter_H
+#define TRIG_TrigBphysMuonCounter_H
+
+// standard stuff
+#include <string>
+#include <map>
+#include <cmath> 
+#include <algorithm>
+
+#include "TrigInterfaces/AllTEAlgo.h"
+
+class TrigTimer;
+
+class TrigBphysMuonCounter: public HLT::AllTEAlgo  {
+  
+  public:
+    TrigBphysMuonCounter(const std::string & name, ISvcLocator* pSvcLocator);
+    ~TrigBphysMuonCounter();
+    HLT::ErrorCode hltInitialize();
+    HLT::ErrorCode hltFinalize();     
+
+    HLT::ErrorCode hltExecute(std::vector<std::vector<HLT::TriggerElement*> >& inputTEs, unsigned int output);
+    
+  private:
+
+ 
+
+  template<class Tin, class Tout> bool passNObjects(int nObjMin,
+						    const std::vector<float>& ptObjMin,
+						    std::vector<std::vector<HLT::TriggerElement*> >& inputTE ,
+						    Tout & outVec,
+						    //std::string printTag,
+						    const std::string&  collectionKey,
+						    float mindR) ;
+
+    
+  TrigTimer* m_BmmHypTot;
+
+  int m_nEfMuon ; // muons have to be present in TE, but are not required to match to tracks
+  std::vector<float> m_ptMuonMin;
+  float m_mindR;
+  // OI: should we check for CB flag?
+
+  //Counters
+  uint32_t m_countTotalEvents;
+  uint32_t m_countPassedEvents;
+
+    
+  //Monitored variables 
+  std::vector<int>   m_mon_Acceptance;
+  float              m_mon_nEFMuons;
+};
+
+
+template<class Tin, class Tout> bool TrigBphysMuonCounter::passNObjects(int nObjMin,
+					      const std::vector<float>& ptObjMin,
+					      std::vector<std::vector<HLT::TriggerElement*> >& inputTE ,
+					      Tout & outVec,
+					      //std::string printTag,
+					      const std::string&  collectionKey,
+					      float mindR) 
+{
+  if( nObjMin <= 0 ) return true;
+  ElementLinkVector<Tin> inVecColl;
+  outVec.clear();
+  std::vector<float> pts;
+  
+  float mindR2 = mindR*mindR;
+
+  unsigned int nTEs = inputTE.size();
+  for ( unsigned int i=0; i < nTEs; ++i) {
+   unsigned int mTEs = inputTE[i].size();
+   for ( unsigned int j=0; j < mTEs; ++j) {
+    if(getFeaturesLinks<Tin,Tin>(inputTE[i][j], inVecColl, collectionKey)==HLT::OK ) {
+      for( const auto& efmu : inVecColl){	
+	  // check for overlap
+	  bool found = false;
+	  for(const auto& part : outVec ){
+	    double deta = (*part)->eta() - (*efmu)->eta();
+	    double dphi = (*part)->phi() - (*efmu)->phi();
+	    double deltaR2 = deta*deta +dphi*dphi;
+	    if( deltaR2 <= mindR2) found = true;
+	  }
+	  if( !found ){ 
+	    float pt = fabs((*efmu)->pt()) ;
+	    // check if value in GeV or MeV, if it was >350 GeV and multiplied by 1000, it does not matter
+	    if( pt < 350. && pt>0.01 ) pt *= 1000.;
+	    pts.push_back(pt);	    
+	    outVec.push_back(efmu); 
+	    if ( msgLvl() <= MSG::DEBUG ) msg()  << MSG::DEBUG << "Found muon, pt= " << pt << endmsg;
+	  }
+      }//}// end loop over muons in one TE
+    } // end getFeaturesLinks
+   }} // end loop over all TEs
+
+    //=== check if it is enough muons
+  if( (int)outVec.size() < nObjMin ) {
+    if ( msgLvl() <= MSG::DEBUG ) msg()  << MSG::DEBUG << "Rejecting: "
+    					 <<" #muons= " <<  outVec.size() 
+    					 << " while need "<< nObjMin << endmsg;
+    return false;
+  }
+  //== check that muons have correct pts
+  std::sort(pts.begin(), pts.end(), std::greater<float>());
+
+  std::cout << " OI check pt \n";
+  for( float pt: pts ) std::cout << pt << " " ;
+  std::cout<< std::endl;
+
+  unsigned int Ncheck = std::min( nObjMin, int(ptObjMin.size()) );
+  bool failMuonPt = false;
+  for ( unsigned int ipt=0; ipt < Ncheck; ++ipt) {
+    if(  pts[ipt] < ptObjMin[ipt] ) 
+      failMuonPt = true;	  
+  }
+  if( failMuonPt ){
+    if ( msgLvl() <= MSG::DEBUG ) msg()  << MSG::DEBUG << "Fail muon pt cut" << endmsg;
+    return false;
+  }
+  // here would be good to limit number of objects to the minimum
+
+  return true;
+
+}
+
+
+#endif
diff --git a/Trigger/TrigHypothesis/TrigBphysHypo/src/TrigEFBMuMuXFex.cxx b/Trigger/TrigHypothesis/TrigBphysHypo/src/TrigEFBMuMuXFex.cxx
index 85a12d52f6b9007f208c0d9bc3289e8791489735..5e3e47bdfb7179d7569d00ffa4912208eb7a0cc9 100644
--- a/Trigger/TrigHypothesis/TrigBphysHypo/src/TrigEFBMuMuXFex.cxx
+++ b/Trigger/TrigHypothesis/TrigBphysHypo/src/TrigEFBMuMuXFex.cxx
@@ -828,14 +828,18 @@ HLT::ErrorCode TrigEFBMuMuXFex::hltExecute(HLT::TEConstVec& inputTE, HLT::Trigge
     int mu1_TE=-1;
     int mu2_TE=-1;
     if (!m_FTK) {
+      
       if ( inputTE.size() != 2 ) {
-        msg() << MSG::ERROR << "Got different than 2 number of input TEs: " << inputTE.size() << endmsg;
-        m_mon_Errors.push_back(ERROR_Not_2_InputTEs);
-        if ( timerSvc() ) m_TotTimer->stop();
-        return HLT::BAD_JOB_SETUP;
+        msg() << MSG::DEBUG << "Got different than 2 number of input TEs: " << inputTE.size() << endmsg;
+        //m_mon_Errors.push_back(ERROR_Not_2_InputTEs);
+        //if ( timerSvc() ) m_TotTimer->stop();
+        //return HLT::BAD_JOB_SETUP;
+	mu1_TE=0;
+	mu2_TE=0;
+      }else{
+	mu1_TE=0;
+	mu2_TE=1;
       }
-      mu1_TE=0;
-      mu2_TE=1;
     } else {
       if ( inputTE.size() != 3 ) {
         msg() << MSG::ERROR << "FTK mode expect 3 input TEs, got : " << inputTE.size() << endmsg;
diff --git a/Trigger/TrigHypothesis/TrigBphysHypo/src/TrigMultiTrkFex.cxx b/Trigger/TrigHypothesis/TrigBphysHypo/src/TrigMultiTrkFex.cxx
index f49d8f1693c3c25a9bd630c62936309b9063d42e..8209a0ef9ea5b36ec0413a014f58c0a724a5006c 100644
--- a/Trigger/TrigHypothesis/TrigBphysHypo/src/TrigMultiTrkFex.cxx
+++ b/Trigger/TrigHypothesis/TrigBphysHypo/src/TrigMultiTrkFex.cxx
@@ -129,9 +129,12 @@ bool TrigMultiTrkFex::passNTracks(int nObjMin,
 
   unsigned int nTEs = inputTE.size();
   for ( unsigned int i=0; i < nTEs; ++i) {
-   unsigned int mTEs = inputTE[i].size();
+    if ( msgLvl() <= MSG::DEBUG ) msg()  << MSG::DEBUG << " TE input array " << i << endmsg;
+    unsigned int mTEs = inputTE[i].size();
    for ( unsigned int j=0; j < mTEs; ++j) {
+     if ( msgLvl() <= MSG::DEBUG ) msg()  << MSG::DEBUG << " TE input  " << j << endmsg;
     if(getFeaturesLinks<xAOD::TrackParticleContainer,xAOD::TrackParticleContainer>(inputTE[i][j], inVecColl, collectionKey)==HLT::OK ) {
+      if ( msgLvl() <= MSG::DEBUG ) msg()  << MSG::DEBUG << "got track container  " << inVecColl.size() << endmsg;
       for( const auto & efmu : inVecColl){	//auto const & inVec: inVecColl ) 
 	  // check for overlap
 	  bool found = false;
@@ -140,7 +143,14 @@ bool TrigMultiTrkFex::passNTracks(int nObjMin,
 	    double deta = (*part)->eta() - (*efmu)->eta();
 	    double dphi = (*part)->phi() - (*efmu)->phi();
 	    double deltaR2 = deta*deta +dphi*dphi;
-	    if( deltaR2 <= mindR2) found = true;
+	    if( deltaR2 <= mindR2){
+	      found = true;
+ 	      if ( msgLvl() <= MSG::DEBUG ) msg()  << MSG::DEBUG << "Duplicated track pt/eta/phi/q "
+						   << (*efmu)->pt()<< " /  "
+						   << (*efmu)->eta()<< " /  "
+						   << (*efmu)->phi()<< " /  "
+						   << (*efmu)->charge()<< " skip " <<deltaR2 <<  endmsg;
+	    }
 	  }
 	  if( !found ) {
 	    outVec.push_back(efmu);	    	
diff --git a/Trigger/TrigHypothesis/TrigBphysHypo/src/components/TrigBphysHypo_entries.cxx b/Trigger/TrigHypothesis/TrigBphysHypo/src/components/TrigBphysHypo_entries.cxx
index dc4e588e20cf64b6746e0f95630daaa010922410..48bc5a47c8371f13ea505185bf4b068815487477 100644
--- a/Trigger/TrigHypothesis/TrigBphysHypo/src/components/TrigBphysHypo_entries.cxx
+++ b/Trigger/TrigHypothesis/TrigBphysHypo/src/components/TrigBphysHypo_entries.cxx
@@ -20,6 +20,7 @@
 #include "../TrigL2TrkMassHypo.h"
 #include "../TrigEFTrkMassHypo.h"
 #include "../TrigMultiTrkFex.h"
+#include "../TrigBphysMuonCounter.h"
 
 //#include "../TrigL2LooseMuonHypo.h"
 
@@ -56,6 +57,7 @@ DECLARE_TOOL_FACTORY( TrigBphysHelperUtilsTool )
 DECLARE_ALGORITHM_FACTORY( TrigEFBMuMuFex   )
 DECLARE_ALGORITHM_FACTORY( TrigEFMultiMuFex )
 DECLARE_ALGORITHM_FACTORY( TrigMultiTrkFex )
+DECLARE_ALGORITHM_FACTORY( TrigBphysMuonCounter )
 DECLARE_ALGORITHM_FACTORY( TrigEFTrkMassFex )
 //DECLARE_ALGORITHM_FACTORY( TrigBphysL1DiMuComboFex )
 
@@ -86,6 +88,7 @@ DECLARE_FACTORY_ENTRIES( TrigBphysHypo ) {
     DECLARE_ALGORITHM( TrigEFBMuMuFex   )
     DECLARE_ALGORITHM( TrigEFMultiMuFex )
     DECLARE_ALGORITHM( TrigMultiTrkFex )
+    DECLARE_ALGORITHM( TrigBphysMuonCounter )
     DECLARE_ALGORITHM( TrigEFTrkMassFex )
 //    DECLARE_ALGORITHM( TrigBphysL1DiMuComboFeX )
 
diff --git a/Trigger/TriggerCommon/TriggerMenu/python/bphysics/generateBPhysicsChainDefs.py b/Trigger/TriggerCommon/TriggerMenu/python/bphysics/generateBPhysicsChainDefs.py
index 9d46f03550a9e943e2a1023b5874827efa9593c7..cb7908b36c6ba6c51227e50d5cdf358ed5d066e8 100644
--- a/Trigger/TriggerCommon/TriggerMenu/python/bphysics/generateBPhysicsChainDefs.py
+++ b/Trigger/TriggerCommon/TriggerMenu/python/bphysics/generateBPhysicsChainDefs.py
@@ -13,25 +13,60 @@ log = logging.getLogger(__name__)
 from TriggerMenu.menu.MenuUtils import setupTopoStartFrom
 from TrigInDetConf.TrigInDetSequence import TrigInDetSequence
 
+
+log.bphysTrigWarning = True
+
+
 ###########################################################################
 ###########################################################################
 
 def generateChainDefs(chainDict):
     
     from TriggerMenu.muon.generateMuonChainDefs import generateChainDefs as genMuonChainDefs
-    theChainDef =     genMuonChainDefs(chainDict)
+    
+    from TriggerJobOpts.TriggerFlags import TriggerFlags
+    if TriggerFlags.run2Config=='2016':
+        thisIsBphysChain = False
+    else :
+        thisIsBphysChain = True
+
+
+    # OI - this is really should be managed in RunTier0Tests and not here!! 
+    menu_name = TriggerFlags.triggerMenuSetup()
+    if 'MC_pp_v6' in menu_name and TriggerFlags.run2Config!='2016' and log.bphysTrigWarning :
+        log.warning(menu_name+" is used with run2Config = "+str(TriggerFlags.run2Config)+" will use Bphys trigger config for 2016!!")
+        thisIsBphysChain = False
+        log.bphysTrigWarning = False
+
+    elif log.bphysTrigWarning :
+        log.bphysTrigWarning = False
+        log.info( "Bphys trigger will be setup for run2config = "+str(TriggerFlags.run2Config)+" as requested")
+        
+    
+    if "bBmumuxv3" in chainDict['chainName'] :  # OI this mc 2016 chain was never enabled, and is not needed in future
+        thisIsBphysChain = False
+    if 'legacyVtx' in chainDict['chainName'] :  # OI Drell-Yan chains are not migrated
+        thisIsBphysChain = False
+    if 'invm' in chainDict['chainName'] :  # OI Drell-Yan chains are not migrated
+        thisIsBphysChain = False
+    
+
+    theChainDef =     genMuonChainDefs(chainDict, thisIsBphysChain)
 
     if not chainDict["topo"]:
         log.error( "No topo given -> not a bphysics chain...")
     else:
-        theChainDef = _addTopoInfo(theChainDef,chainDict)    
+        if thisIsBphysChain : # new setup 
+            theChainDef = _addTopoInfo(theChainDef,chainDict, doL2MultiTrack = True)
+        else :
+            theChainDef = _addTopoInfo(theChainDef,chainDict, doL2MultiTrack = False)
 
     return theChainDef
 
 
 ###########################################################################
 ###########################################################################
-def _addTopoInfo(theChainDef,chainDict,doAtL2AndEF=True):
+def _addTopoInfo(theChainDef,chainDict,doAtL2AndEF=True, doL2MultiTrack = False):
 
     maxL2SignatureIndex = -1
     for signatureIndex,signature in enumerate(theChainDef.signatureList):
@@ -45,44 +80,34 @@ def _addTopoInfo(theChainDef,chainDict,doAtL2AndEF=True):
 
     SameConfigTopos = ['bJpsi', 'bDimu', 'bTau', 'bTauTrk', 'trkTau',
                        'bDsPhiXtight','bDsPhiX', 'bPhi', 
-                       'bBmumu', 'bJpsimumu', 'bUpsimumu', 'Zmumu','bUpsi']
+                       'bBmumu', 'bJpsimumu', 'bUpsimumu', 'Zmumu','bUpsi',
+                       'bNocut']
     ntopos = len(topoAlgs)
 
     topoThresh = chainDict['topoThreshold']
     topoStartFrom = setupTopoStartFrom(topoThresh,theChainDef) if topoThresh else None
-        
+
+            
     if ('bBmumux' in topoAlgs) | ('bBmumuxv2' in topoAlgs) | ('bBmumuxv3' in topoAlgs):
-        theChainDef = bBmumuxTopos(theChainDef, chainDict, inputTEsL2, inputTEsEF, topoStartFrom)
+        theChainDef = bBmumuxTopos(theChainDef, chainDict, inputTEsL2, inputTEsEF, topoStartFrom, doL2MultiTrack)
     elif ('Trkloose' in topoAlgs):
         theChainDef = bMuTrack(theChainDef, chainDict, inputTEsL2, inputTEsEF, topoStartFrom)
+    elif ('TrkPEB' in topoAlgs):
+        theChainDef = bMuTrackPEB(theChainDef, chainDict, inputTEsL2, inputTEsEF, topoStartFrom)
     elif (ntopos ==1) & (topoAlgs[0] in SameConfigTopos):
-        theChainDef = bSingleOptionTopos(theChainDef,chainDict, inputTEsL2, inputTEsEF, topoStartFrom)
+        theChainDef = bSingleOptionTopos(theChainDef,chainDict, inputTEsL2, inputTEsEF, topoStartFrom, doL2MultiTrack)
     else:
-        theChainDef = bMultipleOptionTopos(theChainDef,chainDict,inputTEsL2, inputTEsEF, topoStartFrom)
+        theChainDef = bMultipleOptionTopos(theChainDef,chainDict,inputTEsL2, inputTEsEF, topoStartFrom, doL2MultiTrack)
 
     return theChainDef
 
 
 ###################################################################################
-###################################################################################
-
-def bSingleOptionTopos(theChainDef, chainDict, inputTEsL2, inputTEsEF, topoStartFrom):
-    topoAlgs = chainDict["topo"]
-    mtopo = topoAlgs[0]
-    # TE naming deifnition
-    TEname = findL2teBaseName(chainDict['chainName'],topoAlgs)
-    L2TEname = "L2_" + TEname+'_'+mtopo+'_'+chainDict['L1item']
-    EFTEname = "EF_" + chainDict['chainName']
-    topo2StartFrom = None
-    if topoStartFrom:
-        L2TEname = "L2_" + TEname+'_'+mtopo+'_tsf_'+chainDict['L1item']
-        topo2StartFrom = L2TEname
-
-    chainParts = chainDict['chainParts']
+def getBphysThresholds(chainDict) :
     mult = 0
     trkmuons = []
     fexNameExt = ""
-    for part in chainParts :
+    for part in chainDict['chainParts'] :
         mult = mult + int(part['multiplicity'])
     for dictpart in chainDict['chainParts']:
         if 'mu' in dictpart['trigType']:
@@ -104,36 +129,81 @@ def bSingleOptionTopos(theChainDef, chainDict, inputTEsL2, inputTEsEF, topoStart
                     thr = 900.
                 trkmuons.append(thr)
                 fexNameExt = fexNameExt + "_"+str(int(dictpart['threshold']))
+    return fexNameExt, trkmuons, mult
+
+###################################################################################
+
+def bSingleOptionTopos(theChainDef, chainDict, inputTEsL2, inputTEsEF, topoStartFrom, doL2MultiTrack = False):
+    topoAlgs = chainDict["topo"]
+    mtopo = topoAlgs[0]
+    # TE naming deifnition
+    TEname = findL2teBaseName(chainDict['chainName'],topoAlgs)
+    L2TEname = "L2_" + TEname+'_'+mtopo+'_'+chainDict['L1item']
+    EFTEname = "EF_" + chainDict['chainName']
+    topo2StartFrom = None
+    if topoStartFrom:
+        L2TEname = "L2_" + TEname+'_'+mtopo+'_tsf_'+chainDict['L1item']
+        topo2StartFrom = L2TEname
+
+    chainParts = chainDict['chainParts']
 
-    if (mtopo == 'bJpsi'): 
-        from TrigBphysHypo.TrigL2MultiMuFexConfig import L2MultiMuFex_Jpsi
-        from TrigBphysHypo.TrigL2MultiMuHypoConfig import L2MultiMuHypo_Jpsi
+    fexNameExt,trkmuons, mult  = getBphysThresholds(chainDict)
+
+    from TrigBphysHypo.TrigMultiTrkFexConfig import TrigMultiTrkFex_DiMu,TrigMultiTrkFex_DiMu_noCut,TrigMultiTrkFex_DiMu_noVtx_noOS,TrigMultiTrkFex_DiMu_noVtx_noM_SS 
+    from TrigBphysHypo.TrigEFMultiMuHypoConfig import EFMultiMuHypo_DiMu_noCut,EFMultiMuHypo_DiMu_noVtx,EFMultiMuHypo_DiMu,EFMultiMuHypo_BMeson,EFMultiMuHypo_Jpsi,EFMultiMuHypo_Upsi,EFMultiMuHypo_2700
+    if (mtopo == 'bJpsi'):
+        if doL2MultiTrack :
+            from TrigBphysHypo.TrigMultiTrkFexConfig import TrigMultiTrkFex_DiMu
+            from TrigBphysHypo.TrigEFMultiMuHypoConfig import EFMultiMuHypo_DiMu
+            L2Fex = TrigMultiTrkFex_DiMu()
+            L2Hypo = EFMultiMuHypo_Jpsi("L2MultiMuTrkHypo_Jpsi")  
+            L2Hypo.bphysCollectionKey = "MultiTrkFex"
+        else :
+            from TrigBphysHypo.TrigL2MultiMuFexConfig import L2MultiMuFex_Jpsi
+            from TrigBphysHypo.TrigL2MultiMuHypoConfig import L2MultiMuHypo_Jpsi
+            L2Fex = L2MultiMuFex_Jpsi()
+            L2Hypo = L2MultiMuHypo_Jpsi()
+     
         from TrigBphysHypo.TrigEFMultiMuFexConfig import EFMultiMuFex_Jpsi
         from TrigBphysHypo.TrigEFMultiMuHypoConfig import EFMultiMuHypo_Jpsi
-        L2Fex = L2MultiMuFex_Jpsi()
-        L2Hypo = L2MultiMuHypo_Jpsi()
         EFFex = EFMultiMuFex_Jpsi()
         EFHypo = EFMultiMuHypo_Jpsi()
         
     elif (mtopo =='bDimu'):
         import re
         if ('3mu' in chainDict['chainName'] or re.search('2mu[0-9]+_mu[0-9]+',chainDict['chainName']) or re.search('mu[0-9]+_2mu[0-9]+',chainDict['chainName'])):
-            from TrigBphysHypo.TrigL2MultiMuFexConfig import L2MultiMuFex_DiMu
-            from TrigBphysHypo.TrigL2MultiMuHypoConfig import L2MultiMuHypo_DiMu
+            if doL2MultiTrack :
+                from TrigBphysHypo.TrigMultiTrkFexConfig import TrigMultiTrkFex_DiMu
+                from TrigBphysHypo.TrigEFMultiMuHypoConfig import EFMultiMuHypo_DiMu
+                L2Fex = TrigMultiTrkFex_DiMu()
+                L2Hypo = EFMultiMuHypo_DiMu("L2MultiMuTrkHypo_DiMu")  
+                L2Hypo.bphysCollectionKey = "MultiTrkFex"
+            else :
+                from TrigBphysHypo.TrigL2MultiMuFexConfig import L2MultiMuFex_DiMu
+                from TrigBphysHypo.TrigL2MultiMuHypoConfig import L2MultiMuHypo_DiMu
+                L2Fex = L2MultiMuFex_DiMu()
+                L2Hypo = L2MultiMuHypo_DiMu()        
+                
             from TrigBphysHypo.TrigEFMultiMuFexConfig import EFMultiMuFex_DiMu
             from TrigBphysHypo.TrigEFMultiMuHypoConfig import EFMultiMuHypo_DiMu
-            L2Fex = L2MultiMuFex_DiMu()
-            L2Hypo = L2MultiMuHypo_DiMu()        
             EFFex = EFMultiMuFex_DiMu()
             EFHypo = EFMultiMuHypo_DiMu()
         else:
             #This is a di-muon chain
-            from TrigBphysHypo.TrigL2BMuMuFexConfig import L2BMuMuFex_DiMu
-            from TrigBphysHypo.TrigL2BMuMuHypoConfig import L2BMuMuHypo_DiMu
+            if doL2MultiTrack :
+                from TrigBphysHypo.TrigMultiTrkFexConfig import TrigMultiTrkFex_DiMu
+                from TrigBphysHypo.TrigEFMultiMuHypoConfig import EFMultiMuHypo_DiMu
+                L2Fex = TrigMultiTrkFex_DiMu()
+                L2Hypo = EFMultiMuHypo_DiMu("L2MultiMuTrkHypo_DiMu")  
+                L2Hypo.bphysCollectionKey = "MultiTrkFex"
+            else :
+                from TrigBphysHypo.TrigL2BMuMuFexConfig import L2BMuMuFex_DiMu
+                from TrigBphysHypo.TrigL2BMuMuHypoConfig import L2BMuMuHypo_DiMu
+                L2Fex  = L2BMuMuFex_DiMu()
+                L2Hypo = L2BMuMuHypo_DiMu()
+                
             from TrigBphysHypo.TrigEFBMuMuFexConfig import EFBMuMuFex_DiMu
             from TrigBphysHypo.TrigEFBMuMuHypoConfig import EFBMuMuHypo_DiMu
-            L2Fex  = L2BMuMuFex_DiMu()
-            L2Hypo = L2BMuMuHypo_DiMu()
             EFFex  = EFBMuMuFex_DiMu()
             EFHypo = EFBMuMuHypo_DiMu()
     elif (mtopo == 'bTauTrk'):
@@ -157,6 +227,20 @@ def bSingleOptionTopos(theChainDef, chainDict, inputTEsL2, inputTEsEF, topoStart
             EFHypo = EFMultiMuHypo_2700("EFMultiMuHypo_Tau3")
             EFHypo.bphysCollectionKey = "EFMultiMuFex"
 
+    elif (mtopo == 'bNocut'):
+
+        from TrigBphysHypo.TrigMultiTrkFexConfig import  TrigMultiTrkFex_DiMu_noCut
+        from TrigBphysHypo.TrigBphysMuonCounterConfig import  TrigBphysMuonCounter_bNmu
+        from TrigBphysHypo.TrigEFMultiMuHypoConfig import EFMultiMuHypo_DiMu_noCut
+        # at level 2 just check that there is at least 2 tracks. One could cut this more down with multiplicity cut for 3mu_bNocut
+        # but because of 3mu_bJpsi items we will not gain anything 
+        L2Fex = TrigMultiTrkFex_DiMu_noCut()
+        L2Hypo = EFMultiMuHypo_DiMu_noCut("L2MultiMuTrkHypo_noCut")
+        L2Hypo.bphysCollectionKey = "MultiTrkFex"
+
+        EFFex = TrigBphysMuonCounter_bNmu("TrigBphysMuonCounter"+fexNameExt, trkmuons)
+        EFHypo = None
+
     elif (mtopo == 'bTau'):
 
         from TrigBphysHypo.TrigMultiTrkFexConfig import TrigMultiTrkFex_trkTau
@@ -164,8 +248,15 @@ def bSingleOptionTopos(theChainDef, chainDict, inputTEsL2, inputTEsEF, topoStart
         from TrigBphysHypo.TrigEFMultiMuFexConfig import EFMultiMuFex_Tau2
         from TrigBphysHypo.TrigEFMultiMuHypoConfig import EFMultiMuHypo_2700
 
-        L2Fex = None
-        L2Hypo = None
+        if doL2MultiTrack :
+            from TrigBphysHypo.TrigMultiTrkFexConfig import TrigMultiTrkFex_trkTau
+            from TrigBphysHypo.TrigEFMultiMuHypoConfig import EFMultiMuHypo_DiMu
+            L2Fex = TrigMultiTrkFex_trkTau()
+            L2Hypo = EFMultiMuHypo_2700("L2MultiMuHypo_bTau")
+            L2Hypo.bphysCollectionKey = "MultiTrkFex"
+        else :  # in 2016 there was no L2 part
+            L2Fex = None
+            L2Hypo = None
 
         if mult == 2 :
             EFFex = EFMultiMuFex_Tau2()
@@ -243,42 +334,72 @@ def bSingleOptionTopos(theChainDef, chainDict, inputTEsL2, inputTEsEF, topoStart
 
     
     elif (mtopo == 'bUpsi'):
-        from TrigBphysHypo.TrigL2MultiMuFexConfig import L2MultiMuFex_Upsi
-        from TrigBphysHypo.TrigL2MultiMuHypoConfig import L2MultiMuHypo_Upsi
+        if doL2MultiTrack :
+            from TrigBphysHypo.TrigMultiTrkFexConfig import TrigMultiTrkFex_DiMu
+            from TrigBphysHypo.TrigEFMultiMuHypoConfig import EFMultiMuHypo_DiMu
+            L2Fex = TrigMultiTrkFex_DiMu()
+            L2Hypo = EFMultiMuHypo_Upsi("L2MultiMuTrkHypo_Upsi")  
+            L2Hypo.bphysCollectionKey = "MultiTrkFex"
+        else:
+            from TrigBphysHypo.TrigL2MultiMuFexConfig import L2MultiMuFex_Upsi
+            from TrigBphysHypo.TrigL2MultiMuHypoConfig import L2MultiMuHypo_Upsi
+            L2Fex = L2MultiMuFex_Upsi()
+            L2Hypo = L2MultiMuHypo_Upsi()        
+            
         from TrigBphysHypo.TrigEFMultiMuFexConfig import EFMultiMuFex_Upsi
         from TrigBphysHypo.TrigEFMultiMuHypoConfig import EFMultiMuHypo_Upsi
-        L2Fex = L2MultiMuFex_Upsi()
-        L2Hypo = L2MultiMuHypo_Upsi()        
         EFFex = EFMultiMuFex_Upsi()
         EFHypo = EFMultiMuHypo_Upsi()
     
     elif (mtopo == 'bBmumu'):
-        from TrigBphysHypo.TrigL2BMuMuFexConfig import L2BMuMuFex_B
-        from TrigBphysHypo.TrigL2BMuMuHypoConfig import L2BMuMuHypo_B
+        if doL2MultiTrack :
+            from TrigBphysHypo.TrigMultiTrkFexConfig import TrigMultiTrkFex_DiMu
+            from TrigBphysHypo.TrigEFMultiMuHypoConfig import EFMultiMuHypo_BMeson
+            L2Fex = TrigMultiTrkFex_DiMu()
+            L2Hypo = EFMultiMuHypo_BMeson("L2MultiMuTrkHypo_BMeson")  
+            L2Hypo.bphysCollectionKey = "MultiTrkFex"
+        else :
+            from TrigBphysHypo.TrigL2BMuMuFexConfig import L2BMuMuFex_B
+            from TrigBphysHypo.TrigL2BMuMuHypoConfig import L2BMuMuHypo_B
+            L2Fex  = L2BMuMuFex_B()
+            L2Hypo = L2BMuMuHypo_B()
         from TrigBphysHypo.TrigEFBMuMuFexConfig import EFBMuMuFex_B
         from TrigBphysHypo.TrigEFBMuMuHypoConfig import EFBMuMuHypo_B
-        L2Fex  = L2BMuMuFex_B()
-        L2Hypo = L2BMuMuHypo_B()
         EFFex  = EFBMuMuFex_B()
         EFHypo = EFBMuMuHypo_B()
         
     elif (mtopo == 'bJpsimumu'):
-        from TrigBphysHypo.TrigL2BMuMuFexConfig import L2BMuMuFex_Jpsi
-        from TrigBphysHypo.TrigL2BMuMuHypoConfig import L2BMuMuHypo_Jpsi
+        if doL2MultiTrack :
+            from TrigBphysHypo.TrigMultiTrkFexConfig import TrigMultiTrkFex_DiMu
+            from TrigBphysHypo.TrigEFMultiMuHypoConfig import EFMultiMuHypo_DiMu
+            L2Fex = TrigMultiTrkFex_DiMu()
+            L2Hypo = EFMultiMuHypo_Jpsi("L2MultiMuTrkHypo_Jpsi")  
+            L2Hypo.bphysCollectionKey = "MultiTrkFex"
+        else :
+            from TrigBphysHypo.TrigL2BMuMuFexConfig import L2BMuMuFex_Jpsi
+            from TrigBphysHypo.TrigL2BMuMuHypoConfig import L2BMuMuHypo_Jpsi
+            L2Fex  = L2BMuMuFex_Jpsi()
+            L2Hypo = L2BMuMuHypo_Jpsi()
+            
         from TrigBphysHypo.TrigEFBMuMuFexConfig import EFBMuMuFex_Jpsi
         from TrigBphysHypo.TrigEFBMuMuHypoConfig import EFBMuMuHypo_Jpsi
-        L2Fex  = L2BMuMuFex_Jpsi()
-        L2Hypo = L2BMuMuHypo_Jpsi()
         EFFex  = EFBMuMuFex_Jpsi()
         EFHypo = EFBMuMuHypo_Jpsi()
 
     elif (mtopo == 'bUpsimumu'):
-        from TrigBphysHypo.TrigL2BMuMuFexConfig import L2BMuMuFex_Upsi
-        from TrigBphysHypo.TrigL2BMuMuHypoConfig import L2BMuMuHypo_Upsi
+        if doL2MultiTrack :
+            from TrigBphysHypo.TrigMultiTrkFexConfig import TrigMultiTrkFex_DiMu
+            from TrigBphysHypo.TrigEFMultiMuHypoConfig import EFMultiMuHypo_DiMu
+            L2Fex = TrigMultiTrkFex_DiMu()
+            L2Hypo = EFMultiMuHypo_Upsi("L2MultiMuTrkHypo_Upsi")
+        else :
+            from TrigBphysHypo.TrigL2BMuMuFexConfig import L2BMuMuFex_Upsi
+            from TrigBphysHypo.TrigL2BMuMuHypoConfig import L2BMuMuHypo_Upsi
+            L2Fex  = L2BMuMuFex_Upsi()
+            L2Hypo = L2BMuMuHypo_Upsi()
+            
         from TrigBphysHypo.TrigEFBMuMuFexConfig import EFBMuMuFex_Upsi
         from TrigBphysHypo.TrigEFBMuMuHypoConfig import EFBMuMuHypo_Upsi
-        L2Fex  = L2BMuMuFex_Upsi()
-        L2Hypo = L2BMuMuHypo_Upsi()
         EFFex  = EFBMuMuFex_Upsi()
         EFHypo = EFBMuMuHypo_Upsi()
 
@@ -298,7 +419,10 @@ def bSingleOptionTopos(theChainDef, chainDict, inputTEsL2, inputTEsEF, topoStart
     if  L2Fex != None :
         theChainDef.addSequence([L2Fex, L2Hypo], inputTEsL2, L2TEname, topo_start_from = topoStartFrom)
         theChainDef.addSignatureL2([L2TEname])
-    theChainDef.addSequence([EFFex, EFHypo],inputTEsEF, EFTEname, topo_start_from=topo2StartFrom)
+    if EFHypo != None :
+        theChainDef.addSequence([EFFex, EFHypo],inputTEsEF, EFTEname, topo_start_from=topo2StartFrom)
+    else :
+        theChainDef.addSequence([EFFex],inputTEsEF, EFTEname, topo_start_from=topo2StartFrom)
     theChainDef.addSignature(theChainDef.signatureList[-1]['signature_counter']+1, [EFTEname])    
 
     if 'idperf' in chainDict['chainName']:
@@ -313,7 +437,7 @@ def bSingleOptionTopos(theChainDef, chainDict, inputTEsL2, inputTEsEF, topoStart
 
 ###################################################################################
 ###################################################################################
-def bMultipleOptionTopos(theChainDef, chainDict, inputTEsL2, inputTEsEF, topoStartFrom):
+def bMultipleOptionTopos(theChainDef, chainDict, inputTEsL2, inputTEsEF, topoStartFrom, doL2MultiTrack = False):
 
     topoAlgs = chainDict["topo"]
     TEname = findL2teBaseName(chainDict['chainName'],topoAlgs)
@@ -331,31 +455,65 @@ def bMultipleOptionTopos(theChainDef, chainDict, inputTEsL2, inputTEsEF, topoSta
 
 
 
+        #from TrigBphysHypo.TrigMultiTrkFexConfig import TrigMultiTrkFex_DiMu
+        #from TrigBphysHypo.TrigEFMultiMuHypoConfig import EFMultiMuHypo_DiMu
+    from TrigBphysHypo.TrigMultiTrkFexConfig import TrigMultiTrkFex_DiMu,TrigMultiTrkFex_DiMu_noCut,TrigMultiTrkFex_DiMu_noVtx_noOS,TrigMultiTrkFex_DiMu_noVtx_noM_SS
+    from TrigBphysHypo.TrigEFMultiMuHypoConfig import EFMultiMuHypo_DiMu_noCut,EFMultiMuHypo_DiMu_noVtx,EFMultiMuHypo_DiMu,EFMultiMuHypo_BMeson,EFMultiMuHypo_Jpsi,EFMultiMuHypo_Upsi,EFMultiMuHypo_2700,EFMultiMuHypo_BMeson 
+
     if ('7invm9' in topoAlgs) & ('noos' in topoAlgs) & ('novtx' not in topoAlgs):
-        from TrigBphysHypo.TrigL2BMuMuFexConfig import L2BMuMuFex_DiMu_7invm9_noOS
-        from TrigBphysHypo.TrigL2BMuMuHypoConfig import L2BMuMuHypo_DiMu_7invm9
+        #if not doL2MultiTrack :
+        # OI do MultiTrk is not working yet for invm chains
+        if 1 :
+            from TrigBphysHypo.TrigL2BMuMuFexConfig import L2BMuMuFex_DiMu_7invm9_noOS
+            from TrigBphysHypo.TrigL2BMuMuHypoConfig import L2BMuMuHypo_DiMu_7invm9
+            L2Fex  = L2BMuMuFex_DiMu_7invm9_noOS()
+            L2Hypo = L2BMuMuHypo_DiMu_7invm9()
+        ## else :
+        ##     L2Fex = TrigMultiTrkFex_DiMu_noVtx_noOS()
+        ##     L2Hypo = EFMultiMuHypo_DiMu("L2MultiMuTrkHypo_DiMu_7invm9_noVtx")  
+        ##     L2Hypo.bphysCollectionKey = "MultiTrkFex"
+        ##     L2Hypo.LowerMassCut= 7000.
+        ##     L2Hypo.UpperMassCut= 9000.
+        
         from TrigBphysHypo.TrigEFBMuMuFexConfig import EFBMuMuFex_DiMu_7invm9_noOS
         from TrigBphysHypo.TrigEFBMuMuHypoConfig import EFBMuMuHypo_DiMu_7invm9
-        L2Fex  = L2BMuMuFex_DiMu_7invm9_noOS()
-        L2Hypo = L2BMuMuHypo_DiMu_7invm9()
         EFFex  = EFBMuMuFex_DiMu_7invm9_noOS()
         EFHypo = EFBMuMuHypo_DiMu_7invm9()
     elif ('7invm9' in topoAlgs) & ('noos' in topoAlgs) & ('novtx' in topoAlgs):
-        from TrigBphysHypo.TrigL2BMuMuFexConfig import L2BMuMuFex_DiMu_7invm9_noOS
-        from TrigBphysHypo.TrigL2BMuMuHypoConfig import L2BMuMuHypo_DiMu_7invm9_noVtx
         from TrigBphysHypo.TrigEFBMuMuFexConfig import EFBMuMuFex_DiMu_7invm9_noOS
         from TrigBphysHypo.TrigEFBMuMuHypoConfig import EFBMuMuHypo_DiMu_7invm9_noVtx
-        L2Fex  = L2BMuMuFex_DiMu_7invm9_noOS()
-        L2Hypo = L2BMuMuHypo_DiMu_7invm9_noVtx()
+#        if not doL2MultiTrack :
+        # OI do MultiTrk is not working yet for invm chains
+        if 1 :
+            from TrigBphysHypo.TrigL2BMuMuFexConfig import L2BMuMuFex_DiMu_7invm9_noOS
+            from TrigBphysHypo.TrigL2BMuMuHypoConfig import L2BMuMuHypo_DiMu_7invm9_noVtx
+            L2Fex  = L2BMuMuFex_DiMu_7invm9_noOS()
+            L2Hypo = L2BMuMuHypo_DiMu_7invm9_noVtx()
+        ## else :
+        ##     L2Fex = TrigMultiTrkFex_DiMu_noVtx_noOS()
+        ##     L2Hypo = EFMultiMuHypo_DiMu_noVtx("L2MultiMuTrkHypo_DiMu_noVtx_7invm9")  
+        ##     L2Hypo.bphysCollectionKey = "MultiTrkFex"
+        ##     L2Hypo.LowerMassCut= 7000.
+        ##     L2Hypo.UpperMassCut= 9000.
+
         EFFex  = EFBMuMuFex_DiMu_7invm9_noOS()
         EFHypo = EFBMuMuHypo_DiMu_7invm9_noVtx()
     elif ('18invm60' in topoAlgs) & ('noos' in topoAlgs):
-        from TrigBphysHypo.TrigL2BMuMuFexConfig import L2BMuMuFex_DiMu_18invm60_noOS
-        from TrigBphysHypo.TrigL2BMuMuHypoConfig import L2BMuMuHypo_DiMu_18invm60_noVtx           
         from TrigBphysHypo.TrigEFBMuMuFexConfig import EFBMuMuFex_DiMu_18invm60_noOS
         from TrigBphysHypo.TrigEFBMuMuHypoConfig import EFBMuMuHypo_DiMu_18invm60_noVtx           
-        L2Fex  = L2BMuMuFex_DiMu_18invm60_noOS()
-        L2Hypo = L2BMuMuHypo_DiMu_18invm60_noVtx()
+#        if not doL2MultiTrack :
+        # OI do MultiTrk is not working yet for invm chains
+        if 1 :
+            from TrigBphysHypo.TrigL2BMuMuFexConfig import L2BMuMuFex_DiMu_18invm60_noOS
+            from TrigBphysHypo.TrigL2BMuMuHypoConfig import L2BMuMuHypo_DiMu_18invm60_noVtx           
+            L2Fex  = L2BMuMuFex_DiMu_18invm60_noOS()
+            L2Hypo = L2BMuMuHypo_DiMu_18invm60_noVtx()
+        ## else :
+        ##     L2Fex = TrigMultiTrkFex_DiMu_noVtx_noOS()
+        ##     L2Hypo = EFMultiMuHypo_DiMu("L2MultiMuTrkHypo_DiMu_18invm60")  
+        ##     L2Hypo.bphysCollectionKey = "MultiTrkFex"
+        ##     L2Hypo.LowerMassCut= 18000.
+        ##     L2Hypo.UpperMassCut= 60000.
         EFFex  = EFBMuMuFex_DiMu_18invm60_noOS()
         EFHypo = EFBMuMuHypo_DiMu_18invm60_noVtx()
     elif ('11invm60' in topoAlgs) & ('noos' in topoAlgs) & ('novtx' not in topoAlgs):
@@ -363,8 +521,17 @@ def bMultipleOptionTopos(theChainDef, chainDict, inputTEsL2, inputTEsEF, topoSta
         from TrigBphysHypo.TrigL2BMuMuHypoConfig import L2BMuMuHypo_DiMu_11invm60
         from TrigBphysHypo.TrigEFBMuMuFexConfig import EFBMuMuFex_DiMu_11invm60_noOS
         from TrigBphysHypo.TrigEFBMuMuHypoConfig import EFBMuMuHypo_DiMu_11invm60
-        L2Fex  = L2BMuMuFex_DiMu_11invm60_noOS()
-        L2Hypo = L2BMuMuHypo_DiMu_11invm60()
+#        if not doL2MultiTrack :
+        # OI do MultiTrk is not working yet for invm chains
+        if 1 :
+            L2Fex  = L2BMuMuFex_DiMu_11invm60_noOS()
+            L2Hypo = L2BMuMuHypo_DiMu_11invm60()
+        ## else:
+        ##     L2Fex = TrigMultiTrkFex_DiMu_noVtx_noOS()
+        ##     L2Hypo = EFMultiMuHypo_DiMu("L2MultiMuTrkHypo_DiMu_11invm60")  
+        ##     L2Hypo.bphysCollectionKey = "MultiTrkFex"
+        ##     L2Hypo.LowerMassCut= 11000.
+        ##     L2Hypo.UpperMassCut= 60000.
         EFFex  = EFBMuMuFex_DiMu_11invm60_noOS()
         EFHypo = EFBMuMuHypo_DiMu_11invm60()                   
     elif ('11invm24' in topoAlgs) & ('noos' in topoAlgs) & ('novtx' not in topoAlgs):
@@ -372,8 +539,18 @@ def bMultipleOptionTopos(theChainDef, chainDict, inputTEsL2, inputTEsEF, topoSta
         from TrigBphysHypo.TrigL2BMuMuHypoConfig import L2BMuMuHypo_DiMu_11invm24
         from TrigBphysHypo.TrigEFBMuMuFexConfig import EFBMuMuFex_DiMu_11invm24_noOS
         from TrigBphysHypo.TrigEFBMuMuHypoConfig import EFBMuMuHypo_DiMu_11invm24
-        L2Fex  = L2BMuMuFex_DiMu_11invm24_noOS()
-        L2Hypo = L2BMuMuHypo_DiMu_11invm24()
+#        if not doL2MultiTrack :
+        # OI do MultiTrk is not working yet for invm chains
+        if 1 :
+            L2Fex  = L2BMuMuFex_DiMu_11invm24_noOS()
+            L2Hypo = L2BMuMuHypo_DiMu_11invm24()
+        ## else :
+        ##     L2Fex = TrigMultiTrkFex_DiMu_noVtx_noOS()
+        ##     L2Hypo = EFMultiMuHypo_DiMu("L2MultiMuTrkHypo_DiMu_11invm24")  
+        ##     L2Hypo.bphysCollectionKey = "MultiTrkFex"
+        ##     L2Hypo.LowerMassCut= 11000.
+        ##     L2Hypo.UpperMassCut= 24000.
+        
         EFFex  = EFBMuMuFex_DiMu_11invm24_noOS()
         EFHypo = EFBMuMuHypo_DiMu_11invm24()
     elif ('24invm60' in topoAlgs) & ('noos' in topoAlgs) & ('novtx' not in topoAlgs):
@@ -381,8 +558,17 @@ def bMultipleOptionTopos(theChainDef, chainDict, inputTEsL2, inputTEsEF, topoSta
         from TrigBphysHypo.TrigL2BMuMuHypoConfig import L2BMuMuHypo_DiMu_24invm60
         from TrigBphysHypo.TrigEFBMuMuFexConfig import EFBMuMuFex_DiMu_24invm60_noOS
         from TrigBphysHypo.TrigEFBMuMuHypoConfig import EFBMuMuHypo_DiMu_24invm60
-        L2Fex  = L2BMuMuFex_DiMu_24invm60_noOS()
-        L2Hypo = L2BMuMuHypo_DiMu_24invm60()
+        ## if  doL2MultiTrack :
+        ##     L2Fex = TrigMultiTrkFex_DiMu_noVtx_noOS()
+        ##     L2Hypo = EFMultiMuHypo_DiMu("L2MultiMuTrkHypo_DiMu_24invm60")  
+        ##     L2Hypo.bphysCollectionKey = "MultiTrkFex"
+        ##     L2Hypo.LowerMassCut= 24000.
+        ##     L2Hypo.UpperMassCut= 60000.
+        ## else :
+        # OI do MultiTrk is not working yet for invm chains
+        if 1 :
+            L2Fex  = L2BMuMuFex_DiMu_24invm60_noOS()
+            L2Hypo = L2BMuMuHypo_DiMu_24invm60()
         EFFex  = EFBMuMuFex_DiMu_24invm60_noOS()
         EFHypo = EFBMuMuHypo_DiMu_24invm60()
     elif ('11invm60' in topoAlgs) & ('noos' in topoAlgs) & ('novtx' in topoAlgs):
@@ -390,8 +576,17 @@ def bMultipleOptionTopos(theChainDef, chainDict, inputTEsL2, inputTEsEF, topoSta
         from TrigBphysHypo.TrigL2BMuMuHypoConfig import L2BMuMuHypo_DiMu_11invm60_noVtx           
         from TrigBphysHypo.TrigEFBMuMuFexConfig import EFBMuMuFex_DiMu_11invm60_noOS
         from TrigBphysHypo.TrigEFBMuMuHypoConfig import EFBMuMuHypo_DiMu_11invm60_noVtx           
-        L2Fex  = L2BMuMuFex_DiMu_11invm60_noOS()
-        L2Hypo = L2BMuMuHypo_DiMu_11invm60_noVtx()
+#        if not doL2MultiTrack :
+        # OI do MultiTrk is not working yet for invm chains
+        if 1 :
+            L2Fex  = L2BMuMuFex_DiMu_11invm60_noOS()
+            L2Hypo = L2BMuMuHypo_DiMu_11invm60_noVtx()
+        ## else :
+        ##     L2Fex = TrigMultiTrkFex_DiMu_noVtx_noOS()
+        ##     L2Hypo = EFMultiMuHypo_DiMu_noVtx("L2MultiMuTrkHypo_DiMu_noVtx_11invm60")  
+        ##     L2Hypo.bphysCollectionKey = "MultiTrkFex"
+        ##     L2Hypo.LowerMassCut= 11000.
+        ##     L2Hypo.UpperMassCut= 60000.
         EFFex  = EFBMuMuFex_DiMu_11invm60_noOS()
         EFHypo = EFBMuMuHypo_DiMu_11invm60_noVtx()                   
     elif ('11invm24' in topoAlgs) & ('noos' in topoAlgs) & ('novtx' in topoAlgs):
@@ -399,8 +594,18 @@ def bMultipleOptionTopos(theChainDef, chainDict, inputTEsL2, inputTEsEF, topoSta
         from TrigBphysHypo.TrigL2BMuMuHypoConfig import L2BMuMuHypo_DiMu_11invm24_noVtx           
         from TrigBphysHypo.TrigEFBMuMuFexConfig import EFBMuMuFex_DiMu_11invm24_noOS
         from TrigBphysHypo.TrigEFBMuMuHypoConfig import EFBMuMuHypo_DiMu_11invm24_noVtx           
-        L2Fex  = L2BMuMuFex_DiMu_11invm24_noOS()
-        L2Hypo = L2BMuMuHypo_DiMu_11invm24_noVtx()
+#        if not doL2MultiTrack :
+        # OI do MultiTrk is not working yet for invm chains
+        if 1 :
+            L2Fex  = L2BMuMuFex_DiMu_11invm24_noOS()
+            L2Hypo = L2BMuMuHypo_DiMu_11invm24_noVtx()
+        ## else :
+        ##     L2Fex = TrigMultiTrkFex_DiMu_noVtx_noOS()
+        ##     L2Hypo = EFMultiMuHypo_DiMu_noVtx("L2MultiMuTrkHypo_DiMu_noVtx_11invm24")  
+        ##     L2Hypo.bphysCollectionKey = "MultiTrkFex"
+        ##     L2Hypo.LowerMassCut= 11000.
+        ##     L2Hypo.UpperMassCut= 24000.
+       
         EFFex  = EFBMuMuFex_DiMu_11invm24_noOS()
         EFHypo = EFBMuMuHypo_DiMu_11invm24_noVtx()
     elif ('24invm60' in topoAlgs) & ('noos' in topoAlgs) & ('novtx' in topoAlgs):
@@ -408,8 +613,17 @@ def bMultipleOptionTopos(theChainDef, chainDict, inputTEsL2, inputTEsEF, topoSta
         from TrigBphysHypo.TrigL2BMuMuHypoConfig import L2BMuMuHypo_DiMu_24invm60_noVtx           
         from TrigBphysHypo.TrigEFBMuMuFexConfig import EFBMuMuFex_DiMu_24invm60_noOS
         from TrigBphysHypo.TrigEFBMuMuHypoConfig import EFBMuMuHypo_DiMu_24invm60_noVtx           
-        L2Fex  = L2BMuMuFex_DiMu_24invm60_noOS()
-        L2Hypo = L2BMuMuHypo_DiMu_24invm60_noVtx()
+#        if not doL2MultiTrack :
+        # OI do MultiTrk is not working yet for invm chains
+        if 1 :
+            L2Fex  = L2BMuMuFex_DiMu_24invm60_noOS()
+            L2Hypo = L2BMuMuHypo_DiMu_24invm60_noVtx()
+        ## else :
+        ##     L2Fex = TrigMultiTrkFex_DiMu_noVtx_noOS()
+        ##     L2Hypo = EFMultiMuHypo_DiMu_noVtx("L2MultiMuTrkHypo_DiMu_noVtx_24invm60")  
+        ##     L2Hypo.bphysCollectionKey = "MultiTrkFex"
+        ##     L2Hypo.LowerMassCut= 24000.
+        ##     L2Hypo.UpperMassCut= 60000.
         EFFex  = EFBMuMuFex_DiMu_24invm60_noOS()
         EFHypo = EFBMuMuHypo_DiMu_24invm60_noVtx()
    
@@ -436,32 +650,47 @@ def bMultipleOptionTopos(theChainDef, chainDict, inputTEsL2, inputTEsEF, topoSta
             EFHypo.bphysCollectionKey = "EFMultiMuFex"
      
     elif ('bDimu' in topoAlgs) & ('novtx' in topoAlgs) & ('noos' in topoAlgs) & ('noL2' in topoAlgs):
-        from TrigBphysHypo.TrigL2BMuMuFexConfig  import L2BMuMuFex_DiMu_passL2
-        from TrigBphysHypo.TrigL2BMuMuHypoConfig import L2BMuMuHypo_DiMu_passL2
         from TrigBphysHypo.TrigEFBMuMuFexConfig  import EFBMuMuFex_DiMu_noOS
         from TrigBphysHypo.TrigEFBMuMuHypoConfig import EFBMuMuHypo_DiMu_noVtx
-        L2Fex  = L2BMuMuFex_DiMu_passL2() 
-        L2Hypo = L2BMuMuHypo_DiMu_passL2()
+        if not doL2MultiTrack :
+            from TrigBphysHypo.TrigL2BMuMuFexConfig  import L2BMuMuFex_DiMu_passL2
+            from TrigBphysHypo.TrigL2BMuMuHypoConfig import L2BMuMuHypo_DiMu_passL2
+            L2Fex  = L2BMuMuFex_DiMu_passL2() 
+            L2Hypo = L2BMuMuHypo_DiMu_passL2()
+        else :
+            L2Fex = TrigMultiTrkFex_DiMu_noCut()
+            L2Hypo = EFMultiMuHypo_DiMu_noCut("L2MultiMuTrkHypo_noCut")
+            L2Hypo.bphysCollectionKey = "MultiTrkFex"
         EFFex  = EFBMuMuFex_DiMu_noOS()
         EFHypo = EFBMuMuHypo_DiMu_noVtx()        
     elif ('bDimu' in topoAlgs) & ('novtx' in topoAlgs) & ('noos' in topoAlgs):
-        from TrigBphysHypo.TrigL2BMuMuFexConfig  import L2BMuMuFex_DiMu_noOS
-        from TrigBphysHypo.TrigL2BMuMuHypoConfig import L2BMuMuHypo_DiMu_noVtx
+        if not doL2MultiTrack :
+            from TrigBphysHypo.TrigL2BMuMuFexConfig  import L2BMuMuFex_DiMu_noOS
+            from TrigBphysHypo.TrigL2BMuMuHypoConfig import L2BMuMuHypo_DiMu_noVtx
+            L2Fex  = L2BMuMuFex_DiMu_noOS() 
+            L2Hypo = L2BMuMuHypo_DiMu_noVtx()
+        else :
+            L2Fex = TrigMultiTrkFex_DiMu_noVtx_noOS()
+            L2Hypo = EFMultiMuHypo_DiMu_noVtx("L2MultiMuTrkHypo_noVtx")
+            L2Hypo.bphysCollectionKey = "MultiTrkFex"
         from TrigBphysHypo.TrigEFBMuMuFexConfig  import EFBMuMuFex_DiMu_noOS
         from TrigBphysHypo.TrigEFBMuMuHypoConfig import EFBMuMuHypo_DiMu_noVtx
-        L2Fex  = L2BMuMuFex_DiMu_noOS() 
-        L2Hypo = L2BMuMuHypo_DiMu_noVtx()
         EFFex  = EFBMuMuFex_DiMu_noOS()
         EFHypo = EFBMuMuHypo_DiMu_noVtx()        
     elif ('bDimu' in topoAlgs) & ('noinvm' in topoAlgs) & ('novtx' in topoAlgs) & ('ss' in topoAlgs):
-        from TrigBphysHypo.TrigL2BMuMuFexConfig  import L2BMuMuFex_DiMu_noinvm_SS
-        from TrigBphysHypo.TrigL2BMuMuHypoConfig import L2BMuMuHypo_DiMu_noinvm_noVtx
         from TrigBphysHypo.TrigEFBMuMuFexConfig  import EFBMuMuFex_DiMu_noinvm_SS
         from TrigBphysHypo.TrigEFBMuMuHypoConfig import EFBMuMuHypo_DiMu_noinvm_noVtx
-        L2Fex  = L2BMuMuFex_DiMu_noinvm_SS() 
-        L2Hypo = L2BMuMuHypo_DiMu_noinvm_noVtx()
+        if not doL2MultiTrack :
+            from TrigBphysHypo.TrigL2BMuMuFexConfig  import L2BMuMuFex_DiMu_noinvm_SS
+            from TrigBphysHypo.TrigL2BMuMuHypoConfig import L2BMuMuHypo_DiMu_noinvm_noVtx
+            L2Fex  = L2BMuMuFex_DiMu_noinvm_SS() 
+            L2Hypo = L2BMuMuHypo_DiMu_noinvm_noVtx()
+        else :
+            L2Fex = TrigMultiTrkFex_DiMu_noVtx_noM_SS()
+            L2Hypo = EFMultiMuHypo_DiMu_noCut("L2MultiMuTrkHypo_noCut")
+            L2Hypo.bphysCollectionKey = "MultiTrkFex"
         EFFex  = EFBMuMuFex_DiMu_noinvm_SS()
-        EFHypo = EFBMuMuHypo_DiMu_noinvm_noVtx()	
+        EFHypo = EFBMuMuHypo_DiMu_noinvm_noVtx()    
     elif ('bJpsimumu' in topoAlgs) & ('noid' in topoAlgs):
         from TrigBphysHypo.TrigL2BMuMuFexConfig import L2BMuMuFex_noId
         from TrigBphysHypo.TrigL2BMuMuHypoConfig import L2BMuMuHypo_Jpsi_noId
@@ -476,8 +705,13 @@ def bMultipleOptionTopos(theChainDef, chainDict, inputTEsL2, inputTEsEF, topoSta
         from TrigBphysHypo.TrigL2BMuMuHypoConfig import L2BMuMuHypo_DiMu_passL2
         from TrigBphysHypo.TrigEFBMuMuFexConfig import EFBMuMuFex_DiMu
         from TrigBphysHypo.TrigEFBMuMuHypoConfig import EFBMuMuHypo_DiMu
-        L2Fex  = L2BMuMuFex_DiMu_passL2() 
-        L2Hypo = L2BMuMuHypo_DiMu_passL2()
+        if not doL2MultiTrack :
+            L2Fex  = L2BMuMuFex_DiMu_passL2() 
+            L2Hypo = L2BMuMuHypo_DiMu_passL2()
+        else :
+            L2Fex = TrigMultiTrkFex_DiMu_noCut()
+            L2Hypo = EFMultiMuHypo_DiMu_noCut("L2MultiMuTrkHypo_noCut")
+            L2Hypo.bphysCollectionKey = "MultiTrkFex"
         EFFex  = EFBMuMuFex_DiMu()
         EFHypo = EFBMuMuHypo_DiMu() 
         if ('nscan' in chainDict['chainName'] ): # do not do L2 at all; expect one TE
@@ -490,8 +724,13 @@ def bMultipleOptionTopos(theChainDef, chainDict, inputTEsL2, inputTEsEF, topoSta
         from TrigBphysHypo.TrigL2BMuMuHypoConfig import L2BMuMuHypo_Jpsi_passL2
         from TrigBphysHypo.TrigEFBMuMuFexConfig import EFBMuMuFex_Jpsi
         from TrigBphysHypo.TrigEFBMuMuHypoConfig import EFBMuMuHypo_Jpsi
-        L2Fex  = L2BMuMuFex_Jpsi_passL2()
-        L2Hypo = L2BMuMuHypo_Jpsi_passL2()
+        if not doL2MultiTrack :
+            L2Fex  = L2BMuMuFex_Jpsi_passL2()
+            L2Hypo = L2BMuMuHypo_Jpsi_passL2()
+        else :
+            L2Fex = TrigMultiTrkFex_DiMu_noCut()
+            L2Hypo = EFMultiMuHypo_DiMu_noCut("L2MultiMuTrkHypo_noCut")
+            L2Hypo.bphysCollectionKey = "MultiTrkFex"
         EFFex  = EFBMuMuFex_Jpsi()
         EFHypo = EFBMuMuHypo_Jpsi() 
         if ('nscan' in chainDict['chainName'] ): # do not do L2 at all; expect one TE
@@ -504,8 +743,13 @@ def bMultipleOptionTopos(theChainDef, chainDict, inputTEsL2, inputTEsEF, topoSta
         from TrigBphysHypo.TrigL2BMuMuHypoConfig import L2BMuMuHypo_DiMu_passL2
         from TrigBphysHypo.TrigEFBMuMuFexConfig import EFBMuMuFex_B
         from TrigBphysHypo.TrigEFBMuMuHypoConfig import EFBMuMuHypo_B
-        L2Fex  = L2BMuMuFex_DiMu_passL2()
-        L2Hypo = L2BMuMuHypo_DiMu_passL2()
+        if not doL2MultiTrack :
+            L2Fex  = L2BMuMuFex_DiMu_passL2()
+            L2Hypo = L2BMuMuHypo_DiMu_passL2()
+        else :
+            L2Fex = TrigMultiTrkFex_DiMu_noCut()
+            L2Hypo = EFMultiMuHypo_DiMu_noCut("L2MultiMuTrkHypo_noCut")
+            L2Hypo.bphysCollectionKey = "MultiTrkFex"
         EFFex  = EFBMuMuFex_B()
         EFHypo = EFBMuMuHypo_B() 
     elif ('bDimu' in topoAlgs) & ('noEFbph' in topoAlgs):
@@ -513,8 +757,14 @@ def bMultipleOptionTopos(theChainDef, chainDict, inputTEsL2, inputTEsEF, topoSta
         from TrigBphysHypo.TrigL2BMuMuHypoConfig import L2BMuMuHypo_DiMu
         from TrigBphysHypo.TrigEFBMuMuFexConfig import EFBMuMuFex_passEF
         from TrigBphysHypo.TrigEFBMuMuHypoConfig import EFBMuMuHypo_passEF
-        L2Fex  = L2BMuMuFex_DiMu() 
-        L2Hypo = L2BMuMuHypo_DiMu()
+        if not doL2MultiTrack :
+            L2Fex  = L2BMuMuFex_DiMu() 
+            L2Hypo = L2BMuMuHypo_DiMu()
+        else :
+            L2Fex = TrigMultiTrkFex_DiMu()
+            L2Hypo = EFMultiMuHypo_DiMu("L2MultiMuTrkHypo_DiMu")
+            L2Hypo.bphysCollectionKey = "MultiTrkFex"
+
         EFFex  = EFBMuMuFex_passEF()
         EFHypo = EFBMuMuHypo_passEF() 
     elif ('bJpsimumu' in topoAlgs) & ('noEFbph' in topoAlgs):
@@ -522,8 +772,13 @@ def bMultipleOptionTopos(theChainDef, chainDict, inputTEsL2, inputTEsEF, topoSta
         from TrigBphysHypo.TrigL2BMuMuHypoConfig import L2BMuMuHypo_Jpsi
         from TrigBphysHypo.TrigEFBMuMuFexConfig import EFBMuMuFex_passEF
         from TrigBphysHypo.TrigEFBMuMuHypoConfig import EFBMuMuHypo_passEF
-        L2Fex  = L2BMuMuFex_Jpsi()
-        L2Hypo = L2BMuMuHypo_Jpsi()
+        if not doL2MultiTrack :
+            L2Fex  = L2BMuMuFex_Jpsi()
+            L2Hypo = L2BMuMuHypo_Jpsi()
+        else :
+            L2Fex = TrigMultiTrkFex_DiMu()
+            L2Hypo = EFMultiMuHypo_Jpsi("L2MultiMuTrkHypo_Jpsi")  
+            L2Hypo.bphysCollectionKey = "MultiTrkFex"
         EFFex  = EFBMuMuFex_passEF()
         EFHypo = EFBMuMuHypo_passEF() 
     # Tight Chi2 variants
@@ -532,8 +787,13 @@ def bMultipleOptionTopos(theChainDef, chainDict, inputTEsL2, inputTEsEF, topoSta
         from TrigBphysHypo.TrigL2BMuMuHypoConfig import L2BMuMuHypo_Jpsi
         from TrigBphysHypo.TrigEFBMuMuFexConfig import EFBMuMuFex_Jpsi
         from TrigBphysHypo.TrigEFBMuMuHypoConfig import EFBMuMuHypo_Jpsi_tightChi2
-        L2Fex  = L2BMuMuFex_Jpsi()
-        L2Hypo = L2BMuMuHypo_Jpsi()
+        if not doL2MultiTrack :
+            L2Fex  = L2BMuMuFex_Jpsi()
+            L2Hypo = L2BMuMuHypo_Jpsi()
+        else :
+            L2Fex = TrigMultiTrkFex_DiMu()
+            L2Hypo = EFMultiMuHypo_Jpsi("L2MultiMuTrkHypo_Jpsi")  
+            L2Hypo.bphysCollectionKey = "MultiTrkFex"
         EFFex  = EFBMuMuFex_Jpsi()
         EFHypo = EFBMuMuHypo_Jpsi_tightChi2() 
     elif ('bDimu' in topoAlgs) & ('tightChi2' in topoAlgs):
@@ -541,8 +801,14 @@ def bMultipleOptionTopos(theChainDef, chainDict, inputTEsL2, inputTEsEF, topoSta
         from TrigBphysHypo.TrigL2BMuMuHypoConfig import L2BMuMuHypo_DiMu
         from TrigBphysHypo.TrigEFBMuMuFexConfig import EFBMuMuFex_DiMu
         from TrigBphysHypo.TrigEFBMuMuHypoConfig import EFBMuMuHypo_DiMu_tightChi2
-        L2Fex  = L2BMuMuFex_DiMu()
-        L2Hypo = L2BMuMuHypo_DiMu()
+        if not doL2MultiTrack :
+            L2Fex  = L2BMuMuFex_DiMu()
+            L2Hypo = L2BMuMuHypo_DiMu()
+        else :
+            L2Fex = TrigMultiTrkFex_DiMu()
+            L2Hypo = EFMultiMuHypo_DiMu("L2MultiMuTrkHypo_DiMu")  
+            L2Hypo.bphysCollectionKey = "MultiTrkFex"
+
         EFFex  = EFBMuMuFex_DiMu()
         EFHypo = EFBMuMuHypo_DiMu_tightChi2() 
     elif ('bBmumu' in topoAlgs) & ('tightChi2' in topoAlgs):
@@ -550,8 +816,13 @@ def bMultipleOptionTopos(theChainDef, chainDict, inputTEsL2, inputTEsEF, topoSta
         from TrigBphysHypo.TrigL2BMuMuHypoConfig import L2BMuMuHypo_B
         from TrigBphysHypo.TrigEFBMuMuFexConfig import EFBMuMuFex_B
         from TrigBphysHypo.TrigEFBMuMuHypoConfig import EFBMuMuHypo_B_tightChi2
-        L2Fex  = L2BMuMuFex_B()
-        L2Hypo = L2BMuMuHypo_B()
+        if not doL2MultiTrack :
+            L2Fex  = L2BMuMuFex_B()
+            L2Hypo = L2BMuMuHypo_B()
+        else :
+            L2Fex = TrigMultiTrkFex_DiMu()
+            L2Hypo = EFMultiMuHypo_BMeson("L2MultiMuTrkHypo_BMeson")  
+            L2Hypo.bphysCollectionKey = "MultiTrkFex"
         EFFex  = EFBMuMuFex_B()
         EFHypo = EFBMuMuHypo_B_tightChi2() 
     elif ('bUpsimumu' in topoAlgs) & ('tightChi2' in topoAlgs):
@@ -559,8 +830,14 @@ def bMultipleOptionTopos(theChainDef, chainDict, inputTEsL2, inputTEsEF, topoSta
         from TrigBphysHypo.TrigL2BMuMuHypoConfig import L2BMuMuHypo_Upsi
         from TrigBphysHypo.TrigEFBMuMuFexConfig import EFBMuMuFex_Upsi
         from TrigBphysHypo.TrigEFBMuMuHypoConfig import EFBMuMuHypo_Upsi_tightChi2
-        L2Fex  = L2BMuMuFex_Upsi()
-        L2Hypo = L2BMuMuHypo_Upsi()
+        if not doL2MultiTrack :
+            L2Fex  = L2BMuMuFex_Upsi()
+            L2Hypo = L2BMuMuHypo_Upsi()
+        else :
+            L2Fex = TrigMultiTrkFex_DiMu()
+            L2Hypo = EFMultiMuHypo_Upsi("L2MultiMuTrkHypo_Upsi")  
+            L2Hypo.bphysCollectionKey = "MultiTrkFex"
+
         EFFex  = EFBMuMuFex_Upsi()
         EFHypo = EFBMuMuHypo_Upsi_tightChi2() 
     # Lxy > 0 variants
@@ -569,8 +846,13 @@ def bMultipleOptionTopos(theChainDef, chainDict, inputTEsL2, inputTEsEF, topoSta
         from TrigBphysHypo.TrigL2BMuMuHypoConfig import L2BMuMuHypo_Jpsi
         from TrigBphysHypo.TrigEFBMuMuFexConfig import EFBMuMuFex_Jpsi
         from TrigBphysHypo.TrigEFBMuMuHypoConfig import EFBMuMuHypo_Jpsi_Lxy0
-        L2Fex  = L2BMuMuFex_Jpsi()
-        L2Hypo = L2BMuMuHypo_Jpsi()
+        if not doL2MultiTrack :
+            L2Fex  = L2BMuMuFex_Jpsi()
+            L2Hypo = L2BMuMuHypo_Jpsi()
+        else :
+            L2Fex = TrigMultiTrkFex_DiMu()
+            L2Hypo = EFMultiMuHypo_Jpsi("L2MultiMuTrkHypo_Jpsi")  
+            L2Hypo.bphysCollectionKey = "MultiTrkFex"
         EFFex  = EFBMuMuFex_Jpsi()
         EFHypo = EFBMuMuHypo_Jpsi_Lxy0() 
     elif ('bDimu' in topoAlgs) & ('Lxy0' in topoAlgs):
@@ -578,8 +860,13 @@ def bMultipleOptionTopos(theChainDef, chainDict, inputTEsL2, inputTEsEF, topoSta
         from TrigBphysHypo.TrigL2BMuMuHypoConfig import L2BMuMuHypo_DiMu
         from TrigBphysHypo.TrigEFBMuMuFexConfig import EFBMuMuFex_DiMu
         from TrigBphysHypo.TrigEFBMuMuHypoConfig import EFBMuMuHypo_DiMu_Lxy0
-        L2Fex  = L2BMuMuFex_DiMu()
-        L2Hypo = L2BMuMuHypo_DiMu()
+        if not doL2MultiTrack :
+            L2Fex  = L2BMuMuFex_DiMu()
+            L2Hypo = L2BMuMuHypo_DiMu()
+        else :
+            L2Fex = TrigMultiTrkFex_DiMu()
+            L2Hypo = EFMultiMuHypo_DiMu("L2MultiMuTrkHypo_DiMu") 
+            L2Hypo.bphysCollectionKey = "MultiTrkFex"
         EFFex  = EFBMuMuFex_DiMu()
         EFHypo = EFBMuMuHypo_DiMu_Lxy0() 
     elif ('bBmumu' in topoAlgs) & ('Lxy0' in topoAlgs):
@@ -587,8 +874,13 @@ def bMultipleOptionTopos(theChainDef, chainDict, inputTEsL2, inputTEsEF, topoSta
         from TrigBphysHypo.TrigL2BMuMuHypoConfig import L2BMuMuHypo_B
         from TrigBphysHypo.TrigEFBMuMuFexConfig import EFBMuMuFex_B
         from TrigBphysHypo.TrigEFBMuMuHypoConfig import EFBMuMuHypo_B_Lxy0
-        L2Fex  = L2BMuMuFex_B()
-        L2Hypo = L2BMuMuHypo_B()
+        if not doL2MultiTrack :
+            L2Fex  = L2BMuMuFex_B()
+            L2Hypo = L2BMuMuHypo_B()
+        else :
+            L2Fex = TrigMultiTrkFex_DiMu()
+            L2Hypo = EFMultiMuHypo_BMeson("L2MultiMuTrkHypo_BMeson")  
+            L2Hypo.bphysCollectionKey = "MultiTrkFex"
         EFFex  = EFBMuMuFex_B()
         EFHypo = EFBMuMuHypo_B_Lxy0() 
     # legacy vertexing
@@ -615,6 +907,58 @@ def bMultipleOptionTopos(theChainDef, chainDict, inputTEsL2, inputTEsEF, topoSta
 
 
 ###################################################################################
+###################################################################################
+def bMuTrackPEB(theChainDef,chainDict, inputTEsL2, inputTEsEF, topoStartFrom):
+
+    EFChainName = "EF_" + chainDict['chainName']
+    topoAlgs = chainDict["topo"]
+
+    mtopo = topoAlgs[0]
+    TEname = findL2teBaseName(chainDict['chainName'],topoAlgs)
+    L2TEname = "L2_" + TEname+'_'+mtopo+'_'+chainDict['L1item']
+
+    #--- 1: L2 first add large cone before duing superEF
+    #[trkfast, trkprec] = TrigInDetSequence("Bphysics", "bphysics", "IDTrig").getSequence()
+    [trkfast, trkprec] = TrigInDetSequence("BphysHighPt", "bphysHighPt", "IDTrig").getSequence()
+    L2TEcount = 0; L2outTEsfast = [];  L2outTEsprec = [];
+    for L2inputTE in inputTEsL2:
+        L2TEcount = L2TEcount + 1
+        L2outputTEfast = L2inputTE+'_idfast_'+str(L2TEcount)
+        L2outTEsfast.append(L2outputTEfast)
+        theChainDef.addSequence(trkfast,L2inputTE, L2outputTEfast)
+        if not "L2Trk2" in chainDict['chainName'] :
+            L2outputTEprec = L2inputTE+'_idprec_'+str(L2TEcount)
+            L2outTEsprec.append(L2outputTEprec)
+            theChainDef.addSequence(trkprec,L2outputTEfast, L2outputTEprec)
+
+    theChainDef.addSignatureL2( L2outTEsfast)
+    theChainDef.addSignatureL2( L2outTEsprec)
+    theChainDef.addSequence([L2outTEsfast,L2outTEsprec],L2outputTEprec, L2TEname+"Trk")
+
+
+    #--- 2: then add L2 multi trk fex+hypo for Jpsi
+        
+    from TrigBphysHypo.TrigMultiTrkFexConfig import TrigMultiTrkFex_Jpsi
+    from TrigBphysHypo.TrigEFMultiMuHypoConfig import EFMultiMuHypo_Jpsi
+    L2Fex = TrigMultiTrkFex_Jpsi()
+    #L2Fex.trackCollectionKey = "InDetTrigTrackingxAODCnv_Bphysics_IDTrig"
+    L2Hypo = EFMultiMuHypo_Jpsi("L2MultiMuTrkHypo_Jpsi")
+    L2Hypo.bphysCollectionKey = "MultiTrkFex"
+    theChainDef.addSequence([L2Fex, L2Hypo], L2outTEsprec , L2TEname+"MultiTrk")
+    theChainDef.addSignatureL2([L2TEname+"MultiTrk"])
+
+    
+    #---- 3 : last step - setup PEB
+    from TrigDetCalib.TrigDetCalibConfig import TrigCheckForMuons_peb075
+    bphysROBWriter = TrigCheckForMuons_peb075("bphysROBWriter_peb075")
+
+    EFTEname = "EF_" + chainDict['chainName']+"_1"
+    inputTEsEF = theChainDef.signatureList[-1]['listOfTriggerElements']
+    theChainDef.addSequence([bphysROBWriter],inputTEsEF, EFTEname)
+    theChainDef.addSignature(theChainDef.signatureList[-1]['signature_counter']+1, [EFTEname])
+
+    return theChainDef
+
 ###################################################################################
 def bMuTrack(theChainDef,chainDict, inputTEsL2, inputTEsEF, topoStartFrom):
 
@@ -626,7 +970,7 @@ def bMuTrack(theChainDef,chainDict, inputTEsL2, inputTEsEF, topoStartFrom):
 
     if ('bJpsi' in topoAlgs) & ('Trkloose' in topoAlgs):
         from TrigBphysHypo.TrigEFTrkMassFexConfig  import EFTrkMassFex_Jpsimumu_loose
-        from TrigBphysHypo.TrigEFTrkMassHypoConfig import EFTrkMassHypo_Jpsimumu_loose        
+        from TrigBphysHypo.TrigEFTrkMassHypoConfig import EFTrkMassHypo_Jpsimumu_loose
         EFFex  = EFTrkMassFex_Jpsimumu_loose()
         EFHypo = EFTrkMassHypo_Jpsimumu_loose()
 
@@ -639,31 +983,30 @@ def bMuTrack(theChainDef,chainDict, inputTEsL2, inputTEsEF, topoStartFrom):
     #        L2TEcount = L2TEcount+1
     #        L2outputTE = L2inputTE+'_idl2fast_'+str(L2TEcount)
     #        L2outTEs.append(L2outputTE)
-    #        #theChainDef.addSequence([theTrigIdscan],L2inputTE, L2outputTE)            
-    #        theChainDef.addSequence(trkfast,L2inputTE, L2outputTE)            
+    #        #theChainDef.addSequence([theTrigIdscan],L2inputTE, L2outputTE)
     #    theChainDef.addSignatureL2(L2outTEs)
-    #        
+    #
     #    theChainDef.addSequence( [L2Fex,  L2Hypo], L2outTEs, L2ChainName)
     ##    theChainDef.addSequence( [L2Fex,  L2Hypo], inputTEsL2, L2ChainName)
     #    theChainDef.addSignatureL2([L2ChainName])
     #
     #
     #
-    #    EFTEcount = 0; EFoutTEsprec = []; 
+    #    EFTEcount = 0; EFoutTEsprec = [];
     #    for EFinputTE in inputTEsEF:
-    #        EFTEcount = EFTEcount + 1        
+    #        EFTEcount = EFTEcount + 1
     #        EFoutputTEprec = EFinputTE+'_idefprec_'+str(EFTEcount)
     #        EFoutTEsprec.append(EFoutputTEprec)
     #        theChainDef.addSequence(trkprec,EFinputTE, EFoutputTEprec)
     #    theChainDef.addSignature(theChainDef.signatureList[-1]['signature_counter']+1, EFoutTEsprec)
     #
     #    theChainDef.addSequence([EFFex, EFHypo],EFoutTEsprec,EFChainName)
-    #    theChainDef.addSignature(theChainDef.signatureList[-1]['signature_counter']+1, [EFChainName])       
+    #    theChainDef.addSignature(theChainDef.signatureList[-1]['signature_counter']+1, [EFChainName])
 
 
     # Sequence where only the EF mu+track stage is run. FTF+prec tracking run first
     #------- EF Sequences -------
-    EFTEcount = 0; EFoutTEsfast = []; 
+    EFTEcount = 0; EFoutTEsfast = [];
     for EFinputTE in inputTEsEF:
         EFTEcount = EFTEcount + 1
         EFoutputTEfast = EFinputTE+'_idfast_'+str(EFTEcount)
@@ -671,10 +1014,10 @@ def bMuTrack(theChainDef,chainDict, inputTEsL2, inputTEsEF, topoStartFrom):
         theChainDef.addSequence(trkfast,EFinputTE, EFoutputTEfast)
 
     theChainDef.addSignature(theChainDef.signatureList[-1]['signature_counter']+1, EFoutTEsfast)
-    
-    EFTEcount = 0; EFoutTEsprec = []; 
+
+    EFTEcount = 0; EFoutTEsprec = [];
     for EFinputTE in inputTEsEF:
-        EFTEcount = EFTEcount + 1        
+        EFTEcount = EFTEcount + 1
         EFinputTEprec  = EFinputTE+'_idfast_'+str(EFTEcount)
         EFoutputTEprec = EFinputTE+'_idprec_'+str(EFTEcount)
         EFoutTEsprec.append(EFoutputTEprec)
@@ -691,7 +1034,7 @@ def bMuTrack(theChainDef,chainDict, inputTEsL2, inputTEsEF, topoStartFrom):
 
 ###################################################################################
 ###################################################################################
-def bBmumuxTopos(theChainDef,chainDict, inputTEsL2, inputTEsEF, topoStartFrom):
+def bBmumuxTopos(theChainDef,chainDict, inputTEsL2, inputTEsEF, topoStartFrom, doL2MultiTrack = False):
     L2ChainName = "L2_" + chainDict['chainName']
     EFChainName = "EF_" + chainDict['chainName']
     topoAlgs = chainDict["topo"]
@@ -708,6 +1051,8 @@ def bBmumuxTopos(theChainDef,chainDict, inputTEsL2, inputTEsEF, topoStartFrom):
         L2TEname = "L2_" + TEname+myTopoString+'_tsf_'+chainDict['L1item']
         topo2StartFrom = L2TEname
 
+    from TrigBphysHypo.TrigMultiTrkFexConfig import TrigMultiTrkFex_DiMu,TrigMultiTrkFex_DiMu_noCut,TrigMultiTrkFex_DiMu_noVtx_noOS,TrigMultiTrkFex_DiMu_noVtx_noM_SS 
+    from TrigBphysHypo.TrigEFMultiMuHypoConfig import EFMultiMuHypo_DiMu_noCut,EFMultiMuHypo_DiMu_noVtx,EFMultiMuHypo_DiMu,EFMultiMuHypo_BMeson,EFMultiMuHypo_Jpsi,EFMultiMuHypo_Upsi,EFMultiMuHypo_2700, EFMultiMuHypo_Bmumux
     # replace L2 Te (and EF tsf) with bBmumuxv2 naming
     # same underlying sequence is used
     # Warning if ever switch to v3 implementation -- this should be changed / tested 
@@ -742,55 +1087,40 @@ def bBmumuxTopos(theChainDef,chainDict, inputTEsL2, inputTEsEF, topoStartFrom):
 #    from InDetTrigRecExample.EFInDetConfig import *
 #    theTrigEFIDInsideOut = TrigEFIDInsideOut_Bphysics().getSequence()
 
-    #JWW: Remove Bmumux L2 Fex and Hypo. Use a simple BMuMu Fex and Hypo instead
-    #from TrigBphysHypo.TrigL2BMuMuXHypoConfig import L2BMuMuXHypo_1
-    #L2Hypo = L2BMuMuXHypo_1()
 
     if 'BcmumuDsloose' in topoAlgs:
-        #from TrigBphysHypo.TrigL2BMuMuXFexConfig import L2BMuMuXFex_BcMuMuDs
         from TrigBphysHypo.TrigEFBMuMuXFexConfig import EFBMuMuXFex_BcMuMuDs
         from TrigBphysHypo.TrigEFBMuMuXHypoConfig import EFBMuMuXHypo_BcMuMuDs
-        #L2Fex = L2BMuMuXFex_BcMuMuDs()
         EFFex = EFBMuMuXFex_BcMuMuDs()
         EFHypo = EFBMuMuXHypo_BcMuMuDs()
         
     elif 'LbmumuLambda' in topoAlgs:
-        #from TrigBphysHypo.TrigL2BMuMuXFexConfig import L2BMuMuXFex_BcMuMuDs
         from TrigBphysHypo.TrigEFBMuMuXFexConfig import EFBMuMuXFex_LbMuMuLambda
         from TrigBphysHypo.TrigEFBMuMuXHypoConfig import EFBMuMuXHypo_LbMuMuLambda
-        #L2Fex = L2BMuMuXFex_BcMuMuDs()
         EFFex = EFBMuMuXFex_LbMuMuLambda()
         EFHypo = EFBMuMuXHypo_LbMuMuLambda()
         
     elif 'BpmumuKp' in topoAlgs:
-        #from TrigBphysHypo.TrigL2BMuMuXFexConfig import L2BMuMuXFex_BplusMuMuKplus
         from TrigBphysHypo.TrigEFBMuMuXFexConfig import EFBMuMuXFex_BplusMuMuKplus
         from TrigBphysHypo.TrigEFBMuMuXHypoConfig import EFBMuMuXHypo_BplusMuMuKplus
-        #L2Fex = L2BMuMuXFex_BplusMuMuKplus()
         EFFex = EFBMuMuXFex_BplusMuMuKplus()
         EFHypo = EFBMuMuXHypo_BplusMuMuKplus()
         
     elif 'BsmumuPhi' in topoAlgs:
-        #from TrigBphysHypo.TrigL2BMuMuXFexConfig import L2BMuMuXFex_BplusMuMuKplus
         from TrigBphysHypo.TrigEFBMuMuXFexConfig import EFBMuMuXFex_BsMuMuPhi
         from TrigBphysHypo.TrigEFBMuMuXHypoConfig import EFBMuMuXHypo_BsMuMuPhi
-        #L2Fex = L2BMuMuXFex_BplusMuMuKplus()
         EFFex = EFBMuMuXFex_BsMuMuPhi()
         EFHypo = EFBMuMuXHypo_BsMuMuPhi()
         
     elif 'BsJpsiPhi' in topoAlgs:
-        #from TrigBphysHypo.TrigL2BMuMuXFexConfig import L2BMuMuXFex_BplusMuMuKplus
         from TrigBphysHypo.TrigEFBMuMuXFexConfig import EFBMuMuXFex_BsJpsiPhi
         from TrigBphysHypo.TrigEFBMuMuXHypoConfig import EFBMuMuXHypo_BsJpsiPhi
-        #L2Fex = L2BMuMuXFex_BplusMuMuKplus()
         EFFex = EFBMuMuXFex_BsJpsiPhi()
         EFHypo = EFBMuMuXHypo_BsJpsiPhi()
 
     elif 'Taumumux' in topoAlgs:
-        #from TrigBphysHypo.TrigL2BMuMuXFexConfig import L2BMuMuXFex_TauMuMuX
         from TrigBphysHypo.TrigEFBMuMuXFexConfig import EFBMuMuXFex_TauMuMuX
         from TrigBphysHypo.TrigEFBMuMuXHypoConfig import EFBMuMuXHypo_TauMuMuX
-        #L2Fex = L2BMuMuXFex_TauMuMuX()
         EFFex = EFBMuMuXFex_TauMuMuX()
         EFHypo = EFBMuMuXHypo_TauMuMuX()
 
@@ -808,12 +1138,8 @@ def bBmumuxTopos(theChainDef,chainDict, inputTEsL2, inputTEsEF, topoStartFrom):
            EFFex  =  EFBMuMuXFex_FTK()
            EFHypo = EFBMuMuXHypo_FTK()
         else:
-           #from TrigBphysHypo.TrigL2BMuMuFexConfig import L2BMuMuFex_1
-           #from TrigBphysHypo.TrigL2BMuMuHypoConfig import L2BMuMuHypo_1
            from TrigBphysHypo.TrigEFBMuMuXFexConfig import EFBMuMuXFex_1
            from TrigBphysHypo.TrigEFBMuMuXHypoConfig import EFBMuMuXHypo_1  
-           #L2Fex  = L2BMuMuFex_1()
-           #L2Hypo = L2BMuMuHypo_1()  
            EFFex  =  EFBMuMuXFex_1()
            EFHypo = EFBMuMuXHypo_1()
            # legacy vertexing
@@ -822,41 +1148,54 @@ def bBmumuxTopos(theChainDef,chainDict, inputTEsL2, inputTEsEF, topoStartFrom):
                EFFex  =  EFBMuMuXFex_1_legacyVtx()
         
     elif 'bBmumuxv3' in topoAlgs:
-        print 'MOOOO in bBmumuxv3'
+#        print 'MOOOO in bBmumuxv3'
         from TrigBphysHypo.TrigL2BMuMuXHypoConfig import L2BMuMuXHypo_EF
         from TrigBphysHypo.TrigL2BMuMuXFexConfig import L2BMuMuXFex_EF
         EFFex  =  L2BMuMuXFex_EF()
         EFHypo = L2BMuMuXHypo_EF()
         
     else:
-        #from TrigBphysHypo.TrigL2BMuMuXFexConfig import L2BMuMuXFex_1
         from TrigBphysHypo.TrigEFBMuMuFexConfig import EFBMuMuFex_Jpsi
         from TrigBphysHypo.TrigEFBMuMuHypoConfig import EFBMuMuHypo_Jpsi
-        #L2Fex = L2BMuMuXFex_1()
         EFFex = EFBMuMuFex_Jpsi()
         EFHypo = EFBMuMuHypo_Jpsi()
        
 
+    from TrigBphysHypo.TrigEFMultiMuHypoConfig import EFMultiMuHypo_Bmumux
     # Use simple di-muon fex/hypo for L2
     # Note - may need to change oppsign and vtx requirements
-    if 'bBmumuxv3' in topoAlgs:
-        print 'MOOOO2 in bBmumuxv3'
+    # noL2 option to skip dimuon selection at L2
+
+    if 'noL2' in topoAlgs:
+        if doL2MultiTrack :
+            L2Fex = TrigMultiTrkFex_DiMu_noCut()
+            L2Hypo = EFMultiMuHypo_DiMu_noCut("L2MultiMuTrkHypo_DiMu_noCut")  
+            L2Hypo.bphysCollectionKey = "MultiTrkFex"
+        else :
+            from TrigBphysHypo.TrigL2BMuMuFexConfig import L2BMuMuFex_DiMu_passL2
+            from TrigBphysHypo.TrigL2BMuMuHypoConfig import L2BMuMuHypo_DiMu_passL2
+            L2Fex  = L2BMuMuFex_DiMu_passL2()
+            L2Hypo = L2BMuMuHypo_DiMu_passL2()
+    elif 'bBmumuxv3' in topoAlgs:
+#        print 'MOOOO2 in bBmumuxv3'
         from TrigBphysHypo.TrigL2BMuMuXHypoConfig import L2BMuMuXHypo_1
         from TrigBphysHypo.TrigL2BMuMuXFexConfig import L2BMuMuXFex_1
         L2Fex = L2BMuMuXFex_1()
         L2Hypo = L2BMuMuXHypo_1()
-    else:
-        from TrigBphysHypo.TrigL2BMuMuFexConfig import L2BMuMuFex_1
-        from TrigBphysHypo.TrigL2BMuMuHypoConfig import L2BMuMuHypo_1
-        L2Fex  = L2BMuMuFex_1()
-        L2Hypo = L2BMuMuHypo_1()
+
+    else :
+        if  doL2MultiTrack :
+            from TrigBphysHypo.TrigMultiTrkFexConfig import TrigMultiTrkFex_DiMu
+            from TrigBphysHypo.TrigEFMultiMuHypoConfig import EFMultiMuHypo_Bmumux
+            L2Fex = TrigMultiTrkFex_DiMu()
+            L2Hypo = EFMultiMuHypo_Bmumux("EFMultiMuHypo_Bmumux")  
+            L2Hypo.bphysCollectionKey = "MultiTrkFex"
+        else :
+            from TrigBphysHypo.TrigL2BMuMuFexConfig import L2BMuMuFex_1
+            from TrigBphysHypo.TrigL2BMuMuHypoConfig import L2BMuMuHypo_1
+            L2Fex  = L2BMuMuFex_1()
+            L2Hypo = L2BMuMuHypo_1()
         
-    # noL2 option to skip dimuon selection at L2
-    if 'noL2' in topoAlgs:
-        from TrigBphysHypo.TrigL2BMuMuFexConfig import L2BMuMuFex_DiMu_passL2
-        from TrigBphysHypo.TrigL2BMuMuHypoConfig import L2BMuMuHypo_DiMu_passL2
-        L2Fex  = L2BMuMuFex_DiMu_passL2()
-        L2Hypo = L2BMuMuHypo_DiMu_passL2()
 
     if 'bBmumuxv3' in topoAlgs:
         L2TEcount = 0; L2outTEs = []
diff --git a/Trigger/TriggerCommon/TriggerMenu/python/menu/MC_pp_v7.py b/Trigger/TriggerCommon/TriggerMenu/python/menu/MC_pp_v7.py
index 7584b1c9bb34c687191a40a9f4e7d5a046eb9bf7..fe4c89e40ca188659cb28c7f744b75b195c9842d 100644
--- a/Trigger/TriggerCommon/TriggerMenu/python/menu/MC_pp_v7.py
+++ b/Trigger/TriggerCommon/TriggerMenu/python/menu/MC_pp_v7.py
@@ -1298,6 +1298,17 @@ def setupMenu():
         ['2mu4_wOvlpRm_bBmumuxv2',                             'L1_2MU4',                         [], [PhysicsStream], ['RATE:Bphysics','BW:Bphys'], -1],
         ['3mu6_wOvlpRm_bDimu',                   'L1_3MU6', [], [PhysicsStream], ['RATE:Bphysics','BW:Bphys'], -1],
         ['2mu4_wOvlpRm_bDimu_noinvm_novtx_ss',    'L1_2MU4',     [], [PhysicsStream], ['RATE:Bphysics','BW:Bphys'], -1],    
+
+        # chains with smart overlap removal , based on EF muons
+        ['mu4_bNocut',                    'L1_MU4',            [], [PhysicsStream], ['RATE:SingleMuon', 'BW:Muon'], -1],
+        ['2mu4_bNocut',                    'L1_2MU4',  [], [PhysicsStream], ['RATE:MultiMuon', 'BW:Muon'], -1],
+        ['3mu4_bNocut',          'L1_3MU4',           [], [PhysicsStream], ['RATE:MultiMuon', 'BW:Muon'], -1],
+        ['3mu4_mu2noL1_bNocut', 'L1_3MU4', ['L1_3MU4',''], [PhysicsStream], ['RATE:MultiMuon','BW:Muon'], -1,['serial',-1,['3mu4','mu2noL1']]],
+        ['2mu4_mu3_mu2noL1_bNocut_L13MU4', 'L1_3MU4', ['L1_2MU4','L1_MU4',''], [PhysicsStream], ['RATE:MultiMuon','BW:Muon'], -1,['serial',-1,['2mu4','mu3','mu2noL1']]],
+        ['3mu3_mu3noL1_bNocut_L13MU4', 'L1_3MU4', ['L1_3MU4',''], [PhysicsStream], ['RATE:MultiMuon','BW:Muon'], -1,['serial',-1,['3mu3','mu3noL1']]],
+        ['3mu4_mu4noL1_bNocut', 'L1_3MU4', ['L1_3MU4',''], [PhysicsStream], ['RATE:MultiMuon','BW:Muon'], -1,['serial',-1,['3mu4','mu4noL1']]],
+        ['4mu4_bNocut', 'L1_4MU4', ['L1_4MU4',''], [PhysicsStream], ['RATE:MultiMuon','BW:Muon'], -1,['serial',-1,['4mu4','']]],
+
         
         # chains with EF B-physics selection skipped
         ['2mu4_bJpsimumu_noEFbph',                    'L1_2MU4', [], [PhysicsStream], ['RATE:Bphysics','BW:Bphys'], -1],
@@ -1473,8 +1484,8 @@ def setupMenu():
         ['mu6_mu4_bJpsimumu_noL2',                 'L1_MU6_2MU4', ['L1_MU6','L1_MU4'], [PhysicsStream], ['RATE:Bphysics','BW:Bphys'], -1],
         ['2mu6_bDimu_noL2',                    'L1_2MU6', [], [PhysicsStream], ['RATE:Bphysics','BW:Bphys'], -1],
         ['2mu6_bJpsimumu_noL2',                    'L1_2MU6', [], [PhysicsStream], ['RATE:Bphysics','BW:Bphys'], -1],
-        ## moved to phys (ATR-14352) ['mu11_nomucomb_2mu4noL1_nscan03_L1LFV-MU_bTau', 'L1_LFV-MU', ['L1_MU10','L2_mu11_nomucomb'], [PhysicsStream], ['RATE:Bphysics','BW:Bphys'], -1,['serial',-1,['mu11_nomucomb','2mu4noL1_nscan03']]],
-        ## moved to phys (ATR-14352) ['mu11_nomucomb_mu6noL1_nscan03_L1LFV-MU_bTau', 'L1_LFV-MU', ['L1_MU10','L2_mu6_nomucomb'], [PhysicsStream], ['RATE:Bphysics','BW:Bphys'], -1,['serial',-1,['mu11_nomucomb','mu6noL1_nscan03']]],
+        ## moved to phys (ATR-14352) ['mu11_2mu4noL1_nscan03_L1LFV-MU_bTau', 'L1_LFV-MU', ['L1_MU10','L2_mu11'], [PhysicsStream], ['RATE:Bphysics','BW:Bphys'], -1,['serial',-1,['mu11','2mu4noL1_nscan03']]],
+        ## moved to phys (ATR-14352) ['mu11_mu6noL1_nscan03_L1LFV-MU_bTau', 'L1_LFV-MU', ['L1_MU10','L2_mu6'], [PhysicsStream], ['RATE:Bphysics','BW:Bphys'], -1,['serial',-1,['mu11','mu6noL1_nscan03']]],
  
 # L1 topo # Simple OneBarrel and BarrelOnly #
 
@@ -1571,6 +1582,7 @@ def setupMenu():
         ['2mu6_bBmumux_BcmumuDsloose_noL2_L12MU6-BO',  'L1_2MU6-BO',     ['L1_2MU6'], [PhysicsStream], ['RATE:Bphysics','BW:Bphys'], -1, False],
 
 
+        
 
 #
 # L1Topo nominal
@@ -1654,9 +1666,9 @@ def setupMenu():
        ['mu6_mu4_bDimu_L1BPH-2M9-MU6MU4_BPH-0DR15-MU6MU4','L1_BPH-2M9-MU6MU4_BPH-0DR15-MU6MU4', ['L1_MU6','L1_MU4'], [PhysicsStream], ['RATE:Bphysics','BW:Bphys'], -1, False],
        ['mu6_mu4_bDimu_novtx_noos_L1BPH-2M9-MU6MU4_BPH-0DR15-MU6MU4','L1_BPH-2M9-MU6MU4_BPH-0DR15-MU6MU4', ['L1_MU6','L1_MU4'], [PhysicsStream], ['RATE:Bphysics','BW:Bphys'], -1, False],
        
-       ['2mu6_nomucomb_L1LFV-MU6_bTau_delayed',  'L1_LFV-MU6', ['L1_2MU6'], [PhysicsStream], ['RATE:Bphysics','BW:Bphys'], -1, False],
-       ['2mu6noL1_nomucomb_nscan03_L1LFV-MU6_bTau_delayed',  'L1_LFV-MU6', ['L1_2MU6'], [PhysicsStream], ['RATE:Bphysics','BW:Bphys'], -1, False],
-       ['2mu6_nomucomb_L1LFV-MU6_bPhi',  'L1_LFV-MU6', ['L1_2MU6'], [PhysicsStream], ['RATE:Bphysics','BW:Bphys'], -1, False],
+       ['2mu6_bTau_L1LFV-MU6_delayed',  'L1_LFV-MU6', ['L1_2MU6'], [PhysicsStream], ['RATE:Bphysics','BW:Bphys'], -1, False],
+       ['2mu6noL1_bTau_L1LFV-MU6_delayed',  'L1_LFV-MU6', ['L1_2MU6'], [PhysicsStream], ['RATE:Bphysics','BW:Bphys'], -1, False],
+       ['2mu6_bPhi_L1LFV-MU6',  'L1_LFV-MU6', ['L1_2MU6'], [PhysicsStream], ['RATE:Bphysics','BW:Bphys'], -1, False],
 
        ### ATR-15263
        ['2mu4_bBmumux_LbmumuLambda', 'L1_2MU4', [], [PhysicsStream], ['RATE:Bphysics','BW:Bphys'], -1],
diff --git a/Trigger/TriggerCommon/TriggerMenu/python/menu/Physics_pp_v7.py b/Trigger/TriggerCommon/TriggerMenu/python/menu/Physics_pp_v7.py
index 7b1a6b2e1ef9e2869820c75d07b57aa56b2f60b2..da55ccb70ce5a6ab2f4e432cd6ba00bad9043881 100644
--- a/Trigger/TriggerCommon/TriggerMenu/python/menu/Physics_pp_v7.py
+++ b/Trigger/TriggerCommon/TriggerMenu/python/menu/Physics_pp_v7.py
@@ -1840,15 +1840,14 @@ def setupMenu():
 
     TriggerFlags.BphysicsSlice.signatures = [
 
-        ['2mu6_nomucomb_bPhi',                     'L1_2MU6', [], [PhysicsStream], ['RATE:Bphysics','BW:Bphys'], -1],
-        ['mu11_nomucomb_mu6_nomucomb_bPhi',        'L1_MU11_2MU6', ['L1_MU11','L1_MU6'], [PhysicsStream], ['RATE:Bphysics','BW:Bphys'], -1,['serial',-1,['mu11_nomucomb','mu6_nomucomb_bPhi']]],
-        ['mu11_nomucomb_mu6noL1_nscan03_L1MU11_2MU6_bPhi', 'L1_MU11_2MU6', ['L1_MU11','L2_mu6_nomucomb'], [PhysicsStream], ['RATE:Bphysics','BW:Bphys'], -1,['serial',-1,['mu11_nomucomb','mu6noL1_nscan03_bPhi']]],
+        ['2mu6_bPhi',                     'L1_2MU6', [], [PhysicsStream], ['RATE:Bphysics','BW:Bphys'], -1],
+        ['mu11_mu6_bPhi',        'L1_MU11_2MU6', ['L1_MU11','L1_MU6'], [PhysicsStream], ['RATE:Bphysics','BW:Bphys'], -1,['serial',-1,['mu11','mu6_bPhi']]],
+        ['mu11_mu6noL1_bPhi_L1MU11_2MU6', 'L1_MU11_2MU6', ['L1_MU11','L2_mu6'], [PhysicsStream], ['RATE:Bphysics','BW:Bphys'], -1,['serial',-1,['mu11','mu6noL1_bPhi']]],
 
         ['mu6_mu4_bBmumux_BsmumuPhi_delayed',                    'L1_MU6_2MU4', ['L1_MU6','L1_MU4'], ['BphysDelayed'], ['RATE:BphysDelayed','BW:Bphys'], -1],
         ['2mu6_bBmumux_BsmumuPhi_delayed',                    'L1_2MU6', [], ['BphysDelayed'], ['RATE:BphysDelayed','BW:Bphys'], -1],
         ['mu10_mu6_bBmumux_BsmumuPhi_delayed',            'L1_MU10_2MU6', ['L1_MU10','L1_MU6'],['BphysDelayed'], ['RATE:BphysDelayed','BW:Bphys'], -1],
 
-        ['3mu4_nomucomb_bTau',            'L1_3MU4', [], [PhysicsStream], ['RATE:Bphysics', 'BW:Bphys'], -1],
         ['2mu4_bDimu',                    'L1_2MU4', [], [PhysicsStream], ['RATE:Bphysics','BW:Bphys'], -1], 
         ['2mu4_bDimu_noinvm_novtx_ss',    'L1_2MU4', [], [PhysicsStream], ['RATE:Bphysics','BW:Bphys'], -1],
         ['2mu4_bDimu_novtx_noos',         'L1_2MU4', [], [PhysicsStream], ['RATE:Bphysics','BW:Bphys'], -1],  
@@ -1894,8 +1893,9 @@ def setupMenu():
         ['3mu4_bDimu',                    'L1_3MU4', [], [PhysicsStream], ['RATE:Bphysics','BW:Bphys'], -1],
         ['3mu4_bJpsi',                    'L1_3MU4', [], [PhysicsStream], ['RATE:Bphysics','BW:Bphys'], -1],
         ['3mu4_bTau',                     'L1_3MU4', [], [PhysicsStream], ['RATE:Bphysics','BW:Bphys'], -1],
+        ['3mu4_nomucomb_bTau',                     'L1_3MU4', [], [PhysicsStream], ['RATE:Bphysics','BW:Bphys'], -1],
         ['3mu4_bUpsi',                    'L1_3MU4', [], [PhysicsStream], ['RATE:Bphysics','BW:Bphys'], -1],
-
+        
         ['3mu6_bDimu',                   'L1_3MU6', [], [PhysicsStream], ['RATE:Bphysics','BW:Bphys'], -1],
         ['3mu6_bJpsi',                   'L1_3MU6', [], [PhysicsStream, 'express'], ['RATE:Bphysics','BW:Bphys'], -1],
         ['3mu6_bTau',                    'L1_3MU6', [], [PhysicsStream], ['RATE:Bphysics','BW:Bphys'], -1],
@@ -1959,14 +1959,14 @@ def setupMenu():
         ['2mu10_bUpsimumu',               'L1_2MU10', [], [PhysicsStream], ['RATE:Bphysics','BW:Bphys'], -1],
 
 
-        ['mu11_nomucomb_2mu4noL1_nscan03_L1MU11_2MU6_bTau', 'L1_MU11_2MU6', ['L1_MU11','L2_mu11_nomucomb'], [PhysicsStream, 'express'], ['RATE:Bphysics','BW:Bphys'], -1,['serial',-1,['mu11_nomucomb','2mu4noL1_nscan03']]],
-        ['mu11_nomucomb_mu6noL1_nscan03_L1MU11_2MU6_bTau', 'L1_MU11_2MU6', ['L1_MU11','L2_mu6_nomucomb'], [PhysicsStream], ['RATE:Bphysics','BW:Bphys'], -1,['serial',-1,['mu11_nomucomb','mu6noL1_nscan03']]],
-        ['mu20_nomucomb_mu6noL1_nscan03_bTau', 'L1_MU20', ['L1_MU20','L2_mu20_nomucomb'], [PhysicsStream], ['RATE:Bphysics','BW:Bphys'], -1,['serial',-1,['mu20_nomucomb','mu6noL1_nscan03']]],
+        ['mu11_2mu4noL1_bTau_L1MU11_2MU6', 'L1_MU11_2MU6', ['L1_MU11','L2_mu11'], [PhysicsStream, 'express'], ['RATE:Bphysics','BW:Bphys'], -1,['serial',-1,['mu11','2mu4noL1']]],
+        ['mu11_mu6noL1_bTau_L1MU11_2MU6', 'L1_MU11_2MU6', ['L1_MU11','L2_mu6'], [PhysicsStream], ['RATE:Bphysics','BW:Bphys'], -1,['serial',-1,['mu11','mu6noL1']]],
+        ['mu20_mu6noL1_bTau', 'L1_MU20', ['L1_MU20','L2_mu20'], [PhysicsStream], ['RATE:Bphysics','BW:Bphys'], -1,['serial',-1,['mu20','mu6noL1']]],
         ## LFV topo based nscan (ATR-14352)
-        ['mu11_nomucomb_2mu4noL1_nscan03_L1LFV-MU_bTau', 'L1_LFV-MU', ['L1_MU10','L2_mu11_nomucomb'], [PhysicsStream], ['RATE:Bphysics','BW:Bphys'], -1,['serial',-1,['mu11_nomucomb','2mu4noL1_nscan03']]],      
+        ['mu11_2mu4noL1_bTau_L1LFV-MU', 'L1_LFV-MU', ['L1_MU10','L2_mu11'], [PhysicsStream], ['RATE:Bphysics','BW:Bphys'], -1,['serial',-1,['mu11','2mu4noL1']]],      
 
-        ['mu6_nomucomb_2mu4_nomucomb_bTau_L1MU6_3MU4' , 'L1_MU6_3MU4',  ['L1_MU6','L1_2MU4'], [PhysicsStream], ['RATE:Bphysics','BW:Bphys'], -1],
-        ['2mu6_nomucomb_mu4_nomucomb_bTau_L12MU6_3MU4', 'L1_2MU6_3MU4', ['L1_2MU6','L1_MU4'], [PhysicsStream], ['RATE:Bphysics','BW:Bphys'], -1],
+        ['mu6_2mu4_bTau_L1MU6_3MU4' , 'L1_MU6_3MU4',  ['L1_MU6','L1_2MU4'], [PhysicsStream], ['RATE:Bphysics','BW:Bphys'], -1],
+        ['2mu6_mu4_bTau_L12MU6_3MU4', 'L1_2MU6_3MU4', ['L1_2MU6','L1_MU4'], [PhysicsStream], ['RATE:Bphysics','BW:Bphys'], -1],
         
         ['mu6_iloose_mu6_24invm60_noos_L1DY-BOX-2MU6', 'L1_DY-BOX-2MU6', ['L1_MU6','L1_MU6'], [PhysicsStream], ['RATE:Bphysics','BW:Bphys'], -1, False],
         ['mu4_iloose_mu4_11invm60_noos_L1MU6_2MU4',    'L1_MU6_2MU4',    ['L1_MU4','L1_MU4'], [PhysicsStream], ['RATE:Bphysics','BW:Bphys'], -1],
@@ -2159,17 +2159,29 @@ def setupMenu():
         ['3mu4_bUpsi_delayed',     									               'L1_3MU4', [], ['BphysDelayed'], ['RATE:BphysDelayed','BW:Bphys'], -1],
         ['mu6_2mu4_bJpsi_delayed', 																 'L1_MU6_3MU4', ['L1_MU6','L1_3MU4'], ['BphysDelayed'], ['RATE:BphysDelayed', 'BW:Bphys'], -1],
         ['mu6_2mu4_bUpsi_delayed', 																 'L1_MU6_3MU4', ['L1_MU6','L1_3MU4'], ['BphysDelayed'], ['RATE:BphysDelayed', 'BW:Bphys'], -1],
-        ['mu11_nomucomb_mu6noL1_nscan03_L1MU11_2MU6_bTau_delayed', 'L1_MU11_2MU6', ['L1_MU11','L2_mu6_nomucomb'], ['BphysDelayed'], ['RATE:BphysDelayed','BW:Bphys'], -1,['serial',-1,['mu11_nomucomb','mu6noL1_nscan03']]],
-        #moved to muons slice ['mu6_nomucomb_2mu4_nomucomb_delayed_L1MU6_3MU4',          'L1_MU6_3MU4',  ['L1_MU6','L1_2MU4'],          ['BphysDelayed'], ['RATE:BphysDelayed','BW:Bphys'], -1],
+        ['mu11_mu6noL1_bTau_L1MU11_2MU6_delayed', 'L1_MU11_2MU6', ['L1_MU11','L2_mu6'], ['BphysDelayed'], ['RATE:BphysDelayed','BW:Bphys'], -1,['serial',-1,['mu11','mu6noL1']]],
+        #moved to muons slice ['mu6_2mu4_delayed_L1MU6_3MU4',          'L1_MU6_3MU4',  ['L1_MU6','L1_2MU4'],          ['BphysDelayed'], ['RATE:BphysDelayed','BW:Bphys'], -1],
         ['2mu10_bBmumux_BcmumuDsloose_delayed',                    'L1_2MU10', [], ['BphysDelayed'], ['RATE:BphysDelayed','BW:Bphys'], -1],
         ['2mu10_bJpsimumu_delayed',                                'L1_2MU10', [], ['BphysDelayed'], ['RATE:BphysDelayed','BW:Bphys'], -1],
         ['2mu10_bUpsimumu_delayed',                                'L1_2MU10', [], ['BphysDelayed'], ['RATE:BphysDelayed','BW:Bphys'], -1],
         ['2mu10_bBmumuxv2_delayed',                                'L1_2MU10', [], ['BphysDelayed'], ['RATE:BphysDelayed','BW:Bphys'], -1],
 
         ## LFV topo based *delayed* nscan (ATR-14352)
-        ## original proposed item: ['mu11_nomucomb_mu6noL1_nscan03_L1LFV-MU_bTau', 'L1_LFV-MU', ['L1_MU10','L2_mu6_nomucomb'], [PhysicsStream], ['RATE:Bphysics','BW:Bphys'], -1,['serial',-1,['mu11_nomucomb','mu6noL1_nscan03']]],
-        ['mu11_nomucomb_mu6noL1_nscan03_L1LFV-MU_bTau_delayed', 'L1_LFV-MU', ['L1_MU10','L2_mu6_nomucomb'], ['BphysDelayed'], ['RATE:BphysDelayed','BW:Bphys'], -1,['serial',-1,['mu11_nomucomb','mu6noL1_nscan03']]],
-			 ]
+        ## original proposed item: ['mu11_mu6noL1_L1LFV-MU_bTau', 'L1_LFV-MU', ['L1_MU10','L2_mu6'], [PhysicsStream], ['RATE:Bphysics','BW:Bphys'], -1,['serial',-1,['mu11','mu6noL1']]],
+        ['mu11_mu6noL1_bTau_L1LFV-MU_delayed', 'L1_LFV-MU', ['L1_MU10','L2_mu6'], ['BphysDelayed'], ['RATE:BphysDelayed','BW:Bphys'], -1,['serial',-1,['mu11','mu6noL1']]],
+
+
+        # new baseline triggers, ATR-15503
+        ['mu11_mu6_bBmumuxv2', 'L1_MU11_2MU6', ['L1_MU11','L1_MU6'], [PhysicsStream], ['RATE:Bphysics','BW:Bphys'], -1],
+        ['mu11_mu6_bBmumux_BcmumuDsloose', 'L1_MU11_2MU6', ['L1_MU11','L1_MU6'], [PhysicsStream], ['RATE:Bphysics','BW:Bphys'], -1],
+        ['mu11_mu6_bBmumux_BpmumuKp',      'L1_MU11_2MU6', ['L1_MU11','L1_MU6'], [PhysicsStream], ['RATE:Bphysics','BW:Bphys'], -1],
+        ['mu11_mu6_bJpsimumu_Lxy0', 'L1_MU11_2MU6', ['L1_MU11','L1_MU6'], [PhysicsStream], ['RATE:Bphysics','BW:Bphys'], -1],
+        ['mu11_mu6_bJpsimumu', 'L1_MU11_2MU6', ['L1_MU11','L1_MU6'], [PhysicsStream], ['RATE:Bphysics','BW:Bphys'], -1],
+        ['mu11_mu6_bUpsimumu', 'L1_MU11_2MU6', ['L1_MU11','L1_MU6'], [PhysicsStream], ['RATE:Bphysics','BW:Bphys'], -1],
+        ['mu11_mu6_bDimu_noinvm_novtx_ss', 'L1_MU11_2MU6', ['L1_MU11','L1_MU6'], [PhysicsStream], ['RATE:Bphysics','BW:Bphys'], -1],
+        ['mu11_mu6_bDimu_novtx_noos', 'L1_MU11_2MU6', ['L1_MU11','L1_MU6'], [PhysicsStream], ['RATE:Bphysics','BW:Bphys'], -1],
+
+            ]
 
     TriggerFlags.CombinedSlice.signatures = [
 
diff --git a/Trigger/TriggerCommon/TriggerMenu/python/menu/SignatureDicts.py b/Trigger/TriggerCommon/TriggerMenu/python/menu/SignatureDicts.py
index 87f31fce9cff570972233bc417915e7ff73c2037..7cc30a669d1a16498fbb6892e6d858e4c0d51a87 100644
--- a/Trigger/TriggerCommon/TriggerMenu/python/menu/SignatureDicts.py
+++ b/Trigger/TriggerCommon/TriggerMenu/python/menu/SignatureDicts.py
@@ -54,7 +54,7 @@ ChainDictTemplate = {
 AllowedTopos_e = ["Jpsiee","Zeg","Zee","Heg"]
 AllowedTopos_mu = ['Jpsimumu']
 AllowedTopos_xe = ['1dphi10', '2dphi05', '6dphi05', '6dphi15', '2dphi05', '2dphi15', 'mt25', 'mt35', 'razor140', 'razor170', 'razor200','razor220','razor100','razor185','razor195']
-AllowedTopos_bphys = ['bJpsi', 'bTau', 'bDimu', 
+AllowedTopos_bphys = ['bJpsi', 'bTau', 'bDimu', 'bNocut',
                       'bJpsimumu', 'bUpsimumu', 
                       'bBmumu', 'bBmumux', 
                       'bBmumuxv2', 'bBmumuxv3',
@@ -62,7 +62,7 @@ AllowedTopos_bphys = ['bJpsi', 'bTau', 'bDimu',
                       'BcmumuDs' ,   'BcmumuDsloose' ,
                       '7invm9', 'noos', 'noid', 'novtx',
                       '11invm60','18invm60', 'bUpsi',
-                      'Trkloose', 'Zmumu', 'noL2', 'noEFbph',
+                      'Trkloose',  'TrkPEB', 'Zmumu', 'noL2', 'noEFbph',
                       'noinvm', 'ss', 'BpmumuKp', 'Taumumux', 'Dsmumux', 'LbmumuLambda',
                       'trkTau', 'bTauTrk', 'bDsPhiX', 'bPhi','bDsPhiXtight',
                       '11invm24', '24invm60',
@@ -243,11 +243,13 @@ MuonChainParts_Default = {
 BphysicsChainParts = deepcopy(MuonChainParts)
 #BphysicsChainParts['bTracking'] = ['FTK']
 BphysicsChainParts['signature'] = ['Bphysics']
+BphysicsChainParts['peb'] = ['peb075']
 BphysicsChainParts['topo'] = AllowedTopos_bphys
 # ---- Bphysics Dictinary of default Values ----
 BphysicsChainParts_Default = deepcopy(MuonChainParts_Default)
 BphysicsChainParts_Default['signature'] = ['Bphysics']
 BphysicsChainParts_Default['topo'] = []
+BphysicsChainParts['peb'] = []
 BphysicsChainParts_Default['overlapRemoval'] = ['noOvlpRm']
 
 #==========================================================
diff --git a/Trigger/TriggerCommon/TriggerMenu/python/menu/StreamInfo.py b/Trigger/TriggerCommon/TriggerMenu/python/menu/StreamInfo.py
index f5eb3c833cb02bc738f314d7975faf1a17b41b67..22e8da8d8e63250da86f2a7d2b665872a5233f1d 100644
--- a/Trigger/TriggerCommon/TriggerMenu/python/menu/StreamInfo.py
+++ b/Trigger/TriggerCommon/TriggerMenu/python/menu/StreamInfo.py
@@ -58,7 +58,8 @@ calibStreams = [
                 'IDFwd',
                 'BeamSpot',
                 'zdcCalib',
-                'AFP'
+                'AFP',
+                'BphysPEB'
                 ]
 
 ##NOTE: DataScouting_xx_NAME: 
diff --git a/Trigger/TriggerCommon/TriggerMenu/python/muon/MuonDef.py b/Trigger/TriggerCommon/TriggerMenu/python/muon/MuonDef.py
index adae3518e4d20c05eabe59a0f94bc2c5a2ed642c..06902b099744bc191e05b9f100e2a1319524a926 100755
--- a/Trigger/TriggerCommon/TriggerMenu/python/muon/MuonDef.py
+++ b/Trigger/TriggerCommon/TriggerMenu/python/muon/MuonDef.py
@@ -49,7 +49,7 @@ class L2EFChain_mu(L2EFChainDef):
   fullScanSeqMap = getFullScanCaloSequences()
   # ----------------------------------------------------------------
 
-  def __init__(self, chainDict, asymDiMuonChain = False, AllMuons = []):
+  def __init__(self, chainDict, asymDiMuonChain = False, AllMuons = [], thisIsBphysChain=False):
     self.L2sequenceList   = []
     self.EFsequenceList   = []
     self.L2signatureList  = []
@@ -79,6 +79,9 @@ class L2EFChain_mu(L2EFChainDef):
     # --- used to configure hypos for FS muon chains
     self.allMuThrs=AllMuons
 
+    # --- used to set default for Bphys chains
+    self.thisIsBphysChain = thisIsBphysChain
+
     # --- when to run with ovlp removal ---
     self.ovlpRm = self.chainPart['overlapRemoval']
     self.asymDiMuonChain = asymDiMuonChain
@@ -90,7 +93,7 @@ class L2EFChain_mu(L2EFChainDef):
       self.setup_muXX_noL1FTK()
     elif (self.mult > 1) & ('wOvlpRm' in self.ovlpRm):
       self.doOvlpRm = True
-    elif "bJpsi" in self.chainName or "bDimu" in self.chainName or "bUpsi" in self.chainName :
+    elif "bJpsi" in self.chainName or "bDimu" in self.chainName or "bUpsi" in self.chainName or self.thisIsBphysChain :
       self.doOvlpRm = False
     elif (self.asymDiMuonChain) and (self.mult > 1) and not self.chainPart['extra'] and not self.chainPart['reccalibInfo'] :
       self.doOvlpRm = True
@@ -102,7 +105,8 @@ class L2EFChain_mu(L2EFChainDef):
           and not self.chainPart['FSinfo'] \
           and not self.chainPart['hypoInfo'] \
           and not self.chainPart['reccalibInfo'] \
-          and "cosmicEF" not in self.chainPart['addInfo']:
+          and "cosmicEF" not in self.chainPart['addInfo'] \
+          and not self.thisIsBphysChain :
       self.setup_muXX_ID()
     elif "muL2" in self.chainPart['reccalibInfo']:
       self.setup_muXX_muL2()
@@ -132,6 +136,8 @@ class L2EFChain_mu(L2EFChainDef):
     elif self.chainPart['reccalibInfo'] == "muoncalib"  and "cosmicEF" not in self.chainPart['addInfo'] \
           and "ds3" in self.chainPart['addInfo'] :
       self.setup_muXX_muoncalib_ds3()
+    elif self.thisIsBphysChain  and "cosmicEF" not in self.chainPart['addInfo'] :  ## Keep this  at the end, in case non-default chain is requested
+        self.setup_muXX_nomucomb()
     elif "cosmicEF" in self.chainPart['addInfo']:
       self.setup_muXX_cosmicEF()
     elif "mucombTag" in self.chainPart['reccalibInfo'] and "noEF" in self.chainPart['addInfo'] :
@@ -2127,17 +2133,12 @@ class L2EFChain_mu(L2EFChainDef):
                              [theTrigMuSuperEF, theTrigMuonEFCombinerHypoConfig],
                              'EF_mu_step2']]
     
-    self.EFsequenceList += [[['EF_mu_step2'],
-                             [theTrigMuonIDTrackMultiHypoConfig_Muon],
-                             'EF_mu_step3']]
-    
     
     self.L2signatureList += [ [['L2_mu_step1']*self.mult] ]
     self.L2signatureList += [ [['L2_mu_step2']*self.mult] ]
     self.L2signatureList += [ [['L2_mu_step3']          ] ]
     self.EFsignatureList += [ [['EF_mu_step1']*self.mult] ]
     self.EFsignatureList += [ [['EF_mu_step2']*self.mult] ]
-    self.EFsignatureList += [ [['EF_mu_step3']          ] ]
     
     self.TErenamingDict = {
       'L2_mu_step1': mergeRemovingOverlap('L2_mu_SA_',  L2AlgName+muFastThresh+'_'+self.L2InputTE),
@@ -2149,6 +2150,16 @@ class L2EFChain_mu(L2EFChainDef):
       #--> replaced 'EF_mu_step3': mergeRemovingOverlap('EF_mutrkmulti_', idmulti+'_'+self.chainPartNameNoMult+'_'+self.L2InputTE),
       'EF_mu_step1': mergeRemovingOverlap('EF_EFIDInsideOut_', idmulti+'_'+self.chainPartNameNoMult.replace(self.chainPart['specialStream'], '')+'_'+self.L2InputTE).replace('__', '_'),
       'EF_mu_step2': mergeRemovingOverlap('EF_SuperEF_',   idmulti+'_'+self.chainPartNameNoMult.replace(self.chainPart['specialStream'], '')+'_'+self.L2InputTE).replace('__', '_'),
-      'EF_mu_step3': mergeRemovingOverlap('EF_mutrkmulti_', idmulti+'_'+self.chainPartNameNoMult.replace(self.chainPart['specialStream'], '')+'_'+self.L2InputTE).replace('__', '_'),
       }
     
+
+    # OI this makes no sense , as we already cut on good tracks at L2, there is no rejection, skip it (at least in 2017)
+    from TriggerJobOpts.TriggerFlags import TriggerFlags
+    if TriggerFlags.run2Config=='2016':
+      self.EFsequenceList += [[['EF_mu_step2'],
+                              [theTrigMuonIDTrackMultiHypoConfig_Muon],
+                              'EF_mu_step3']]
+      self.EFsignatureList += [ [['EF_mu_step3']          ] ]
+      self.TErenamingDict += {
+        'EF_mu_step3': mergeRemovingOverlap('EF_mutrkmulti_', idmulti+'_'+self.chainPartNameNoMult.replace(self.chainPart['specialStream'], '')+'_'+self.L2InputTE).replace('__', '_'),
+      }
diff --git a/Trigger/TriggerCommon/TriggerMenu/python/muon/generateMuonChainDefs.py b/Trigger/TriggerCommon/TriggerMenu/python/muon/generateMuonChainDefs.py
index 12eee488766a92bbf7e6defe65b64d1b82456a8a..f2f778cecb89abcb3efc75c17059839c62d03449 100644
--- a/Trigger/TriggerCommon/TriggerMenu/python/muon/generateMuonChainDefs.py
+++ b/Trigger/TriggerCommon/TriggerMenu/python/muon/generateMuonChainDefs.py
@@ -40,7 +40,7 @@ def GetAllMuonThresholds(chainDict):
 
     return muons
 
-def generateChainDefs(chainDict):
+def generateChainDefs(chainDict, thisIsBphysChain=False):
     
     listOfChainDicts = splitChainDict(chainDict)
     listOfChainDefs = []
@@ -62,7 +62,7 @@ def generateChainDefs(chainDict):
             else:
                 AllMuons=[]
 
-            Muon = L2EFChain_mu(subChainDict, asymDiMuonChain, AllMuons)
+            Muon = L2EFChain_mu(subChainDict, asymDiMuonChain, AllMuons, thisIsBphysChain)
 
         listOfChainDefs += [Muon.generateHLTChainDef()]