diff --git a/MQ/mcbm/CbmDeviceDigiEventSink.cxx b/MQ/mcbm/CbmDeviceDigiEventSink.cxx
index b2d6a15cab651cd10d1f7055a7fe5bbc6a26b3bc..ddedd7a31d3ee68245fca66d175e70469729d700 100644
--- a/MQ/mcbm/CbmDeviceDigiEventSink.cxx
+++ b/MQ/mcbm/CbmDeviceDigiEventSink.cxx
@@ -759,6 +759,16 @@ bool CbmDeviceDigiEventSink::SendHistograms()
   return true;
 }
 
+//--------------------------------------------------------------------//
+void CbmDeviceDigiEventSink::PostRun()
+{
+  // Needed to avoid due to other end of ZMQ channel being already gone if called during Finish/destructor
+  if (kTRUE == fbFillHistos) {
+    SendHistograms();
+    fLastPublishTime = std::chrono::system_clock::now();
+  }  // if( kTRUE == fbFillHistos )
+}
+
 //--------------------------------------------------------------------//
 CbmDeviceDigiEventSink::~CbmDeviceDigiEventSink()
 {
@@ -787,14 +797,12 @@ void CbmDeviceDigiEventSink::Finish()
   LOG(info) << "Still buffered TS " << fmFullTsStorage.size() << " and still buffered empties "
             << fvulMissedTsIndices.size();
 
-  if (kTRUE == fbFillHistos) {
-    SendHistograms();
-    fLastPublishTime = std::chrono::system_clock::now();
-  }  // if( kTRUE == fbFillHistos )
-
-  ChangeState(fair::mq::Transition::Stop);
-  std::this_thread::sleep_for(std::chrono::milliseconds(3000));
-  ChangeState(fair::mq::Transition::End);
+  if (fair::mq::State::Running == GetCurrentState()) {
+    /// Force state transitions only if not already done by ODC/DDS!
+    ChangeState(fair::mq::Transition::Stop);
+    std::this_thread::sleep_for(std::chrono::milliseconds(3000));
+    ChangeState(fair::mq::Transition::End);
+  }
 
   fbFinishDone = kTRUE;
 }
diff --git a/MQ/mcbm/CbmDeviceDigiEventSink.h b/MQ/mcbm/CbmDeviceDigiEventSink.h
index 0d617899f45594e3c181dc506ac8ba9ac4ec703d..8c016409bc8f640a0d37cfb2661021d62bbb1165 100644
--- a/MQ/mcbm/CbmDeviceDigiEventSink.h
+++ b/MQ/mcbm/CbmDeviceDigiEventSink.h
@@ -93,6 +93,7 @@ protected:
   bool HandleMissTsData(FairMQMessagePtr&, int);
   bool HandleData(FairMQParts&, int);
   bool HandleCommand(FairMQMessagePtr&, int);
+  virtual void PostRun();
 
 private:
   /// Constants