diff --git a/sim/detectors/fsd/CbmFsdDigitize.cxx b/sim/detectors/fsd/CbmFsdDigitize.cxx
index b889b53a559bbe24c9dca0ed6ffa20f9e29b3b21..13cf305f421890ed1351f827eba39fe62f43264b 100644
--- a/sim/detectors/fsd/CbmFsdDigitize.cxx
+++ b/sim/detectors/fsd/CbmFsdDigitize.cxx
@@ -182,10 +182,15 @@ void CbmFsdDigitize::Exec(Option_t*)
         // not within time cut -> send the digi from buffer and replace by the new one
         CbmFsdDigi* oldDigi =
           new CbmFsdDigi(it->second.first->GetAddress(), it->second.first->GetTime(), it->second.first->GetEdep());
-        CbmMatch* oldDigiMatch = new CbmMatch(*it->second.second);
-        if (fCreateMatches) SendData(oldDigi->GetTime(), oldDigi, oldDigiMatch);
-        else
+        if (fCreateMatches) {
+          CbmMatch* oldDigiMatch = new CbmMatch(*it->second.second);
+          SendData(oldDigi->GetTime(), oldDigi, oldDigiMatch);
+          delete it->second.second;
+        }
+        else {
           SendData(oldDigi->GetTime(), oldDigi);
+        }
+        delete it->second.first;
         fDigiBuffer.erase(it);
 
         CbmFsdDigi* digi = new CbmFsdDigi(address, time, eloss);
@@ -248,10 +253,16 @@ void CbmFsdDigitize::ReleaseBuffer(Bool_t sendEverything)
     for (const auto& dp : fDigiBuffer) {
       CbmFsdDigi* digi =
         new CbmFsdDigi(dp.second.first->GetAddress(), dp.second.first->GetTime(), dp.second.first->GetEdep());
-      CbmMatch* digiMatch = new CbmMatch(*dp.second.second);
-      if (fCreateMatches) SendData(digi->GetTime(), digi, digiMatch);
-      else
+      if (fCreateMatches) {
+        CbmMatch* digiMatch = new CbmMatch(*dp.second.second);
+        SendData(digi->GetTime(), digi, digiMatch);
+        delete dp.second.first;
+        delete dp.second.second;
+      }
+      else {
         SendData(digi->GetTime(), digi);
+        delete dp.second.first;
+      }
     }  // # digi buffer
     fDigiBuffer.clear();
   }
@@ -266,11 +277,14 @@ void CbmFsdDigitize::ReleaseBuffer(Bool_t sendEverything)
         // send this digi
         CbmFsdDigi* digi =
           new CbmFsdDigi(dp.second.first->GetAddress(), dp.second.first->GetTime(), dp.second.first->GetEdep());
-        CbmMatch* digiMatch = new CbmMatch(*dp.second.second);
-        if (fCreateMatches) SendData(digi->GetTime(), digi, digiMatch);
-        else
+        if (fCreateMatches) {
+          CbmMatch* digiMatch = new CbmMatch(*dp.second.second);
+          SendData(digi->GetTime(), digi, digiMatch);
+          delete dp.second.second;
+        }
+        else {
           SendData(digi->GetTime(), digi);
-
+        }
         // save which keys were sent and should be removed
         keysSent.push_back(dp.first);
       }  // ? time
diff --git a/sim/detectors/much/CbmMuchDigitizeGem.cxx b/sim/detectors/much/CbmMuchDigitizeGem.cxx
index 05b89110b8e83e1a75f6660934c93db0733a0bee..bf63798dc25fcde31df003272c339e86d900a91b 100644
--- a/sim/detectors/much/CbmMuchDigitizeGem.cxx
+++ b/sim/detectors/much/CbmMuchDigitizeGem.cxx
@@ -702,7 +702,6 @@ void CbmMuchDigitizeGem::ReadAndRegister(Long_t eventTime)
 
   for (std::vector<CbmMuchSignal*>::iterator LoopOver = SignalList.begin(); LoopOver != SignalList.end(); LoopOver++) {
     CbmMuchDigi* digi   = ConvertSignalToDigi(*LoopOver);
-    CbmMatch* digiMatch = new CbmMatch(*(*LoopOver)->GetMatch());  // must be copied from signal
     // assert(digi);
     if (!digi) {
       LOG(debug2) << GetName() << ": Digi not created as signal is below threshold.";
@@ -711,7 +710,13 @@ void CbmMuchDigitizeGem::ReadAndRegister(Long_t eventTime)
       LOG(debug2) << GetName() << ": New digi: sector = " << CbmMuchAddress::GetSectorIndex(digi->GetAddress())
                   << " channel= " << CbmMuchAddress::GetChannelIndex(digi->GetAddress());
 
-      SendData(digi->GetTime(), digi, digiMatch);
+      if (fCreateMatches) {
+        CbmMatch* digiMatch = new CbmMatch(*(*LoopOver)->GetMatch());  // must be copied from signal
+        SendData(digi->GetTime(), digi, digiMatch);
+      }
+      else {
+        SendData(digi->GetTime(), digi);
+      }
       fNofDigis++;
     }
   }
diff --git a/sim/detectors/psd/CbmPsdSimpleDigitizer.cxx b/sim/detectors/psd/CbmPsdSimpleDigitizer.cxx
index d1c9fe4937401bf6eeec338ed9ef8afd18bff2a4..aa8a41adbc6fd170dd2c4677cb3f9137fee38c83 100644
--- a/sim/detectors/psd/CbmPsdSimpleDigitizer.cxx
+++ b/sim/detectors/psd/CbmPsdSimpleDigitizer.cxx
@@ -154,7 +154,12 @@ void CbmPsdSimpleDigitizer::Exec(Option_t*)
     eLossSmeared += eNoise;
     CbmPsdDigi* digi =
       new CbmPsdDigi(entry.second.first.GetAddress(), entry.second.first.GetTime() + fCurrentEventTime, eLossSmeared);
-    SendData(digi->GetTime(), digi, entry.second.second);
+    if (fCreateMatches) {
+      SendData(digi->GetTime(), digi, entry.second.second);
+    }
+    else {
+      SendData(digi->GetTime(), digi);
+    }
     nDigis++;
     LOG(debug1) << fName << ": Digi " << nDigis << " Time " << entry.second.first.GetTime() + fCurrentEventTime
                 << " Section " << entry.second.first.GetSectionID() << " Module " << entry.second.first.GetModuleID()
diff --git a/sim/detectors/tof/CbmTofDigitize.cxx b/sim/detectors/tof/CbmTofDigitize.cxx
index 32f8b487d16a00daab503276874d12ce05a04d93..5647b8c40b74a33ffb32b8decd558cf86a1f589e 100644
--- a/sim/detectors/tof/CbmTofDigitize.cxx
+++ b/sim/detectors/tof/CbmTofDigitize.cxx
@@ -1055,8 +1055,13 @@ Bool_t CbmTofDigitize::MergeSameChanDigis()
     Double_t dHitTime      = fCurrentEventTime + gRandom->Gaus(0., 0.04);
     const Double_t dHitTot = 2.;
     CbmTofDigi* tDigi      = new CbmTofDigi(uChanUId, dHitTime, dHitTot);
-    CbmMatch* tMatch       = new CbmMatch();
-    SendData(tDigi->GetTime(), tDigi, tMatch);  // Send digi to DAQ
+    if (fCreateMatches) {
+      CbmMatch* tMatch       = new CbmMatch();
+      SendData(tDigi->GetTime(), tDigi, tMatch);  // Send digi to DAQ
+    } 
+    else {
+      SendData(tDigi->GetTime(), tDigi);  // Send digi to DAQ
+    }
     fiNbDigis++;
     LOG(debug) << Form("Add fake diamond digis 0x%08x mode with t = %7.3f", uChanUId, dHitTime);
     //delete tDigi;
@@ -1146,12 +1151,16 @@ Bool_t CbmTofDigitize::MergeSameChanDigis()
                     // The original digi will be deleted below, together with the unused digis from the buffer.
                     CbmTofDigi* digi =
                       new CbmTofDigi(*(fStorDigi[iSmType][iSm * iNbRpc + iRpc][iNbSides * iCh + iSide][iDigi0].first));
-                    CbmMatch* match =
-                      new CbmMatch(*(fStorDigi[iSmType][iSm * iNbRpc + iRpc][iNbSides * iCh + iSide][iDigi0].second));
-
                     digi->SetTime(digi->GetTime() * fdDigiTimeConvFactor + fCurrentEventTime);  // ns->ps
-                    SendData(digi->GetTime(), digi, match);                                     // Send digi to DAQ
-                    fiNbDigis++;
+                    if (fCreateMatches) {
+                      CbmMatch* match =
+                        new CbmMatch(*(fStorDigi[iSmType][iSm * iNbRpc + iRpc][iNbSides * iCh + iSide][iDigi0].second));
+                      SendData(digi->GetTime(), digi, match);                                     // Send digi to DAQ
+                   }
+                   else { 
+                      SendData(digi->GetTime(), digi);                                     // Send digi to DAQ
+                   }
+                   fiNbDigis++;
 
                     // TOF QA
                     if (fbMonitorHistos && NULL != digiMatch) {
@@ -1186,10 +1195,16 @@ Bool_t CbmTofDigitize::MergeSameChanDigis()
               // The original digi will be deleted below, together with the unused digis from the buffer.
               CbmTofDigi* digi =
                 new CbmTofDigi(*(fStorDigi[iSmType][iSm * iNbRpc + iRpc][iNbSides * iCh + iSide][iDigi0].first));
-              CbmMatch* match =
-                new CbmMatch(*(fStorDigi[iSmType][iSm * iNbRpc + iRpc][iNbSides * iCh + iSide][iDigi0].second));
               digi->SetTime(digi->GetTime() * fdDigiTimeConvFactor + fCurrentEventTime);  // ns->ps
-              SendData(digi->GetTime(), digi, match);                                     // Send digi to DAQ
+              if (fCreateMatches) {
+                CbmMatch* match =
+                  new CbmMatch(*(fStorDigi[iSmType][iSm * iNbRpc + iRpc][iNbSides * iCh + iSide][iDigi0].second));
+                SendData(digi->GetTime(), digi, match);                                     // Send digi to DAQ
+              }
+              else {
+                SendData(digi->GetTime(), digi);                                     // Send digi to DAQ
+              }
+
               fiNbDigis++;
 
               if (fbMonitorHistos) {
diff --git a/sim/detectors/trd/CbmTrdDigitizer.cxx b/sim/detectors/trd/CbmTrdDigitizer.cxx
index 432c618cf8d3dfe0b3261209b7fcc724afd4f4bf..7f0b83d8954ccafc4f2cf90a69c8350eab94966b 100644
--- a/sim/detectors/trd/CbmTrdDigitizer.cxx
+++ b/sim/detectors/trd/CbmTrdDigitizer.cxx
@@ -225,7 +225,12 @@ void CbmTrdDigitizer::Exec(Option_t*)
     for (std::map<Int_t, pair<CbmTrdDigi*, CbmMatch*>>::iterator it = digis->begin(); it != digis->end(); it++) {
       assert(it->second.second);
       CbmTrdDigi* digi = it->second.first;
-      SendData(digi->GetTime(), digi, it->second.second);
+      if (fCreateMatches) {
+        SendData(digi->GetTime(), digi, it->second.second);
+      }
+      else {
+        SendData(digi->GetTime(), digi);
+      }
       nDigis++;
     }  //# modules
     digis->clear();
@@ -263,7 +268,12 @@ void CbmTrdDigitizer::FlushBuffers()
     for (std::map<Int_t, pair<CbmTrdDigi*, CbmMatch*>>::iterator it = digis->begin(); it != digis->end(); it++) {
       assert(it->second.second);
       CbmTrdDigi* digi = it->second.first;
-      SendData(digi->GetTime(), digi, it->second.second);
+      if (fCreateMatches) {
+        SendData(digi->GetTime(), digi, it->second.second);
+      }
+      else {
+        SendData(digi->GetTime(), digi);
+      }
       nDigis++;
     }  //# modules
     digis->clear();
diff --git a/sim/detectors/trd/CbmTrdModuleSimR.cxx b/sim/detectors/trd/CbmTrdModuleSimR.cxx
index be6f1a092d7914307272d3a09ca529b8a8426691..01ed0883b926d934aa34df8d3ad82e32adf2d6ac 100644
--- a/sim/detectors/trd/CbmTrdModuleSimR.cxx
+++ b/sim/detectors/trd/CbmTrdModuleSimR.cxx
@@ -400,6 +400,7 @@ void CbmTrdModuleSimR::ProcessPulseBuffer(Int_t address, Bool_t FNcall, Bool_t M
 
   fDigiMap[address] = std::make_pair(digi, digiMatch);
 
+  delete fPulseBuffer[address].second;
   fPulseBuffer.erase(address);
 
   if (!FNcall && !MultiCall && trigger == 1) {