diff --git a/fles/mcbm2018/tasks/CbmMcbm2018EventBuilder.cxx b/fles/mcbm2018/tasks/CbmMcbm2018EventBuilder.cxx
index 01662a38be5c91e05f80070da024fb4626b1dd8a..c1fb5e04b1dce7fc0ed5bbe1296cc7c3dae3df61 100644
--- a/fles/mcbm2018/tasks/CbmMcbm2018EventBuilder.cxx
+++ b/fles/mcbm2018/tasks/CbmMcbm2018EventBuilder.cxx
@@ -344,6 +344,9 @@ void CbmMcbm2018EventBuilder::BuildEvents()
       } // default:
     } //? system
 
+    if( fFillHistos )
+      fDiffTime->Fill( time - fPrevTime );
+
     fPrevTime = time;
   }
   fCurrentEvent->SetEndTime(fPrevTime);
@@ -363,28 +366,50 @@ Bool_t CbmMcbm2018EventBuilder::IsDigiInEvent(Double_t time)
 Bool_t CbmMcbm2018EventBuilder::HasTrigger(CbmEvent* event)
 {
   Bool_t hasTrigger{kTRUE};
-  if ( (fT0DigiVec || fT0DigiArr) && fTriggerMinT0Digis > 0) {
+  if ( hasTrigger && (fT0DigiVec || fT0DigiArr) && fTriggerMinT0Digis > 0) {
     hasTrigger = hasTrigger && (event->GetNofData(ECbmDataType::kT0Digi) >= fTriggerMinT0Digis);
   }
-  if (fDigiMan->IsPresent(ECbmModuleId::kSts) && fTriggerMinStsDigis > 0) {
+  if (hasTrigger && fDigiMan->IsPresent(ECbmModuleId::kSts) && fTriggerMinStsDigis > 0) {
     hasTrigger = hasTrigger && (event->GetNofData(ECbmDataType::kStsDigi) >= fTriggerMinStsDigis);
   }
-  if (fDigiMan->IsPresent(ECbmModuleId::kMuch) && fTriggerMinMuchDigis > 0) {
+  if (hasTrigger && fDigiMan->IsPresent(ECbmModuleId::kMuch) && fTriggerMinMuchDigis > 0) {
     hasTrigger = hasTrigger && (event->GetNofData(ECbmDataType::kMuchDigi) >= fTriggerMinMuchDigis);
   }
-  if (fDigiMan->IsPresent(ECbmModuleId::kTrd) && fTriggerMinTrdDigis > 0) {
+  if (hasTrigger && fDigiMan->IsPresent(ECbmModuleId::kTrd) && fTriggerMinTrdDigis > 0) {
     hasTrigger = hasTrigger && (event->GetNofData(ECbmDataType::kTrdDigi) >= fTriggerMinTrdDigis);
   }
-  if (fDigiMan->IsPresent(ECbmModuleId::kTof) && fTriggerMinTofDigis > 0) {
+  if (hasTrigger && fDigiMan->IsPresent(ECbmModuleId::kTof) && fTriggerMinTofDigis > 0) {
     hasTrigger = hasTrigger && (event->GetNofData(ECbmDataType::kTofDigi) >= fTriggerMinTofDigis);
   }
-  if (fDigiMan->IsPresent(ECbmModuleId::kRich) && fTriggerMinRichDigis > 0) {
+  if (hasTrigger && fDigiMan->IsPresent(ECbmModuleId::kRich) && fTriggerMinRichDigis > 0) {
     hasTrigger = hasTrigger && (event->GetNofData(ECbmDataType::kRichDigi) >= fTriggerMinRichDigis);
   }
-  if (fDigiMan->IsPresent(ECbmModuleId::kPsd) && fTriggerMinPsdDigis > 0) {
+  if (hasTrigger && fDigiMan->IsPresent(ECbmModuleId::kPsd) && fTriggerMinPsdDigis > 0) {
     hasTrigger = hasTrigger && (event->GetNofData(ECbmDataType::kPsdDigi) >= fTriggerMinPsdDigis);
   }
 
+  if (hasTrigger && (fT0DigiVec || fT0DigiArr) && fTriggerMaxT0Digis >= 0) {
+    hasTrigger = hasTrigger && (event->GetNofData(ECbmDataType::kT0Digi) < fTriggerMaxT0Digis);
+  }
+  if (hasTrigger && fDigiMan->IsPresent(ECbmModuleId::kSts) && fTriggerMaxStsDigis >= 0) {
+    hasTrigger = hasTrigger && (event->GetNofData(ECbmDataType::kStsDigi) < fTriggerMaxStsDigis);
+  }
+  if (hasTrigger && fDigiMan->IsPresent(ECbmModuleId::kMuch) && fTriggerMaxMuchDigis >= 0) {
+    hasTrigger = hasTrigger && (event->GetNofData(ECbmDataType::kMuchDigi) < fTriggerMaxMuchDigis);
+  }
+  if (hasTrigger && fDigiMan->IsPresent(ECbmModuleId::kTrd) && fTriggerMaxTrdDigis >= 0) {
+    hasTrigger = hasTrigger && (event->GetNofData(ECbmDataType::kTrdDigi) < fTriggerMaxTrdDigis);
+  }
+  if (hasTrigger && fDigiMan->IsPresent(ECbmModuleId::kTof) && fTriggerMaxTofDigis >= 0) {
+    hasTrigger = hasTrigger && (event->GetNofData(ECbmDataType::kTofDigi) < fTriggerMaxTofDigis);
+  }
+  if (hasTrigger && fDigiMan->IsPresent(ECbmModuleId::kRich) && fTriggerMaxRichDigis >= 0) {
+    hasTrigger = hasTrigger && (event->GetNofData(ECbmDataType::kRichDigi) < fTriggerMaxRichDigis);
+  }
+  if (hasTrigger && fDigiMan->IsPresent(ECbmModuleId::kPsd) && fTriggerMaxPsdDigis >= 0) {
+    hasTrigger = hasTrigger && (event->GetNofData(ECbmDataType::kPsdDigi) < fTriggerMaxPsdDigis);
+  }
+
   return hasTrigger;
 }
 
diff --git a/fles/mcbm2018/tasks/CbmMcbm2018EventBuilder.h b/fles/mcbm2018/tasks/CbmMcbm2018EventBuilder.h
index 675f1526e3f74549aa90545f9502914b6331311a..e473ae880785b0603c42bd3e759e4030c5adc25d 100644
--- a/fles/mcbm2018/tasks/CbmMcbm2018EventBuilder.h
+++ b/fles/mcbm2018/tasks/CbmMcbm2018EventBuilder.h
@@ -87,14 +87,36 @@ class CbmMcbm2018EventBuilder : public FairTask
     void SetFixedTimeWindow(Double_t val) {fFixedTimeWindow = val;}
     void SetMaximumTimeGap(Double_t val) {fMaximumTimeGap = val;}
 
+    /** Minimum number of T0 digis needed to generate a trigger, 0 means don't use T0 for trigger generation **/
     void SetTriggerMinNumberT0(Int_t val)   {fTriggerMinT0Digis = val;}
+    /** Minimum number of Sts digis needed to generate a trigger, 0 means don't use Sts for trigger generation **/
     void SetTriggerMinNumberSts(Int_t val)  {fTriggerMinStsDigis = val;}
+    /** Minimum number of Much digis needed to generate a trigger, 0 means don't use Much for trigger generation **/
     void SetTriggerMinNumberMuch(Int_t val) {fTriggerMinMuchDigis = val;}
+    /** Minimum number of Trd digis needed to generate a trigger, 0 means don't use Trd for trigger generation **/
     void SetTriggerMinNumberTrd(Int_t val)  {fTriggerMinTrdDigis = val;}
+    /** Minimum number of Tof digis needed to generate a trigger, 0 means don't use Tof for trigger generation **/
     void SetTriggerMinNumberTof(Int_t val)  {fTriggerMinTofDigis = val;}
+    /** Minimum number of Rich digis needed to generate a trigger, 0 means don't use Rich for trigger generation **/
     void SetTriggerMinNumberRich(Int_t val) {fTriggerMinRichDigis = val;}
+    /** Minimum number of Psd digis needed to generate a trigger, 0 means don't use Psd for trigger generation **/
     void SetTriggerMinNumberPsd(Int_t val)  {fTriggerMinPsdDigis = val;}
 
+    /** Maximum number of T0 digis needed to generate a trigger, -1 means no cut, 0 means anti-coinc trigger **/
+    void SetTriggerMaxNumberT0(Int_t val)   {fTriggerMaxT0Digis = val;}
+    /** Maximum number of Sts digis needed to generate a trigger, -1 means no cut, 0 means anti-coinc trigger **/
+    void SetTriggerMaxNumberSts(Int_t val)  {fTriggerMaxStsDigis = val;}
+    /** Maximum number of Much digis needed to generate a trigger, -1 means no cut, 0 means anti-coinc trigger **/
+    void SetTriggerMaxNumberMuch(Int_t val) {fTriggerMaxMuchDigis = val;}
+    /** Maximum number of Trd digis needed to generate a trigger, -1 means no cut, 0 means anti-coinc trigger **/
+    void SetTriggerMaxNumberTrd(Int_t val)  {fTriggerMaxTrdDigis = val;}
+    /** Maximum number of Tof digis needed to generate a trigger, -1 means no cut, 0 means anti-coinc trigger **/
+    void SetTriggerMaxNumberTof(Int_t val)  {fTriggerMaxTofDigis = val;}
+    /** Maximum number of Rich digis needed to generate a trigger, -1 means no cut, 0 means anti-coinc trigger **/
+    void SetTriggerMaxNumberRich(Int_t val) {fTriggerMaxRichDigis = val;}
+    /** Maximum number of Psd digis needed to generate a trigger, -1 means no cut, 0 means anti-coinc trigger **/
+    void SetTriggerMaxNumberPsd(Int_t val)  {fTriggerMaxPsdDigis = val;}
+
     void SetUseBaseMuchDigi( Bool_t bFlag = kTRUE ) { fbUseBaseMuchDigi = bFlag; }
   private:
 
@@ -168,6 +190,20 @@ class CbmMcbm2018EventBuilder : public FairTask
     Int_t fTriggerMinRichDigis{0};
     /** Minimum number of Psd digis needed to generate a trigger, 0 means don't use Psd for trigger generation **/
     Int_t fTriggerMinPsdDigis{0};
+    /** Maximum number of T0 digis needed to generate a trigger, -1 means no cut, 0 means anti-coinc trigger **/
+    Int_t fTriggerMaxT0Digis   = -1;
+    /** Maximum number of Sts digis needed to generate a trigger, -1 means no cut, 0 means anti-coinc trigger **/
+    Int_t fTriggerMaxStsDigis  = -1;
+    /** Maximum number of Much digis needed to generate a trigger, -1 means no cut, 0 means anti-coinc trigger **/
+    Int_t fTriggerMaxMuchDigis = -1;
+    /** Maximum number of Trd digis needed to generate a trigger, -1 means no cut, 0 means anti-coinc trigger **/
+    Int_t fTriggerMaxTrdDigis  = -1;
+    /** Maximum number of Tof digis needed to generate a trigger, -1 means no cut, 0 means anti-coinc trigger **/
+    Int_t fTriggerMaxTofDigis  = -1;
+    /** Maximum number of Rich digis needed to generate a trigger, -1 means no cut, 0 means anti-coinc trigger **/
+    Int_t fTriggerMaxRichDigis = -1;
+    /** Maximum number of Psd digis needed to generate a trigger, -1 means no cut, 0 means anti-coinc trigger **/
+    Int_t fTriggerMaxPsdDigis  = -1;
 
     /** Name of the histogram output file **/
     TString fOutFileName{"HistosEventBuilder.root"};
diff --git a/fles/mcbm2018/tasks/CbmMcbm2019TimeWinEventBuilderAlgo.cxx b/fles/mcbm2018/tasks/CbmMcbm2019TimeWinEventBuilderAlgo.cxx
index 020d3710ea2bd19f1d5e826195bca2b4b317f94f..d3e03da7c3b24c6dd608b409cc0a52e587b30542 100644
--- a/fles/mcbm2018/tasks/CbmMcbm2019TimeWinEventBuilderAlgo.cxx
+++ b/fles/mcbm2018/tasks/CbmMcbm2019TimeWinEventBuilderAlgo.cxx
@@ -816,86 +816,145 @@ void CbmMcbm2019TimeWinEventBuilderAlgo::AddDigiToEvent( ECbmModuleId _system, I
 
 Bool_t CbmMcbm2019TimeWinEventBuilderAlgo::HasTrigger(CbmEvent* event)
 {
-  Bool_t hasTrigger{ kTRUE };
-  if ( (fT0DigiVec ) && fuTriggerMinT0Digis > 0) {
-    Int_t iNbDigis = event->GetNofData( ECbmDataType::kT0Digi );
-    hasTrigger = hasTrigger && ( -1 != iNbDigis ) &&
-                 ( static_cast< UInt_t >( iNbDigis ) >= fuTriggerMinT0Digis );
-    if( !hasTrigger )
-    {
-       LOG( debug2 ) << "Event does not have enough T0 digis: " << iNbDigis
-                    << " vs " << fuTriggerMinT0Digis;
-       return hasTrigger;
-    } // if( !hasTrigger )
-  }
-  if (fDigiMan->IsPresent(ECbmModuleId::kSts) && fuTriggerMinStsDigis > 0) {
-    Int_t iNbDigis = event->GetNofData( ECbmDataType::kStsDigi );
-    hasTrigger = hasTrigger && ( -1 != iNbDigis ) &&
-                 ( static_cast< UInt_t >( iNbDigis ) >= fuTriggerMinStsDigis );
-    if( !hasTrigger )
-    {
-       LOG( debug2 ) << "Event does not have enough STS digis: " << iNbDigis
-                    << " vs " << fuTriggerMinStsDigis;
-       return hasTrigger;
-    } // if( !hasTrigger )
-  }
-  if (fDigiMan->IsPresent(ECbmModuleId::kMuch) && fuTriggerMinMuchDigis > 0) {
-    Int_t iNbDigis = event->GetNofData( ECbmDataType::kMuchDigi );
-    hasTrigger = hasTrigger && ( -1 != iNbDigis ) &&
-                 ( static_cast< UInt_t >( iNbDigis ) >= fuTriggerMinMuchDigis );
-    if( !hasTrigger )
-    {
-       LOG( debug2 ) << "Event does not have enough MUCH digis: " << iNbDigis
-                    << " vs " << fuTriggerMinMuchDigis;
-       return hasTrigger;
-    } // if( !hasTrigger )
-  }
-  if (fDigiMan->IsPresent(ECbmModuleId::kTrd) && fuTriggerMinTrdDigis > 0) {
-    Int_t iNbDigis = event->GetNofData( ECbmDataType::kTrdDigi );
-    hasTrigger = hasTrigger && ( -1 != iNbDigis ) &&
-                 ( static_cast< UInt_t >( iNbDigis ) >= fuTriggerMinTrdDigis );
-    if( !hasTrigger )
-    {
-       LOG( debug2 ) << "Event does not have enough TRD digis: " << iNbDigis
-                    << " vs " << fuTriggerMinTrdDigis;
-       return hasTrigger;
-    } // if( !hasTrigger )
-  }
-  if (fDigiMan->IsPresent(ECbmModuleId::kTof) && fuTriggerMinTofDigis > 0) {
-    Int_t iNbDigis = event->GetNofData( ECbmDataType::kTofDigi );
-    hasTrigger = hasTrigger && ( -1 != iNbDigis ) &&
-                 ( static_cast< UInt_t >( iNbDigis ) >= fuTriggerMinTofDigis);
-    if( !hasTrigger )
-    {
-       LOG( debug2 ) << "Event does not have enough TOF digis: " << iNbDigis
-                    << " vs " << fuTriggerMinTofDigis;
-       return hasTrigger;
-    } // if( !hasTrigger )
-  }
-  if (fDigiMan->IsPresent(ECbmModuleId::kRich) && fuTriggerMinRichDigis > 0) {
-    Int_t iNbDigis = event->GetNofData( ECbmDataType::kRichDigi );
-    hasTrigger = hasTrigger && ( -1 != iNbDigis ) &&
-                 ( static_cast< UInt_t >( iNbDigis ) >= fuTriggerMinRichDigis );
-    if( !hasTrigger )
-    {
-       LOG( debug2 ) << "Event does not have enough RICH digis: " << iNbDigis
-                    << " vs " << fuTriggerMinRichDigis;
-       return hasTrigger;
-    } // if( !hasTrigger )
-  }
-  if (fDigiMan->IsPresent(ECbmModuleId::kPsd) && fuTriggerMinPsdDigis > 0) {
-    Int_t iNbDigis = event->GetNofData( ECbmDataType::kPsdDigi );
-    hasTrigger = hasTrigger && ( -1 != iNbDigis ) &&
-                 ( static_cast< UInt_t >( iNbDigis ) >= fuTriggerMinPsdDigis );
-    if( !hasTrigger )
-    {
-       LOG( debug2 ) << "Event does not have enough PSD digis: " << iNbDigis
-                    << " vs " << fuTriggerMinPsdDigis;
-       return hasTrigger;
-    } // if( !hasTrigger )
-  }
+  /// Check multiplicity trigger conditions
+  if( CheckTriggerConditions( event, ECbmModuleId::kT0,   ECbmDataType::kT0Digi   ) &&
+      CheckTriggerConditions( event, ECbmModuleId::kSts,  ECbmDataType::kStsDigi  ) &&
+      CheckTriggerConditions( event, ECbmModuleId::kMuch, ECbmDataType::kMuchDigi ) &&
+      CheckTriggerConditions( event, ECbmModuleId::kTrd,  ECbmDataType::kTrdDigi  ) &&
+      CheckTriggerConditions( event, ECbmModuleId::kTof,  ECbmDataType::kTofDigi  ) &&
+      CheckTriggerConditions( event, ECbmModuleId::kRich, ECbmDataType::kRichDigi ) &&
+      CheckTriggerConditions( event, ECbmModuleId::kPsd,  ECbmDataType::kPsdDigi  )
+    )
+  {
+    return kTRUE;
+  } // if all trigger conditions fullfilled
+    else
+    {
+      return kFALSE;
+    } // if at least one trigger condition failed
+}
 
-  return hasTrigger;
+Bool_t CbmMcbm2019TimeWinEventBuilderAlgo::CheckTriggerConditions( CbmEvent* event, ECbmModuleId det, ECbmDataType dataType )
+{
+  UInt_t uTrigMin =  0;
+  Int_t  iTrigMax = -1;
+  std::string sDet = "";
+  switch( det )
+  {
+    case ECbmModuleId::kSts:
+    {
+      uTrigMin = fuTriggerMinStsDigis;
+      iTrigMax = fiTriggerMaxStsDigis;
+      sDet = "STS";
+      break;
+    }
+    case ECbmModuleId::kRich:
+    {
+      uTrigMin = fuTriggerMinRichDigis;
+      iTrigMax = fiTriggerMaxRichDigis;
+      sDet = "RICH";
+      break;
+    }
+    case ECbmModuleId::kMuch:
+    {
+      uTrigMin = fuTriggerMinMuchDigis;
+      iTrigMax = fiTriggerMaxMuchDigis;
+      sDet = "MUCH";
+      break;
+    }
+    case ECbmModuleId::kTrd:
+    {
+      uTrigMin = fuTriggerMinTrdDigis;
+      iTrigMax = fiTriggerMaxTrdDigis;
+      sDet = "TRD";
+      break;
+    }
+    case ECbmModuleId::kTof:
+    {
+      uTrigMin = fuTriggerMinTofDigis;
+      iTrigMax = fiTriggerMaxTofDigis;
+      sDet = "TOF";
+      break;
+    }
+    case ECbmModuleId::kPsd:
+    {
+      uTrigMin = fuTriggerMinPsdDigis;
+      iTrigMax = fiTriggerMaxPsdDigis;
+      sDet = "PSD";
+      break;
+    }
+    case ECbmModuleId::kT0:
+    {
+      uTrigMin = fuTriggerMinT0Digis;
+      iTrigMax = fiTriggerMaxT0Digis;
+      sDet = "T0";
+      break;
+    }
+    default:
+    {
+      LOG( fatal ) << "CbmMcbm2019TimeWinEventBuilderAlgo::CheckTriggerConditions => "
+                   << "Unsupported or unknow detector enum";
+      break;
+    }
+  } // switch( det )
+
+  /// Check if both Trigger conditions disabled for this detector
+  if( 0 == uTrigMin && iTrigMax < 0 )
+  {
+    return kTRUE;
+  } // if( 0 == uTrigMin && iTrigMax < 0 )
+
+  /// Check if detector present
+  if( ECbmModuleId::kT0 == det )
+  {
+    /// FIXME: special case to be removed once T0 supported by DigiManager
+    if( !(fT0DigiVec) )
+    {
+       LOG( warning ) << "Event does not have digis storage for T0"
+                      << " while the following trigger minimum is defined: "
+                      << uTrigMin;
+      return kFALSE;
+    } // if( !(fT0DigiVec) )
+  } // if( ECbmDataType::kT0Digi == det )
+    else
+    {
+      if( !fDigiMan->IsPresent( det ) )
+      {
+         LOG( warning ) << "Event does not have digis storage for " << sDet
+                        << " while the following trigger minimum is defined: "
+                        << uTrigMin;
+        return kFALSE;
+      } // if( !fDigiMan->IsPresent( det ) )
+    } // else of if( ECbmDataType::kT0Digi == det )
+
+  /// Check Minimal trigger acceptance by minimal number
+  Int_t iNbDigis = event->GetNofData( dataType );
+  if( ( -1 != iNbDigis ) &&
+      ( uTrigMin <= static_cast< UInt_t >( iNbDigis )  )
+    )
+  {
+    return kTRUE;
+  } // if( ( -1 != iNbDigis ) && ( uTrigMin <= static_cast< UInt_t >( iNbDigis )  )
+    else
+    {
+       LOG( debug2 ) << "Event does not have enough digis: " << iNbDigis
+                    << " vs " << uTrigMin
+                    << " for " << sDet;
+       return kFALSE;
+    } // else of if( ( -1 != iNbDigis ) && ( uTrigMin <= static_cast< UInt_t >( iNbDigis )  )
+
+  /// Check trigger rejection by maximal number
+  if( iNbDigis < iTrigMax )
+  {
+    return kTRUE;
+  } // if( iNbDigis < iTrigMax )
+    else
+    {
+       LOG( debug2 ) << "Event Has too many digis: " << iNbDigis
+                    << " vs " << iTrigMax
+                    << " for " << sDet;
+       return kFALSE;
+    } // else of if( iNbDigis < iTrigMax )
 }
 
 //----------------------------------------------------------------------
@@ -1001,6 +1060,31 @@ void CbmMcbm2019TimeWinEventBuilderAlgo::ResetHistograms( Bool_t /*bResetTime*/
 */
 }
 //----------------------------------------------------------------------
+void CbmMcbm2019TimeWinEventBuilderAlgo::SetReferenceDetector( ECbmModuleId refDet )
+{
+  for( std::vector< ECbmModuleId >::iterator det = fvDets.begin(); det != fvDets.end(); ++det )
+  {
+    if( *det  == refDet )
+    {
+      LOG( warning ) << "CbmMcbm2019TimeWinEventBuilderAlgo::SetReferenceDetector => Doing nothing, reference detector already in selection detector list!"
+                     << refDet;
+      LOG( warning ) << "                                                         => You may want to use RemoveDetector before this command to remove it?";
+      return;
+    } // if( *det  == selDet )
+  } // for( std::vector< ECbmModuleId >::iterator det = fvDets.begin(); det != fvDets.end(); ++det )
+
+  if( fRefDet == refDet )
+  {
+    LOG( warning ) << "CbmMcbm2019TimeWinEventBuilderAlgo::SetReferenceDetector => Doing nothing, identical reference detector already in use";
+  } // if( fRefDet == refDet )
+    else
+    {
+      LOG( info )    << "CbmMcbm2019TimeWinEventBuilderAlgo::SetReferenceDetector => Replacing " << fRefDet << " with " << refDet << " as reference detector";
+      LOG( warning ) << "                                                         => You may want to use AddDetector after this command to add in selection " << fRefDet;
+      LOG( warning ) << "                                                         => Please also remember to update the selection windows!";
+      fRefDet = refDet;
+    } // else of if( fRefDet == refDet )
+}
 void CbmMcbm2019TimeWinEventBuilderAlgo::AddDetector( ECbmModuleId selDet )
 {
   /// FIXME: This is not true in case TOF is used as reference !!!!!
@@ -1090,6 +1174,64 @@ void CbmMcbm2019TimeWinEventBuilderAlgo::SetTriggerMinNumber( ECbmModuleId selDe
 
   LOG( debug ) << "Set Trigger min limit for " << sDet << " to " << uVal;
 }
+void CbmMcbm2019TimeWinEventBuilderAlgo::SetTriggerMaxNumber( ECbmModuleId selDet, Int_t iVal )
+{
+  /// Store in corresponding members
+  std::string sDet = "";
+  switch( selDet )
+  {
+    case ECbmModuleId::kSts:
+    {
+      fiTriggerMaxStsDigis  = iVal;
+      sDet = "STS";
+      break;
+    }
+    case ECbmModuleId::kRich:
+    {
+      fiTriggerMaxRichDigis = iVal;
+      sDet = "RICH";
+      break;
+    }
+    case ECbmModuleId::kMuch:
+    {
+      fiTriggerMaxMuchDigis  = iVal;
+      sDet = "MUCH";
+      break;
+    }
+    case ECbmModuleId::kTrd:
+    {
+      fiTriggerMaxTrdDigis  = iVal;
+      sDet = "TRD";
+      break;
+    }
+    case ECbmModuleId::kTof:
+    {
+      fiTriggerMaxTofDigis = iVal;
+      sDet = "TOF";
+      break;
+    }
+    case ECbmModuleId::kPsd:
+    {
+      fiTriggerMaxPsdDigis  = iVal;
+      sDet = "PSD";
+      break;
+    }
+    case ECbmModuleId::kT0:
+    {
+      fiTriggerMaxT0Digis   = iVal;
+      sDet = "T0";
+      break;
+    }
+    default:
+    {
+      LOG( fatal ) << "CbmMcbm2019TimeWinEventBuilderAlgo::SetTriggerMaxNumber => "
+                   << "Unsupported or unknow detector enum";
+      break;
+    }
+  } // switch( det )
+
+  LOG( debug ) << "Set Trigger nax limit for " << sDet << " to " << iVal;
+}
 void CbmMcbm2019TimeWinEventBuilderAlgo::SetTriggerWindow( ECbmModuleId det, Double_t dWinBeg, Double_t dWinEnd )
 {
   /// Check if valid time window: end strictly after beginning
diff --git a/fles/mcbm2018/tasks/CbmMcbm2019TimeWinEventBuilderAlgo.h b/fles/mcbm2018/tasks/CbmMcbm2019TimeWinEventBuilderAlgo.h
index b9d5fe3fe8fe8e77acae74b55b9901ddb082464d..da70664485a4ab32c3deb4ad2e0c8a4d0d8e838c 100644
--- a/fles/mcbm2018/tasks/CbmMcbm2019TimeWinEventBuilderAlgo.h
+++ b/fles/mcbm2018/tasks/CbmMcbm2019TimeWinEventBuilderAlgo.h
@@ -59,18 +59,12 @@ class CbmMcbm2019TimeWinEventBuilderAlgo
     void SetFillHistos( Bool_t var ) { fbFillHistos = var; }
     void ResetHistograms( Bool_t bResetTime = kTRUE );
 
-    void SetReferenceDetector( ECbmModuleId refDet ) { fRefDet = refDet; }
+    void SetReferenceDetector( ECbmModuleId refDet );
     void AddDetector( ECbmModuleId selDet );
     void RemoveDetector( ECbmModuleId selDet );
 
     void SetTriggerMinNumber( ECbmModuleId selDet, UInt_t uVal );
-    void SetTriggerMinNumberT0(   UInt_t uVal ) { fuTriggerMinT0Digis   = uVal;}
-    void SetTriggerMinNumberSts(  UInt_t uVal ) { fuTriggerMinStsDigis  = uVal;}
-    void SetTriggerMinNumberMuch( UInt_t uVal ) { fuTriggerMinMuchDigis = uVal;}
-    void SetTriggerMinNumberTrd(  UInt_t uVal ) { fuTriggerMinTrdDigis  = uVal;}
-    void SetTriggerMinNumberTof(  UInt_t uVal ) { fuTriggerMinTofDigis  = uVal;}
-    void SetTriggerMinNumberRich( UInt_t uVal ) { fuTriggerMinRichDigis = uVal;}
-    void SetTriggerMinNumberPsd(  UInt_t uVal ) { fuTriggerMinPsdDigis  = uVal;}
+    void SetTriggerMaxNumber( ECbmModuleId selDet, Int_t iVal );
 
     void SetTriggerWindow( ECbmModuleId det, Double_t dWinBeg, Double_t dWinEnd );
 
@@ -103,6 +97,7 @@ class CbmMcbm2019TimeWinEventBuilderAlgo
     template< class DigiCheck > void SearchMatches( Double_t dSeedTime, ECbmModuleId detMatch, UInt_t & uStartIndex );
     void AddDigiToEvent( ECbmModuleId det, Int_t uIdx );
     Bool_t HasTrigger(CbmEvent*);
+    Bool_t CheckTriggerConditions( CbmEvent* event, ECbmModuleId det, ECbmDataType dataType );
 
     void UpdateTimeWinBoundariesExtrema();
     void UpdateWidestTimeWinRange();
@@ -135,6 +130,14 @@ class CbmMcbm2019TimeWinEventBuilderAlgo
     UInt_t fuTriggerMinRichDigis{0};
     /** Minimum number of Psd digis needed to generate a trigger, 0 means don't use Psd for trigger generation **/
     UInt_t fuTriggerMinPsdDigis{0};
+         /// Maximum number of digis per detector to generate an event, -1 means no cut, 0 means anti-coinc trigger
+    Int_t fiTriggerMaxT0Digis   = -1;
+    Int_t fiTriggerMaxStsDigis  = -1;
+    Int_t fiTriggerMaxMuchDigis = -1;
+    Int_t fiTriggerMaxTrdDigis  = -1;
+    Int_t fiTriggerMaxTofDigis  = -1;
+    Int_t fiTriggerMaxRichDigis = -1;
+    Int_t fiTriggerMaxPsdDigis  = -1;
          /// Trigger Window
     Double_t fdRefTimeWinBeg  = 0.0;
     Double_t fdT0TimeWinBeg   = 0.0;
diff --git a/fles/mcbm2018/tasks/CbmMcbm2019TimeWinEventBuilderTask.cxx b/fles/mcbm2018/tasks/CbmMcbm2019TimeWinEventBuilderTask.cxx
index 9fb0c767c9fc04da36eba5adad89104fd559614d..9f406dd74353961a6017c5d67ee60a725fcf03d3 100644
--- a/fles/mcbm2018/tasks/CbmMcbm2019TimeWinEventBuilderTask.cxx
+++ b/fles/mcbm2018/tasks/CbmMcbm2019TimeWinEventBuilderTask.cxx
@@ -172,40 +172,15 @@ void CbmMcbm2019TimeWinEventBuilderTask::RemoveDetector( ECbmModuleId selDet )
       fpAlgo->RemoveDetector( selDet );
 }
 
-void CbmMcbm2019TimeWinEventBuilderTask::SetTriggerMinNumberT0(   UInt_t uVal )
+void CbmMcbm2019TimeWinEventBuilderTask::SetTriggerMinNumber( ECbmModuleId selDet, UInt_t uVal )
 {
    if( nullptr != fpAlgo  )
-      fpAlgo->SetTriggerMinNumberT0( uVal );
+      fpAlgo->SetTriggerMinNumber( selDet, uVal );
 }
-void CbmMcbm2019TimeWinEventBuilderTask::SetTriggerMinNumberSts(  UInt_t uVal )
+void CbmMcbm2019TimeWinEventBuilderTask::SetTriggerMaxNumber( ECbmModuleId selDet, Int_t iVal )
 {
    if( nullptr != fpAlgo  )
-      fpAlgo->SetTriggerMinNumberSts( uVal );
-}
-void CbmMcbm2019TimeWinEventBuilderTask::SetTriggerMinNumberMuch( UInt_t uVal )
-{
-   if( nullptr != fpAlgo  )
-      fpAlgo->SetTriggerMinNumberMuch( uVal );
-}
-void CbmMcbm2019TimeWinEventBuilderTask::SetTriggerMinNumberTrd(  UInt_t uVal )
-{
-   if( nullptr != fpAlgo  )
-      fpAlgo->SetTriggerMinNumberTrd( uVal );
-}
-void CbmMcbm2019TimeWinEventBuilderTask::SetTriggerMinNumberTof(  UInt_t uVal )
-{
-   if( nullptr != fpAlgo  )
-      fpAlgo->SetTriggerMinNumberTof( uVal );
-}
-void CbmMcbm2019TimeWinEventBuilderTask::SetTriggerMinNumberRich( UInt_t uVal )
-{
-   if( nullptr != fpAlgo  )
-      fpAlgo->SetTriggerMinNumberRich( uVal );
-}
-void CbmMcbm2019TimeWinEventBuilderTask::SetTriggerMinNumberPsd(  UInt_t uVal )
-{
-   if( nullptr != fpAlgo  )
-      fpAlgo->SetTriggerMinNumberPsd( uVal );
+      fpAlgo->SetTriggerMaxNumber( selDet, iVal );
 }
 
 void CbmMcbm2019TimeWinEventBuilderTask::SetTriggerWindow( ECbmModuleId det, Double_t dWinBeg, Double_t dWinEnd )
diff --git a/fles/mcbm2018/tasks/CbmMcbm2019TimeWinEventBuilderTask.h b/fles/mcbm2018/tasks/CbmMcbm2019TimeWinEventBuilderTask.h
index c2b6b98170ca16dd578349d8eaf0f56ffb245ae3..c7f10a36cd8f58bdd86963ddca7cb323be723f8f 100644
--- a/fles/mcbm2018/tasks/CbmMcbm2019TimeWinEventBuilderTask.h
+++ b/fles/mcbm2018/tasks/CbmMcbm2019TimeWinEventBuilderTask.h
@@ -67,13 +67,8 @@ class CbmMcbm2019TimeWinEventBuilderTask : public FairTask
     void AddDetector( ECbmModuleId selDet );
     void RemoveDetector( ECbmModuleId selDet );
 
-    void SetTriggerMinNumberT0(   UInt_t uVal );
-    void SetTriggerMinNumberSts(  UInt_t uVal );
-    void SetTriggerMinNumberMuch( UInt_t uVal );
-    void SetTriggerMinNumberTrd(  UInt_t uVal );
-    void SetTriggerMinNumberTof(  UInt_t uVal );
-    void SetTriggerMinNumberRich( UInt_t uVal );
-    void SetTriggerMinNumberPsd(  UInt_t uVal );
+    void SetTriggerMinNumber( ECbmModuleId selDet, UInt_t uVal );
+    void SetTriggerMaxNumber( ECbmModuleId selDet, Int_t iVal );
 
     void SetTriggerWindow( ECbmModuleId det, Double_t dWinBeg, Double_t dWinEnd );
 
diff --git a/macro/beamtime/mcbm2020/build_event_win.C b/macro/beamtime/mcbm2020/build_event_win.C
index f7bf55c9eafc771332a31b0fa2ec29f4c6b7b9fb..ec90bbae4318eba136037fa2667f0c08894b174f 100644
--- a/macro/beamtime/mcbm2020/build_event_win.C
+++ b/macro/beamtime/mcbm2020/build_event_win.C
@@ -61,13 +61,13 @@ void build_event_win( UInt_t uRunId = 0, Int_t nEvents = 0, TString outDir="data
   eventBuilder->SetTriggerWindow( ECbmModuleId::kRich, -150,  20 );
   eventBuilder->SetTriggerWindow( ECbmModuleId::kPsd,   -50,  10 );
 //  eventBuilder->SetT0PulserTotLimits(   185, 191 );
-  eventBuilder->SetTriggerMinNumberT0(1);
-  eventBuilder->SetTriggerMinNumberSts(0);
-  eventBuilder->SetTriggerMinNumberMuch(0);
-  eventBuilder->SetTriggerMinNumberTrd(0);
-  eventBuilder->SetTriggerMinNumberTof(10);
-  eventBuilder->SetTriggerMinNumberRich(0);
-  eventBuilder->SetTriggerMinNumberPsd(0);
+  eventBuilder->SetTriggerMinNumber( ECbmModuleId::kT0,    1 );
+  eventBuilder->SetTriggerMinNumber( ECbmModuleId::kSts,   0 );
+  eventBuilder->SetTriggerMinNumber( ECbmModuleId::kMuch,  0 );
+  eventBuilder->SetTriggerMinNumber( ECbmModuleId::kTrd,   0 );
+  eventBuilder->SetTriggerMinNumber( ECbmModuleId::kTof,  10 );
+  eventBuilder->SetTriggerMinNumber( ECbmModuleId::kRich,  0 );
+  eventBuilder->SetTriggerMinNumber( ECbmModuleId::kPsd,   0 );
   if( 0 < uRunId )
     eventBuilder->SetOutFilename( Form( "%sHistosEvtWin_%03u.root", outDir.Data(), uRunId ) );
 
diff --git a/macro/beamtime/mcbm2020/build_event_win_kronos.C b/macro/beamtime/mcbm2020/build_event_win_kronos.C
index 1b436c4082ab7f309ec32027f8e46210bb6ed9fb..34f113fa57c159c19119173d4a374fc87cd1fd63 100644
--- a/macro/beamtime/mcbm2020/build_event_win_kronos.C
+++ b/macro/beamtime/mcbm2020/build_event_win_kronos.C
@@ -88,13 +88,13 @@ void build_event_win_kronos( UInt_t uRunIdx = 0, Int_t nEvents = 0, TString outD
   eventBuilder->SetTriggerWindow( ECbmModuleId::kRich, -150,  20 );
   eventBuilder->SetTriggerWindow( ECbmModuleId::kPsd,   -50,  10 );
 //  eventBuilder->SetT0PulserTotLimits(   185, 191 );
-  eventBuilder->SetTriggerMinNumberT0(1);
-  eventBuilder->SetTriggerMinNumberSts(0);
-  eventBuilder->SetTriggerMinNumberMuch(0);
-  eventBuilder->SetTriggerMinNumberTrd(0);
-  eventBuilder->SetTriggerMinNumberTof(10);
-  eventBuilder->SetTriggerMinNumberRich(0);
-  eventBuilder->SetTriggerMinNumberPsd(0);
+  eventBuilder->SetTriggerMinNumber( ECbmModuleId::kT0,    1 );
+  eventBuilder->SetTriggerMinNumber( ECbmModuleId::kSts,   0 );
+  eventBuilder->SetTriggerMinNumber( ECbmModuleId::kMuch,  0 );
+  eventBuilder->SetTriggerMinNumber( ECbmModuleId::kTrd,   0 );
+  eventBuilder->SetTriggerMinNumber( ECbmModuleId::kTof,  10 );
+  eventBuilder->SetTriggerMinNumber( ECbmModuleId::kRich,  0 );
+  eventBuilder->SetTriggerMinNumber( ECbmModuleId::kPsd,   0 );
   if( 0 < uRunId )
     eventBuilder->SetOutFilename( Form( "%sHistosEvtWin_%03u.root", outDir.Data(), uRunId ) );