diff --git a/reco/tasks/CbmTaskMakeRecoEvents.cxx b/reco/tasks/CbmTaskMakeRecoEvents.cxx
index 7094ba466f48925836c3fb07226f8512aba8135f..d4aa09a0c738870f8abfe25ab00ef9bf01de2176 100644
--- a/reco/tasks/CbmTaskMakeRecoEvents.cxx
+++ b/reco/tasks/CbmTaskMakeRecoEvents.cxx
@@ -53,16 +53,29 @@ void CbmTaskMakeRecoEvents::Exec(Option_t*)
   Int_t eventNr = 0;
   for (auto& digiEvent : *fDigiEvents) {
 
-    // --- Copy StsDigis
-    size_t startIndex = fStsDigis->size();
-    fStsDigis->insert(fStsDigis->end(), digiEvent.fData.fSts.fDigis.begin(), digiEvent.fData.fSts.fDigis.end());
-    size_t stopIndex = startIndex + digiEvent.fData.fSts.fDigis.size();
-
-    // --- Create and fill CbmEvent object
+    // --- Create CbmEvent object
     CbmEvent* recoEvent = new ((*fRecoEvents)[eventNr]) CbmEvent(eventNr);
-    for (size_t index = startIndex; index < stopIndex; index++) {
-      recoEvent->AddData(ECbmDataType::kStsDigi, index);
-    }
+
+    // --- Copy T0 digis
+    FillTree<CbmTofDigi>(digiEvent.fData.fT0.fDigis, fT0Digis, recoEvent, ECbmDataType::kT0Digi);
+
+    // --- Copy STS digis
+    FillTree<CbmStsDigi>(digiEvent.fData.fSts.fDigis, fStsDigis, recoEvent, ECbmDataType::kStsDigi);
+
+    // --- Copy RICH digis
+    FillTree<CbmRichDigi>(digiEvent.fData.fRich.fDigis, fRichDigis, recoEvent, ECbmDataType::kRichDigi);
+
+    // --- Copy MUCH digis
+    FillTree<CbmMuchDigi>(digiEvent.fData.fMuch.fDigis, fMuchDigis, recoEvent, ECbmDataType::kMuchDigi);
+
+    // --- Copy TRD digis
+    FillTree<CbmTrdDigi>(digiEvent.fData.fTrd.fDigis, fTrdDigis, recoEvent, ECbmDataType::kTrdDigi);
+
+    // --- Copy TOF digis
+    FillTree<CbmTofDigi>(digiEvent.fData.fTof.fDigis, fTofDigis, recoEvent, ECbmDataType::kTofDigi);
+
+    // --- Copy PSD digis
+    FillTree<CbmPsdDigi>(digiEvent.fData.fPsd.fDigis, fPsdDigis, recoEvent, ECbmDataType::kPsdDigi);
 
     eventNr++;
   }  //# events
@@ -72,9 +85,10 @@ void CbmTaskMakeRecoEvents::Exec(Option_t*)
   stringstream logOut;
   logOut << setw(20) << left << GetName() << " [";
   logOut << fixed << setw(8) << setprecision(1) << right << timer.RealTime() * 1000. << " ms] ";
-  logOut << "TS " << fNumTs << ", events " << fDigiEvents->size() << ", STS digis " << fStsDigis->size();
+  logOut << "TS " << fNumTs << ", events " << fDigiEvents->size() << ", Digis: T0 " << fT0Digis->size() << " STS "
+         << fStsDigis->size() << " RICH " << fRichDigis->size() << " MUCH " << fMuchDigis->size() << " TRD "
+         << fTrdDigis->size() << " TOF " << fTofDigis->size() << " PSD" << fPsdDigis->size();
   LOG(info) << logOut.str();
-  assert(fDigiEvents->size() == static_cast<size_t>(fRecoEvents->GetEntriesFast()));
 
   // --- Run statistics
   fNumTs++;
@@ -114,9 +128,11 @@ InitStatus CbmTaskMakeRecoEvents::Init()
   // --- Try to get input vector (CbmDigiEvent)
   fDigiEvents = frm->InitObjectAs<const std::vector<CbmDigiEvent>*>("DigiEvent");
 
-  // --- If DigiEvents are present, create StsDigi and CbmEvent branches
+  // --- If DigiEvents are present, create Digi and CbmEvent branches
   if (fDigiEvents) {
     LOG(info) << GetName() << ": Found branch DigiEvent";
+
+    // --- Event
     if (frm->GetObject("CbmEvent")) {
       LOG(error) << GetName() << ": Found branch CbmEvent! Aborting...";
       return kFATAL;
@@ -127,8 +143,34 @@ InitStatus CbmTaskMakeRecoEvents::Init()
       LOG(error) << GetName() << ": Found branch StsDigi! Aborting...";
       return kFATAL;
     }
+
+    // --- T0 digis
+    fT0Digis = new std::vector<CbmTofDigi>;
+    frm->RegisterAny("T0Digi", fT0Digis, kFALSE);
+
+    // --- STS digis
     fStsDigis = new std::vector<CbmStsDigi>;
     frm->RegisterAny("StsDigi", fStsDigis, kFALSE);
+
+    // --- RICH digis
+    fRichDigis = new std::vector<CbmRichDigi>;
+    frm->RegisterAny("RichDigi", fRichDigis, kFALSE);
+
+    // --- MUCH digis
+    fMuchDigis = new std::vector<CbmMuchDigi>;
+    frm->RegisterAny("MuchDigi", fMuchDigis, kFALSE);
+
+    // --- TRD digis
+    fTrdDigis = new std::vector<CbmTrdDigi>;
+    frm->RegisterAny("TrdDigi", fTrdDigis, kFALSE);
+
+    // --- TOF digis
+    fTofDigis = new std::vector<CbmTofDigi>;
+    frm->RegisterAny("TofDigi", fTofDigis, kFALSE);
+
+    // --- PSD digis
+    fPsdDigis = new std::vector<CbmPsdDigi>;
+    frm->RegisterAny("PsdDigi", fPsdDigis, kFALSE);
   }
 
   // --- If no DigiEvent branch is present, there must be a CbmEvent branch
diff --git a/reco/tasks/CbmTaskMakeRecoEvents.h b/reco/tasks/CbmTaskMakeRecoEvents.h
index b5edfdb9e012dfc10dc641a0e15c5881a28eacdc..5b19a7dd738378c134ef3cdd5e2a8a43dff18ebf 100644
--- a/reco/tasks/CbmTaskMakeRecoEvents.h
+++ b/reco/tasks/CbmTaskMakeRecoEvents.h
@@ -9,6 +9,7 @@
 
 #include "CbmDefs.h"
 #include "CbmDigiEvent.h"
+#include "CbmEvent.h"
 
 #include <FairTask.h>
 
@@ -68,10 +69,36 @@ private:  // methods
   virtual InitStatus Init();
 
 
+  /** @brief Fill the tree structure with digis from CbmDigiEvent
+   ** @param inVec  Digi vector form CbmDigiEvent
+   ** @param outVec  Digi vector in TTree branch
+   ** @param event  Pointer to CbmEvent object the digis will be registered to
+   ** @param digiType  Type of digi class (ECbmDataType)
+   **
+   ** Copies the digis from CbmDigiEvent into the TTree branch and registers them to
+   ** the CbmEvent object.
+   **/
+  template<typename Digi>
+  void FillTree(const std::vector<Digi>& inVec, std::vector<Digi>* outVec, CbmEvent* event, ECbmDataType digiType)
+  {
+    size_t startIndex = outVec->size();
+    size_t stopIndex  = startIndex + inVec.size();
+    outVec->insert(outVec->end(), inVec.begin(), inVec.end());
+    for (size_t index = startIndex; index < stopIndex; index++)
+      event->AddData(digiType, index);
+  }
+
+
 private:  // members
   const std::vector<CbmDigiEvent>* fDigiEvents = nullptr;
   TClonesArray* fRecoEvents                    = nullptr;
+  std::vector<CbmTofDigi>* fT0Digis            = nullptr;
   std::vector<CbmStsDigi>* fStsDigis           = nullptr;
+  std::vector<CbmRichDigi>* fRichDigis         = nullptr;
+  std::vector<CbmMuchDigi>* fMuchDigis         = nullptr;
+  std::vector<CbmTrdDigi>* fTrdDigis           = nullptr;
+  std::vector<CbmTofDigi>* fTofDigis           = nullptr;
+  std::vector<CbmPsdDigi>* fPsdDigis           = nullptr;
   double fTimeTot                              = 0.;  ///< Execution time
   size_t fNumTs                                = 0;   ///< Number of processed timeslices
   size_t fNumEvents                            = 0;   ///< Number of events