diff --git a/reco/detectors/trd/CbmTrdHitProducer.cxx b/reco/detectors/trd/CbmTrdHitProducer.cxx
index 16e554833bd6e256a671294bb0adbb31c01a2e58..4ce3b06b930dd3b96b3045ca7495b058f864a79b 100644
--- a/reco/detectors/trd/CbmTrdHitProducer.cxx
+++ b/reco/detectors/trd/CbmTrdHitProducer.cxx
@@ -12,8 +12,8 @@
 #include "CbmTrdGeoHandler.h"
 #include "CbmTrdHit.h"
 #include "CbmTrdModuleRec.h"
+#include "CbmTrdModuleRec2D.h"
 #include "CbmTrdModuleRecR.h"
-#include "CbmTrdModuleRecT.h"
 #include "CbmTrdParAsic.h"
 #include "CbmTrdParModDigi.h"
 #include "CbmTrdParModGain.h"
@@ -56,25 +56,31 @@ CbmTrdHitProducer::~CbmTrdHitProducer()
 }
 
 //____________________________________________________________________________________
-void CbmTrdHitProducer::addModuleHits(CbmTrdModuleRec* mod, Int_t* hitCounter, CbmEvent* event)
+UInt_t CbmTrdHitProducer::addModuleHits(CbmTrdModuleRec* mod, CbmEvent* event)
 {
 
   /** Absorb the TClonesArrays of the individual modules into the global
       TClonesArray.
    */
 
-  if (!mod) return;
+  if (!mod) return 0;
 
   auto hits = mod->GetHits();
 
-  if (!hits) return;
+  if (!hits) return 0;
 
-  while (!hits->IsEmpty()) {
-    fHits->AbsorbObjects(hits, 0, 0);
-    if (event) event->AddData(ECbmDataType::kTrdHit, *hitCounter);
-    (*hitCounter)++;
-    fNrHits++;
+  std::uint32_t numModuleHits = hits->GetEntriesFast();
+  if (!numModuleHits) return 0;
+  if (event) {
+    uint32_t nHitsTs = fNrHitsCall;
+    int32_t nHitsEv  = event->GetNofData(ECbmDataType::kTrdHit);
+    if (nHitsEv > 0) nHitsTs += nHitsEv;
+    for (std::uint32_t iHit = 0; iHit < numModuleHits; ++iHit)
+      event->AddData(ECbmDataType::kTrdHit, nHitsTs + iHit);
   }
+  fHits->AbsorbObjects(hits);
+  fNrHits += numModuleHits;
+  return numModuleHits;
 }
 
 //____________________________________________________________________________________
@@ -91,8 +97,8 @@ CbmTrdModuleRec* CbmTrdHitProducer::AddModule(Int_t address, TGeoPhysicalNode* n
   LOG(debug) << GetName() << "::AddModule(" << node->GetName() << " " << (moduleType < 9 ? 'R' : 'T') << "] mod["
              << moduleAddress << "] ly[" << lyId << "] det[" << moduleAddress << "]";
 
-  CbmTrdModuleRec* module(NULL);
-  if (moduleType >= 9) { module = fModules[address] = new CbmTrdModuleRecT(address); }
+  CbmTrdModuleRec* module(nullptr);
+  if (moduleType >= 9) { module = fModules[address] = new CbmTrdModuleRec2D(address); }
   else {
     module = fModules[address] = new CbmTrdModuleRecR(address);
   }
@@ -218,7 +224,7 @@ Int_t CbmTrdHitProducer::addHits(CbmEvent* event)
     mod->PreProcessHits();
     mod->PostProcessHits();
 
-    addModuleHits(mod, &hitCounter, event);
+    hitCounter += addModuleHits(mod, event);
   }
 
   // AbsorberObjects takes care of cleaning up.
@@ -287,15 +293,15 @@ void CbmTrdHitProducer::Exec(Option_t*)
   timerTs.Start();
 
   Long64_t nClusters  = fClusters->GetEntriesFast();
-  UInt_t hitCounterTs = 0;
   UInt_t nEvents      = 0;
+  fNrHitsCall         = 0;
 
   if (CbmTrdClusterFinder::UseOnlyEventDigis()) {
     for (auto eventobj : *fEvents) {
       timer.Start();
       auto event = static_cast<CbmEvent*>(eventobj);
       if (!event) continue;
-      hitCounterTs += processClusters(event);
+      fNrHitsCall += processClusters(event);
       fNrEvents++;
       nEvents++;
       timer.Stop();
@@ -310,7 +316,7 @@ void CbmTrdHitProducer::Exec(Option_t*)
 
   if (!CbmTrdClusterFinder::UseOnlyEventDigis()) {
     timer.Start();
-    hitCounterTs = processClusters();
+    fNrHitsCall = processClusters();
     fNrEvents++;
     timer.Stop();
     if (CbmTrdClusterFinder::DoDebugPrintouts()) {
@@ -333,7 +339,7 @@ void CbmTrdHitProducer::Exec(Option_t*)
   logOut << fixed << setw(8) << setprecision(1) << right << timerTs.RealTime() * 1000. << " ms] ";
   logOut << "TS " << fNrTs;
   if (CbmTrdClusterFinder::UseOnlyEventDigis()) logOut << ", events " << nEvents;
-  logOut << ", clusters " << nClusters << ", hits " << hitCounterTs;
+  logOut << ", clusters " << nClusters << ", hits " << fNrHitsCall;
   LOG(info) << logOut.str();
   fNrTs++;
 }
diff --git a/reco/detectors/trd/CbmTrdHitProducer.h b/reco/detectors/trd/CbmTrdHitProducer.h
index 5e529f3ec4c827b024779a7826df650c2a2273b4..f3781cb1d8be749ac51c5cce37d2c081e5316da4 100644
--- a/reco/detectors/trd/CbmTrdHitProducer.h
+++ b/reco/detectors/trd/CbmTrdHitProducer.h
@@ -90,13 +90,13 @@ private:
   void processCluster(const Int_t clusterIdx);
 
   /**
-   * @brief Pass all hits produced by the given module to the TrdHit branch
+   * @brief Pass all hits produced by the given module to the TrdHit branch. 
+   * In case of event not nullptr only the hits conditioned by event are returned.
    * 
-   * @param mod 
-   * @param hitCounter 
-   * @param event 
+   * @param mod : Trd module being processed
+   * @param event : not nullptr for event based reconstruction
    */
-  void addModuleHits(CbmTrdModuleRec* mod, Int_t* hitCounter, CbmEvent* event);
+  UInt_t addModuleHits(CbmTrdModuleRec* mod, CbmEvent* event);
 
   /**
    * @brief Loop over all modules in the given geometry and call addModuleHits(imodule)
@@ -133,6 +133,9 @@ private:
   /** @brief Number of produced hits. */
   UInt_t fNrHits = 0;
 
+  /** @brief Number of produced hits per call of Exec, i.e. Event(EbyE) or TimeSlice(TB). */
+  UInt_t fNrHitsCall = 0;
+
   /** @brief Total processing time [RealTime]. */
   Float_t fProcessTime = 0;