diff --git a/Trigger/TrigHypothesis/TrigBphysHypo/python/TrigMultiTrkComboHypoConfig.py b/Trigger/TrigHypothesis/TrigBphysHypo/python/TrigMultiTrkComboHypoConfig.py
index ad44bd84c216e79b58e86c5d105e41984b855d9a..2eaa15627f28ed3695d46f1a6cb129a5e98e06a6 100644
--- a/Trigger/TrigHypothesis/TrigBphysHypo/python/TrigMultiTrkComboHypoConfig.py
+++ b/Trigger/TrigHypothesis/TrigBphysHypo/python/TrigMultiTrkComboHypoConfig.py
@@ -18,6 +18,7 @@ trigMultiTrkComboHypoToolDict = {
     'bBmumu'     : { 'massRange' : (4000.,  8500.), 'chi2' : 20. },
     'bPhi'       : { 'massRange' : ( 940.,  1100.), 'chi2' : 10. },
     'bTau'       : { 'massRange' : (   0.,  2700.), 'chi2' : 50. },
+    'b3mu'       : { 'massRange' : ( 100., 10000.), 'chi2' : 30., 'nTrk' : 3, 'charge' : 1 },
     'bBeeM6000'  : { 'massRange' : ( 100.,  6000.), 'chi2' : 20. },
     'b0dRAB12vtx20' : { 'massRange' : ( 0.,  999999999.),  'chi2' : 20., 'deltaRMax' : 1.2  }
 }
@@ -64,7 +65,9 @@ def StreamerDimuEFComboHypoCfg(name):
         trigSequenceName = 'StreamerDimu',
         trigLevel = 'EF')
     hypo.chi2 = 20.
+    hypo.nTracks = [ 2 ]
     hypo.massRange = [ (100., 6000.) ]
+    hypo.trackPtThresholds = [ [ 100., 100. ] ]
     return hypo
 
 def StreamerDiElecFastComboHypoCfg(name):
@@ -129,6 +132,7 @@ def BmutrkComboHypoCfg(name):
         outputTrigBphysCollection = 'HLT_Bmutrk')
     hypo.isMuTrkMode = True
     hypo.chi2 = 20.
+    hypo.nTracks = [ 2 ]
     hypo.massRange = [ (2500., 4400.) ]
     hypo.trackPtThresholds = [ [ 10000., 3000. ] ]
     return hypo
@@ -187,8 +191,9 @@ class TrigMultiTrkComboHypoConfig(object):
             name = baseName+'ComboHypo',
             isStreamer = isStreamer,
             trigLevel = trigLevel,
-            nTracks = [ 2 ],
-            massRange = [ (100., 20000.) ],
+            nTracks = [ 2, 3 ],
+            massRange = [ (100., 20000.), (100., 11000.) ],
+            trackPtThresholds = [ [ 3650., 3650. ], [ 3650., 3650., 3650. ] ],
             TrackCollectionKey = trackCollection,
             TrigBphysCollectionKey = outputTrigBphysCollection,
             VertexFitter = VertexFitter,
@@ -207,7 +212,8 @@ class TrigMultiTrkComboHypoConfig(object):
             value = trigMultiTrkComboHypoToolDict[topo]
             tool.massRange = value['massRange']
             tool.chi2 = value['chi2']
-            tool.totalCharge = 0
+            tool.nTrk = value['nTrk'] if 'nTrk' in value else 2
+            tool.totalCharge = value['charge'] if 'charge' in value else 0
             if 'deltaRMin' in value:
                tool.deltaRMin = value['deltaRMin']
             if 'deltaRMax' in value:
diff --git a/Trigger/TrigHypothesis/TrigBphysHypo/src/TrigMultiTrkComboHypo.cxx b/Trigger/TrigHypothesis/TrigBphysHypo/src/TrigMultiTrkComboHypo.cxx
index 5ed2ad89cf90f801c24906544bb03034b8655686..2de54e1e1ba3a9cd16a096aff0664d7cd3790ad3 100644
--- a/Trigger/TrigHypothesis/TrigBphysHypo/src/TrigMultiTrkComboHypo.cxx
+++ b/Trigger/TrigHypothesis/TrigBphysHypo/src/TrigMultiTrkComboHypo.cxx
@@ -500,7 +500,7 @@ StatusCode TrigMultiTrkComboHypo::filterTrackCombinations(TrigMultiTrkStateBase&
       auto mass = (std::accumulate(p.begin(), p.end(), xAOD::TrackParticle::GenVecFourMom_t())).M();
       ATH_MSG_DEBUG( "invariant mass: " << mass );
 
-      if (!isInMassRange(mass)) continue;
+      if (!isInMassRange(mass, iTrk)) continue;
 
       auto fitterState = m_vertexFitter->makeState(state.context());
       auto vertex = fit(tracklist, m_trkMass[iTrk], *fitterState);
@@ -618,7 +618,7 @@ StatusCode TrigMultiTrkComboHypo::findMultiLeptonCandidates(TrigMultiTrkState<T>
 
       mon_nCombination++;
       trkMassBeforeFit.push_back(mass * 0.001);
-      if (!isInMassRange(mass)) continue;
+      if (!isInMassRange(mass, iTrk)) continue;
 
       mon_nCombinationBeforeFit++;
       auto fitterState = m_vertexFitter->makeState(state.context());
@@ -748,7 +748,7 @@ StatusCode TrigMultiTrkComboHypo::findMuTrkCandidates(TrigMultiTrkState<xAOD::Mu
       if (track->pt() < m_trkPt[0][1] || isIdenticalTracks(track, muonInDetTrack)) continue;
       auto trackMomentum = track->genvecP4();
       trackMomentum.SetM(PDG::mMuon);
-      if (!isInMassRange((muonMomentum + trackMomentum).M())) continue;
+      if (!isInMassRange((muonMomentum + trackMomentum).M(), 0)) continue;
 
       tracklist[1] = ViewHelper::makeLink<xAOD::TrackParticleContainer>(view, tracksHandle, idx);
 
@@ -977,14 +977,8 @@ float TrigMultiTrkComboHypo::Lxy(const xAOD::TrigBphys& vertex, const Amg::Vecto
 }
 
 
-bool TrigMultiTrkComboHypo::isInMassRange(double mass) const {
+bool TrigMultiTrkComboHypo::isInMassRange(double mass, size_t idx) const {
 
-  bool result = false;
-  for (const auto& range : m_massRange) {
-    if (mass > range.first && mass < range.second) {
-      result = true;
-      break;
-    }
-  }
-  return result;
+  const auto& range = m_massRange[idx];
+  return (mass > range.first && mass < range.second);
 }
diff --git a/Trigger/TrigHypothesis/TrigBphysHypo/src/TrigMultiTrkComboHypo.h b/Trigger/TrigHypothesis/TrigBphysHypo/src/TrigMultiTrkComboHypo.h
index e20fd423349ba4d2acd1a76e97ba65964e370fa8..d750a089b9ddbe00a9c934684b817bddcdc9a9b6 100644
--- a/Trigger/TrigHypothesis/TrigBphysHypo/src/TrigMultiTrkComboHypo.h
+++ b/Trigger/TrigHypothesis/TrigBphysHypo/src/TrigMultiTrkComboHypo.h
@@ -215,7 +215,7 @@ class TrigMultiTrkComboHypo: public ::ComboHypo {
   bool isIdenticalTracks(const xAOD::TrackParticle* lhs, const xAOD::TrackParticle* rhs) const;
   bool isIdenticalTracks(const xAOD::Muon* lhs, const xAOD::Muon* rhs) const;
   bool isIdenticalTracks(const xAOD::Electron* lhs, const xAOD::Electron* rhs) const;
-  bool isInMassRange(double mass) const;
+  bool isInMassRange(double mass, size_t idx) const;
   float Lxy(const xAOD::TrigBphys& vertex, const Amg::Vector3D& beamSpot) const;
 
   SG::ReadHandleKey<xAOD::TrackParticleContainer>
diff --git a/Trigger/TrigValidation/TrigAnalysisTest/share/ref_RDOtoRDOTrig_v1Dev_build.ref b/Trigger/TrigValidation/TrigAnalysisTest/share/ref_RDOtoRDOTrig_v1Dev_build.ref
index dd2d5b9501e7c3764294d0e130acfb3fb06128d1..371b5ef828332a30706f954ee004934f6329855e 100644
--- a/Trigger/TrigValidation/TrigAnalysisTest/share/ref_RDOtoRDOTrig_v1Dev_build.ref
+++ b/Trigger/TrigValidation/TrigAnalysisTest/share/ref_RDOtoRDOTrig_v1Dev_build.ref
@@ -1082,9 +1082,9 @@ HLT_3j65_0eta290_020jvt_pf_ftf_bdl1r85_L1J45p0ETA21_3J15p0ETA25:
     0: 12
     1: 20
     2: 7
-HLT_3mu4_L1BPH-0M10-3MU3V:
+HLT_3mu4_b3mu_L1BPH-0M10C-3MU3V:
   eventCount: 0
-HLT_3mu4_L1BPH-0M10C-3MU3V:
+HLT_3mu4_b3mu_noos_L1BPH-0M10-3MU3V:
   eventCount: 0
 HLT_3mu4_bDimu2700_L13MU3V:
   eventCount: 0
diff --git a/Trigger/TrigValidation/TrigP1Test/share/ref_v1Dev_decodeBS_build.ref b/Trigger/TrigValidation/TrigP1Test/share/ref_v1Dev_decodeBS_build.ref
index bf81dd5537598b5e7c5cd6b3c3fed7f443ddf671..64693e261e3d01c6ba2ea43688ae4bc9e72aaf55 100644
--- a/Trigger/TrigValidation/TrigP1Test/share/ref_v1Dev_decodeBS_build.ref
+++ b/Trigger/TrigValidation/TrigP1Test/share/ref_v1Dev_decodeBS_build.ref
@@ -442,9 +442,9 @@ HLT_3j65_0eta290_020jvt_pf_ftf_bdl1r77_L1J45p0ETA21_3J15p0ETA25:
   eventCount: 0
 HLT_3j65_0eta290_020jvt_pf_ftf_bdl1r85_L1J45p0ETA21_3J15p0ETA25:
   eventCount: 0
-HLT_3mu4_L1BPH-0M10-3MU3V:
+HLT_3mu4_b3mu_L1BPH-0M10C-3MU3V:
   eventCount: 0
-HLT_3mu4_L1BPH-0M10C-3MU3V:
+HLT_3mu4_b3mu_noos_L1BPH-0M10-3MU3V:
   eventCount: 0
 HLT_3mu4_bDimu2700_L13MU3V:
   eventCount: 0
diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Bphysics/BphysicsChainConfiguration.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Bphysics/BphysicsChainConfiguration.py
index fad7b3f3c3aa8263831a7635e3558512cb0b500e..71f779ebebb6338f31fe3596802a9ff46a17693a 100644
--- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Bphysics/BphysicsChainConfiguration.py
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Bphysics/BphysicsChainConfiguration.py
@@ -86,6 +86,7 @@ class BphysicsChainConfiguration(MuonChainConfiguration):
             'bDimu6000'  : 'dimu',
             'bPhi'       : 'dimu',
             'bTau'       : 'dimu',
+            'b3mu'       : 'dimu',
             'bBmumux'    : 'bmumux',
             'b0dRAB12vtx20' : 'dimu'
         }
diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/LS2_v1.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/LS2_v1.py
index 81e48b68c0dcaa5ea2efc62b6902dae7da65b8c2..06bf6e68e52f4462920a72df1e514f3dc792420e 100644
--- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/LS2_v1.py
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/LS2_v1.py
@@ -154,10 +154,6 @@ def setupMenu():
         ChainProp(name='HLT_mu24_ivarmedium_mu6_ivarmedium_probe_L1MU14FCH', l1SeedThresholds=['MU14FCH','PROBEMU3V'], groups=MultiMuonGroup),
         ChainProp(name='HLT_mu24_ivarmedium_mu6_ivarperf_probe_L1MU14FCH', l1SeedThresholds=['MU14FCH','PROBEMU3V'], groups=MultiMuonGroup),
 
-        # 3mu inv mass (ATR-19355, ATR-19638), TODO: HLT invm to be added and moved to BLS signature
-        ChainProp(name='HLT_3mu4_L1BPH-0M10-3MU3V', l1SeedThresholds=['MU3V'], stream=["BphysDelayed"], groups=BphysicsGroup),
-        ChainProp(name='HLT_3mu4_L1BPH-0M10C-3MU3V', l1SeedThresholds=['MU3V'], stream=["BphysDelayed"], groups=BphysicsGroup),
-
         # ATR-22782
         ChainProp(name='HLT_2mu4_L1BPH-0M16-20DR99-2MU3V', l1SeedThresholds=['MU3V'], stream=["BphysDelayed"], groups=BphysicsGroup),
         ChainProp(name='HLT_2mu4_L1BPH-0M16-15DR99-2MU3V', l1SeedThresholds=['MU3V'], stream=["BphysDelayed"], groups=BphysicsGroup),
@@ -995,6 +991,11 @@ def setupMenu():
         ChainProp(name='HLT_mu6_mu4_bJpsimumu_L1BPH-2M9-0DR15-C-MU5VFMU3V', l1SeedThresholds=['MU5VF','MU3V'], stream=["BphysDelayed"], groups=BphysicsGroup),
         ChainProp(name='HLT_mu6_mu4_bJpsimumu_Lxy0_L1BPH-2M9-0DR15-C-MU5VFMU3V', l1SeedThresholds=['MU5VF','MU3V'], stream=["BphysDelayed"], groups=BphysicsGroup),
         ChainProp(name='HLT_mu6_mu4_bBmumu_Lxy0_L1BPH-2M9-0DR15-C-MU5VFMU3V', l1SeedThresholds=['MU5VF','MU3V'], stream=["BphysDelayed"], groups=BphysicsGroup),
+
+        # 3mu inv mass (ATR-19355, ATR-19638)
+        ChainProp(name='HLT_3mu4_b3mu_noos_L1BPH-0M10-3MU3V', l1SeedThresholds=['MU3V'], stream=["BphysDelayed"], groups=BphysicsGroup),
+        ChainProp(name='HLT_3mu4_b3mu_L1BPH-0M10C-3MU3V', l1SeedThresholds=['MU3V'], stream=["BphysDelayed"], groups=BphysicsGroup),
+
         #ATR-21566, di-muon TLA
         ChainProp(name='HLT_2mu4_b0dRAB12vtx20_L1BPH-0DR12C-2MU3V', l1SeedThresholds=['MU3V'],stream=["BphysDelayed"], groups=BphysicsGroup),
     ]
diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/SignatureDicts.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/SignatureDicts.py
index fca230c209978547e0475ec10a110c755b8ac826..b1cf61daebff0359bcc1e9587ced73fbaecf0e22 100644
--- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/SignatureDicts.py
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/SignatureDicts.py
@@ -361,8 +361,8 @@ MuonChainParts_Default = {
 # Bphysics
 #==========================================================
 AllowedTopos_Bphysics = [
-    'bJpsimumu','bJpsi','bJpsimutrk','bUpsimumu','bUpsi','bBmumu','bDimu','bDimu2700','bDimu6000','bPhi','bTau',
-    'Lxy0',
+    'bJpsimumu','bJpsi','bJpsimutrk','bUpsimumu','bUpsi','bBmumu','bDimu','bDimu2700','bDimu6000','bPhi','bTau','b3mu',
+    'Lxy0','noos','nocut',
     'bBmumux','BpmumuKp','BcmumuPi','BsmumuPhi','BdmumuKst','LbPqKm', 'BcmumuDsloose', 'BcmumuDploose',
     'b0dRAB12vtx20'
 ]