diff --git a/reco/app/cbmreco_fairrun/Application.cxx b/reco/app/cbmreco_fairrun/Application.cxx
index 24ca7f6e443a6cc7cd3d107c3fcc3c40140df525..eb4cc41101c5bacd1f17939250a0bda57db02c2d 100644
--- a/reco/app/cbmreco_fairrun/Application.cxx
+++ b/reco/app/cbmreco_fairrun/Application.cxx
@@ -16,8 +16,8 @@ Application::Application(ProgramOptions const& opt) : fOpt(opt)
   config.LoadYaml(fOpt.ConfigYamlFile());
   if (!fOpt.SaveConfigYamlFile().empty()) { config.SaveYaml(fOpt.SaveConfigYamlFile()); }
 
-  fCbmReco =
-    std::make_unique<CbmReco>(fOpt.InputUri(), fOpt.OutputRootFile(), fOpt.MaxNumTs(), config, fOpt.HttpServerPort());
+  fCbmReco = std::make_unique<CbmReco>(fOpt.InputUri(), fOpt.OutputRootFile(), fOpt.MaxNumTs(), config,
+                                       fOpt.HttpServerPort(), fMonitor.get());
 }
 
 void Application::Run() { fCbmReco->Run(); }
diff --git a/reco/app/cbmreco_fairrun/ProgramOptions.cxx b/reco/app/cbmreco_fairrun/ProgramOptions.cxx
index 5b09ef245b49a8b40ef868e5495e3f2cf42d9db8..970485daa0c91b73f77d17a035a89c4b631d8451 100644
--- a/reco/app/cbmreco_fairrun/ProgramOptions.cxx
+++ b/reco/app/cbmreco_fairrun/ProgramOptions.cxx
@@ -32,7 +32,7 @@ void ProgramOptions::ParseOptions(int argc, char* argv[])
               "enable logging to syslog at given log level");
   generic_add(
     "monitor,m",
-    po::value<std::string>(&fMonitorUri)->value_name("<uri>")->implicit_value("influx1:login:8086:tsclient_status"),
+    po::value<std::string>(&fMonitorUri)->value_name("<uri>")->implicit_value("influx1:login:8086:cbmreco_status"),
     "publish program status to InfluxDB (or \"file:cout\" for "
     "console output)");
   generic_add("help,h", "display this help and exit");
diff --git a/reco/tasks/CMakeLists.txt b/reco/tasks/CMakeLists.txt
index fe504a8d3721cc9b75b783e0f92815e93f43b29a..4743544232b5b10e28bb4d63ff4421a13bdbc5a6 100644
--- a/reco/tasks/CMakeLists.txt
+++ b/reco/tasks/CMakeLists.txt
@@ -40,6 +40,8 @@ set(PRIVATE_DEPENDENCIES
   CbmTrdBase
   FairLogger::FairLogger
   FairRoot::Online
+  external::fles_monitoring
+  external::fles_logging
   external::yaml-cpp
   ROOT::Hist
   ROOT::RHTTP
diff --git a/reco/tasks/CbmReco.cxx b/reco/tasks/CbmReco.cxx
index 7c77a76f94b3ca85fe15202347a861a1986bb041..8be25218f2688651f96707478ab5df68a49b9011 100644
--- a/reco/tasks/CbmReco.cxx
+++ b/reco/tasks/CbmReco.cxx
@@ -108,12 +108,14 @@ void CbmRecoConfig::SaveYaml(const std::string& filename)
 
 
 // -----   Constructor from single source   -----------------------------------
-CbmReco::CbmReco(string source, TString outFile, int32_t numTs, const CbmRecoConfig& config, uint16_t port)
+CbmReco::CbmReco(string source, TString outFile, int32_t numTs, const CbmRecoConfig& config, uint16_t port,
+                 cbm::Monitor* monitor)
   : fSourceNames {source}
   , fOutputFileName(outFile)
   , fNumTs(numTs)
   , fConfig(config)
   , fHttpServerPort(port)
+  , fMonitor(monitor)
 {
 }
 // ----------------------------------------------------------------------------
@@ -121,12 +123,13 @@ CbmReco::CbmReco(string source, TString outFile, int32_t numTs, const CbmRecoCon
 
 // -----   Constructor from multiple sources   --------------------------------
 CbmReco::CbmReco(std::vector<string> sources, TString outFile, int32_t numTs, const CbmRecoConfig& config,
-                 uint16_t port)
+                 uint16_t port, cbm::Monitor* monitor)
   : fSourceNames(sources)
   , fOutputFileName(outFile)
   , fNumTs(numTs)
   , fConfig(config)
   , fHttpServerPort(port)
+  , fMonitor(monitor)
 {
 }
 // ----------------------------------------------------------------------------
@@ -196,6 +199,7 @@ int32_t CbmReco::Run()
   // --- Unpacking
   if (!isRootInput) {
     auto unpack = make_unique<CbmTaskUnpack>();
+    unpack->SetMonitor(fMonitor);
     unpack->SetOutputBranchPersistent("DigiTimeslice.", fConfig.fStoreTimeslice);
     run.AddTask(unpack.release());
   }
diff --git a/reco/tasks/CbmReco.h b/reco/tasks/CbmReco.h
index a031d0c968186b3cffc1eef2dce3a6dfbf4ac50b..3b82f88cadc4cc6f6e20471537afdbd21a2d87ab 100644
--- a/reco/tasks/CbmReco.h
+++ b/reco/tasks/CbmReco.h
@@ -7,6 +7,18 @@
 
 #include "CbmDefs.h"
 
+// Hide the Monitor class from ROOT to not confuse it.
+// A similar issue with ROOT and gcc9 was already discovered by ALICE O2:
+// https://github.com/AliceO2Group/AliceO2/pull/4858
+#if !defined(__CLING__) && !defined(__ROOTCLING__)
+#include "Monitor.hpp"
+#else
+namespace cbm
+{
+  class Monitor;
+}
+#endif
+
 #include <TString.h>
 
 #include <map>
@@ -75,7 +87,8 @@ public:
    ** @param config  Configuration
    ** @param port    Port number for the http server. If 0, server will not be activated.
    **/
-  CbmReco(std::string source, TString outFile, int32_t numTs, const CbmRecoConfig& config, uint16_t port = 0);
+  CbmReco(std::string source, TString outFile, int32_t numTs, const CbmRecoConfig& config, uint16_t port = 0,
+          cbm::Monitor* monitor = nullptr);
 
 
   /** @brief Standard constructor for list of sources
@@ -86,7 +99,7 @@ public:
    ** @param port    Port number for the http server
    **/
   CbmReco(std::vector<std::string> sources, TString outFile, int32_t numTs, const CbmRecoConfig& config,
-          uint16_t port = 0);
+          uint16_t port = 0, cbm::Monitor* monitor = nullptr);
 
 
   /** @brief Destructor **/
@@ -111,6 +124,7 @@ private:
   int32_t fNumTs                        = 0;   ///< Number of timeslices to process
   CbmRecoConfig fConfig                 = {};  ///< Configuration parameters
   uint16_t fHttpServerPort              = 0;
+  cbm::Monitor* fMonitor                = nullptr;
 
   ClassDef(CbmReco, 1);
 };
diff --git a/reco/tasks/CbmRecoConfigExample.yaml b/reco/tasks/CbmRecoConfigExample.yaml
index 56d05361d774fd32b388aa202122780cf4805c80..a5ec384b217c4e84890fab6a28293b0748f5d147 100644
--- a/reco/tasks/CbmRecoConfigExample.yaml
+++ b/reco/tasks/CbmRecoConfigExample.yaml
@@ -6,6 +6,10 @@ trigger:
 eventbuilder:
   windows:
     STS: [-20, 30]
+selector:
+  minStationsSts: 0
+  minStationsTof: 0
+  minDigisBmon: 0
 store:
   timeslice: false
   triggers: false
diff --git a/reco/tasks/CbmTaskUnpack.cxx b/reco/tasks/CbmTaskUnpack.cxx
index 74560df88cd6cca7f8ee6ec956526c6b36e6f751..0858e427eb17134c8e837603f1237c2fa4b10c26 100644
--- a/reco/tasks/CbmTaskUnpack.cxx
+++ b/reco/tasks/CbmTaskUnpack.cxx
@@ -19,6 +19,7 @@
 #include "CbmTrdParSpadic.h"
 
 #include "MicrosliceDescriptor.hpp"
+#include "System.hpp"
 
 #include <FairParAsciiFileIo.h>
 #include <FairParamList.h>
@@ -82,6 +83,17 @@ void CbmTaskUnpack::Exec(Option_t*)
   logOut << ", digis " << result.second.fNumDigis;
   LOG(info) << logOut.str();
 
+#if !defined(__CLING__) && !defined(__ROOTCLING__)
+  if (fMonitor) {
+    fMonitor->QueueMetric(GetName(), {{"host", fHostname}},
+                          {{"realtime", timer.RealTime()},
+                           {"cputime", timer.CpuTime()},
+                           {"input_size", result.second.fNumBytes},
+                           {"input_rate", double(result.second.fNumBytes) / timer.RealTime()},
+                           {"digis", result.second.fNumDigis}});
+  }
+#endif
+
   // --- Run statistics
   fNumTs++;
   fNumMs += result.second.fNumMs;
@@ -112,10 +124,12 @@ void CbmTaskUnpack::Finish()
 // -----   Initialisation   ---------------------------------------------------
 InitStatus CbmTaskUnpack::Init()
 {
-
   LOG(info) << "==================================================";
   LOG(info) << GetName() << ": Initialising...";
 
+  // --- Get hostname
+  fHostname = fles::system::current_hostname();
+
   // --- Get source instance
   fSource = dynamic_cast<CbmSourceTs*>(FairRunOnline::Instance()->GetSource());
   if (fSource == nullptr) {
diff --git a/reco/tasks/CbmTaskUnpack.h b/reco/tasks/CbmTaskUnpack.h
index 697b517c8c7d9b7930aa4676ce4d04bc10ce3785..57b799c7fc2736f482b66eec7220655fd41433e3 100644
--- a/reco/tasks/CbmTaskUnpack.h
+++ b/reco/tasks/CbmTaskUnpack.h
@@ -9,6 +9,16 @@
 #include "CbmDefs.h"
 #include "CbmDigiTimeslice.h"
 
+// Hide the Monitor class from ROOT to not confuse it
+#if !defined(__CLING__) && !defined(__ROOTCLING__)
+#include "Monitor.hpp"
+#else
+namespace cbm
+{
+  class Monitor;
+}
+#endif
+
 #include <FairTask.h>
 
 #include "tof/TofReadoutConfig.h"
@@ -73,6 +83,10 @@ public:
   CbmTaskUnpack& operator=(const CbmTaskUnpack&) = delete;
 
 
+  /** @brief Set the monitor object **/
+  void SetMonitor(cbm::Monitor* monitor) { fMonitor = monitor; }
+
+
 private:  // methods
   /** @brief Task initialisation **/
   virtual InitStatus Init();
@@ -86,7 +100,9 @@ private:  // methods
   cbm::algo::Trd2dReadoutConfig InitTrd2dReadoutConfig();
 
 private:  // members
-  CbmSourceTs* fSource = nullptr;
+  CbmSourceTs* fSource   = nullptr;
+  cbm::Monitor* fMonitor = nullptr;
+  std::string fHostname;
 
   /** @brief Unpacker algorithm **/
   cbm::algo::Unpack fUnpack;