diff --git a/MQ/mcbm/CbmDeviceDigiEventSink.cxx b/MQ/mcbm/CbmDeviceDigiEventSink.cxx
index c3306319149ec0b1a1d942f037bfa1556f477e06..239d6daa69baaa9b11184b13e0a2d121937c0752 100644
--- a/MQ/mcbm/CbmDeviceDigiEventSink.cxx
+++ b/MQ/mcbm/CbmDeviceDigiEventSink.cxx
@@ -270,7 +270,8 @@ bool CbmDeviceDigiEventSink::HandleData(FairMQParts& parts, int /*index*/)
   CbmEventTimeslice unpTs(parts);
 
   /// FIXME: Need to check if TS arrived in order (probably not!!!) + buffer!!!
-  LOG(debug) << "Next TS check " << fuPrevTsIndex << " " << fulTsCounter << " " << unpTs.fTsMetaData.GetIndex();
+  LOG(info) << "Next TS check " << fuPrevTsIndex << " " << fulTsCounter << " " << unpTs.fTsMetaData.GetIndex()
+            << " Sorage size: " << fmFullTsStorage.size();
   if (fuPrevTsIndex + 1 == unpTs.fTsMetaData.GetIndex()
       || (0 == fuPrevTsIndex && 0 == fulTsCounter && 0 == unpTs.fTsMetaData.GetIndex())) {
     LOG(debug) << "TS direct to dump";
@@ -764,62 +765,185 @@ std::vector<CbmDigiEvent> CbmEventTimeslice::GetSelectedData()
     selEvent.fTime   = event.GetStartTime();
     selEvent.fNumber = event.GetNumber();
 
+    /// FIXME: for pure digi based event, we select "continuous slices of digis"
+    ///        => Copy block of [First Digi index, last digi index] with assign(it_start, it_stop)
+    /// FIXME: Keep TRD1D + TRD2D support, may lead to holes in the digi sequence!
+    ///        => Would need to keep the loop
+
+    /// Get the proper order for block selection as TRD1D and TRD2D may insert indices in separate loops
+    /// => Needed to ensure that the start and stop of the block copy do not trigger a vector size exception
+    event.SortIndices();
+
     /// for each detector, find the data in the Digi vectors and copy them
     /// TODO: Template + loop on list of data types?
     /// ==> T0
     uint32_t uNbDigis = (0 < event.GetNofData(ECbmDataType::kT0Digi) ? event.GetNofData(ECbmDataType::kT0Digi) : 0);
     if (uNbDigis) {
-      for (uint32_t uDigiIdx = 0; uDigiIdx < uNbDigis; ++uDigiIdx) {
-        selEvent.fData.fT0.fDigis.push_back(fvDigiT0[event.GetIndex(ECbmDataType::kT0Digi, uDigiIdx)]);
+      auto startIt = fvDigiT0.begin() + event.GetIndex(ECbmDataType::kT0Digi, 0);
+      auto stopIt  = fvDigiT0.begin() + event.GetIndex(ECbmDataType::kT0Digi, uNbDigis - 1);
+      selEvent.fData.fT0.fDigis.assign(startIt, stopIt);
+
+      /*
+      uint32_t uPrevIdx = event.GetIndex(ECbmDataType::kT0Digi, 0);
+      uint32_t uNbExtra = 0;
+      for (uint32_t uDigiIdx = 1; uDigiIdx < uNbDigis; ++uDigiIdx) {
+        // selEvent.fData.fT0.fDigis.push_back(fvDigiT0[event.GetIndex(ECbmDataType::kT0Digi, uDigiIdx)]);
+        if (uPrevIdx + 1 != event.GetIndex(ECbmDataType::kT0Digi, uDigiIdx)) {
+          uNbExtra += event.GetIndex(ECbmDataType::kT0Digi, uDigiIdx) - (uPrevIdx + 1);
+        }
+        uPrevIdx = event.GetIndex(ECbmDataType::kT0Digi, uDigiIdx);
+      }
+      if (0 < uNbExtra) {
+        LOG(info) << "In event " << event.GetNumber() << " the T0 block selection added " << uNbExtra
+                  << " extra digis compared to the loop one";
       }
+      */
     }
 
     /// ==> STS
     uNbDigis = (0 < event.GetNofData(ECbmDataType::kStsDigi) ? event.GetNofData(ECbmDataType::kStsDigi) : 0);
     if (uNbDigis) {
-      for (uint32_t uDigiIdx = 0; uDigiIdx < uNbDigis; ++uDigiIdx) {
-        selEvent.fData.fSts.fDigis.push_back(fvDigiSts[event.GetIndex(ECbmDataType::kStsDigi, uDigiIdx)]);
+      auto startIt = fvDigiSts.begin() + event.GetIndex(ECbmDataType::kStsDigi, 0);
+      auto stopIt  = fvDigiSts.begin() + event.GetIndex(ECbmDataType::kStsDigi, uNbDigis - 1);
+      selEvent.fData.fSts.fDigis.assign(startIt, stopIt);
+
+      /*
+      uint32_t uPrevIdx = event.GetIndex(ECbmDataType::kStsDigi, 0);
+      uint32_t uNbExtra = 0;
+      for (uint32_t uDigiIdx = 1; uDigiIdx < uNbDigis; ++uDigiIdx) {
+        // selEvent.fData.fSts.fDigis.push_back(fvDigiSts[event.GetIndex(ECbmDataType::kStsDigi, uDigiIdx)]);
+        if (uPrevIdx + 1 != event.GetIndex(ECbmDataType::kStsDigi, uDigiIdx)) {
+          uNbExtra += event.GetIndex(ECbmDataType::kStsDigi, uDigiIdx) - (uPrevIdx + 1);
+        }
+        uPrevIdx = event.GetIndex(ECbmDataType::kStsDigi, uDigiIdx);
       }
+      if (0 < uNbExtra) {
+        LOG(info) << "In event " << event.GetNumber() << " the STS block selection added " << uNbExtra
+                  << " extra digis compared to the loop one";
+      }
+      */
     }
 
     /// ==> MUCH
     uNbDigis = (0 < event.GetNofData(ECbmDataType::kMuchDigi) ? event.GetNofData(ECbmDataType::kMuchDigi) : 0);
     if (uNbDigis) {
-      for (uint32_t uDigiIdx = 0; uDigiIdx < uNbDigis; ++uDigiIdx) {
-        selEvent.fData.fMuch.fDigis.push_back(fvDigiMuch[event.GetIndex(ECbmDataType::kMuchDigi, uDigiIdx)]);
+      auto startIt = fvDigiMuch.begin() + event.GetIndex(ECbmDataType::kMuchDigi, 0);
+      auto stopIt  = fvDigiMuch.begin() + event.GetIndex(ECbmDataType::kMuchDigi, uNbDigis - 1);
+      selEvent.fData.fMuch.fDigis.assign(startIt, stopIt);
+
+      /*
+      uint32_t uPrevIdx = event.GetIndex(ECbmDataType::kMuchDigi, 0);
+      uint32_t uNbExtra = 0;
+      for (uint32_t uDigiIdx = 1; uDigiIdx < uNbDigis; ++uDigiIdx) {
+        // selEvent.fData.fMuch.fDigis.push_back(fvDigiMuch[event.GetIndex(ECbmDataType::kMuchDigi, uDigiIdx)]);
+        if (uPrevIdx + 1 != event.GetIndex(ECbmDataType::kMuchDigi, uDigiIdx)) {
+          uNbExtra += event.GetIndex(ECbmDataType::kMuchDigi, uDigiIdx) - (uPrevIdx + 1);
+        }
+        uPrevIdx = event.GetIndex(ECbmDataType::kMuchDigi, uDigiIdx);
+      }
+      if (0 < uNbExtra) {
+        LOG(info) << "In event " << event.GetNumber() << " the MUCH block selection added " << uNbExtra
+                  << " extra digis compared to the loop one";
       }
+      */
     }
 
-    /// ==> TRD
+    /// ==> TRD + TRD2D
     uNbDigis = (0 < event.GetNofData(ECbmDataType::kTrdDigi) ? event.GetNofData(ECbmDataType::kTrdDigi) : 0);
     if (uNbDigis) {
-      for (uint32_t uDigiIdx = 0; uDigiIdx < uNbDigis; ++uDigiIdx) {
-        selEvent.fData.fTrd.fDigis.push_back(fvDigiTrd[event.GetIndex(ECbmDataType::kTrdDigi, uDigiIdx)]);
+      auto startIt = fvDigiTrd.begin() + event.GetIndex(ECbmDataType::kTrdDigi, 0);
+      auto stopIt  = fvDigiTrd.begin() + event.GetIndex(ECbmDataType::kTrdDigi, uNbDigis - 1);
+      selEvent.fData.fTrd.fDigis.assign(startIt, stopIt);
+
+      /*
+      uint32_t uPrevIdx = event.GetIndex(ECbmDataType::kTrdDigi, 0);
+      uint32_t uNbExtra = 0;
+      for (uint32_t uDigiIdx = 1; uDigiIdx < uNbDigis; ++uDigiIdx) {
+        // selEvent.fData.fTrd.fDigis.push_back(fvDigiTrd[event.GetIndex(ECbmDataType::kTrdDigi, uDigiIdx)]);
+        if (uPrevIdx + 1 != event.GetIndex(ECbmDataType::kTrdDigi, uDigiIdx)) {
+          uNbExtra += event.GetIndex(ECbmDataType::kTrdDigi, uDigiIdx) - (uPrevIdx + 1);
+          LOG(info) << "Extra TRD digi: prev is " << uPrevIdx << " vs new " << event.GetIndex(ECbmDataType::kTrdDigi, uDigiIdx)
+                    << " index " << uDigiIdx << " out of " << uNbDigis;
+        }
+        uPrevIdx = event.GetIndex(ECbmDataType::kTrdDigi, uDigiIdx);
       }
+      if (0 < uNbExtra) {
+        LOG(info) << "In event " << event.GetNumber() << " the TRD block selection added " << uNbExtra
+                  << " extra digis compared to the loop one";
+      }
+      */
     }
 
     /// ==> TOF
     uNbDigis = (0 < event.GetNofData(ECbmDataType::kTofDigi) ? event.GetNofData(ECbmDataType::kTofDigi) : 0);
     if (uNbDigis) {
-      for (uint32_t uDigiIdx = 0; uDigiIdx < uNbDigis; ++uDigiIdx) {
-        selEvent.fData.fTof.fDigis.push_back(fvDigiTof[event.GetIndex(ECbmDataType::kTofDigi, uDigiIdx)]);
+      auto startIt = fvDigiTof.begin() + event.GetIndex(ECbmDataType::kTofDigi, 0);
+      auto stopIt  = fvDigiTof.begin() + event.GetIndex(ECbmDataType::kTofDigi, uNbDigis - 1);
+      selEvent.fData.fTof.fDigis.assign(startIt, stopIt);
+
+      /*
+      uint32_t uPrevIdx = event.GetIndex(ECbmDataType::kTofDigi, 0);
+      uint32_t uNbExtra = 0;
+      for (uint32_t uDigiIdx = 1; uDigiIdx < uNbDigis; ++uDigiIdx) {
+        // selEvent.fData.fTof.fDigis.push_back(fvDigiTof[event.GetIndex(ECbmDataType::kTofDigi, uDigiIdx)]);
+        if (uPrevIdx + 1 != event.GetIndex(ECbmDataType::kTofDigi, uDigiIdx)) {
+          uNbExtra += event.GetIndex(ECbmDataType::kTofDigi, uDigiIdx) - (uPrevIdx + 1);
+        }
+        uPrevIdx = event.GetIndex(ECbmDataType::kTofDigi, uDigiIdx);
+      }
+      if (0 < uNbExtra) {
+        LOG(info) << "In event " << event.GetNumber() << " the TOF block selection added " << uNbExtra
+                  << " extra digis compared to the loop one";
       }
+      */
     }
 
     /// ==> RICH
     uNbDigis = (0 < event.GetNofData(ECbmDataType::kRichDigi) ? event.GetNofData(ECbmDataType::kRichDigi) : 0);
     if (uNbDigis) {
-      for (uint32_t uDigiIdx = 0; uDigiIdx < uNbDigis; ++uDigiIdx) {
-        selEvent.fData.fRich.fDigis.push_back(fvDigiRich[event.GetIndex(ECbmDataType::kRichDigi, uDigiIdx)]);
+      auto startIt = fvDigiRich.begin() + event.GetIndex(ECbmDataType::kRichDigi, 0);
+      auto stopIt  = fvDigiRich.begin() + event.GetIndex(ECbmDataType::kRichDigi, uNbDigis - 1);
+      selEvent.fData.fRich.fDigis.assign(startIt, stopIt);
+
+      /*
+      uint32_t uPrevIdx = event.GetIndex(ECbmDataType::kRichDigi, 0);
+      uint32_t uNbExtra = 0;
+      for (uint32_t uDigiIdx = 1; uDigiIdx < uNbDigis; ++uDigiIdx) {
+        // selEvent.fData.fRich.fDigis.push_back(fvDigiRich[event.GetIndex(ECbmDataType::kRichDigi, uDigiIdx)]);
+        if (uPrevIdx + 1 != event.GetIndex(ECbmDataType::kRichDigi, uDigiIdx)) {
+          uNbExtra += event.GetIndex(ECbmDataType::kRichDigi, uDigiIdx) - (uPrevIdx + 1);
+        }
+        uPrevIdx = event.GetIndex(ECbmDataType::kRichDigi, uDigiIdx);
       }
+      if (0 < uNbExtra) {
+        LOG(info) << "In event " << event.GetNumber() << " the RICH block selection added " << uNbExtra
+                  << " extra digis compared to the loop one";
+      }
+      */
     }
 
     /// ==> PSD
     uNbDigis = (0 < event.GetNofData(ECbmDataType::kPsdDigi) ? event.GetNofData(ECbmDataType::kPsdDigi) : 0);
     if (uNbDigis) {
-      for (uint32_t uDigiIdx = 0; uDigiIdx < uNbDigis; ++uDigiIdx) {
-        selEvent.fData.fPsd.fDigis.push_back(fvDigiPsd[event.GetIndex(ECbmDataType::kPsdDigi, uDigiIdx)]);
+      auto startIt = fvDigiPsd.begin() + event.GetIndex(ECbmDataType::kPsdDigi, 0);
+      auto stopIt  = fvDigiPsd.begin() + event.GetIndex(ECbmDataType::kPsdDigi, uNbDigis - 1);
+      selEvent.fData.fPsd.fDigis.assign(startIt, stopIt);
+
+      /*
+      uint32_t uPrevIdx = event.GetIndex(ECbmDataType::kPsdDigi, 0);
+      uint32_t uNbExtra = 0;
+      for (uint32_t uDigiIdx = 1; uDigiIdx < uNbDigis; ++uDigiIdx) {
+        // selEvent.fData.fPsd.fDigis.push_back(fvDigiPsd[event.GetIndex(ECbmDataType::kPsdDigi, uDigiIdx)]);
+        if (uPrevIdx + 1 != event.GetIndex(ECbmDataType::kPsdDigi, uDigiIdx)) {
+          uNbExtra += event.GetIndex(ECbmDataType::kPsdDigi, uDigiIdx) - (uPrevIdx + 1);
+        }
+        uPrevIdx = event.GetIndex(ECbmDataType::kPsdDigi, uDigiIdx);
+      }
+      if (0 < uNbExtra) {
+        LOG(info) << "In event " << event.GetNumber() << " the PSD block selection added " << uNbExtra
+                  << " extra digis compared to the loop one";
       }
+      */
     }
 
     vEventsSel.push_back(selEvent);
diff --git a/core/data/CbmEvent.cxx b/core/data/CbmEvent.cxx
index 84321c41e21cf53ab99f2989ec0eb83a53402a91..de4c99c2c3a634fd5e2897e8665e340572725f92 100644
--- a/core/data/CbmEvent.cxx
+++ b/core/data/CbmEvent.cxx
@@ -9,6 +9,7 @@
  **/
 #include "CbmEvent.h"
 
+#include <algorithm>  // for std::sort
 #include <iostream>  // for operator<<, basic_ostream
 #include <sstream>   // for stringstream
 #include <string>    // for char_traits
@@ -95,5 +96,13 @@ std::string CbmEvent::ToString() const
 }
 // -------------------------------------------------------------------------
 
+// -------------------------------------------------------------------------
+void CbmEvent::SortIndices()
+{
+  for (auto it = fIndexMap.begin(); it != fIndexMap.end(); it++) {
+    std::sort(it->second.begin(), it->second.end());
+  }
+}
+// -------------------------------------------------------------------------
 
 ClassImp(CbmEvent)
diff --git a/core/data/CbmEvent.h b/core/data/CbmEvent.h
index 67e6785431af23058c95c511ae358a3878dcf6c4..c9032922b82e9b4116298fa8f5c3d8accea25cc2 100644
--- a/core/data/CbmEvent.h
+++ b/core/data/CbmEvent.h
@@ -38,10 +38,10 @@ public:
   CbmEvent() : CbmEvent(-1, 0., 0.) {};
 
   /** Constructor with event number and time
-		 ** @param[in] number    Event number
-		 ** @param[in] startTime Event start time [ns]
-		 ** @param[in] endTime   Event start time [ns]
-		 **/
+   ** @param[in] number    Event number
+   ** @param[in] startTime Event start time [ns]
+   ** @param[in] endTime   Event start time [ns]
+   **/
   CbmEvent(int32_t number, double startTime = 0., double endTime = 0.)
     : TObject()
     , fNumber(number)
@@ -69,29 +69,29 @@ public:
 
 
   /** Add a data object to the index map
-		 ** @param DataType  Type of data (for values see CbmDetectorList.h)
-		 ** @param Index     Index of the data object in its TClonesArray
-		 */
+   ** @param DataType  Type of data (for values see CbmDetectorList.h)
+   ** @param Index     Index of the data object in its TClonesArray
+   */
   void AddData(ECbmDataType type, uint32_t index);
 
 
   /** Add an STS track to the event
-		 ** @param Index of STS track in its TClonesArray
-		 **/
+   ** @param Index of STS track in its TClonesArray
+   **/
   void AddStsTrack(uint32_t index) { AddData(ECbmDataType::kStsTrack, index); }
 
 
   /** Get the index of a data object in its TClonesArray
-		 ** @param DataType  Type of data (for values see CbmDetectorList.h)
-		 ** @param iData     Running number of data object in event
-		 ** @value Index of data object in its TClonesArray
-		 **/
+   ** @param DataType  Type of data (for values see CbmDetectorList.h)
+   ** @param iData     Running number of data object in event
+   ** @value Index of data object in its TClonesArray
+   **/
   uint32_t GetIndex(ECbmDataType type, uint32_t iData);
 
 
   /** Get match object
-		 ** @value Pointer to match object
-		 **/
+   ** @value Pointer to match object
+   **/
   CbmMatch* GetMatch() const { return fMatch; }
 
 
@@ -100,71 +100,71 @@ public:
 
 
   /** Get number of data objects of a given type in this event
-		 ** @param DataType  Type of data (for values see CbmDetectorList.h)
-		 ** @value Number of objects of type DataType in the event.
-		 ** -1 is data type is not registered.
-		 **/
+   ** @param DataType  Type of data (for values see CbmDetectorList.h)
+   ** @value Number of objects of type DataType in the event.
+   ** -1 is data type is not registered.
+   **/
   int32_t GetNofData(ECbmDataType type) const;
 
 
   /** Get number of STS tracks
-		 ** @value Number of STS tracks in the event. -1 if not registered.
-		 **/
+   ** @value Number of STS tracks in the event. -1 if not registered.
+   **/
   int32_t GetNofStsTracks() const { return GetNofData(ECbmDataType::kStsTrack); }
 
 
   /** Get event number
-		 ** @value Event number
-		 **/
+   ** @value Event number
+   **/
   int32_t GetNumber() const { return fNumber; }
 
 
   /** Get STS track index
-		 ** @param iTrack  Running number of STS track in the event
-		 ** @value index   Index of STS track in TClonesArray
-		 **/
+   ** @param iTrack  Running number of STS track in the event
+   ** @value index   Index of STS track in TClonesArray
+   **/
   int32_t GetStsTrackIndex(int32_t iTrack) { return GetIndex(ECbmDataType::kStsTrack, iTrack); }
 
 
   /** Get event end time
-		 ** @value End time of event [ns]
-		 **/
+   ** @value End time of event [ns]
+   **/
   double GetEndTime() const { return fTimeEnd; }
 
 
   /** Get event start time
-		 ** @value Start time of event [ns]
-		 **/
+   ** @value Start time of event [ns]
+   **/
   double GetStartTime() const { return fTimeStart; }
 
   /** Set event number
-		 ** @value Event number
-		 **/
+   ** @value Event number
+   **/
   void SetNumber(int32_t number) { fNumber = number; }
 
   /** Set end time
-		 ** @param endTime  End time of event [ns]
-		 **/
+   ** @param endTime  End time of event [ns]
+   **/
   void SetEndTime(double endTime) { fTimeEnd = endTime; }
 
 
   /** Set a match object
-		 ** @param match  Pointer to a match object
-		 **/
+   ** @param match  Pointer to a match object
+   **/
   void SetMatch(CbmMatch* match) { fMatch = match; }
 
 
   /** Set start time
-		 ** @param endTime  Start time of event [ns]
-		 **/
+   ** @param endTime  Start time of event [ns]
+   **/
   void SetStartTime(double startTime) { fTimeStart = startTime; }
 
 
   /** Set the STS track index array
-		 ** @brief Sets the index array for STS tracks.
-		 ** Old content will be overwritten.
-		 ** @param indexVector  Vector with indices of STS tracks
-	     **/
+   ** @brief Sets the index array for STS tracks.
+   ** Old content will be overwritten.
+   ** @param indexVector  Vector with indices of STS tracks
+   **/
   void SetStsTracks(std::vector<uint32_t>& indexVector)
   {
     fNofData -= fIndexMap[ECbmDataType::kStsTrack].size();
@@ -174,24 +174,29 @@ public:
 
 
   /** Set the event vertex variables
-	   *@param x         x coordinate [cm]
-	   *@param y         y coordinate [cm]
-	   *@param z         z coordinate [cm]
-	   *@param chi2      chi square of vertex fit
-	   *@param ndf       Number of degrees of freedom of vertex fit
-	   *@param nTracks   Number of tracks used for vertex fit
-	   *@param covMat    Covariance Matrix (symmetric, 3x3)
-	   **/
+   ** @param x         x coordinate [cm]
+   ** @param y         y coordinate [cm]
+   ** @param z         z coordinate [cm]
+   ** @param chi2      chi square of vertex fit
+   ** @param ndf       Number of degrees of freedom of vertex fit
+   ** @param nTracks   Number of tracks used for vertex fit
+   ** @param covMat    Covariance Matrix (symmetric, 3x3)
+   **/
   void SetVertex(double x, double y, double z, double chi2, int32_t ndf, int32_t nTracks, const TMatrixFSym& covMat);
 
 
+  /** Sort the indices from smallest to biffest for each data type
+   **/
+  void SortIndices();
+
+
   /** String output **/
   std::string ToString() const;
 
 
   /** Get event vertex
-		 ** @value Pointer to vertex object
-		 **/
+   ** @value Pointer to vertex object
+   **/
   CbmVertex* GetVertex() { return &fVertex; }
 
   /** Swap two events **/