diff --git a/core/data/global/CbmTzdDigi.cxx b/core/data/global/CbmTzdDigi.cxx
index de9c0d515c08cbbc0623ca523caf22df2939b2aa..10a0747310e9e379726da72283e2ec9ba5d1729c 100644
--- a/core/data/global/CbmTzdDigi.cxx
+++ b/core/data/global/CbmTzdDigi.cxx
@@ -1,5 +1,21 @@
 /* Copyright (C) 2022 GSI Helmholtzzentrum fuer Schwerionenforschung, Darmstadt
    SPDX-License-Identifier: GPL-3.0-only
-   Authors: Volker Friese [committer] */
+   Authors: Pierre-Alain Loizeau, Volker Friese [committer] */
 
 #include "CbmTzdDigi.h"
+
+#include "CbmTofDigi.h"
+
+CbmTzdDigi::CbmTzdDigi(const CbmTofDigi& digi)
+  : fAddress(digi.GetAddress())
+  , fTime(digi.GetTime())
+  , fCharge(digi.GetCharge())
+{
+}
+
+CbmTzdDigi::CbmTzdDigi(const CbmTofDigi* digi)
+  : fAddress(digi->GetAddress())
+  , fTime(digi->GetTime())
+  , fCharge(digi->GetCharge())
+{
+}
diff --git a/core/data/global/CbmTzdDigi.h b/core/data/global/CbmTzdDigi.h
index 45acc223df28790733df917b1fa2adb8f0c98c1a..e1aca61c864d068abce9764f04add67cb019ad8e 100644
--- a/core/data/global/CbmTzdDigi.h
+++ b/core/data/global/CbmTzdDigi.h
@@ -1,6 +1,6 @@
 /* Copyright (C) 2022 GSI Helmholtzzentrum fuer Schwerionenforschung, Darmstadt
    SPDX-License-Identifier: GPL-3.0-only
-   Authors: Volker Friese [committer] */
+   Authors: Pierre-Alain Loizeau, Volker Friese [committer] */
 
 
 #ifndef CBMTZDDIGI_H
@@ -8,8 +8,19 @@
 
 #include "CbmDefs.h"
 
+#ifndef NO_ROOT
+#include <Rtypes.h>  // for ClassDef
+#endif
+
+#include <boost/serialization/access.hpp>
+#include <boost/serialization/base_object.hpp>
+
 #include <cstdint>
 
+#ifndef CBMTOFDIGI_H
+class CbmTofDigi;  // For declaration of the conversion constructor without starting a cyclic dependency
+#endif             // CBMTOFDIGI_H
+
 /** @class CbmTzdDigi
  ** @brief Data class for a signal in the t-zero detector
  **
@@ -19,11 +30,28 @@
 class CbmTzdDigi {
 
 public:
+  /** @brief Default Constructor
+   **/
+  CbmTzdDigi() = default;
+
   /** @brief Constructor
    ** @param time Measurement time [ns]
    ** @param charge Measured charge]
+   ** @param address [32b CbmAddress]
+   **/
+  CbmTzdDigi(int32_t addr, double time, float charge) : fAddress(addr), fTime(time), fCharge(charge) {};
+
+
+  /** @brief Constructor
+   ** @param reference to CbmTofDigi (equivalent content)
+   **/
+  CbmTzdDigi(const CbmTofDigi& digi);
+
+
+  /** @brief Constructor
+   ** @param pointer to const CbmTofDigi object (equivalent content)
    **/
-  CbmTzdDigi(double time = -1., float charge = -1.) : fTime(time), fCharge(charge) {};
+  CbmTzdDigi(const CbmTofDigi* digi);
 
 
   /** @brief Destructor **/
@@ -42,28 +70,34 @@ public:
   static const char* GetClassName() { return "CbmTzdDigi"; }
 
 
-  /** @brief Charge
-   ** @return Charge
-   **/
-  double GetCharge() const { return fCharge; }
-
-
   /** System ID (static)
   ** @return System identifier (EcbmModuleId)
   **/
   static ECbmModuleId GetSystem() { return ECbmModuleId::kT0; }
 
 
+  /** @brief Address
+   ** @return Address
+   **/
+  int32_t GetAddress() const { return fAddress; }
+
+
   /** @brief Time
    ** @return Time of measurement [ns]
    **/
   double GetTime() const { return fTime; }
 
 
-  /** @brief Set the measured charge
-   ** @param charge Charge
+  /** @brief Charge
+   ** @return Charge
    **/
-  void SetCharge(float charge) { fCharge = charge; }
+  double GetCharge() const { return fCharge; }
+
+
+  /** @brief Set the address
+   ** @param address [32b CbmAddress]
+   **/
+  void SetAddress(int32_t addr) { fAddress = addr; }
 
 
   /** @brief Set the measurement time
@@ -72,10 +106,30 @@ public:
   void SetTime(double time) { fTime = time; }
 
 
+  /** @brief Set the measured charge
+   ** @param charge Charge
+   **/
+  void SetCharge(float charge) { fCharge = charge; }
+
+
 private:
   int32_t fAddress = ToIntegralType<ECbmModuleId>(ECbmModuleId::kT0);  ///< Unique CBM address
   double fTime     = -1.;                                              ///< Time of signal in TZD [ns]
   float fCharge    = -1.;                                              ///< Charge
+
+  friend class boost::serialization::access;
+
+  template<class Archive>
+  void serialize(Archive& ar, const unsigned int /*version*/)
+  {
+    ar& fAddress;
+    ar& fTime;
+    ar& fCharge;
+  }
+
+#ifndef NO_ROOT
+  ClassDefNV(CbmTzdDigi, 1);
+#endif
 };
 
 #endif /* CBMTZDDIGI_H */
diff --git a/core/data/tof/CbmTofDigi.cxx b/core/data/tof/CbmTofDigi.cxx
index e15265881627d380e9338a4f1053ab5fc7cadcdd..28e0875dde01fe716c6df7caddfb633f7e139b21 100644
--- a/core/data/tof/CbmTofDigi.cxx
+++ b/core/data/tof/CbmTofDigi.cxx
@@ -10,6 +10,8 @@
  **/
 #include "CbmTofDigi.h"
 
+#include "CbmTzdDigi.h"
+
 #include <iomanip>  // for hex, setw, setfill, fixed, setprecission
 #include <sstream>  // for operator<<, basic_ostream, char_trait
 #include <string>   // for basic_string
@@ -34,6 +36,20 @@ CbmTofDigi::CbmTofDigi(uint32_t Sm, uint32_t Rpc, uint32_t Channel, double time,
   fuAddress = CbmTofAddress::GetUniqueAddress(Sm, Rpc, Channel, Side, SmType);
 }
 
+CbmTofDigi::CbmTofDigi(const CbmTzdDigi& digi)
+  : fdTime(digi.GetTime())
+  , fdTot(digi.GetCharge())
+  , fuAddress(digi.GetAddress())
+{
+}
+
+CbmTofDigi::CbmTofDigi(const CbmTzdDigi* digi)
+  : fdTime(digi->GetTime())
+  , fdTot(digi->GetCharge())
+  , fuAddress(digi->GetAddress())
+{
+}
+
 CbmTofDigi::~CbmTofDigi()
 {
   //  if ( fMatch ) delete fMatch;
diff --git a/core/data/tof/CbmTofDigi.h b/core/data/tof/CbmTofDigi.h
index 99febb4a8cec0d5233cf026824a253db6ed53d06..08a43d7fcd799a18f5c868d3977abce483982b60 100644
--- a/core/data/tof/CbmTofDigi.h
+++ b/core/data/tof/CbmTofDigi.h
@@ -40,6 +40,9 @@
 #include <string>  // for string
 
 //class CbmMatch;
+#ifndef CBMTZDDIGI_H
+class CbmTzdDigi;  // For declaration of the conversion constructor without starting a cyclic dependency
+#endif             /* CBMTZDDIGI_H */
 
 class CbmTofDigi {
 public:
@@ -69,6 +72,16 @@ public:
   CbmTofDigi(uint32_t Sm, uint32_t Rpc, uint32_t Channel, double time, double tot, uint32_t Side = 0,
              uint32_t SmType = 0);
 
+  /** @brief Constructor
+   ** @param reference to CbmTzdDigi (equivalent content)
+   **/
+  CbmTofDigi(const CbmTzdDigi& digi);
+
+  /** @brief Constructor
+   ** @param pointer to const CbmTzdDigi object (equivalent content)
+   **/
+  CbmTofDigi(const CbmTzdDigi* digi);
+
   /**
        ** @brief Copy constructor.
        **/
diff --git a/sim/detectors/tzd/CbmTzdDigitize.cxx b/sim/detectors/tzd/CbmTzdDigitize.cxx
index bcddaf179491eb8cabd5bc2a3a08dd799cf3b330..d9130dac0cfadb961a45ddf58dd3967910063d83 100644
--- a/sim/detectors/tzd/CbmTzdDigitize.cxx
+++ b/sim/detectors/tzd/CbmTzdDigitize.cxx
@@ -48,7 +48,7 @@ void CbmTzdDigitize::Exec(Option_t*)
   // --- Create digi and send it to DAQ
   double digiTime  = fCurrentEventTime + gRandom->Gaus(0., fResolution);
   double charge    = 1.;  // Placeholder
-  CbmTzdDigi* digi = new CbmTzdDigi(digiTime, charge);
+  CbmTzdDigi* digi = new CbmTzdDigi(ToIntegralType<ECbmModuleId>(ECbmModuleId::kT0), digiTime, charge);
   if (fCreateMatches) {
     CbmMatch* digiMatch = new CbmMatch();
     digiMatch->AddLink(1., -1, fCurrentMCEntry, fCurrentInput);