diff --git a/sim/detectors/psd/CbmPsdSimpleDigitizer.cxx b/sim/detectors/psd/CbmPsdSimpleDigitizer.cxx
index 20189379d7fa30fb67e41820db06a2a03127001d..5d2e48c30cf9ea046fbddad81474e22c32339d1c 100644
--- a/sim/detectors/psd/CbmPsdSimpleDigitizer.cxx
+++ b/sim/detectors/psd/CbmPsdSimpleDigitizer.cxx
@@ -9,6 +9,8 @@
 // -------------------------------------------------------------------------
 #include "CbmPsdSimpleDigitizer.h"
 
+#include "CbmLink.h"
+#include "CbmMatch.h"
 #include "CbmPsdDigi.h"
 #include "CbmPsdPoint.h"
 
@@ -57,9 +59,6 @@ CbmPsdSimpleDigitizer::~CbmPsdSimpleDigitizer() {}
 InitStatus CbmPsdSimpleDigitizer::Init()
 {
 
-  // Matches are not produced
-  fCreateMatches = kFALSE;
-
   // Get RootManager
   FairRootManager* ioman = FairRootManager::Instance();
   assert(ioman),
@@ -101,35 +100,40 @@ void CbmPsdSimpleDigitizer::Exec(Option_t*)
   Int_t modID        = -1;  // module ID
   Int_t scinID       = -1;  // #sciillator
   Int_t sec;
-  std::map<UInt_t, CbmPsdDigi> fired_digis_map;  // map<UInt_t uAddress, CbmPsdDigi>
+  std::map<UInt_t, std::pair<CbmPsdDigi, CbmMatch*>> fired_digis_map;  //store Digis and Matches for each module
 
   for (Int_t iPoint = 0; iPoint < nPoints; iPoint++) {
     point = (CbmPsdPoint*) fPointArray->At(iPoint);
     if (!point) continue;
 
-    modID          = point->GetModuleID();    //marina  1-44 (45)
-    scinID         = point->GetDetectorID();  //1-60
-    Double_t eLoss = point->GetEnergyLoss();
-    Double_t pTime     = point->GetTime();
-    sec                = (Int_t)((scinID - 1) / 6) + 1;  //marina   1-10
-    UInt_t uAddress    = CbmPsdAddress::GetAddress(modID, sec);
+    CbmLink link(1., iPoint, fCurrentMCEntry, fCurrentInput);
+
+    modID           = point->GetModuleID();    //marina  1-44 (45)
+    scinID          = point->GetDetectorID();  //1-60
+    Double_t eLoss  = point->GetEnergyLoss();
+    Double_t pTime  = point->GetTime();
+    sec             = (Int_t)((scinID - 1) / 6) + 1;  //marina   1-10
+    UInt_t uAddress = CbmPsdAddress::GetAddress(modID, sec);
 
     auto it = fired_digis_map.find(uAddress);
     if (it != fired_digis_map.end()) {
       //this key exists
-      it->second.SetEdep(it->second.GetEdep() + eLoss);
-      if (pTime < it->second.GetTime()) it->second.SetTime(pTime);
+      it->second.first.SetEdep(it->second.first.GetEdep() + eLoss);
+      if (pTime < it->second.first.GetTime()) it->second.first.SetTime(pTime);
+      it->second.second->AddLink(link);
     }
     else {
       //this key is new
       CbmPsdDigi digi = CbmPsdDigi(uAddress, pTime, eLoss);
-      fired_digis_map.insert(std::make_pair(uAddress, digi));
+      CbmMatch* match = new CbmMatch();
+      match->AddLink(link);
+      fired_digis_map.insert(std::make_pair(uAddress, std::make_pair(digi, match)));
     }
   }  // Loop over MCPoints
 
   Int_t nDigis = 0;
   for (auto entry : fired_digis_map) {
-    Double_t eDep            = entry.second.GetEdep();
+    Double_t eDep            = entry.second.first.GetEdep();
     Double_t eLossMIP        = eDep / 0.005;  // 5MeV per MIP
     Double_t pixPerMIP       = 15.;           // 15 pix per MIP
     Double_t eLossMIPSmeared = gRandom->Gaus(eLossMIP * pixPerMIP, sqrt(eLossMIP * pixPerMIP)) / pixPerMIP;
@@ -137,12 +141,12 @@ void CbmPsdSimpleDigitizer::Exec(Option_t*)
     Double_t eNoise          = gRandom->Gaus(0, 15) / 50. * 0.005;
     eLossSmeared += eNoise;
     CbmPsdDigi* digi =
-      new CbmPsdDigi(entry.second.GetAddress(), entry.second.GetTime() + fCurrentEventTime, eLossSmeared);
-    SendData(digi->GetTime(), digi);
+      new CbmPsdDigi(entry.second.first.GetAddress(), entry.second.first.GetTime() + fCurrentEventTime, eLossSmeared);
+    SendData(digi->GetTime(), digi, entry.second.second);
     nDigis++;
-    LOG(debug1) << fName << ": Digi " << nDigis << " Time " << entry.second.GetTime() + fCurrentEventTime << " Section "
-                << entry.second.GetSectionID() << " Module " << entry.second.GetModuleID() << " energy "
-                << eLossSmeared;
+    LOG(debug1) << fName << ": Digi " << nDigis << " Time " << entry.second.first.GetTime() + fCurrentEventTime
+                << " Section " << entry.second.first.GetSectionID() << " Module " << entry.second.first.GetModuleID()
+                << " energy " << eLossSmeared;
   }
 
   // --- Event log