diff --git a/source/VirtualFluidsBasic/numerics/geometry3d/CoordinateTransformation3D.h b/source/VirtualFluidsBasic/numerics/geometry3d/CoordinateTransformation3D.h
index 6928c5db250eaf9f9c3fa0524a9a1b9a118fcca9..922d51986b93c70d446abfcc1754c3bf8a81b92b 100644
--- a/source/VirtualFluidsBasic/numerics/geometry3d/CoordinateTransformation3D.h
+++ b/source/VirtualFluidsBasic/numerics/geometry3d/CoordinateTransformation3D.h
@@ -153,6 +153,7 @@ private:
    friend class MPIIORestartCoProcessor;
    friend class MPIIOMigrationCoProcessor;
    friend class MPIIOMigrationBECoProcessor;
+   friend class CheckpointConverter;
 };
 
 #endif //COORDINATETRANSFORMATION3D_H
diff --git a/source/VirtualFluidsCore/CoProcessors/MPIIOMigrationBECoProcessor.cpp b/source/VirtualFluidsCore/CoProcessors/MPIIOMigrationBECoProcessor.cpp
index 1992d0726fdc0126ad4238bac9a777b39951a26c..77e6788bf2c5714050e89967afe1ac0f98da36a2 100644
--- a/source/VirtualFluidsCore/CoProcessors/MPIIOMigrationBECoProcessor.cpp
+++ b/source/VirtualFluidsCore/CoProcessors/MPIIOMigrationBECoProcessor.cpp
@@ -1698,6 +1698,7 @@ void MPIIOMigrationBECoProcessor::readDataSet(int step)
 
          // find the nesessary block and fill it
          SPtr<Block3D> block = grid->getBlock(blockID);
+         this->lbmKernel->setBlock(block);
          SPtr<LBMKernel> kernel = this->lbmKernel->clone();
          LBMReal collFactor = LBMSystem::calcCollisionFactor(this->nue, block->getLevel());
          kernel->setCollisionFactor(collFactor);
diff --git a/source/VirtualFluidsCore/CoProcessors/MPIIOMigrationCoProcessor.cpp b/source/VirtualFluidsCore/CoProcessors/MPIIOMigrationCoProcessor.cpp
index 4240eec8efc664dba2b61807b963fc239af63785..236cb7135c0a1404cb21c59369ec9ab8c69f14ac 100644
--- a/source/VirtualFluidsCore/CoProcessors/MPIIOMigrationCoProcessor.cpp
+++ b/source/VirtualFluidsCore/CoProcessors/MPIIOMigrationCoProcessor.cpp
@@ -1560,13 +1560,14 @@ void MPIIOMigrationCoProcessor::readBlocks(int step)
    }
 
    // clear the grid
-   std::vector<SPtr<Block3D>> blocksVector;
-   grid->getBlocks(0, blocksVector);
-   int del = 0;
-   for (SPtr<Block3D> block : blocksVector)
+   std::vector<SPtr<Block3D>> blocksVector[25];
+   int minInitLevel = this->grid->getCoarsestInitializedLevel();
+   int maxInitLevel = this->grid->getFinestInitializedLevel();
+   for (int level = minInitLevel; level <= maxInitLevel; level++)
    {
-      grid->deleteBlock(block);
-      del++;
+      grid->getBlocks(level, blocksVector[level]);
+      for (SPtr<Block3D> block : blocksVector[level])  //	blocks of the current level
+         grid->deleteBlock(block);
    }
 
    // restore the grid
diff --git a/source/VirtualFluidsCore/CoProcessors/MPIIORestartCoProcessor.cpp b/source/VirtualFluidsCore/CoProcessors/MPIIORestartCoProcessor.cpp
index d8b0068048b66a317060dbb5d537983508964128..4e7d3c2392198cb78ea699e3e82c0b4bb74b92e3 100644
--- a/source/VirtualFluidsCore/CoProcessors/MPIIORestartCoProcessor.cpp
+++ b/source/VirtualFluidsCore/CoProcessors/MPIIORestartCoProcessor.cpp
@@ -1921,6 +1921,7 @@ void MPIIORestartCoProcessor::readDataSet(int step)
 
       // find the nesessary block and fill it
       SPtr<Block3D> block = grid->getBlock(dataSetArray[n].x1, dataSetArray[n].x2, dataSetArray[n].x3, dataSetArray[n].level);
+      this->lbmKernel->setBlock(block);
       SPtr<LBMKernel> kernel = this->lbmKernel->clone();
       kernel->setGhostLayerWidth(dataSetArray[n].ghostLayerWidth);
       kernel->setCollisionFactor(dataSetArray[n].collFactor);