diff --git a/core/data/CMakeLists.txt b/core/data/CMakeLists.txt
index 35486f0f2695bb6677f82557d1d717480c47a5e5..caf693ea6cb476b825219a39f23841b47bdda259 100644
--- a/core/data/CMakeLists.txt
+++ b/core/data/CMakeLists.txt
@@ -104,6 +104,7 @@ set(SRCS
   tof/CbmTofTrackletParam.cxx
 
   psd/CbmPsdDigi.cxx
+  psd/CbmPsdDsp.cxx
   psd/CbmPsdHit.cxx
   psd/CbmPsdPoint.cxx
   psd/CbmPsdAddress.cxx
diff --git a/core/data/DataLinkDef.h b/core/data/DataLinkDef.h
index 72d70a568fbe37d699fef926c162403533d9a2ff..8c8156ecb4c39248df45cba7de7dcb933541639d 100644
--- a/core/data/DataLinkDef.h
+++ b/core/data/DataLinkDef.h
@@ -80,7 +80,8 @@
 #pragma link C++ class CbmTofTracklet + ;
 #pragma link C++ class CbmTofTrackletParam + ;
 
-#pragma link C++ class CbmPsdDigi-;
+#pragma link C++ class CbmPsdDigi + ;
+#pragma link C++ class CbmPsdDsp + ;
 #pragma link C++ class CbmPsdHit;
 #pragma link C++ class CbmPsdPoint + ;
 #pragma link C++ class CbmPsdAddress;
@@ -113,6 +114,7 @@
 #pragma link C++ class vector < CbmTrdDigi> + ;
 #pragma link C++ class vector < CbmTofDigi> + ;
 #pragma link C++ class vector < CbmPsdDigi> + ;
+#pragma link C++ class vector < CbmPsdDsp> + ;
 #pragma link C++ class vector < CbmMatch> + ;
 #pragma link C++ class CbmDigiVector < CbmMvdDigi> + ;
 #pragma link C++ class CbmDigiVector < CbmStsDigi> + ;
@@ -122,6 +124,7 @@
 #pragma link C++ class CbmDigiVector < CbmTrdDigi> + ;
 #pragma link C++ class CbmDigiVector < CbmTofDigi> + ;
 #pragma link C++ class CbmDigiVector < CbmPsdDigi> + ;
+#pragma link C++ class CbmDigiVector < CbmPsdDsp> + ;
 #pragma link C++ class vector < CbmEventStore> + ;
 
 #pragma read sourceClass="CbmTofDigi" version="[1-2]" targetClass="CbmTofDigi" \
diff --git a/core/data/psd/CbmPsdDigi.cxx b/core/data/psd/CbmPsdDigi.cxx
index eee0c67ab984b118b0ed7e8046e99bf09e386bd8..2cf8882fa320acc7929b85423a22f1af0b454884 100644
--- a/core/data/psd/CbmPsdDigi.cxx
+++ b/core/data/psd/CbmPsdDigi.cxx
@@ -40,20 +40,6 @@ CbmPsdDigi::CbmPsdDigi(const CbmPsdDigi& other)
   : fuAddress(other.fuAddress)
   , fdTime(other.fdTime)
   , fdEdep(other.fdEdep)
-  , fuZL(other.fuZL)
-  , fdAccum(other.fdAccum)
-  , fdAdcTime(other.fdAdcTime)
-
-  , fdEdepWfm(other.fdEdepWfm)
-  , fdAmpl(other.fdAmpl)
-  , fuMinimum(other.fuMinimum)
-  , fuTimeMax(other.fuTimeMax)
-
-  , fdFitAmpl(other.fdFitAmpl)
-  , fdFitZL(other.fdFitZL)
-  , fdFitEdep(other.fdFitEdep)
-  , fdFitR2(other.fdFitR2)
-  , fdFitTimeMax(other.fdFitTimeMax)
 {
 }
 
@@ -63,20 +49,6 @@ CbmPsdDigi::CbmPsdDigi(CbmPsdDigi&& other)
   : fuAddress(other.fuAddress)
   , fdTime(other.fdTime)
   , fdEdep(other.fdEdep)
-  , fuZL(other.fuZL)
-  , fdAccum(other.fdAccum)
-  , fdAdcTime(other.fdAdcTime)
-
-  , fdEdepWfm(other.fdEdepWfm)
-  , fdAmpl(other.fdAmpl)
-  , fuMinimum(other.fuMinimum)
-  , fuTimeMax(other.fuTimeMax)
-
-  , fdFitAmpl(other.fdFitAmpl)
-  , fdFitZL(other.fdFitZL)
-  , fdFitEdep(other.fdFitEdep)
-  , fdFitR2(other.fdFitR2)
-  , fdFitTimeMax(other.fdFitTimeMax)
 {
 }
 
@@ -92,20 +64,6 @@ CbmPsdDigi& CbmPsdDigi::operator=(const CbmPsdDigi& other)
     fuAddress = other.fuAddress;
     fdTime    = other.fdTime;
     fdEdep    = other.fdEdep;
-    fuZL      = other.fuZL;
-    fdAccum   = other.fdAccum;
-    fdAdcTime = other.fdAdcTime;
-
-    fdEdepWfm = other.fdEdepWfm;
-    fdAmpl    = other.fdAmpl;
-    fuMinimum = other.fuMinimum;
-    fuTimeMax = other.fuTimeMax;
-
-    fdFitAmpl    = other.fdFitAmpl;
-    fdFitZL      = other.fdFitZL;
-    fdFitEdep    = other.fdFitEdep;
-    fdFitR2      = other.fdFitR2;
-    fdFitTimeMax = other.fdFitTimeMax;
   }
   return *this;
 }
@@ -118,20 +76,6 @@ CbmPsdDigi& CbmPsdDigi::operator=(CbmPsdDigi&& other)
     fuAddress = other.fuAddress;
     fdTime    = other.fdTime;
     fdEdep    = other.fdEdep;
-    fuZL      = other.fuZL;
-    fdAccum   = other.fdAccum;
-    fdAdcTime = other.fdAdcTime;
-
-    fdEdepWfm = other.fdEdepWfm;
-    fdAmpl    = other.fdAmpl;
-    fuMinimum = other.fuMinimum;
-    fuTimeMax = other.fuTimeMax;
-
-    fdFitAmpl    = other.fdFitAmpl;
-    fdFitZL      = other.fdFitZL;
-    fdFitEdep    = other.fdFitEdep;
-    fdFitR2      = other.fdFitR2;
-    fdFitTimeMax = other.fdFitTimeMax;
   }
   return *this;
 }
@@ -152,110 +96,5 @@ std::string CbmPsdDigi::ToString() const
 }
 
 
-// --- Custom Streamer
-void CbmPsdDigi::Streamer(TBuffer& R__b)
-{
-  // Stream an object of class CbmPsdDigi.
-
-  UInt_t R__s, R__c;
-  if (R__b.IsReading()) {
-    Version_t R__v = R__b.ReadVersion(&R__s, &R__c);
-    if (R__v) {}
-    //      LOG(info) << "Reading CbmPsdDigi version " << R__v;
-    if (3 == R__v) {
-      R__b >> fdEdep;
-      R__b >> fdTime;
-      R__b >> fuAddress;
-      R__b.CheckByteCount(R__s, R__c, CbmPsdDigi::IsA());
-    }
-    else if (4 == R__v) {
-      R__b >> ffFitHarmonic1;
-      R__b >> ffFitHarmonic2;
-      R__b >> ffFitR2;
-      R__b >> ffFitEdep;
-      R__b >> fdEdep;
-      R__b >> fdTime;
-      R__b >> fuAddress;
-      R__b >> fuAmpl;
-      R__b >> fuZL;
-      R__b >> fdEdepWfm;
-      R__b.CheckByteCount(R__s, R__c, CbmPsdDigi::IsA());
-    }
-    else if (5 == R__v) {
-      R__b >> fuAddress;
-      R__b >> fdTime;
-      R__b >> fdEdep;
-      R__b >> fuZL;
-      R__b >> fdAccum;
-      R__b >> fdAdcTime;
-
-      R__b >> fdEdepWfm;
-      R__b >> fdAmpl;
-      R__b >> fuMinimum;
-      R__b >> fuTimeMax;
-
-      R__b >> fdFitAmpl;
-      R__b >> fdFitZL;
-      R__b >> fdFitEdep;
-      R__b >> fdFitR2;
-      R__b >> fdFitTimeMax;
-
-      R__b.CheckByteCount(R__s, R__c, CbmPsdDigi::IsA());
-    }
-  }
-  else {
-    // The function WriteVersion does not return the version number
-    // but the position where ti write the next data
-    // to get the class version use TClass->GetClassVersion()
-
-    R__c              = R__b.WriteVersion(CbmPsdDigi::IsA(), kTRUE);
-    Version_t version = CbmPsdDigi::IsA()->GetClassVersion();
-
-    // We don't intent to write data in old format
-    /*
-      if ( 3 == version ) {
-        R__b << fdEdep;
-        R__b << fdTime;
-        R__b << fuAddress;
-        R__b.SetByteCount(R__c, kTRUE);
-      } else if ( 4 == version ) {
-      */
-    if (4 == version) {
-      R__b << ffFitHarmonic1;
-      R__b << ffFitHarmonic2;
-      R__b << ffFitR2;
-      R__b << ffFitEdep;
-      R__b << fdEdep;
-      R__b << fdTime;
-      R__b << fuAddress;
-      R__b << fuAmpl;
-      R__b << fuZL;
-      R__b << fdEdepWfm;
-      R__b.SetByteCount(R__c, kTRUE);
-    }
-    if (5 == version) {
-      R__b << fuAddress;
-      R__b << fdTime;
-      R__b << fdEdep;
-      R__b << fuZL;
-      R__b << fdAccum;
-      R__b << fdAdcTime;
-
-      R__b << fdEdepWfm;
-      R__b << fdAmpl;
-      R__b << fuMinimum;
-      R__b << fuTimeMax;
-
-      R__b << fdFitAmpl;
-      R__b << fdFitZL;
-      R__b << fdFitEdep;
-      R__b << fdFitR2;
-      R__b << fdFitTimeMax;
-
-      R__b.SetByteCount(R__c, kTRUE);
-    }
-  }
-}
-
 
 ClassImp(CbmPsdDigi)
diff --git a/core/data/psd/CbmPsdDigi.h b/core/data/psd/CbmPsdDigi.h
index dc5b45cc957a6d63e27be4c99cd0d7b4bc97f0cc..fc1af9b653efebb5e07c36087a04991eee2c0b3f 100644
--- a/core/data/psd/CbmPsdDigi.h
+++ b/core/data/psd/CbmPsdDigi.h
@@ -142,28 +142,7 @@ public:
   UInt_t fuAddress   = 0;    /// Unique channel address
   Double_t fdTime    = -1.;  /// Time of measurement [ns]
   Double_t fdEdep    = 0.;   /// Energy deposition from FPGA [MeV]
-  UInt_t fuZL        = 0;    /// ZeroLevel from waveform [adc counts]
-  Double_t fdAccum   = 0;    /// FPGA FEE Accumulator
-  Double_t fdAdcTime = -1.;  /// Adc time of measurement
 
-  Double_t fdEdepWfm = 0.;  /// Energy deposition from waveform [MeV]
-  Double_t fdAmpl    = 0.;  /// Amplitude from waveform [mV]
-  UInt_t fuMinimum   = 0;   /// Minimum of waveform [adc samples]
-  UInt_t fuTimeMax   = 0;   /// Time of maximum in waveform [adc samples]
-
-  Double_t fdFitAmpl    = 0.;    /// Amplitude from fit of waveform [mV]
-  Double_t fdFitZL      = 0.;    /// ZeroLevel from fit of waveform [adc counts]
-  Double_t fdFitEdep    = 0.;    /// Energy deposition from fit of waveform [MeV]
-  Double_t fdFitR2      = 999.;  /// Quality of waveform fit [] -- good near 0
-  Double_t fdFitTimeMax = -1.;   /// Time of maximum in fit of waveform [adc samples]
-
-
-  //LEGACY
-  Float_t ffFitHarmonic1 = 0.;
-  Float_t ffFitHarmonic2 = 0.;
-  Float_t ffFitR2        = 999.;
-  Float_t ffFitEdep      = 0.;
-  UInt_t fuAmpl          = 0;
 
 
 private:
@@ -175,23 +154,9 @@ private:
     ar& fuAddress;
     ar& fdTime;
     ar& fdEdep;
-    ar& fuZL;
-    ar& fdAccum;
-    ar& fdAdcTime;
-
-    ar& fdEdepWfm;
-    ar& fdAmpl;
-    ar& fuMinimum;
-    ar& fuTimeMax;
-
-    ar& fdFitAmpl;
-    ar& fdFitZL;
-    ar& fdFitEdep;
-    ar& fdFitR2;
-    ar& fdFitTimeMax;
   }
 
-  ClassDefNV(CbmPsdDigi, 5);
+  ClassDefNV(CbmPsdDigi, 6);
 };
 
 #endif  // CBMPSDDIGI_H
diff --git a/core/data/psd/CbmPsdDsp.cxx b/core/data/psd/CbmPsdDsp.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..9027beb4a3e1a2b5871b5b1f6984a31f1818699f
--- /dev/null
+++ b/core/data/psd/CbmPsdDsp.cxx
@@ -0,0 +1,200 @@
+/* Copyright (C) 2012-2020 GSI Helmholtzzentrum fuer Schwerionenforschung, Darmstadt
+   SPDX-License-Identifier: GPL-3.0-only
+   Authors: Nikolay Karpushkin, Volker Friese [committer], Florian Uhlig */
+
+/** @file CbmPsdDsp.cxx
+ ** @author Nikolay Karpushkin <karpushkin@inr.ru>
+ ** @date 04.07.2021
+ **
+ ** Code for Data class for PSD digital signal processing (DSP)
+ **/
+
+#include "CbmPsdDsp.h"
+
+#include <TBuffer.h>  // for TBuffer
+#include <TClass.h>   // for CbmPsdDsp::IsA()
+#include <TString.h>  // for Form, TString
+
+#include <string>  // for basic_string
+
+// --- Default constructor
+CbmPsdDsp::CbmPsdDsp() 
+  : fuAddress()
+  , fdTime()
+  , fdEdep()
+  , fuZL()
+  , fdAccum()
+  , fdAdcTime()
+
+  , fdEdepWfm()
+  , fdAmpl()
+  , fuMinimum()
+  , fuTimeMax()
+  , fuWfm()
+
+  , fdFitAmpl()
+  , fdFitZL()
+  , fdFitEdep()
+  , fdFitR2()
+  , fdFitTimeMax()
+  , fuFitWfm()
+{
+}
+
+// clang-format off
+// --- Constructor with assignment
+CbmPsdDsp::CbmPsdDsp(UInt_t address,
+                     Double_t time, 
+                     Double_t edep, 
+                     UInt_t zl, 
+                     Double_t accum, 
+                     Double_t adc_time,
+
+                     Double_t edep_wfm, 
+                     Double_t ampl,
+                     UInt_t minimum, 
+                     UInt_t time_max, 
+                     std::vector<std::uint16_t> wfm,
+
+                     Double_t fit_ampl, 
+                     Double_t fit_zl, 
+                     Double_t fit_edep, 
+                     Double_t fit_r2, 
+                     Double_t fit_time_max, 
+                     std::vector<std::uint16_t> fit_wfm)
+
+  : fuAddress(address)
+  , fdTime(time)
+  , fdEdep(edep)
+  , fuZL(zl)
+  , fdAccum(accum)
+  , fdAdcTime(adc_time)
+
+  , fdEdepWfm(edep_wfm)
+  , fdAmpl(ampl)
+  , fuMinimum(minimum)
+  , fuTimeMax(time_max)
+  , fuWfm(wfm)
+
+  , fdFitAmpl(fit_ampl)
+  , fdFitZL(fit_zl)
+  , fdFitEdep(fit_edep)
+  , fdFitR2(fit_r2)
+  , fdFitTimeMax(fit_time_max)
+  , fuFitWfm(fit_wfm)
+{
+}
+// clang-format on
+
+// --- Copy constructor
+CbmPsdDsp::CbmPsdDsp(const CbmPsdDsp& other)
+  : fuAddress(other.fuAddress)
+  , fdTime(other.fdTime)
+  , fdEdep(other.fdEdep)
+  , fuZL(other.fuZL)
+  , fdAccum(other.fdAccum)
+  , fdAdcTime(other.fdAdcTime)
+
+  , fdEdepWfm(other.fdEdepWfm)
+  , fdAmpl(other.fdAmpl)
+  , fuMinimum(other.fuMinimum)
+  , fuTimeMax(other.fuTimeMax)
+  , fuWfm(other.fuWfm)
+
+  , fdFitAmpl(other.fdFitAmpl)
+  , fdFitZL(other.fdFitZL)
+  , fdFitEdep(other.fdFitEdep)
+  , fdFitR2(other.fdFitR2)
+  , fdFitTimeMax(other.fdFitTimeMax)
+  , fuFitWfm(other.fuFitWfm)
+{
+}
+
+
+// --- Move constructor
+CbmPsdDsp::CbmPsdDsp(CbmPsdDsp&& other)
+  : fuAddress(other.fuAddress)
+  , fdTime(other.fdTime)
+  , fdEdep(other.fdEdep)
+  , fuZL(other.fuZL)
+  , fdAccum(other.fdAccum)
+  , fdAdcTime(other.fdAdcTime)
+
+  , fdEdepWfm(other.fdEdepWfm)
+  , fdAmpl(other.fdAmpl)
+  , fuMinimum(other.fuMinimum)
+  , fuTimeMax(other.fuTimeMax)
+  , fuWfm(other.fuWfm)
+
+  , fdFitAmpl(other.fdFitAmpl)
+  , fdFitZL(other.fdFitZL)
+  , fdFitEdep(other.fdFitEdep)
+  , fdFitR2(other.fdFitR2)
+  , fdFitTimeMax(other.fdFitTimeMax)
+  , fuFitWfm(other.fuFitWfm)
+{
+}
+
+
+// --- Destructor
+CbmPsdDsp::~CbmPsdDsp() {}
+
+
+// --- Assignment operator
+CbmPsdDsp& CbmPsdDsp::operator=(const CbmPsdDsp& other)
+{
+  if (this != &other) {
+    fuAddress = other.fuAddress;
+    fdTime    = other.fdTime;
+    fdEdep    = other.fdEdep;
+    fuZL      = other.fuZL;
+    fdAccum   = other.fdAccum;
+    fdAdcTime = other.fdAdcTime;
+
+    fdEdepWfm = other.fdEdepWfm;
+    fdAmpl    = other.fdAmpl;
+    fuMinimum = other.fuMinimum;
+    fuTimeMax = other.fuTimeMax;
+    fuWfm     = other.fuWfm;
+
+    fdFitAmpl    = other.fdFitAmpl;
+    fdFitZL      = other.fdFitZL;
+    fdFitEdep    = other.fdFitEdep;
+    fdFitR2      = other.fdFitR2;
+    fdFitTimeMax = other.fdFitTimeMax;
+    fuFitWfm     = other.fuFitWfm;
+  }
+  return *this;
+}
+
+
+// --- Move assignment operator
+CbmPsdDsp& CbmPsdDsp::operator=(CbmPsdDsp&& other)
+{
+  if (this != &other) {
+    fuAddress = other.fuAddress;
+    fdTime    = other.fdTime;
+    fdEdep    = other.fdEdep;
+    fuZL      = other.fuZL;
+    fdAccum   = other.fdAccum;
+    fdAdcTime = other.fdAdcTime;
+
+    fdEdepWfm = other.fdEdepWfm;
+    fdAmpl    = other.fdAmpl;
+    fuMinimum = other.fuMinimum;
+    fuTimeMax = other.fuTimeMax;
+    fuWfm     = other.fuWfm;
+
+    fdFitAmpl    = other.fdFitAmpl;
+    fdFitZL      = other.fdFitZL;
+    fdFitEdep    = other.fdFitEdep;
+    fdFitR2      = other.fdFitR2;
+    fdFitTimeMax = other.fdFitTimeMax;
+    fuFitWfm     = other.fuFitWfm;
+  }
+  return *this;
+}
+
+
+
+ClassImp(CbmPsdDsp)
diff --git a/core/data/psd/CbmPsdDsp.h b/core/data/psd/CbmPsdDsp.h
new file mode 100644
index 0000000000000000000000000000000000000000..1db9f154ead7e941d257b67ddc5ba2501b5a4255
--- /dev/null
+++ b/core/data/psd/CbmPsdDsp.h
@@ -0,0 +1,164 @@
+/* Copyright (C) 2012-2020 GSI Helmholtzzentrum fuer Schwerionenforschung, Darmstadt
+   SPDX-License-Identifier: GPL-3.0-only
+   Authors: Nikolay Karpushkin, Volker Friese [committer], Pierre-Alain Loizeau */
+
+/** \file CbmPsdDsp.h
+ ** \author Nikolay Karpushkin <karpushkin@inr.ru>
+ ** \date 09.10.2019
+ **/
+
+/** \class CbmPsdDsp
+ ** \brief Data class for PSD digital signal processing (DSP)
+ ** \version 1.0
+ **/
+
+#ifndef CbmPsdDsp_H
+#define CbmPsdDsp_H 1
+
+#include "CbmDefs.h"        // for ECbmModuleId::kPsd
+#include "CbmPsdAddress.h"  // for CbmPsdAddress
+
+#include <Rtypes.h>      // for THashConsistencyHolder, ClassDefNV
+#include <RtypesCore.h>  // for Double_t, UInt_t, Int_t
+
+#include <boost/serialization/access.hpp>
+#include <boost/serialization/base_object.hpp>
+
+#include <string>  // for string
+
+
+class CbmPsdDsp {
+
+public:
+  /**@brief Default constructor.
+       **/
+  CbmPsdDsp();
+
+
+  /** @brief Constructor with detailed assignment.
+       **/
+  CbmPsdDsp(UInt_t address, Double_t time, Double_t edep, UInt_t zl, Double_t accum, Double_t adc_time,
+                     Double_t edep_wfm, Double_t ampl, UInt_t minimum, UInt_t time_max, std::vector<std::uint16_t> wfm,
+                     Double_t fit_ampl, Double_t fit_zl, Double_t fit_edep, Double_t fit_r2, Double_t fit_time_max, std::vector<std::uint16_t> fit_wfm);
+
+
+  /**  Copy constructor **/
+  CbmPsdDsp(const CbmPsdDsp&);
+
+
+  /** Move constructor  **/
+  CbmPsdDsp(CbmPsdDsp&&);
+
+
+  /** Assignment operator  **/
+  CbmPsdDsp& operator=(const CbmPsdDsp&);
+
+
+  /** Move Assignment operator  **/
+  CbmPsdDsp& operator=(CbmPsdDsp&&);
+
+
+  /** Destructor **/
+  ~CbmPsdDsp();
+
+
+  /** @brief Class name (static)
+       ** @return CbmPsdDsp
+       **/
+  static const char* GetClassName() { return "CbmPsdDsp"; }
+
+
+  /** @brief Address
+       ** @return Unique channel address (see CbmPsdAddress)
+       **/
+  UInt_t GetAddress() const { return fuAddress; };
+
+
+  /** @brief Time
+       ** @return Time [ns]
+       **/
+  Double_t GetTime() const { return fdTime; };
+
+
+  /** @brief Energy deposit
+       ** @return Energy deposit
+       **/
+  Double_t GetEdep() const { return fdEdep; };
+
+
+  /** @brief Module Identifier
+       ** @return Module number
+       **/
+  Double_t GetModuleID() const { return CbmPsdAddress::GetModuleId(GetAddress()); }
+
+
+  /** @brief Section Identifier
+       ** @return Section number
+       **/
+  Double_t GetSectionID() const { return CbmPsdAddress::GetSectionId(GetAddress()); }
+
+
+  /** @brief System identifier
+       ** @return System ID (ECbmModuleId)
+       **/
+  static ECbmModuleId GetSystem() { return ECbmModuleId::kPsd; }
+
+
+  /** Modifiers **/
+  void SetAddress(UInt_t address) { fuAddress = address; };
+  void SetAddress(UInt_t moduleId, UInt_t sectionId);
+  void SetTime(Double_t time) { fdTime = time; }
+  void SetEdep(Double_t edep) { fdEdep = edep; }
+
+private:
+  /// BOOST serialization interface
+  friend class boost::serialization::access;
+
+  UInt_t fuAddress   = 0;    /// Unique channel address
+  Double_t fdTime    = -1.;  /// Time of measurement [ns]
+  Double_t fdEdep    = 0.;   /// Energy deposition from FPGA [MeV]
+  UInt_t fuZL        = 0;    /// ZeroLevel from waveform [adc counts]
+  Double_t fdAccum   = 0;    /// FPGA FEE Accumulator
+  Double_t fdAdcTime = -1.;  /// Adc time of measurement
+
+  Double_t fdEdepWfm = 0.;  /// Energy deposition from waveform [MeV]
+  Double_t fdAmpl    = 0.;  /// Amplitude from waveform [mV]
+  UInt_t fuMinimum   = 0;   /// Minimum of waveform [adc samples]
+  UInt_t fuTimeMax   = 0;   /// Time of maximum in waveform [adc samples]
+  std::vector<uint16_t> fuWfm;
+
+  Double_t fdFitAmpl    = 0.;    /// Amplitude from fit of waveform [mV]
+  Double_t fdFitZL      = 0.;    /// ZeroLevel from fit of waveform [adc counts]
+  Double_t fdFitEdep    = 0.;    /// Energy deposition from fit of waveform [MeV]
+  Double_t fdFitR2      = 999.;  /// Quality of waveform fit [] -- good near 0
+  Double_t fdFitTimeMax = -1.;   /// Time of maximum in fit of waveform [adc samples]
+  std::vector<uint16_t> fuFitWfm;
+
+  template<class Archive>
+  void serialize(Archive& ar, const unsigned int /*version*/)
+  {
+    ar& fuAddress;
+    ar& fdTime;
+    ar& fdEdep;
+    ar& fuZL;
+    ar& fdAccum;
+    ar& fdAdcTime;
+
+    ar& fdEdepWfm;
+    ar& fdAmpl;
+    ar& fuMinimum;
+    ar& fuTimeMax;
+    ar& fuWfm;
+
+    ar& fdFitAmpl;
+    ar& fdFitZL;
+    ar& fdFitEdep;
+    ar& fdFitR2;
+    ar& fdFitTimeMax;
+    ar& fuFitWfm;
+  }
+
+  ClassDefNV(CbmPsdDsp, 1);
+};
+
+#endif  // CbmPsdDsp_H
diff --git a/fles/mcbm2018/unpacker/CbmMcbm2018UnpackerAlgoPsd.cxx b/fles/mcbm2018/unpacker/CbmMcbm2018UnpackerAlgoPsd.cxx
index f5dfd79fc62cdce07b60172c42c391fcaffb2efc..d1333a3402d0284acdf4b46aef91e8fd76c69796 100644
--- a/fles/mcbm2018/unpacker/CbmMcbm2018UnpackerAlgoPsd.cxx
+++ b/fles/mcbm2018/unpacker/CbmMcbm2018UnpackerAlgoPsd.cxx
@@ -35,10 +35,11 @@
 // -------------------------------------------------------------------------
 CbmMcbm2018UnpackerAlgoPsd::CbmMcbm2018UnpackerAlgoPsd()
   : CbmStar2019Algo()
-  ,
-  /// From the class itself
-  fbMonitorMode(kFALSE)
+  , fbMonitorMode(kFALSE)
   , fbDebugMonitorMode(kFALSE)
+  , fbDebugWriteOutput(kFALSE)
+  , fPsdDigiVector(nullptr)
+  , fPsdDspVector(nullptr)
   , fvbMaskedComponents()
   , fUnpackPar(nullptr)
   , fuRawDataVersion(0)
@@ -72,7 +73,8 @@ CbmMcbm2018UnpackerAlgoPsd::CbmMcbm2018UnpackerAlgoPsd()
 }
 CbmMcbm2018UnpackerAlgoPsd::~CbmMcbm2018UnpackerAlgoPsd()
 {
-  /// Clear buffers
+  if (nullptr != fPsdDigiVector) delete fPsdDigiVector;
+  if (nullptr != fPsdDspVector) delete fPsdDspVector;
 }
 
 // -------------------------------------------------------------------------
@@ -82,7 +84,11 @@ Bool_t CbmMcbm2018UnpackerAlgoPsd::Init()
 
   return kTRUE;
 }
-void CbmMcbm2018UnpackerAlgoPsd::Reset() {}
+void CbmMcbm2018UnpackerAlgoPsd::Reset() 
+{
+  if (fPsdDigiVector) fPsdDigiVector->clear();
+  if (fPsdDspVector) fPsdDspVector->clear();
+}
 void CbmMcbm2018UnpackerAlgoPsd::Finish() {}
 
 // -------------------------------------------------------------------------
@@ -220,7 +226,10 @@ Bool_t CbmMcbm2018UnpackerAlgoPsd::ProcessTs(const fles::Timeslice& ts)
   }      // for( fuMsIndex = 0; fuMsIndex < uNbMsLoop; fuMsIndex ++ )
 
   /// Sort the buffers of hits due to the time offsets applied
-  std::sort(fDigiVect.begin(), fDigiVect.end(),
+  //std::sort(fDigiVect.begin(), fDigiVect.end(),
+           // [](const CbmPsdDigi& a, const CbmPsdDigi& b) -> bool { return a.GetTime() < b.GetTime(); });
+
+  std::sort(fPsdDigiVector->begin(), fPsdDigiVector->end(),
             [](const CbmPsdDigi& a, const CbmPsdDigi& b) -> bool { return a.GetTime() < b.GetTime(); });
 
   return kTRUE;
@@ -333,7 +342,8 @@ Bool_t CbmMcbm2018UnpackerAlgoPsd::ProcessMs(const fles::Timeslice& ts, size_t u
           if (ReadResult == 0) {
 
             double prev_hit_time =
-              (double) fulCurrentMsIdx * 25. + PsdReader.VectPackHdr.at(0).uAdcTime * 12.5;  //in ns
+              (double) fulCurrentMsIdx * 25. + PsdReader.VectPackHdr.at(0).uAdcTime * 12.5 - fdTimeOffsetNs;  //in ns
+
             //hit loop
             for (uint64_t hit_iter = 0; hit_iter < PsdReader.VectHitHdr.size(); hit_iter++) {
               if (PsdReader.VectPackHdr.size() != PsdReader.VectHitHdr.size()) {
@@ -345,56 +355,56 @@ Bool_t CbmMcbm2018UnpackerAlgoPsd::ProcessMs(const fles::Timeslice& ts, size_t u
 
               uint8_t uHitChannel = PsdReader.VectHitHdr.at(hit_iter).uHitChannel;
               //uint8_t uLinkIndex     = PsdReader.VectPackHdr.at(hit_iter).uLinkIndex;
-              uint32_t uSignalCharge = PsdReader.VectHitHdr.at(hit_iter).uSignalCharge;
+              double dEdep = (double) PsdReader.VectHitHdr.at(hit_iter).uSignalCharge / fUnpackPar->GetMipCalibration(uHitChannel);  // ->now in MeV
               uint16_t uZeroLevel    = PsdReader.VectHitHdr.at(hit_iter).uZeroLevel;
               double dHitTime =
-                (double) fulCurrentMsIdx * 25. + PsdReader.VectPackHdr.at(hit_iter).uAdcTime * 12.5;  //in ns
+                (double) fulCurrentMsIdx * 25. + (double) PsdReader.VectPackHdr.at(hit_iter).uAdcTime * 12.5 - fdTimeOffsetNs;  //in ns
               std::vector<uint16_t> uWfm = PsdReader.VectHitData.at(hit_iter).uWfm;
-              double dEdep = (double) uSignalCharge / fUnpackPar->GetMipCalibration(uHitChannel);  // ->now in MeV
+
 
               if (uHitChannel >= fviPsdChUId.size()) {
                 LOG(error) << "hit channel number out of range! channel index: " << uHitChannel
                            << " max: " << fviPsdChUId.size();
                 break;
               }
+              UInt_t uChanUId = fviPsdChUId[uHitChannel];  //unique ID
 
-              UInt_t uChId    = uHitChannel;
-              UInt_t uRpdChId = uChId;                  //Should be map(uChId) TODO
-              UInt_t uChanUId = fviPsdChUId[uRpdChId];  //unique ID
 
-              CbmPsdDigi digi;
-              digi.fuAddress = uChanUId;
-              digi.fdTime    = dHitTime;
-              digi.fdEdep    = dEdep;
-              digi.fuZL      = uZeroLevel;
-              digi.fdAccum   = (double) PsdReader.VectHitHdr.at(hit_iter).uFeeAccum;
-              digi.fdAdcTime = (double) PsdReader.VectPackHdr.at(hit_iter).uAdcTime;
+              UInt_t fuAddress   = uChanUId;    /// Unique channel address
+              Double_t fdTime    = dHitTime;  /// Time of measurement [ns]
+              Double_t fdEdep    = dEdep;   /// Energy deposition from FPGA [MeV]
+              UInt_t fuZL        = uZeroLevel;    /// ZeroLevel from waveform [adc counts]
+              Double_t fdAccum   = (double) PsdReader.VectHitHdr.at(hit_iter).uFeeAccum;    /// FPGA FEE Accumulator
+              Double_t fdAdcTime = (double) PsdReader.VectPackHdr.at(hit_iter).uAdcTime;  /// Adc time of measurement
 
-              if (!uWfm.empty()) {
+              Double_t fdEdepWfm = 0.;  /// Energy deposition from waveform [MeV]
+              Double_t fdAmpl    = 0.;  /// Amplitude from waveform [mV]
+              UInt_t fuMinimum   = 0;   /// Minimum of waveform [adc samples]
+              UInt_t fuTimeMax   = 0;   /// Time of maximum in waveform [adc samples]
+              std::vector<uint16_t> fuWfm = uWfm;
+
+              Double_t fdFitAmpl    = 0.;    /// Amplitude from fit of waveform [mV]
+              Double_t fdFitZL      = 0.;    /// ZeroLevel from fit of waveform [adc counts]
+              Double_t fdFitEdep    = 0.;    /// Energy deposition from fit of waveform [MeV]
+              Double_t fdFitR2      = 999.;  /// Quality of waveform fit [] -- good near 0
+              Double_t fdFitTimeMax = -1.;   /// Time of maximum in fit of waveform [adc samples]
+              std::vector<uint16_t> fuFitWfm;
 
-                int32_t iHitAmlpitude = 0;
-                int32_t iHitChargeWfm = 0;
-                uint8_t uHitTimeMax   = 0;
-                uint32_t uHitMinimum  = 0;
-                if (!uWfm.empty()) {
-                  iHitChargeWfm = std::accumulate(uWfm.begin(), uWfm.end(), 0);
-                  iHitChargeWfm -= uZeroLevel * uWfm.size();
+              if (!uWfm.empty()) {
 
+                 int32_t iHitChargeWfm = std::accumulate(uWfm.begin(), uWfm.end(), -uZeroLevel*uWfm.size());
                   auto const max_iter = std::max_element(uWfm.begin(), uWfm.end());
                   assert(max_iter != uWfm.end());
                   if (max_iter == uWfm.end()) break;
-                  uHitTimeMax   = std::distance(uWfm.begin(), max_iter);
-                  iHitAmlpitude = *max_iter - uZeroLevel;
-
+                  uint8_t uHitTimeMax   = std::distance(uWfm.begin(), max_iter);
+                  int32_t iHitAmlpitude = *max_iter - uZeroLevel;
                   auto const min_iter = std::min_element(uWfm.begin(), uWfm.end());
-                  uHitMinimum         = *min_iter;
-                }
-
-                digi.fdEdepWfm = (double) iHitChargeWfm / fUnpackPar->GetMipCalibration(uHitChannel);  // ->now in MeV
-                digi.fdAmpl    = (double) iHitAmlpitude / 16.5;                                        // -> now in mV
-                digi.fuTimeMax = uHitTimeMax;
-                digi.fuMinimum = uHitMinimum;  // FIXME
+                  uint32_t uHitMinimum         = *min_iter;
 
+                fdEdepWfm = (double) iHitChargeWfm / fUnpackPar->GetMipCalibration(uHitChannel);  // ->now in MeV
+                fdAmpl    = (double) iHitAmlpitude / 16.5;                                        // -> now in mV
+                fuTimeMax = uHitTimeMax;
+                fuMinimum = uHitMinimum;
 
                 int gate_beg = 0;
                 int gate_end = (int) uWfm.size() - 1;
@@ -411,23 +421,47 @@ Bool_t CbmMcbm2018UnpackerAlgoPsd::ProcessMs(const fles::Timeslice& ts, size_t u
                 Pfitter.SetSignalBegin(best_signal_begin);
                 Pfitter.CalculateFitAmplitudes();
 
-                digi.fdFitEdep =
+                fdFitEdep =
                   Pfitter.GetIntegral(gate_beg, gate_end) / fUnpackPar->GetMipCalibration(uHitChannel);  // ->now in MeV
-                digi.fdFitAmpl    = (Pfitter.GetMaxAmplitude() - Pfitter.GetZeroLevel()) / 16.5;         // ->now in mV
-                digi.fdFitR2      = Pfitter.GetRSquare(gate_beg, gate_end);
-                digi.fdFitZL      = Pfitter.GetZeroLevel();
-                digi.fdFitTimeMax = Pfitter.GetSignalMaxTime();
+                fdFitAmpl    = (Pfitter.GetMaxAmplitude() - Pfitter.GetZeroLevel()) / 16.5;         // ->now in mV
+                fdFitR2      = Pfitter.GetRSquare(gate_beg, gate_end);
+                fdFitZL      = Pfitter.GetZeroLevel();
+                fdFitTimeMax = Pfitter.GetSignalMaxTime();
+                fuFitWfm = Pfitter.GetFitWfm();
               }
 
-
-              fDigiVect.emplace_back(digi);
+              CbmPsdDsp dsp = CbmPsdDsp(
+                fuAddress,                
+                fdTime,
+                fdEdep,
+                fuZL,
+                fdAccum,
+                fdAdcTime,
+                
+                fdEdepWfm,
+                fdAmpl,
+                fuMinimum,
+                fuTimeMax,
+                fuWfm,
+                
+                fdFitAmpl,
+                fdFitZL,
+                fdFitEdep,
+                fdFitR2,
+                fdFitTimeMax,
+                fuFitWfm );
+                
+              std::shared_ptr<CbmPsdDigi> digi = MakeDigi(dsp);
+              if (digi) fPsdDigiVector->emplace_back(*digi);
+
+              if (fbDebugWriteOutput && (fPsdDspVector != nullptr)) { fPsdDspVector->emplace_back(dsp); }
 
               //DEBUG
               if (dHitTime < prev_hit_time) printf("negative time!\n");
               //DEBUG END
               prev_hit_time = dHitTime;
-
               //DEBUG
+
             }  // for(int hit_iter = 0; hit_iter < PsdReader.EvHdrAb.uHitsNumber; hit_iter++)
           }
           else if (ReadResult == 1) {
@@ -477,45 +511,22 @@ Bool_t CbmMcbm2018UnpackerAlgoPsd::ProcessMs(const fles::Timeslice& ts, size_t u
             for (int hit_iter = 0; hit_iter < PsdReader.EvHdrAb.uHitsNumber; hit_iter++) {
               UInt_t uHitChannel         = PsdReader.VectHitHdr.at(hit_iter).uHitChannel;
               UInt_t uSignalCharge       = PsdReader.VectHitHdr.at(hit_iter).uSignalCharge;
-              UInt_t uZeroLevel          = PsdReader.VectHitHdr.at(hit_iter).uZeroLevel;
-              std::vector<uint16_t> uWfm = PsdReader.VectHitData.at(hit_iter).uWfm;
+              //UInt_t uZeroLevel          = PsdReader.VectHitHdr.at(hit_iter).uZeroLevel;
+              Double_t dHitTime =
+                (double) PsdReader.EvHdrAb.ulMicroSlice + (double) PsdReader.EvHdrAc.uAdcTime * 12.5 - fdTimeOffsetNs;
 
               if (uHitChannel >= fviPsdChUId.size()) {
                 LOG(error) << "hit channel number out of range! channel index: " << uHitChannel
                            << " max: " << fviPsdChUId.size();
                 break;
               }
-
-              UInt_t uChId    = uHitChannel;
-              UInt_t uRpdChId = uChId;                  //Should be map(uChId) TODO
-              UInt_t uChanUId = fviPsdChUId[uRpdChId];  //unique ID
-
-              UInt_t uHitAmlpitude = 0;
-              UInt_t uHitChargeWfm = 0;
-              for (UInt_t wfm_iter = 0; wfm_iter < uWfm.size(); wfm_iter++) {
-                if (uWfm.at(wfm_iter) > uHitAmlpitude) uHitAmlpitude = uWfm.at(wfm_iter);
-                uHitChargeWfm += uWfm.at(wfm_iter) - uZeroLevel;
-              }
-              uHitAmlpitude -= uZeroLevel;
-
-              //printf("0x%08x %u %u %u %f %f\n", uChanUId, uChId, CbmPsdAddress::GetModuleId(uChanUId), CbmPsdAddress::GetSectionId(uChanUId), (double)PsdReader.VectHitHdr.at(hit_iter).uSignalCharge, (double)PsdReader.EvHdrAc.uAdcTime );
-
-              Double_t dAdcTime =
-                (double) PsdReader.EvHdrAb.ulMicroSlice + (double) PsdReader.EvHdrAc.uAdcTime * 12.5 - fdTimeOffsetNs;
+              UInt_t uChanUId = fviPsdChUId[uHitChannel];  //unique ID
 
               LOG(debug) << Form("Insert 0x%08x digi with charge ", uChanUId) << uSignalCharge
                          << Form(", at %u,", PsdReader.EvHdrAc.uAdcTime)
                          << " epoch: " << PsdReader.EvHdrAb.ulMicroSlice;
 
-              CbmPsdDigi digi;
-              digi.fuAddress = uChanUId;
-              digi.fdTime    = dAdcTime;
-              digi.fdEdep    = (double) uSignalCharge;
-              digi.fuAmpl    = uHitAmlpitude;
-              digi.fdEdepWfm = (double) uHitChargeWfm;
-              digi.fuZL      = uZeroLevel;
-
-              fDigiVect.emplace_back(digi);
+              fPsdDigiVector->emplace_back(uChanUId, dHitTime, (double)uSignalCharge);
 
             }  // for(int hit_iter = 0; hit_iter < PsdReader.EvHdrAb.uHitsNumber; hit_iter++)
           }
@@ -561,6 +572,35 @@ Bool_t CbmMcbm2018UnpackerAlgoPsd::ProcessMs(const fles::Timeslice& ts, size_t u
   return kTRUE;
 }
 
+Bool_t CbmMcbm2018UnpackerAlgoPsd::SetDigiOutputPointer(std::vector<CbmPsdDigi>* const pVector)
+{
+  if (nullptr == fPsdDigiVector) {
+    fPsdDigiVector = pVector;
+    return kTRUE;
+  }
+  else {
+    return kFALSE;
+  }
+}
+
+Bool_t CbmMcbm2018UnpackerAlgoPsd::SetDspOutputPointer(std::vector<CbmPsdDsp>* const pVector)
+{
+  if (nullptr == fPsdDspVector) {
+    fPsdDspVector = pVector;
+    return kTRUE;
+  }
+  else {
+    return kFALSE;
+  }
+}
+
+std::shared_ptr<CbmPsdDigi> CbmMcbm2018UnpackerAlgoPsd::MakeDigi(CbmPsdDsp dsp)
+{
+  std::shared_ptr<CbmPsdDigi> digi = std::make_shared<CbmPsdDigi>(
+    CbmPsdDigi(dsp.GetAddress(), dsp.GetTime(), dsp.GetEdep()));
+
+  return digi;
+}
 
 Bool_t CbmMcbm2018UnpackerAlgoPsd::CreateHistograms() { return kTRUE; }
 Bool_t CbmMcbm2018UnpackerAlgoPsd::FillHistograms() { return kTRUE; }
diff --git a/fles/mcbm2018/unpacker/CbmMcbm2018UnpackerAlgoPsd.h b/fles/mcbm2018/unpacker/CbmMcbm2018UnpackerAlgoPsd.h
index fd53231c55a984ed513d31be5d644cd60725d974..c7c6c89584707fd9f2167089e38c16de58ba5d07 100644
--- a/fles/mcbm2018/unpacker/CbmMcbm2018UnpackerAlgoPsd.h
+++ b/fles/mcbm2018/unpacker/CbmMcbm2018UnpackerAlgoPsd.h
@@ -17,6 +17,7 @@
 
 // Data
 #include "CbmPsdDigi.h"
+#include "CbmPsdDsp.h"
 
 #include "PronyFitter.h"
 #include "PsdGbtReader-v0.00.h"
@@ -39,6 +40,11 @@ public:
   CbmMcbm2018UnpackerAlgoPsd();
   ~CbmMcbm2018UnpackerAlgoPsd();
 
+  /** \brief Copy constructor - not implemented **/
+  CbmMcbm2018UnpackerAlgoPsd(const CbmMcbm2018UnpackerAlgoPsd&) = delete;
+  /** \brief Copy assignment operator - not implemented **/
+  CbmMcbm2018UnpackerAlgoPsd& operator=(const CbmMcbm2018UnpackerAlgoPsd&) = delete;
+
   virtual Bool_t Init();
   virtual void Reset();
   virtual void Finish();
@@ -55,11 +61,16 @@ public:
 
   void AddMsComponentToList(size_t component, UShort_t usDetectorId);
 
+  Bool_t SetDigiOutputPointer(std::vector<CbmPsdDigi>* const pVector);
+  Bool_t SetDspOutputPointer(std::vector<CbmPsdDsp>* const pVector);
+  std::shared_ptr<CbmPsdDigi> MakeDigi(CbmPsdDsp dsp);
+
   Bool_t CreateHistograms();
   Bool_t FillHistograms();
   Bool_t ResetHistograms();
 
   inline void SetMonitorMode(Bool_t bFlagIn = kTRUE) { fbMonitorMode = bFlagIn; }
+  inline void SetDspWriteMode(Bool_t bFlagIn = kTRUE) { fbDebugWriteOutput = bFlagIn; }
   inline void SetTimeOffsetNs(Double_t dOffsetIn = 0.0) { fdTimeOffsetNs = dOffsetIn; }
   inline void SetDiamondDpbIdx(UInt_t uIdx = 2) { fuDiamondDpbIdx = uIdx; }
 
@@ -68,6 +79,12 @@ private:
   /// Control flags
   Bool_t fbMonitorMode;       //! Switch ON the filling of a minimal set of histograms
   Bool_t fbDebugMonitorMode;  //! Switch ON the filling of a additional set of histograms
+  Bool_t fbDebugWriteOutput;  //! If ON the output vector of dsp debug information is written to disk
+
+  /// Output vectors
+  std::vector<CbmPsdDigi>* fPsdDigiVector;   //! Output Digi vector /* TODO CHECK The exclamation mark signals the transientness */
+  std::vector<CbmPsdDsp>* fPsdDspVector;     //! Output Dsp vector  /* TODO CHECK The exclamation mark signals the transientness */
+
   std::vector<Bool_t> fvbMaskedComponents;
 
   /// Settings from parameter file
@@ -126,10 +143,7 @@ private:
   std::chrono::steady_clock::time_point
     ftStartTimeUnix; /** Time of run Start from UNIX system, used as reference for long evolution plots against reception time **/
 
-  CbmMcbm2018UnpackerAlgoPsd(const CbmMcbm2018UnpackerAlgoPsd&);
-  CbmMcbm2018UnpackerAlgoPsd operator=(const CbmMcbm2018UnpackerAlgoPsd&);
-
-  ClassDef(CbmMcbm2018UnpackerAlgoPsd, 1)
+  ClassDef(CbmMcbm2018UnpackerAlgoPsd, 2)
 };
 
 #endif
diff --git a/fles/mcbm2018/unpacker/CbmMcbm2018UnpackerTaskPsd.cxx b/fles/mcbm2018/unpacker/CbmMcbm2018UnpackerTaskPsd.cxx
index c846c912abe4038abe0098a30b492c46a479148d..87c41cccaacf9707d1567a7cede4e49fc4595bc5 100644
--- a/fles/mcbm2018/unpacker/CbmMcbm2018UnpackerTaskPsd.cxx
+++ b/fles/mcbm2018/unpacker/CbmMcbm2018UnpackerTaskPsd.cxx
@@ -43,8 +43,10 @@ CbmMcbm2018UnpackerTaskPsd::CbmMcbm2018UnpackerTaskPsd(UInt_t /*uNbGdpb*/)
   , fbMonitorMode(kFALSE)
   , fbDebugMonitorMode(kFALSE)
   , fbWriteOutput(kTRUE)
-  , fuDigiMaskId(0x0001FFFF)
+  , fbDebugWriteOutput(kFALSE)
   , fulTsCounter(0)
+  , fPsdDigiVector(nullptr)
+  , fPsdDspVector(nullptr)
   , fUnpackerAlgo(nullptr)
 {
   LOG(info) << "CbmMcbm2018UnpackerTaskPsd::Allocate";
@@ -57,15 +59,34 @@ Bool_t CbmMcbm2018UnpackerTaskPsd::Init()
 {
   LOG(info) << "CbmMcbm2018UnpackerTaskPsd::Init";
   LOG(info) << "Initializing mCBM PSD 2018 Unpacker";
+  Bool_t initOK = kTRUE;
 
   FairRootManager* ioman = FairRootManager::Instance();
   if (NULL == ioman) { LOG(fatal) << "No FairRootManager instance"; }
 
-  /// Get address of vector from algo
-  fpvDigiPsd = &(fUnpackerAlgo->GetVector());
-  ioman->RegisterAny("PsdDigi", fpvDigiPsd, fbWriteOutput);
+  /// Register Digi output vector.
+  fPsdDigiVector = new std::vector<CbmPsdDigi>();
+  if (fPsdDigiVector) {
+    ioman->RegisterAny("PsdDigi", fPsdDigiVector, fbWriteOutput);
+    initOK &= fUnpackerAlgo->SetDigiOutputPointer(fPsdDigiVector);
+  }
+  else {
+    LOG(fatal) << "fPsdDigiVector could not be registered at FairRootManager";
+  }
+
+  /// Register RawMessage output vector, if DebugWrite is enabled.
+  if (fbDebugWriteOutput) {
+    fPsdDspVector = new std::vector<CbmPsdDsp>();
+    if (fPsdDspVector) {
+      ioman->RegisterAny("PsdDsp", fPsdDspVector, fbDebugWriteOutput);
+      initOK &= fUnpackerAlgo->SetDspOutputPointer(fPsdDspVector);
+    }
+    else {
+      LOG(fatal) << "fPsdDspVector could not be registered at FairRootManager";
+    }
+  }
 
-  return kTRUE;
+  return initOK;
 }
 
 void CbmMcbm2018UnpackerTaskPsd::SetParContainers()
@@ -139,7 +160,7 @@ Bool_t CbmMcbm2018UnpackerTaskPsd::DoUnpack(const fles::Timeslice& ts, size_t /*
   /*
    /// Sort the buffers of hits due to the time offsets applied
    => Done in the algo!!!
-   sort(fpvDigiPsd->begin(), fpvDigiPsd->end(),
+   sort(fPsdDigiVector->begin(), fPsdDigiVector->end(),
         [](const CbmPsdDigi & a, const CbmPsdDigi & b) -> bool
         {
           return a.GetTime() < b.GetTime();
@@ -154,13 +175,20 @@ Bool_t CbmMcbm2018UnpackerTaskPsd::DoUnpack(const fles::Timeslice& ts, size_t /*
   return kTRUE;
 }
 
-void CbmMcbm2018UnpackerTaskPsd::Reset() { fUnpackerAlgo->ClearVector(); }
+void CbmMcbm2018UnpackerTaskPsd::Reset() 
+{
+  if (fPsdDigiVector) fPsdDigiVector->clear();
+  if (fPsdDspVector) fPsdDspVector->clear();
+}
 
 
 void CbmMcbm2018UnpackerTaskPsd::Finish()
 {
+  LOG(info) << "Finish of CbmMcbm2018UnpackerTaskPsd";
+  fUnpackerAlgo->Finish();
 }
 
+void CbmMcbm2018UnpackerTaskPsd::SetDspWriteMode(Bool_t bFlagIn) { fbDebugWriteOutput = bFlagIn; fUnpackerAlgo->SetDspWriteMode(bFlagIn); }
 void CbmMcbm2018UnpackerTaskPsd::SetIgnoreOverlapMs(Bool_t bFlagIn) { fUnpackerAlgo->SetIgnoreOverlapMs(bFlagIn); }
 void CbmMcbm2018UnpackerTaskPsd::SetTimeOffsetNs(Double_t dOffsetIn) { fUnpackerAlgo->SetTimeOffsetNs(dOffsetIn); }
 
diff --git a/fles/mcbm2018/unpacker/CbmMcbm2018UnpackerTaskPsd.h b/fles/mcbm2018/unpacker/CbmMcbm2018UnpackerTaskPsd.h
index 1c1b68fc3331e546cbd8998f545f350bb3d5926c..4ca6a9cb982beb8685536c9bf9d4270e08cb3468 100644
--- a/fles/mcbm2018/unpacker/CbmMcbm2018UnpackerTaskPsd.h
+++ b/fles/mcbm2018/unpacker/CbmMcbm2018UnpackerTaskPsd.h
@@ -15,6 +15,7 @@
 
 #include "CbmMcbmUnpack.h"
 #include "CbmPsdDigi.h"
+#include "CbmPsdDsp.h"
 
 #include "Timeslice.hpp"
 
@@ -26,8 +27,10 @@ class CbmMcbm2018UnpackerTaskPsd : public CbmMcbmUnpack {
 public:
   CbmMcbm2018UnpackerTaskPsd(UInt_t uNbSdpb = 1);
 
-  CbmMcbm2018UnpackerTaskPsd(const CbmMcbm2018UnpackerTaskPsd&) = delete;
-  CbmMcbm2018UnpackerTaskPsd operator=(const CbmMcbm2018UnpackerTaskPsd&) = delete;
+  /** Copy Constructor */
+  CbmMcbm2018UnpackerTaskPsd(const CbmMcbm2018UnpackerTaskPsd&);
+  /** Assignment Operator */
+  CbmMcbm2018UnpackerTaskPsd operator=(const CbmMcbm2018UnpackerTaskPsd&);
 
   virtual ~CbmMcbm2018UnpackerTaskPsd();
 
@@ -50,6 +53,7 @@ public:
   /// Algo settings setters
 
   inline void SetMonitorMode(Bool_t bFlagIn = kTRUE) { fbMonitorMode = bFlagIn; }
+  void SetDspWriteMode(Bool_t bFlagIn = kTRUE);
   void SetIgnoreOverlapMs(Bool_t bFlagIn = kTRUE);
   void SetTimeOffsetNs(Double_t dOffsetIn = 0.0);
 
@@ -60,21 +64,25 @@ private:
   /// Control flags
   Bool_t fbMonitorMode;       //! Switch ON the filling of a minimal set of histograms
   Bool_t fbDebugMonitorMode;  //! Switch ON the filling of a additional set of histograms
-  Bool_t fbWriteOutput;       //! If ON the output TClonesArray of digi is written to disk
+  Bool_t fbWriteOutput;       //! If ON the output vector of digi is written to disk
+  Bool_t fbDebugWriteOutput;  //! If ON the output vector of dsp debug information is written to disk
 
   /// Parameters
-  UInt_t fuDigiMaskId;
+
 
   /// Statistics & first TS rejection
   uint64_t fulTsCounter;
 
-  /// Output vectors
-  std::vector<CbmPsdDigi>* fpvDigiPsd = nullptr;
+  /// Output Digi vector
+  std::vector<CbmPsdDigi>* fPsdDigiVector;
+
+  /// Output Dsp vector -- preprocessed info for debugging
+  std::vector<CbmPsdDsp>* fPsdDspVector;
 
   /// Processing algo
   CbmMcbm2018UnpackerAlgoPsd* fUnpackerAlgo;
 
-  ClassDef(CbmMcbm2018UnpackerTaskPsd, 2)
+  ClassDef(CbmMcbm2018UnpackerTaskPsd, 3)
 };
 
 #endif