diff --git a/MQ/mcbm/CMakeLists.txt b/MQ/mcbm/CMakeLists.txt
index b0919fbee222d7c35ca5b6f000c8a12830844fbb..8e6c685d9eb8dc10dfcc0a6dd3149dd6a581ecfc 100644
--- a/MQ/mcbm/CMakeLists.txt
+++ b/MQ/mcbm/CMakeLists.txt
@@ -4,6 +4,7 @@ configure_file(${CMAKE_CURRENT_SOURCE_DIR}/startMQBuildRawEvents.sh.in ${CMAKE_B
 configure_file(${CMAKE_CURRENT_SOURCE_DIR}/startBuildRawEvents2021.sh.in ${CMAKE_BINARY_DIR}/bin/MQ/topologies/startBuildRawEvents2021.sh)
 configure_file(${CMAKE_CURRENT_SOURCE_DIR}/startBuildRawEventsCosmics2021.sh.in ${CMAKE_BINARY_DIR}/bin/MQ/topologies/startBuildRawEventsCosmics2021.sh)
 configure_file(${CMAKE_CURRENT_SOURCE_DIR}/startEventBuilder.sh.in ${CMAKE_BINARY_DIR}/bin/MQ/topologies/startEventBuilder.sh)
+configure_file(${CMAKE_CURRENT_SOURCE_DIR}/startBuildRawEvents2022.sh.in ${CMAKE_BINARY_DIR}/bin/MQ/topologies/startBuildRawEvents2022.sh)
 
 set(INCLUDE_DIRECTORIES
     ${CMAKE_CURRENT_SOURCE_DIR}
@@ -19,12 +20,13 @@ set(INCLUDE_DIRECTORIES
     ${CBMROOT_SOURCE_DIR}/fles/flestools
     ${CBMROOT_SOURCE_DIR}/reco/eventbuilder/digis
     ${CBMROOT_SOURCE_DIR}/reco/base/
+    ${CBMROOT_SOURCE_DIR}/reco/detectors/much/unpack
     ${CBMROOT_SOURCE_DIR}/reco/detectors/psd/unpack
+    ${CBMROOT_SOURCE_DIR}/reco/detectors/rich/unpack
     ${CBMROOT_SOURCE_DIR}/reco/detectors/sts/unpack
     ${CBMROOT_SOURCE_DIR}/reco/detectors/tof/unpack
     ${CBMROOT_SOURCE_DIR}/reco/detectors/trd/unpack
     ${CBMROOT_SOURCE_DIR}/reco/detectors/trd/rawToDigiMethods
-    ${CBMROOT_SOURCE_DIR}/reco/detectors/rich/unpack
     ${CBMDATA_DIR}
     ${CBMDATA_DIR}/raw
     ${CBMDATA_DIR}/sts
@@ -41,6 +43,7 @@ set(INCLUDE_DIRECTORIES
     ${CBMROOT_SOURCE_DIR}/sim/transport/geosetup # For CbmGeoSetupDbProvider.h, needed by CbmSetup
 
     ${CBMDETECTORBASE_DIR}/sts # required for parameter handling of the sts
+    ${CBMDETECTORBASE_DIR}/much # required for parameter handling of the much
     ${CBMDETECTORBASE_DIR}/trd # required for parameter handling of the trd
     ${CBMDETECTORBASE_DIR}/tof # required for parameter handling of the tof
     ${CBMDETECTORBASE_DIR}/rich # required for parameter handling of the rich
@@ -218,6 +221,7 @@ set(DEPENDENCIES
   CbmFlibFlesTools
   CbmBase
   CbmRecoBase
+  CbmMuchReco
   CbmPsdReco
   CbmRichReco
   CbmRecoSts
diff --git a/MQ/mcbm/CbmDeviceBuildDigiEvents.cxx b/MQ/mcbm/CbmDeviceBuildDigiEvents.cxx
index b504518e7a903026f0f64c1798b4267cfb0bdd7e..f9d19d85074c54c09e991970642a0246f220276f 100644
--- a/MQ/mcbm/CbmDeviceBuildDigiEvents.cxx
+++ b/MQ/mcbm/CbmDeviceBuildDigiEvents.cxx
@@ -67,6 +67,7 @@ try {
   fvsDelDet       = fConfig->GetValue<std::vector<std::string>>("DelDet");
   fvsSetTrigWin   = fConfig->GetValue<std::vector<std::string>>("SetTrigWin");
   fvsSetTrigMinNb = fConfig->GetValue<std::vector<std::string>>("SetTrigMinNb");
+  fvsSetTrigMaxNb = fConfig->GetValue<std::vector<std::string>>("SetTrigMaxNb");
 
   fsChannelNameDataInput   = fConfig->GetValue<std::string>("TsNameIn");
   fsChannelNameDataOutput  = fConfig->GetValue<std::string>("EvtNameOut");
@@ -110,14 +111,15 @@ try {
                                       : EOverlapModeRaw::NoOverlap)));
   fpAlgo->SetEventOverlapMode(mode);
   /// Extract refdet
-  RawEventBuilderDetector refDet = ("kT0"   == fsRefDet ? kRawEventBuilderDetT0
-                              : ("kSts"  == fsRefDet ? kRawEventBuilderDetSts
-                              : ("kMuch" == fsRefDet ? kRawEventBuilderDetMuch
-                              : ("kTrd"  == fsRefDet ? kRawEventBuilderDetTrd
-                              : ("kTof"  == fsRefDet ? kRawEventBuilderDetTof
-                              : ("kRich" == fsRefDet ? kRawEventBuilderDetRich
-                              : ("kPsd"  == fsRefDet ? kRawEventBuilderDetPsd
-                                                     : kRawEventBuilderDetUndef)))))));
+  RawEventBuilderDetector refDet = ("kT0"    == fsRefDet ? kRawEventBuilderDetT0
+                                 : ("kSts"   == fsRefDet ? kRawEventBuilderDetSts
+                                 : ("kMuch"  == fsRefDet ? kRawEventBuilderDetMuch
+                                 : ("kTrd"   == fsRefDet ? kRawEventBuilderDetTrd
+                                 : ("kTrd2D" == fsRefDet ? kRawEventBuilderDetTrd2D
+                                 : ("kTof"   == fsRefDet ? kRawEventBuilderDetTof
+                                 : ("kRich"  == fsRefDet ? kRawEventBuilderDetRich
+                                 : ("kPsd"   == fsRefDet ? kRawEventBuilderDetPsd
+                                                         : kRawEventBuilderDetUndef))))))));
   if (kRawEventBuilderDetUndef != refDet) {
     fpAlgo->SetReferenceDetector(refDet);
   }
@@ -131,14 +133,15 @@ try {
   for (std::vector<std::string>::iterator itStrAdd = fvsAddDet.begin();
        itStrAdd != fvsAddDet.end();
        ++itStrAdd) {
-    RawEventBuilderDetector addDet = ("kT0"   == *itStrAdd ? kRawEventBuilderDetT0
-                                : ("kSts"  == *itStrAdd ? kRawEventBuilderDetSts
-                                : ("kMuch" == *itStrAdd ? kRawEventBuilderDetMuch
-                                : ("kTrd"  == *itStrAdd ? kRawEventBuilderDetTrd
-                                : ("kTof"  == *itStrAdd ? kRawEventBuilderDetTof
-                                : ("kRich" == *itStrAdd ? kRawEventBuilderDetRich
-                                : ("kPsd"  == *itStrAdd ? kRawEventBuilderDetPsd
-                                                        : kRawEventBuilderDetUndef)))))));
+    RawEventBuilderDetector addDet = ("kT0"    == *itStrAdd ? kRawEventBuilderDetT0
+                                   : ("kSts"   == *itStrAdd ? kRawEventBuilderDetSts
+                                   : ("kMuch"  == *itStrAdd ? kRawEventBuilderDetMuch
+                                   : ("kTrd"   == *itStrAdd ? kRawEventBuilderDetTrd
+                                   : ("kTrd2D" == *itStrAdd ? kRawEventBuilderDetTrd2D
+                                   : ("kTof"   == *itStrAdd ? kRawEventBuilderDetTof
+                                   : ("kRich"  == *itStrAdd ? kRawEventBuilderDetRich
+                                   : ("kPsd"   == *itStrAdd ? kRawEventBuilderDetPsd
+                                                            : kRawEventBuilderDetUndef))))))));
     if (kRawEventBuilderDetUndef != addDet) {
       fpAlgo->AddDetector(addDet);
     }
@@ -154,14 +157,15 @@ try {
   for (std::vector<std::string>::iterator itStrRem = fvsDelDet.begin();
        itStrRem != fvsDelDet.end();
        ++itStrRem) {
-    RawEventBuilderDetector remDet = ("kT0"   == *itStrRem ? kRawEventBuilderDetT0
-                                : ("kSts"  == *itStrRem ? kRawEventBuilderDetSts
-                                : ("kMuch" == *itStrRem ? kRawEventBuilderDetMuch
-                                : ("kTrd"  == *itStrRem ? kRawEventBuilderDetTrd
-                                : ("kTof"  == *itStrRem ? kRawEventBuilderDetTof
-                                : ("kRich" == *itStrRem ? kRawEventBuilderDetRich
-                                : ("kPsd"  == *itStrRem ? kRawEventBuilderDetPsd
-                                                        : kRawEventBuilderDetUndef)))))));
+    RawEventBuilderDetector remDet = ("kT0"    == *itStrRem ? kRawEventBuilderDetT0
+                                   : ("kSts"   == *itStrRem ? kRawEventBuilderDetSts
+                                   : ("kMuch"  == *itStrRem ? kRawEventBuilderDetMuch
+                                   : ("kTrd"   == *itStrRem ? kRawEventBuilderDetTrd
+                                   : ("kTrd2D" == *itStrRem ? kRawEventBuilderDetTrd2D
+                                   : ("kTof"   == *itStrRem ? kRawEventBuilderDetTof
+                                   : ("kRich"  == *itStrRem ? kRawEventBuilderDetRich
+                                   : ("kPsd"   == *itStrRem ? kRawEventBuilderDetPsd
+                                                           : kRawEventBuilderDetUndef))))))));
     if (kRawEventBuilderDetUndef != remDet) {
       fpAlgo->RemoveDetector(remDet);
     }
@@ -188,14 +192,15 @@ try {
 
     /// Detector Enum Tag
     std::string sSelDet = (*itStrTrigWin).substr(0, charPosDel);
-    ECbmModuleId selDet = ("kT0"   == sSelDet ? ECbmModuleId::kT0
-                        : ("kSts"  == sSelDet ? ECbmModuleId::kSts
-                        : ("kMuch" == sSelDet ? ECbmModuleId::kMuch
-                        : ("kTrd"  == sSelDet ? ECbmModuleId::kTrd
-                        : ("kTof"  == sSelDet ? ECbmModuleId::kTof
-                        : ("kRich" == sSelDet ? ECbmModuleId::kRich
-                        : ("kPsd"  == sSelDet ? ECbmModuleId::kPsd
-                                              : ECbmModuleId::kNotExist)))))));
+    ECbmModuleId selDet = ("kT0"    == sSelDet ? ECbmModuleId::kT0
+                        : ("kSts"   == sSelDet ? ECbmModuleId::kSts
+                        : ("kMuch"  == sSelDet ? ECbmModuleId::kMuch
+                        : ("kTrd"   == sSelDet ? ECbmModuleId::kTrd
+                        : ("kTrd2D" == sSelDet ? ECbmModuleId::kTrd2d
+                        : ("kTof"   == sSelDet ? ECbmModuleId::kTof
+                        : ("kRich"  == sSelDet ? ECbmModuleId::kRich
+                        : ("kPsd"   == sSelDet ? ECbmModuleId::kPsd
+                                               : ECbmModuleId::kNotExist))))))));
     if (ECbmModuleId::kNotExist == selDet) {
       LOG(info)
         << "CbmDeviceBuildDigiEvents::InitTask => "
@@ -224,7 +229,7 @@ try {
 
     fpAlgo->SetTriggerWindow(selDet, dWinBeg, dWinEnd);
   }
-     /// Extract MinNb for trigger if any
+  /// Extract MinNb for trigger if any
   for (std::vector<std::string>::iterator itStrMinNb = fvsSetTrigMinNb.begin();
        itStrMinNb != fvsSetTrigMinNb.end();
        ++itStrMinNb) {
@@ -240,14 +245,15 @@ try {
 
     /// Detector Enum Tag
     std::string sSelDet = (*itStrMinNb).substr(0, charPosDel);
-    ECbmModuleId selDet = ("kT0"   == sSelDet ? ECbmModuleId::kT0
-                        : ("kSts"  == sSelDet ? ECbmModuleId::kSts
-                        : ("kMuch" == sSelDet ? ECbmModuleId::kMuch
-                        : ("kTrd"  == sSelDet ? ECbmModuleId::kTrd
-                        : ("kTof"  == sSelDet ? ECbmModuleId::kTof
-                        : ("kRich" == sSelDet ? ECbmModuleId::kRich
-                        : ("kPsd"  == sSelDet ? ECbmModuleId::kPsd
-                                              : ECbmModuleId::kNotExist)))))));
+    ECbmModuleId selDet = ("kT0"    == sSelDet ? ECbmModuleId::kT0
+                        : ("kSts"   == sSelDet ? ECbmModuleId::kSts
+                        : ("kMuch"  == sSelDet ? ECbmModuleId::kMuch
+                        : ("kTrd"   == sSelDet ? ECbmModuleId::kTrd
+                        : ("kTrd2D" == sSelDet ? ECbmModuleId::kTrd2d
+                        : ("kTof"   == sSelDet ? ECbmModuleId::kTof
+                        : ("kRich"  == sSelDet ? ECbmModuleId::kRich
+                        : ("kPsd"   == sSelDet ? ECbmModuleId::kPsd
+                                               : ECbmModuleId::kNotExist))))))));
     if (ECbmModuleId::kNotExist == selDet) {
       LOG(info)
         << "CbmDeviceBuildDigiEvents::InitTask => "
@@ -263,6 +269,46 @@ try {
     fpAlgo->SetTriggerMinNumber(selDet, uMinNb);
   }
 
+  /// Extract MaxNb for trigger if any
+  for (std::vector<std::string>::iterator itStrMaxNb = fvsSetTrigMaxNb.begin();
+       itStrMaxNb != fvsSetTrigMaxNb.end();
+       ++itStrMaxNb) {
+    size_t charPosDel = (*itStrMaxNb).find(',');
+    if (std::string::npos == charPosDel) {
+      LOG(info)
+        << "CbmDeviceBuildDigiEvents::InitTask => "
+        << "Trying to set trigger Max Nb with invalid option pattern, ignored! "
+        << " (Should be ECbmModuleId,uMaxNb but instead found " << (*itStrMaxNb)
+        << " )";
+      continue;
+    }
+
+    /// Detector Enum Tag
+    std::string sSelDet = (*itStrMaxNb).substr(0, charPosDel);
+    ECbmModuleId selDet = ("kT0"    == sSelDet ? ECbmModuleId::kT0
+                        : ("kSts"   == sSelDet ? ECbmModuleId::kSts
+                        : ("kMuch"  == sSelDet ? ECbmModuleId::kMuch
+                        : ("kTrd"   == sSelDet ? ECbmModuleId::kTrd
+                        : ("kTrd2D" == sSelDet ? ECbmModuleId::kTrd2d
+                        : ("kTof"   == sSelDet ? ECbmModuleId::kTof
+                        : ("kRich"  == sSelDet ? ECbmModuleId::kRich
+                        : ("kPsd"   == sSelDet ? ECbmModuleId::kPsd
+                                               : ECbmModuleId::kNotExist))))))));
+    if (ECbmModuleId::kNotExist == selDet) {
+      LOG(info)
+        << "CbmDeviceBuildDigiEvents::InitTask => "
+        << "Trying to set trigger Max Nb for unsupported detector, ignored! "
+        << sSelDet;
+      continue;
+    }
+
+    /// Max number
+    charPosDel++;
+    UInt_t uMaxNb = std::stoul((*itStrMaxNb).substr(charPosDel));
+
+    fpAlgo->SetTriggerMaxNumber(selDet, uMaxNb);
+  }
+
   /// FIXME: Re-enable clang formatting after formatted lines
   /* clang-format on */
 
@@ -388,52 +434,66 @@ bool CbmDeviceBuildDigiEvents::HandleData(FairMQParts& parts, int /*index*/)
   ++uPartIdx;
 
   /// T0
-  std::string msgStrT0(static_cast<char*>(parts.At(uPartIdx)->GetData()), (parts.At(uPartIdx))->GetSize());
-  std::istringstream issT0(msgStrT0);
-  boost::archive::binary_iarchive inputArchiveT0(issT0);
-  inputArchiveT0 >> *fvDigiT0;
+  if (0 < (parts.At(uPartIdx))->GetSize()) {
+    std::string msgStrT0(static_cast<char*>(parts.At(uPartIdx)->GetData()), (parts.At(uPartIdx))->GetSize());
+    std::istringstream issT0(msgStrT0);
+    boost::archive::binary_iarchive inputArchiveT0(issT0);
+    inputArchiveT0 >> *fvDigiT0;
+  }
   ++uPartIdx;
 
   /// STS
-  std::string msgStrSts(static_cast<char*>(parts.At(uPartIdx)->GetData()), (parts.At(uPartIdx))->GetSize());
-  std::istringstream issSts(msgStrSts);
-  boost::archive::binary_iarchive inputArchiveSts(issSts);
-  inputArchiveSts >> *fvDigiSts;
+  if (0 < (parts.At(uPartIdx))->GetSize()) {
+    std::string msgStrSts(static_cast<char*>(parts.At(uPartIdx)->GetData()), (parts.At(uPartIdx))->GetSize());
+    std::istringstream issSts(msgStrSts);
+    boost::archive::binary_iarchive inputArchiveSts(issSts);
+    inputArchiveSts >> *fvDigiSts;
+  }
   ++uPartIdx;
 
   /// MUCH
-  std::string msgStrMuch(static_cast<char*>(parts.At(uPartIdx)->GetData()), (parts.At(uPartIdx))->GetSize());
-  std::istringstream issMuch(msgStrMuch);
-  boost::archive::binary_iarchive inputArchiveMuch(issMuch);
-  inputArchiveMuch >> *fvDigiMuch;
+  if (0 < (parts.At(uPartIdx))->GetSize()) {
+    std::string msgStrMuch(static_cast<char*>(parts.At(uPartIdx)->GetData()), (parts.At(uPartIdx))->GetSize());
+    std::istringstream issMuch(msgStrMuch);
+    boost::archive::binary_iarchive inputArchiveMuch(issMuch);
+    inputArchiveMuch >> *fvDigiMuch;
+  }
   ++uPartIdx;
 
   /// TRD
-  std::string msgStrTrd(static_cast<char*>(parts.At(uPartIdx)->GetData()), (parts.At(uPartIdx))->GetSize());
-  std::istringstream issTrd(msgStrTrd);
-  boost::archive::binary_iarchive inputArchiveTrd(issTrd);
-  inputArchiveTrd >> *fvDigiTrd;
+  if (0 < (parts.At(uPartIdx))->GetSize()) {
+    std::string msgStrTrd(static_cast<char*>(parts.At(uPartIdx)->GetData()), (parts.At(uPartIdx))->GetSize());
+    std::istringstream issTrd(msgStrTrd);
+    boost::archive::binary_iarchive inputArchiveTrd(issTrd);
+    inputArchiveTrd >> *fvDigiTrd;
+  }
   ++uPartIdx;
 
   /// T0F
-  std::string msgStrTof(static_cast<char*>(parts.At(uPartIdx)->GetData()), (parts.At(uPartIdx))->GetSize());
-  std::istringstream issTof(msgStrTof);
-  boost::archive::binary_iarchive inputArchiveTof(issTof);
-  inputArchiveTof >> *fvDigiTof;
+  if (0 < (parts.At(uPartIdx))->GetSize()) {
+    std::string msgStrTof(static_cast<char*>(parts.At(uPartIdx)->GetData()), (parts.At(uPartIdx))->GetSize());
+    std::istringstream issTof(msgStrTof);
+    boost::archive::binary_iarchive inputArchiveTof(issTof);
+    inputArchiveTof >> *fvDigiTof;
+  }
   ++uPartIdx;
 
   /// RICH
-  std::string msgStrRich(static_cast<char*>(parts.At(uPartIdx)->GetData()), (parts.At(uPartIdx))->GetSize());
-  std::istringstream issRich(msgStrRich);
-  boost::archive::binary_iarchive inputArchiveRich(issRich);
-  inputArchiveRich >> *fvDigiRich;
+  if (0 < (parts.At(uPartIdx))->GetSize()) {
+    std::string msgStrRich(static_cast<char*>(parts.At(uPartIdx)->GetData()), (parts.At(uPartIdx))->GetSize());
+    std::istringstream issRich(msgStrRich);
+    boost::archive::binary_iarchive inputArchiveRich(issRich);
+    inputArchiveRich >> *fvDigiRich;
+  }
   ++uPartIdx;
 
   /// PSD
-  std::string msgStrPsd(static_cast<char*>(parts.At(uPartIdx)->GetData()), (parts.At(uPartIdx))->GetSize());
-  std::istringstream issPsd(msgStrPsd);
-  boost::archive::binary_iarchive inputArchivePsd(issPsd);
-  inputArchivePsd >> *fvDigiPsd;
+  if (0 < (parts.At(uPartIdx))->GetSize()) {
+    std::string msgStrPsd(static_cast<char*>(parts.At(uPartIdx)->GetData()), (parts.At(uPartIdx))->GetSize());
+    std::istringstream issPsd(msgStrPsd);
+    boost::archive::binary_iarchive inputArchivePsd(issPsd);
+    inputArchivePsd >> *fvDigiPsd;
+  }
   ++uPartIdx;
 
   /// TS metadata
diff --git a/MQ/mcbm/CbmDeviceBuildDigiEvents.h b/MQ/mcbm/CbmDeviceBuildDigiEvents.h
index 3dc2afbfbfeb721cca705fa7b603abea1704e45a..cbb7b02e56953fde6cefad2d97d73b90bbb74693 100644
--- a/MQ/mcbm/CbmDeviceBuildDigiEvents.h
+++ b/MQ/mcbm/CbmDeviceBuildDigiEvents.h
@@ -63,6 +63,7 @@ private:
   std::vector<std::string> fvsDelDet       = {};
   std::vector<std::string> fvsSetTrigWin   = {};
   std::vector<std::string> fvsSetTrigMinNb = {};
+  std::vector<std::string> fvsSetTrigMaxNb = {};
   /// message queues
   std::string fsChannelNameDataInput   = "unpts_0";
   std::string fsChannelNameDataOutput  = "events";
diff --git a/MQ/mcbm/CbmDeviceUnpack.cxx b/MQ/mcbm/CbmDeviceUnpack.cxx
index 50c08718f1563bae48bf0c4321fbf3ba23b14da4..96db68cbcae743551fdc78565e96a1872c593f1f 100644
--- a/MQ/mcbm/CbmDeviceUnpack.cxx
+++ b/MQ/mcbm/CbmDeviceUnpack.cxx
@@ -11,9 +11,10 @@
 
 #include "CbmDeviceUnpack.h"
 
+#include "CbmBmonUnpackConfig.h"
 #include "CbmFlesCanvasTools.h"
 #include "CbmMQDefs.h"
-#include "CbmMuchDigi.h"
+#include "CbmMuchUnpackConfig.h"
 #include "CbmPsdUnpackConfig.h"
 #include "CbmRichUnpackConfig.h"
 #include "CbmSetup.h"
@@ -62,6 +63,14 @@ try {
   LOG(info) << "Init options for CbmDeviceUnpack.";
   fsSetupName              = fConfig->GetValue<std::string>("Setup");
   fuRunId                  = fConfig->GetValue<uint32_t>("RunId");
+  fbUnpBmon                = fConfig->GetValue<bool>("UnpBmon");
+  fbUnpSts                 = fConfig->GetValue<bool>("UnpSts");
+  fbUnpMuch                = fConfig->GetValue<bool>("UnpMuch");
+  fbUnpTrd1D               = fConfig->GetValue<bool>("UnpTrd1d");
+  fbUnpTrd2D               = fConfig->GetValue<bool>("UnpTrd2d");
+  fbUnpTof                 = fConfig->GetValue<bool>("UnpTof");
+  fbUnpRich                = fConfig->GetValue<bool>("UnpRich");
+  fbUnpPsd                 = fConfig->GetValue<bool>("UnpPsd");
   fbIgnoreOverlapMs        = fConfig->GetValue<bool>("IgnOverMs");
   fbOutputFullTimeSorting  = fConfig->GetValue<bool>("FullTimeSort");
   fvsSetTimeOffs           = fConfig->GetValue<std::vector<std::string>>("SetTimeOffs");
@@ -118,11 +127,28 @@ Bool_t CbmDeviceUnpack::InitContainers()
   // ------------------------------------------------------------------------
 
   /// Initialize the UnpackerConfigs objects and their "user options"
+  // ---- BMON ----
+  std::shared_ptr<CbmBmonUnpackConfig> bmonconfig = nullptr;
+  if (fbUnpBmon) {
+    bmonconfig = std::make_shared<CbmBmonUnpackConfig>("", fuRunId);
+    if (bmonconfig) {
+      // bmonconfig->SetDebugState();
+      bmonconfig->SetDoWriteOutput();
+      // bmonconfig->SetDoWriteOptOutA("CbmBmonErrors");
+      std::string parfilesbasepathBmon = Form("%s/macro/beamtime/mcbm2022/", srcDir.Data());
+      bmonconfig->SetParFilesBasePath(parfilesbasepathBmon);
+      bmonconfig->SetParFileName("mBmonCriPar.par");
+      bmonconfig->SetSystemTimeOffset(-1220);  // [ns] value to be updated
+      /// Enable Monitor plots
+      // bmonconfig->SetMonitor(GetTofMonitor(outfilename, true));  // FIXME: Unsupported for now
+    }
+  }
+  // -------------
   // ---- STS ----
   std::shared_ptr<CbmStsUnpackConfig> stsconfig = nullptr;
   TString stsSetupTag                           = "";
   cbmsetup->GetGeoTag(ECbmModuleId::kSts, stsSetupTag);
-  if ("" != stsSetupTag) {
+  if ("" != stsSetupTag && fbUnpSts) {
     LOG(info) << "From received setup, using STS tag: " << stsSetupTag;
     stsconfig = std::make_shared<CbmStsUnpackConfig>(std::string(fsSetupName), fuRunId);
     if (stsconfig) {
@@ -130,6 +156,10 @@ Bool_t CbmDeviceUnpack::InitContainers()
       stsconfig->SetDoWriteOutput();
       stsconfig->SetDoWriteOptOutA("StsDigiPulser");
       std::string parfilesbasepathSts = Form("%s/macro/beamtime/mcbm2021/", srcDir.Data());
+      if (2060 <= fuRunId) {
+        /// Starting to readout the U3 since 10/03/2022 Carbon run
+        parfilesbasepathSts = Form("%s/macro/beamtime/mcbm2022/", srcDir.Data());
+      }
       stsconfig->SetParFilesBasePath(parfilesbasepathSts);
       /// Enable duplicates rejection, Ignores the ADC for duplicates check
       stsconfig->SetDuplicatesRejection(true, true);
@@ -186,11 +216,37 @@ Bool_t CbmDeviceUnpack::InitContainers()
     }
   }  // if ("" != stsSetupTag)
   // -------------
+  // ---- MUCH ----
+  std::shared_ptr<CbmMuchUnpackConfig> muchconfig = nullptr;
+  TString muchSetupTag                            = "";
+  cbmsetup->GetGeoTag(ECbmModuleId::kMuch, muchSetupTag);
+  if ("" != muchSetupTag && fbUnpMuch) {
+    LOG(info) << "From received setup, using MUCH tag: " << muchSetupTag;
+
+    muchconfig = std::make_shared<CbmMuchUnpackConfig>(std::string(fsSetupName), fuRunId);
+    if (muchconfig) {
+      // muchconfig->SetDebugState();
+      muchconfig->SetDoWriteOutput();
+      muchconfig->SetDoWriteOptOutA("MuchDigiPulser");
+      std::string parfilesbasepathMuch = Form("%s/macro/beamtime/mcbm2022/", srcDir.Data());
+      muchconfig->SetParFilesBasePath(parfilesbasepathMuch);
+      /// Enable duplicates rejection, Ignores the ADC for duplicates check
+      muchconfig->SetDuplicatesRejection(true, true);
+      /// Enable Monitor plots
+      //muchconfig->SetMonitor(GetMuchMonitor(outfilename, true));
+      muchconfig->SetSystemTimeOffset(-2221);  // [ns] value to be updated
+
+      // muchconfig->SetMinAdcCut(1, 1);
+
+      // muchconfig->MaskNoisyChannel(3, 56);
+    }
+  }
+  // -------------
   // ---- TRD ----
   std::shared_ptr<CbmTrdUnpackConfig> trd1Dconfig = nullptr;
   TString trdsetuptag                             = "";
   cbmsetup->GetGeoTag(ECbmModuleId::kTrd, trdsetuptag);
-  if ("" != trdsetuptag) {
+  if ("" != trdsetuptag && fbUnpTrd1D) {
     LOG(info) << "From received setup, using TRD tag: " << trdsetuptag;
     // trd1Dconfig = std::make_shared<CbmTrdUnpackConfig>(trdsetuptag.Data(), fuRunId);
     trd1Dconfig = std::make_shared<CbmTrdUnpackConfig>(trdsetuptag.Data(), 3);
@@ -212,16 +268,26 @@ Bool_t CbmDeviceUnpack::InitContainers()
   // -------------
   // ---- TRDFASP2D ----
   std::shared_ptr<CbmTrdUnpackFaspConfig> trdfasp2dconfig = nullptr;
-  if ("" != trdsetuptag) {
+  if ("" != trdsetuptag && fbUnpTrd2D) {
     trdfasp2dconfig = std::make_shared<CbmTrdUnpackFaspConfig>(trdsetuptag.Data(), 3);
     if (trdfasp2dconfig) {
       // trdfasp2dconfig->SetDebugState();
       trdfasp2dconfig->SetDoWriteOutput();
       // Activate the line below to write Trd1D digis to a separate "TrdFaspDigi" branch. Can be used to separate between Fasp and Spadic digis
-      trdfasp2dconfig->SetOutputBranchName("TrdFaspDigi");
+      //trdfasp2dconfig->SetOutputBranchName("TrdFaspDigi");
       std::string parfilesbasepathTrdfasp2d = Form("%s/parameters/trd", srcDir.Data());
       trdfasp2dconfig->SetParFilesBasePath(parfilesbasepathTrdfasp2d);
       trdfasp2dconfig->SetSystemTimeOffset(-1800);  // [ns] value to be updated
+      uint8_t map[NFASPMOD];
+      if (fuRunId <= 1588) {
+        uint8_t map21[] = {9, 2, 3, 11, 10, 7, 8, 0, 1, 4, 6, 5};
+        for (int i(0); i < NFASPMOD; i++)
+          map[i] = (i < 12 ? map21[i] : i);
+      }
+      else
+        for (int i(0); i < NFASPMOD; i++)
+          map[i] = i;
+      trdfasp2dconfig->SetFaspMapping(5, map);
     }
   }  // if ("" != trdsetuptag)
   // -------------
@@ -229,7 +295,7 @@ Bool_t CbmDeviceUnpack::InitContainers()
   std::shared_ptr<CbmTofUnpackConfig> tofconfig = nullptr;
   TString tofSetupTag                           = "";
   cbmsetup->GetGeoTag(ECbmModuleId::kTof, tofSetupTag);
-  if ("" != tofSetupTag) {
+  if ("" != tofSetupTag && fbUnpTof) {
     LOG(info) << "From received setup, using TOF tag: " << tofSetupTag;
     tofconfig = std::make_shared<CbmTofUnpackConfig>("", fuRunId);
     if (tofconfig) {
@@ -237,6 +303,10 @@ Bool_t CbmDeviceUnpack::InitContainers()
       tofconfig->SetDoWriteOutput();
       // tofconfig->SetDoWriteOptOutA("CbmTofErrors");
       std::string parfilesbasepathTof = Form("%s/macro/beamtime/mcbm2021/", srcDir.Data());
+      if (2060 <= fuRunId) {
+        /// Additional modules added just before the 10/03/2022 Carbon run
+        parfilesbasepathTof = Form("%s/macro/beamtime/mcbm2022/", srcDir.Data());
+      }
       tofconfig->SetParFilesBasePath(parfilesbasepathTof);
       tofconfig->SetSystemTimeOffset(-1220);  // [ns] value to be updated
       if (fuRunId <= 1659) {
@@ -250,7 +320,7 @@ Bool_t CbmDeviceUnpack::InitContainers()
   std::shared_ptr<CbmRichUnpackConfig> richconfig = nullptr;
   TString richSetupTag                            = "";
   cbmsetup->GetGeoTag(ECbmModuleId::kRich, richSetupTag);
-  if ("" != richSetupTag) {
+  if ("" != richSetupTag && fbUnpRich) {
     LOG(info) << "From received setup, using RICH tag: " << richSetupTag;
     richconfig = std::make_shared<CbmRichUnpackConfig>("", fuRunId);
     if (richconfig) {
@@ -258,11 +328,13 @@ Bool_t CbmDeviceUnpack::InitContainers()
         /// Switch to new unpacking algo starting from first combined cosmics run in 2022
         richconfig->SetUnpackerVersion(CbmRichUnpackerVersion::v03);
       }
+      richconfig->DoTotOffsetCorrection();  // correct ToT offset
       richconfig->SetDebugState();
       richconfig->SetDoWriteOutput();
       std::string parfilesbasepathRich = Form("%s/macro/beamtime/mcbm2021/", srcDir.Data());
       richconfig->SetParFilesBasePath(parfilesbasepathRich);
       richconfig->SetSystemTimeOffset(256000 - 1200);  // [ns] 1 MS and additional correction
+      if (1904 < fuRunId) richconfig->SetSystemTimeOffset(-1200);
       if (1588 == fuRunId) richconfig->MaskDiRICH(0x7150);
     }
   }  // if ("" != richSetupTag)
@@ -271,7 +343,7 @@ Bool_t CbmDeviceUnpack::InitContainers()
   std::shared_ptr<CbmPsdUnpackConfig> psdconfig = nullptr;
   TString psdSetupTag                           = "";
   cbmsetup->GetGeoTag(ECbmModuleId::kPsd, psdSetupTag);
-  if ("" != psdSetupTag) {
+  if ("" != psdSetupTag && fbUnpPsd) {
     LOG(info) << "From received setup, using PSD tag: " << psdSetupTag;
     psdconfig = std::make_shared<CbmPsdUnpackConfig>("", fuRunId);
     if (psdconfig) {
@@ -287,9 +359,11 @@ Bool_t CbmDeviceUnpack::InitContainers()
 
   /// Enable full time sorting instead of time sorting per FLIM link
   if (stsconfig) SetUnpackConfig(stsconfig);
+  if (muchconfig) SetUnpackConfig(muchconfig);
   if (trd1Dconfig) SetUnpackConfig(trd1Dconfig);
   if (trdfasp2dconfig) SetUnpackConfig(trdfasp2dconfig);
   if (tofconfig) SetUnpackConfig(tofconfig);
+  if (bmonconfig) SetUnpackConfig(bmonconfig);
   if (richconfig) SetUnpackConfig(richconfig);
   if (psdconfig) SetUnpackConfig(psdconfig);
 
@@ -309,14 +383,15 @@ Bool_t CbmDeviceUnpack::InitContainers()
     charPosDel++;
     int32_t iOffset = std::stoi((*itStrOffs).substr(charPosDel));
 
-    if ("kSTS" == sSelDet && fStsConfig) {  //
+    if ("kT0" == sSelDet && fBmonConfig) {  //
+      fBmonConfig->SetSystemTimeOffset(iOffset);
+    }                                            // else if( "kT0" == sSelDet )
+    else if ("kSTS" == sSelDet && fStsConfig) {  //
       fStsConfig->SetSystemTimeOffset(iOffset);
     }  // if( "kSTS"  == sSelDet && fStsConfig)
-       /*
-    else if ("kMUCH" == sSelDet) {
-      fUnpAlgoMuch->SetSystemTimeOffset(iOffset);
+    else if ("kMUCH" == sSelDet && fMuchConfig) {
+      fMuchConfig->SetSystemTimeOffset(iOffset);
     }  // else if( "kMUCH" == sSelDet )
-*/
     else if ("kTRD" == sSelDet && fTrd1DConfig) {
       fTrd1DConfig->SetSystemTimeOffset(iOffset);
     }  // else if( "kTRD"  == sSelDet && fTrd2DConfig )
@@ -351,16 +426,14 @@ Bool_t CbmDeviceUnpack::InitContainers()
     fStsConfig->InitAlgo();
     //    initPerformanceMaps(fkFlesSts, "STS");
   }
-  // --- Tof
-  if (fTofConfig) {
-    fTofConfig->InitOutput();
-    //    RegisterOutputs( ioman, fTofConfig ); /// Framework bound work = kept in this Task
-    fTofConfig->SetDoIgnoreOverlappMs(fbIgnoreOverlapMs);
-    fTofConfig->SetAlgo();
-    initOK &= InitParameters(fTofConfig->GetParContainerRequest());  /// Framework bound work = kept in this Device
-    LOG(info) << "TOF call InitAlgo()";
-    fTofConfig->InitAlgo();
-    //    initPerformanceMaps(fkFlesTof, "TOF");
+  // --- Much
+  if (fMuchConfig) {
+    fMuchConfig->InitOutput();
+    //    RegisterOutputs(ioman, fMuchConfig);  /// Framework bound work = kept in this Task
+    fMuchConfig->SetAlgo();
+    initOK &= InitParameters(fMuchConfig->GetParContainerRequest());  /// Framework bound work = kept in this Device
+    fMuchConfig->InitAlgo();
+    // initPerformanceMaps(fkFlesMuch, "MUCH");
   }
   // --- Trd
   if (fTrd1DConfig) {
@@ -393,6 +466,27 @@ Bool_t CbmDeviceUnpack::InitContainers()
   // are created, as far as I am aware.
   // The second option workaround is in in Init() to look for the fasp config and create a separate branch
   // for fasp created CbmTrdDigis PR 072021
+  // --- Tof
+  if (fTofConfig) {
+    fTofConfig->InitOutput();
+    //    RegisterOutputs( ioman, fTofConfig ); /// Framework bound work = kept in this Task
+    fTofConfig->SetDoIgnoreOverlappMs(fbIgnoreOverlapMs);
+    fTofConfig->SetAlgo();
+    initOK &= InitParameters(fTofConfig->GetParContainerRequest());  /// Framework bound work = kept in this Device
+    LOG(info) << "TOF call InitAlgo()";
+    fTofConfig->InitAlgo();
+    //    initPerformanceMaps(fkFlesTof, "TOF");
+  }
+  // --- Bmon
+  if (fBmonConfig) {
+    fBmonConfig->InitOutput();
+    //    RegisterOutputs(ioman, fBmonConfig);  /// Framework bound work = kept in this Task
+    fBmonConfig->SetAlgo();
+    fBmonConfig->LoadParFileName();  /// Needed to change the Parameter file name before it is used!!!
+    initOK &= InitParameters(fBmonConfig->GetParContainerRequest());  /// Framework bound work = kept in this Device
+    fBmonConfig->InitAlgo();
+    // initPerformanceMaps(fkFlesBmon, "Bmon");
+  }
   // --- Rich
   if (fRichConfig) {
     fRichConfig->InitOutput();
@@ -523,6 +617,19 @@ bool CbmDeviceUnpack::InitHistograms()
 // Method called by run loop and requesting new data from the TS source whenever
 bool CbmDeviceUnpack::ConditionalRun()
 {
+  /// First do Algo related Initialization steps if needed
+  if (0 == fulNumMessages) {
+    try {
+      InitContainers();
+    }
+    catch (InitTaskError& e) {
+      LOG(error) << e.what();
+      ChangeState(fair::mq::Transition::ErrorFound);
+    }
+  }  // if( 0 == fulNumMessages)
+
+  if (0 == fulNumMessages) InitHistograms();
+
   /// First request a new TS (full one)
   std::string message = "full";
   LOG(debug) << "Requesting new TS by sending message: full" << message;
@@ -542,19 +649,6 @@ bool CbmDeviceUnpack::ConditionalRun()
     return false;
   }  // else if (rep->GetSize() == 0)
 
-  /// Message received, do Algo related Initialization steps if needed
-  if (0 == fulNumMessages) {
-    try {
-      InitContainers();
-    }
-    catch (InitTaskError& e) {
-      LOG(error) << e.what();
-      ChangeState(fair::mq::Transition::ErrorFound);
-    }
-  }  // if( 0 == fulNumMessages)
-
-  if (0 == fulNumMessages) InitHistograms();
-
   fulNumMessages++;
   LOG(debug) << "Received message number " << fulNumMessages << " with size " << rep->GetSize();
 
@@ -599,14 +693,18 @@ bool CbmDeviceUnpack::ConditionalRun()
   fCbmTsEventHeader->Reset();
 
   // Reset the unpackers for a new timeslice, e.g. clear the output vectors
+  // ---- Bmon ----
+  if (fBmonConfig) fBmonConfig->Reset();
   // ---- Sts ----
   if (fStsConfig) fStsConfig->Reset();
-  // ---- Tof ----
-  if (fTofConfig) fTofConfig->Reset();
+  // ----Much ----
+  if (fMuchConfig) fMuchConfig->Reset();
   // ---- Trd ----
   if (fTrd1DConfig) fTrd1DConfig->Reset();
   // ---- Trd2D ----
   if (fTrd2DConfig) fTrd2DConfig->Reset();
+  // ---- Tof ----
+  if (fTofConfig) fTofConfig->Reset();
   // ---- Rich ----
   if (fRichConfig) fRichConfig->Reset();
   // ---- Psd ----
@@ -644,17 +742,21 @@ bool CbmDeviceUnpack::SendUnpData()
   parts.AddPart(std::move(messTsHeader));
 
   // ---- T0 ----
-  std::stringstream ossT0;
-  boost::archive::binary_oarchive oaT0(ossT0);
-  //  oaT0 << fUnpAlgoTof->GetOptOutAVec();
-  oaT0 << (std::vector<CbmTofDigi>());
-  std::string* strMsgT0 = new std::string(ossT0.str());
+  std::stringstream ossBmon;
+  boost::archive::binary_oarchive oaBmon(ossBmon);
+  if (fBmonConfig) {  //
+    oaBmon << *(fBmonConfig->GetOutputVec());
+  }
+  else {
+    oaBmon << (std::vector<CbmTofDigi>());
+  }
+  std::string* strMsgBmon = new std::string(ossBmon.str());
 
   parts.AddPart(NewMessage(
-    const_cast<char*>(strMsgT0->c_str()),  // data
-    strMsgT0->length(),                    // size
+    const_cast<char*>(strMsgBmon->c_str()),  // data
+    strMsgBmon->length(),                    // size
     [](void*, void* object) { delete static_cast<std::string*>(object); },
-    strMsgT0));  // object that manages the data
+    strMsgBmon));  // object that manages the data
 
   // ---- Sts ----
   std::stringstream ossSts;
@@ -662,6 +764,9 @@ bool CbmDeviceUnpack::SendUnpData()
   if (fStsConfig) {  //
     oaSts << *(fStsConfig->GetOutputVec());
   }
+  else {
+    oaSts << (std::vector<CbmStsDigi>());
+  }
   std::string* strMsgSts = new std::string(ossSts.str());
 
   parts.AddPart(NewMessage(
@@ -673,8 +778,12 @@ bool CbmDeviceUnpack::SendUnpData()
   // ---- Much ----
   std::stringstream ossMuch;
   boost::archive::binary_oarchive oaMuch(ossMuch);
-  //  oaMuch << fUnpAlgoMuch->GetVector();
-  oaMuch << (std::vector<CbmMuchDigi>());
+  if (fMuchConfig) {  //
+    oaMuch << *(fMuchConfig->GetOutputVec());
+  }
+  else {
+    oaMuch << (std::vector<CbmMuchDigi>());
+  }
   std::string* strMsgMuch = new std::string(ossMuch.str());
 
   parts.AddPart(NewMessage(
@@ -690,6 +799,9 @@ bool CbmDeviceUnpack::SendUnpData()
   if (fTrd1DConfig || fTrd2DConfig) {  //
     oaTrd << *(fTrd1DConfig ? fTrd1DConfig->GetOutputVec() : fTrd2DConfig->GetOutputVec());
   }
+  else {
+    oaTrd << (std::vector<CbmTrdDigi>());
+  }
   std::string* strMsgTrd = new std::string(ossTrd.str());
 
   parts.AddPart(NewMessage(
@@ -704,6 +816,9 @@ bool CbmDeviceUnpack::SendUnpData()
   if (fTofConfig) {  //
     oaTof << *(fTofConfig->GetOutputVec());
   }
+  else {
+    oaTof << (std::vector<CbmTofDigi>());
+  }
   std::string* strMsgTof = new std::string(ossTof.str());
 
   parts.AddPart(NewMessage(
@@ -718,6 +833,9 @@ bool CbmDeviceUnpack::SendUnpData()
   if (fRichConfig) {  //
     oaRich << *(fRichConfig->GetOutputVec());
   }
+  else {
+    oaRich << (std::vector<CbmRichDigi>());
+  }
   std::string* strMsgRich = new std::string(ossRich.str());
 
   parts.AddPart(NewMessage(
@@ -732,6 +850,9 @@ bool CbmDeviceUnpack::SendUnpData()
   if (fPsdConfig) {  //
     oaPsd << *(fPsdConfig->GetOutputVec());
   }
+  else {
+    oaPsd << (std::vector<CbmPsdDigi>());
+  }
   std::string* strMsgPsd = new std::string(ossPsd.str());
 
   parts.AddPart(NewMessage(
@@ -839,10 +960,12 @@ bool CbmDeviceUnpack::SendHistograms()
 
 CbmDeviceUnpack::~CbmDeviceUnpack()
 {
+  if (fBmonConfig) fBmonConfig->GetUnpacker()->Finish();
   if (fStsConfig) fStsConfig->GetUnpacker()->Finish();
-  if (fTofConfig) fTofConfig->GetUnpacker()->Finish();
+  if (fMuchConfig) fMuchConfig->GetUnpacker()->Finish();
   if (fTrd1DConfig) fTrd1DConfig->GetUnpacker()->Finish();
   if (fTrd2DConfig) fTrd2DConfig->GetUnpacker()->Finish();
+  if (fTofConfig) fTofConfig->GetUnpacker()->Finish();
   if (fRichConfig) fRichConfig->GetUnpacker()->Finish();
   if (fPsdConfig) fPsdConfig->GetUnpacker()->Finish();
 }
@@ -864,6 +987,13 @@ Bool_t CbmDeviceUnpack::DoUnpack(const fles::Timeslice& ts, size_t /*component*/
     auto systemId = static_cast<std::uint16_t>(ts.descriptor(component, 0).sys_id);
 
     switch (systemId) {
+      case fkFlesBmon: {
+        if (fBmonConfig) {
+          fCbmTsEventHeader->AddNDigisBmon(
+            unpack(systemId, &ts, component, fBmonConfig, fBmonConfig->GetOptOutAVec(), fBmonConfig->GetOptOutBVec()));
+        }
+        break;
+      }
       case fkFlesSts: {
         if (fStsConfig) {
           fCbmTsEventHeader->AddNDigisSts(
@@ -871,10 +1001,10 @@ Bool_t CbmDeviceUnpack::DoUnpack(const fles::Timeslice& ts, size_t /*component*/
         }
         break;
       }
-      case fkFlesTof: {
-        if (fTofConfig) {
-          fCbmTsEventHeader->AddNDigisTof(
-            unpack(systemId, &ts, component, fTofConfig, fTofConfig->GetOptOutAVec(), fTofConfig->GetOptOutBVec()));
+      case fkFlesMuch: {
+        if (fMuchConfig) {
+          fCbmTsEventHeader->AddNDigisMuch(
+            unpack(systemId, &ts, component, fMuchConfig, fMuchConfig->GetOptOutAVec(), fMuchConfig->GetOptOutBVec()));
         }
         break;
       }
@@ -892,6 +1022,13 @@ Bool_t CbmDeviceUnpack::DoUnpack(const fles::Timeslice& ts, size_t /*component*/
         }
         break;
       }
+      case fkFlesTof: {
+        if (fTofConfig) {
+          fCbmTsEventHeader->AddNDigisTof(
+            unpack(systemId, &ts, component, fTofConfig, fTofConfig->GetOptOutAVec(), fTofConfig->GetOptOutBVec()));
+        }
+        break;
+      }
       case fkFlesRich: {
         if (fRichConfig) {
           fCbmTsEventHeader->AddNDigisRich(
@@ -915,18 +1052,22 @@ Bool_t CbmDeviceUnpack::DoUnpack(const fles::Timeslice& ts, size_t /*component*/
 
   if (fbOutputFullTimeSorting) {
     /// Time sort the output vectors of all unpackers present
+    if (fBmonConfig && fBmonConfig->GetOutputVec()) { timesort(fBmonConfig->GetOutputVec()); }
     if (fStsConfig && fStsConfig->GetOutputVec()) { timesort(fStsConfig->GetOutputVec()); }
-    if (fTofConfig && fTofConfig->GetOutputVec()) { timesort(fTofConfig->GetOutputVec()); }
+    if (fMuchConfig && fMuchConfig->GetOutputVec()) { timesort(fMuchConfig->GetOutputVec()); }
     if (fTrd1DConfig && fTrd1DConfig->GetOutputVec()) { timesort(fTrd1DConfig->GetOutputVec()); }
     if (fTrd2DConfig && fTrd2DConfig->GetOutputVec()) { timesort(fTrd2DConfig->GetOutputVec()); }
+    if (fTofConfig && fTofConfig->GetOutputVec()) { timesort(fTofConfig->GetOutputVec()); }
     if (fRichConfig && fRichConfig->GetOutputVec()) { timesort(fRichConfig->GetOutputVec()); }
     if (fPsdConfig && fPsdConfig->GetOutputVec()) { timesort(fPsdConfig->GetOutputVec()); }
 
     /// Time sort the output vectors of all unpackers present
+    if (fBmonConfig && fBmonConfig->GetOptOutAVec()) { timesort(fBmonConfig->GetOptOutAVec()); }
     if (fStsConfig && fStsConfig->GetOptOutAVec()) { timesort(fStsConfig->GetOptOutAVec()); }
-    if (fTofConfig && fTofConfig->GetOptOutAVec()) { timesort(fTofConfig->GetOptOutAVec()); }
+    if (fMuchConfig && fMuchConfig->GetOptOutAVec()) { timesort(fMuchConfig->GetOptOutAVec()); }
     if (fTrd1DConfig && fTrd1DConfig->GetOptOutAVec()) { timesort(fTrd1DConfig->GetOptOutAVec()); }
     if (fTrd2DConfig && fTrd2DConfig->GetOptOutAVec()) { timesort(fTrd2DConfig->GetOptOutAVec()); }
+    if (fTofConfig && fTofConfig->GetOptOutAVec()) { timesort(fTofConfig->GetOptOutAVec()); }
     if (fRichConfig && fRichConfig->GetOptOutAVec()) { timesort(fRichConfig->GetOptOutAVec()); }
     if (fPsdConfig && fPsdConfig->GetOptOutAVec()) { timesort(fPsdConfig->GetOptOutAVec()); }
   }
diff --git a/MQ/mcbm/CbmDeviceUnpack.h b/MQ/mcbm/CbmDeviceUnpack.h
index 3b585a3ef5333fd1af079c7b02893c5365ba0a9a..2cd1b89810a7939d5e4ad85d23e70479f6125cf6 100644
--- a/MQ/mcbm/CbmDeviceUnpack.h
+++ b/MQ/mcbm/CbmDeviceUnpack.h
@@ -28,12 +28,14 @@
 #include <vector>
 
 class TList;
-class CbmPsdUnpackConfig;
-class CbmRichUnpackConfig;
+class CbmBmonUnpackConfig;
 class CbmStsUnpackConfig;
-class CbmTofUnpackConfig;
+class CbmMuchUnpackConfig;
 class CbmTrdUnpackFaspConfig;
 class CbmTrdUnpackConfig;
+class CbmTofUnpackConfig;
+class CbmRichUnpackConfig;
+class CbmPsdUnpackConfig;
 
 class TimesliceMetaData;
 
@@ -49,11 +51,14 @@ protected:
   bool ConditionalRun();
   bool HandleCommand(FairMQMessagePtr&, int);
 
+  /** @brief Set the Bmon Unpack Config @param config */
+  void SetUnpackConfig(std::shared_ptr<CbmBmonUnpackConfig> config) { fBmonConfig = config; }
+
   /** @brief Set the Sts Unpack Config @param config */
   void SetUnpackConfig(std::shared_ptr<CbmStsUnpackConfig> config) { fStsConfig = config; }
 
-  // /** @brief Set the Tof Unpack Config @param config */
-  void SetUnpackConfig(std::shared_ptr<CbmTofUnpackConfig> config) { fTofConfig = config; }
+  /** @brief Set the Much Unpack Config @param config */
+  void SetUnpackConfig(std::shared_ptr<CbmMuchUnpackConfig> config) { fMuchConfig = config; }
 
   /** @brief Set the Trd Unpack Config @param config */
   void SetUnpackConfig(std::shared_ptr<CbmTrdUnpackConfig> config) { fTrd1DConfig = config; }
@@ -61,6 +66,9 @@ protected:
   /** @brief Set the Trd2D Unpack Config @param config */
   void SetUnpackConfig(std::shared_ptr<CbmTrdUnpackFaspConfig> config) { fTrd2DConfig = config; }
 
+  /** @brief Set the Tof Unpack Config @param config */
+  void SetUnpackConfig(std::shared_ptr<CbmTofUnpackConfig> config) { fTofConfig = config; }
+
   /** @brief Set the Rich Unpack Config @param config */
   void SetUnpackConfig(std::shared_ptr<CbmRichUnpackConfig> config) { fRichConfig = config; }
 
@@ -69,14 +77,7 @@ protected:
 
 private:
   /// Constants
-  static const uint16_t kusSysIdSts  = 0x10;
-  static const uint16_t kusSysIdMuch = 0x50;
-  static const uint16_t kusSysIdTrd  = 0x40;
-  static const uint16_t kusSysIdTof  = 0x60;
-  static const uint16_t kusSysIdT0   = 0x90;
-  static const uint16_t kusSysIdRich = 0x30;
-  static const uint16_t kusSysIdPsd  = 0x80;
-
+  static constexpr std::uint16_t fkFlesBmon  = static_cast<std::uint16_t>(fles::SubsystemIdentifier::T0);
   static constexpr std::uint16_t fkFlesMvd   = static_cast<std::uint16_t>(fles::SubsystemIdentifier::MVD);
   static constexpr std::uint16_t fkFlesSts   = static_cast<std::uint16_t>(fles::SubsystemIdentifier::STS);
   static constexpr std::uint16_t fkFlesMuch  = static_cast<std::uint16_t>(fles::SubsystemIdentifier::MUCH);
@@ -101,6 +102,15 @@ private:
   /// User settings parameters
   std::string fsSetupName = "mcbm_beam_2021_07_surveyed";
   uint32_t fuRunId        = 1588;
+  /// ---> for selective unpacking
+  bool fbUnpBmon  = false;
+  bool fbUnpSts   = true;
+  bool fbUnpMuch  = false;
+  bool fbUnpTrd1D = true;
+  bool fbUnpTrd2D = true;
+  bool fbUnpTof   = true;
+  bool fbUnpRich  = true;
+  bool fbUnpPsd   = true;
   /// message queues
   std::string fsChannelNameDataInput   = "ts-request";
   std::string fsChannelNameDataOutput  = "unpts_0";
@@ -127,12 +137,14 @@ private:
   std::map<std::uint16_t, std::pair<double, double>> fDataSizeMap = {};  //!
 
   /// Configuration of the unpackers. Provides the configured algorithm
-  std::shared_ptr<CbmStsUnpackConfig> fStsConfig         = nullptr;
-  std::shared_ptr<CbmTrdUnpackFaspConfig> fTrd2DConfig   = nullptr;
-  std::shared_ptr<CbmTrdUnpackConfig> fTrd1DConfig       = nullptr;
-  std::shared_ptr<CbmTofUnpackConfig> fTofConfig         = nullptr;
-  std::shared_ptr<CbmRichUnpackConfig> fRichConfig       = nullptr;
-  std::shared_ptr<CbmPsdUnpackConfig> fPsdConfig         = nullptr;
+  std::shared_ptr<CbmBmonUnpackConfig> fBmonConfig     = nullptr;
+  std::shared_ptr<CbmStsUnpackConfig> fStsConfig       = nullptr;
+  std::shared_ptr<CbmMuchUnpackConfig> fMuchConfig     = nullptr;
+  std::shared_ptr<CbmTrdUnpackFaspConfig> fTrd2DConfig = nullptr;
+  std::shared_ptr<CbmTrdUnpackConfig> fTrd1DConfig     = nullptr;
+  std::shared_ptr<CbmTofUnpackConfig> fTofConfig       = nullptr;
+  std::shared_ptr<CbmRichUnpackConfig> fRichConfig     = nullptr;
+  std::shared_ptr<CbmPsdUnpackConfig> fPsdConfig       = nullptr;
 
   /// Pointer to the Timeslice header conatining start time and index
   CbmTsEventHeader* fCbmTsEventHeader = nullptr;
diff --git a/MQ/mcbm/runBuildDigiEvents.cxx b/MQ/mcbm/runBuildDigiEvents.cxx
index e0187f23c15b641f98769ab56a493155b1e6da89..ef0a0c5871451433a7541b32706bfd7a3e8a6e9e 100644
--- a/MQ/mcbm/runBuildDigiEvents.cxx
+++ b/MQ/mcbm/runBuildDigiEvents.cxx
@@ -32,6 +32,9 @@ void addCustomOptions(bpo::options_description& options)
   options.add_options()("SetTrigMinNb", bpo::value<std::vector<std::string>>()->multitoken()->composing(),
                         "Set minimum number of digis for selected detector, use string matching "
                         "ECbmModuleId,uMinNb e.g. kTof,10");
+  options.add_options()("SetTrigMaxNb", bpo::value<std::vector<std::string>>()->multitoken()->composing(),
+                        "Set maximum number of digis for selected detector, use string matching "
+                        "ECbmModuleId,uMaxNb e.g. kTof,10");
   options.add_options()("TsNameIn", bpo::value<std::string>()->default_value("unpts_0"),
                         "MQ channel name for unpacked TS data");
   options.add_options()("EvtNameOut", bpo::value<std::string>()->default_value("events"),
diff --git a/MQ/mcbm/runUnpack.cxx b/MQ/mcbm/runUnpack.cxx
index 5259fd39a449aa6fbe4cb09cc5a0b727d665079b..95332c747918c29c4feb32ae2b341c464db89d34 100644
--- a/MQ/mcbm/runUnpack.cxx
+++ b/MQ/mcbm/runUnpack.cxx
@@ -17,6 +17,14 @@ void addCustomOptions(bpo::options_description& options)
   options.add_options()("Setup", bpo::value<std::string>()->default_value("mcbm_beam_2021_07_surveyed"),
                         "Name/tag of the geomatry setup");
   options.add_options()("RunId", bpo::value<uint32_t>()->default_value(1588), "Run ID");
+  options.add_options()("UnpBmon", bpo::value<bool>()->default_value(false), "Enable Bmon unpacking if true");
+  options.add_options()("UnpSts", bpo::value<bool>()->default_value(true), "Enable STS unpacking if true");
+  options.add_options()("UnpMuch", bpo::value<bool>()->default_value(false), "Enable MUCH unpacking if true");
+  options.add_options()("UnpTrd1d", bpo::value<bool>()->default_value(true), "Enable TRD 1D unpacking if true");
+  options.add_options()("UnpTrd2d", bpo::value<bool>()->default_value(true), "Enable TRD 2D unpacking if true");
+  options.add_options()("UnpTof", bpo::value<bool>()->default_value(true), "Enable TOF unpacking if true");
+  options.add_options()("UnpRich", bpo::value<bool>()->default_value(true), "Enable RICH unpacking if true");
+  options.add_options()("UnpPsd", bpo::value<bool>()->default_value(true), "Enable PSD unpacking if true");
   options.add_options()("IgnOverMs", bpo::value<bool>()->default_value(true), "Ignore overlap MS if true");
   options.add_options()("FullTimeSort", bpo::value<bool>()->default_value(true),
                         "Full time sorting per detector before sending output array");
diff --git a/MQ/mcbm/startBuildRawEvents2022.sh.in b/MQ/mcbm/startBuildRawEvents2022.sh.in
new file mode 100755
index 0000000000000000000000000000000000000000..33542299a4512c95033d4e4a82545386f9e7e4db
--- /dev/null
+++ b/MQ/mcbm/startBuildRawEvents2022.sh.in
@@ -0,0 +1,308 @@
+#!/bin/bash
+
+if [ -e @SIMPATH@/bin/fairmq-shmmonitor ]; then
+  @SIMPATH@/bin/fairmq-shmmonitor --cleanup
+fi
+
+if [ $# -ge 1 ]; then
+  _nbmoni=$1
+  ((_pubfreqts = $_nbmoni*100 ))
+  _pubminsec=1.0
+  _pubmaxsec=10.0
+
+  if [ $# -ge 4 ]; then
+    _filename=""
+    _dirname=""
+    _hostname=$4
+
+    if [ $# -ge 5 ]; then
+      _pubfreqts=$5
+
+      if [ $# -ge 6 ]; then
+        _pubminsec=$6
+
+        if [ $# -ge 7 ]; then
+          _pubmaxsec=$7
+        fi
+      fi
+    fi
+  elif [ $# -ge 2 ]; then
+    _filename=$2
+    _hostname=""
+    if [ $# -eq 3 ]; then
+      _dirname=$3
+    else
+      _dirname=""
+    fi
+  else
+    echo 'Starting connection to local stream'
+    echo ' for other usages, please supply at least a filename.'
+    echo 'Possible usages are:'
+    echo 'startBuildRawEvents2022.sh'
+    echo 'startBuildRawEvents2022.sh <Nb Unp & Moni processes>'
+    echo 'startBuildRawEvents2022.sh <Nb Unp & Moni processes> <full filename pattern list>'
+    echo 'startBuildRawEvents2022.sh <Nb Unp & Moni processes> <filename pattern> <folder_path>'
+    echo 'startBuildRawEvents2022.sh <Nb Unp & Moni processes> "" "" <hostname(s) list>'
+    echo 'startBuildRawEvents2022.sh <Nb Unp & Moni processes> "" "" <hostname(s) list> <Hist publish freq. in TS>'
+    echo 'startBuildRawEvents2022.sh <Nb Unp & Moni processes> "" "" <hostname(s) list> <Hist publish freq. in TS> <Min Hist pub. in s>'
+    echo 'startBuildRawEvents2022.sh <Nb Unp & Moni processes> "" "" <hostname(s) list> <Hist publish freq. in TS> <Min Hist pub. in s> <Max Hist pub. in s>'
+    _filename=""
+    _dirname=""
+    _hostname="localhost"
+  fi
+else
+  echo 'Starting connection to local stream with 1 monitor process'
+  echo ' for other usages, please supply at least a filename.'
+  echo 'Possible usages are:'
+  echo 'startBuildRawEvents2022.sh'
+  echo 'startBuildRawEvents2022.sh <Nb Unp & Moni processes>'
+  echo 'startBuildRawEvents2022.sh <Nb Unp & Moni processes> <full filename pattern list>'
+  echo 'startBuildRawEvents2022.sh <Nb Unp & Moni processes> <filename pattern> <folder_path>'
+  echo 'startBuildRawEvents2022.sh <Nb Unp & Moni processes> "" "" <hostname(s) list>'
+  echo 'startBuildRawEvents2022.sh <Nb Unp & Moni processes> "" "" <hostname(s) list> <Hist publish freq. in TS>'
+  echo 'startBuildRawEvents2022.sh <Nb Unp & Moni processes> "" "" <hostname(s) list> <Hist publish freq. in TS> <Min Hist pub. in s>'
+  echo 'startBuildRawEvents2022.sh <Nb Unp & Moni processes> "" "" <hostname(s) list> <Hist publish freq. in TS> <Min Hist pub. in s> <Max Hist pub. in s>'
+  _filename=""
+  _dirname=""
+  _hostname="localhost"
+  _nbmoni=1
+  _pubfreqts=100
+  _pubminsec=1.0
+  _pubmaxsec=10.0
+fi
+
+_parfileSts=@VMCWORKDIR@/macro/beamtime/mcbm2022/mStsPar.par
+_parfileMuch=@VMCWORKDIR@/macro/beamtime/mcbm2022/mMuchPar.par
+_parfileTrdAsic=@VMCWORKDIR@/parameters/trd/trd_v22d_mcbm.asic.par
+_parfileTrdDigi=@VMCWORKDIR@/parameters/trd/trd_v22d_mcbm.digi.par
+_parfileTrdGas=@VMCWORKDIR@/parameters/trd/trd_v22d_mcbm.gas.par
+_parfileTrdGain=@VMCWORKDIR@/parameters/trd/trd_v22d_mcbm.gain.par
+_parfileTof=@VMCWORKDIR@/macro/beamtime/mcbm2022/mTofCriPar.par
+_parfileBmon=@VMCWORKDIR@/macro/beamtime/mcbm2022/mBmonCriPar.par
+_parfileRich=@VMCWORKDIR@/macro/beamtime/mcbm2021/mRichPar_70.par
+_parfilePsd=@VMCWORKDIR@/macro/beamtime/mcbm2021/mPsdPar.par
+_setup_name=mcbm_beam_2022_03_22_iron
+_run_id=2158
+
+_ratelog=0 # hides ZMQ messages rates and bandwidth
+#_ratelog=1 # display ZMQ messages rates and bandwidth
+
+LOGFILETAG=`hostname`
+LOGFILETAG+="_"
+LOGFILETAG+=`date +%Y_%m_%d_%H_%M_%S`
+LOGFILETAG+=".log"
+
+LIST_OF_PIDS=""
+
+(( _paraBuffSz=100 ))
+(( _singBuffSz=_paraBuffSz*_nbmoni ))
+
+echo "Buffer size for parallel  devices $_paraBuffSz"
+echo "Buffer size for singleton devices $_singBuffSz"
+
+
+SAMPLER="RepReqTsSampler"
+SAMPLER+=" --control static"
+SAMPLER+=" --id sampler1"
+#SAMPLER+=" --max-timeslices 0"
+#SAMPLER+=" --max-timeslices 10"
+#SAMPLER+=" --max-timeslices 100"
+#SAMPLER+=" --max-timeslices 300"
+#SAMPLER+=" --max-timeslices 1000"
+#SAMPLER+=" --severity info"
+#SAMPLER+=" --flib-port 10"
+if [ "$_hostname" != "" ]; then
+  SAMPLER+=" --fles-host $_hostname"
+elif [ "$_filename" != "" ]; then
+  SAMPLER+=" --filename $_filename"
+  if [ "$_dirname" != "" ]; then
+    SAMPLER+=" --dirname $_dirname"
+  fi
+fi
+SAMPLER+=" --high-water-mark 10"
+SAMPLER+=" --no-split-ts 1"
+SAMPLER+=" --ChNameMissTs missedts"
+SAMPLER+=" --ChNameCmds commands"
+SAMPLER+=" --PubFreqTs $_pubfreqts"
+SAMPLER+=" --PubTimeMin $_pubminsec"
+SAMPLER+=" --PubTimeMax $_pubmaxsec"
+SAMPLER+=" --channel-config name=ts-request,type=rep,method=bind,transport=zeromq,address=tcp://127.0.0.1:11555,rateLogging=$_ratelog"
+SAMPLER+=" --channel-config name=histogram-in,type=pub,method=connect,transport=zeromq,address=tcp://127.0.0.1:11666,rateLogging=$_ratelog"
+SAMPLER+=" --channel-config name=missedts,type=pub,method=bind,address=tcp://127.0.0.1:11006,rateLogging=$_ratelog"
+SAMPLER+=" --channel-config name=commands,type=pub,method=bind,address=tcp://127.0.0.1:11007,rateLogging=$_ratelog"
+SAMPLER+=" --transport zeromq"
+# Replaces log filename Xterm.log.hostname.yyyy.mm.dd.hh.mm.ss.XXXXXX
+# with ProcessName_hostname_yyyy_mm_dd_hh_mm_ss.log
+SAMPLER_LOG="sampler1_$LOGFILETAG"
+# xterm -l -lf $SAMPLER_LOG -geometry 80x23+0+0 -hold -e @CMAKE_BINARY_DIR@/bin/MQ/source/$SAMPLER  &
+nohup @CMAKE_BINARY_DIR@/bin/MQ/source/$SAMPLER  &> $SAMPLER_LOG &
+
+echo $SAMPLER
+
+LIST_OF_PIDS+=$!
+LIST_OF_PIDS+=" "
+
+PARAMETERSERVER="parmq-server"
+PARAMETERSERVER+=" --control static"
+PARAMETERSERVER+=" --id parmq-server"
+PARAMETERSERVER+=" --severity info"
+PARAMETERSERVER+=" --channel-name parameters"
+PARAMETERSERVER+=" --channel-config name=parameters,type=rep,method=bind,transport=zeromq,address=tcp://127.0.0.1:11005,rateLogging=0"
+PARAMETERSERVER+=" --first-input-name $_parfileSts;$_parfileMuch;$_parfileTrdAsic;$_parfileTrdDigi;$_parfileTrdGas;$_parfileTrdGain;$_parfileTof;$_parfileBmon;$_parfileRich;$_parfilePsd"
+PARAMETERSERVER+=" --first-input-type ASCII"
+#PARAMETERSERVER+=" --libs-to-load=CbmStsBase;CbmMuchBase;CbmTrdBase;CbmTofBase;CbmRichBase" # doesn't work due to runtime problem
+PARAMETERSERVER+=" --setup $_setup_name"
+# Replaces log filename Xterm.log.hostname.yyyy.mm.dd.hh.mm.ss.XXXXXX
+# with ProcessName_hostname_yyyy_mm_dd_hh_mm_ss.log
+PARAMSRV_LOG="parmq_$LOGFILETAG"
+# xterm -l -lf $PARAMSRV_LOG -geometry 80x23+1600+0 -hold -e @CMAKE_BINARY_DIR@/bin/MQ/parmq/$PARAMETERSERVER &
+nohup @CMAKE_BINARY_DIR@/bin/MQ/parmq/$PARAMETERSERVER &> $PARAMSRV_LOG &
+
+LIST_OF_PIDS+=$!
+LIST_OF_PIDS+=" "
+
+HISTSERVER="MqHistoServer"
+HISTSERVER+=" --control static"
+HISTSERVER+=" --id server1"
+HISTSERVER+=" --severity info"
+HISTSERVER+=" --histport 8081"
+HISTSERVER+=" --channel-config name=histogram-in,type=sub,method=bind,transport=zeromq,address=tcp://127.0.0.1:11666,rateLogging=$_ratelog"
+HISTSERVER+=" --channel-config name=histo-conf,type=sub,method=bind,transport=zeromq,address=tcp://127.0.0.1:11667,rateLogging=0"
+HISTSERVER+=" --channel-config name=canvas-conf,type=sub,method=bind,transport=zeromq,address=tcp://127.0.0.1:11668,rateLogging=0"
+# Replaces log filename Xterm.log.hostname.yyyy.mm.dd.hh.mm.ss.XXXXXX
+# with ProcessName_hostname_yyyy_mm_dd_hh_mm_ss.log
+HISTSRV_LOG="server1_$LOGFILETAG"
+# xterm -l -lf $HISTSRV_LOG -geometry 80x23+2000+0 -hold -e @CMAKE_BINARY_DIR@/bin/MQ/histogramServer/$HISTSERVER &
+nohup @CMAKE_BINARY_DIR@/bin/MQ/histogramServer/$HISTSERVER &> $HISTSRV_LOG &
+
+LIST_OF_PIDS+=$!
+LIST_OF_PIDS+=" "
+
+sleep 1
+
+_iMoni=0
+while (( _iMoni < _nbmoni )); do
+  (( _yOffset=200*_iMoni ))
+  (( _iMoni += 1 ))
+  (( _iPort = 11680 + _iMoni ))
+
+  UNPACKER="MqUnpack"
+  UNPACKER+=" --control static"
+  UNPACKER+=" --id unp$_iMoni"
+  #UNPACKER+=" --severity error"
+  UNPACKER+=" --severity info"
+  #UNPACKER+=" --severity debug"
+  UNPACKER+=" --Setup $_setup_name"
+  UNPACKER+=" --RunId $_run_id"
+  UNPACKER+=" --IgnOverMs 1"
+  UNPACKER+=" --UnpBmon true"
+  UNPACKER+=" --UnpMuch true"
+  UNPACKER+=" --UnpPsd false"
+  UNPACKER+=" --SetTimeOffs kT0,-40"
+  UNPACKER+=" --SetTimeOffs kSTS,-1025"
+  UNPACKER+=" --SetTimeOffs kMUCH,-1020"
+  UNPACKER+=" --SetTimeOffs kTRD,1190"
+  UNPACKER+=" --SetTimeOffs kTRD2D,-540"
+  UNPACKER+=" --SetTimeOffs kTOF,0"
+  UNPACKER+=" --SetTimeOffs kRICH,50"
+  UNPACKER+=" --PubFreqTs $_pubfreqts"
+  UNPACKER+=" --PubTimeMin $_pubminsec"
+  UNPACKER+=" --PubTimeMax $_pubmaxsec"
+  UNPACKER+=" --TsNameOut unpts$_iMoni"
+  UNPACKER+=" --channel-config name=ts-request,type=req,method=connect,transport=zeromq,address=tcp://127.0.0.1:11555,rateLogging=$_ratelog"
+  UNPACKER+=" --channel-config name=parameters,type=req,method=connect,transport=zeromq,address=tcp://127.0.0.1:11005,rateLogging=0"
+  UNPACKER+=" --channel-config name=unpts$_iMoni,type=push,method=bind,transport=zeromq,sndBufSize=2,address=tcp://127.0.0.1:$_iPort,rateLogging=$_ratelog"
+#  UNPACKER+=" --channel-config name=commands,type=sub,method=connect,transport=zeromq,address=tcp://127.0.0.1:11007"
+  UNPACKER+=" --channel-config name=histogram-in,type=pub,method=connect,transport=zeromq,address=tcp://127.0.0.1:11666,rateLogging=$_ratelog"
+  UNPACKER+=" --transport zeromq"
+  # Replaces log filename Xterm.log.hostname.yyyy.mm.dd.hh.mm.ss.XXXXXX
+  # with ProcessName_hostname_yyyy_mm_dd_hh_mm_ss.log
+  UNPACKER_LOG="unp$_iMoni"
+  UNPACKER_LOG+="_$LOGFILETAG"
+  # xterm -l -lf $UNPACKER_LOG -geometry 132x23+400+$_yOffset -hold -e @CMAKE_BINARY_DIR@/bin/MQ/mcbm/$UNPACKER &
+  nohup @CMAKE_BINARY_DIR@/bin/MQ/mcbm/$UNPACKER &> $UNPACKER_LOG &
+
+  LIST_OF_PIDS+=$!
+  LIST_OF_PIDS+=" "
+
+  EVTBUILDER="BuildDigiEvents"
+  EVTBUILDER+=" --control static"
+  EVTBUILDER+=" --id build$_iMoni"
+  EVTBUILDER+=" --severity info"
+  #EVTBUILDER+=" --severity debug"
+  EVTBUILDER+=" --PubFreqTs $_pubfreqts"
+  EVTBUILDER+=" --PubTimeMin $_pubminsec"
+  EVTBUILDER+=" --PubTimeMax $_pubmaxsec"
+  EVTBUILDER+=" --FillHistos true"
+#  EVTBUILDER+=" --FillHistos false"
+  EVTBUILDER+=" --IgnTsOver false"
+  EVTBUILDER+=" --EvtOverMode AllowOverlap"
+  EVTBUILDER+=" --RefDet kTof"
+  EVTBUILDER+=" --AddDet kT0"
+  EVTBUILDER+=" --AddDet kMuch"
+  EVTBUILDER+=" --DelDet kPsd"
+  EVTBUILDER+=" --SetTrigWin kT0,-100,100"
+  EVTBUILDER+=" --SetTrigWin kSts,-60,60"
+  EVTBUILDER+=" --SetTrigWin kMuch,-400,400"
+  EVTBUILDER+=" --SetTrigWin kTrd,-300,300"
+  EVTBUILDER+=" --SetTrigWin kTrd2D,-300,300"
+  EVTBUILDER+=" --SetTrigWin kTof,-100,100"
+  EVTBUILDER+=" --SetTrigWin kRich,0,80"
+  EVTBUILDER+=" --SetTrigMinNb kT0,0"
+  EVTBUILDER+=" --SetTrigMinNb kSts,0"
+  EVTBUILDER+=" --SetTrigMinNb kMuch,0"
+  EVTBUILDER+=" --SetTrigMinNb kTrd,0"
+  EVTBUILDER+=" --SetTrigMinNb kTrd2D,0"
+  EVTBUILDER+=" --SetTrigMinNb kTof,8" # Beam
+#  EVTBUILDER+=" --SetTrigMinNb kTof,40" #Pulser
+  EVTBUILDER+=" --SetTrigMinNb kRich,0"
+  EVTBUILDER+=" --TsNameIn unpts$_iMoni"
+  EVTBUILDER+=" --EvtNameOut events"
+  EVTBUILDER+=" --channel-config name=unpts$_iMoni,type=pull,method=connect,transport=zeromq,rcvBufSize=2,address=tcp://127.0.0.1:$_iPort,rateLogging=$_ratelog"
+  EVTBUILDER+=" --channel-config name=events,type=push,method=connect,transport=zeromq,sndBufSize=2,address=tcp://127.0.0.1:11556,rateLogging=$_ratelog"
+#  EVTBUILDER+=" --channel-config name=commands,type=sub,method=connect,transport=zeromq,address=tcp://127.0.0.1:11007"
+  EVTBUILDER+=" --channel-config name=parameters,type=req,method=connect,transport=zeromq,address=tcp://127.0.0.1:11005,rateLogging=0"
+  EVTBUILDER+=" --channel-config name=histogram-in,type=pub,method=connect,transport=zeromq,address=tcp://127.0.0.1:11666,rateLogging=$_ratelog"
+  EVTBUILDER+=" --transport zeromq"
+  # Replaces log filename Xterm.log.hostname.yyyy.mm.dd.hh.mm.ss.XXXXXX
+  # with ProcessName_hostname_yyyy_mm_dd_hh_mm_ss.log
+  EVTBUILDER_LOG="build$_iMoni"
+  EVTBUILDER_LOG+="_$LOGFILETAG"
+  # xterm -l -lf $EVTBUILDER_LOG -geometry 80x23+800+$_yOffset -hold -e @CMAKE_BINARY_DIR@/bin/MQ/mcbm/$EVTBUILDER &
+  nohup @CMAKE_BINARY_DIR@/bin/MQ/mcbm/$EVTBUILDER &> $EVTBUILDER_LOG &
+  VALGRIND_EVT="valgrind -v --error-limit=no --suppressions=$ROOTSYS/etc/root/valgrind-root.supp --leak-check=full --show-reachable=yes --log-file=valgrind_evt_log.txt"
+  VALGHEAP_EVT="valgrind --tool=massif --massif-out-file=valgrind_evt_massif.out"
+#  nohup $VALGRIND_EVT @CMAKE_BINARY_DIR@/bin/MQ/mcbm/$EVTBUILDER &> $EVTBUILDER_LOG &
+#  nohup $VALGHEAP_EVT @CMAKE_BINARY_DIR@/bin/MQ/mcbm/$EVTBUILDER &> $EVTBUILDER_LOG &
+
+  LIST_OF_PIDS+=$!
+  LIST_OF_PIDS+=" "
+done
+
+EVTSINK="DigiEventSink"
+EVTSINK+=" --control static"
+EVTSINK+=" --id evtsink1"
+EVTSINK+=" --severity info"
+#EVTSINK+=" --severity debug"
+#EVTSINK+=" --StoreFullTs 1"
+EVTSINK+=" --OutFileName mcbm_digis_events.root"
+EVTSINK+=" --FillHistos true"
+EVTSINK+=" --PubFreqTs $_pubfreqts"
+EVTSINK+=" --PubTimeMin $_pubminsec"
+EVTSINK+=" --PubTimeMax $_pubmaxsec"
+EVTSINK+=" --EvtNameIn events"
+EVTSINK+=" --channel-config name=events,type=pull,method=bind,transport=zeromq,rcvBufSize=$_nbmoni,address=tcp://127.0.0.1:11556,rateLogging=$_ratelog"
+EVTSINK+=" --channel-config name=missedts,type=sub,method=connect,transport=zeromq,address=tcp://127.0.0.1:11006,rateLogging=$_ratelog"
+EVTSINK+=" --channel-config name=commands,type=sub,method=connect,transport=zeromq,address=tcp://127.0.0.1:11007,rateLogging=$_ratelog"
+EVTSINK+=" --channel-config name=histogram-in,type=pub,method=connect,transport=zeromq,address=tcp://127.0.0.1:11666,rateLogging=$_ratelog"
+# Replaces log filename Xterm.log.hostname.yyyy.mm.dd.hh.mm.ss.XXXXXX
+# with ProcessName_hostname_yyyy_mm_dd_hh_mm_ss.log
+EVTSINK_LOG="evtsink1_$LOGFILETAG"
+# xterm -l -lf $EVTSINK_LOG -geometry 80x23+1200+0 -hold -e @CMAKE_BINARY_DIR@/bin/MQ/mcbm/$EVTSINK &
+nohup @CMAKE_BINARY_DIR@/bin/MQ/mcbm/$EVTSINK &> $EVTSINK_LOG &
+
+LIST_OF_PIDS+=$!
+LIST_OF_PIDS+=" "
+
+PID_LOG="pids_$LOGFILETAG"
+echo $LIST_OF_PIDS &> $PID_LOG
diff --git a/MQ/parmq/ParameterMQServer.cxx b/MQ/parmq/ParameterMQServer.cxx
index 58275549dbedaea01b89ee4b0a16fc337cd6e693..8703861ca11f2ead02b2c07ca4bff70faa90a18d 100644
--- a/MQ/parmq/ParameterMQServer.cxx
+++ b/MQ/parmq/ParameterMQServer.cxx
@@ -70,6 +70,8 @@ void ParameterMQServer::InitTask()
   fChannelName     = fConfig->GetValue<string>("channel-name");
 
   fsSetupName = fConfig->GetValue<std::string>("setup");
+  LOG(info) << "Using setup: " << fsSetupName;
+
 
   if (fRtdb != 0) {
     // Set first input