diff --git a/MQ/histoServer/CbmMqHistoServer.cxx b/MQ/histoServer/CbmMqHistoServer.cxx
index 6a9d55cd65efbb1fabb95f2a385d383164624028..d9f8cd04aa493c8bc53e410e5d048980b4747c5d 100644
--- a/MQ/histoServer/CbmMqHistoServer.cxx
+++ b/MQ/histoServer/CbmMqHistoServer.cxx
@@ -70,6 +70,8 @@ void CbmMqHistoServer::InitTask()
   OnData(fsChannelNameHistosInput, &CbmMqHistoServer::ReceiveData);
   OnData(fsChannelNameHistosConfig, &CbmMqHistoServer::ReceiveHistoConfig);
   OnData(fsChannelNameCanvasConfig, &CbmMqHistoServer::ReceiveCanvasConfig);
+  /// If multi-parts, go to method processing combined Config+Data
+  OnData(fsChannelNameHistosInput, &CbmMqHistoServer::ReceiveConfigAndData);
 
   fServer = new THttpServer(Form("http:%u", fuHttpServerPort));
   /// To avoid the server sucking all Histos from gROOT when no output file is used
@@ -214,6 +216,56 @@ bool CbmMqHistoServer::ReceiveCanvasConfig(FairMQMessagePtr& msg, int /*index*/)
   return true;
 }
 
+bool CbmMqHistoServer::ReceiveConfigAndData(FairMQParts& parts, int /*index*/)
+{
+  /// Reject anything but a at least Header + Histo Config + Canvas Config + Histo Data
+  if( parts.Size() < 4 )
+  {
+    if( 1 == parts.Size() )
+    {
+      /// PAL, 09/04/2021, Debug message catching missed method overlad/polymorphism:
+      /// contrary to my expectation, if 2 method bound to same channel, one with FairMQMessagePtr and one with
+      /// FairMQParts, all messages go to multipart version and  FairMQMessagePtr is converted to size 1 FairMQParts
+      LOG(debug) << "CbmMqHistoServer::ReceiveConfigAndData => only 1 parts found in input, "
+                   << "assuming data only message routed to wrong method!";
+      return ReceiveData( parts.At(0), 0 );
+    } // if( 1 == parts.Size() )
+    LOG(fatal) << "CbmMqHistoServer::ReceiveConfigAndData => Wrong number of parts: " << parts.Size()
+               << " instead of at least 4 (Header + Histo Config + Canvas config + Data)!";
+  } // if( parts.Size() < 4 )
+
+  LOG(info) << "CbmMqHistoServer::ReceiveConfigAndData => Received composed message with "
+            << parts.Size() << " parts";
+
+  /// Header contains a pair of
+  std::pair<uint32_t, uint32_t> pairHeader;
+  Deserialize<BoostSerializer<std::pair<uint32_t, uint32_t>>>(*parts.At(0),pairHeader);
+
+  LOG(info) << "CbmMqHistoServer::ReceiveConfigAndData => Received configuration for " << pairHeader.first
+            << " histos and " << pairHeader.second << " canvases";
+
+  if( parts.Size() != 1 + pairHeader.first + pairHeader.second + 1 )
+  {
+    LOG(fatal) << "CbmMqHistoServer::ReceiveConfigAndData => Number of parts not matching header: " << parts.Size()
+               << " instead of " << 1 + pairHeader.first + pairHeader.second + 1;
+  } // if( parts.Size() != 1 + pairHeader.first + pairHeader.second )
+
+  /// Decode parts for histograms configuration
+  for (uint32_t uHisto = 0; uHisto < pairHeader.first; ++uHisto) {
+    ReceiveHistoConfig( parts.At(1 + uHisto), 0 );
+  } // for (UInt_t uHisto = 0; uHisto < pairHeader.first; ++uHisto)
+
+  /// Decode parts for histograms configuration
+  for (uint32_t uCanv = 0; uCanv < pairHeader.second; ++uCanv) {
+    ReceiveCanvasConfig( parts.At(1 + pairHeader.first + uCanv), 0 );
+  } // for (UInt_t uCanv = 0; uCanv < pairHeader.second; ++uCanv)
+
+  /// Decode the histograms data now that the configuration is loaded
+  ReceiveData( parts.At(1 + pairHeader.first + pairHeader.second), 0 );
+
+  return true;
+}
+
 void CbmMqHistoServer::PreRun()
 {
   fStopThread = false;
diff --git a/MQ/histoServer/CbmMqHistoServer.h b/MQ/histoServer/CbmMqHistoServer.h
index bd30b95342bd00a6556063e5948ff7fec523c3de..9945adc6e3a1e9e2c7bb4ca6e367a2b1cb1e9459 100644
--- a/MQ/histoServer/CbmMqHistoServer.h
+++ b/MQ/histoServer/CbmMqHistoServer.h
@@ -37,6 +37,8 @@ protected:
 
   bool ReceiveCanvasConfig(FairMQMessagePtr& msg, int index);
 
+  bool ReceiveConfigAndData(FairMQParts& msg, int index);
+
   virtual void PreRun();
 
   virtual void PostRun();
diff --git a/MQ/monitor/CbmDeviceMonitorT0.cxx b/MQ/monitor/CbmDeviceMonitorT0.cxx
index 00a726a6456463e6808e685c1bf18d9774a149fd..5b37350e059c651444e4fd10e874a8661f3566e0 100644
--- a/MQ/monitor/CbmDeviceMonitorT0.cxx
+++ b/MQ/monitor/CbmDeviceMonitorT0.cxx
@@ -47,8 +47,6 @@ CbmDeviceMonitorT0::CbmDeviceMonitorT0()
   : fbIgnoreOverlapMs {false}
   , fsChannelNameDataInput {"t0component"}
   , fsChannelNameHistosInput {"histogram-in"}
-  , fsChannelNameHistosConfig {"histo-conf"}
-  , fsChannelNameCanvasConfig {"canvas-conf"}
   , fuHistoryHistoSize {3600}
   , fuMinTotPulser {185}
   , fuMaxTotPulser {195}
@@ -88,8 +86,6 @@ try {
   fdMaxPublishTime              = fConfig->GetValue<double_t>("PubTimeMax");
   fsChannelNameDataInput        = fConfig->GetValue<std::string>("TsNameIn");
   fsChannelNameHistosInput      = fConfig->GetValue<std::string>("ChNameIn");
-  fsChannelNameHistosConfig     = fConfig->GetValue<std::string>("ChNameHistCfg");
-  fsChannelNameCanvasConfig     = fConfig->GetValue<std::string>("ChNameCanvCfg");
   fsAllowedChannels[0]          = fsChannelNameDataInput;
 
   UInt_t uChanIdx   = 0;
@@ -235,16 +231,6 @@ bool CbmDeviceMonitorT0::InitHistograms() {
     std::pair<std::string, std::string> psHistoConfig(vHistos[uHisto].first->GetName(), vHistos[uHisto].second);
     fvpsHistosFolder.push_back(psHistoConfig);
 
-    /// Serialize the vector of histo config into a single MQ message
-    FairMQMessagePtr messageHist(NewMessage());
-    Serialize<BoostSerializer<std::pair<std::string, std::string>>>(*messageHist, psHistoConfig);
-
-    /// Send message to the common histogram config messages queue
-    if (Send(messageHist, fsChannelNameHistosConfig) < 0) {
-      LOG(error) << "Problem sending histo config";
-      return false;
-    }  // if( Send( messageHist, fsChannelNameHistosConfig ) < 0 )
-
     LOG(info) << "Config of hist  " << psHistoConfig.first.data() << " in folder " << psHistoConfig.second.data();
   }  // for( UInt_t uHisto = 0; uHisto < vHistos.size(); ++uHisto )
 
@@ -261,16 +247,6 @@ bool CbmDeviceMonitorT0::InitHistograms() {
 
     fvpsCanvasConfig.push_back(psCanvConfig);
 
-    /// Serialize the vector of canvas config into a single MQ message
-    FairMQMessagePtr messageCan(NewMessage());
-    Serialize<BoostSerializer<std::pair<std::string, std::string>>>(*messageCan, psCanvConfig);
-
-    /// Send message to the common canvas config messages queue
-    if (Send(messageCan, fsChannelNameCanvasConfig) < 0) {
-      LOG(error) << "Problem sending canvas config";
-      return false;
-    }  // if( Send( messageCan, fsChannelNameCanvasConfig ) < 0 )
-
     LOG(info) << "Config string of Canvas  " << psCanvConfig.first.data() << " is " << psCanvConfig.second.data();
   }  //  for( UInt_t uCanv = 0; uCanv < vCanvases.size(); ++uCanv )
 
@@ -314,37 +290,67 @@ bool CbmDeviceMonitorT0::HandleData(FairMQMessagePtr& msg, int /*index*/)
   std::chrono::duration<double_t> elapsedSeconds    = currentTime - fLastPublishTime;
   if ((fdMaxPublishTime < elapsedSeconds.count())
       || (0 == fulNumMessages % fuPublishFreqTs && fdMinPublishTime < elapsedSeconds.count())) {
-    SendHistograms();
+    if (!fbConfigSent) {
+      fbConfigSent = SendHistoConfAndData();
+    } // if( !fbConfigSent )
+    else SendHistograms();
+
     fLastPublishTime = std::chrono::system_clock::now();
   }  // if( ( fdMaxPublishTime < elapsedSeconds.count() ) || ( 0 == fulNumMessages % fuPublishFreqTs && fdMinPublishTime < elapsedSeconds.count() ) )
 
   return true;
 }
 
+bool CbmDeviceMonitorT0::SendHistoConfAndData()
+{
+  /// Prepare multiparts message and header
+  std::pair<uint32_t, uint32_t> pairHeader( fvpsHistosFolder.size(), fvpsCanvasConfig.size() );
+  FairMQMessagePtr messageHeader(NewMessage());
+  Serialize< BoostSerializer< std::pair< uint32_t, uint32_t > > >(*messageHeader, pairHeader);
+
+  FairMQParts partsOut;
+  partsOut.AddPart(std::move(messageHeader));
+
+  for (UInt_t uHisto = 0; uHisto < fvpsHistosFolder.size(); ++uHisto) {
+    /// Serialize the vector of histo config into a single MQ message
+    FairMQMessagePtr messageHist(NewMessage());
+    Serialize<BoostSerializer<std::pair<std::string, std::string>>>(*messageHist, fvpsHistosFolder[uHisto]);
+
+    partsOut.AddPart(std::move(messageHist));
+  } // for (UInt_t uHisto = 0; uHisto < fvpsHistosFolder.size(); ++uHisto)
+
+  for (UInt_t uCanv = 0; uCanv < fvpsCanvasConfig.size(); ++uCanv) {
+    /// Serialize the vector of canvas config into a single MQ message
+    FairMQMessagePtr messageCan(NewMessage());
+    Serialize<BoostSerializer<std::pair<std::string, std::string>>>(*messageCan, fvpsCanvasConfig[uCanv]);
+
+    partsOut.AddPart(std::move(messageCan));
+  } // for (UInt_t uCanv = 0; uCanv < fvpsCanvasConfig.size(); ++uCanv)
+
+  /// Serialize the array of histos into a single MQ message
+  FairMQMessagePtr msgHistos(NewMessage());
+  Serialize<RootSerializer>(*msgHistos, &fArrayHisto);
+
+  partsOut.AddPart(std::move(msgHistos));
+
+  /// Send the multi-parts message to the common histogram messages queue
+  if (Send(partsOut, fsChannelNameHistosInput) < 0) {
+    LOG(error) << "CbmDeviceMonitorT0::SendHistoConfAndData => Problem sending data";
+    return false;
+  }  // if( Send( partsOut, fsChannelNameHistosInput ) < 0 )
+
+  /// Reset the histograms after sending them (but do not reset the time)
+  fMonitorAlgo->ResetHistograms(kFALSE);
+
+  return true;
+}
+
 bool CbmDeviceMonitorT0::SendHistograms()
 {
   /// Serialize the array of histos into a single MQ message
   FairMQMessagePtr message(NewMessage());
   Serialize<RootSerializer>(*message, &fArrayHisto);
 
-  // test code to check if deserialization works
-  /*
-  TObject* tempObject = nullptr;
-  Deserialize<RootDeserializer>(*message, tempObject);
-
-  if (TString(tempObject->ClassName()).EqualTo("TObjArray")) {
-   TObjArray* arrayHisto = static_cast<TObjArray*>(tempObject);
-   LOG(info) << "Array contains " << arrayHisto->GetEntriesFast()
-             << " entries";
-    for (Int_t i = 0; i < arrayHisto->GetEntriesFast(); i++) {
-      TObject* obj = arrayHisto->At(i);
-      LOG(info) << obj->GetName();
-      TH1* histogram = static_cast<TH1*>(obj);
-      LOG(info) << histogram->GetNbinsX();
-    }
-  }
-*/
-
   /// Send message to the common histogram messages queue
   if (Send(message, fsChannelNameHistosInput) < 0) {
     LOG(error) << "Problem sending data";
diff --git a/MQ/monitor/CbmDeviceMonitorT0.h b/MQ/monitor/CbmDeviceMonitorT0.h
index fa7d84c01418ac2e3096157ff49c854a120ac8a9..25f10fa1d6e5a030c147ab2b32e71937e0d13319 100644
--- a/MQ/monitor/CbmDeviceMonitorT0.h
+++ b/MQ/monitor/CbmDeviceMonitorT0.h
@@ -47,8 +47,6 @@ private:
   /// User settings parameters
   std::string fsChannelNameDataInput;
   std::string fsChannelNameHistosInput;
-  std::string fsChannelNameHistosConfig;
-  std::string fsChannelNameCanvasConfig;
   uint32_t fuHistoryHistoSize;
   uint32_t fuMinTotPulser;
   uint32_t fuMaxTotPulser;
@@ -82,12 +80,15 @@ private:
   /// Format of Can config is "NbPadX(U);NbPadY(U);ConfigPad1(s);....;ConfigPadXY(s)"
   /// Format of Pad config is "GrixX(b),GridY(b),LogX(b),LogY(b),LogZ(b),HistoName(s),DrawOptions(s)"
   std::vector<std::pair<std::string, std::string>> fvpsCanvasConfig;
+  /// Flag indicating whether the histograms and canvases configurations were already published
+  bool fbConfigSent = false;
 
   bool IsChannelNameAllowed(std::string channelName);
   bool InitContainers();
   bool InitHistograms();
   bool DoUnpack(const fles::Timeslice& ts, size_t component);
   void Finish();
+  bool SendHistoConfAndData();
   bool SendHistograms();
 };
 
diff --git a/MQ/monitor/CbmDeviceMonitorTof.cxx b/MQ/monitor/CbmDeviceMonitorTof.cxx
index d98b93649b66e819c4d5b10629d860ceeb89fedb..1b9e16975ed8e3a73aff2d61d9e8f3b2bf69ab9f 100644
--- a/MQ/monitor/CbmDeviceMonitorTof.cxx
+++ b/MQ/monitor/CbmDeviceMonitorTof.cxx
@@ -63,8 +63,6 @@ try {
   fdMaxPublishTime          = fConfig->GetValue<double_t>("PubTimeMax");
   fsChannelNameDataInput    = fConfig->GetValue<std::string>("TsNameIn");
   fsChannelNameHistosInput  = fConfig->GetValue<std::string>("ChNameIn");
-  fsChannelNameHistosConfig = fConfig->GetValue<std::string>("ChNameHistCfg");
-  fsChannelNameCanvasConfig = fConfig->GetValue<std::string>("ChNameCanvCfg");
   fsAllowedChannels[0]      = fsChannelNameDataInput;
 
   LOG(info) << "Histograms publication frequency in TS:    " << fuPublishFreqTs;
@@ -93,7 +91,6 @@ try {
       OnData(entry.first, &CbmDeviceMonitorTof::HandleData);
     }  // if( std::string::npos != entry.first.find( fsChannelNameDataInput ) )
   }    // for( auto const &entry : fChannels )
-  InitContainers();
 }
 catch (InitTaskError& e) {
   LOG(error) << e.what();
@@ -168,11 +165,14 @@ Bool_t CbmDeviceMonitorTof::InitContainers()
 
   Bool_t initOK = fMonitorAlgo->InitContainers();
 
-  //   Bool_t initOK = fMonitorAlgo->ReInitContainers();
+  return initOK;
+}
 
+bool CbmDeviceMonitorTof::InitHistograms()
+{
   /// Histos creation and obtain pointer on them
   /// Trigger histo creation on all associated algos
-  initOK &= fMonitorAlgo->CreateHistograms();
+  bool initOK = fMonitorAlgo->CreateHistograms();
 
   /// Obtain vector of pointers on each histo from the algo (+ optionally desired folder)
   std::vector<std::pair<TNamed*, std::string>> vHistos = fMonitorAlgo->GetHistoVector();
@@ -191,16 +191,6 @@ Bool_t CbmDeviceMonitorTof::InitContainers()
     std::pair<std::string, std::string> psHistoConfig(vHistos[uHisto].first->GetName(), vHistos[uHisto].second);
     fvpsHistosFolder.push_back(psHistoConfig);
 
-    /// Serialize the vector of histo config into a single MQ message
-    FairMQMessagePtr messageHist(NewMessage());
-    Serialize<BoostSerializer<std::pair<std::string, std::string>>>(*messageHist, psHistoConfig);
-
-    /// Send message to the common histogram config messages queue
-    if (Send(messageHist, fsChannelNameHistosConfig) < 0) {
-      LOG(error) << "Problem sending histo config";
-      return false;
-    }  // if( Send( messageHist, fsChannelNameHistosConfig ) < 0 )
-
     LOG(info) << "Config of hist  " << psHistoConfig.first.data() << " in folder " << psHistoConfig.second.data();
   }  // for( UInt_t uHisto = 0; uHisto < vHistos.size(); ++uHisto )
 
@@ -217,16 +207,6 @@ Bool_t CbmDeviceMonitorTof::InitContainers()
 
     fvpsCanvasConfig.push_back(psCanvConfig);
 
-    /// Serialize the vector of canvas config into a single MQ message
-    FairMQMessagePtr messageCan(NewMessage());
-    Serialize<BoostSerializer<std::pair<std::string, std::string>>>(*messageCan, psCanvConfig);
-
-    /// Send message to the common canvas config messages queue
-    if (Send(messageCan, fsChannelNameCanvasConfig) < 0) {
-      LOG(error) << "Problem sending canvas config";
-      return false;
-    }  // if( Send( messageCan, fsChannelNameCanvasConfig ) < 0 )
-
     LOG(info) << "Config string of Canvas  " << psCanvConfig.first.data() << " is " << psCanvConfig.second.data();
   }  //  for( UInt_t uCanv = 0; uCanv < vCanvases.size(); ++uCanv )
 
@@ -237,6 +217,15 @@ Bool_t CbmDeviceMonitorTof::InitContainers()
 // handler is called whenever a message arrives on "data", with a reference to the message and a sub-channel index (here 0)
 bool CbmDeviceMonitorTof::HandleData(FairMQMessagePtr& msg, int /*index*/)
 {
+  if( 0 == fulNumMessages) try {
+     InitContainers();
+  } catch (InitTaskError& e) {
+     LOG(error) << e.what();
+     ChangeState(fair::mq::Transition::ErrorFound);
+  }
+
+  if( 0 == fulNumMessages) InitHistograms();
+
   fulNumMessages++;
   LOG(debug) << "Received message number " << fulNumMessages << " with size " << msg->GetSize();
 
@@ -260,37 +249,67 @@ bool CbmDeviceMonitorTof::HandleData(FairMQMessagePtr& msg, int /*index*/)
   std::chrono::duration<double_t> elapsedSeconds    = currentTime - fLastPublishTime;
   if ((fdMaxPublishTime < elapsedSeconds.count())
       || (0 == fulNumMessages % fuPublishFreqTs && fdMinPublishTime < elapsedSeconds.count())) {
-    SendHistograms();
+    if (!fbConfigSent) {
+      fbConfigSent = SendHistoConfAndData();
+    } // if( !fbConfigSent )
+    else SendHistograms();
+
     fLastPublishTime = std::chrono::system_clock::now();
   }  // if( ( fdMaxPublishTime < elapsedSeconds.count() ) || ( 0 == fulNumMessages % fuPublishFreqTs && fdMinPublishTime < elapsedSeconds.count() ) )
 
   return true;
 }
 
+bool CbmDeviceMonitorTof::SendHistoConfAndData()
+{
+  /// Prepare multiparts message and header
+  std::pair<uint32_t, uint32_t> pairHeader( fvpsHistosFolder.size(), fvpsCanvasConfig.size() );
+  FairMQMessagePtr messageHeader(NewMessage());
+  Serialize< BoostSerializer< std::pair< uint32_t, uint32_t > > >(*messageHeader, pairHeader);
+
+  FairMQParts partsOut;
+  partsOut.AddPart(std::move(messageHeader));
+
+  for (UInt_t uHisto = 0; uHisto < fvpsHistosFolder.size(); ++uHisto) {
+    /// Serialize the vector of histo config into a single MQ message
+    FairMQMessagePtr messageHist(NewMessage());
+    Serialize<BoostSerializer<std::pair<std::string, std::string>>>(*messageHist, fvpsHistosFolder[uHisto]);
+
+    partsOut.AddPart(std::move(messageHist));
+  } // for (UInt_t uHisto = 0; uHisto < fvpsHistosFolder.size(); ++uHisto)
+
+  for (UInt_t uCanv = 0; uCanv < fvpsCanvasConfig.size(); ++uCanv) {
+    /// Serialize the vector of canvas config into a single MQ message
+    FairMQMessagePtr messageCan(NewMessage());
+    Serialize<BoostSerializer<std::pair<std::string, std::string>>>(*messageCan, fvpsCanvasConfig[uCanv]);
+
+    partsOut.AddPart(std::move(messageCan));
+  } // for (UInt_t uCanv = 0; uCanv < fvpsCanvasConfig.size(); ++uCanv)
+
+  /// Serialize the array of histos into a single MQ message
+  FairMQMessagePtr msgHistos(NewMessage());
+  Serialize<RootSerializer>(*msgHistos, &fArrayHisto);
+
+  partsOut.AddPart(std::move(msgHistos));
+
+  /// Send the multi-parts message to the common histogram messages queue
+  if (Send(partsOut, fsChannelNameHistosInput) < 0) {
+    LOG(error) << "CbmDeviceMonitorTof::SendHistoConfAndData => Problem sending data";
+    return false;
+  }  // if( Send( partsOut, fsChannelNameHistosInput ) < 0 )
+
+  /// Reset the histograms after sending them (but do not reset the time)
+  fMonitorAlgo->ResetHistograms(kFALSE);
+
+  return true;
+}
+
 bool CbmDeviceMonitorTof::SendHistograms()
 {
   /// Serialize the array of histos into a single MQ message
   FairMQMessagePtr message(NewMessage());
   Serialize<RootSerializer>(*message, &fArrayHisto);
 
-  // test code to check if deserialization works
-  /*
-  TObject* tempObject = nullptr;
-  Deserialize<RootDeserializer>(*message, tempObject);
-
-  if (TString(tempObject->ClassName()).EqualTo("TObjArray")) {
-   TObjArray* arrayHisto = static_cast<TObjArray*>(tempObject);
-   LOG(info) << "Array contains " << arrayHisto->GetEntriesFast()
-             << " entries";
-    for (Int_t i = 0; i < arrayHisto->GetEntriesFast(); i++) {
-      TObject* obj = arrayHisto->At(i);
-      LOG(info) << obj->GetName();
-      TH1* histogram = static_cast<TH1*>(obj);
-      LOG(info) << histogram->GetNbinsX();
-    }
-  }
-*/
-
   /// Send message to the common histogram messages queue
   if (Send(message, fsChannelNameHistosInput) < 0) {
     LOG(error) << "Problem sending data";
diff --git a/MQ/monitor/CbmDeviceMonitorTof.h b/MQ/monitor/CbmDeviceMonitorTof.h
index 46d629955b188b03234cf4160acaad0ab21d45a2..9cdb9416c1b567e3cb6b90f56b4ee901a3f9b7e3 100644
--- a/MQ/monitor/CbmDeviceMonitorTof.h
+++ b/MQ/monitor/CbmDeviceMonitorTof.h
@@ -50,8 +50,6 @@ private:
   /// User settings parameters
   std::string fsChannelNameDataInput    = "tofcomponent";
   std::string fsChannelNameHistosInput  = "histogram-in";
-  std::string fsChannelNameHistosConfig = "histo-conf";
-  std::string fsChannelNameCanvasConfig = "canvas-conf";
   uint32_t fuHistoryHistoSize           = 3600;
   uint32_t fuMinTotPulser               = 185;
   uint32_t fuMaxTotPulser               = 195;
@@ -82,11 +80,15 @@ private:
   /// Format of Can config is "NbPadX(U);NbPadY(U);ConfigPad1(s);....;ConfigPadXY(s)"
   /// Format of Pad config is "GrixX(b),GridY(b),LogX(b),LogY(b),LogZ(b),HistoName(s),DrawOptions(s)"
   std::vector<std::pair<std::string, std::string>> fvpsCanvasConfig = {};
+  /// Flag indicating whether the histograms and canvases configurations were already published
+  bool fbConfigSent = false;
 
   bool IsChannelNameAllowed(std::string channelName);
-  Bool_t InitContainers();
+  bool InitContainers();
+  bool InitHistograms();
   Bool_t DoUnpack(const fles::Timeslice& ts, size_t component);
   void Finish();
+  bool SendHistoConfAndData();
   bool SendHistograms();
 };
 
diff --git a/MQ/monitor/runMonitorT0.cxx b/MQ/monitor/runMonitorT0.cxx
index 6964f6a1f59e56e88cf49230574b7df19748014b..750d5e0faa61e0962b427aaa7902c0d7e80acac9 100644
--- a/MQ/monitor/runMonitorT0.cxx
+++ b/MQ/monitor/runMonitorT0.cxx
@@ -35,10 +35,6 @@ void addCustomOptions(bpo::options_description& options)
                         "MQ channel name for TS data");
   options.add_options()("ChNameIn", bpo::value<std::string>()->default_value("histogram-in"),
                         "MQ channel name for histos");
-  options.add_options()("ChNameHistCfg", bpo::value<std::string>()->default_value("histo-conf"),
-                        "MQ channel name for histos config");
-  options.add_options()("ChNameCanvCfg", bpo::value<std::string>()->default_value("canvas-conf"),
-                        "MQ channel name for canvases config");
 }
 
 FairMQDevicePtr getDevice(const FairMQProgOptions& /*config*/) { return new CbmDeviceMonitorT0(); }
diff --git a/MQ/monitor/runMonitorTof.cxx b/MQ/monitor/runMonitorTof.cxx
index 74fa210cbc9315ae652ac21a60f1548b83c515f8..985fbfff92b086274e2a85569fb7ba0a65b24531 100644
--- a/MQ/monitor/runMonitorTof.cxx
+++ b/MQ/monitor/runMonitorTof.cxx
@@ -32,10 +32,6 @@ void addCustomOptions(bpo::options_description& options)
                         "MQ channel name for TS data");
   options.add_options()("ChNameIn", bpo::value<std::string>()->default_value("histogram-in"),
                         "MQ channel name for histos");
-  options.add_options()("ChNameHistCfg", bpo::value<std::string>()->default_value("histo-conf"),
-                        "MQ channel name for histos config");
-  options.add_options()("ChNameCanvCfg", bpo::value<std::string>()->default_value("canvas-conf"),
-                        "MQ channel name for canvases config");
 }
 
 FairMQDevicePtr getDevice(const FairMQProgOptions& /*config*/) { return new CbmDeviceMonitorTof(); }