diff --git a/src/gpu/GridGenerator/grid/Grid.h b/src/gpu/GridGenerator/grid/Grid.h
index 2674257d17005f7fa2b7968381e4dc5cf1b893ca..338168e0f8250142f5e31582557ff2fc2ef5a860 100644
--- a/src/gpu/GridGenerator/grid/Grid.h
+++ b/src/gpu/GridGenerator/grid/Grid.h
@@ -55,11 +55,7 @@ public:
                                                                 uint *iCellFcfBorder, uint *&iCellFcfBulk,
                                                                 uint &intFCBorderKfc, uint &intFCBulkKfc,
                                                                 int level) const = 0;
-    CUDA_HOST virtual void getGridInterfaceIndicesBorderBulkCF(uint *iCellCfcBorder, uint *&iCellCfcBulk,
-                                                               uint *iCellCffBorder, uint *&iCellCffBulk,
-                                                               uint &intCFBorderKfc, uint &intCFBulkKfc,
-                                                               uint *neighborX_SP, uint *neighborY_SP,
-                                                               uint *neighborZ_SP, int level) const = 0;
+    CUDA_HOST virtual bool isSparseIndexInFluidNodeIndicesBorder(uint &sparseIndex) const = 0;
 
     CUDA_HOST virtual int *getNeighborsX() const = 0;
     CUDA_HOST virtual int *getNeighborsY() const = 0;
diff --git a/src/gpu/GridGenerator/grid/GridBuilder/GridBuilder.h b/src/gpu/GridGenerator/grid/GridBuilder/GridBuilder.h
index dbe3763568e8589a281efee2f218109534f294c1..97d36c700a87be7f168efe2d320902bf317a6424 100644
--- a/src/gpu/GridGenerator/grid/GridBuilder/GridBuilder.h
+++ b/src/gpu/GridGenerator/grid/GridBuilder/GridBuilder.h
@@ -59,10 +59,6 @@ public:
     virtual void getGridInterfaceIndicesBorderBulkFC(uint *iCellFccBorder, uint *&iCellFccBulk, uint *iCellFcfBorder,
                                                       uint *&iCellFcfBulk, uint &intFCBorderKfc, uint &intFCBulkKfc,
                                                       int level) const = 0;
-    virtual void getGridInterfaceIndicesBorderBulkCF(uint *iCellCfcBorder, uint *&iCellCfcBulk, uint *iCellCffBorder,
-                                                     uint *&iCellCffBulk, uint &intCFBorderKfc, uint &intCFBulkKfc,
-                                                     uint *neighborX_SP, uint *neighborY_SP, uint *neighborZ_SP,
-                                                     int level) const = 0;
 
     virtual void getOffsetFC(real* xOffCf, real* yOffCf, real* zOffCf, int level) = 0;
     virtual void getOffsetCF(real* xOffFc, real* yOffFc, real* zOffFc, int level) = 0;
diff --git a/src/gpu/GridGenerator/grid/GridBuilder/LevelGridBuilder.cpp b/src/gpu/GridGenerator/grid/GridBuilder/LevelGridBuilder.cpp
index b5bcae981d49664bfdd2fd62107a2026df8af1af..b269dd33e5ec00218eb6943b2edb57e246373bf4 100644
--- a/src/gpu/GridGenerator/grid/GridBuilder/LevelGridBuilder.cpp
+++ b/src/gpu/GridGenerator/grid/GridBuilder/LevelGridBuilder.cpp
@@ -215,18 +215,6 @@ void LevelGridBuilder::getGridInterfaceIndicesBorderBulkFC(uint *iCellFccBorder,
                                                              intFCBorderKfc, intFCBulkKfc, level);
 }
 
-void LevelGridBuilder::getGridInterfaceIndicesBorderBulkCF(uint *iCellCfcBorder, uint *&iCellCfcBulk,
-                                                           uint *iCellCffBorder,
-                                                  uint *&iCellCffBulk, uint &intCFBorderKfc, uint &intCFBulkKfc,
-                                                  uint *neighborX_SP, uint *neighborY_SP, uint *neighborZ_SP, int level) const
-{
-    this->grids[level]->getGridInterfaceIndicesBorderBulkCF(iCellCfcBorder, iCellCfcBulk, 
-                                                            iCellCffBorder, iCellCffBulk,
-                                                            intCFBorderKfc, intCFBulkKfc, 
-                                                            neighborX_SP, neighborY_SP, neighborZ_SP,
-                                                            level);
-}
-
 void LevelGridBuilder::getOffsetFC(real * xOffFC, real * yOffFC, real * zOffFC, int level)
 {
     for (uint i = 0; i < getNumberOfNodesFC(level); i++)
diff --git a/src/gpu/GridGenerator/grid/GridBuilder/LevelGridBuilder.h b/src/gpu/GridGenerator/grid/GridBuilder/LevelGridBuilder.h
index b75719fa60550542e3344ca1b06482b0f78eb87a..6b84863c0c50c610acc06056f1b977f6cf4acc85 100644
--- a/src/gpu/GridGenerator/grid/GridBuilder/LevelGridBuilder.h
+++ b/src/gpu/GridGenerator/grid/GridBuilder/LevelGridBuilder.h
@@ -142,12 +142,6 @@ public:
                                                                    uint &intFCBorderKfc, uint &intFCBulkKfc,
                                                                   int level) const override;
 
-    GRIDGENERATOR_EXPORT void getGridInterfaceIndicesBorderBulkCF(uint *iCellCfcBorder, uint *&iCellCfcBulk,
-                                                                  uint *iCellCffBorder, uint *&iCellCffBulk,
-                                                                  uint &intCFBorderKfc, uint &intCFBulkKfc,
-                                                                  uint *neighborX_SP, uint *neighborY_SP,
-                                                                  uint *neighborZ_SP, int level) const override;
-
     GRIDGENERATOR_EXPORT void getOffsetFC(real* xOffCf, real* yOffCf, real* zOffCf, int level) override;
     GRIDGENERATOR_EXPORT void getOffsetCF(real* xOffFc, real* yOffFc, real* zOffFc, int level) override;
 
diff --git a/src/gpu/GridGenerator/grid/GridImp.cu b/src/gpu/GridGenerator/grid/GridImp.cu
index e2b30718680647fa755a883fabf86d769c68eeb7..adf6781d93a9520e1a2d09af1ee079ab87541c2b 100644
--- a/src/gpu/GridGenerator/grid/GridImp.cu
+++ b/src/gpu/GridGenerator/grid/GridImp.cu
@@ -1980,55 +1980,6 @@ void GridImp::getGridInterfaceIndicesBorderBulkFC(uint *iCellFccBorder, uint *&i
     }
 }
 
-void GridImp::getGridInterfaceIndicesBorderBulkCF(uint *iCellCfcBorder, uint *&iCellCfcBulk, uint *iCellCffBorder,
-                                                  uint *&iCellCffBulk, uint &intCFBorderKcf, uint &intCFBulkKcf,
-                                                  uint *neighborX_SP, uint *neighborY_SP, uint *neighborZ_SP,
-                                                  int level) const
-{
-    // reorder the array of CFC/CFF indices and return pointers and sizes of the new subarrays
-    uint *iCellCfcAll = iCellCfcBorder;
-    uint *iCellCffAll = iCellCffBorder;
-    std::vector<uint> iCellCfcBorderVector;
-    std::vector<uint> iCellCfcBulkVector;
-    std::vector<uint> iCellCffBorderVector;
-    std::vector<uint> iCellCffBulkVector;
-
-    uint sparseIndexOfICellBSW;
-    for (uint i = 0; i < this->gridInterface->cf.numberOfEntries; i++) {
-        sparseIndexOfICellBSW = iCellCfcAll[i];
-
-        if (isSparseIndexInFluidNodeIndicesBorder(sparseIndexOfICellBSW) 
-            || isSparseIndexInFluidNodeIndicesBorder(neighborX_SP[sparseIndexOfICellBSW])
-            || isSparseIndexInFluidNodeIndicesBorder(neighborY_SP[sparseIndexOfICellBSW])
-            || isSparseIndexInFluidNodeIndicesBorder(neighborZ_SP[sparseIndexOfICellBSW])
-            || isSparseIndexInFluidNodeIndicesBorder(neighborY_SP[neighborX_SP[sparseIndexOfICellBSW]])
-            || isSparseIndexInFluidNodeIndicesBorder(neighborZ_SP[neighborX_SP[sparseIndexOfICellBSW]])
-            || isSparseIndexInFluidNodeIndicesBorder(neighborZ_SP[neighborY_SP[sparseIndexOfICellBSW]])
-            || isSparseIndexInFluidNodeIndicesBorder(neighborZ_SP[neighborY_SP[neighborX_SP[sparseIndexOfICellBSW]]])) {
-
-            iCellCfcBorderVector.push_back(iCellCfcAll[i]);
-            iCellCffBorderVector.push_back(iCellCffAll[i]);
-        } else {
-            iCellCfcBulkVector.push_back(iCellCfcAll[i]);
-            iCellCffBulkVector.push_back(iCellCffAll[i]);
-        }
-    }
-
-    intCFBorderKcf = (uint)iCellCfcBorderVector.size();
-    intCFBulkKcf   = (uint)iCellCfcBulkVector.size();
-    iCellCfcBulk   = iCellCfcBorder + intCFBorderKcf;
-    iCellCffBulk   = iCellCffBorder + intCFBorderKcf;
-
-    for (uint i = 0; i < (uint)iCellCfcBorderVector.size(); i++) {
-        iCellCfcBorder[i] = iCellCfcBorderVector[i];
-        iCellCffBorder[i] = iCellCffBorderVector[i];
-    }
-    for (uint i = 0; i < (uint)iCellCfcBulkVector.size(); i++) {
-        iCellCfcBulk[i] = iCellCfcBulkVector[i];
-        iCellCffBulk[i] = iCellCffBulkVector[i];
-    }
-}
-
 bool GridImp::isSparseIndexInFluidNodeIndicesBorder(uint &sparseIndex) const
 {
     return std::find(this->fluidNodeIndicesBorder.begin(), this->fluidNodeIndicesBorder.end(), sparseIndex) !=
diff --git a/src/gpu/GridGenerator/grid/GridImp.h b/src/gpu/GridGenerator/grid/GridImp.h
index e2f32b677a5ea91b3d6f5dac7155174b62228d2e..50fa16b8fd9996b535de796a73433380c19a0087 100644
--- a/src/gpu/GridGenerator/grid/GridImp.h
+++ b/src/gpu/GridGenerator/grid/GridImp.h
@@ -57,7 +57,6 @@ private:
     HOSTDEVICE bool isOutSideOfGrid(Cell &cell) const;
     HOSTDEVICE bool contains(Cell &cell, char type) const;
     HOSTDEVICE void setNodeTo(Cell &cell, char type);
-    CUDA_HOST bool isSparseIndexInFluidNodeIndicesBorder(uint &sparseIndex) const;
 
     HOSTDEVICE bool nodeInPreviousCellIs(int index, char type) const;
     HOSTDEVICE bool nodeInCellIs(Cell& cell, char type) const override;
@@ -223,10 +222,7 @@ public:
     CUDA_HOST void getGridInterfaceIndicesBorderBulkFC(uint *iCellFccBorder, uint *&iCellFccBulk, uint *iCellFcfBorder,
                                                         uint *&iCellFcfBulk, uint &intFCBorderKfc, uint &intFCBulkKfc,
                                                        int level) const override;
-    CUDA_HOST void getGridInterfaceIndicesBorderBulkCF(uint *iCellCfcBorder, uint *&iCellCfcBulk, uint *iCellCffBorder,
-                                                       uint *&iCellCffBulk, uint &intCFBorderKfc, uint &intCFBulkKfc,
-                                                       uint *neighborX_SP, uint *neighborY_SP, uint *neighborZ_SP,
-                                                       int level) const override;
+    CUDA_HOST bool isSparseIndexInFluidNodeIndicesBorder(uint &sparseIndex) const override;
 
     int* getNeighborsX() const override;
     int* getNeighborsY() const override;
diff --git a/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/IndexRearrangementForStreams.cpp b/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/IndexRearrangementForStreams.cpp
index 29a8865fa35ce2708c32c3e22d425cbf08df0f71..07bdb361412b55713a3e05bad1533fcc5fa6166d 100644
--- a/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/IndexRearrangementForStreams.cpp
+++ b/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/IndexRearrangementForStreams.cpp
@@ -2,6 +2,7 @@
 
 #include "Parameter/Parameter.h"
 #include <GridGenerator/grid/GridBuilder/GridBuilder.h>
+#include <GridGenerator/grid/Grid.h>
 #include "Communication/Communicator.h"
 
 #include <iostream>
@@ -408,15 +409,7 @@ void IndexRearrangementForStreams::reorderRecvIndicesForCommAfterFtoC(int *recvI
 
 void IndexRearrangementForStreams::splitCoarseToFineIntoBorderAndBulk(const uint &level)
 {
-    para->getParH(level)->intCFBorder.ICellCFC = para->getParH(level)->intCF.ICellCFC;
-    para->getParH(level)->intCFBorder.ICellCFF = para->getParH(level)->intCF.ICellCFF;
-
-    builder->getGridInterfaceIndicesBorderBulkCF(
-        para->getParH(level)->intCFBorder.ICellCFC, para->getParH(level)->intCFBulk.ICellCFC,
-        para->getParH(level)->intCFBorder.ICellCFF, para->getParH(level)->intCFBulk.ICellCFF,
-        para->getParH(level)->intCFBorder.kCF, para->getParH(level)->intCFBulk.kCF,
-        this->para->getParH(level)->neighborX_SP, this->para->getParH(level)->neighborY_SP,
-        this->para->getParH(level)->neighborZ_SP, level);
+    this->getGridInterfaceIndicesBorderBulkCF(level);
 
     para->getParD(level)->intCFBorder.kCF      = para->getParH(level)->intCFBorder.kCF;
     para->getParD(level)->intCFBulk.kCF        = para->getParH(level)->intCFBulk.kCF;
@@ -428,6 +421,64 @@ void IndexRearrangementForStreams::splitCoarseToFineIntoBorderAndBulk(const uint
         para->getParD(level)->intCFBorder.ICellCFF + para->getParD(level)->intCFBorder.kCF;
 }
 
+void IndexRearrangementForStreams::getGridInterfaceIndicesBorderBulkCF(int level) 
+{ 
+    // this function reorders the array of CFC/CFF indices and sets pointers and sizes of the new subarrays
+     
+    // create some local variables for better readability
+    uint *iCellCfcAll = para->getParH(level)->intCF.ICellCFC;
+    uint *iCellCffAll    = para->getParH(level)->intCF.ICellCFF;
+    uint *neighborX_SP   = this->para->getParH(level)->neighborX_SP;
+    uint *neighborY_SP   = this->para->getParH(level)->neighborY_SP;
+    uint *neighborZ_SP   = this->para->getParH(level)->neighborZ_SP;
+    auto grid = this->builder->getGrid((uint) level);   
+
+    std::vector<uint> iCellCfcBorderVector;
+    std::vector<uint> iCellCfcBulkVector;
+    std::vector<uint> iCellCffBorderVector;
+    std::vector<uint> iCellCffBulkVector;
+    uint sparseIndexOfICellBSW;
+
+    // fill border and bulk vectors with iCellCFs
+    for (uint i = 0; i < para->getParH(level)->intCF.kCF; i++) {
+        sparseIndexOfICellBSW = iCellCfcAll[i];
+
+        if (grid->isSparseIndexInFluidNodeIndicesBorder(sparseIndexOfICellBSW) ||
+            grid->isSparseIndexInFluidNodeIndicesBorder(neighborX_SP[sparseIndexOfICellBSW]) ||
+            grid->isSparseIndexInFluidNodeIndicesBorder(neighborY_SP[sparseIndexOfICellBSW]) ||
+            grid->isSparseIndexInFluidNodeIndicesBorder(neighborZ_SP[sparseIndexOfICellBSW]) ||
+            grid->isSparseIndexInFluidNodeIndicesBorder(neighborY_SP[neighborX_SP[sparseIndexOfICellBSW]]) ||
+            grid->isSparseIndexInFluidNodeIndicesBorder(neighborZ_SP[neighborX_SP[sparseIndexOfICellBSW]]) ||
+            grid->isSparseIndexInFluidNodeIndicesBorder(neighborZ_SP[neighborY_SP[sparseIndexOfICellBSW]]) ||
+            grid->isSparseIndexInFluidNodeIndicesBorder(neighborZ_SP[neighborY_SP[neighborX_SP[sparseIndexOfICellBSW]]])) {
+
+            iCellCfcBorderVector.push_back(iCellCfcAll[i]);
+            iCellCffBorderVector.push_back(iCellCffAll[i]);
+        } else {
+            iCellCfcBulkVector.push_back(iCellCfcAll[i]);
+            iCellCffBulkVector.push_back(iCellCffAll[i]);
+        }
+    }
+
+    // set new sizes and pointers
+    para->getParH(level)->intCFBorder.ICellCFC = iCellCfcAll;
+    para->getParH(level)->intCFBorder.ICellCFC  = iCellCffAll;
+    para->getParH(level)->intCFBorder.kCF = (uint)iCellCfcBorderVector.size();
+    para->getParH(level)->intCFBulk.kCF = (uint)iCellCfcBulkVector.size();
+    para->getParH(level)->intCFBulk.ICellCFC = iCellCfcAll + para->getParH(level)->intCFBorder.kCF;
+    para->getParH(level)->intCFBulk.ICellCFF = iCellCffAll + para->getParH(level)->intCFBorder.kCF;
+
+    // copy the created vectors to the memory addresses of the old arrays
+    for (uint i = 0; i < (uint)iCellCfcBorderVector.size(); i++) {
+        iCellCfcAll[i] = iCellCfcBorderVector[i];
+        iCellCffAll[i] = iCellCffBorderVector[i];
+    }
+    for (uint i = 0; i < (uint)iCellCfcBulkVector.size(); i++) {
+        para->getParH(level)->intCFBulk.ICellCFC[i] = iCellCfcBulkVector[i];
+        para->getParH(level)->intCFBulk.ICellCFF[i] = iCellCffBulkVector[i];
+    }
+}
+
 void IndexRearrangementForStreams::splitFineToCoarseIntoBorderAndBulk(const uint &level)
 {
     para->getParH(level)->intFCBorder.ICellFCC = para->getParH(level)->intFC.ICellFCC;
diff --git a/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/IndexRearrangementForStreams.h b/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/IndexRearrangementForStreams.h
index 1d9c5f8fe9d2582eaf96a8bc26ac17d91a6e3023..ee3542bfc0d26f50af58af1743a60c236d9514c8 100644
--- a/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/IndexRearrangementForStreams.h
+++ b/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/IndexRearrangementForStreams.h
@@ -70,6 +70,8 @@ private:
                                              std::vector<uint> &sendIndicesForCommAfterFtoCPositions);
     void reorderRecvIndicesForCommAfterFtoC(int *recvIndices, int &numberOfRecvNeighborsAfterFtoC, int direction,
                                             int level, int j, std::vector<uint> &sendIndicesForCommAfterFtoCPositions);
+    // split interpolation cells
+    void getGridInterfaceIndicesBorderBulkCF(int level);
 };
 
 #endif