diff --git a/reco/detectors/mvd/plugins/tasks/CbmMvdSensorClusterfinderTask.cxx b/reco/detectors/mvd/plugins/tasks/CbmMvdSensorClusterfinderTask.cxx
index cd951aab9c051ac1de50af11f71041404e88b5d9..07a7194f5e499847a3ca22c48a7df32cbaec69b0 100644
--- a/reco/detectors/mvd/plugins/tasks/CbmMvdSensorClusterfinderTask.cxx
+++ b/reco/detectors/mvd/plugins/tasks/CbmMvdSensorClusterfinderTask.cxx
@@ -23,6 +23,8 @@ CbmMvdSensorClusterfinderTask::CbmMvdSensorClusterfinderTask() : CbmMvdSensorClu
 {
 
   fPluginIDNumber = 200;
+  fPixelUsed=0;
+
 }
 // -------------------------------------------------------------------------
 
@@ -84,6 +86,9 @@ CbmMvdSensorClusterfinderTask::CbmMvdSensorClusterfinderTask(Int_t iMode, Int_t
   , fAddNoise(kFALSE)
 {
   fPluginIDNumber = 200;
+  fInputFrameBuffer=0;
+  fOutputFrameBuffer=0;
+  fPixelUsed=0;
 }
 // -------------------------------------------------------------------------
 
@@ -96,7 +101,8 @@ void CbmMvdSensorClusterfinderTask::InitTask(CbmMvdSensor* mysensor)
   LOG(debug) << "CbmMvdSensorClusterfinderTask : Initialisation of sensor " << fSensor->GetName();
   fInputBuffer  = new TClonesArray("CbmMvdDigi", 100);
   fOutputBuffer = new TClonesArray("CbmMvdCluster", 100);
-
+  fInputFrameBuffer  = new TClonesArray("CbmMvdDigi", 100);
+  fOutputFrameBuffer = new TClonesArray("CbmMvdCluster", 100);
 
   //Add charge collection histograms
   fPixelChargeHistos = new TObjArray();
@@ -209,38 +215,144 @@ Bool_t CbmMvdSensorClusterfinderTask::ReInit()
 void CbmMvdSensorClusterfinderTask::ExecChain() { Exec(); }
 // -------------------------------------------------------------------------
 
+void CbmMvdSensorClusterfinderTask::Exec() {
+
+  Int_t minFrame=0; //smalles frame number in this time slice
+  Int_t maxFrame=0;  //biggest frame number in this time slice
+
+  // Detect relevant frame numbers from digis in the input fInputBuffer
+
+  CbmMvdDigi* digi;
+
+  if (!fInputBuffer) {Fatal("CbmMvdSensorClusterfinderTask::Exec - fInputBuffer missing", "CbmMvdSensorClusterfinderTask::Exec - fInputBuffer missing");}
+  if (fInputBuffer->GetEntriesFast()==0) {return;}
+
+  digi=(CbmMvdDigi*)fInputBuffer->At(0);
+  minFrame=digi->GetFrameNumber();
+  maxFrame=digi->GetFrameNumber();
+
+
+  for (Int_t i=0; i<fInputBuffer->GetEntriesFast(); i++) {
+
+    digi=(CbmMvdDigi*)fInputBuffer->At(i);
+    if(digi->GetFrameNumber()>maxFrame){maxFrame=digi->GetFrameNumber();};
+    if(digi->GetFrameNumber()<minFrame){minFrame=digi->GetFrameNumber();};
+  }
+
+  //Fill frameBuffer for the first frame of interest
+
+  for(Int_t i=0; i<fInputBuffer->GetEntriesFast(); i++) {
+
+    digi=(CbmMvdDigi*) fInputBuffer->At(i);
+    if(digi->GetFrameNumber()==minFrame){fInputFrameBuffer->AbsorbObjects(fInputBuffer,i,i);}
+  }
+
+
+
+  // Continue filling starting from the 2nd frame. Two frames are processed by ExecFrame in order to avoid handle time walk
+
+  for(Int_t currentFrame=minFrame; maxFrame-1; currentFrame++){
+
+
+
+
+    // Clean up input buffer from possible digis, which were already associated to a cluster while processing the previous frame
+    if (fPixelUsed) {
+
+      for (Int_t i=fPixelUsed->GetSize()-1 ; i>=0; i--) {
+
+        if(fPixelUsed->At(i)){fInputFrameBuffer->RemoveAt(i);}
+
+      }
+
+    }
+
+    delete fPixelUsed; //Reset pixel used array
+
+    // Clean up input buffer from possible digis of the previous frame, which were not associated to a cluster.
+    // With MIMOSIS, this should not happen.
+    // Note that always two frames should be present in the buffer, therefore the currentFrame remains and the consecutive Frame will
+    // be added in a next step.
+
+    fInputFrameBuffer->Compress();
+
+    for (Int_t i=0; i<fInputFrameBuffer->GetEntriesFast(); i++) {
+
+      digi=(CbmMvdDigi*) fInputFrameBuffer->At(i);
+
+      if(digi->GetFrameNumber()<currentFrame-1){
+        fInputFrameBuffer->RemoveAt(i);
+
+      }
+    }
+
+    fInputFrameBuffer->Compress(); //Eliminate possible empty slots in the TClonesArray
+
+    // Add data from the next frame. Note: This is the second of two valid frames.
+
+    for (Int_t i=0; i<fInputBuffer->GetEntriesFast(); i++) {
+      digi=(CbmMvdDigi*) fInputBuffer->At(i);
+      if(digi->GetFrameNumber()==currentFrame+1){ fInputFrameBuffer->AbsorbObjects(fInputBuffer,i,i); }
+
+    }
+
+
+    fPixelUsed = new TArrayS(fInputFrameBuffer->GetEntriesFast());
+
+    for (Int_t iDigi = 0; iDigi < fPixelUsed->GetSize(); iDigi++) {
+      fPixelUsed->AddAt(0, iDigi);
+      // Reset fPixelUsed-Array. All entries are set to 0 (not used)
+    }
+
+    ExecFrame(currentFrame);
+
+    fOutputBuffer->AbsorbObjects(fOutputFrameBuffer);
+    fOutputFrameBuffer->Clear();
+
+
+  }
+
+  delete fPixelUsed;
+
+}
+
+
+
+
+
+
 // -----   Public method Exec   --------------
-void CbmMvdSensorClusterfinderTask::Exec()
+void CbmMvdSensorClusterfinderTask::ExecFrame(Int_t currentFrame)
 {
   LOG(debug) << "CbmMvdSensorClusterfinderTask::Exec - Running Sensor " << fSensor->GetName();
-  LOG(debug) << "CbmMvdSensorClusterfinderTask::Exec - InputBufferSize " << fInputBuffer->GetEntriesFast();
+  LOG(debug) << "CbmMvdSensorClusterfinderTask::Exec - InputBufferSize " << fInputFrameBuffer->GetEntriesFast();
 
-  if (fInputBuffer->GetEntriesFast() > 0) {
-    fOutputBuffer->Delete();
+  if (fInputFrameBuffer->GetEntriesFast() > 0) {
     inputSet                    = kFALSE;
     vector<Int_t>* clusterArray = new vector<Int_t>;
 
     CbmMvdDigi* digi;
 
     Int_t iDigi = 0;
-    digi        = (CbmMvdDigi*) fInputBuffer->At(iDigi);
+    digi        = (CbmMvdDigi*) fInputFrameBuffer->At(iDigi);
 
 
     if (!digi) { LOG(error) << "CbmMvdSensorFindHitTask - Fatal: No Digits found in this event."; }
 
-    Int_t nDigis = fInputBuffer->GetEntriesFast();
+    Int_t nDigis = fInputFrameBuffer->GetEntriesFast();
     //LOG(debug) << "CbmMvdClusterTrask::Exec(): Received following number of digis: " << nDigis;
-    TArrayS* pixelUsed = new TArrayS(nDigis);
 
-    for (iDigi = 0; iDigi < nDigis; iDigi++) {
-      pixelUsed->AddAt(0, iDigi);
-    }
 
     fDigiMap.clear();
+
     Int_t refId;
+
+    // Sort digis into a map in order to access them later by x-y coordinate.
+    // No double entries are possible (max 1 digi per pixel)
+
     for (Int_t k = 0; k < nDigis; k++) {
 
-      digi  = (CbmMvdDigi*) fInputBuffer->At(k);
+      digi  = (CbmMvdDigi*) fInputFrameBuffer->At(k);
       refId = digi->GetRefId();
       if (refId < 0) { LOG(fatal) << "RefID of this digi is -1 this should not happend "; }
       //apply fNeighThreshold
@@ -249,6 +361,9 @@ void CbmMvdSensorClusterfinderTask::Exec()
 
       pair<Int_t, Int_t> a(digi->GetPixelX(), digi->GetPixelY());
       //LOG(debug) << "registerde pixel x:" << digi->GetPixelX() << " y:" << digi->GetPixelY();
+
+
+
       fDigiMap[a] = k;
     };
 
@@ -263,7 +378,7 @@ void CbmMvdSensorClusterfinderTask::Exec()
 
       LOG_IF(debug, iDigi % 10000 == 0) << GetName() << " Digi:" << iDigi;
 
-      digi = (CbmMvdDigi*) fInputBuffer->At(iDigi);
+      digi = (CbmMvdDigi*) fInputFrameBuffer->At(iDigi);
       //LOG(debug) << "working with pixel x:" << digi->GetPixelX() << " y:" << digi->GetPixelY();
 
 
@@ -279,21 +394,24 @@ void CbmMvdSensorClusterfinderTask::Exec()
 
       LOG(debug) << "CbmMvdSensorClusterfinderTask: Checking for seed pixels...";
 
-      if ((GetAdcCharge(digi->GetCharge()) >= fSeedThreshold) && (pixelUsed->At(iDigi) == kFALSE)) {
+      if ((GetAdcCharge(digi->GetCharge()) >= fSeedThreshold) && (fPixelUsed->At(iDigi) == kFALSE)) {
         clusterArray->clear();
         clusterArray->push_back(iDigi);
 
-        pixelUsed->AddAt(1, iDigi);
+        fPixelUsed->AddAt(1, iDigi);
 
         pair<Int_t, Int_t> a(digi->GetPixelX(), digi->GetPixelY());
         fDigiMapIt = fDigiMap.find(a);
+
+
         if (fDigiMapIt != fDigiMap.end()) { fDigiMap.erase(fDigiMapIt); };
+        // This triggers a re-sort of the map. Performance?
 
         for (ULong64_t iCluster = 0; iCluster < clusterArray->size(); iCluster++) {
 
           LOG(debug) << " CbmMvdSensorClusterfinderTask: Calling method CheckForNeighbours()...";
 
-          CheckForNeighbours(clusterArray, iCluster, pixelUsed);
+          CheckForNeighbours(clusterArray, iCluster, fPixelUsed);
           //LOG(debug) << "checked for neighbours, create cluster";
         }
 
@@ -303,13 +421,13 @@ void CbmMvdSensorClusterfinderTask::Exec()
 
         pair<Int_t, Int_t> pixelCoords;
         Int_t clusterSize = clusterArray->size();
-        Int_t nClusters   = fOutputBuffer->GetEntriesFast();
+        Int_t nClusters   = fOutputFrameBuffer->GetEntriesFast();
         //LOG(debug) << "new cluster: " << nClusters;
-        CbmMvdCluster* clusterNew = new ((*fOutputBuffer)[nClusters]) CbmMvdCluster();
+        CbmMvdCluster* clusterNew = new ((*fOutputFrameBuffer)[nClusters]) CbmMvdCluster();
         clusterNew->SetAddress(fAddress);
 
         for (i = 0; i < clusterSize; i++) {
-          CbmMvdDigi* digiInCluster = (CbmMvdDigi*) fInputBuffer->At(clusterArray->at(i));
+          CbmMvdDigi* digiInCluster = (CbmMvdDigi*) fInputFrameBuffer->At(clusterArray->at(i));
           clusterNew->AddDigi(digiInCluster->GetRefId());
           pixelCoords                = std::make_pair(digiInCluster->GetPixelX(), digiInCluster->GetPixelY());
           pixelCharge                = digiInCluster->GetCharge();
@@ -326,16 +444,15 @@ void CbmMvdSensorClusterfinderTask::Exec()
     }  // loop on digis
 
 
-    delete pixelUsed;
+
     clusterArray->clear();
     delete clusterArray;
-    fInputBuffer->Delete();
 
     fDigiMap.clear();
   }
   else {  //LOG(debug) << "No input found.";
   }
-  fInputBuffer->Clear();
+  fInputFrameBuffer->Clear();
 }
 // -------------------------------------------------------------------------
 
@@ -343,7 +460,7 @@ void CbmMvdSensorClusterfinderTask::Exec()
 void CbmMvdSensorClusterfinderTask::CheckForNeighbours(vector<Int_t>* clusterArray, Int_t clusterDigi,
                                                        TArrayS* pixelUsed)
 {
-  CbmMvdDigi* seed = (CbmMvdDigi*) fInputBuffer->At(clusterArray->at(clusterDigi));
+  CbmMvdDigi* seed = (CbmMvdDigi*) fInputFrameBuffer->At(clusterArray->at(clusterDigi));
   //LOG(debug) << "pixel nr. " << clusterDigi << " is seed";
 
 
diff --git a/reco/detectors/mvd/plugins/tasks/CbmMvdSensorClusterfinderTask.h b/reco/detectors/mvd/plugins/tasks/CbmMvdSensorClusterfinderTask.h
index 1ca9cbe9ef655af6c5cda969927c4a502896cc64..97934c7fc89e5eaaf0f98cb7e5d68d6d2a3acadc 100644
--- a/reco/detectors/mvd/plugins/tasks/CbmMvdSensorClusterfinderTask.h
+++ b/reco/detectors/mvd/plugins/tasks/CbmMvdSensorClusterfinderTask.h
@@ -59,7 +59,8 @@ public:
 
   /** Task execution **/
   void ExecChain();
-  void Exec();
+  void Exec();      // Processes time slice by organizing data and calling ExecFrame for each hardware frame.
+  void ExecFrame(Int_t currentFrame); // Processes data of a given frame + consecutive frame (time walk).
 
   /** Intialisation **/
   void InitTask(CbmMvdSensor* mySensor);
@@ -195,6 +196,10 @@ private:
   CbmMvdSensorClusterfinderTask(const CbmMvdSensorClusterfinderTask&);
   CbmMvdSensorClusterfinderTask operator=(const CbmMvdSensorClusterfinderTask&);
 
+  TClonesArray* fInputFrameBuffer;
+  TClonesArray* fOutputFrameBuffer;
+  TArrayS* fPixelUsed;
+
   ClassDef(CbmMvdSensorClusterfinderTask, 1);
 };
 
diff --git a/sim/detectors/mvd/plugins/tasks/CbmMvdSensorDigitizerTask.cxx b/sim/detectors/mvd/plugins/tasks/CbmMvdSensorDigitizerTask.cxx
index 977b0aed98cd7bd8bde3dbe0c47d8f1873c541dc..c0e593234dcb0576efb814ff386cbf20cbbb88b0 100644
--- a/sim/detectors/mvd/plugins/tasks/CbmMvdSensorDigitizerTask.cxx
+++ b/sim/detectors/mvd/plugins/tasks/CbmMvdSensorDigitizerTask.cxx
@@ -329,6 +329,8 @@ CbmMvdSensorDigitizerTask::~CbmMvdSensorDigitizerTask()
     fInputPoints->Delete();
     delete fInputPoints;
   }
+
+
   if (fOutputBuffer) {
     fOutputBuffer->Delete();
     delete fOutputBuffer;