diff --git a/reco/base/CbmUnpack.h b/reco/base/CbmUnpack.h
index 05d6b1b7dae2435cc1bfbd7282eb0bc13c03c7b2..837210f022cc491884bd9af13149aa601cea55c9 100644
--- a/reco/base/CbmUnpack.h
+++ b/reco/base/CbmUnpack.h
@@ -8,12 +8,18 @@
 #ifndef CBMUNPACK_H
 #define CBMUNPACK_H
 
+/// CbmRoot (+externals) headers
 #include "Timeslice.hpp"
+#include "CbmErrorMessage.h"
 
+/// FairRoot headers
+
+/// Fairsoft (Root, Boost, ...) headers
 #include "Rtypes.h"
 
 #include <boost/any.hpp>
 
+/// C/C++ headers
 #include <vector>
 #include <string>
 #include <map>
@@ -50,6 +56,7 @@ class CbmUnpack
          fdTsFullSizeInNs(-1.0),
          fvpAllHistoPointers(),
          fDigiVect(),
+         fErrVect(),
          fParameterMap()
          {};
       virtual ~CbmUnpack() = default;
@@ -79,7 +86,8 @@ class CbmUnpack
       std::vector< std::pair< TCanvas *, std::string > > GetCanvasVector() { return fvpAllCanvasPointers; }
 
       /// Output vector
-      void AssignOutputVector( std::vector<T> & rVect ){ fDigiVect = rVect; }
+      void AssignOutputVector( std::vector< T > & rVect ){ fDigiVect = rVect; }
+      void AssignErrorVector( std::vector< CbmErrorMessage > & rVect ){ fErrVect = rVect; }
 //      void ClearVector() {fDigiVect->clear();}
 //      std::vector<T> * GetVector() {return fDigiVect;}
 
@@ -116,6 +124,7 @@ class CbmUnpack
 
       /// Output vector
       std::vector<T> & fDigiVect; //! Vector of digis FIXME: check that the reference works as expected
+      std::vector< CbmErrorMessage > & fErrVect = {}; //! Vector of error messages
 
       /// For any algo
       std::map<std::string, std::string> fParameterMap; //! Map of parameter name and type
diff --git a/reco/base/CbmUnpackTask.h b/reco/base/CbmUnpackTask.h
index 7650c6e6550751524b516d26c1e7a4cddca007c6..379075ffd8c49a9c3a22457e4b6adc5e6acd53e1 100644
--- a/reco/base/CbmUnpackTask.h
+++ b/reco/base/CbmUnpackTask.h
@@ -66,7 +66,8 @@ class CbmUnpackTask : public CbmUnpackTaskBase
       uint64_t fulTsCounter     = 0;      //! TS counter, not same as TS index!
 
       /// Input/Output vector
-      std::vector< TDigi > * fvDigiIO = nullptr;   //! IO vector of Digis, passed to algo for filling and propagated to framework for outpu
+      std::vector< TDigi > * fvDigiIO = nullptr;   //! IO vector of Digis, passed to algo for filling and propagated to framework for output
+      std::vector< CbmErrorMessage > * fvErrorIO = nullptr;   //! IO vector of Errors, passed to algo for filling and propagated to framework for output
 
       /// Histograms for vector monitoring?
 //      TH1* fhArraySize     = nullptr;
diff --git a/reco/base/CbmUnpackTask.tmpl b/reco/base/CbmUnpackTask.tmpl
index 839ebb7fc322f5e03f5bc9802a9db56cf9c5cb5c..08fddecc6ccb849e9804f893daf0d63de8b1f58a 100644
--- a/reco/base/CbmUnpackTask.tmpl
+++ b/reco/base/CbmUnpackTask.tmpl
@@ -36,7 +36,8 @@ CbmUnpackTask< TDigi, TAlgo, TParam >::CbmUnpackTask( TString sDigiBranchName, T
     fsDigiBranchName( sDigiBranchName ),
     fsDigiBranchDescr( sDigiBranchDescr )
 {
-   fvDigiIO      = new std::vector< TDigi >();
+//   fvDigiIO      = new std::vector< TDigi >();
+//   fvErrorIO     = new std::vector< CbmErrorMessage >();
    fUnpackerAlgo = new TAlgo();
 }
 
@@ -49,6 +50,11 @@ CbmUnpackTask< TDigi, TAlgo, TParam >::~CbmUnpackTask()
    {
       fvDigiIO.clear();
       delete fvDigiIO;
+   };
+   if( nullptr != fvErrorIO )
+   {
+      fvErrorIO.clear();
+      delete fvErrorIO;
    }
 }
 
@@ -82,6 +88,24 @@ Bool_t CbmUnpackTask< TDigi, TAlgo, TParam >::Init()
                           fvDigiIO, fbWriteOutput);
    } // if( nullptr == fvDigiIO )
       else LOG(info) << "--> Found existing IO vector, re-using it.";
+   fUnpackerAlgo->AssignOutputVector( fvDigiIO );
+
+   /// Check first if array not already existing due to other unpacker!
+   fvErrorIO = static_cast< std::vector< TDigi > *>(ioman->GetObject( "ErrorMessage" ));
+   if( nullptr == fvErrorIO )
+   {
+      /// No existing array => create it!
+      fvErrorIO = new std::vector< CbmErrorMessage >();
+      if( nullptr == fvErrorIO )
+      {
+         LOG(fatal) << "Failed creating the IO vector for error messages";
+      } // if( nullptr == fvErrorIO )
+      ioman->RegisterAny( "ErrorMessage",
+//                       ( "" == fsDigiBranchDescr ? fsDigiBranchName : fsDigiBranchDescr),
+                          fvErrorIO, fbWriteOutput);
+   } // if( nullptr == fvErrorIO )
+      else LOG(info) << "--> Found existing IO vector for error messages, re-using it.";
+   fUnpackerAlgo->AssignErrorVector( fvErrorIO );
 
    return kTRUE;
 }
@@ -169,6 +193,27 @@ template< class TDigi, class TAlgo, class TParam >
 void CbmUnpackTask< TDigi, TAlgo, TParam >::Reset()
 {
    fvDigiIO->clear();
+   fvErrorIO->clear();
+}
+
+template< class TDigi, class TAlgo, class TParam >
+Bool_t CbmUnpackTask< TDigi, TAlgo, TParam >::DoUnpack(const fles::Timeslice& ts, size_t /*component*/)
+{
+   if( kFALSE == fUnpackerAlgo->ProcessTs( ts ) )
+   {
+      LOG(error) << "Failed processing TS " << ts.index()
+                 << " in unpacker algorithm class";
+      return kTRUE;
+   } // if( kFALSE == fUnpackerAlgo->ProcessTs( ts ) )
+
+   if( 0 == ts.index() % 10000 )
+      LOG(info) << "Processed TS with index " << std::setw( 9 ) << fulTsCounter;
+
+   if( 0 == fulTsCounter % 10000 )
+      LOG(info) << "Processed " << std::setw( 9 ) << fulTsCounter << " TS ";
+   fulTsCounter++;
+
+   return kTRUE;
 }
 
 template< class TDigi, class TAlgo, class TParam >