diff --git a/algo/base/DigiData.cxx b/algo/base/DigiData.cxx
index 179c8ca31508e322b1bd1222b70bc417a9aafd7b..79fd5a4836022d2caae819e0715f3fcf0a1ecfe7 100644
--- a/algo/base/DigiData.cxx
+++ b/algo/base/DigiData.cxx
@@ -119,14 +119,16 @@ DigiEvent::DigiEvent(const CbmDigiEvent& storable)
   : DigiData(storable.fData)
   , fNumber(storable.fNumber)
   , fTime(storable.fTime)
+  , fSelectionTriggers(storable.fSelectionTriggers)
 {
 }
 
 CbmDigiEvent DigiEvent::ToStorable() const
 {
   return CbmDigiEvent{
-    .fData   = DigiData::ToStorable(),
-    .fNumber = fNumber,
-    .fTime   = fTime,
+    .fData              = DigiData::ToStorable(),
+    .fNumber            = fNumber,
+    .fTime              = fTime,
+    .fSelectionTriggers = fSelectionTriggers,
   };
 }
diff --git a/algo/base/DigiData.h b/algo/base/DigiData.h
index c19b685d996ea4fadc68b7c50e170f356e3c3a44..09b82d933478c57b65087b93e1d0a799120d287b 100644
--- a/algo/base/DigiData.h
+++ b/algo/base/DigiData.h
@@ -7,6 +7,7 @@
 #include "CbmBmonDigi.h"
 #include "CbmDigiData.h"
 #include "CbmDigiEvent.h"
+#include "CbmEventTriggers.h"
 #include "CbmFsdDigi.h"
 #include "CbmMuchDigi.h"
 #include "CbmPsdDigi.h"
@@ -80,6 +81,7 @@ namespace cbm::algo
     // FIXME: Event number not set yet!
     uint64_t fNumber = -1;  ///< Event identifier
     double fTime     = 0;   ///< Event trigger time [ns]
+    CbmEventTriggers fSelectionTriggers;
 
     static std::vector<DigiEvent> FromCbmDigiEvents(const std::vector<CbmDigiEvent>& events);
     static std::vector<CbmDigiEvent> ToCbmDigiEvents(const std::vector<DigiEvent>& events);
diff --git a/algo/evselector/RecoEventSelectorMonitor.h b/algo/evselector/RecoEventSelectorMonitor.h
index de2eb4a27eb94094ab06e4c0f877bec9d86f8b53..ae6524f804edd794bb3ec7bc0d3a377c64ba2946 100644
--- a/algo/evselector/RecoEventSelectorMonitor.h
+++ b/algo/evselector/RecoEventSelectorMonitor.h
@@ -19,12 +19,14 @@ namespace cbm::algo::evselect
   /// \brief Counter keys for the event selector monitor
   enum class ECounter
   {
+    Timeslices,        ///< number of processed timeslices
     EventsTotal,       ///< Total number of events processed
     EventsNeStsHits,   ///< Events with not enough STS hits
     EventsNeTofHits,   ///< Events with enough STS hits, but not enough TOF hits
     EventsNeBmonHits,  ///< Events with not enough BMon hits
     EventsNeTracks,    ///< Events with enough hits, but not enough tracks
     EventsSelected,    ///< Number of selected events
+    LambdaCandidates,  ///< Number of lambda-candidates, returned by KFParticleFinder
     END
   };
 
@@ -53,11 +55,13 @@ namespace cbm::algo::evselect
     /// \brief Default constructor
     Monitor() : ca::Monitor<ECounter, ETimer>("Event-selector Monitor")
     {
+      SetCounterName(ECounter::Timeslices, "processed timeslices");
       SetCounterName(ECounter::EventsTotal, "total events");
       SetCounterName(ECounter::EventsNeStsHits, "events discarded by N STS hits");
       SetCounterName(ECounter::EventsNeTofHits, "events discarded by N TOF hits");
       SetCounterName(ECounter::EventsNeBmonHits, "events discarded by N BMon hits");
       SetCounterName(ECounter::EventsNeTracks, "events discarded by N tracks");
+      SetCounterName(ECounter::LambdaCandidates, "potential lambda candidates");
       SetCounterName(ECounter::EventsSelected, "selected events");
 
       SetTimerName(ETimer::EventReconstruction, "event reconstruction");
@@ -67,6 +71,8 @@ namespace cbm::algo::evselect
       SetTimerName(ETimer::TrdHitFinder, "hit finding in TRD");
       SetTimerName(ETimer::TrackFinder, "track finding");
       SetTimerName(ETimer::V0Finder, "V0 finding");
+
+      SetRatioKeys({ECounter::Timeslices});
     }
 
    private:
diff --git a/algo/global/Reco.cxx b/algo/global/Reco.cxx
index f312ebaaab85e36f0a9c689883a4e9c09e8ca13e..0f192df1b6c68934269a1eea7e5561b73dd6aa5d 100644
--- a/algo/global/Reco.cxx
+++ b/algo/global/Reco.cxx
@@ -45,10 +45,6 @@
 
 #include <xpu/host.h>
 
-// DEBUG: BEGIN
-#include <set>
-// DEBUG: END
-
 using namespace cbm::algo;
 using fles::Subsystem;
 
@@ -427,16 +423,16 @@ RecoResults Reco::Run(const fles::Timeslice& ts)
 
     // --- Reconstruct and select digi events
     if (fbReconstructDigiEvents) {
-      size_t nDiscardedEvents{0};
+      fEvSelectingMonitor.IncrementCounter(evselect::ECounter::Timeslices);
       fEvSelectingMonitor.IncrementCounter(evselect::ECounter::EventsTotal, events.size());
-      for (const auto& event : events) {
+      for (auto& event : events) {
         fEvSelectingMonitor.StartTimer(evselect::ETimer::EventReconstruction);
-        if (!ReconstructEvent(event)) {
-          ++nDiscardedEvents;
-        }
+        event.fSelectionTriggers = ReconstructEvent(event);
         fEvSelectingMonitor.StopTimer(evselect::ETimer::EventReconstruction);
       }
-      L_(info) << "Rate of discarded events " << double(nDiscardedEvents) / events.size();
+      auto v0FinderMonitor = fV0Finder->GetMonitor();
+      fEvSelectingMonitor.IncrementCounter(evselect::ECounter::LambdaCandidates,
+                                           v0FinderMonitor.GetCounterValue(kfp::ECounter::KfpLambdaCandidates));
     }
 
     // --- Filter data for output
@@ -525,8 +521,9 @@ void Reco::PrintTimings(xpu::timings& timings)
   }
 }
 
-bool Reco::ReconstructEvent(const DigiEvent& digiEvent)
+CbmEventTriggers Reco::ReconstructEvent(const DigiEvent& digiEvent)
 {
+  CbmEventTriggers triggers(0);
   RecoResults recoEvent;
   //* BMON hit reconstruction
   {
@@ -550,7 +547,7 @@ bool Reco::ReconstructEvent(const DigiEvent& digiEvent)
     fEvSelectingMonitor.StopTimer(evselect::ETimer::StsHitFinder);
     if (stsResults.hits.NElements() < 4) {  // TODO: Provide a config for cuts (testing mode for now)
       fEvSelectingMonitor.IncrementCounter(evselect::ECounter::EventsNeStsHits);
-      return false;
+      return triggers;
     }
     recoEvent.stsHits = stsResults.hits;
   }
@@ -563,7 +560,7 @@ bool Reco::ReconstructEvent(const DigiEvent& digiEvent)
     fEvSelectingMonitor.StopTimer(evselect::ETimer::TofHitFinder);
     if (hits.NElements() < 2) {  // TODO: Provide a config for cuts (testing mode for now)
       fEvSelectingMonitor.IncrementCounter(evselect::ECounter::EventsNeTofHits);
-      return false;
+      return triggers;
     }
     recoEvent.tofHits = std::move(hits);
   }
@@ -597,18 +594,19 @@ bool Reco::ReconstructEvent(const DigiEvent& digiEvent)
     fEvSelectingMonitor.StopTimer(evselect::ETimer::TrackFinder);
     if (recoEvent.tracks.size() < 2) {  // Reject all events with less then two tracks
       fEvSelectingMonitor.IncrementCounter(evselect::ECounter::EventsNeTracks);
-      return false;
+      return triggers;
     }
   }
 
   //* V0-selector
   fEvSelectingMonitor.StartTimer(evselect::ETimer::V0Finder);
-  auto triggers = fV0Finder->ProcessEvent(recoEvent);
+  triggers = fV0Finder->ProcessEvent(recoEvent);
+  if (triggers.Test(CbmEventTriggers::ETrigger::Lambda)) {
+    L_(info) << "!!! Found event with potential lambda candidates";
+    fEvSelectingMonitor.IncrementCounter(evselect::ECounter::EventsSelected);
+  }
   fEvSelectingMonitor.StopTimer(evselect::ETimer::V0Finder);
-
-
-  fEvSelectingMonitor.IncrementCounter(evselect::ECounter::EventsSelected);
-  return true;
+  return triggers;
 }
 
 
diff --git a/algo/global/Reco.h b/algo/global/Reco.h
index eb8ba804acabac619f33f00f9c84bf5b6074fcee..35cb5c34626c8dc84ba994478e83a305522cfd98 100644
--- a/algo/global/Reco.h
+++ b/algo/global/Reco.h
@@ -11,6 +11,8 @@
 #include <xpu/host.h>
 
 // fwd declarations
+class CbmEventTriggers;
+
 namespace fles
 {
   class Timeslice;
@@ -133,7 +135,7 @@ namespace cbm::algo
     void Init(const Options&);
     RecoResults Run(const fles::Timeslice&);
 
-    bool ReconstructEvent(const DigiEvent& event);
+    CbmEventTriggers ReconstructEvent(const DigiEvent& event);
     void Finalize();
     void PrintTimings(xpu::timings&);
 
diff --git a/algo/kfp/KfpV0FinderChain.cxx b/algo/kfp/KfpV0FinderChain.cxx
index e23bc9e812d3bfd6357e011032e448830fd23c4d..96dc60a593ee94df51cfde7a736e4f1c15c541a8 100644
--- a/algo/kfp/KfpV0FinderChain.cxx
+++ b/algo/kfp/KfpV0FinderChain.cxx
@@ -27,7 +27,21 @@ V0FinderChain::V0FinderChain(const std::unique_ptr<qa::Manager>& qaManager)
 
 // ---------------------------------------------------------------------------------------------------------------------
 //
-void V0FinderChain::Finalize() { L_(info) << fMonitorRun.ToString(); }
+void V0FinderChain::Finalize()
+{
+  GetMonitor();  // A hack to update the run monitor
+  L_(info) << fMonitorRun.ToString();
+}
+
+// ---------------------------------------------------------------------------------------------------------------------
+//
+cbm::algo::kfp::V0FinderMonitorData_t V0FinderChain::GetMonitor()
+{
+  cbm::algo::kfp::V0FinderMonitorData_t monitorData = fMonitorTimeslice;
+  fMonitorTimeslice.Reset();
+  fMonitorRun.AddMonitorData(monitorData);
+  return monitorData;
+}
 
 // ---------------------------------------------------------------------------------------------------------------------
 //
@@ -76,8 +90,6 @@ try {
   }
   const auto& pion{particles[iPion]};
   const auto& proton{particles[iProton]};
-  L_(info) << "!!!!!!!!!!! > pion:   " << pion.minDca;
-  L_(info) << "!!!!!!!!!!! > proton: " << proton.minDca;
 
   // ----- Define a BMON diamond
   if (fBmonDefinedAddresses.empty()) {
@@ -139,12 +151,10 @@ catch (const std::exception& err) {
 //
 V0FinderChain::EventOutput V0FinderChain::ProcessEvent(const RecoResults& recoEvent)
 {
-  EventOutput res;
-  res.triggers = fFinder.Process(recoEvent);
-  res.monitor  = fFinder.GetEventMonitor();
+  EventOutput res = fFinder.Process(recoEvent);
   if (fpFinderQa != nullptr) {
     fpFinderQa->Exec(recoEvent, fFinder);
   }
-  fMonitorRun.AddMonitorData(res.monitor);
+  fMonitorTimeslice.AddMonitorData(fFinder.GetEventMonitor());
   return res;
 }
diff --git a/algo/kfp/KfpV0FinderChain.h b/algo/kfp/KfpV0FinderChain.h
index 8053c93f79f686f5952542afa68e706a89c90f6d..95f10ebbab5e8c6c6086e8ce00d5a1c3ad4fa2ab 100644
--- a/algo/kfp/KfpV0FinderChain.h
+++ b/algo/kfp/KfpV0FinderChain.h
@@ -31,12 +31,7 @@ namespace cbm::algo
   /// \brief A chain for the V0 finder
   class V0FinderChain : public SubChain {
    public:
-    /// \struct EventOutput
-    /// \brief  Output from the event
-    struct EventOutput {
-      CbmEventTriggers triggers;           ///< Set of triggers
-      kfp::V0FinderMonitorData_t monitor;  ///< Monitor
-    };
+    using EventOutput = CbmEventTriggers;
 
     /// \brief Default constructor
     V0FinderChain() = default;
@@ -63,6 +58,9 @@ namespace cbm::algo
     /// \brief Finalizes the instance (called in the end of the run)
     void Finalize();
 
+    /// \brief Gets a monitor
+    kfp::V0FinderMonitorData_t GetMonitor();
+
     /// \brief Sets BMON diamond addresses array
     /// \note  The addresses must be taken from bmon::Hitfind::GetDiamondAddresses()
     void SetBmonDefinedAddresses(const PODVector<uint32_t>& addresses) { fBmonDefinedAddresses = addresses; }
@@ -76,6 +74,7 @@ namespace cbm::algo
    private:
     kfp::V0Finder fFinder;                                 ///< Instance of the V0-finding algorithm
     kfp::V0FinderMonitor fMonitorRun;                      ///< Monitor per run
+    kfp::V0FinderMonitorData_t fMonitorTimeslice;          ///< Monitor per timeslice
     std::unique_ptr<kfp::V0FinderQa> fpFinderQa{nullptr};  ///< QA module
     PODVector<uint32_t> fBmonDefinedAddresses;             ///< Available addresses of BMON
   };
diff --git a/algo/kfp/KfpV0FinderMonitor.h b/algo/kfp/KfpV0FinderMonitor.h
index 5bb4311b66902a148b6d3bb93d7461a1df31a089..d60d5b135478e2e6d379a26b69e8755d9b2bd96b 100644
--- a/algo/kfp/KfpV0FinderMonitor.h
+++ b/algo/kfp/KfpV0FinderMonitor.h
@@ -92,6 +92,8 @@ namespace cbm::algo::kfp
       SetTimerName(ETimer::PreselectTracks, "Track preselection");
       SetTimerName(ETimer::InitKfp, "KFParticleFinder initialization");
       SetTimerName(ETimer::ExecKfp, "KFParticleFinder execution");
+
+      SetRatioKeys({ECounter::EventsTotal, ECounter::TracksTotal, ECounter::TracksSelected});
     }
 
    private:
diff --git a/core/data/CbmEventTriggers.h b/core/data/CbmEventTriggers.h
index 841d86bd4a0bc680469527a9dfa2507c914a3cd6..a2c252df56bab630e79c7e776830b70e0fbbcd99 100644
--- a/core/data/CbmEventTriggers.h
+++ b/core/data/CbmEventTriggers.h
@@ -16,24 +16,30 @@
 #include <Rtypes.h>  // for ClassDef
 #endif
 
+#include <boost/serialization/access.hpp>
+
 /// \class CbmEventTriggers
 /// \brief Class to store different triggers for a given event
 class CbmEventTriggers {
  public:
   /// \enum   ETrigger
-  /// \brief  Defines a trigger address
-  enum class ETrigger : uint8_t
+  /// \brief  Defines a trigger bitmask
+  enum class ETrigger : uint32_t
   {
-    Lambda = 0b00000001,  ///< Lambda-trigger
-    Ks     = 0b00000010   ///< Ks-trigger
+    Lambda = 0x00000001,  ///< Lambda-trigger
+    Ks     = 0x00000002   ///< Ks-trigger
   };
 
   //using Trigger_t = std::underlying_type_t<ETrigger>;
-  using Trigger_t = uint8_t;
+  using Trigger_t = uint32_t;
 
   /// \brief Default constructor
   CbmEventTriggers() = default;
 
+  /// \brief A constructor from integer
+  /// \param bitmap  A bitmap of the triggers
+  explicit CbmEventTriggers(uint32_t bitmap) { fBitmap = bitmap; }
+
   /// \brief Copy constructor
   CbmEventTriggers(const CbmEventTriggers&) = default;
 
@@ -49,33 +55,47 @@ class CbmEventTriggers {
   /// \brief Move assignment operator
   CbmEventTriggers& operator=(CbmEventTriggers&&) = default;
 
+  /// \brief Gets a bitmap
+  /// \return bitmap  (integer)
+  Trigger_t GetBitmap() const { return fBitmap; }
+
   /// \brief Sets a trigger
   /// \param key  Trigger key
-  void Set(ETrigger key) { fTriggers |= static_cast<Trigger_t>(key); }
+  void Set(ETrigger key) { fBitmap |= static_cast<Trigger_t>(key); }
 
   /// \brief Resets a trigger
   /// \param key  Trigger key
-  void Reset(ETrigger key) { fTriggers &= ~static_cast<Trigger_t>(key); }
+  void Reset(ETrigger key) { fBitmap &= ~static_cast<Trigger_t>(key); }
+
+  /// \brief Resets all the triggers
+  void ResetAll() { fBitmap = 0; }
 
   /// \brief Tests a particular single trigger
   /// \param key  Trigger key
-  bool Test(ETrigger key) const { return static_cast<bool>(fTriggers & static_cast<Trigger_t>(key)); }
+  bool Test(ETrigger key) const { return static_cast<bool>(fBitmap & static_cast<Trigger_t>(key)); }
 
-  /// \brief Tests, if ALL the triggers in the mask are on
-  /// \param mask  Trigger mask
-  bool TestAll(Trigger_t mask) const { return mask == (fTriggers & mask); }
+  /// \brief Tests, if ALL the triggers in the bitmask are on
+  /// \param bitmask  Trigger bitmask
+  bool TestAll(Trigger_t bitmask) const { return bitmask == (fBitmap & bitmask); }
 
-  /// \brief Tests, if ANY of the triggers in the mask are on
-  /// \param mask  Trigger mask
-  bool TestAny(Trigger_t mask) const { return static_cast<bool>(fTriggers | mask); }
+  /// \brief Tests, if ANY of the triggers in the bitmask are on
+  /// \param bitmask  Trigger bitmask
+  bool TestAny(Trigger_t bitmask) const { return static_cast<bool>(fBitmap | bitmask); }
 
   /// \brief String representation of the class content
   std::string ToString() const;
 
  private:
-  Trigger_t fTriggers{0};
+  Trigger_t fBitmap{0};  ///< bitmap storing the triggers according to ETrigger
+
+  friend class boost::serialization::access;
+  template<class Archive>
+  void serialize(Archive& ar, const unsigned int /*version*/)
+  {
+    ar& fBitmap;
+  }
 
 #if !defined(NO_ROOT) && !XPU_IS_HIP_CUDA
-  ClassDefNV(CbmEventTriggers, 1);
+  ClassDefNV(CbmEventTriggers, 2);
 #endif
 };
diff --git a/core/data/global/CbmDigiEvent.h b/core/data/global/CbmDigiEvent.h
index 242740e57133ed58695947df108315761048f528..ec90985bbd4561a9c2a9ccfdef496caaa32b7ee7 100644
--- a/core/data/global/CbmDigiEvent.h
+++ b/core/data/global/CbmDigiEvent.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 2021-22 GSI Helmholtzzentrum fuer Schwerionenforschung, Darmstadt
+/* Copyright (C) 2021-25 GSI Helmholtzzentrum fuer Schwerionenforschung, Darmstadt
    SPDX-License-Identifier: GPL-3.0-only
    Authors: Volker Friese [committer] */
 
@@ -6,6 +6,7 @@
 #define CBMDIGIEVENT_H 1
 
 #include "CbmDigiData.h"
+#include "CbmEventTriggers.h"
 
 #include <boost/serialization/access.hpp>
 
@@ -14,29 +15,32 @@
  ** @brief Collection of digis from all detector systems within one event
  ** @author Volker Friese <v.friese@gsi.de>
  ** @since 7.12.2022
- ** @version 2.0
+ ** @version 3.0
  **/
 class CbmDigiEvent {
 
 public:
-  CbmDigiData fData;  ///< Event data
-  uint64_t fNumber;   ///< Event identifier
-  double fTime;       ///< Event trigger time [ns]
-
-
-  friend class boost::serialization::access;
-  /** @brief BOOST serializer**/
-  template<class Archive>
-  void serialize(Archive& ar, const unsigned int /*version*/)
-  {
-    ar& fData;
-    ar& fNumber;
-    ar& fTime;
-  }
+ CbmDigiData fData;                    ///< Event data
+ uint64_t fNumber;                     ///< Event identifier
+ double fTime;                         ///< Event trigger time [ns]
+ CbmEventTriggers fSelectionTriggers;  ///< Event selection triggers
+
+ friend class boost::serialization::access;
+ /** @brief BOOST serializer**/
+ template<class Archive>
+ void serialize(Archive& ar, const unsigned int version)
+ {
+   ar& fData;
+   ar& fNumber;
+   ar& fTime;
+   if (version >= 3) {
+     ar& fSelectionTriggers;
+   }
+ }
 
   // --- ROOT serializer
 #ifndef NO_ROOT
-  ClassDefNV(CbmDigiEvent, 2);
+ ClassDefNV(CbmDigiEvent, 3);
 #endif
 
   /** @brief Clear content **/
@@ -45,6 +49,7 @@ public:
     fData.Clear();
     fNumber = 0;
     fTime   = 0.;
+    fSelectionTriggers.ResetAll();
   }
 };