diff --git a/include/DoocsIfff.h b/include/DoocsIfff.h
index 3c010691ea66c533c96e08bc2c7ace8c0cd2bf0b..4d277e01dcf1be4ef691d2f4f24113fd283337cc 100644
--- a/include/DoocsIfff.h
+++ b/include/DoocsIfff.h
@@ -31,6 +31,7 @@ namespace ChimeraTK {
     void auto_init(void) override;
     
     void setMacroPulseNumberSource(boost::shared_ptr<ChimeraTK::NDRegisterAccessor<int64_t>> macroPulseNumberSource);
+    void publishZeroMQ() { _publishZMQ = true; }
     DataConsistencyGroup _consistencyGroup;
     
    protected:
@@ -45,6 +46,7 @@ namespace ChimeraTK {
     boost::shared_ptr<NDRegisterAccessor<float>> _f3Value;
     DoocsUpdater& _updater;
     EqFct* _eqFct;
+    bool _publishZMQ{false};
 
     bool isWriteable;
     boost::shared_ptr<ChimeraTK::NDRegisterAccessor<int64_t>> _macroPulseNumberSource;
diff --git a/src/DoocsIfff.cc b/src/DoocsIfff.cc
index ecb95c902877dd8b51902448babee13e6035e58d..68fbdb799902004b12742a0a03b6de9ee6241aa7 100644
--- a/src/DoocsIfff.cc
+++ b/src/DoocsIfff.cc
@@ -60,9 +60,7 @@ namespace ChimeraTK {
     ifff.f3_data = _f3Value->accessData(0);
 
     doocs::Timestamp timestamp(_i1Value->getVersionNumber().getTime());
-    auto sinceEpoch = timestamp.get_seconds_and_microseconds_since_epoch();
-    auto seconds = sinceEpoch.seconds;
-    auto microseconds = sinceEpoch.microseconds;
+
     // update global time stamp of DOOCS, but only if our time stamp is newer
     if(get_global_timestamp() < timestamp) {
       set_global_timestamp(timestamp);
@@ -82,8 +80,26 @@ namespace ChimeraTK {
       this->set_value(&ifff);
     }
 
+    auto sinceEpoch = timestamp.get_seconds_and_microseconds_since_epoch();
+    auto seconds = sinceEpoch.seconds;
+    auto microseconds = sinceEpoch.microseconds;
+
     this->set_tmstmp(seconds, microseconds);
     if(_macroPulseNumberSource) this->set_mpnum(_macroPulseNumberSource->accessData(0));
+
+    if(_publishZMQ) {
+      dmsg_info info;
+      memset(&info, 0, sizeof(info));
+      info.sec = seconds;
+      info.usec = microseconds;
+      if(_macroPulseNumberSource != nullptr) {
+        info.ident = _macroPulseNumberSource->accessData(0);
+      }
+      else {
+        info.ident = 0;
+      }
+      this->send(&info);
+    }
   }
 
   void DoocsIfff::set(EqAdr* eqAdr, EqData* data1, EqData* data2, EqFct* eqFct) {